From 918f560e5c80754370ac0ae30f578d4ca3738c72 Mon Sep 17 00:00:00 2001 From: chnnick Date: Fri, 15 May 2026 15:15:26 -0700 Subject: [PATCH 01/32] wrap app in authenticator if cognito information is set in env file, added required env keys to example.env, configured amplify in separate auth file only if both environment variables exist/are set. --- apps/frontend/auth/auth.config.ts | 35 +++++++++++++++++++++++++++++++ apps/frontend/src/main.tsx | 24 +++++++++++++++++---- example.env | 6 +++++- 3 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 apps/frontend/auth/auth.config.ts diff --git a/apps/frontend/auth/auth.config.ts b/apps/frontend/auth/auth.config.ts new file mode 100644 index 000000000..436b4a840 --- /dev/null +++ b/apps/frontend/auth/auth.config.ts @@ -0,0 +1,35 @@ +import { Amplify } from 'aws-amplify'; + +const userPoolId = import.meta.env.VITE_COGNITO_USER_POOL_ID; +const userPoolClientId = import.meta.env.VITE_COGNITO_USER_POOL_CLIENT_ID; + +// Fail out if the values are not set in the environment variables even if they exist +function isNonEmptyEnv(value: string | undefined): boolean { + if (value === undefined || value === '') { + return false; + } + const normalized = value.trim().toLowerCase(); + return ( + normalized !== '' && normalized !== 'null' && normalized !== 'undefined' + ); +} + +// Check if the cognito information is present in the environment variables +export const cognitoInformationPresent = + isNonEmptyEnv(userPoolId) && isNonEmptyEnv(userPoolClientId); + +// Configure amplify with cognito if the information is present in the environment variables +export function configureAmplify(): void { + if (!cognitoInformationPresent) { + return; + } + + Amplify.configure({ + Auth: { + Cognito: { + userPoolId, + userPoolClientId, + }, + }, + }); +} diff --git a/apps/frontend/src/main.tsx b/apps/frontend/src/main.tsx index a19d282e8..3206c8be1 100644 --- a/apps/frontend/src/main.tsx +++ b/apps/frontend/src/main.tsx @@ -1,13 +1,29 @@ import { StrictMode } from 'react'; import * as ReactDOM from 'react-dom/client'; - +import { Authenticator } from '@aws-amplify/ui-react'; +import { + configureAmplify, + cognitoInformationPresent, +} from '../auth/auth.config'; import App from './app'; const root = ReactDOM.createRoot( document.getElementById('root') as HTMLElement, ); + +// Configure amplify with cognito (Only runs if the environment variables are set in the .env file) +configureAmplify(); + root.render( - - - , + cognitoInformationPresent ? ( + + + + + + ) : ( + + + + ), ); diff --git a/example.env b/example.env index 957d47869..7d7f3bb6e 100644 --- a/example.env +++ b/example.env @@ -2,4 +2,8 @@ NX_DB_HOST=localhost NX_DB_USERNAME=postgres NX_DB_PASSWORD= NX_DB_DATABASE=jumpstart -NX_DB_PORT=5432 \ No newline at end of file +NX_DB_PORT=5432 + +# Cognito Setup +VITE_COGNITO_USER_POOL_ID= +VITE_COGNITO_USER_POOL_CLIENT_ID= \ No newline at end of file From 94a3b9ea0712148f9476d561c81a07126bcaa779 Mon Sep 17 00:00:00 2001 From: chnnick Date: Fri, 15 May 2026 15:39:58 -0700 Subject: [PATCH 02/32] correctly importing env variables, type guards for each value so configure runs correctly with cognito values as strings. --- apps/frontend/auth/auth.config.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/frontend/auth/auth.config.ts b/apps/frontend/auth/auth.config.ts index 436b4a840..1effc40a5 100644 --- a/apps/frontend/auth/auth.config.ts +++ b/apps/frontend/auth/auth.config.ts @@ -1,10 +1,10 @@ import { Amplify } from 'aws-amplify'; -const userPoolId = import.meta.env.VITE_COGNITO_USER_POOL_ID; -const userPoolClientId = import.meta.env.VITE_COGNITO_USER_POOL_CLIENT_ID; +const userPoolId = process.env.VITE_COGNITO_USER_POOL_ID; +const userPoolClientId = process.env.VITE_COGNITO_USER_POOL_CLIENT_ID; // Fail out if the values are not set in the environment variables even if they exist -function isNonEmptyEnv(value: string | undefined): boolean { +function isNonEmptyEnv(value: string | undefined): value is string { if (value === undefined || value === '') { return false; } @@ -20,7 +20,10 @@ export const cognitoInformationPresent = // Configure amplify with cognito if the information is present in the environment variables export function configureAmplify(): void { - if (!cognitoInformationPresent) { + if (!isNonEmptyEnv(userPoolId)) { + return; + } + if (!isNonEmptyEnv(userPoolClientId)) { return; } From dd53297fec211bd3ea8619d2152e470b2a1d2f0e Mon Sep 17 00:00:00 2001 From: chnnick Date: Wed, 20 May 2026 11:55:47 -0700 Subject: [PATCH 03/32] new cognito env variables, JWTPayload type --- apps/backend/src/aws/cognito/cognito.types.ts | 12 ++++++++++++ example.env | 4 ++++ 2 files changed, 16 insertions(+) create mode 100644 apps/backend/src/aws/cognito/cognito.types.ts diff --git a/apps/backend/src/aws/cognito/cognito.types.ts b/apps/backend/src/aws/cognito/cognito.types.ts new file mode 100644 index 000000000..cf08ed5fc --- /dev/null +++ b/apps/backend/src/aws/cognito/cognito.types.ts @@ -0,0 +1,12 @@ +// Type for the payload of our Cognito JWT token: https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-id-token.html + +export interface CognitoJwtPayload { + sub: string; // Subject (unique identifier for the user) + 'cognito:groups': string[]; // Groups (ex: ['admin', 'user']) + iss: string; // Issuer (ex: https://cognito-idp..amazonaws.com/) + token_use: 'id'; // Token use (Amplify sends ID tokens to identify the user) + aud: string; // User pool app client that authenticated the user (ex: ) + exp: number; // Expiration time (Unix timestamp) + iat: number; // Issued at time (Unix timestamp) + email: string; // Email (ex: test@example.com) +} diff --git a/example.env b/example.env index 7d7f3bb6e..1a6a59e2d 100644 --- a/example.env +++ b/example.env @@ -5,5 +5,9 @@ NX_DB_DATABASE=jumpstart NX_DB_PORT=5432 # Cognito Setup +# Note: Leaving any field unset disables auth ENTIRELY +COGNITO_USER_POOL_ID= +COGNITO_CLIENT_ID= +COGNITO_REGION=aws-east-2 VITE_COGNITO_USER_POOL_ID= VITE_COGNITO_USER_POOL_CLIENT_ID= \ No newline at end of file From c2226130340d87060c29b54c930b96cdea595b54 Mon Sep 17 00:00:00 2001 From: chnnick Date: Wed, 20 May 2026 12:23:04 -0700 Subject: [PATCH 04/32] cognito config + updated types to allow for both id and access tokens --- .../backend/src/aws/cognito/cognito.config.ts | 42 +++++++++++++++++++ apps/backend/src/aws/cognito/cognito.types.ts | 12 +++--- 2 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 apps/backend/src/aws/cognito/cognito.config.ts diff --git a/apps/backend/src/aws/cognito/cognito.config.ts b/apps/backend/src/aws/cognito/cognito.config.ts new file mode 100644 index 000000000..2c66c0737 --- /dev/null +++ b/apps/backend/src/aws/cognito/cognito.config.ts @@ -0,0 +1,42 @@ +// Checks if the authentication is enabled +export function isAuthEnabled(): boolean { + return isNonEmptyEnv(process.env.COGNITO_USER_POOL_ID); +} + +// Gets the Cognito configuration information +export function getCognitoConfig(): { + region: string; + userPoolId: string; + clientId: string; + issuer: string; +} | null { + const region = process.env.COGNITO_REGION; + const userPoolId = process.env.COGNITO_USER_POOL_ID; + const clientId = process.env.COGNITO_CLIENT_ID; + + if ( + !isNonEmptyEnv(region) || + !isNonEmptyEnv(userPoolId) || + !isNonEmptyEnv(clientId) + ) { + return null; + } + + return { + region, + userPoolId, + clientId, + issuer: `https://cognito-idp.${region}.amazonaws.com/${userPoolId}`, + }; +} + +// Checks if the value is a non-empty string +function isNonEmptyEnv(value: string | undefined): value is string { + if (value === undefined || value === '') { + return false; + } + const normalized = value.trim().toLowerCase(); + return ( + normalized !== '' && normalized !== 'null' && normalized !== 'undefined' + ); +} diff --git a/apps/backend/src/aws/cognito/cognito.types.ts b/apps/backend/src/aws/cognito/cognito.types.ts index cf08ed5fc..83ea8e33b 100644 --- a/apps/backend/src/aws/cognito/cognito.types.ts +++ b/apps/backend/src/aws/cognito/cognito.types.ts @@ -1,12 +1,14 @@ -// Type for the payload of our Cognito JWT token: https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-id-token.html +// Cognito ID token: https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-id-token.html +// Cognito access token: https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-access-token.html export interface CognitoJwtPayload { sub: string; // Subject (unique identifier for the user) - 'cognito:groups': string[]; // Groups (ex: ['admin', 'user']) + 'cognito:groups'?: string[]; // Groups (ex: ['admin', 'user']) iss: string; // Issuer (ex: https://cognito-idp..amazonaws.com/) - token_use: 'id'; // Token use (Amplify sends ID tokens to identify the user) - aud: string; // User pool app client that authenticated the user (ex: ) + token_use?: 'id' | 'access'; // Token use (ID or access token from Cognito) + aud?: string; // Audience: Client ID this token is intended for (ex: ) + client_id?: string; // Client ID used during authentication (ex: ) exp: number; // Expiration time (Unix timestamp) iat: number; // Issued at time (Unix timestamp) - email: string; // Email (ex: test@example.com) + email?: string; // Email (ex: test@example.com) } From e61d789b7ea165239311e55912b6f48aa9b0c04b Mon Sep 17 00:00:00 2001 From: chnnick Date: Wed, 20 May 2026 13:22:59 -0700 Subject: [PATCH 05/32] cognito guard, module, and decorators, added to appmodule --- apps/backend/src/app.module.ts | 3 +- .../src/aws/cognito/cognito.decorator.ts | 5 + apps/backend/src/aws/cognito/cognito.guard.ts | 126 ++++++++++++++++++ .../backend/src/aws/cognito/cognito.module.ts | 14 ++ .../src/aws/cognito/cognito.service.ts | 17 +++ 5 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 apps/backend/src/aws/cognito/cognito.decorator.ts create mode 100644 apps/backend/src/aws/cognito/cognito.guard.ts create mode 100644 apps/backend/src/aws/cognito/cognito.module.ts create mode 100644 apps/backend/src/aws/cognito/cognito.service.ts diff --git a/apps/backend/src/app.module.ts b/apps/backend/src/app.module.ts index 9af0cf4b5..05ef9b3e2 100644 --- a/apps/backend/src/app.module.ts +++ b/apps/backend/src/app.module.ts @@ -4,10 +4,11 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import AppDataSource from './data-source'; +import { CognitoService } from './aws/cognito/cognito.service'; @Module({ imports: [TypeOrmModule.forRoot(AppDataSource.options)], controllers: [AppController], - providers: [AppService], + providers: [AppService, CognitoService], }) export class AppModule {} diff --git a/apps/backend/src/aws/cognito/cognito.decorator.ts b/apps/backend/src/aws/cognito/cognito.decorator.ts new file mode 100644 index 000000000..2ece114ee --- /dev/null +++ b/apps/backend/src/aws/cognito/cognito.decorator.ts @@ -0,0 +1,5 @@ +import { SetMetadata } from '@nestjs/common'; + +// Metadata key to state that the route is PUBLIC and thus NOT PROTECTED by authentication(Cognito JWT Guard) +export const IS_PUBLIC_KEY = 'isPublic'; +export const Public = () => SetMetadata(IS_PUBLIC_KEY, true); diff --git a/apps/backend/src/aws/cognito/cognito.guard.ts b/apps/backend/src/aws/cognito/cognito.guard.ts new file mode 100644 index 000000000..bd3113322 --- /dev/null +++ b/apps/backend/src/aws/cognito/cognito.guard.ts @@ -0,0 +1,126 @@ +import { + CanActivate, + ExecutionContext, + Injectable, + UnauthorizedException, +} from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import * as jwt from 'jsonwebtoken'; +import jwksClient from 'jwks-rsa'; +import { Request } from 'express'; + +import { IS_PUBLIC_KEY } from './cognito.decorator'; +import { CognitoJwtPayload } from './cognito.types'; +import { getCognitoConfig, isAuthEnabled } from './cognito.config'; + +// Checks if client id or audience returned matches your own COGNITO_CLIENT_ID +function isAudienceValid( + payload: CognitoJwtPayload, + clientId: string, +): boolean { + if (payload.client_id === clientId) { + return true; + } + const aud = payload.aud; + if (typeof aud === 'string') { + return aud === clientId; + } + return false; +} + +// Extracts the bearer token from the request's Authorization header +function extractBearerToken(request: Request): string | undefined { + const header = request.headers.authorization; + if (!header?.startsWith('Bearer ')) return undefined; + return header.slice('Bearer '.length).trim() || undefined; +} + +@Injectable() +export class CognitoJWTGuard implements CanActivate { + constructor(private readonly reflector: Reflector) {} + + // Whether or not the request is allowed to proceed + async canActivate(context: ExecutionContext): Promise { + // If authentication is not enabled, allow the request to proceed + if (!isAuthEnabled()) { + return true; + } + + // If the route is public (Either the route is marked as public or the controller/handler is marked as public), allow the request to proceed + const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ + context.getHandler(), + context.getClass(), + ]); + if (isPublic) { + return true; + } + + // Extract the bearer token from the request's Authorization header + const request = context.switchToHttp().getRequest(); + const token = extractBearerToken(request); + if (!token) { + throw new UnauthorizedException(); + } + + // Verify the token and attach the JWT payload to request.user + const payload = await this.verifyToken(token); + (request as Request & { user: CognitoJwtPayload }).user = payload; + return true; + } + + // Verifies the token against user pool JWKS endpoint, and returns the JWT payload if the token is valid + private verifyToken(token: string): Promise { + // If the region, user pool ID, or client ID is not set, throw an unauthorized exception by default + const config = getCognitoConfig(); + if (!config) { + throw new UnauthorizedException(); + } + + // Set up JWKS client to get the public key for the token to verify the JWT token signature + const client = jwksClient({ + cache: true, + rateLimit: true, + jwksRequestsPerMinute: 5, + jwksUri: `${config.issuer}/.well-known/jwks.json`, + }); + + // Function to get the public key for the token to verify the JWT token signature + const getKey: jwt.GetPublicKeyOrSecret = (header, callback) => { + const kid = header.kid; // The key ID (kid) from the JWT header + if (!kid) { + callback(new Error('JWT header missing kid')); + return; + } + // Get the public key for the token to verify the JWT token signature + client + .getSigningKey(kid) + .then((key) => callback(null, key.getPublicKey())) + .catch((err: Error) => callback(err)); + }; + + // Verify the token and return the JWT payload if the token is valid + return new Promise((resolve, reject) => { + jwt.verify( + token, + getKey, + { issuer: config.issuer, algorithms: ['RS256'] }, // AWS Cognito signs tokens with RS256 algorithm + (err, decoded) => { + // If verification fails, return an unauthorized exception + if (err || !decoded || typeof decoded === 'string') { + reject(new UnauthorizedException()); + return; + } + // If the token is valid, return the JWT payload + const payload = decoded as CognitoJwtPayload; + // If the audience is not our own client ID, return an unauthorized exception + if (!isAudienceValid(payload, config.clientId)) { + reject(new UnauthorizedException()); + return; + } + // If the token is valid, return the JWT payload + resolve(payload); + }, + ); + }); + } +} diff --git a/apps/backend/src/aws/cognito/cognito.module.ts b/apps/backend/src/aws/cognito/cognito.module.ts new file mode 100644 index 000000000..91850d851 --- /dev/null +++ b/apps/backend/src/aws/cognito/cognito.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { CognitoJWTGuard } from './cognito.guard'; +import { APP_GUARD } from '@nestjs/core'; +import { CognitoService } from './cognito.service'; + +@Module({ + providers: [ + CognitoService, + CognitoJWTGuard, + { provide: APP_GUARD, useClass: CognitoJWTGuard }, + ], + exports: [CognitoService], +}) +export class CognitoModule {} diff --git a/apps/backend/src/aws/cognito/cognito.service.ts b/apps/backend/src/aws/cognito/cognito.service.ts new file mode 100644 index 000000000..0fd96f29c --- /dev/null +++ b/apps/backend/src/aws/cognito/cognito.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@nestjs/common'; +import { Request } from 'express'; +import { CognitoJwtPayload } from './cognito.types'; +import { isAuthEnabled } from './cognito.config'; + +@Injectable() +export class CognitoService { + // Gets the user from the request + getUser(request: Request): CognitoJwtPayload | null { + // If authentication is not enabled, return null + if (!isAuthEnabled()) { + return null; + } + // Return the user from the request + return (request as Request & { user: CognitoJwtPayload }).user ?? null; + } +} From 765e65c78afbbe292588d17ba2bcc80184e90819 Mon Sep 17 00:00:00 2001 From: chnnick Date: Fri, 22 May 2026 23:08:26 -0700 Subject: [PATCH 06/32] tests for guard and service --- .../src/aws/cognito/cognito.guard.spec.ts | 291 ++++++++++++++++++ .../src/aws/cognito/cognito.service.spec.ts | 42 +++ 2 files changed, 333 insertions(+) create mode 100644 apps/backend/src/aws/cognito/cognito.guard.spec.ts create mode 100644 apps/backend/src/aws/cognito/cognito.service.spec.ts diff --git a/apps/backend/src/aws/cognito/cognito.guard.spec.ts b/apps/backend/src/aws/cognito/cognito.guard.spec.ts new file mode 100644 index 000000000..a835702bf --- /dev/null +++ b/apps/backend/src/aws/cognito/cognito.guard.spec.ts @@ -0,0 +1,291 @@ +import { ExecutionContext, UnauthorizedException } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import * as jwt from 'jsonwebtoken'; + +import { IS_PUBLIC_KEY } from './cognito.decorator'; +import { CognitoJWTGuard } from './cognito.guard'; +import { CognitoJwtPayload } from './cognito.types'; + +jest.mock('jsonwebtoken'); +// Fake the jwks-rsa module to return a mock public key +jest.mock('jwks-rsa', () => ({ + __esModule: true, + default: jest.fn(() => ({ + getSigningKey: jest.fn().mockResolvedValue({ + getPublicKey: () => 'mock-public-key', + }), + })), +})); + +// Environment variables to test +const ENV_KEYS = [ + 'COGNITO_USER_POOL_ID', + 'COGNITO_CLIENT_ID', + 'COGNITO_REGION', +] as const; + +const ACTIVE_ENV = { + COGNITO_USER_POOL_ID: 'us-east-2_TestPool', + COGNITO_CLIENT_ID: 'test-client-id', + COGNITO_REGION: 'us-east-2', +}; + +function setActiveEnv(): void { + Object.assign(process.env, ACTIVE_ENV); +} + +// Helper to simulate execution context when request hits a route +function createContext(authorization?: string): { + context: ExecutionContext; + request: Request & { user?: CognitoJwtPayload }; +} { + // Request with authorization header (if provided) + const request = { + headers: authorization ? { authorization } : {}, + } as Request & { user?: CognitoJwtPayload }; + + // Execution context with switchToHttp method that returns the request + const context = { + switchToHttp: () => ({ getRequest: () => request }), + getHandler: () => jest.fn(), + getClass: () => jest.fn(), + } as unknown as ExecutionContext; + + return { context, request }; +} + +describe('CognitoJWTGuard', () => { + let guard: CognitoJWTGuard; + let reflector: jest.Mocked>; + + // Wipe call history at start of each test + beforeEach(() => { + reflector = { getAllAndOverride: jest.fn().mockReturnValue(false) }; + guard = new CognitoJWTGuard(reflector as unknown as Reflector); + (jwt.verify as jest.Mock).mockReset(); + }); + + // Clean up environment variables and call history after each test + afterEach(() => { + ENV_KEYS.forEach((key) => delete process.env[key]); + jest.clearAllMocks(); + }); + + describe('When auth is active', () => { + beforeEach(() => { + setActiveEnv(); + }); + + it('rejects routes without a Bearer token', async () => { + const { context } = createContext(); + + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + }); + + it('rejects routes with non-Bearer authorization', async () => { + const { context } = createContext('Basic abc1234567890'); + + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + expect(jwt.verify).not.toHaveBeenCalled(); + }); + + it('rejects routes with empty Bearer token', async () => { + const { context } = createContext('Bearer '); + + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + expect(jwt.verify).not.toHaveBeenCalled(); + }); + + it('rejects routes with an invalid token', async () => { + (jwt.verify as jest.Mock).mockImplementation( + (_token, _getKey, _options, callback) => { + callback(new Error('invalid signature'), undefined); + }, + ); + + const { context } = createContext('Bearer bad-token'); + + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + }); + + it('allows routes with a valid access token (client_id)', async () => { + const payload: CognitoJwtPayload = { + sub: 'user-1', + client_id: ACTIVE_ENV.COGNITO_CLIENT_ID, + token_use: 'access', + iss: `https://cognito-idp.${ACTIVE_ENV.COGNITO_REGION}.amazonaws.com/${ACTIVE_ENV.COGNITO_USER_POOL_ID}`, + exp: 9999999999, + iat: 1, + }; + (jwt.verify as jest.Mock).mockImplementation( + (_token, _getKey, _options, callback) => { + callback(null, payload); + }, + ); + + const { context, request } = createContext('Bearer access-token'); + + await expect(guard.canActivate(context)).resolves.toBe(true); + expect(request.user).toEqual(payload); + }); + + it('rejects routes when client_id does not match', async () => { + (jwt.verify as jest.Mock).mockImplementation( + (_token, _getKey, _options, callback) => { + callback(null, { + sub: 'user-1', + client_id: 'wrong-client-id', + token_use: 'access', + iss: `https://cognito-idp.${ACTIVE_ENV.COGNITO_REGION}.amazonaws.com/${ACTIVE_ENV.COGNITO_USER_POOL_ID}`, + exp: 9999999999, + iat: 1, + }); + }, + ); + + const { context } = createContext('Bearer access-token'); + + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + }); + + it('allows routes with a valid ID token (aud)', async () => { + const payload: CognitoJwtPayload = { + sub: 'user-1', + aud: ACTIVE_ENV.COGNITO_CLIENT_ID, + token_use: 'id', + iss: `https://cognito-idp.${ACTIVE_ENV.COGNITO_REGION}.amazonaws.com/${ACTIVE_ENV.COGNITO_USER_POOL_ID}`, + exp: 9999999999, + iat: 1, + }; + (jwt.verify as jest.Mock).mockImplementation( + (_token, _getKey, _options, callback) => { + callback(null, payload); + }, + ); + + const { context, request } = createContext('Bearer id-token'); + + await expect(guard.canActivate(context)).resolves.toBe(true); + expect(request.user).toEqual(payload); + }); + + it('rejects routes when audience does not match client id', async () => { + (jwt.verify as jest.Mock).mockImplementation( + (_token, _getKey, _options, callback) => { + callback(null, { + sub: 'user-1', + aud: 'wrong-client', + iss: `https://cognito-idp.${ACTIVE_ENV.COGNITO_REGION}.amazonaws.com/${ACTIVE_ENV.COGNITO_USER_POOL_ID}`, + exp: 9999999999, + iat: 1, + }); + }, + ); + + const { context } = createContext('Bearer token'); + + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + }); + + it('rejects routes when payload has no audience claim', async () => { + (jwt.verify as jest.Mock).mockImplementation( + (_token, _getKey, _options, callback) => { + callback(null, { + sub: 'user-1', + iss: `https://cognito-idp.${ACTIVE_ENV.COGNITO_REGION}.amazonaws.com/${ACTIVE_ENV.COGNITO_USER_POOL_ID}`, + exp: 9999999999, + iat: 1, + }); + }, + ); + + const { context } = createContext('Bearer token'); + + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + }); + + it('allows @Public routes without a token', async () => { + reflector.getAllAndOverride.mockImplementation( + (key) => key === IS_PUBLIC_KEY, + ); + + const { context } = createContext(); + + await expect(guard.canActivate(context)).resolves.toBe(true); + expect(jwt.verify).not.toHaveBeenCalled(); + }); + + it('allows @Public routes with any bearer token', async () => { + reflector.getAllAndOverride.mockImplementation( + (key) => key === IS_PUBLIC_KEY, + ); + + const { context, request } = createContext('Bearer bad-token'); + + await expect(guard.canActivate(context)).resolves.toBe(true); + expect(jwt.verify).not.toHaveBeenCalled(); + expect(request.user).toBeUndefined(); + }); + }); + + describe('when env variables are missing', () => { + it('rejects routes when COGNITO_CLIENT_ID is missing', async () => { + process.env.COGNITO_USER_POOL_ID = ACTIVE_ENV.COGNITO_USER_POOL_ID; + process.env.COGNITO_REGION = ACTIVE_ENV.COGNITO_REGION; + + const { context } = createContext('Bearer token'); + + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + expect(jwt.verify).not.toHaveBeenCalled(); + }); + + it('rejects routes when COGNITO_REGION is missing', async () => { + process.env.COGNITO_USER_POOL_ID = ACTIVE_ENV.COGNITO_USER_POOL_ID; + process.env.COGNITO_CLIENT_ID = ACTIVE_ENV.COGNITO_CLIENT_ID; + + const { context } = createContext('Bearer token'); + + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + expect(jwt.verify).not.toHaveBeenCalled(); + }); + }); + + describe('when auth is inactive', () => { + beforeEach(() => { + delete process.env.COGNITO_USER_POOL_ID; + }); + + it('allows requests without a token', async () => { + const { context } = createContext(); + + await expect(guard.canActivate(context)).resolves.toBe(true); + expect(jwt.verify).not.toHaveBeenCalled(); + }); + + it('allows requests with a bearer token', async () => { + const { context, request } = createContext('Bearer bad-token'); + + await expect(guard.canActivate(context)).resolves.toBe(true); + expect(jwt.verify).not.toHaveBeenCalled(); + expect(request.user).toBeUndefined(); + }); + }); +}); diff --git a/apps/backend/src/aws/cognito/cognito.service.spec.ts b/apps/backend/src/aws/cognito/cognito.service.spec.ts new file mode 100644 index 000000000..c913aa947 --- /dev/null +++ b/apps/backend/src/aws/cognito/cognito.service.spec.ts @@ -0,0 +1,42 @@ +import { CognitoService } from './cognito.service'; +import { CognitoJwtPayload } from './cognito.types'; + +describe('CognitoService', () => { + let service: CognitoService; + + beforeEach(() => { + service = new CognitoService(); + }); + + // Clean up environment variables after each test + afterEach(() => { + delete process.env.COGNITO_USER_POOL_ID; + }); + + it('returns null when there is no user pool ID env variable', () => { + delete process.env.COGNITO_USER_POOL_ID; + + expect(service.getUser({ headers: {} } as never)).toBeNull(); + }); + + it('returns the JWT payload when auth is active and user is on the request', () => { + process.env.COGNITO_USER_POOL_ID = 'us-east-2_TestPool'; + const payload: CognitoJwtPayload = { + sub: 'user-1', + client_id: 'test-client', + iss: 'https://cognito-idp.us-east-2.amazonaws.com/us-east-2_TestPool', + exp: 9999999999, + iat: 1, + }; + const request = { user: payload } as never; + + expect(service.getUser(request)).toEqual(payload); + }); + + // edge case: + it('returns null when auth is active but request has no user', () => { + process.env.COGNITO_USER_POOL_ID = 'us-east-2_TestPool'; + + expect(service.getUser({ headers: {} } as never)).toBeNull(); + }); +}); From 118ed9b3c2fc2d6ee97ee10a87afe9d619786f7a Mon Sep 17 00:00:00 2001 From: chnnick Date: Sat, 23 May 2026 09:55:45 -0700 Subject: [PATCH 07/32] documentation --- apps/backend/src/aws/cognito/README.md | 117 +++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 apps/backend/src/aws/cognito/README.md diff --git a/apps/backend/src/aws/cognito/README.md b/apps/backend/src/aws/cognito/README.md new file mode 100644 index 000000000..bbe0d7a79 --- /dev/null +++ b/apps/backend/src/aws/cognito/README.md @@ -0,0 +1,117 @@ +## QUICKSTART: Enable Authentication + +Copy placeholders from the repo root `example.env` into `.env` (or your deployment secrets): + +| Variable | Purpose | +|----------|---------| +| `COGNITO_USER_POOL_ID` | User pool ID; **must be set** to turn the guard on | +| `COGNITO_CLIENT_ID` | App client ID used to validate `aud` / `client_id` on tokens | +| `COGNITO_REGION` | AWS region (builds JWKS issuer URL) + +Leave `COGNITO_USER_POOL_ID` unset to disable auth via JWT enforcement entirely + +### Using Cognito in your app: + +There are two options for implementing the Cognito authentication guard in your app: + +1. Import `CognitoModule` into `AppModule` to protect all modules throughout the application: + +```typescript +@Module({ + imports: [TypeOrmModule.forRoot(...), CognitoModule], +}) +export class AppModule {} +``` + +2. Import `CognitoJWTGuard` and `CognitoService` into individual modules, then apply the guard with `@UseGuards`: + +```typescript +@Module({ + controllers: [UsersController], + providers: [CognitoJWTGuard, CognitoService], +}) +export class UsersModule {} +``` + + - **Per controller** — all routes in the controller go through the guard: + +```typescript +@Controller('users') +@UseGuards(CognitoJWTGuard) +export class UsersController { + constructor(private readonly cognitoService: CognitoService) {} + ... +} +``` + + - **Per route** — only decorated handlers are protected: + +```typescript +@Controller('users') +export class UsersController { + @UseGuards(CognitoJWTGuard) + @Get('me') + me(@Req() req: Request) { + return this.cognitoService.getUser(req); + } + ... +} +``` + + +### Public Routes +Use the `@Public()` decorator on routes that are technically protected, but don't require authentication. i.e. health checks, webhooks, or unauthenticated entry points: + +```typescript +import { Public } from './aws/cognito/cognito.decorator'; + +@Controller('health') +export class HealthController { + @Public() + @Get() + check() { + return { ok: true }; + } +} +``` + +### `CognitoService.getUser()` +Inject `CognitoService` in controllers or services to extract decoded token payload from the request + +```typescript +@Get('me') +me(@Req() req: Request) { + const user = this.cognitoService.getUser(req); + // null when auth is disabled, or no valid token was attached + return user; +} +``` + +The guard sets `request.user` to the verified JWT payload (`CognitoJwtPayload`: `sub`, `email`, `cognito:groups`, etc.). + +## Token validation + +- JWKS: `https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json` +- Signature: RS256, issuer must match the pool. +- Audience: each token carries **one** of these — ID tokens use `aud`; access tokens use `client_id` (Cognito does not put `aud` on access tokens). The guard accepts either claim matching `COGNITO_CLIENT_ID`. Amplify API calls typically send the **access** token (see below). + +> [!IMPORTANT] +> By default, both ID and access tokens are accepted. If your project requires restricting to a specific token type, add a `token_use` check in `isAudienceValid` and delete the other (id or access) check. + +```typescript +function isAudienceValid(payload: CognitoJwtPayload, clientId: string): boolean { + if (payload.token_use !== 'access') return false; + return payload.client_id === clientId; +} +``` +```typescript +function isAudienceValid(payload: CognitoJwtPayload, clientId: string): boolean { + if (payload.token_use !== 'id') return false; + return payload.aud === clientId; +} +``` +## Helpful Resources for understanding Auth! +- Difference between id and access tokens: https://auth0.com/blog/id-token-access-token-what-is-the-difference/ +- What is an Access Token? https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-access-token.html +- What is an ID Token? https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-id-token.html +- Using AWS to verify JWT: https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html \ No newline at end of file From b3d947194685b1733736e382e2891879e2b38bd5 Mon Sep 17 00:00:00 2001 From: chnnick Date: Sat, 23 May 2026 10:32:43 -0700 Subject: [PATCH 08/32] move auth into the correct folder --- apps/frontend/{ => src}/auth/auth.config.ts | 4 ++-- apps/frontend/src/main.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename apps/frontend/{ => src}/auth/auth.config.ts (87%) diff --git a/apps/frontend/auth/auth.config.ts b/apps/frontend/src/auth/auth.config.ts similarity index 87% rename from apps/frontend/auth/auth.config.ts rename to apps/frontend/src/auth/auth.config.ts index 1effc40a5..5bef1fb55 100644 --- a/apps/frontend/auth/auth.config.ts +++ b/apps/frontend/src/auth/auth.config.ts @@ -1,7 +1,7 @@ import { Amplify } from 'aws-amplify'; -const userPoolId = process.env.VITE_COGNITO_USER_POOL_ID; -const userPoolClientId = process.env.VITE_COGNITO_USER_POOL_CLIENT_ID; +const userPoolId = import.meta.env.VITE_COGNITO_USER_POOL_ID; +const userPoolClientId = import.meta.env.VITE_COGNITO_USER_POOL_CLIENT_ID; // Fail out if the values are not set in the environment variables even if they exist function isNonEmptyEnv(value: string | undefined): value is string { diff --git a/apps/frontend/src/main.tsx b/apps/frontend/src/main.tsx index 3206c8be1..7920d7fa5 100644 --- a/apps/frontend/src/main.tsx +++ b/apps/frontend/src/main.tsx @@ -4,7 +4,7 @@ import { Authenticator } from '@aws-amplify/ui-react'; import { configureAmplify, cognitoInformationPresent, -} from '../auth/auth.config'; +} from './auth/auth.config'; import App from './app'; const root = ReactDOM.createRoot( From 557f6f92e26ccfd7a205bac347046ca1e3f978ce Mon Sep 17 00:00:00 2001 From: chnnick Date: Sun, 24 May 2026 13:33:49 -0700 Subject: [PATCH 09/32] warnings for dual usage of Cognito --- apps/backend/src/aws/cognito/README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/apps/backend/src/aws/cognito/README.md b/apps/backend/src/aws/cognito/README.md index bbe0d7a79..72a57534e 100644 --- a/apps/backend/src/aws/cognito/README.md +++ b/apps/backend/src/aws/cognito/README.md @@ -1,4 +1,4 @@ -## QUICKSTART: Enable Authentication +## QUICKSTART: Copy placeholders from the repo root `example.env` into `.env` (or your deployment secrets): @@ -96,7 +96,14 @@ The guard sets `request.user` to the verified JWT payload (`CognitoJwtPayload`: - Audience: each token carries **one** of these — ID tokens use `aud`; access tokens use `client_id` (Cognito does not put `aud` on access tokens). The guard accepts either claim matching `COGNITO_CLIENT_ID`. Amplify API calls typically send the **access** token (see below). > [!IMPORTANT] -> By default, both ID and access tokens are accepted. If your project requires restricting to a specific token type, add a `token_use` check in `isAudienceValid` and delete the other (id or access) check. +> By default, both ID and access tokens are checked for and accepted. Cognito can be used for both Authentication (ID) and Authorization (Access), if you want to restrict to one specific use, add a `token_use` check in `isAudienceValid` and delete the other (id or access) check. + +> [!WARNING] +> Do not use the **ID token** for API authorization. ID tokens are intended for your +> client application to establish who the user is: passing them to a backend API +> exposes identity claims unnecessarily and confuses authentication with authorization. +> Backend APIs should validate **access tokens** only. See the `token_use` check in +> `isAudienceValid` below to enforce this. ```typescript function isAudienceValid(payload: CognitoJwtPayload, clientId: string): boolean { From 1e94607ffaa25e09e81261bfd1f61ad256f96561 Mon Sep 17 00:00:00 2001 From: chnnick Date: Sun, 24 May 2026 17:07:38 -0700 Subject: [PATCH 10/32] widen aud type to allow for serialization of the aud claim as either array of strings or a single string. --- apps/backend/src/aws/cognito/cognito.guard.ts | 7 +++++++ apps/backend/src/aws/cognito/cognito.types.ts | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/backend/src/aws/cognito/cognito.guard.ts b/apps/backend/src/aws/cognito/cognito.guard.ts index bd3113322..f49da5946 100644 --- a/apps/backend/src/aws/cognito/cognito.guard.ts +++ b/apps/backend/src/aws/cognito/cognito.guard.ts @@ -18,13 +18,20 @@ function isAudienceValid( payload: CognitoJwtPayload, clientId: string, ): boolean { + // Check Client ID if (payload.client_id === clientId) { return true; } + + // Check Aud const aud = payload.aud; if (typeof aud === 'string') { return aud === clientId; } + if (Array.isArray(aud)) { + return aud.includes(clientId); + } + return false; } diff --git a/apps/backend/src/aws/cognito/cognito.types.ts b/apps/backend/src/aws/cognito/cognito.types.ts index 83ea8e33b..e45e9e04f 100644 --- a/apps/backend/src/aws/cognito/cognito.types.ts +++ b/apps/backend/src/aws/cognito/cognito.types.ts @@ -6,7 +6,7 @@ export interface CognitoJwtPayload { 'cognito:groups'?: string[]; // Groups (ex: ['admin', 'user']) iss: string; // Issuer (ex: https://cognito-idp..amazonaws.com/) token_use?: 'id' | 'access'; // Token use (ID or access token from Cognito) - aud?: string; // Audience: Client ID this token is intended for (ex: ) + aud?: string | string[]; // Audience: Client ID this token is intended for (ex: ) client_id?: string; // Client ID used during authentication (ex: ) exp: number; // Expiration time (Unix timestamp) iat: number; // Issued at time (Unix timestamp) From f2b0716da7695767cf53997ab1d3c12e9a81241f Mon Sep 17 00:00:00 2001 From: chnnick Date: Sun, 24 May 2026 17:26:22 -0700 Subject: [PATCH 11/32] updated documentation --- apps/backend/src/aws/cognito/cognito.service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/backend/src/aws/cognito/cognito.service.ts b/apps/backend/src/aws/cognito/cognito.service.ts index 0fd96f29c..4b3ce679d 100644 --- a/apps/backend/src/aws/cognito/cognito.service.ts +++ b/apps/backend/src/aws/cognito/cognito.service.ts @@ -5,7 +5,8 @@ import { isAuthEnabled } from './cognito.config'; @Injectable() export class CognitoService { - // Gets the user from the request + // Extracts the verified JWT payload from request.user, as set by CognitoJWTGuard. + // Returns null if auth is disabled or no valid token was attached. getUser(request: Request): CognitoJwtPayload | null { // If authentication is not enabled, return null if (!isAuthEnabled()) { From 81729d4bd9cc65fcc3bb03624e8ade40b6885829 Mon Sep 17 00:00:00 2001 From: chnnick Date: Sun, 24 May 2026 17:44:03 -0700 Subject: [PATCH 12/32] tests clarification for denying partial configurations: Auth is active (COGNITO_USER_POOL_ID is set), but missing env variables for client_id and cognito_region both should not allow requests to go through --- apps/backend/src/aws/cognito/cognito.guard.spec.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/backend/src/aws/cognito/cognito.guard.spec.ts b/apps/backend/src/aws/cognito/cognito.guard.spec.ts index a835702bf..0c7da853f 100644 --- a/apps/backend/src/aws/cognito/cognito.guard.spec.ts +++ b/apps/backend/src/aws/cognito/cognito.guard.spec.ts @@ -240,12 +240,10 @@ describe('CognitoJWTGuard', () => { expect(jwt.verify).not.toHaveBeenCalled(); expect(request.user).toBeUndefined(); }); - }); - - describe('when env variables are missing', () => { it('rejects routes when COGNITO_CLIENT_ID is missing', async () => { process.env.COGNITO_USER_POOL_ID = ACTIVE_ENV.COGNITO_USER_POOL_ID; process.env.COGNITO_REGION = ACTIVE_ENV.COGNITO_REGION; + delete process.env.COGNITO_CLIENT_ID; const { context } = createContext('Bearer token'); @@ -258,6 +256,7 @@ describe('CognitoJWTGuard', () => { it('rejects routes when COGNITO_REGION is missing', async () => { process.env.COGNITO_USER_POOL_ID = ACTIVE_ENV.COGNITO_USER_POOL_ID; process.env.COGNITO_CLIENT_ID = ACTIVE_ENV.COGNITO_CLIENT_ID; + delete process.env.COGNITO_REGION; const { context } = createContext('Bearer token'); From e4e878ac50ae8c7b4e41613917de51178e7cf121 Mon Sep 17 00:00:00 2001 From: chnnick Date: Tue, 26 May 2026 14:23:19 -0700 Subject: [PATCH 13/32] Merge branch 'main' of https://github.com/Code-4-Community/scaffolding into 140-Cognito Note: added necessary packages for aws-amplify. Did not push merged changes that existed inside .nx --- apps/backend/src/app.module.ts | 11 +- apps/backend/src/aws/ses/README.md | 66 + apps/backend/src/aws/ses/awsSes.wrapper.ts | 76 + .../src/aws/ses/awsSesClient.factory.ts | 32 + apps/backend/src/aws/ses/email.module.ts | 10 + .../backend/src/aws/ses/email.service.spec.ts | 162 + apps/backend/src/aws/ses/email.service.ts | 61 + apps/backend/src/aws/ses/sendEmail.dto.ts | 103 + apps/backend/src/users/users.controller.ts | 10 + apps/backend/src/users/users.module.ts | 3 +- apps/backend/src/users/users.service.ts | 30 +- example.env | 8 +- jest.config.ts | 8 +- package.json | 15 +- yarn.lock | 3209 +++++++++++------ 15 files changed, 2678 insertions(+), 1126 deletions(-) create mode 100644 apps/backend/src/aws/ses/README.md create mode 100644 apps/backend/src/aws/ses/awsSes.wrapper.ts create mode 100644 apps/backend/src/aws/ses/awsSesClient.factory.ts create mode 100644 apps/backend/src/aws/ses/email.module.ts create mode 100644 apps/backend/src/aws/ses/email.service.spec.ts create mode 100644 apps/backend/src/aws/ses/email.service.ts create mode 100644 apps/backend/src/aws/ses/sendEmail.dto.ts diff --git a/apps/backend/src/app.module.ts b/apps/backend/src/app.module.ts index 05ef9b3e2..84494188d 100644 --- a/apps/backend/src/app.module.ts +++ b/apps/backend/src/app.module.ts @@ -1,13 +1,20 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; - +import { ConfigModule } from '@nestjs/config'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import AppDataSource from './data-source'; import { CognitoService } from './aws/cognito/cognito.service'; +import { UsersModule } from './users/users.module'; @Module({ - imports: [TypeOrmModule.forRoot(AppDataSource.options)], + imports: [ + ConfigModule.forRoot({ + isGlobal: true, + }), + TypeOrmModule.forRoot(AppDataSource.options), + UsersModule, + ], controllers: [AppController], providers: [AppService, CognitoService], }) diff --git a/apps/backend/src/aws/ses/README.md b/apps/backend/src/aws/ses/README.md new file mode 100644 index 000000000..3841717d9 --- /dev/null +++ b/apps/backend/src/aws/ses/README.md @@ -0,0 +1,66 @@ +# SES Email Module + +Thin wrapper around Amazon SES v2 for sending transactional emails (with optional attachments, cc, and bcc) from the backend. Validates input via `SendEmailDTO` and rate-limits sends. Each call delivers one email to a single primary recipient (`toEmail`), with cc visible in MIME headers and bcc hidden. + +## Injecting `EmailsService` + +`EmailsModule` exports `EmailsService`, so any consuming module just needs to import `EmailsModule` and then inject `EmailsService` through the constructor. + +1. **Import `EmailsModule`** in the consuming module: + + ```ts + // users.module.ts + import { EmailsModule } from '../aws/ses/email.module'; + + @Module({ + imports: [TypeOrmModule.forFeature([User]), EmailsModule], + controllers: [UsersController], + providers: [UsersService], + }) + export class UsersModule {} + ``` + +2. **Inject `EmailsService`** through the constructor of any provider in that module: + + ```ts + // users.service.ts + import { EmailsService } from '../aws/ses/email.service'; + import { SendEmailDTO } from '../aws/ses/sendEmail.dto'; + + @Injectable() + export class UsersService { + constructor(private emailsService: EmailsService) {} + + async notify(recipient: string) { + const dto: SendEmailDTO = { + toEmail: recipient, + subject: 'Welcome', + bodyHtml: '

Hi there.

', + }; + return this.emailsService.sendEmail(dto); + } + } + ``` + +`EmailsService.sendEmail` validates the DTO against its class-validator decorators on every call (since service-to-service calls bypass Nest's global `ValidationPipe`), so passing a plain object is fine — there's no need to call `plainToInstance` yourself. + +## Verifying a sender identity in SES + +`AmazonSESWrapper` sends every message `from` the address in `AWS_SES_SENDER_EMAIL`. SES will reject the send unless that address (or its domain) is a verified identity in the same AWS region as `AWS_REGION`. + +To verify a sender: + +1. Open the AWS console → **Amazon SES** → switch the region selector to match `AWS_REGION` (the module fails to boot if these don't agree). +2. **Identities** → **Create identity**. +3. Choose **Email address** (fastest for development) or **Domain** (required for production / sending from many addresses on the same domain). +4. Enter the address you set in `AWS_SES_SENDER_EMAIL` and create the identity. +5. AWS sends a confirmation link to that mailbox. Click it. The identity flips to **Verified** in the console. + +If you swap `AWS_SES_SENDER_EMAIL` later, the new address must be verified separately — verification is per-identity, not per-account. + +## `SEND_AUTOMATED_EMAILS` flag + +A boolean env var (`'true'` to enable, anything else — including unset — to disable) that gates real SES dispatch. + +- When `SEND_AUTOMATED_EMAILS === 'true'`: `sendEmail` runs DTO validation, then schedules the send through the rate limiter, then calls SES. Returns the `SendEmailCommandOutput` from SES (MessageId + metadata). `AWS_SES_SENDER_EMAIL` must be set at this point, or the send throws. +- When `SEND_AUTOMATED_EMAILS` is unset or any other value: `sendEmail` still runs DTO validation (so a bad payload still throws), then logs a warning (`SEND_AUTOMATED_EMAILS is not "true". Email not sent.`) and returns `void` without contacting SES. Neither `AWS_SES_SENDER_EMAIL` nor the AWS credentials need to be defined — teams not using SES can omit them entirely and the app still boots. diff --git a/apps/backend/src/aws/ses/awsSes.wrapper.ts b/apps/backend/src/aws/ses/awsSes.wrapper.ts new file mode 100644 index 000000000..724b72960 --- /dev/null +++ b/apps/backend/src/aws/ses/awsSes.wrapper.ts @@ -0,0 +1,76 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { + SESv2Client, + SendEmailCommand, + SendEmailCommandOutput, +} from '@aws-sdk/client-sesv2'; +import MailComposer from 'nodemailer/lib/mail-composer'; +import Mail from 'nodemailer/lib/mailer'; +import { AMAZON_SES_CLIENT } from './awsSesClient.factory'; +import { SendEmailDTO } from './sendEmail.dto'; + +@Injectable() +export class AmazonSESWrapper { + /** + * @param client SESv2 client from `awsSesClient.factory.ts` + */ + constructor( + @Inject(AMAZON_SES_CLIENT) private readonly client: SESv2Client, + ) {} + + /** + * Sends a single email via Amazon SES to `dto.toEmail`, with optional + * `ccEmails` and `bccEmails`. Composes a MIME message (so attachments are + * supported) and dispatches it via SendEmailCommand. + * + * @param dto the email payload + * @returns the SES response, containing MessageId (SES's unique id for the sent message) + * and metadata (HTTP status, AWS request id, retry counts) + * @throws Error if MIME composition fails (bad attachment, oversized payload) + * or if SES rejects the send (bad recipient, throttling, unverified sender, quota exceeded). + */ + async sendEmail(dto: SendEmailDTO): Promise { + const senderEmail = process.env.AWS_SES_SENDER_EMAIL; + if (!senderEmail) throw new Error('AWS_SES_SENDER_EMAIL is not defined'); + + const mailOptions: Mail.Options = { + from: senderEmail, + to: dto.toEmail, + subject: dto.subject, + html: dto.bodyHtml, + }; + + // cc is visible: set in MIME headers so recipients see who was cc'd. + if (dto.ccEmails && dto.ccEmails.length > 0) { + mailOptions.cc = dto.ccEmails; + } + // bcc is hidden: deliberately NOT set on mailOptions — doing so would + // emit a `Bcc:` header in the raw MIME and leak the list to every + // recipient. SES delivers to bcc addresses via Destination.BccAddresses + // below without ever touching the headers. + + if (dto.attachments) { + mailOptions.attachments = dto.attachments.map((a) => ({ + filename: a.filename, + content: a.content, + })); + } + + try { + const messageData = await new MailComposer(mailOptions).compile().build(); + const command = new SendEmailCommand({ + Destination: { + ToAddresses: [dto.toEmail], + ...(dto.ccEmails && + dto.ccEmails.length > 0 && { CcAddresses: dto.ccEmails }), + ...(dto.bccEmails && + dto.bccEmails.length > 0 && { BccAddresses: dto.bccEmails }), + }, + Content: { Raw: { Data: messageData } }, + }); + return await this.client.send(command); + } catch (err) { + throw new Error(err instanceof Error ? err.message : String(err)); + } + } +} diff --git a/apps/backend/src/aws/ses/awsSesClient.factory.ts b/apps/backend/src/aws/ses/awsSesClient.factory.ts new file mode 100644 index 000000000..ea288070f --- /dev/null +++ b/apps/backend/src/aws/ses/awsSesClient.factory.ts @@ -0,0 +1,32 @@ +import { Provider } from '@nestjs/common'; +import { SESv2Client } from '@aws-sdk/client-sesv2'; + +export const AMAZON_SES_CLIENT = 'AMAZON_SES_CLIENT'; + +/** + * Factory that produces a new instance of the Amazon SES v2 client. + * Reads region and credentials from process.env at injection time and + * passes them explicitly to the client. + */ +export const AmazonSESClientFactory: Provider = { + provide: AMAZON_SES_CLIENT, + useFactory: () => { + // Create dummy client that is never used when email sending is set to false + if (process.env.SEND_AUTOMATED_EMAILS !== 'true') { + return new SESv2Client({}); + } + const region = process.env.AWS_REGION; + const accessKeyId = process.env.AWS_ACCESS_KEY_ID; + const secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY; + + if (!region) throw new Error('AWS_REGION is not defined'); + if (!accessKeyId) throw new Error('AWS_ACCESS_KEY_ID is not defined'); + if (!secretAccessKey) + throw new Error('AWS_SECRET_ACCESS_KEY is not defined'); + + return new SESv2Client({ + region, + credentials: { accessKeyId, secretAccessKey }, + }); + }, +}; diff --git a/apps/backend/src/aws/ses/email.module.ts b/apps/backend/src/aws/ses/email.module.ts new file mode 100644 index 000000000..a6cd1bd12 --- /dev/null +++ b/apps/backend/src/aws/ses/email.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { EmailsService } from './email.service'; +import { AmazonSESWrapper } from './awsSes.wrapper'; +import { AmazonSESClientFactory } from './awsSesClient.factory'; + +@Module({ + providers: [AmazonSESWrapper, AmazonSESClientFactory, EmailsService], + exports: [EmailsService], +}) +export class EmailsModule {} diff --git a/apps/backend/src/aws/ses/email.service.spec.ts b/apps/backend/src/aws/ses/email.service.spec.ts new file mode 100644 index 000000000..a094500d4 --- /dev/null +++ b/apps/backend/src/aws/ses/email.service.spec.ts @@ -0,0 +1,162 @@ +import { Test } from '@nestjs/testing'; +import { SendEmailCommandOutput } from '@aws-sdk/client-sesv2'; +import { AmazonSESWrapper } from './awsSes.wrapper'; +import { EmailsService } from './email.service'; +import { SendEmailDTO } from './sendEmail.dto'; + +describe('EmailsService', () => { + let service: EmailsService; + let mockWrapper: { sendEmail: jest.Mock }; + + const originalSendFlag = process.env.SEND_AUTOMATED_EMAILS; + + const validDto: SendEmailDTO = { + toEmail: 'recipient@example.com', + subject: 'Hello', + bodyHtml: '

Hi there

', + }; + + const successOutput: SendEmailCommandOutput = { + MessageId: 'msg-1', + $metadata: { httpStatusCode: 200 }, + } as SendEmailCommandOutput; + + beforeEach(async () => { + mockWrapper = { sendEmail: jest.fn() }; + + const moduleRef = await Test.createTestingModule({ + providers: [ + EmailsService, + { provide: AmazonSESWrapper, useValue: mockWrapper }, + ], + }).compile(); + + service = moduleRef.get(EmailsService); + }); + + afterEach(() => { + if (originalSendFlag === undefined) { + delete process.env.SEND_AUTOMATED_EMAILS; + } else { + process.env.SEND_AUTOMATED_EMAILS = originalSendFlag; + } + }); + + describe('sendEmail', () => { + it('does not call the wrapper when SEND_AUTOMATED_EMAILS is not "true"', async () => { + process.env.SEND_AUTOMATED_EMAILS = 'false'; + + const result = await service.sendEmail(validDto); + + expect(result).toBeUndefined(); + expect(mockWrapper.sendEmail).not.toHaveBeenCalled(); + }); + + it('rate-limits sends to roughly 14 per second', async () => { + process.env.SEND_AUTOMATED_EMAILS = 'true'; + mockWrapper.sendEmail.mockResolvedValue(successOutput); + + const calls = 10; + // Bottleneck enforces minTime = ceil(1000 / 14) = 72ms between job starts + // With maxConcurrent=1 and immediate-resolving mocks, n jobs take ~(n-1)*72ms + const minTimeMs = Math.ceil(1000 / 14); + const expectedMinElapsed = (calls - 1) * minTimeMs; + + const start = Date.now(); + await Promise.all( + Array.from({ length: calls }, () => service.sendEmail(validDto)), + ); + const elapsed = Date.now() - start; + + expect(mockWrapper.sendEmail).toHaveBeenCalledTimes(calls); + // Allow a small downward tolerance for timer scheduling jitters + expect(elapsed).toBeGreaterThanOrEqual(expectedMinElapsed - 20); + }); + + it('rejects without calling the wrapper when the DTO is invalid', async () => { + process.env.SEND_AUTOMATED_EMAILS = 'true'; + + const invalidDto: SendEmailDTO = { + toEmail: 'not-a-real-email', + subject: 'Hello', + bodyHtml: '

Hi

', + }; + + await expect(service.sendEmail(invalidDto)).rejects.toBeDefined(); + expect(mockWrapper.sendEmail).not.toHaveBeenCalled(); + }); + + it('returns the wrapper output when sending succeeds', async () => { + process.env.SEND_AUTOMATED_EMAILS = 'true'; + mockWrapper.sendEmail.mockResolvedValue(successOutput); + + const result = await service.sendEmail(validDto); + + expect(mockWrapper.sendEmail).toHaveBeenCalledTimes(1); + expect(result).toBe(successOutput); + }); + + it('propagates errors thrown by the wrapper', async () => { + process.env.SEND_AUTOMATED_EMAILS = 'true'; + mockWrapper.sendEmail.mockRejectedValue( + new Error('SES rejected: throttled'), + ); + + await expect(service.sendEmail(validDto)).rejects.toThrow( + 'SES rejected: throttled', + ); + expect(mockWrapper.sendEmail).toHaveBeenCalledTimes(1); + }); + + it('passes ccEmails and bccEmails through to the wrapper', async () => { + process.env.SEND_AUTOMATED_EMAILS = 'true'; + mockWrapper.sendEmail.mockResolvedValue(successOutput); + + const dto: SendEmailDTO = { + toEmail: 'recipient@example.com', + ccEmails: ['cc1@example.com', 'cc2@example.com'], + bccEmails: ['bcc@example.com'], + subject: 'Hello', + bodyHtml: '

Hi

', + }; + + await service.sendEmail(dto); + + expect(mockWrapper.sendEmail).toHaveBeenCalledTimes(1); + expect(mockWrapper.sendEmail).toHaveBeenCalledWith( + expect.objectContaining({ + ccEmails: ['cc1@example.com', 'cc2@example.com'], + bccEmails: ['bcc@example.com'], + }), + ); + }); + + it('rejects when ccEmails contains an invalid address', async () => { + process.env.SEND_AUTOMATED_EMAILS = 'true'; + + const dto: SendEmailDTO = { + toEmail: 'recipient@example.com', + ccEmails: ['not-an-email'], + subject: 'Hello', + bodyHtml: '

Hi

', + }; + + await expect(service.sendEmail(dto)).rejects.toBeDefined(); + expect(mockWrapper.sendEmail).not.toHaveBeenCalled(); + }); + + it('rejects when bccEmails contains an invalid address', async () => { + process.env.SEND_AUTOMATED_EMAILS = 'true'; + + const dto: SendEmailDTO = { + toEmail: 'recipient@example.com', + bccEmails: ['also-not-an-email'], + subject: 'Hello', + bodyHtml: '

Hi

', + }; + + await expect(service.sendEmail(dto)).rejects.toBeDefined(); + expect(mockWrapper.sendEmail).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/apps/backend/src/aws/ses/email.service.ts b/apps/backend/src/aws/ses/email.service.ts new file mode 100644 index 000000000..6301e1744 --- /dev/null +++ b/apps/backend/src/aws/ses/email.service.ts @@ -0,0 +1,61 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { plainToInstance } from 'class-transformer'; +import { validateOrReject } from 'class-validator'; +import Bottleneck from 'bottleneck'; +import { SendEmailCommandOutput } from '@aws-sdk/client-sesv2'; +import { AmazonSESWrapper } from './awsSes.wrapper'; +import { SendEmailDTO } from './sendEmail.dto'; + +@Injectable() +export class EmailsService { + private readonly EMAILS_SENT_PER_SECOND = 14; + private readonly logger = new Logger(EmailsService.name); + private readonly limiter: Bottleneck; + + constructor(private amazonSESWrapper: AmazonSESWrapper) { + this.limiter = new Bottleneck({ + minTime: Math.ceil(1000 / this.EMAILS_SENT_PER_SECOND), + maxConcurrent: 1, + }); + } + + /** + * Sends a single email through Amazon SES to `dto.toEmail`, with optional + * `ccEmails` and `bccEmails`. + * + * Sends are rate-limited to approximately 14 per second to stay under + * the SES per-account send quota. + * + * The DTO is validated at the start of the call via class-validator. Any + * decorator failure (bad email, oversized attachment, subject with CR/LF, + * etc.) causes the method to reject with a ValidationError[] before any + * SES request is made. + * + * Sending is skipped (with a warning) when SEND_AUTOMATED_EMAILS is not + * set to 'true'. + * + * @param dto the email payload - validated against SendEmailDTO's decorators + * @returns the SES response on success, or void when sending is skipped + * @throws ValidationError[] if the DTO fails validation + * @throws Error if SES rejects the send + */ + public async sendEmail( + dto: SendEmailDTO, + ): Promise { + // Since most emails are sent service-to-service, NestJS's global ValidationPipe + // (which runs on a @Body() dto in a controller) never actually occurs + // + // We also need to convert the plain object to an instance of the dto so we can validate it + const validated = plainToInstance(SendEmailDTO, dto); + await validateOrReject(validated); + + if (process.env.SEND_AUTOMATED_EMAILS !== 'true') { + this.logger.warn('SEND_AUTOMATED_EMAILS is not "true". Email not sent.'); + return; + } + + return this.limiter.schedule(() => + this.amazonSESWrapper.sendEmail(validated), + ); + } +} diff --git a/apps/backend/src/aws/ses/sendEmail.dto.ts b/apps/backend/src/aws/ses/sendEmail.dto.ts new file mode 100644 index 000000000..1ef581600 --- /dev/null +++ b/apps/backend/src/aws/ses/sendEmail.dto.ts @@ -0,0 +1,103 @@ +import { Type } from 'class-transformer'; +import { + ArrayMaxSize, + ArrayUnique, + IsArray, + IsEmail, + IsInstance, + IsNotEmpty, + IsOptional, + IsString, + Length, + Matches, + MaxLength, + ValidateNested, + registerDecorator, +} from 'class-validator'; + +/** + * Bounds the byte length of `EmailAttachmentDto.content`. Pair with + * @IsInstance(Buffer) on the same field - this validator assumes the + * value is already a Buffer. + */ +function MaxBufferSize(maxBytes: number) { + return (object: object, propertyName: string) => { + registerDecorator({ + name: 'maxBufferSize', + target: object.constructor, + propertyName, + validator: { + validate: (value: Buffer) => value.length <= maxBytes, + defaultMessage: () => + `${propertyName} must be at most ${maxBytes} bytes`, + }, + }); + }; +} + +/** + * Single attachment passed to SES. `content` is the raw file bytes; + * nodemailer handles base64-encoding it into the MIME message. + */ +export class EmailAttachmentDto { + @IsString() + @IsNotEmpty() + @MaxLength(255) + // Reject `/` and `\` to prevent path-traversal-style filenames + // (e.g. `../../etc/passwd`) from being used as the attachment name. + @Matches(/^[^/\\]+$/, { + message: 'filename must not contain path separators', + }) + filename!: string; + + // Runtime guard: confirms `content` is a Node.js Buffer instance + @IsInstance(Buffer) + // Cap each attachment at 10 MB. + @MaxBufferSize(10 * 1024 * 1024) + content!: Buffer; +} + +/** + * Input shape for EmailsService.sendEmails. All validation lives here + */ +export class SendEmailDTO { + @IsEmail() + @Length(1, 255) + toEmail!: string; + + @IsArray() + @IsOptional() + @ArrayUnique() + @IsEmail({}, { each: true }) + @Length(1, 255, { each: true }) + ccEmails?: string[]; + + @IsArray() + @IsOptional() + @ArrayUnique() + @IsEmail({}, { each: true }) + @Length(1, 255, { each: true }) + bccEmails?: string[]; + + @IsString() + @IsNotEmpty() + @Length(1, 255) + // Reject carriage return (\r) and line feed (\n) to prevent MIME header injection + @Matches(/^[^\r\n]+$/, { + message: 'subject must not contain newlines', + }) + subject!: string; + + @IsString() + @IsNotEmpty() + // Roughly 5-10 KB of string memory, far below SES's 40 MB raw-message cap + @MaxLength(5000) + bodyHtml!: string; + + @IsArray() + @IsOptional() + @ArrayMaxSize(10) + @ValidateNested({ each: true }) + @Type(() => EmailAttachmentDto) + attachments?: EmailAttachmentDto[]; +} diff --git a/apps/backend/src/users/users.controller.ts b/apps/backend/src/users/users.controller.ts index 4d0f9e827..b85cc2aeb 100644 --- a/apps/backend/src/users/users.controller.ts +++ b/apps/backend/src/users/users.controller.ts @@ -1,9 +1,11 @@ import { + Body, Controller, Delete, Get, Param, ParseIntPipe, + Post, UseGuards, UseInterceptors, } from '@nestjs/common'; @@ -30,4 +32,12 @@ export class UsersController { removeUser(@Param('id') id: string) { return this.usersService.remove(parseInt(id)); } + + // Example endpoint for email sending (DO NOT DEPLOY THIS) + /* + @Post('/test-email') + sendTestEmail(@Body() body: { recipient: string }) { + return this.usersService.sendTestEmail(body.recipient); + } + */ } diff --git a/apps/backend/src/users/users.module.ts b/apps/backend/src/users/users.module.ts index 577c23718..2638f52fc 100644 --- a/apps/backend/src/users/users.module.ts +++ b/apps/backend/src/users/users.module.ts @@ -6,9 +6,10 @@ import { User } from './user.entity'; import { JwtStrategy } from '../auth/jwt.strategy'; import { CurrentUserInterceptor } from '../interceptors/current-user.interceptor'; import { AuthService } from '../auth/auth.service'; +import { EmailsModule } from '../aws/ses/email.module'; @Module({ - imports: [TypeOrmModule.forFeature([User])], + imports: [TypeOrmModule.forFeature([User]), EmailsModule], controllers: [UsersController], providers: [UsersService, AuthService, JwtStrategy, CurrentUserInterceptor], }) diff --git a/apps/backend/src/users/users.service.ts b/apps/backend/src/users/users.service.ts index 018a76785..1f9ec22c1 100644 --- a/apps/backend/src/users/users.service.ts +++ b/apps/backend/src/users/users.service.ts @@ -4,10 +4,38 @@ import { Repository } from 'typeorm'; import { User } from './user.entity'; import { Status } from './types'; +import { EmailsService } from '../aws/ses/email.service'; +// import { SendEmailDTO } from '../aws/ses/sendEmail.dto'; @Injectable() export class UsersService { - constructor(@InjectRepository(User) private repo: Repository) {} + constructor( + @InjectRepository(User) private repo: Repository, + private emailsService: EmailsService, + ) {} + + // Example endpoint for email sending (DO NOT DEPLOY THIS) + /* + async sendTestEmail(recipient: string) { + const imageRes = await fetch('https://placehold.co/200x200/png'); + const imageBuffer = Buffer.from(await imageRes.arrayBuffer()); + + const dto: SendEmailDTO = { + toEmail: recipient, + ccEmails: ['cc@example.com'], + bccEmails: ['bcc@example.com'], + subject: 'Test email', + bodyHtml: '

This is a test email sent from UsersService.

', + attachments: [ + { + filename: 'sample.png', + content: imageBuffer, + }, + ], + }; + return this.emailsService.sendEmail(dto); + } + */ async create( email: string, diff --git a/example.env b/example.env index 1a6a59e2d..b0b04bdc8 100644 --- a/example.env +++ b/example.env @@ -10,4 +10,10 @@ COGNITO_USER_POOL_ID= COGNITO_CLIENT_ID= COGNITO_REGION=aws-east-2 VITE_COGNITO_USER_POOL_ID= -VITE_COGNITO_USER_POOL_CLIENT_ID= \ No newline at end of file +VITE_COGNITO_USER_POOL_CLIENT_ID= + +AWS_ACCESS_KEY_ID = 'ABCDEFGHIJK12345678' +AWS_SECRET_ACCESS_KEY = 'bhduerv797887veerfwev78899y87tre' +AWS_REGION = 'us-east-2' +AWS_SES_SENDER_EMAIL = 'example@example.com' +SEND_AUTOMATED_EMAILS=false diff --git a/jest.config.ts b/jest.config.ts index d0dbd1b88..28f219a84 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -1,5 +1,5 @@ -import { getJestProjects } from '@nx/jest'; +import { getJestProjectsAsync } from '@nx/jest'; -export default { - projects: getJestProjects(), -}; +export default async () => ({ + projects: await getJestProjectsAsync(), +}); \ No newline at end of file diff --git a/package.json b/package.json index f870539c8..845d8cff4 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,12 @@ }, "private": true, "dependencies": { + "@aws-amplify/ui-react": "^6.15.4", "@aws-sdk/client-cognito-identity-provider": "^3.410.0", + "@aws-sdk/client-sesv2": "^3.1048.0", "@nestjs/cli": "^10.1.17", "@nestjs/common": "^10.0.2", + "@nestjs/config": "^4.0.4", "@nestjs/core": "^10.0.2", "@nestjs/passport": "^10.0.2", "@nestjs/platform-express": "^11.1.19", @@ -29,11 +32,14 @@ "@nestjs/typeorm": "^10.0.0", "@types/pg": "^8.15.5", "amazon-cognito-identity-js": "^6.3.5", + "aws-amplify": "^6.17.0", "axios": "^1.5.0", + "bottleneck": "^2.19.5", "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", + "class-validator": "^0.15.1", "global": "^4.4.0", "jwks-rsa": "^3.1.0", + "nodemailer": "^8.0.7", "passport": "^0.6.0", "passport-jwt": "^4.0.1", "pg": "^8.16.3", @@ -52,7 +58,7 @@ "@nx/cypress": "^16.8.1", "@nx/eslint-plugin": "^16.8.1", "@nx/eslint-plugin-nx": "^16.0.0-beta.1", - "@nx/jest": "^16.8.1", + "@nx/jest": "^22.7.1", "@nx/linter": "^19.8.4", "@nx/react": "^16.8.1", "@nx/vite": "^16.8.1", @@ -60,13 +66,14 @@ "@testing-library/react": "^14.0.0", "@types/jest": "^30.0.0", "@types/node": "^18.14.2", + "@types/nodemailer": "^8.0.0", "@types/react": "^18.2.14", "@types/react-dom": "^18.2.6", "@typescript-eslint/eslint-plugin": "^6.7.0", "@typescript-eslint/parser": "^5.60.1", "@vitejs/plugin-react": "^4.0.0", "@vitest/ui": "^0.32.0", - "cypress": "^13.0.0", + "cypress": "^15.15.0", "eslint": "^8.46.0", "eslint-config-prettier": "^8.1.0", "eslint-plugin-cypress": "^2.13.4", @@ -76,7 +83,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "husky": "^8.0.3", "jest": "^30.3.0", - "jsdom": "^22.1.0", + "jsdom": "^29.1.1", "lint-staged": "^14.0.1", "nx": "^16.8.1", "nx-cloud": "^16.4.0", diff --git a/yarn.lock b/yarn.lock index b1b6f415a..266695009 100644 --- a/yarn.lock +++ b/yarn.lock @@ -60,6 +60,200 @@ ora "5.4.1" rxjs "7.8.1" +"@asamuzakjp/css-color@^5.1.11": + version "5.1.11" + resolved "https://registry.yarnpkg.com/@asamuzakjp/css-color/-/css-color-5.1.11.tgz#28a0aac8220a4cc19045ac3bd9a813d4060bd375" + integrity sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg== + dependencies: + "@asamuzakjp/generational-cache" "^1.0.1" + "@csstools/css-calc" "^3.2.0" + "@csstools/css-color-parser" "^4.1.0" + "@csstools/css-parser-algorithms" "^4.0.0" + "@csstools/css-tokenizer" "^4.0.0" + +"@asamuzakjp/dom-selector@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz#01880086bb2490098f167beb58555da1a6c9adbd" + integrity sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ== + dependencies: + "@asamuzakjp/generational-cache" "^1.0.1" + "@asamuzakjp/nwsapi" "^2.3.9" + bidi-js "^1.0.3" + css-tree "^3.2.1" + is-potential-custom-element-name "^1.0.1" + +"@asamuzakjp/generational-cache@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz#3d0bf6be4fc059851390a7070720c6007af793ec" + integrity sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg== + +"@asamuzakjp/nwsapi@^2.3.9": + version "2.3.9" + resolved "https://registry.yarnpkg.com/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz#ad5549322dfe9d153d4b4dd6f7ff2ae234b06e24" + integrity sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q== + +"@aws-amplify/analytics@7.0.94": + version "7.0.94" + resolved "https://registry.yarnpkg.com/@aws-amplify/analytics/-/analytics-7.0.94.tgz#c23d2bccdcab613f9904d44a36d97719742b0f45" + integrity sha512-HNBq12e+ZFY7EqqlK2sAX165Vp5M4bx40a26f8ej6bDolZG5kkn4cYmERQX8LaWp0iVpfNUWAWPEppwZiLMMcw== + dependencies: + "@aws-sdk/client-firehose" "^3.1012.0" + "@aws-sdk/client-kinesis" "^3.1012.0" + "@aws-sdk/client-personalize-events" "^3.1012.0" + "@smithy/util-utf8" "2.0.0" + tslib "^2.5.0" + +"@aws-amplify/api-graphql@4.8.7": + version "4.8.7" + resolved "https://registry.yarnpkg.com/@aws-amplify/api-graphql/-/api-graphql-4.8.7.tgz#f8641a8c807d1447b71a9ce1d077e2e78750a658" + integrity sha512-6e+V7SYybxZghTNVmd5DLRSSIbEs64VaXBZNA0vHXKEvXerSAcCwCjbyoKAzPaBgMgflsN8hFJI3xL1IZokM3Q== + dependencies: + "@aws-amplify/api-rest" "4.6.4" + "@aws-amplify/core" "6.16.3" + "@aws-amplify/data-schema" "^1.7.0" + "@aws-sdk/types" "^3.973.6" + graphql "15.8.0" + rxjs "^7.8.1" + tslib "^2.5.0" + +"@aws-amplify/api-rest@4.6.4": + version "4.6.4" + resolved "https://registry.yarnpkg.com/@aws-amplify/api-rest/-/api-rest-4.6.4.tgz#c027807faa2b131b8fea09700cdbc7855bee6c02" + integrity sha512-/gGTP2/vWKma6ApVG56y9/1qh2/i4hDp37sm1zRSM0EMNdKr5RIgHbQ0W1l1gaJHRmPXb2lqUDfj9ZYFQATjQg== + dependencies: + tslib "^2.5.0" + +"@aws-amplify/api@6.3.26": + version "6.3.26" + resolved "https://registry.yarnpkg.com/@aws-amplify/api/-/api-6.3.26.tgz#e44904e92d97de7b3580654744f3c84ee5df52b4" + integrity sha512-4uPCH2w1VO+lH24umwRlYKBOijq7Jl/Tj1nVrSGuU/3s+KtilC+l7BFGTPI5pllFR1oj0WUF0oiGu936+aSuSA== + dependencies: + "@aws-amplify/api-graphql" "4.8.7" + "@aws-amplify/api-rest" "4.6.4" + "@aws-amplify/data-schema" "^1.7.0" + rxjs "^7.8.1" + tslib "^2.5.0" + +"@aws-amplify/auth@6.20.0": + version "6.20.0" + resolved "https://registry.yarnpkg.com/@aws-amplify/auth/-/auth-6.20.0.tgz#a5ecc4def40cf9f30719c522e4debe9f578ba4ce" + integrity sha512-y58KFRvmq7PoAboeiubU0qschyzcvis6erP+K3rsMBImjbwGLJGfDWYikdpw//JLw7L7NZzqt+mvtrZW9ITqeg== + dependencies: + "@aws-crypto/sha256-js" "5.2.0" + "@smithy/types" "^3.3.0" + tslib "^2.5.0" + +"@aws-amplify/core@6.16.3": + version "6.16.3" + resolved "https://registry.yarnpkg.com/@aws-amplify/core/-/core-6.16.3.tgz#524c128a243efe76330561c793e943ca2b21fce5" + integrity sha512-wfB9lLEoLiyUEZAYgy1pOoqJqvkBTPMsx/F406HQNTg7b8+fHi7j5GVapJAg7JhmbJbjfmGtTg6EKY/DqF19kw== + dependencies: + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/types" "^3.973.6" + "@smithy/util-hex-encoding" "2.0.0" + "@types/uuid" "^9.0.0" + js-cookie "^3.0.5" + rxjs "^7.8.1" + tslib "^2.5.0" + uuid "^11.0.0" + +"@aws-amplify/data-schema-types@*": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@aws-amplify/data-schema-types/-/data-schema-types-1.2.1.tgz#5a951fc4fd4ab76a014724de45b407fbcd9cf174" + integrity sha512-SuYVcy9Hg8Ox9P0QCXEPwqHxX5zVPgVo2YvNBOm5TpkZr4UK6ir3USame7dELZsk5/9f6KoP70QAYhTvp/j1Og== + dependencies: + graphql "15.8.0" + rxjs "^7.8.1" + +"@aws-amplify/data-schema@^1.7.0": + version "1.25.6" + resolved "https://registry.yarnpkg.com/@aws-amplify/data-schema/-/data-schema-1.25.6.tgz#ebfb9c2babd638c55257560b0941e7ceab1bf16d" + integrity sha512-vW9YDrWXOIKtUecVsV+j+hSbib2z5P2XpwJevwYidqyLSnI6h4wf8Pm++ksk5iguhSsanuxGlfFNoiOODjw2Sw== + dependencies: + "@aws-amplify/data-schema-types" "*" + "@smithy/util-base64" "^3.0.0" + "@types/aws-lambda" "^8.10.134" + "@types/json-schema" "^7.0.15" + rxjs "^7.8.1" + +"@aws-amplify/datastore@5.1.7": + version "5.1.7" + resolved "https://registry.yarnpkg.com/@aws-amplify/datastore/-/datastore-5.1.7.tgz#c633f0f1f862ea7b42495bb7d57fdc01c901f792" + integrity sha512-305zhly/f0LLWyjo1NP6lZl6J3DDiUIm5Tfzl3rJIEqjixHEH+vXGjGvJXl8V6UOxj/D7BPoBnqDpU/l8nyyaw== + dependencies: + "@aws-amplify/api" "6.3.26" + "@aws-amplify/api-graphql" "4.8.7" + buffer "4.9.2" + idb "5.0.6" + immer "9.0.6" + rxjs "^7.8.1" + ulid "^2.3.0" + +"@aws-amplify/notifications@2.0.94": + version "2.0.94" + resolved "https://registry.yarnpkg.com/@aws-amplify/notifications/-/notifications-2.0.94.tgz#304ec0cb561cba134b49746b64339d9d92900d81" + integrity sha512-SFROWgXVWRoaO4vKXoQV/rDIS3gb7+LQT2W6HSpLsuVuNgHjvR1fUnOeGiZq0x3FhSJnHi9nlqZLtgQZ1aUYkQ== + dependencies: + "@aws-sdk/types" "^3.973.6" + lodash "^4.18.1" + tslib "^2.5.0" + +"@aws-amplify/storage@6.15.0": + version "6.15.0" + resolved "https://registry.yarnpkg.com/@aws-amplify/storage/-/storage-6.15.0.tgz#7ae945a904efd81dc7b4633e2c565cd5fface9d3" + integrity sha512-xMHR9mJilg55PEKYXSuvTMeKxNShC4Tosmu+DCCrYRnf0IjoN5yapcxCVt3xyOryvoQEKTIu1VHlOwYWdm+qkQ== + dependencies: + "@aws-sdk/types" "^3.973.6" + "@smithy/md5-js" "2.0.7" + buffer "4.9.2" + crc-32 "1.2.2" + fast-xml-parser "^5.7.2" + tslib "^2.5.0" + +"@aws-amplify/ui-react-core@3.6.4": + version "3.6.4" + resolved "https://registry.yarnpkg.com/@aws-amplify/ui-react-core/-/ui-react-core-3.6.4.tgz#60b869e22c62dd6d8e3462464508024b707d55ba" + integrity sha512-k6fP03cW6Mi2Tu0gE0l6sKCyn6R5kVWRTz441O5Px6G8Ctn4xnS+mi0YZG14slD5bbvMuuxy0Lgr2A26sblUpg== + dependencies: + "@aws-amplify/ui" "6.15.4" + "@xstate/react" "^3.2.2" + lodash "4.18.1" + react-hook-form "7.53.2" + xstate "^4.33.6" + +"@aws-amplify/ui-react@^6.15.4": + version "6.15.4" + resolved "https://registry.yarnpkg.com/@aws-amplify/ui-react/-/ui-react-6.15.4.tgz#d4ba4ec7ef29a2a3afae3dc1491ac3a08cb895f2" + integrity sha512-nhLuDtFkRu/3l0+cVgvF/H4P7O+CtgBiZwyvGg98PVR9b9JWwlDSZ7Tm0hBpt5AvvaXsegZ6DeGlrMMWK70w5w== + dependencies: + "@aws-amplify/ui" "6.15.4" + "@aws-amplify/ui-react-core" "3.6.4" + "@radix-ui/react-direction" "^1.1.0" + "@radix-ui/react-dropdown-menu" "^2.1.10" + "@radix-ui/react-slider" "^1.3.2" + "@xstate/react" "^3.2.2" + lodash "4.18.1" + qrcode "1.5.0" + tslib "^2.5.2" + +"@aws-amplify/ui@6.15.4": + version "6.15.4" + resolved "https://registry.yarnpkg.com/@aws-amplify/ui/-/ui-6.15.4.tgz#391639a52c7b910603d9ee9b3c70688eda060612" + integrity sha512-WNHJL9Y3dKLcXlGiuCW4Eb8odg0OQvqw2Es69P9bvWrP1UNOFL2s/vd3Gg6I+UrtwjEmtcxDdKzyEmlWxSWPHA== + dependencies: + csstype "^3.1.1" + lodash "4.18.1" + tslib "^2.5.2" + +"@aws-crypto/crc32@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1" + integrity sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + "@aws-crypto/sha256-browser@5.2.0": version "5.2.0" resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" @@ -161,144 +355,315 @@ "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" -"@aws-sdk/core@^3.974.8": - version "3.974.8" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.974.8.tgz#cdd51195a31322f1e429e66919eb18da8944c081" - integrity sha512-njR2qoG6ZuB0kvAS2FyICsFZJ6gmCcf2X/7JcD14sUvGDm26wiZ5BrA6LOiUxKFEF+IVe7kdroxyE00YlkiYsw== +"@aws-sdk/client-firehose@^3.1012.0": + version "3.1054.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-firehose/-/client-firehose-3.1054.0.tgz#37c381a5338104f213dbdb2ddeb88088edf40204" + integrity sha512-M728XCBrkedovLXDRSj0aB8NJPdK0ZS8l1bt5tlJfQMzr4Xc06/L63GIdM5Z00T8JV+RUke8YoMyTZ0qdT054g== dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.974.14" + "@aws-sdk/credential-provider-node" "^3.972.45" + "@aws-sdk/types" "^3.973.9" + "@smithy/core" "^3.24.3" + "@smithy/fetch-http-handler" "^5.4.3" + "@smithy/node-http-handler" "^4.7.3" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + +"@aws-sdk/client-kinesis@^3.1012.0": + version "3.1054.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-kinesis/-/client-kinesis-3.1054.0.tgz#bc7ad0dad3748b6ff731b7d005cfaf61e36ab995" + integrity sha512-VbeShwag4XGRZOZ7usf2LdHrXD59bXtttBb1xa2wVC+X4MXH5WPgdTj9aPILj5Mhw4HG/6fs6OsgDAmSLri5HQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.974.14" + "@aws-sdk/credential-provider-node" "^3.972.45" + "@aws-sdk/types" "^3.973.9" + "@smithy/core" "^3.24.3" + "@smithy/fetch-http-handler" "^5.4.3" + "@smithy/node-http-handler" "^4.7.3" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + +"@aws-sdk/client-personalize-events@^3.1012.0": + version "3.1054.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-personalize-events/-/client-personalize-events-3.1054.0.tgz#4c6d99e7bc1a04e246acd28382f6d360dbe7a229" + integrity sha512-0z7JBUfTaruP7n5Fc9Nu67gDy28GdJWaxen9dVvuzKkD00w0SAvHmGoRIcrbxxLGIEI4i6zvaL5VAPh5e6EVxw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.974.14" + "@aws-sdk/credential-provider-node" "^3.972.45" + "@aws-sdk/types" "^3.973.9" + "@smithy/core" "^3.24.3" + "@smithy/fetch-http-handler" "^5.4.3" + "@smithy/node-http-handler" "^4.7.3" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + +"@aws-sdk/client-sesv2@^3.1048.0": + version "3.1048.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sesv2/-/client-sesv2-3.1048.0.tgz#f8e9e372c6cf5a0e85d8e9e98f7b3e5aa704e4dd" + integrity sha512-uTqJmBe+q8MFAsta7N6whN/bPDJf4iwkxM+MAIaDleVw0Qby4DE8Vj4thjlAR4TIgmm7C0IeEj5HhqeE33K0Qg== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.974.11" + "@aws-sdk/credential-provider-node" "^3.972.42" + "@aws-sdk/signature-v4-multi-region" "^3.996.27" "@aws-sdk/types" "^3.973.8" - "@aws-sdk/xml-builder" "^3.972.22" - "@smithy/core" "^3.23.17" - "@smithy/node-config-provider" "^4.3.14" - "@smithy/property-provider" "^4.2.14" - "@smithy/protocol-http" "^5.3.14" - "@smithy/signature-v4" "^5.3.14" - "@smithy/smithy-client" "^4.12.13" + "@smithy/core" "^3.24.2" + "@smithy/fetch-http-handler" "^5.4.2" + "@smithy/node-http-handler" "^4.7.2" "@smithy/types" "^4.14.1" - "@smithy/util-base64" "^4.3.2" - "@smithy/util-middleware" "^4.2.14" - "@smithy/util-retry" "^4.3.6" - "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" -"@aws-sdk/credential-provider-env@^3.972.34": - version "3.972.34" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.34.tgz#9d420adf02e7604094a641ae613a353aa86e1b83" - integrity sha512-XT0jtf8Fw9JE6ppsQeoNnZRiG+jqRixMT1v1ZR17G60UvVdsQmTG8nbEyHuEPfMxDXEhfdARaM/XiEhca4lGHQ== +"@aws-sdk/core@^3.974.11", "@aws-sdk/core@^3.974.8": + version "3.974.11" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.974.11.tgz#7ff1a193d1e512a1e667734028a5d52cee019d25" + integrity sha512-QpnINq5FZH6EOaDEkmHdT7eUunbvD27pDNQypaWjFyYz7Zl1q3UCMQErBZxpmfGfI7MvI2TlK8KTkgNpv8b1ug== dependencies: - "@aws-sdk/core" "^3.974.8" "@aws-sdk/types" "^3.973.8" - "@smithy/property-provider" "^4.2.14" + "@aws-sdk/xml-builder" "^3.972.24" + "@aws/lambda-invoke-store" "^0.2.2" + "@smithy/core" "^3.24.2" + "@smithy/signature-v4" "^5.4.2" "@smithy/types" "^4.14.1" + bowser "^2.11.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@^3.972.36": - version "3.972.36" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.36.tgz#842268559da2ffc5855cde1e90e7302d53639c08" - integrity sha512-DPoGWfy7J7RKxvbf5kOKIGQkD2ek3dbKgzKIGrnLuvZBz5myU+Im/H6pmc14QcnFbqHMqxvtWSgRDSJW3qXLQg== +"@aws-sdk/core@^3.974.14": + version "3.974.14" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.974.14.tgz#ef69676d99b32a636ac58b39292f3d3d88d51012" + integrity sha512-ppamm04uoj3hhNO5IlQSs5D6rWX1fWkzcn6a4pZrojk8Y6ObY9wzLDdT/Eq3gv6O9hOebi9tYTNB8b8fQj9XJw== dependencies: - "@aws-sdk/core" "^3.974.8" + "@aws-sdk/types" "^3.973.9" + "@aws-sdk/xml-builder" "^3.972.26" + "@aws/lambda-invoke-store" "^0.2.2" + "@smithy/core" "^3.24.3" + "@smithy/signature-v4" "^5.4.2" + "@smithy/types" "^4.14.2" + bowser "^2.11.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-env@^3.972.37": + version "3.972.37" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.37.tgz#b79ce974dd0cfe291a549dc60a11b672b602090e" + integrity sha512-/jpPvEh6f7ntmIzf7dNxoNX6Q8vt8UpesCjbW6mFfk4V1NW6bIy9qxcQ6WbA8As5yQhsZOe+xeNd4xHX8kdY2Q== + dependencies: + "@aws-sdk/core" "^3.974.11" "@aws-sdk/types" "^3.973.8" - "@smithy/fetch-http-handler" "^5.3.17" - "@smithy/node-http-handler" "^4.6.1" - "@smithy/property-provider" "^4.2.14" - "@smithy/protocol-http" "^5.3.14" - "@smithy/smithy-client" "^4.12.13" + "@smithy/core" "^3.24.2" "@smithy/types" "^4.14.1" - "@smithy/util-stream" "^4.5.25" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@^3.972.38": - version "3.972.38" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.38.tgz#e20955fdfe4a88149b20dc7e25a517542e1dfd9f" - integrity sha512-oDzUBu2MGJFgoar05sPMCwSrhw44ASyccrHzj66vO69OZqi7I6hZZxXfuPLC8OCzW7C+sU+bI73XHij41yekgQ== +"@aws-sdk/credential-provider-env@^3.972.40": + version "3.972.40" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.40.tgz#369e655ad98090406cd93a767943df6f963e2418" + integrity sha512-jjT0p0Y7KZtcvExYiPCLJnqM9lkXDV1KBEg/13OE2DXv/9batzlyJHVKUEnRNJccY0O2Sul17E1su38CgdBhGQ== dependencies: - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/credential-provider-env" "^3.972.34" - "@aws-sdk/credential-provider-http" "^3.972.36" - "@aws-sdk/credential-provider-login" "^3.972.38" - "@aws-sdk/credential-provider-process" "^3.972.34" - "@aws-sdk/credential-provider-sso" "^3.972.38" - "@aws-sdk/credential-provider-web-identity" "^3.972.38" - "@aws-sdk/nested-clients" "^3.997.6" + "@aws-sdk/core" "^3.974.14" + "@aws-sdk/types" "^3.973.9" + "@smithy/core" "^3.24.3" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-http@^3.972.39": + version "3.972.39" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.39.tgz#3145f9e82ad9d25289cb2ce74c5cd83a7d10610d" + integrity sha512-pIgTpisWyWg7X1bUbzSjuUYosYTD0Ghz2M0hkSTmb3a6i3qV3uU+NYJPI/E2XSC0HcsZh5rsLPzeXrkb2DS0Cg== + dependencies: + "@aws-sdk/core" "^3.974.11" "@aws-sdk/types" "^3.973.8" - "@smithy/credential-provider-imds" "^4.2.14" - "@smithy/property-provider" "^4.2.14" - "@smithy/shared-ini-file-loader" "^4.4.9" + "@smithy/core" "^3.24.2" + "@smithy/fetch-http-handler" "^5.4.2" + "@smithy/node-http-handler" "^4.7.2" "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-login@^3.972.38": - version "3.972.38" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.38.tgz#278437712c02a3ad1785f70c93b4f591cb3f6491" - integrity sha512-g1NosS8qe4OF++G2UFCM5ovSkgipC7YYor5KCWatG0UoMSO5YFj9C8muePlyVmOBV/WTI16Jo3/s1NUo/o1Bww== +"@aws-sdk/credential-provider-http@^3.972.42": + version "3.972.42" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.42.tgz#cecd63a16c8cee020c874a3612a510ee764bee1c" + integrity sha512-+3fsKtWybe5BjKEUA3/07oh7Ayfd82IED2+gyyaVfS/4PU78E3TaOQxSGOJ1t7Imefoidw/ne9QA7apX8wEnJg== + dependencies: + "@aws-sdk/core" "^3.974.14" + "@aws-sdk/types" "^3.973.9" + "@smithy/core" "^3.24.3" + "@smithy/fetch-http-handler" "^5.4.3" + "@smithy/node-http-handler" "^4.7.3" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-ini@^3.972.41": + version "3.972.41" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.41.tgz#32f25a66c1f4902015493a69240def5759c3df1a" + integrity sha512-u2tyjaxJJzW8UtW4SM1ZcPMDwO6y+kV+llvou+Adts0FAKyzes5jG4izQN+KX3yE8ZROpS5y1LJ//xL2iSf76w== + dependencies: + "@aws-sdk/core" "^3.974.11" + "@aws-sdk/credential-provider-env" "^3.972.37" + "@aws-sdk/credential-provider-http" "^3.972.39" + "@aws-sdk/credential-provider-login" "^3.972.41" + "@aws-sdk/credential-provider-process" "^3.972.37" + "@aws-sdk/credential-provider-sso" "^3.972.41" + "@aws-sdk/credential-provider-web-identity" "^3.972.41" + "@aws-sdk/nested-clients" "^3.997.9" + "@aws-sdk/types" "^3.973.8" + "@smithy/core" "^3.24.2" + "@smithy/credential-provider-imds" "^4.3.2" + "@smithy/types" "^4.14.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-ini@^3.972.44": + version "3.972.44" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.44.tgz#abeb1b3e56d2b564a4447e9081f63f22bfe1d675" + integrity sha512-gZFw5wBefCIPg9vpT+gV5FdhfNKhYTVDZa1IsZCcn3SRoYUOJ/E05vwIogkJoonqBL0ttBGi5vhthX7xceekRg== + dependencies: + "@aws-sdk/core" "^3.974.14" + "@aws-sdk/credential-provider-env" "^3.972.40" + "@aws-sdk/credential-provider-http" "^3.972.42" + "@aws-sdk/credential-provider-login" "^3.972.44" + "@aws-sdk/credential-provider-process" "^3.972.40" + "@aws-sdk/credential-provider-sso" "^3.972.44" + "@aws-sdk/credential-provider-web-identity" "^3.972.44" + "@aws-sdk/nested-clients" "^3.997.12" + "@aws-sdk/types" "^3.973.9" + "@smithy/core" "^3.24.3" + "@smithy/credential-provider-imds" "^4.3.2" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-login@^3.972.41": + version "3.972.41" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.41.tgz#1199f4ce0213c36cab5561fc4a783edf91876dd0" + integrity sha512-0LBitxXiAiaE5nlFPfpNIww/8FRY/I7WIndWsc9GmNFOM7cE1wNpVNQEGEk9Outg5l8xl+3vybxFyUy4l9q/LQ== dependencies: - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/nested-clients" "^3.997.6" + "@aws-sdk/core" "^3.974.11" + "@aws-sdk/nested-clients" "^3.997.9" "@aws-sdk/types" "^3.973.8" - "@smithy/property-provider" "^4.2.14" - "@smithy/protocol-http" "^5.3.14" - "@smithy/shared-ini-file-loader" "^4.4.9" + "@smithy/core" "^3.24.2" "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@^3.972.39": - version "3.972.39" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.39.tgz#71f87848b7615dda4f31a57b113be9666e4bbd1a" - integrity sha512-HEswDQyxUtadoZ/bJsPPENHg7R0Lzym5LuMksJeHvqhCOpP+rtkDLKI4/ZChH4w3cf5kG8n6bZuI8PzajoiqMg== - dependencies: - "@aws-sdk/credential-provider-env" "^3.972.34" - "@aws-sdk/credential-provider-http" "^3.972.36" - "@aws-sdk/credential-provider-ini" "^3.972.38" - "@aws-sdk/credential-provider-process" "^3.972.34" - "@aws-sdk/credential-provider-sso" "^3.972.38" - "@aws-sdk/credential-provider-web-identity" "^3.972.38" +"@aws-sdk/credential-provider-login@^3.972.44": + version "3.972.44" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.44.tgz#662697e224768b340d93a75c05d6c51fef2f9ee8" + integrity sha512-QqEGHfQeZgUDqh7zpqHufrZ8T644ELEWvB+4gUdewLyRw4IRF+6CJqeQuRWqucZdQzoQeMh7fNAD9BWxFAdNig== + dependencies: + "@aws-sdk/core" "^3.974.14" + "@aws-sdk/nested-clients" "^3.997.12" + "@aws-sdk/types" "^3.973.9" + "@smithy/core" "^3.24.3" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-node@^3.972.39", "@aws-sdk/credential-provider-node@^3.972.42": + version "3.972.42" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.42.tgz#64a45c356fc877a326e7830e88845c958fe4d290" + integrity sha512-D4oon2zbqqsWOJUM99Gm3/ZyJ0IJvTXVN3PyloGb3kQEyI36fjCZheZj422lAgTWWd6TSHgiImLt3RIaLdv3dQ== + dependencies: + "@aws-sdk/credential-provider-env" "^3.972.37" + "@aws-sdk/credential-provider-http" "^3.972.39" + "@aws-sdk/credential-provider-ini" "^3.972.41" + "@aws-sdk/credential-provider-process" "^3.972.37" + "@aws-sdk/credential-provider-sso" "^3.972.41" + "@aws-sdk/credential-provider-web-identity" "^3.972.41" "@aws-sdk/types" "^3.973.8" - "@smithy/credential-provider-imds" "^4.2.14" - "@smithy/property-provider" "^4.2.14" - "@smithy/shared-ini-file-loader" "^4.4.9" + "@smithy/core" "^3.24.2" + "@smithy/credential-provider-imds" "^4.3.2" "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-process@^3.972.34": - version "3.972.34" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.34.tgz#c964275be1a528ac73ade6d98c309fb6b7cdfb68" - integrity sha512-T3IFs4EVmVi1dVN5RciFnklCANSzvrQd/VuHY9ThHSQmYkTogjcGkoJEr+oNUPQZnso52183088NqysMPji1/Q== +"@aws-sdk/credential-provider-node@^3.972.45": + version "3.972.45" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.45.tgz#52e3fc07452795316f45a1ec1baa75c16c57e82e" + integrity sha512-3YCv52ExXIRz3LAVNysevd+s7akSpg9dl39v9LJ7dOQH+s5rHi3jMZYQyxwMmglxQGMuzYRfQ0o1VSP2UOlIRw== + dependencies: + "@aws-sdk/credential-provider-env" "^3.972.40" + "@aws-sdk/credential-provider-http" "^3.972.42" + "@aws-sdk/credential-provider-ini" "^3.972.44" + "@aws-sdk/credential-provider-process" "^3.972.40" + "@aws-sdk/credential-provider-sso" "^3.972.44" + "@aws-sdk/credential-provider-web-identity" "^3.972.44" + "@aws-sdk/types" "^3.973.9" + "@smithy/core" "^3.24.3" + "@smithy/credential-provider-imds" "^4.3.2" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-process@^3.972.37": + version "3.972.37" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.37.tgz#4d6ac5c3ccda1dab2b4a3ce47cc93cc2cc7ad6d3" + integrity sha512-7nVaHBUaWIddASYfVaA9O4D5ZVjewU3sCol9WqZPGfW0nR+0WqE0xHZnD/U2L33PlOB8KNXGKZ6wOES/QijKzg== dependencies: - "@aws-sdk/core" "^3.974.8" + "@aws-sdk/core" "^3.974.11" "@aws-sdk/types" "^3.973.8" - "@smithy/property-provider" "^4.2.14" - "@smithy/shared-ini-file-loader" "^4.4.9" + "@smithy/core" "^3.24.2" "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@^3.972.38": - version "3.972.38" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.38.tgz#ec754bfecb2426a3307e19ef7e6c6b6438a327c6" - integrity sha512-5ZxG+t0+3Q3QPh8KEjX6syskhgNf7I0MN7oGioTf6Lm1NTjfP7sIcYGNsthXC2qR8vcD3edNZwCr2ovfSSWuRA== +"@aws-sdk/credential-provider-process@^3.972.40": + version "3.972.40" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.40.tgz#6de375f16662915593fd258784fc7c1e3cf22f5e" + integrity sha512-cXaozlgJCOwmE6D7x4npcPdyk7kiFZdrGjN3D6tXXtItJJMNGPafDfAJn4YQmciMooG/X+b0Y6RTqdVVMx26jg== dependencies: - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/nested-clients" "^3.997.6" - "@aws-sdk/token-providers" "3.1041.0" + "@aws-sdk/core" "^3.974.14" + "@aws-sdk/types" "^3.973.9" + "@smithy/core" "^3.24.3" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-sso@^3.972.41": + version "3.972.41" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.41.tgz#110e5b51bd77a8c93dd8d564024bbe4f791788a2" + integrity sha512-IOWAWEHe5LkjSKkkUUX9ciV6Y1scHTsnfEkdt5yyC4Slrc7AGbkLPrpntjqh18ksJAMOaVhoBsO8p2WyTcY2wQ== + dependencies: + "@aws-sdk/core" "^3.974.11" + "@aws-sdk/nested-clients" "^3.997.9" + "@aws-sdk/token-providers" "3.1048.0" "@aws-sdk/types" "^3.973.8" - "@smithy/property-provider" "^4.2.14" - "@smithy/shared-ini-file-loader" "^4.4.9" + "@smithy/core" "^3.24.2" "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@^3.972.38": - version "3.972.38" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.38.tgz#149951ef6e12db5292118e8ed5d95133c24ad719" - integrity sha512-lYHFF30DGI20jZcYX8cm6Ns0V7f1dDN6g/MBDLTyD/5iw+bXs3yBr2iAiHDkx4RFU5JgsnZvCHYKiRVPRdmOgw== +"@aws-sdk/credential-provider-sso@^3.972.44": + version "3.972.44" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.44.tgz#49395bc19aed59880c04115ce765807dc781fef4" + integrity sha512-YePoj5kQuPmE0MHnyftXCfsO8ZSBd2kDr50XEIUrdejSbGFlayYvUuCohdb8drhGhPm6b65o7H1eC26EZhwUvA== + dependencies: + "@aws-sdk/core" "^3.974.14" + "@aws-sdk/nested-clients" "^3.997.12" + "@aws-sdk/token-providers" "3.1054.0" + "@aws-sdk/types" "^3.973.9" + "@smithy/core" "^3.24.3" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-web-identity@^3.972.41": + version "3.972.41" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.41.tgz#894a98200efd95c066bf8108aebf843899ffbff4" + integrity sha512-mbACk9Yypa8nm4iGZLs0PofOXEcTDOUw6wDnsPXNDNSd2WNXs1tSo+6nc/fh0jLYdfVZThhBL98PHW4aXFsG5A== dependencies: - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/nested-clients" "^3.997.6" + "@aws-sdk/core" "^3.974.11" + "@aws-sdk/nested-clients" "^3.997.9" "@aws-sdk/types" "^3.973.8" - "@smithy/property-provider" "^4.2.14" - "@smithy/shared-ini-file-loader" "^4.4.9" + "@smithy/core" "^3.24.2" "@smithy/types" "^4.14.1" tslib "^2.6.2" +"@aws-sdk/credential-provider-web-identity@^3.972.44": + version "3.972.44" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.44.tgz#eb024c8fc9016a9bfd0e8bff2fc6bbb6459f8794" + integrity sha512-Ys/JJe++8Z2Y5meR1taMBaVcrGBA0/XsVTQR+qOKZbdNyg+8Jlv5rYZSwh8SqEHY00goSOZy7PHzZ2rLNQxDLg== + dependencies: + "@aws-sdk/core" "^3.974.14" + "@aws-sdk/nested-clients" "^3.997.12" + "@aws-sdk/types" "^3.973.9" + "@smithy/core" "^3.24.3" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + "@aws-sdk/middleware-host-header@^3.972.10": version "3.972.10" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.10.tgz#e63b91959ce46948d789582351b2a44c4876e924" @@ -329,26 +694,6 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/middleware-sdk-s3@^3.972.37": - version "3.972.37" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.37.tgz#82ef4953cddd3373d2942d07a5d2baf443bbf3ea" - integrity sha512-Km7M+i8DrLArVzrid1gfxeGhYHBd3uxvE77g0s5a52zPSVosxzQBnJ0gwWb6NIp/DOk8gsBMhi7V+cpJG0ndTA== - dependencies: - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/types" "^3.973.8" - "@aws-sdk/util-arn-parser" "^3.972.3" - "@smithy/core" "^3.23.17" - "@smithy/node-config-provider" "^4.3.14" - "@smithy/protocol-http" "^5.3.14" - "@smithy/signature-v4" "^5.3.14" - "@smithy/smithy-client" "^4.12.13" - "@smithy/types" "^4.14.1" - "@smithy/util-config-provider" "^4.2.2" - "@smithy/util-middleware" "^4.2.14" - "@smithy/util-stream" "^4.5.25" - "@smithy/util-utf8" "^4.2.2" - tslib "^2.6.2" - "@aws-sdk/middleware-user-agent@^3.972.38": version "3.972.38" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.38.tgz#626d9a2499f5a6398a4db917abeeaac14b54c6cb" @@ -363,49 +708,36 @@ "@smithy/util-retry" "^4.3.6" tslib "^2.6.2" -"@aws-sdk/nested-clients@^3.997.6": - version "3.997.6" - resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.997.6.tgz#17433cfac2160ec620a14cbff9d2b33675712cae" - integrity sha512-WBDnqatJl+kGObpfmfSxqnXeYTu3Me8wx8WCtvoxX3pfWrrTv8I4WTMSSs7PZqcRcVh8WeUKMgGFjMG+52SR1w== +"@aws-sdk/nested-clients@^3.997.12": + version "3.997.12" + resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.997.12.tgz#fe84bf027b478907b2f67e3b3cd582b73b9743ad" + integrity sha512-Js2VYaCM269feB0cs0cGmlIhdOgT9aMqzdBx68lCy6kVCYfzr0T36ovUFDvfUmatkuBeyBJhCwaLBh7P8meH5Q== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/middleware-host-header" "^3.972.10" - "@aws-sdk/middleware-logger" "^3.972.10" - "@aws-sdk/middleware-recursion-detection" "^3.972.11" - "@aws-sdk/middleware-user-agent" "^3.972.38" - "@aws-sdk/region-config-resolver" "^3.972.13" - "@aws-sdk/signature-v4-multi-region" "^3.996.25" + "@aws-sdk/core" "^3.974.14" + "@aws-sdk/signature-v4-multi-region" "^3.996.29" + "@aws-sdk/types" "^3.973.9" + "@smithy/core" "^3.24.3" + "@smithy/fetch-http-handler" "^5.4.3" + "@smithy/node-http-handler" "^4.7.3" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + +"@aws-sdk/nested-clients@^3.997.9": + version "3.997.9" + resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.997.9.tgz#aa58ca9c6a0447f74afe36026fc1fd03e843837d" + integrity sha512-jPR3rnmRI4hWYyzfmTGBr7NblMp8QYYeflHXba1H6+7CGrWVqWKQzaXFQ4qbExqPRsXN3T3L3JxFhr6aouXUGQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "^3.974.11" + "@aws-sdk/signature-v4-multi-region" "^3.996.27" "@aws-sdk/types" "^3.973.8" - "@aws-sdk/util-endpoints" "^3.996.8" - "@aws-sdk/util-user-agent-browser" "^3.972.10" - "@aws-sdk/util-user-agent-node" "^3.973.24" - "@smithy/config-resolver" "^4.4.17" - "@smithy/core" "^3.23.17" - "@smithy/fetch-http-handler" "^5.3.17" - "@smithy/hash-node" "^4.2.14" - "@smithy/invalid-dependency" "^4.2.14" - "@smithy/middleware-content-length" "^4.2.14" - "@smithy/middleware-endpoint" "^4.4.32" - "@smithy/middleware-retry" "^4.5.7" - "@smithy/middleware-serde" "^4.2.20" - "@smithy/middleware-stack" "^4.2.14" - "@smithy/node-config-provider" "^4.3.14" - "@smithy/node-http-handler" "^4.6.1" - "@smithy/protocol-http" "^5.3.14" - "@smithy/smithy-client" "^4.12.13" + "@smithy/core" "^3.24.2" + "@smithy/fetch-http-handler" "^5.4.2" + "@smithy/node-http-handler" "^4.7.2" "@smithy/types" "^4.14.1" - "@smithy/url-parser" "^4.2.14" - "@smithy/util-base64" "^4.3.2" - "@smithy/util-body-length-browser" "^4.2.2" - "@smithy/util-body-length-node" "^4.2.3" - "@smithy/util-defaults-mode-browser" "^4.3.49" - "@smithy/util-defaults-mode-node" "^4.2.54" - "@smithy/util-endpoints" "^3.4.2" - "@smithy/util-middleware" "^4.2.14" - "@smithy/util-retry" "^4.3.6" - "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" "@aws-sdk/region-config-resolver@^3.972.13": @@ -419,31 +751,51 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/signature-v4-multi-region@^3.996.25": - version "3.996.25" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.25.tgz#b50651b7e4f9c82482416caa9953ad17645d4a2d" - integrity sha512-+CMIt3e1VzlklAECmG+DtP1sV8iKq25FuA0OKpnJ4KA0kxUtd7CgClY7/RU6VzJBQwbN4EJ9Ue6plvqx1qGadw== +"@aws-sdk/signature-v4-multi-region@^3.996.27": + version "3.996.27" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.27.tgz#69cca231af7317afbb728417e7e0e84707206a82" + integrity sha512-0Phbz4t6HI3D3skxvG2uI+VWU034/nSIw1T8d+FPzzQG9EQTrw94o9mOKO2Gv3n3Oc8P7JD7RAUxkoneLWv5Eg== dependencies: - "@aws-sdk/middleware-sdk-s3" "^3.972.37" "@aws-sdk/types" "^3.973.8" - "@smithy/protocol-http" "^5.3.14" - "@smithy/signature-v4" "^5.3.14" + "@smithy/core" "^3.24.2" + "@smithy/signature-v4" "^5.4.2" "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/token-providers@3.1041.0": - version "3.1041.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.1041.0.tgz#f3f068010780fc85fc4a7faa6a080cfb8afd73a4" - integrity sha512-Th7kPI6YPtvJUcdznooXJMy+9rQWjmEF81LxaJssngBzuysK4a/x+l8kjm1zb7nYsUPbndnBdUnwng/3PLvtGw== +"@aws-sdk/signature-v4-multi-region@^3.996.29": + version "3.996.29" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.29.tgz#04c85fff6a77e81b8aea03763571210e02f64833" + integrity sha512-Few9FoQqOt/0KSvZYP+qdW0dfOhfQ9N+gl2UUDvCPW6mkPKHli9LMbKxWj+wZ5zKPaOoqxuR3Hhy3OTpndkfSw== dependencies: - "@aws-sdk/core" "^3.974.8" - "@aws-sdk/nested-clients" "^3.997.6" + "@aws-sdk/types" "^3.973.9" + "@smithy/signature-v4" "^5.4.2" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + +"@aws-sdk/token-providers@3.1048.0": + version "3.1048.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.1048.0.tgz#d744de5604fcafa3389bb9ff89aaa5c4836db88f" + integrity sha512-k0y/GcuesuSfWyUM0WamrGyeZmltRYaPbHO82UDA6mZ/doB+FOHKutikPAtSXMn/hDz970cF+iRuuiYO9VEbAA== + dependencies: + "@aws-sdk/core" "^3.974.11" + "@aws-sdk/nested-clients" "^3.997.9" "@aws-sdk/types" "^3.973.8" - "@smithy/property-provider" "^4.2.14" - "@smithy/shared-ini-file-loader" "^4.4.9" + "@smithy/core" "^3.24.2" "@smithy/types" "^4.14.1" tslib "^2.6.2" +"@aws-sdk/token-providers@3.1054.0": + version "3.1054.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.1054.0.tgz#5f08616ddd41041a7866768f9b4c267bd6dfe21a" + integrity sha512-hG9YKApmZOw+drJ9Nuoaf/OvC8e5W1+3eoLeN5p2uVCZRWsv27teIS0b4kiH6Sfv3WMmamqYJxmE2WMwyp/L/A== + dependencies: + "@aws-sdk/core" "^3.974.14" + "@aws-sdk/nested-clients" "^3.997.12" + "@aws-sdk/types" "^3.973.9" + "@smithy/core" "^3.24.3" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + "@aws-sdk/types@^3.1.0", "@aws-sdk/types@^3.222.0", "@aws-sdk/types@^3.973.8": version "3.973.8" resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.973.8.tgz#7352cb74a5f8bae1218eee63e714cf94302911c5" @@ -452,11 +804,12 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@aws-sdk/util-arn-parser@^3.972.3": - version "3.972.3" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz#ed989862bbb172ce16d9e1cd5790e5fe367219c2" - integrity sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA== +"@aws-sdk/types@^3.973.6", "@aws-sdk/types@^3.973.9": + version "3.973.9" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.973.9.tgz#7d1c08cc6e82ec2ac2f2da102a7dd55806592f7f" + integrity sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg== dependencies: + "@smithy/types" "^4.14.2" tslib "^2.6.2" "@aws-sdk/util-endpoints@^3.996.8": @@ -506,14 +859,23 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/xml-builder@^3.972.22": - version "3.972.22" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.972.22.tgz#1e44ca9fd9c3fdc3d9af9540ced024f34cfc60b2" - integrity sha512-PMYKKtJd70IsSG0yHrdAbxBr+ZWBKLvzFZfD3/urxgf6hXVMzuU5M+3MJ5G67RpOmLBu1fAUN65SbWuKUCOlAA== +"@aws-sdk/xml-builder@^3.972.24": + version "3.972.24" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.972.24.tgz#83ae19e48bdb897dff595a5430103dd1b4f7b6ff" + integrity sha512-V8z5YcDPfsvzrBlj0xR1vhRtocblhYbqdreCJB/voGd4Sr5zjNAeWxexbnqVtskTJe0vFb5KMqbSL++ePl+zRw== dependencies: "@nodable/entities" "2.1.0" "@smithy/types" "^4.14.1" - fast-xml-parser "5.7.2" + fast-xml-parser "5.7.3" + tslib "^2.6.2" + +"@aws-sdk/xml-builder@^3.972.26": + version "3.972.26" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.972.26.tgz#949366fe7c195f676f0ab9e002dd95b70942410c" + integrity sha512-cDbrqvDS73whl6YAPSPq0U6whzG6UWI9PuWh0wrUuGoZexhWEqhdunbukV7iBoaWnFV1AODutM5hOD6rtn439g== + dependencies: + "@smithy/types" "^4.14.2" + fast-xml-parser "5.7.3" tslib "^2.6.2" "@aws/lambda-invoke-store@^0.2.2": @@ -521,7 +883,7 @@ resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz#802f6a50f6b6589063ef63ba8acdee86fcb9f395" integrity sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ== -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.27.1", "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.27.1", "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== @@ -535,7 +897,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.3.tgz#e3f5347f0589596c91d227ccb6a541d37fb1307b" integrity sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.21.3", "@babel/core@^7.22.9", "@babel/core@^7.23.2", "@babel/core@^7.23.9", "@babel/core@^7.27.4", "@babel/core@^7.28.0": +"@babel/core@^7.21.3", "@babel/core@^7.22.9", "@babel/core@^7.23.2", "@babel/core@^7.23.9", "@babel/core@^7.27.4", "@babel/core@^7.28.0": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== @@ -556,7 +918,7 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.27.5", "@babel/generator@^7.29.0", "@babel/generator@^7.7.2": +"@babel/generator@^7.27.5", "@babel/generator@^7.29.0": version "7.29.1" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== @@ -718,7 +1080,7 @@ "@babel/template" "^7.28.6" "@babel/types" "^7.29.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": version "7.29.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.3.tgz#116f70a77958307fceac27747573032f8a62f88e" integrity sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA== @@ -857,7 +1219,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.27.1", "@babel/plugin-syntax-jsx@^7.28.6", "@babel/plugin-syntax-jsx@^7.7.2": +"@babel/plugin-syntax-jsx@^7.27.1", "@babel/plugin-syntax-jsx@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz#f8ca28bbd84883b5fea0e447c635b81ba73997ee" integrity sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w== @@ -920,7 +1282,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.27.1", "@babel/plugin-syntax-typescript@^7.28.6", "@babel/plugin-syntax-typescript@^7.3.3", "@babel/plugin-syntax-typescript@^7.7.2": +"@babel/plugin-syntax-typescript@^7.27.1", "@babel/plugin-syntax-typescript@^7.28.6", "@babel/plugin-syntax-typescript@^7.3.3": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz#c7b2ddf1d0a811145b1de800d1abd146af92e3a2" integrity sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A== @@ -1523,7 +1885,7 @@ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.2.tgz#9a6e2d05f4b6692e1801cd4fb176ad823930ed5e" integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g== -"@babel/template@^7.28.6", "@babel/template@^7.3.3": +"@babel/template@^7.28.6": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== @@ -1545,7 +1907,7 @@ "@babel/types" "^7.29.0" debug "^4.3.1" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.5", "@babel/types@^7.28.6", "@babel/types@^7.29.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.5", "@babel/types@^7.28.6", "@babel/types@^7.29.0", "@babel/types@^7.4.4": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== @@ -1563,6 +1925,13 @@ resolved "https://registry.yarnpkg.com/@borewit/text-codec/-/text-codec-0.2.2.tgz#75025f735c0983b3a871668804a57387e3649375" integrity sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ== +"@bramus/specificity@^2.4.2": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@bramus/specificity/-/specificity-2.4.2.tgz#aa8db8eb173fdee7324f82284833106adeecc648" + integrity sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw== + dependencies: + css-tree "^3.0.0" + "@bufbuild/protobuf@^2.5.0": version "2.12.0" resolved "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-2.12.0.tgz#53225636a8fcebb2bd94998ad9d42f99f96add4d" @@ -1585,10 +1954,43 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@cypress/request@^3.0.6": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.10.tgz#e09c695e8460a82acafe6cfaf089cf2ca06dc054" - integrity sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ== +"@csstools/color-helpers@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-6.0.2.tgz#82c59fd30649cf0b4d3c82160489748666e6550b" + integrity sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q== + +"@csstools/css-calc@^3.2.0", "@csstools/css-calc@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-3.2.1.tgz#b30e061ca9f297ccb2b3b032bfee32fda02b1b27" + integrity sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg== + +"@csstools/css-color-parser@^4.1.0": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-4.1.1.tgz#70c322112e2aafb0b09f34b51ce3482db6aab2ac" + integrity sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g== + dependencies: + "@csstools/color-helpers" "^6.0.2" + "@csstools/css-calc" "^3.2.1" + +"@csstools/css-parser-algorithms@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz#e1c65dc09378b42f26a111fca7f7075fc2c26164" + integrity sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w== + +"@csstools/css-syntax-patches-for-csstree@^1.1.3": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.4.tgz#8f4e5e23574e8c76005588984308d2b216993720" + integrity sha512-wgsqt92b7C7tQhIdPNxj0n9zuUbQlvAuI1exyzeNrOKOi62SD7ren8zqszmpVREjAOqg8cD2FqYhQfAuKjk4sw== + +"@csstools/css-tokenizer@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz#798a33950d11226a0ebb6acafa60f5594424967f" + integrity sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA== + +"@cypress/request@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-4.0.0.tgz#2bc3a10a7d50f338dc644dc5fd14a60107c6f3e2" + integrity sha512-wGTQfwDMMMiz/muFw4YbCLwTh0uZsXKK+6zWBzftADpitSi6iM62C8GzEhNcng2srUiGPksOriQkA8zakW2R0g== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -1607,7 +2009,6 @@ safe-buffer "^5.1.2" tough-cookie "^5.0.0" tunnel-agent "^0.6.0" - uuid "^8.3.2" "@cypress/xvfb@^1.2.4": version "1.2.4" @@ -1803,6 +2204,38 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== +"@exodus/bytes@^1.11.0", "@exodus/bytes@^1.15.0", "@exodus/bytes@^1.6.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@exodus/bytes/-/bytes-1.15.0.tgz#54479e0f406cbad024d6fe1c3190ecca4468df3b" + integrity sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ== + +"@floating-ui/core@^1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.5.tgz#d4af157a03330af5a60e69da7a4692507ada0622" + integrity sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ== + dependencies: + "@floating-ui/utils" "^0.2.11" + +"@floating-ui/dom@^1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.6.tgz#f915bba5abbb177e1f227cacee1b4d0634b187bf" + integrity sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ== + dependencies: + "@floating-ui/core" "^1.7.5" + "@floating-ui/utils" "^0.2.11" + +"@floating-ui/react-dom@^2.0.0": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.8.tgz#5fb5a20d10aafb9505f38c24f38d00c8e1598893" + integrity sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A== + dependencies: + "@floating-ui/dom" "^1.7.6" + +"@floating-ui/utils@^0.2.11": + version "0.2.11" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.11.tgz#a269e055e40e2f45873bae9d1a2fdccbd314ea3f" + integrity sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg== + "@humanwhocodes/config-array@^0.13.0": version "0.13.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" @@ -1862,16 +2295,16 @@ jest-util "30.3.0" slash "^3.0.0" -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== +"@jest/console@30.4.1": + version "30.4.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-30.4.1.tgz#e57725678c3fcc9f7e5597e691e454fee4ce0939" + integrity sha512-v3bhyxUh9Hgmo5p6hAOXe14/R3ZxZDOsvHleh4B07z3m/x4/ngPUXEm9XwK4sF4u+f+P2ORb0Ge+MgpaqRMVDA== dependencies: - "@jest/types" "^29.6.3" + "@jest/types" "30.4.1" "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" + chalk "^4.1.2" + jest-message-util "30.4.1" + jest-util "30.4.1" slash "^3.0.0" "@jest/core@30.3.0": @@ -1917,6 +2350,11 @@ resolved "https://registry.yarnpkg.com/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz#25b0818d3d83f00b9c7b04e069b8810f9014b143" integrity sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA== +"@jest/diff-sequences@30.4.0": + version "30.4.0" + resolved "https://registry.yarnpkg.com/@jest/diff-sequences/-/diff-sequences-30.4.0.tgz#8be2d260e6241d6cddddd102c304fe13b4fc8e3e" + integrity sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g== + "@jest/environment@30.3.0": version "30.3.0" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-30.3.0.tgz#b0657c2944b6ef3352f7b25903cc3a23e6ab70f6" @@ -1927,15 +2365,15 @@ "@types/node" "*" jest-mock "30.3.0" -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== +"@jest/environment@30.4.1": + version "30.4.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-30.4.1.tgz#1ab5b736e3ce6336d59e00765fa24019649f1a30" + integrity sha512-AK9yNRqgKxiabqMoe4oW+3/TSSeV8vkdC7BGaxZdU0AFXfOpofTLqdru2GXKZghP3sdgwE9XXpnVwfZ8JnFV4w== dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" + "@jest/fake-timers" "30.4.1" + "@jest/types" "30.4.1" "@types/node" "*" - jest-mock "^29.7.0" + jest-mock "30.4.1" "@jest/expect-utils@30.3.0": version "30.3.0" @@ -1944,12 +2382,12 @@ dependencies: "@jest/get-type" "30.1.0" -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== +"@jest/expect-utils@30.4.1": + version "30.4.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-30.4.1.tgz#e0c7436d52b08610de9027841912dc3734ae80b2" + integrity sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ== dependencies: - jest-get-type "^29.6.3" + "@jest/get-type" "30.1.0" "@jest/expect@30.3.0": version "30.3.0" @@ -1959,13 +2397,13 @@ expect "30.3.0" jest-snapshot "30.3.0" -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== +"@jest/expect@30.4.1": + version "30.4.1" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-30.4.1.tgz#7fefc67f86c2cb2af3c86d9d41fe4a1d74862b8c" + integrity sha512-ginrj6TMgh2GshLUGCjO94Ptx9HhdZA/I6A9iUfyeLKFtdAjnKzHDgzgP9HYQgbxM1lbXScQ2eUBz2lGeVDPWA== dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" + expect "30.4.1" + jest-snapshot "30.4.1" "@jest/fake-timers@30.3.0": version "30.3.0" @@ -1979,17 +2417,17 @@ jest-mock "30.3.0" jest-util "30.3.0" -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== +"@jest/fake-timers@30.4.1": + version "30.4.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-30.4.1.tgz#ad2d3412d5d005a3e45740bd4c8ee1ccae2f89e1" + integrity sha512-iW5umdmfPeWzehrVhugFQZqCchSCud5S1l2YT0O9ZhjRR0ExclANDZkiSBwzqtnlOn0J1JXvO+HZ6rkuyOVOgQ== dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" + "@jest/types" "30.4.1" + "@sinonjs/fake-timers" "^15.4.0" "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" + jest-message-util "30.4.1" + jest-mock "30.4.1" + jest-util "30.4.1" "@jest/get-type@30.1.0": version "30.1.0" @@ -2006,15 +2444,15 @@ "@jest/types" "30.3.0" jest-mock "30.3.0" -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== +"@jest/globals@30.4.1": + version "30.4.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-30.4.1.tgz#6376975e137ef87926349b5e75ccf230f491e843" + integrity sha512-ZbuY4cmXC8DkxYjfvT2DbcHWL2T6vmsMhXCDcmTB2T0y0gaezBI77ufq5ZAIdcRkYZ7NEQEDg1xFeKbxUJ5v5Q== dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" + "@jest/environment" "30.4.1" + "@jest/expect" "30.4.1" + "@jest/types" "30.4.1" + jest-mock "30.4.1" "@jest/pattern@30.0.1": version "30.0.1" @@ -2024,6 +2462,14 @@ "@types/node" "*" jest-regex-util "30.0.1" +"@jest/pattern@30.4.0": + version "30.4.0" + resolved "https://registry.yarnpkg.com/@jest/pattern/-/pattern-30.4.0.tgz#fcb519eeacc25caa3768f787595a27afa15302ae" + integrity sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg== + dependencies: + "@types/node" "*" + jest-regex-util "30.4.0" + "@jest/reporters@30.3.0": version "30.3.0" resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-30.3.0.tgz#0c1065f6c892665e5a051df22b19df4466ed816b" @@ -2053,34 +2499,33 @@ string-length "^4.0.2" v8-to-istanbul "^9.0.1" -"@jest/reporters@^29.4.1": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== +"@jest/reporters@^30.0.2": + version "30.4.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-30.4.1.tgz#41d42533f199e737ae352a0a0b32ff300826efe2" + integrity sha512-/SnkPCzEQpUaBH81kjdEdDdo2WZl5hxw+BmLDGWjRkm8o7XlhjwsU36cqwe5PGBE5WYpBvDzRSdXx9rbGuJtNA== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" + "@jest/console" "30.4.1" + "@jest/test-result" "30.4.1" + "@jest/transform" "30.4.1" + "@jest/types" "30.4.1" + "@jridgewell/trace-mapping" "^0.3.25" "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" + chalk "^4.1.2" + collect-v8-coverage "^1.0.2" + exit-x "^0.2.2" + glob "^10.5.0" + graceful-fs "^4.2.11" istanbul-lib-coverage "^3.0.0" istanbul-lib-instrument "^6.0.0" istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" + istanbul-lib-source-maps "^5.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" + jest-message-util "30.4.1" + jest-util "30.4.1" + jest-worker "30.4.1" slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" + string-length "^4.0.2" v8-to-istanbul "^9.0.1" "@jest/schemas@30.0.5": @@ -2090,6 +2535,13 @@ dependencies: "@sinclair/typebox" "^0.34.0" +"@jest/schemas@30.4.1": + version "30.4.1" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-30.4.1.tgz#c3703fdd71357e2c83aa59bd38469e60a11529c6" + integrity sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q== + dependencies: + "@sinclair/typebox" "^0.34.0" + "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" @@ -2107,6 +2559,16 @@ graceful-fs "^4.2.11" natural-compare "^1.4.0" +"@jest/snapshot-utils@30.4.1": + version "30.4.1" + resolved "https://registry.yarnpkg.com/@jest/snapshot-utils/-/snapshot-utils-30.4.1.tgz#0f829488b9d46b118854a16a56d509a3c6d9e064" + integrity sha512-ObY4ljvQ95mt6iwKtVLetR/4yXiAgl3H4nJxhztr0MTjrN97TwDYrnCp/kF60Ec9HdhkWTHSu+Hg05aXfngpOA== + dependencies: + "@jest/types" "30.4.1" + chalk "^4.1.2" + graceful-fs "^4.2.11" + natural-compare "^1.4.0" + "@jest/source-map@30.0.1": version "30.0.1" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-30.0.1.tgz#305ebec50468f13e658b3d5c26f85107a5620aaa" @@ -2116,15 +2578,6 @@ callsites "^3.1.0" graceful-fs "^4.2.11" -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - "@jest/test-result@30.3.0": version "30.3.0" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-30.3.0.tgz#cd8882d683d467fcffb98c09501a65687a76aae9" @@ -2135,15 +2588,15 @@ "@types/istanbul-lib-coverage" "^2.0.6" collect-v8-coverage "^1.0.2" -"@jest/test-result@^29.4.1", "@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== +"@jest/test-result@30.4.1", "@jest/test-result@^30.0.2": + version "30.4.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-30.4.1.tgz#e21146ebbb3e1f7f76c3c49805d9f39ae45f8de1" + integrity sha512-/ZG7pgEiOmmWkN9TplKbOu4id2N5lh7FHwRwlkgBVAzGdRH+OkkQ8wX/kIxg4zmd3ZQvAL1RwL2yWsvNYYECTw== dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" + "@jest/console" "30.4.1" + "@jest/types" "30.4.1" + "@types/istanbul-lib-coverage" "^2.0.6" + collect-v8-coverage "^1.0.2" "@jest/test-sequencer@30.3.0": version "30.3.0" @@ -2155,14 +2608,14 @@ jest-haste-map "30.3.0" slash "^3.0.0" -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== +"@jest/test-sequencer@30.4.1": + version "30.4.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-30.4.1.tgz#caf9a5e0924ed3b04957441edf9e8cef6a804391" + integrity sha512-PeYE+4td5rKjoRPxztObrXU+H8hsjZfxKMXOcmrr34JerSyB/ROOxbbicz8B7A5j9R9VayDnVPvBmedqCsFCdw== dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" + "@jest/test-result" "30.4.1" + graceful-fs "^4.2.11" + jest-haste-map "30.4.1" slash "^3.0.0" "@jest/transform@30.3.0": @@ -2185,26 +2638,25 @@ slash "^3.0.0" write-file-atomic "^5.0.1" -"@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== +"@jest/transform@30.4.1": + version "30.4.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-30.4.1.tgz#1646cddb800d38d9c4e30fecfd4a6eba0fa8acfa" + integrity sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ== dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" + "@babel/core" "^7.27.4" + "@jest/types" "30.4.1" + "@jridgewell/trace-mapping" "^0.3.25" + babel-plugin-istanbul "^7.0.1" + chalk "^4.1.2" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" + graceful-fs "^4.2.11" + jest-haste-map "30.4.1" + jest-regex-util "30.4.0" + jest-util "30.4.1" + pirates "^4.0.7" slash "^3.0.0" - write-file-atomic "^4.0.2" + write-file-atomic "^5.0.1" "@jest/types@30.3.0": version "30.3.0" @@ -2219,17 +2671,18 @@ "@types/yargs" "^17.0.33" chalk "^4.1.2" -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== +"@jest/types@30.4.1": + version "30.4.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-30.4.1.tgz#f79b647a85cb2ff4a90cc55984b31dae820db1f7" + integrity sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ== dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" + "@jest/pattern" "30.4.0" + "@jest/schemas" "30.4.1" + "@types/istanbul-lib-coverage" "^2.0.6" + "@types/istanbul-reports" "^3.0.4" "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" + "@types/yargs" "^17.0.33" + chalk "^4.1.2" "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": version "0.3.13" @@ -2273,7 +2726,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": version "0.3.31" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== @@ -2516,6 +2969,15 @@ iterare "1.2.1" tslib "2.8.1" +"@nestjs/config@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@nestjs/config/-/config-4.0.4.tgz#311d806fdc32a8bf29cf9ced903b97cbdb7e064b" + integrity sha512-CJPjNitr0bAufSEnRe2N+JbnVmMmDoo6hvKCPzXgZoGwJSmp/dZPk9f/RMbuD/+Q1ZJPjwsRpq0vxna++Knwow== + dependencies: + dotenv "17.4.1" + dotenv-expand "12.0.3" + lodash "4.18.1" + "@nestjs/core@^10.0.2": version "10.4.22" resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-10.4.22.tgz#c4196952fbaadb1f6e1b81bbbc5802c3ce41b6bd" @@ -2670,13 +3132,6 @@ dependencies: "@nx/eslint-plugin" "16.10.0" -"@nrwl/jest@16.10.0": - version "16.10.0" - resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-16.10.0.tgz#5c7cd692e7aacba43687271bb3528568c14c1239" - integrity sha512-hZuIK3xXh4HaE6/Ny8hGidjkJ4aLZjnQtPDxKD/423gznQe2FdHx3avoSlbOEOx5Oc6sJ9QGGZLcvckKQ5uWww== - dependencies: - "@nx/jest" "16.10.0" - "@nrwl/js@16.10.0": version "16.10.0" resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-16.10.0.tgz#2938144cfb5de1dc6b6b231e12cdd86858d31c62" @@ -2872,24 +3327,26 @@ tslib "^2.3.0" typescript "~5.4.2" -"@nx/jest@16.10.0", "@nx/jest@^16.8.1": - version "16.10.0" - resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-16.10.0.tgz#f3f15e777035877b5c37172c5611b53af9917310" - integrity sha512-QseeLjDrl4c9q9Dd/057SXYqd47JVLhD2VQlQDraYwjsHz3lWkzlGaaHy0ZrVu8LSzY7lUUhJMPyYO3qo8wT6A== +"@nx/jest@^22.7.1": + version "22.7.1" + resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-22.7.1.tgz#adae2808226f3dbb6d9a638aedd262aaabd03ca7" + integrity sha512-5e9O19Gv6vF/xgyu6fdW49fSB11VqAuWyI/ls0Fjy+2c71JuuJXftF/HfYf7SH008PqccVyXYMCZZNGRGuqWsg== dependencies: - "@jest/reporters" "^29.4.1" - "@jest/test-result" "^29.4.1" - "@nrwl/jest" "16.10.0" - "@nx/devkit" "16.10.0" - "@nx/js" "16.10.0" - "@phenomnomnominal/tsquery" "~5.0.1" - chalk "^4.1.0" + "@jest/reporters" "^30.0.2" + "@jest/test-result" "^30.0.2" + "@nx/devkit" "22.7.1" + "@nx/js" "22.7.1" + "@phenomnomnominal/tsquery" "~6.1.4" identity-obj-proxy "3.0.0" - jest-config "^29.4.1" - jest-resolve "^29.4.1" - jest-util "^29.4.1" - resolve.exports "1.1.0" + jest-config "^30.0.2" + jest-resolve "^30.0.2" + jest-util "^30.0.2" + minimatch "10.2.4" + picocolors "^1.1.0" + resolve.exports "2.0.3" + semver "^7.6.3" tslib "^2.3.0" + yargs-parser "21.1.1" "@nx/js@16.10.0": version "16.10.0" @@ -3550,6 +4007,251 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.29.tgz#5a40109a1ab5f84d6fd8fc928b19f367cbe7e7b1" integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww== +"@radix-ui/number@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.1.1.tgz#7b2c9225fbf1b126539551f5985769d0048d9090" + integrity sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g== + +"@radix-ui/primitive@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.3.tgz#e2dbc13bdc5e4168f4334f75832d7bdd3e2de5ba" + integrity sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg== + +"@radix-ui/react-arrow@1.1.7": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz#e14a2657c81d961598c5e72b73dd6098acc04f09" + integrity sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w== + dependencies: + "@radix-ui/react-primitive" "2.1.3" + +"@radix-ui/react-collection@1.1.7": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.1.7.tgz#d05c25ca9ac4695cc19ba91f42f686e3ea2d9aec" + integrity sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-slot" "1.2.3" + +"@radix-ui/react-compose-refs@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz#a2c4c47af6337048ee78ff6dc0d090b390d2bb30" + integrity sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg== + +"@radix-ui/react-context@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.2.tgz#61628ef269a433382c364f6f1e3788a6dc213a36" + integrity sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA== + +"@radix-ui/react-direction@1.1.1", "@radix-ui/react-direction@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.1.1.tgz#39e5a5769e676c753204b792fbe6cf508e550a14" + integrity sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw== + +"@radix-ui/react-dismissable-layer@1.1.11": + version "1.1.11" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz#e33ab6f6bdaa00f8f7327c408d9f631376b88b37" + integrity sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg== + dependencies: + "@radix-ui/primitive" "1.1.3" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-callback-ref" "1.1.1" + "@radix-ui/react-use-escape-keydown" "1.1.1" + +"@radix-ui/react-dropdown-menu@^2.1.10": + version "2.1.16" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz#5ee045c62bad8122347981c479d92b1ff24c7254" + integrity sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw== + dependencies: + "@radix-ui/primitive" "1.1.3" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-id" "1.1.1" + "@radix-ui/react-menu" "2.1.16" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-controllable-state" "1.2.2" + +"@radix-ui/react-focus-guards@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz#2a5669e464ad5fde9f86d22f7fdc17781a4dfa7f" + integrity sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw== + +"@radix-ui/react-focus-scope@1.1.7": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz#dfe76fc103537d80bf42723a183773fd07bfb58d" + integrity sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-callback-ref" "1.1.1" + +"@radix-ui/react-id@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.1.1.tgz#1404002e79a03fe062b7e3864aa01e24bd1471f7" + integrity sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-menu@2.1.16": + version "2.1.16" + resolved "https://registry.yarnpkg.com/@radix-ui/react-menu/-/react-menu-2.1.16.tgz#528a5a973c3a7413d3d49eb9ccd229aa52402911" + integrity sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg== + dependencies: + "@radix-ui/primitive" "1.1.3" + "@radix-ui/react-collection" "1.1.7" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-direction" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.11" + "@radix-ui/react-focus-guards" "1.1.3" + "@radix-ui/react-focus-scope" "1.1.7" + "@radix-ui/react-id" "1.1.1" + "@radix-ui/react-popper" "1.2.8" + "@radix-ui/react-portal" "1.1.9" + "@radix-ui/react-presence" "1.1.5" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-roving-focus" "1.1.11" + "@radix-ui/react-slot" "1.2.3" + "@radix-ui/react-use-callback-ref" "1.1.1" + aria-hidden "^1.2.4" + react-remove-scroll "^2.6.3" + +"@radix-ui/react-popper@1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.2.8.tgz#a79f39cdd2b09ab9fb50bf95250918422c4d9602" + integrity sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw== + dependencies: + "@floating-ui/react-dom" "^2.0.0" + "@radix-ui/react-arrow" "1.1.7" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-callback-ref" "1.1.1" + "@radix-ui/react-use-layout-effect" "1.1.1" + "@radix-ui/react-use-rect" "1.1.1" + "@radix-ui/react-use-size" "1.1.1" + "@radix-ui/rect" "1.1.1" + +"@radix-ui/react-portal@1.1.9": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.1.9.tgz#14c3649fe48ec474ac51ed9f2b9f5da4d91c4472" + integrity sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ== + dependencies: + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-presence@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.5.tgz#5d8f28ac316c32f078afce2996839250c10693db" + integrity sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ== + dependencies: + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-primitive@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz#db9b8bcff49e01be510ad79893fb0e4cda50f1bc" + integrity sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ== + dependencies: + "@radix-ui/react-slot" "1.2.3" + +"@radix-ui/react-roving-focus@1.1.11": + version "1.1.11" + resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz#ef54384b7361afc6480dcf9907ef2fedb5080fd9" + integrity sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA== + dependencies: + "@radix-ui/primitive" "1.1.3" + "@radix-ui/react-collection" "1.1.7" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-direction" "1.1.1" + "@radix-ui/react-id" "1.1.1" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-callback-ref" "1.1.1" + "@radix-ui/react-use-controllable-state" "1.2.2" + +"@radix-ui/react-slider@^1.3.2": + version "1.3.6" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slider/-/react-slider-1.3.6.tgz#409453110b8f34ca00972750b80cd792f0b23a8c" + integrity sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw== + dependencies: + "@radix-ui/number" "1.1.1" + "@radix-ui/primitive" "1.1.3" + "@radix-ui/react-collection" "1.1.7" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-direction" "1.1.1" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-use-controllable-state" "1.2.2" + "@radix-ui/react-use-layout-effect" "1.1.1" + "@radix-ui/react-use-previous" "1.1.1" + "@radix-ui/react-use-size" "1.1.1" + +"@radix-ui/react-slot@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.2.3.tgz#502d6e354fc847d4169c3bc5f189de777f68cfe1" + integrity sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A== + dependencies: + "@radix-ui/react-compose-refs" "1.1.2" + +"@radix-ui/react-use-callback-ref@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz#62a4dba8b3255fdc5cc7787faeac1c6e4cc58d40" + integrity sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg== + +"@radix-ui/react-use-controllable-state@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz#905793405de57d61a439f4afebbb17d0645f3190" + integrity sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg== + dependencies: + "@radix-ui/react-use-effect-event" "0.0.2" + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-use-effect-event@0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz#090cf30d00a4c7632a15548512e9152217593907" + integrity sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/react-use-escape-keydown@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz#b3fed9bbea366a118f40427ac40500aa1423cc29" + integrity sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g== + dependencies: + "@radix-ui/react-use-callback-ref" "1.1.1" + +"@radix-ui/react-use-layout-effect@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz#0c4230a9eed49d4589c967e2d9c0d9d60a23971e" + integrity sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ== + +"@radix-ui/react-use-previous@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz#1a1ad5568973d24051ed0af687766f6c7cb9b5b5" + integrity sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ== + +"@radix-ui/react-use-rect@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz#01443ca8ed071d33023c1113e5173b5ed8769152" + integrity sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w== + dependencies: + "@radix-ui/rect" "1.1.1" + +"@radix-ui/react-use-size@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz#6de276ffbc389a537ffe4316f5b0f24129405b37" + integrity sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.1" + +"@radix-ui/rect@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.1.1.tgz#78244efe12930c56fd255d7923865857c41ac8cb" + integrity sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw== + "@rolldown/pluginutils@1.0.0-beta.27": version "1.0.0-beta.27" resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz#47d2bf4cef6d470b22f5831b420f8964e0bf755f" @@ -3570,20 +4272,13 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.34.49.tgz#4f1369234f2ecf693866476c3b2e1b54d2a9d68e" integrity sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A== -"@sinonjs/commons@^3.0.0", "@sinonjs/commons@^3.0.1": +"@sinonjs/commons@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - "@sinonjs/fake-timers@^15.0.0": version "15.3.2" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-15.3.2.tgz#afecc36681e26aab9e0fe809fd9ad578096a3058" @@ -3591,6 +4286,13 @@ dependencies: "@sinonjs/commons" "^3.0.1" +"@sinonjs/fake-timers@^15.4.0": + version "15.4.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz#5d40c151a9e66075fe4520bec40bccfe54931962" + integrity sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA== + dependencies: + "@sinonjs/commons" "^3.0.1" + "@smithy/config-resolver@^4.4.17": version "4.4.17" resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.4.17.tgz#5bd7ccf461e126c79072ce84c6b0f3d00b3409bc" @@ -3603,20 +4305,22 @@ "@smithy/util-middleware" "^4.2.14" tslib "^2.6.2" -"@smithy/core@^3.23.17": - version "3.23.17" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.23.17.tgz#23d02277c8d6d30a1605afd756696265e48ed67e" - integrity sha512-x7BlLbUFL8NWCGjMF9C+1N5cVCxcPa7g6Tv9B4A2luWx3be3oU8hQ96wIwxe/s7OhIzvoJH73HAUSg5JXVlEtQ== +"@smithy/core@^3.23.17", "@smithy/core@^3.24.2", "@smithy/core@^3.24.3": + version "3.24.3" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.24.3.tgz#c9689ce6d64b40eee594a259b4504f1a357f6a54" + integrity sha512-Ep/7tPamGY8mgESE3LyLKtxJyy6U52WWAqr/3wial47Sj4u3PiIF73AOGI27UyLy9duTkhZbgzodOfLV4TduZg== dependencies: - "@smithy/protocol-http" "^5.3.14" - "@smithy/types" "^4.14.1" - "@smithy/url-parser" "^4.2.14" - "@smithy/util-base64" "^4.3.2" - "@smithy/util-body-length-browser" "^4.2.2" - "@smithy/util-middleware" "^4.2.14" - "@smithy/util-stream" "^4.5.25" - "@smithy/util-utf8" "^4.2.2" - "@smithy/uuid" "^1.1.2" + "@aws-crypto/crc32" "5.2.0" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + +"@smithy/core@^3.24.4": + version "3.24.4" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.24.4.tgz#aded2ba46962b5cceaaa75f646433ac4813c2e17" + integrity sha512-3UNRKEyQyAgVgM0LGlerCLm+ChZWZ1GPfde+jBEW6bm6bSBGU1p0EbblaUV3unbhwvidjLA5Zs3sOs7mnZwvAw== + dependencies: + "@aws-crypto/crc32" "5.2.0" + "@smithy/types" "^4.14.2" tslib "^2.6.2" "@smithy/credential-provider-imds@^4.2.14": @@ -3630,15 +4334,31 @@ "@smithy/url-parser" "^4.2.14" tslib "^2.6.2" -"@smithy/fetch-http-handler@^5.3.17": - version "5.3.17" - resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.17.tgz#bf13a4b03eb8afe101775fef59a1758f8fb5cd4b" - integrity sha512-bXOvQzaSm6MnmLaWA1elgfQcAtN4UP3vXqV97bHuoOrHQOJiLT3ds6o9eo5bqd0TJfRFpzdGnDQdW3FACiAVdw== +"@smithy/credential-provider-imds@^4.3.2": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.3.3.tgz#bead31aad6bebac48f034016bce77f68f8b2e4ab" + integrity sha512-I2Bti0DKFo2IJyN28ijCsx51BAumEYR4/1yZ1FXyBygy9MqbnMqCev4JPth/MbpRfBSRAX35hITSnAdJRo1u5w== dependencies: - "@smithy/protocol-http" "^5.3.14" - "@smithy/querystring-builder" "^4.2.14" - "@smithy/types" "^4.14.1" - "@smithy/util-base64" "^4.3.2" + "@smithy/core" "^3.24.3" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + +"@smithy/fetch-http-handler@^5.3.17", "@smithy/fetch-http-handler@^5.4.2": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.3.tgz#ad6b505f2b6794c36468e2706ee12c489fa4a4ed" + integrity sha512-F+DRf8IJazRJgYog2A/yJK7eYVc0rqTlRzO+5ZxjJd4WkZoKz0IJRncf7G6t1pdVT3kryJcwuTFhN1c5m6N47A== + dependencies: + "@smithy/core" "^3.24.3" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + +"@smithy/fetch-http-handler@^5.4.3": + version "5.4.4" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.4.4.tgz#df28cfdbdbd192cef9508347b488d8874d0166dd" + integrity sha512-qM7AUKI4G6d7lNgaZD3lA1tWSolh5r6gcixfTZAPstVURfjIbvreVTPz+994M0yC3HbX4YYhDRgr31Xy3XwWOQ== + dependencies: + "@smithy/core" "^3.24.4" + "@smithy/types" "^4.14.2" tslib "^2.6.2" "@smithy/hash-node@^4.2.14": @@ -3666,6 +4386,13 @@ dependencies: tslib "^2.6.2" +"@smithy/is-array-buffer@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz#9a95c2d46b8768946a9eec7f935feaddcffa5e7a" + integrity sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ== + dependencies: + tslib "^2.6.2" + "@smithy/is-array-buffer@^4.2.2": version "4.2.2" resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz#c401ce54b12a16529eb1c938a0b6c2247cb763b8" @@ -3673,6 +4400,15 @@ dependencies: tslib "^2.6.2" +"@smithy/md5-js@2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-2.0.7.tgz#4dea27b20b065857f953c74dbaa050003f48a374" + integrity sha512-2i2BpXF9pI5D1xekqUsgQ/ohv5+H//G9FlawJrkOJskV18PgJ8LiNbLiskMeYt07yAsSTZR7qtlcAaa/GQLWww== + dependencies: + "@smithy/types" "^2.3.1" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.5.0" + "@smithy/middleware-content-length@^4.2.14": version "4.2.14" resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.2.14.tgz#d8b17f94c4d8f9c3b7992f1db84d3299c83efe78" @@ -3740,14 +4476,22 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@smithy/node-http-handler@^4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.6.1.tgz#cb25b9445e46294a6f0dfb1566dbf2a1a19510af" - integrity sha512-iB+orM4x3xrr57X3YaXazfKnntl0LHlZB1kcXSGzMV1Tt0+YwEjGlbjk/44qEGtBzXAz6yFDzkYTKSV6Pj2HUg== +"@smithy/node-http-handler@^4.6.1", "@smithy/node-http-handler@^4.7.2": + version "4.7.3" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.7.3.tgz#ebdfaad62fe4e5bde19824490f9f590d446b746a" + integrity sha512-/jPhevcTFPMVl6KNjbaI47iOg1zxC7IsnX4PQDGVZKMFceOXtB8IEYaB7a9VvkP/3oC60WzTeKocvSI7vLT0vA== dependencies: - "@smithy/protocol-http" "^5.3.14" - "@smithy/querystring-builder" "^4.2.14" - "@smithy/types" "^4.14.1" + "@smithy/core" "^3.24.3" + "@smithy/types" "^4.14.2" + tslib "^2.6.2" + +"@smithy/node-http-handler@^4.7.3": + version "4.7.4" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.7.4.tgz#dfa9634130841cbb0a780c8b4a3ea7ec1c904f0c" + integrity sha512-HIeF+1vrDGzPkkv39Hj2vlHSXHY3p958jd/8ZnePIY6+ZOsQX8coyEUKO5yQu4r0bQIVsbpotVIrXXwyycMStQ== + dependencies: + "@smithy/core" "^3.24.4" + "@smithy/types" "^4.14.2" tslib "^2.6.2" "@smithy/property-provider@^4.2.14": @@ -3766,15 +4510,6 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@smithy/querystring-builder@^4.2.14": - version "4.2.14" - resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.2.14.tgz#102429e0fb004108babf219edfcf6f111e66d782" - integrity sha512-XYA5Z0IqTeF+5XDdh4BBmSA0HvbgVZIyv4cmOoUheDNR57K1HgBp9ukUMx3Cr3XpDHHpLBnexPE3LAtDsZkj2A== - dependencies: - "@smithy/types" "^4.14.1" - "@smithy/util-uri-escape" "^4.2.2" - tslib "^2.6.2" - "@smithy/querystring-parser@^4.2.14": version "4.2.14" resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.2.14.tgz#c479ba1f346656b9f8ce46d9a91c229e4e50420f" @@ -3798,18 +4533,13 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" -"@smithy/signature-v4@^5.3.14": - version "5.3.14" - resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.3.14.tgz#2b28c7d190301a67a520227a2343d1e7bb1c6d22" - integrity sha512-1D9Y/nmlVjCeSivCbhZ7hgEpmHyY1h0GvpSZt3l0xcD9JjmjVC1CHOozS6+Gh+/ldMH8JuJ6cujObQqfayAVFA== +"@smithy/signature-v4@^5.4.2": + version "5.4.3" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.4.3.tgz#d5bea6e6c32fef6bee0afe6819b9c9551b905103" + integrity sha512-53+75QuPl6DL+ct6vVEB51FDO5oulXr20TPV46VvJZg76lIlXNWfxi8j+G2V/t0I2qxCBOa3vX/8bmjrpFVo9g== dependencies: - "@smithy/is-array-buffer" "^4.2.2" - "@smithy/protocol-http" "^5.3.14" - "@smithy/types" "^4.14.1" - "@smithy/util-hex-encoding" "^4.2.2" - "@smithy/util-middleware" "^4.2.14" - "@smithy/util-uri-escape" "^4.2.2" - "@smithy/util-utf8" "^4.2.2" + "@smithy/core" "^3.24.3" + "@smithy/types" "^4.14.2" tslib "^2.6.2" "@smithy/smithy-client@^4.12.13": @@ -3825,10 +4555,24 @@ "@smithy/util-stream" "^4.5.25" tslib "^2.6.2" -"@smithy/types@^4.14.1": - version "4.14.1" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.14.1.tgz#aba92b4cdb406f2a2b062e82f1e3728d809a7c23" - integrity sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg== +"@smithy/types@^2.3.1": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.12.0.tgz#c44845f8ba07e5e8c88eda5aed7e6a0c462da041" + integrity sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw== + dependencies: + tslib "^2.6.2" + +"@smithy/types@^3.3.0": + version "3.7.2" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.7.2.tgz#05cb14840ada6f966de1bf9a9c7dd86027343e10" + integrity sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg== + dependencies: + tslib "^2.6.2" + +"@smithy/types@^4.14.1", "@smithy/types@^4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.14.2.tgz#6034ff1e0e52bfb7d744ac371b651a8bf21f30f1" + integrity sha512-P+otAxbV4CqBybp7EkcJCrig63yE2E7PuNVOmilVMRcx/O+QDzGULTrKsq4DV13gSfak9ObPrWaHl/9bL5YcWw== dependencies: tslib "^2.6.2" @@ -3841,6 +4585,15 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" +"@smithy/util-base64@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-3.0.0.tgz#f7a9a82adf34e27a72d0719395713edf0e493017" + integrity sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ== + dependencies: + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + "@smithy/util-base64@^4.3.2": version "4.3.2" resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.3.2.tgz#be02bcb29a87be744356467ea25ffa413e695cea" @@ -3864,7 +4617,7 @@ dependencies: tslib "^2.6.2" -"@smithy/util-buffer-from@^2.2.0": +"@smithy/util-buffer-from@^2.0.0", "@smithy/util-buffer-from@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b" integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== @@ -3872,6 +4625,14 @@ "@smithy/is-array-buffer" "^2.2.0" tslib "^2.6.2" +"@smithy/util-buffer-from@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz#559fc1c86138a89b2edaefc1e6677780c24594e3" + integrity sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA== + dependencies: + "@smithy/is-array-buffer" "^3.0.0" + tslib "^2.6.2" + "@smithy/util-buffer-from@^4.2.2": version "4.2.2" resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz#2c6b7857757dfd88f6cd2d36016179a40ccc913b" @@ -3919,6 +4680,13 @@ "@smithy/types" "^4.14.1" tslib "^2.6.2" +"@smithy/util-hex-encoding@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz#0aa3515acd2b005c6d55675e377080a7c513b59e" + integrity sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA== + dependencies: + tslib "^2.5.0" + "@smithy/util-hex-encoding@^4.2.2": version "4.2.2" resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz#4abf3335dd1eb884041d8589ca7628d81a6fd1d3" @@ -3957,19 +4725,28 @@ "@smithy/util-utf8" "^4.2.2" tslib "^2.6.2" -"@smithy/util-uri-escape@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz#48e40206e7fe9daefc8d44bb43a1ab17e76abf4a" - integrity sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw== +"@smithy/util-utf8@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.0.0.tgz#b4da87566ea7757435e153799df9da717262ad42" + integrity sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ== dependencies: - tslib "^2.6.2" + "@smithy/util-buffer-from" "^2.0.0" + tslib "^2.5.0" "@smithy/util-utf8@^2.0.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5" integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== dependencies: - "@smithy/util-buffer-from" "^2.2.0" + "@smithy/util-buffer-from" "^2.2.0" + tslib "^2.6.2" + +"@smithy/util-utf8@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-3.0.0.tgz#1a6a823d47cbec1fd6933e5fc87df975286d9d6a" + integrity sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA== + dependencies: + "@smithy/util-buffer-from" "^3.0.0" tslib "^2.6.2" "@smithy/util-utf8@^4.2.2": @@ -4142,11 +4919,6 @@ resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== -"@tootallnate/once@2": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.1.tgz#35adc6222e3662fa2222ce123b961476a746b9ea" - integrity sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ== - "@tsconfig/node10@^1.0.7": version "1.0.12" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.12.tgz#be57ceac1e4692b41be9de6be8c32a106636dba4" @@ -4186,7 +4958,12 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== -"@types/babel__core@^7.1.14", "@types/babel__core@^7.20.5": +"@types/aws-lambda@^8.10.134": + version "8.10.161" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.161.tgz#36d95723ec46d3d555bf0684f83cf4d4369a28ad" + integrity sha512-rUYdp+MQwSFocxIOcSsYSF3YYYC/uUpMbCY/mbO21vGqfrEYvNSoPyKYDj6RhXXpPfS0KstW9RwG3qXh9sL7FQ== + +"@types/babel__core@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== @@ -4212,7 +4989,7 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": +"@types/babel__traverse@*": version "7.28.0" resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== @@ -4326,13 +5103,6 @@ "@types/qs" "*" "@types/serve-static" "^1" -"@types/graceful-fs@^4.1.3": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== - dependencies: - "@types/node" "*" - "@types/http-errors@*": version "2.0.5" resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.5.tgz#5b749ab2b16ba113423feb1a64a95dcd30398472" @@ -4345,7 +5115,7 @@ dependencies: "@types/node" "*" -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1", "@types/istanbul-lib-coverage@^2.0.6": +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.1", "@types/istanbul-lib-coverage@^2.0.6": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== @@ -4357,7 +5127,7 @@ dependencies: "@types/istanbul-lib-coverage" "*" -"@types/istanbul-reports@^3.0.0", "@types/istanbul-reports@^3.0.4": +"@types/istanbul-reports@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== @@ -4414,6 +5184,13 @@ dependencies: undici-types "~5.26.4" +"@types/nodemailer@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-8.0.0.tgz#ea189a9c151c04cc65c8a2a4c668c65d952a24e2" + integrity sha512-fyf8jWULsCo0d0BuoQ75i6IeoHs47qcqxWc7yUdUcV0pOZGjUTTOvwdG1PRXUDqN/8A64yQdQdnA2pZgcdi+cA== + dependencies: + "@types/node" "*" + "@types/parse-json@^4.0.0": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" @@ -4522,11 +5299,21 @@ dependencies: "@types/node" "*" -"@types/stack-utils@^2.0.0", "@types/stack-utils@^2.0.3": +"@types/stack-utils@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== +"@types/tmp@^0.2.3": + version "0.2.6" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.6.tgz#d785ee90c52d7cc020e249c948c36f7b32d1e217" + integrity sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA== + +"@types/uuid@^9.0.0": + version "9.0.8" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" + integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== + "@types/validator@^13.15.3": version "13.15.10" resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.15.10.tgz#742b77ec34d58554b94a76a14cef30d59e3c16b9" @@ -4544,7 +5331,7 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== -"@types/yargs@^17.0.33", "@types/yargs@^17.0.8": +"@types/yargs@^17.0.33": version "17.0.35" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.35.tgz#07013e46aa4d7d7d50a49e15604c1c5340d4eb24" integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg== @@ -4992,6 +5779,14 @@ "@webassemblyjs/ast" "1.14.1" "@xtuc/long" "4.2.2" +"@xstate/react@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@xstate/react/-/react-3.2.2.tgz#ddf0f9d75e2c19375b1e1b7335e72cb99762aed8" + integrity sha512-feghXWLedyq8JeL13yda3XnHPZKwYDN5HPBLykpLeuNpr9178tQd2/3d0NrH6gSd0sG5mLuLeuD+ck830fgzLQ== + dependencies: + use-isomorphic-layout-effect "^1.1.2" + use-sync-external-store "^1.0.0" + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -5029,11 +5824,6 @@ dependencies: argparse "^2.0.1" -abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - accepts@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" @@ -5077,21 +5867,6 @@ address@^1.0.1: resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - ajv-formats@2.1.1, ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -5174,7 +5949,7 @@ ansi-colors@4.1.3, ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.2: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -5188,6 +5963,13 @@ ansi-escapes@^5.0.0: dependencies: type-fest "^1.0.2" +ansi-escapes@^7.0.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.3.0.tgz#5395bb74b2150a4a1d6e3c2565f4aeca78d28627" + integrity sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg== + dependencies: + environment "^1.0.0" + ansi-html-community@^0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" @@ -5215,7 +5997,7 @@ ansi-styles@^5.0.0, ansi-styles@^5.2.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.0.0, ansi-styles@^6.1.0: +ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1, ansi-styles@^6.2.3: version "6.2.3" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== @@ -5225,7 +6007,7 @@ ansis@^4.2.0: resolved "https://registry.yarnpkg.com/ansis/-/ansis-4.2.0.tgz#2e6e61c46b11726ac67f78785385618b9e658780" integrity sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig== -anymatch@^3.0.3, anymatch@^3.1.3, anymatch@~3.1.2: +anymatch@^3.1.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -5265,6 +6047,13 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +aria-hidden@^1.2.4: + version "1.2.6" + resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.6.tgz#73051c9b088114c795b1ea414e9c0fff874ffc1a" + integrity sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA== + dependencies: + tslib "^2.0.0" + aria-query@5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" @@ -5414,17 +6203,12 @@ ast-types-flow@^0.0.8: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - async-function@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== -async@^3.2.0, async@^3.2.6: +async@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== @@ -5457,6 +6241,20 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" +aws-amplify@^6.17.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/aws-amplify/-/aws-amplify-6.17.0.tgz#f37c0ce980c699c210d2c3007782b10a75b814c0" + integrity sha512-608h5BZvhbKGTN3sJwMoL6CJ8GPZWfgElywvuPr07IhxWklR6Y3BPwOgM4XC4F1sIsjxRdwh5BBHaSbn1BDUxQ== + dependencies: + "@aws-amplify/analytics" "7.0.94" + "@aws-amplify/api" "6.3.26" + "@aws-amplify/auth" "6.20.0" + "@aws-amplify/core" "6.16.3" + "@aws-amplify/datastore" "5.1.7" + "@aws-amplify/notifications" "2.0.94" + "@aws-amplify/storage" "6.15.0" + tslib "^2.5.0" + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -5517,17 +6315,17 @@ babel-jest@30.3.0: graceful-fs "^4.2.11" slash "^3.0.0" -babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== +babel-jest@30.4.1: + version "30.4.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-30.4.1.tgz#63cba904438bbe64c4cf0acdea87b0a45cb809fc" + integrity sha512-fATAbM8piYxkiXQp3RBXmZHxZVNJZAVXXfyeyCN2Tida3+qJ8ea9UxhiJ2y4fLO90ZImKt6k9FlcH2+rLkJGhw== dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" + "@jest/transform" "30.4.1" + "@types/babel__core" "^7.20.5" + babel-plugin-istanbul "^7.0.1" + babel-preset-jest "30.4.0" + chalk "^4.1.2" + graceful-fs "^4.2.11" slash "^3.0.0" babel-loader@^9.1.2: @@ -5547,17 +6345,6 @@ babel-plugin-const-enum@^1.0.1: "@babel/plugin-syntax-typescript" "^7.3.3" "@babel/traverse" "^7.16.0" -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - babel-plugin-istanbul@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz#d8b518c8ea199364cf84ccc82de89740236daf92" @@ -5576,15 +6363,12 @@ babel-plugin-jest-hoist@30.3.0: dependencies: "@types/babel__core" "^7.20.5" -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== +babel-plugin-jest-hoist@30.4.0: + version "30.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.4.0.tgz#f7d6a6d8f435808b56b45a81dc4b61a39e36794a" + integrity sha512-9EdtWM/sSfXLOGLwSn+GS6pIXyBnL07/8gyJlwFXjWy4DxMOyItqyUT29d4lQiS380EZwYlX7/At4PgBS+m2aA== dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" + "@types/babel__core" "^7.20.5" babel-plugin-macros@^2.8.0: version "2.8.0" @@ -5643,7 +6427,7 @@ babel-plugin-transform-typescript-metadata@^0.3.1: dependencies: "@babel/helper-plugin-utils" "^7.0.0" -babel-preset-current-node-syntax@^1.0.0, babel-preset-current-node-syntax@^1.2.0: +babel-preset-current-node-syntax@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz#20730d6cdc7dda5d89401cab10ac6a32067acde6" integrity sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg== @@ -5672,13 +6456,13 @@ babel-preset-jest@30.3.0: babel-plugin-jest-hoist "30.3.0" babel-preset-current-node-syntax "^1.2.0" -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== +babel-preset-jest@30.4.0: + version "30.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-30.4.0.tgz#295486c2ec1127b3dc7d0d2adaa72a1dcaaafccd" + integrity sha512-lBY4jxsNmCnSiu7kquw8ZC9F4+XLMOKypT3RnNHPvU2Kpd4W0xaPuLr5ZkRyOsvLYAY4yaW1ZwTW4xB7NIiZzg== dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" + babel-plugin-jest-hoist "30.4.0" + babel-preset-current-node-syntax "^1.2.0" balanced-match@4.0.3: version "4.0.3" @@ -5724,6 +6508,13 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +bidi-js@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bidi-js/-/bidi-js-1.0.3.tgz#6f8bcf3c877c4d9220ddf49b9bb6930c88f877d2" + integrity sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw== + dependencies: + require-from-string "^2.0.2" + big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -5799,6 +6590,11 @@ boolbase@^1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== +bottleneck@^2.19.5: + version "2.19.5" + resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" + integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== + bowser@^2.11.0: version "2.14.1" resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.14.1.tgz#4ea39bf31e305184522d7ad7bfd91389e4f0cb79" @@ -5934,7 +6730,7 @@ cac@^6.7.14: resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== -cachedir@^2.3.0: +cachedir@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== @@ -5970,7 +6766,7 @@ callsites@^3.0.0, callsites@^3.1.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^5.3.1: +camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -6048,11 +6844,6 @@ check-error@^1.0.3: dependencies: get-func-name "^2.0.2" -check-more-types@^2.24.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" - integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== - chokidar@3.6.0, chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" @@ -6085,21 +6876,11 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -ci-info@^4.0.0, ci-info@^4.2.0: +ci-info@^4.1.0, ci-info@^4.2.0: version "4.4.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.4.0.tgz#7d54eff9f54b45b62401c26032696eb59c8bd18c" integrity sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg== -cjs-module-lexer@^1.0.0: - version "1.4.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d" - integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== - cjs-module-lexer@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz#b3ca5101843389259ade7d88c77bd06ce55849ca" @@ -6110,20 +6891,15 @@ class-transformer@^0.5.1: resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.5.1.tgz#24147d5dffd2a6cea930a3250a677addf96ab336" integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw== -class-validator@^0.14.0: - version "0.14.4" - resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.14.4.tgz#d0084ae847a96264ad5158451a4e66c1c544de96" - integrity sha512-AwNusCCam51q703dW82x95tOqQp6oC9HNUl724KxJJOfnKscI8dOloXFgyez7LbTTKWuRBA37FScqVbJEoq8Yw== +class-validator@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.15.1.tgz#002600c101bcebb16e7240870cb50535340c9600" + integrity sha512-LqoS80HBBSCVhz/3KloUly0ovokxpdOLR++Al3J3+dHXWt9sTKlKd4eYtoxhxyUjoe5+UcIM+5k9MIxyBWnRTw== dependencies: "@types/validator" "^13.15.3" libphonenumber-js "^1.11.1" validator "^13.15.22" -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - cli-cursor@3.1.0, cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -6138,6 +6914,13 @@ cli-cursor@^4.0.0: dependencies: restore-cursor "^4.0.0" +cli-cursor@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" + integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== + dependencies: + restore-cursor "^5.0.0" + cli-spinners@2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" @@ -6148,7 +6931,16 @@ cli-spinners@^2.5.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== -cli-table3@0.6.5, cli-table3@~0.6.1: +cli-table3@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.1.tgz#36ce9b7af4847f288d3cdd081fbd09bf7bd237b8" + integrity sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA== + dependencies: + string-width "^4.2.0" + optionalDependencies: + colors "1.4.0" + +cli-table3@0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== @@ -6157,14 +6949,6 @@ cli-table3@0.6.5, cli-table3@~0.6.1: optionalDependencies: "@colors/colors" "1.5.0" -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - cli-truncate@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" @@ -6173,6 +6957,14 @@ cli-truncate@^3.1.0: slice-ansi "^5.0.0" string-width "^5.0.0" +cli-truncate@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-5.2.0.tgz#c8e72aaca8339c773d128c36e0a17c6315b694eb" + integrity sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw== + dependencies: + slice-ansi "^8.0.0" + string-width "^8.2.0" + cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" @@ -6192,6 +6984,15 @@ cliui@8.0.1, cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + clone@1.0.4, clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -6202,7 +7003,7 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== -collect-v8-coverage@^1.0.0, collect-v8-coverage@^1.0.2: +collect-v8-coverage@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz#cc1f01eb8d02298cbc9a437c74c70ab4e5210b80" integrity sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw== @@ -6219,7 +7020,7 @@ color-name@1.1.4, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^2.0.10, colorette@^2.0.16, colorette@^2.0.20: +colorette@^2.0.10, colorette@^2.0.20: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== @@ -6229,6 +7030,11 @@ colorjs.io@^0.5.0: resolved "https://registry.yarnpkg.com/colorjs.io/-/colorjs.io-0.5.2.tgz#63b20139b007591ebc3359932bef84628eb3fcef" integrity sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw== +colors@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + columnify@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" @@ -6490,6 +7296,11 @@ cosmiconfig@^9.0.0: js-yaml "^4.1.0" parse-json "^5.2.0" +crc-32@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -6554,7 +7365,7 @@ css-tree@^2.3.1: mdn-data "2.0.30" source-map-js "^1.0.1" -css-tree@^3.0.1: +css-tree@^3.0.0, css-tree@^3.0.1, css-tree@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-3.2.1.tgz#86cac7011561272b30e6b1e042ba6ce047aa7518" integrity sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA== @@ -6636,53 +7447,42 @@ csso@^5.0.5: dependencies: css-tree "~2.2.0" -cssstyle@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-3.0.0.tgz#17ca9c87d26eac764bb8cfd00583cff21ce0277a" - integrity sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg== - dependencies: - rrweb-cssom "^0.6.0" - -csstype@^3.2.2: +csstype@^3.1.1, csstype@^3.2.2: version "3.2.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== -cypress@^13.0.0: - version "13.17.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.17.0.tgz#34c3d68080c4497eace0f353bd1629587a5f600d" - integrity sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA== +cypress@^15.15.0: + version "15.15.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-15.15.0.tgz#5f9d9e8304636f7add7cb296130c0262960648bc" + integrity sha512-N8qBv3AUYn6xfIG73O5O58kTClUBSZ7a3C08IQFkSGTUdEauJ3BqwTFb/f9KPZgadftoZjllC0XSwD7xNNolbA== dependencies: - "@cypress/request" "^3.0.6" + "@cypress/request" "^4.0.0" "@cypress/xvfb" "^1.2.4" "@types/sinonjs__fake-timers" "8.1.1" "@types/sizzle" "^2.3.2" + "@types/tmp" "^0.2.3" arch "^2.2.0" blob-util "^2.0.2" bluebird "^3.7.2" buffer "^5.7.1" - cachedir "^2.3.0" + cachedir "^2.4.0" chalk "^4.1.0" - check-more-types "^2.24.0" - ci-info "^4.0.0" - cli-cursor "^3.1.0" - cli-table3 "~0.6.1" + ci-info "^4.1.0" + cli-table3 "0.6.1" commander "^6.2.1" common-tags "^1.8.0" dayjs "^1.10.4" debug "^4.3.4" - enquirer "^2.3.6" eventemitter2 "6.4.7" execa "4.1.0" executable "^4.1.1" extract-zip "2.0.1" - figures "^3.2.0" fs-extra "^9.1.0" - getos "^3.2.1" + hasha "5.2.2" is-installed-globally "~0.4.0" - lazy-ass "^1.6.0" - listr2 "^3.8.3" - lodash "^4.17.21" + listr2 "^9.0.5" + lodash "^4.17.23" log-symbols "^4.0.0" minimist "^1.2.8" ospath "^1.2.2" @@ -6690,10 +7490,11 @@ cypress@^13.0.0: process "^0.11.10" proxy-from-env "1.0.0" request-progress "^3.0.0" - semver "^7.5.3" supports-color "^8.1.1" - tmp "~0.2.3" + systeminformation "^5.31.1" + tmp "~0.2.4" tree-kill "1.2.2" + tslib "1.14.1" untildify "^4.0.0" yauzl "^2.10.0" @@ -6709,14 +7510,13 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-urls@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-4.0.0.tgz#333a454eca6f9a5b7b0f1013ff89074c3f522dd4" - integrity sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g== +data-urls@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-7.0.0.tgz#6dce8b63226a1ecfdd907ce18a8ccfb1eee506d3" + integrity sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA== dependencies: - abab "^2.0.6" - whatwg-mimetype "^3.0.0" - whatwg-url "^12.0.0" + whatwg-mimetype "^5.0.0" + whatwg-url "^16.0.0" data-view-buffer@^1.0.2: version "1.0.2" @@ -6778,12 +7578,17 @@ debug@^3.1.0, debug@^3.2.7: dependencies: ms "^2.1.1" -decimal.js@^10.4.3: +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decimal.js@^10.6.0: version "10.6.0" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a" integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== -dedent@^1.0.0, dedent@^1.6.0, dedent@^1.7.2: +dedent@^1.6.0, dedent@^1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.7.2.tgz#34e2264ab538301e27cf7b07bf2369c19baa8dd9" integrity sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA== @@ -6902,11 +7707,16 @@ detect-libc@^2.0.3: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== -detect-newline@^3.0.0, detect-newline@^3.1.0: +detect-newline@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" @@ -6930,6 +7740,11 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.4.tgz#7a6dbfda325f25f07517e9b518f897c08332e07d" integrity sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ== +dijkstrajs@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23" + integrity sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -6982,13 +7797,6 @@ domelementtype@^2.3.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domexception@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" - integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== - dependencies: - webidl-conversions "^7.0.0" - domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" @@ -7037,6 +7845,11 @@ dotenv@16.4.7, dotenv@~16.4.5: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26" integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== +dotenv@17.4.1: + version "17.4.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.4.1.tgz#d8e2179fe287365ef3aecb9459668454168eda88" + integrity sha512-k8DaKGP6r1G30Lx8V4+pCsLzKr8vLmV2paqEj1Y55GdAgJuIqpRp5FfajGF8KtwMxCz9qJc6wUIJnm053d/WCw== + dotenv@^16.4.5, dotenv@^16.6.1: version "16.6.1" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020" @@ -7118,6 +7931,11 @@ emoji-regex@8.0.0, emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^10.3.0: + version "10.6.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.6.0.tgz#bf3d6e8f7f8fd22a65d9703475bc0147357a6b0d" + integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== + emoji-regex@^9.2.2: version "9.2.2" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" @@ -7128,6 +7946,11 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== +encode-utf8@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" + integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== + encodeurl@^2.0.0, encodeurl@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" @@ -7155,29 +7978,26 @@ enquirer@2.3.6, enquirer@~2.3.6: dependencies: ansi-colors "^4.1.1" -enquirer@^2.3.6: - version "2.4.1" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" - integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== - dependencies: - ansi-colors "^4.1.1" - strip-ansi "^6.0.1" - entities@^4.2.0, entities@^4.4.0: version "4.5.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== -entities@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694" - integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== +entities@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-8.0.0.tgz#c1df5fe3602429747fa233d0dd26f142f0ce4743" + integrity sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA== env-paths@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +environment@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== + errno@^0.1.1: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" @@ -7688,11 +8508,6 @@ exit-x@^0.2.2: resolved "https://registry.yarnpkg.com/exit-x/-/exit-x-0.2.2.tgz#1f9052de3b8d99a696b10dad5bced9bdd5c3aa64" integrity sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ== -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - expect@30.3.0, expect@^30.0.0: version "30.3.0" resolved "https://registry.yarnpkg.com/expect/-/expect-30.3.0.tgz#1b82111517d1ab030f3db0cf1b4061c8aa644f61" @@ -7705,16 +8520,17 @@ expect@30.3.0, expect@^30.0.0: jest-mock "30.3.0" jest-util "30.3.0" -expect@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== +expect@30.4.1: + version "30.4.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-30.4.1.tgz#897e0390a0b6c333dbcf3a24dee3ad49553577e0" + integrity sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA== dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" + "@jest/expect-utils" "30.4.1" + "@jest/get-type" "30.1.0" + jest-matcher-utils "30.4.1" + jest-message-util "30.4.1" + jest-mock "30.4.1" + jest-util "30.4.1" express@5.2.1: version "5.2.1" @@ -7874,23 +8690,35 @@ fast-uri@^3.0.1: resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.2.tgz#8af3d4fc9d3e71b11572cc2673b514a7d1a8c8ec" integrity sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ== -fast-xml-builder@^1.1.5: - version "1.1.8" - resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.1.8.tgz#7bbc0c3957587f3c44d13c10fa1fdf8d4bcc328b" - integrity sha512-sDVBc2gg8pSKvcbE8rBmOyjSGQf0AdsbqvHeIOv3D/uYNoV4eCReQXyDF8Pdv8+m1FHazACypSz2hR7O2S1LLw== +fast-xml-builder@^1.1.7, fast-xml-builder@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz#abd2363145a7625d9789ad96da375fabe3cff28c" + integrity sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q== dependencies: - path-expression-matcher "^1.1.3" + path-expression-matcher "^1.5.0" + xml-naming "^0.1.0" -fast-xml-parser@5.7.2: - version "5.7.2" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.7.2.tgz#fecd0b054c6c132fc03dab994a413da781e0eb9f" - integrity sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w== +fast-xml-parser@5.7.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz#309b04b08d835defc62ab657a0bb340c0e0fbe6a" + integrity sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg== dependencies: "@nodable/entities" "^2.1.0" - fast-xml-builder "^1.1.5" + fast-xml-builder "^1.1.7" path-expression-matcher "^1.5.0" strnum "^2.2.3" +fast-xml-parser@^5.7.2: + version "5.8.0" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.8.0.tgz#64d71f0f8d4bf23621dffd762aef7e98c1884fc1" + integrity sha512-6bIM7fsJxeo3uXv7OncQYsBAMPJ7V16Slahl/6M98C/i2q+vB1+4a0MtrvYwDFEUrwDSbAmeLDRXsOBwrL7yAg== + dependencies: + "@nodable/entities" "^2.1.0" + fast-xml-builder "^1.2.0" + path-expression-matcher "^1.5.0" + strnum "^2.3.0" + xml-naming "^0.1.0" + fastq@^1.6.0: version "1.20.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" @@ -7905,7 +8733,7 @@ faye-websocket@^0.11.3: dependencies: websocket-driver ">=0.5.1" -fb-watchman@^2.0.0, fb-watchman@^2.0.2: +fb-watchman@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== @@ -8205,7 +9033,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@^2.3.3, fsevents@~2.3.2: +fsevents@^2.3.3, fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -8242,11 +9070,16 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@2.0.5, get-caller-file@^2.0.5: +get-caller-file@2.0.5, get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.1, get-east-asian-width@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz#216900f91df11a8b2c198c3e1d93d6c035a776b9" + integrity sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA== + get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" @@ -8268,6 +9101,11 @@ get-intrinsic@1.3.0, get-intrinsic@^1.1.3, get-intrinsic@^1.2.2, get-intrinsic@^ hasown "^2.0.2" math-intrinsics "^1.1.0" +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -8302,13 +9140,6 @@ get-symbol-description@^1.1.0: es-errors "^1.3.0" get-intrinsic "^1.2.6" -getos@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" - integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== - dependencies: - async "^3.2.0" - getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -8435,7 +9266,7 @@ gopd@1.2.0, gopd@^1.0.1, gopd@^1.2.0: resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -8445,6 +9276,11 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +graphql@15.8.0: + version "15.8.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" + integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -8508,6 +9344,14 @@ has-tostringtag@1.0.2, has-tostringtag@^1.0.2: dependencies: has-symbols "^1.0.3" +hasha@5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== + dependencies: + is-stream "^2.0.0" + type-fest "^0.8.0" + hasown@2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" @@ -8551,6 +9395,13 @@ html-encoding-sniffer@^3.0.0: dependencies: whatwg-encoding "^2.0.0" +html-encoding-sniffer@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz#f8d9390b3b348b50d4f61c16dd2ef5c05980a882" + integrity sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg== + dependencies: + "@exodus/bytes" "^1.6.0" + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -8588,15 +9439,6 @@ http-parser-js@>=0.5.1: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.10.tgz#b3277bd6d7ed5588e20ea73bf724fcbe44609075" integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA== -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - http-proxy-middleware@^2.0.9: version "2.0.9" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz#e9e63d68afaa4eee3d147f39149ab84c0c2815ef" @@ -8645,14 +9487,6 @@ http-signature@~1.4.0: jsprim "^2.0.2" sshpk "^1.18.0" -https-proxy-agent@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -8704,6 +9538,11 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== +idb@5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/idb/-/idb-5.0.6.tgz#8c94624f5a8a026abe3bef3c7166a5febd1cadc1" + integrity sha512-/PFvOWPzRcEPmlDt5jEvzVZVs0wyd/EvGvkDIcbBpGuMMLQKrTPG0TxvE2UJtgZtCQCmOtM2QD7yQJBVEjKGOw== + identity-obj-proxy@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" @@ -8731,6 +9570,11 @@ image-size@~0.5.0: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== +immer@9.0.6: + version "9.0.6" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.6.tgz#7a96bf2674d06c8143e327cbf73539388ddf1a73" + integrity sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ== + immutable@^5.1.5: version "5.1.5" resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.1.5.tgz#93ee4db5c2a9ab42a4a783069f3c5d8847d40165" @@ -8757,11 +9601,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -8957,7 +9796,14 @@ is-fullwidth-code-point@^4.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== -is-generator-fn@^2.0.0, is-generator-fn@^2.1.0: +is-fullwidth-code-point@^5.0.0, is-fullwidth-code-point@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz#046b2a6d4f6b156b2233d3207d4b5a9783999b98" + integrity sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ== + dependencies: + get-east-asian-width "^1.3.1" + +is-generator-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== @@ -9186,17 +10032,6 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - istanbul-lib-instrument@^6.0.0, istanbul-lib-instrument@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" @@ -9217,15 +10052,6 @@ istanbul-lib-report@^3.0.0: make-dir "^4.0.0" supports-color "^7.1.0" -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - istanbul-lib-source-maps@^5.0.0: version "5.0.6" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz#acaef948df7747c8eb5fbf1265cb980f6353a441" @@ -9313,31 +10139,31 @@ jest-circus@30.3.0: slash "^3.0.0" stack-utils "^2.0.6" -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== +jest-circus@30.4.2: + version "30.4.2" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-30.4.2.tgz#9a5b9b9c57bf51871f112ccf7a673d486c28f8e7" + integrity sha512-rvHH7VlY6LgbJXJTQ87GW62g1FntOtbhh0zT+v04kC+pgL6aBKyYINXxWukCpj3dcIBMw5/XUbtDS9dU9JTXeQ== dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" + "@jest/environment" "30.4.1" + "@jest/expect" "30.4.1" + "@jest/test-result" "30.4.1" + "@jest/types" "30.4.1" "@types/node" "*" - chalk "^4.0.0" + chalk "^4.1.2" co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" + dedent "^1.6.0" + is-generator-fn "^2.1.0" + jest-each "30.4.1" + jest-matcher-utils "30.4.1" + jest-message-util "30.4.1" + jest-runtime "30.4.2" + jest-snapshot "30.4.1" + jest-util "30.4.1" p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" + pretty-format "30.4.1" + pure-rand "^7.0.0" slash "^3.0.0" - stack-utils "^2.0.3" + stack-utils "^2.0.6" jest-cli@30.3.0: version "30.3.0" @@ -9384,31 +10210,32 @@ jest-config@30.3.0: slash "^3.0.0" strip-json-comments "^3.1.1" -jest-config@^29.4.1: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== +jest-config@^30.0.2: + version "30.4.2" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-30.4.2.tgz#78f589b5410d2805518b8bdce517217fb96b5e61" + integrity sha512-rNHAShJQqQwFNoL0hbf3BphSBOWnpOUAKvidLS/AjNVLPfoj5mSf4jQMfW3cYOs6hXeZC7nF7mDHaBnbxELOzg== dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.7.0" - "@jest/types" "^29.6.3" - babel-jest "^29.7.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.7.0" - jest-environment-node "^29.7.0" - jest-get-type "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-runner "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - micromatch "^4.0.4" + "@babel/core" "^7.27.4" + "@jest/get-type" "30.1.0" + "@jest/pattern" "30.4.0" + "@jest/test-sequencer" "30.4.1" + "@jest/types" "30.4.1" + babel-jest "30.4.1" + chalk "^4.1.2" + ci-info "^4.2.0" + deepmerge "^4.3.1" + glob "^10.5.0" + graceful-fs "^4.2.11" + jest-circus "30.4.2" + jest-docblock "30.4.0" + jest-environment-node "30.4.1" + jest-regex-util "30.4.0" + jest-resolve "30.4.1" + jest-runner "30.4.2" + jest-util "30.4.1" + jest-validate "30.4.1" parse-json "^5.2.0" - pretty-format "^29.7.0" + pretty-format "30.4.1" slash "^3.0.0" strip-json-comments "^3.1.1" @@ -9422,7 +10249,17 @@ jest-diff@30.3.0: chalk "^4.1.2" pretty-format "30.3.0" -jest-diff@^29.4.1, jest-diff@^29.7.0: +jest-diff@30.4.1: + version "30.4.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-30.4.1.tgz#26691c73975768409af4a66b2754cea3182aa2dc" + integrity sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA== + dependencies: + "@jest/diff-sequences" "30.4.0" + "@jest/get-type" "30.1.0" + chalk "^4.1.2" + pretty-format "30.4.1" + +jest-diff@^29.4.1: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== @@ -9439,12 +10276,12 @@ jest-docblock@30.2.0: dependencies: detect-newline "^3.1.0" -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== +jest-docblock@30.4.0: + version "30.4.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-30.4.0.tgz#3ab779a027d1495ae21550accd4266bbe99af7a3" + integrity sha512-ZPMabUZCx5MpbZ2eBYSvZ0J8fvo3dR9oM+eeUpb3aKNQFuS2tu3Duw1TNlMoP8k3WQgKGJuhcMFvwcVuq6T7oA== dependencies: - detect-newline "^3.0.0" + detect-newline "^3.1.0" jest-each@30.3.0: version "30.3.0" @@ -9457,16 +10294,16 @@ jest-each@30.3.0: jest-util "30.3.0" pretty-format "30.3.0" -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== +jest-each@30.4.1: + version "30.4.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-30.4.1.tgz#b69e66da8e2b578c6140d357f6574044c2a40537" + integrity sha512-/8MJbH6fuj48TstjrMf+u/pd06Qezz5xOXvZA6442heNOWr8bdeoGZX2d9fCn028CoMgYmroH9//zky5GfyYmA== dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" + "@jest/get-type" "30.1.0" + "@jest/types" "30.4.1" + chalk "^4.1.2" + jest-util "30.4.1" + pretty-format "30.4.1" jest-environment-node@30.3.0: version "30.3.0" @@ -9481,17 +10318,18 @@ jest-environment-node@30.3.0: jest-util "30.3.0" jest-validate "30.3.0" -jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== +jest-environment-node@30.4.1: + version "30.4.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-30.4.1.tgz#43bbbee903e17d874eb1817195c50ff8b90e2fe0" + integrity sha512-4FZYVOk85hz2AyT6BbarKy9u37g6DbrDyCdFhsnDdXqyrueYQvB+0zO4f/kqLCRD0BsPRXPMNJeQwihKZV8naw== dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" + "@jest/environment" "30.4.1" + "@jest/fake-timers" "30.4.1" + "@jest/types" "30.4.1" "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" + jest-mock "30.4.1" + jest-util "30.4.1" + jest-validate "30.4.1" jest-get-type@^29.6.3: version "29.6.3" @@ -9516,24 +10354,23 @@ jest-haste-map@30.3.0: optionalDependencies: fsevents "^2.3.3" -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== +jest-haste-map@30.4.1: + version "30.4.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-30.4.1.tgz#6d80d09d668c20bf3944977e50acac94fcd672fe" + integrity sha512-rFrcONd8jeFsyw+Z9CrScJgglRf2+NFmNam8dKu7n+SoHqNYT47mn0DdEcVUZJpvh7Iz6/si7f7yUH7GJHVgnw== dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" + "@jest/types" "30.4.1" "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" + anymatch "^3.1.3" + fb-watchman "^2.0.2" + graceful-fs "^4.2.11" + jest-regex-util "30.4.0" + jest-util "30.4.1" + jest-worker "30.4.1" + picomatch "^4.0.3" walker "^1.0.8" optionalDependencies: - fsevents "^2.3.2" + fsevents "^2.3.3" jest-leak-detector@30.3.0: version "30.3.0" @@ -9543,13 +10380,13 @@ jest-leak-detector@30.3.0: "@jest/get-type" "30.1.0" pretty-format "30.3.0" -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== +jest-leak-detector@30.4.1: + version "30.4.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-30.4.1.tgz#96077059a68e5871fc8f53aa90647a6a33f916cd" + integrity sha512-IpmyiioeHxiWDhesHnUFmOxcTzwCwKpgACgWajtAP+nYQXiY7DakTxB6Bx9JFiRMljr0AX1PvnQdaU1KFoz6NQ== dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" + "@jest/get-type" "30.1.0" + pretty-format "30.4.1" jest-matcher-utils@30.3.0: version "30.3.0" @@ -9561,15 +10398,15 @@ jest-matcher-utils@30.3.0: jest-diff "30.3.0" pretty-format "30.3.0" -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== +jest-matcher-utils@30.4.1: + version "30.4.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-30.4.1.tgz#3fee8c89dbd8fc6e60eb590def9897e18f110ec4" + integrity sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A== dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" + "@jest/get-type" "30.1.0" + chalk "^4.1.2" + jest-diff "30.4.1" + pretty-format "30.4.1" jest-message-util@30.3.0: version "30.3.0" @@ -9586,20 +10423,21 @@ jest-message-util@30.3.0: slash "^3.0.0" stack-utils "^2.0.6" -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== +jest-message-util@30.4.1: + version "30.4.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-30.4.1.tgz#40f6bfa5f564363edcba7ce0ca64277fd2ad6af7" + integrity sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ== dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" + "@babel/code-frame" "^7.27.1" + "@jest/types" "30.4.1" + "@types/stack-utils" "^2.0.3" + chalk "^4.1.2" + graceful-fs "^4.2.11" + jest-util "30.4.1" + picomatch "^4.0.3" + pretty-format "30.4.1" slash "^3.0.0" - stack-utils "^2.0.3" + stack-utils "^2.0.6" jest-mock@30.3.0: version "30.3.0" @@ -9610,16 +10448,16 @@ jest-mock@30.3.0: "@types/node" "*" jest-util "30.3.0" -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== +jest-mock@30.4.1: + version "30.4.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-30.4.1.tgz#5e11a05d7719a1e3c7bba6348b70ff4e1bc5ea68" + integrity sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw== dependencies: - "@jest/types" "^29.6.3" + "@jest/types" "30.4.1" "@types/node" "*" - jest-util "^29.7.0" + jest-util "30.4.1" -jest-pnp-resolver@^1.2.2, jest-pnp-resolver@^1.2.3: +jest-pnp-resolver@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== @@ -9629,10 +10467,10 @@ jest-regex-util@30.0.1: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-30.0.1.tgz#f17c1de3958b67dfe485354f5a10093298f2a49b" integrity sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA== -jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== +jest-regex-util@30.4.0: + version "30.4.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-30.4.0.tgz#f75ccc43857633df2563a03588b5cb45c7c2941b" + integrity sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg== jest-resolve-dependencies@30.3.0: version "30.3.0" @@ -9656,20 +10494,19 @@ jest-resolve@30.3.0: slash "^3.0.0" unrs-resolver "^1.7.11" -jest-resolve@^29.4.1, jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== +jest-resolve@30.4.1, jest-resolve@^30.0.2: + version "30.4.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-30.4.1.tgz#b9e432892dc0e2a470eb4826ef5f120a50b3205e" + integrity sha512-Zry8Yq/yJcNAZ7dJ5F2heic8AheXvbFZ7XI5V+h28nrYZ7Qoyy4dItq8OodjnYD270mvX+ZudmrNV9cysqhW5Q== dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" + chalk "^4.1.2" + graceful-fs "^4.2.11" + jest-haste-map "30.4.1" + jest-pnp-resolver "^1.2.3" + jest-util "30.4.1" + jest-validate "30.4.1" slash "^3.0.0" + unrs-resolver "^1.7.11" jest-runner@30.3.0: version "30.3.0" @@ -9699,30 +10536,31 @@ jest-runner@30.3.0: p-limit "^3.1.0" source-map-support "0.5.13" -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" +jest-runner@30.4.2: + version "30.4.2" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-30.4.2.tgz#15debf3cb6d817538aa97427d5a79277cdff65fe" + integrity sha512-2dw0PslVYXxffXGpLo+Ejad+KcI1Qkjn7f4X4619gf21oCUmL+SPfjqIa/losUem3yEOvfNZe/F1HWUcNpODcg== + dependencies: + "@jest/console" "30.4.1" + "@jest/environment" "30.4.1" + "@jest/test-result" "30.4.1" + "@jest/transform" "30.4.1" + "@jest/types" "30.4.1" "@types/node" "*" - chalk "^4.0.0" + chalk "^4.1.2" emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" + exit-x "^0.2.2" + graceful-fs "^4.2.11" + jest-docblock "30.4.0" + jest-environment-node "30.4.1" + jest-haste-map "30.4.1" + jest-leak-detector "30.4.1" + jest-message-util "30.4.1" + jest-resolve "30.4.1" + jest-runtime "30.4.2" + jest-util "30.4.1" + jest-watcher "30.4.1" + jest-worker "30.4.1" p-limit "^3.1.0" source-map-support "0.5.13" @@ -9754,31 +10592,31 @@ jest-runtime@30.3.0: slash "^3.0.0" strip-bom "^4.0.0" -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" +jest-runtime@30.4.2: + version "30.4.2" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-30.4.2.tgz#03b5955003440975b12e76518ec85d091c25b84a" + integrity sha512-3/5e8iPz2k/VLqlr8DgTftYyLUv8Su3FkCAO2/Od81UsUTpSxOrS6O5x5KkoQwyUjmpYyDJKeyAvg2T2nvpNkQ== + dependencies: + "@jest/environment" "30.4.1" + "@jest/fake-timers" "30.4.1" + "@jest/globals" "30.4.1" + "@jest/source-map" "30.0.1" + "@jest/test-result" "30.4.1" + "@jest/transform" "30.4.1" + "@jest/types" "30.4.1" "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" + chalk "^4.1.2" + cjs-module-lexer "^2.1.0" + collect-v8-coverage "^1.0.2" + glob "^10.5.0" + graceful-fs "^4.2.11" + jest-haste-map "30.4.1" + jest-message-util "30.4.1" + jest-mock "30.4.1" + jest-regex-util "30.4.0" + jest-resolve "30.4.1" + jest-snapshot "30.4.1" + jest-util "30.4.1" slash "^3.0.0" strip-bom "^4.0.0" @@ -9809,31 +10647,32 @@ jest-snapshot@30.3.0: semver "^7.7.2" synckit "^0.11.8" -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" +jest-snapshot@30.4.1: + version "30.4.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-30.4.1.tgz#0380cbbaa9d53d32cf7e61af98459ac10a339842" + integrity sha512-tEOkkfOMppUyeiHwjZswOQ3lcnoTnws/q5FnGIaeIh/jmoU0ZlgMYRR8sTlTj+nNGCoJ0RDq6SfxGxCsyMTPmw== + dependencies: + "@babel/core" "^7.27.4" + "@babel/generator" "^7.27.5" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/plugin-syntax-typescript" "^7.27.1" + "@babel/types" "^7.27.3" + "@jest/expect-utils" "30.4.1" + "@jest/get-type" "30.1.0" + "@jest/snapshot-utils" "30.4.1" + "@jest/transform" "30.4.1" + "@jest/types" "30.4.1" + babel-preset-current-node-syntax "^1.2.0" + chalk "^4.1.2" + expect "30.4.1" + graceful-fs "^4.2.11" + jest-diff "30.4.1" + jest-matcher-utils "30.4.1" + jest-message-util "30.4.1" + jest-util "30.4.1" + pretty-format "30.4.1" + semver "^7.7.2" + synckit "^0.11.8" jest-util@30.3.0: version "30.3.0" @@ -9847,17 +10686,17 @@ jest-util@30.3.0: graceful-fs "^4.2.11" picomatch "^4.0.3" -jest-util@^29.4.1, jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== +jest-util@30.4.1, jest-util@^30.0.2: + version "30.4.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-30.4.1.tgz#979c9d014fdd12bb95d3dcde0192e1a9e0bc93d6" + integrity sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw== dependencies: - "@jest/types" "^29.6.3" + "@jest/types" "30.4.1" "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" + chalk "^4.1.2" + ci-info "^4.2.0" + graceful-fs "^4.2.11" + picomatch "^4.0.3" jest-validate@30.3.0: version "30.3.0" @@ -9871,17 +10710,17 @@ jest-validate@30.3.0: leven "^3.1.0" pretty-format "30.3.0" -jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== +jest-validate@30.4.1: + version "30.4.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-30.4.1.tgz#dcc4784547bf644dca0226d3266fb1bde392c5a4" + integrity sha512-PDWi4SOwLnwqNDfHZjOcsEFyZ4fc/2W2gVL3DEoyqnB6jCQMLRtfBong8s6omIw3lI0HWOus12xfnFmQtjW3fw== dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" + "@jest/get-type" "30.1.0" + "@jest/types" "30.4.1" + camelcase "^6.3.0" + chalk "^4.1.2" leven "^3.1.0" - pretty-format "^29.7.0" + pretty-format "30.4.1" jest-watcher@30.3.0: version "30.3.0" @@ -9897,19 +10736,19 @@ jest-watcher@30.3.0: jest-util "30.3.0" string-length "^4.0.2" -jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== +jest-watcher@30.4.1: + version "30.4.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-30.4.1.tgz#d2a78fd27553db9206947eeda6068d76bacfd276" + integrity sha512-/l9UonmvCwjHH7d2h3iAwIloLc1H0S8mJZ/LNK3i86hqwPAz8otUJjP9MfYtz9Tt77Su5FD2xGjZn8d31IZHlw== dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" + "@jest/test-result" "30.4.1" + "@jest/types" "30.4.1" "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" + ansi-escapes "^4.3.2" + chalk "^4.1.2" emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" + jest-util "30.4.1" + string-length "^4.0.2" jest-worker@30.3.0, jest-worker@^30.0.5: version "30.3.0" @@ -9922,22 +10761,23 @@ jest-worker@30.3.0, jest-worker@^30.0.5: merge-stream "^2.0.0" supports-color "^8.1.1" -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== +jest-worker@30.4.1: + version "30.4.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-30.4.1.tgz#ac010eb6c512425748a39e2d6bf05b2c4866ca4f" + integrity sha512-SHynN/q/QD++iNyvMdy+WMmbCGk8jIsNcRxycXbWubSOhvo6T+j2afcfUSl+3hYsiBebOTo0cT7c2H7CXugu1g== dependencies: "@types/node" "*" + "@ungap/structured-clone" "^1.3.0" + jest-util "30.4.1" merge-stream "^2.0.0" - supports-color "^8.0.0" + supports-color "^8.1.1" -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: "@types/node" "*" - jest-util "^29.7.0" merge-stream "^2.0.0" supports-color "^8.0.0" @@ -9966,6 +10806,11 @@ js-cookie@^2.2.1: resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== +js-cookie@^3.0.5: + version "3.0.7" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.7.tgz#0a53abfc459c8e89c85d7a38eb6cb68714965b8c" + integrity sha512-z/wZZgDrkNV1eA0ULjM/F9/50Ya8fbzgKneSpoPsXSGd0KnpdtHfOZWK+GcwLk+EZbS4F9RBhU+K2RgzuDaItw== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -9998,34 +10843,32 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jsdom@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-22.1.0.tgz#0fca6d1a37fbeb7f4aac93d1090d782c56b611c8" - integrity sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw== - dependencies: - abab "^2.0.6" - cssstyle "^3.0.0" - data-urls "^4.0.0" - decimal.js "^10.4.3" - domexception "^4.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.1" +jsdom@^29.1.1: + version "29.1.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-29.1.1.tgz#5b9704906f3cd510c34aa941ae2f8f7f8179df01" + integrity sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q== + dependencies: + "@asamuzakjp/css-color" "^5.1.11" + "@asamuzakjp/dom-selector" "^7.1.1" + "@bramus/specificity" "^2.4.2" + "@csstools/css-syntax-patches-for-csstree" "^1.1.3" + "@exodus/bytes" "^1.15.0" + css-tree "^3.2.1" + data-urls "^7.0.0" + decimal.js "^10.6.0" + html-encoding-sniffer "^6.0.0" is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.4" - parse5 "^7.1.2" - rrweb-cssom "^0.6.0" + lru-cache "^11.3.5" + parse5 "^8.0.1" saxes "^6.0.0" symbol-tree "^3.2.4" - tough-cookie "^4.1.2" - w3c-xmlserializer "^4.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^12.0.1" - ws "^8.13.0" - xml-name-validator "^4.0.0" + tough-cookie "^6.0.1" + undici "^7.25.0" + w3c-xmlserializer "^5.0.0" + webidl-conversions "^8.0.1" + whatwg-mimetype "^5.0.0" + whatwg-url "^16.0.1" + xml-name-validator "^5.0.0" jsesc@^3.0.2, jsesc@~3.1.0: version "3.1.0" @@ -10204,11 +11047,6 @@ launch-editor@^2.6.1: picocolors "^1.1.1" shell-quote "^1.8.3" -lazy-ass@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" - integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== - less-loader@^12.2.0: version "12.3.2" resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-12.3.2.tgz#88dac1736b4f2e3f76db9b1617c1398ae91cd4bb" @@ -10314,19 +11152,17 @@ listr2@6.6.1: rfdc "^1.3.0" wrap-ansi "^8.1.0" -listr2@^3.8.3: - version "3.14.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" - integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== +listr2@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-9.0.5.tgz#92df7c4416a6da630eb9ef46da469b70de97b316" + integrity sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g== dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.16" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.5.1" - through "^2.3.8" - wrap-ansi "^7.0.0" + cli-truncate "^5.0.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^6.1.0" + rfdc "^1.4.1" + wrap-ansi "^9.0.0" loader-runner@^4.2.0, loader-runner@^4.3.1: version "4.3.2" @@ -10433,7 +11269,7 @@ lodash@4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -lodash@^4.17.21: +lodash@4.18.1, lodash@^4.17.21, lodash@^4.17.23, lodash@^4.18.1: version "4.18.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== @@ -10446,16 +11282,6 @@ log-symbols@4.1.0, log-symbols@^4.0.0, log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - log-update@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/log-update/-/log-update-5.0.1.tgz#9e928bf70cb183c1f0c9e91d9e6b7115d597ce09" @@ -10467,6 +11293,17 @@ log-update@^5.0.1: strip-ansi "^7.0.1" wrap-ansi "^8.0.1" +log-update@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" + integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== + dependencies: + ansi-escapes "^7.0.0" + cli-cursor "^5.0.0" + slice-ansi "^7.1.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -10500,6 +11337,11 @@ lru-cache@^10.0.1, lru-cache@^10.2.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== +lru-cache@^11.3.5: + version "11.4.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.4.0.tgz#87a577bfa71f7c94dfd71692874b859d1ca41a28" + integrity sha512-W+R+kFL4HgVxONq2bhXPi3bGpzGe/yEhVOp233qw9wCRtgncJ15P3bC+e4zZMu4Cq7d+WAJjXGW0uUkifhcatA== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -10705,6 +11547,11 @@ mimic-fn@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== + min-document@^2.19.0: version "2.19.2" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.2.tgz#f95db44639eaae3ac8ea85ae6809ae85ff7e3b81" @@ -10964,6 +11811,11 @@ node-releases@^2.0.36: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.38.tgz#791569b9e4424a044e12c3abfad418ed83ce9947" integrity sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw== +nodemailer@^8.0.7: + version "8.0.7" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-8.0.7.tgz#538729a79444e538331bca8a6fc3e5c034eaebc6" + integrity sha512-pkjE4mkBzQjdJT4/UmlKl3pX0rC9fZmjh7c6C9o7lv66Ac6w9WCnzPzhbPNxwZAzlF4mdq4CSWB5+FbK6FWCow== + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -11000,11 +11852,6 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -nwsapi@^2.2.4: - version "2.2.23" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.23.tgz#59712c3a88e6de2bb0b6ccc1070397267019cf6c" - integrity sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ== - nx-cloud@16.5.2, nx-cloud@^16.4.0: version "16.5.2" resolved "https://registry.yarnpkg.com/nx-cloud/-/nx-cloud-16.5.2.tgz#edb7bfc65d0e0cae52947607aa0b44ea163bd4f3" @@ -11364,6 +12211,13 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" +onetime@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" + integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== + dependencies: + mimic-function "^5.0.0" + open@8.4.2, open@^8.4.0, open@~8.4.0: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" @@ -11490,13 +12344,6 @@ p-locate@^6.0.0: dependencies: p-limit "^4.0.0" -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - p-retry@^6.2.0: version "6.2.1" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-6.2.1.tgz#81828f8dc61c6ef5a800585491572cc9892703af" @@ -11543,12 +12390,12 @@ parse5@4.0.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== -parse5@^7.1.2: - version "7.3.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" - integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== +parse5@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-8.0.1.tgz#f43bcd2cd683efe084075333e9ce0da7d06da31e" + integrity sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw== dependencies: - entities "^6.0.0" + entities "^8.0.0" parseurl@^1.3.3, parseurl@~1.3.3: version "1.3.3" @@ -11587,7 +12434,7 @@ path-exists@^5.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== -path-expression-matcher@^1.1.3, path-expression-matcher@^1.5.0: +path-expression-matcher@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz#3b98545dc88ffebb593e2d8458d0929da9275f4a" integrity sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ== @@ -11741,7 +12588,7 @@ picomatch@4.0.4, picomatch@^4.0.3, picomatch@^4.0.4: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== @@ -11761,7 +12608,7 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pirates@^4.0.4, pirates@^4.0.7: +pirates@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== @@ -11806,6 +12653,11 @@ pluralize@8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +pngjs@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" + integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== + portfinder@^1.0.28: version "1.0.38" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.38.tgz#e4fb3a2d888b20d2977da050e48ab5e1f57a185e" @@ -12134,6 +12986,16 @@ pretty-format@30.3.0, pretty-format@^30.0.0: ansi-styles "^5.2.0" react-is "^18.3.1" +pretty-format@30.4.1: + version "30.4.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-30.4.1.tgz#0911652e92e1e91f475e3e6a16e628e50649ea69" + integrity sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw== + dependencies: + "@jest/schemas" "30.4.1" + ansi-styles "^5.2.0" + react-is-18 "npm:react-is@^18.3.1" + react-is-19 "npm:react-is@^19.2.5" + pretty-format@^27.0.2: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" @@ -12204,13 +13066,6 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== -psl@^1.1.33: - version "1.15.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" - integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== - dependencies: - punycode "^2.3.1" - pump@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.4.tgz#1f313430527fa8b905622ebd22fe1444e757ab3c" @@ -12219,16 +13074,11 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0, punycode@^2.3.1: +punycode@^2.1.0, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -pure-rand@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" - integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== - pure-rand@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-7.0.1.tgz#6f53a5a9e3e4a47445822af96821ca509ed37566" @@ -12246,6 +13096,16 @@ pvutils@^1.1.3, pvutils@^1.1.5: resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.5.tgz#84b0dea4a5d670249aa9800511804ee0b7c2809c" integrity sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA== +qrcode@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.0.tgz#95abb8a91fdafd86f8190f2836abbfc500c72d1b" + integrity sha512-9MgRpgVc+/+47dFvQeD6U2s0Z92EsKzcHogtum4QB+UNd025WOJSHvn/hjk9xmzj7Stj95CyUAs31mrjxliEsQ== + dependencies: + dijkstrajs "^1.0.1" + encode-utf8 "^1.0.3" + pngjs "^5.0.0" + yargs "^15.3.1" + qs@^6.14.0, qs@^6.14.1, qs@^6.4.0, qs@~6.15.1: version "6.15.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.1.tgz#bdb55aed06bfac257a90c44a446a73fba5575c8f" @@ -12260,11 +13120,6 @@ qs@~6.14.0, qs@~6.14.1: dependencies: side-channel "^1.1.0" -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -12303,6 +13158,21 @@ react-dom@^18.2.0: loose-envify "^1.1.0" scheduler "^0.23.2" +react-hook-form@7.53.2: + version "7.53.2" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.53.2.tgz#6fa37ae27330af81089baadd7f322cc987b8e2ac" + integrity sha512-YVel6fW5sOeedd1524pltpHX+jgU2u3DSDtXEaBORNdqiNrsX/nUI/iGXONegttg0mJVnfrIkiV0cmTU6Oo2xw== + +"react-is-18@npm:react-is@^18.3.1", react-is@^18.0.0, react-is@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + +"react-is-19@npm:react-is@^19.2.5": + version "19.2.6" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.2.6.tgz#aeee6159b159eb7f520d672cffcc69e7052d288f" + integrity sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw== + react-is@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -12313,16 +13183,30 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-is@^18.0.0, react-is@^18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - react-refresh@^0.17.0: version "0.17.0" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.17.0.tgz#b7e579c3657f23d04eccbe4ad2e58a8ed51e7e53" integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== +react-remove-scroll-bar@^2.3.7: + version "2.3.8" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz#99c20f908ee467b385b68a3469b4a3e750012223" + integrity sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q== + dependencies: + react-style-singleton "^2.2.2" + tslib "^2.0.0" + +react-remove-scroll@^2.6.3: + version "2.7.2" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz#6442da56791117661978ae99cd29be9026fecca0" + integrity sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q== + dependencies: + react-remove-scroll-bar "^2.3.7" + react-style-singleton "^2.2.3" + tslib "^2.1.0" + use-callback-ref "^1.3.3" + use-sidecar "^1.1.3" + react-router-dom@^7.15.0: version "7.15.0" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.15.0.tgz#a4b95c4402d896c2ad437014aff9076b94673063" @@ -12338,6 +13222,14 @@ react-router@7.15.0: cookie "^1.0.1" set-cookie-parser "^2.6.0" +react-style-singleton@^2.2.2, react-style-singleton@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.3.tgz#4265608be69a4d70cfe3047f2c6c88b2c3ace388" + integrity sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ== + dependencies: + get-nonce "^1.0.0" + tslib "^2.0.0" + react@^18.2.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" @@ -12475,6 +13367,11 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -12497,17 +13394,12 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve.exports@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== - -resolve.exports@2.0.3, resolve.exports@^2.0.0: +resolve.exports@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== -resolve@^1.1.7, resolve@^1.12.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.11: +resolve@^1.1.7, resolve@^1.12.0, resolve@^1.19.0, resolve@^1.22.11: version "1.22.12" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.12.tgz#f5b2a680897c69c238a13cd16b15671f8b73549f" integrity sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA== @@ -12545,6 +13437,14 @@ restore-cursor@^4.0.0: onetime "^5.1.0" signal-exit "^3.0.2" +restore-cursor@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" + integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== + dependencies: + onetime "^7.0.0" + signal-exit "^4.1.0" + retry@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" @@ -12555,7 +13455,7 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== -rfdc@^1.3.0: +rfdc@^1.3.0, rfdc@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== @@ -12585,11 +13485,6 @@ router@^2.2.0: parseurl "^1.3.3" path-to-regexp "^8.0.0" -rrweb-cssom@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" - integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== - run-applescript@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911" @@ -12619,7 +13514,7 @@ rxjs@7.8.1: dependencies: tslib "^2.1.0" -rxjs@^7.4.0, rxjs@^7.5.1, rxjs@^7.5.5, rxjs@^7.8.0, rxjs@^7.8.1: +rxjs@^7.4.0, rxjs@^7.5.5, rxjs@^7.8.0, rxjs@^7.8.1: version "7.8.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== @@ -12893,7 +13788,7 @@ semver@^5.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.3.0, semver@^6.3.1: +semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== @@ -12972,6 +13867,11 @@ serve-static@~1.16.2: parseurl "~1.3.3" send "~0.19.1" +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + set-cookie-parser@^2.6.0: version "2.7.2" resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz#ccd08673a9ae5d2e44ea2a2de25089e67c7edf68" @@ -13089,7 +13989,7 @@ signal-exit@3.0.7, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1: +signal-exit@^4.0.1, signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== @@ -13108,24 +14008,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - slice-ansi@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" @@ -13134,6 +14016,22 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" +slice-ansi@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.2.tgz#adf7be70aa6d72162d907cd0e6d5c11f507b5403" + integrity sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + +slice-ansi@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-8.0.0.tgz#22d0b66d18bc5c57f488bfcf36cbde3bef731537" + integrity sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg== + dependencies: + ansi-styles "^6.2.3" + is-fullwidth-code-point "^5.1.0" + smol-toml@1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/smol-toml/-/smol-toml-1.6.1.tgz#4fceb5f7c4b86c2544024ef686e12ff0983465be" @@ -13261,7 +14159,7 @@ sshpk@^1.18.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -stack-utils@^2.0.3, stack-utils@^2.0.6: +stack-utils@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== @@ -13306,7 +14204,7 @@ string-argv@0.3.2: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -string-length@^4.0.1, string-length@^4.0.2: +string-length@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== @@ -13314,16 +14212,7 @@ string-length@^4.0.1, string-length@^4.0.2: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@4.2.3, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@4.2.3, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -13341,6 +14230,23 @@ string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string-width@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + +string-width@^8.2.0: + version "8.2.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-8.2.1.tgz#165089cfa527cc88fbc23dd73313f5e334af1ea1" + integrity sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA== + dependencies: + get-east-asian-width "^1.5.0" + strip-ansi "^7.1.2" + string.prototype.includes@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz#eceef21283640761a81dbe16d6c7171a4edf7d92" @@ -13423,21 +14329,14 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: +strip-ansi@^7.0.1, strip-ansi@^7.1.0, strip-ansi@^7.1.2: version "7.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz#d22a269522836a627af8d04b5c3fd2c7fa3e32e3" integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== @@ -13481,6 +14380,11 @@ strnum@^2.2.3: resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.2.3.tgz#0119fce02749a11bb126a4d686ac5dbdf6e57586" integrity sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg== +strnum@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.3.0.tgz#81bfbfef53db8c3217ea62a98c026886ec4a2761" + integrity sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q== + strong-log-transformer@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" @@ -13594,6 +14498,11 @@ synckit@^0.11.8: dependencies: "@pkgr/core" "^0.2.9" +systeminformation@^5.31.1: + version "5.31.6" + resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.31.6.tgz#2da4979a7262974fd068a3a306ded30aed6127c0" + integrity sha512-Uv2b2uGGM6ns+26czgW2cYRabYdnswM0ddSOOlryHOaelzsmDSet1iM/NT7VOYxW8x/BW+HkY+b1Ve2pLTSGSA== + tapable@^2.1.1, tapable@^2.2.1, tapable@^2.3.0, tapable@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.3.tgz#5da7c9992c46038221267985ab28421a8879f160" @@ -13666,7 +14575,7 @@ throttleit@^1.0.0: resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== -through@^2.3.4, through@^2.3.6, through@^2.3.8: +through@^2.3.4, through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -13704,6 +14613,11 @@ tldts-core@^6.1.86: resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.86.tgz#a93e6ed9d505cb54c542ce43feb14c73913265d8" integrity sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA== +tldts-core@^7.0.30: + version "7.0.30" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.0.30.tgz#c495dba27778f2220bea94f3f6399005c7aca61c" + integrity sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q== + tldts@^6.1.32: version "6.1.86" resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.86.tgz#087e0555b31b9725ee48ca7e77edc56115cd82f7" @@ -13711,6 +14625,13 @@ tldts@^6.1.32: dependencies: tldts-core "^6.1.86" +tldts@^7.0.5: + version "7.0.30" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.0.30.tgz#497cea8d610953222f9dcb3ceb07c7207efcd816" + integrity sha512-ELrFxuqsDdHUwoh0XxDbxuLD3Wnz49Z57IFvTtvWy1hJdcMZjXLIuonjilCiWHlT2GbE4Wlv1wKVTzDFnXH1aw== + dependencies: + tldts-core "^7.0.30" + tmp@0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.4.tgz#c6db987a2ccc97f812f17137b36af2b6521b0d13" @@ -13723,7 +14644,7 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@~0.2.1, tmp@~0.2.3: +tmp@~0.2.1, tmp@~0.2.4: version "0.2.5" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== @@ -13768,16 +14689,6 @@ totalist@^3.0.0: resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== -tough-cookie@^4.1.2: - version "4.1.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" - integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - tough-cookie@^5.0.0: version "5.1.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.1.2.tgz#66d774b4a1d9e12dc75089725af3ac75ec31bed7" @@ -13785,12 +14696,19 @@ tough-cookie@^5.0.0: dependencies: tldts "^6.1.32" -tr46@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" - integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== +tough-cookie@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-6.0.1.tgz#a495f833836609ed983c19bc65639cfbceb54c76" + integrity sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw== dependencies: - punycode "^2.3.0" + tldts "^7.0.5" + +tr46@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-6.0.0.tgz#f5a1ae546a0adb32a277a2278d0d17fa2f9093e6" + integrity sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw== + dependencies: + punycode "^2.3.1" tr46@~0.0.3: version "0.0.3" @@ -13905,16 +14823,16 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@2.8.1, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.6.2, tslib@^2.8.0, tslib@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.3: +tslib@1.14.1, tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@2.8.1, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.5.2, tslib@^2.6.2, tslib@^2.8.0, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -13968,6 +14886,11 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-fest@^0.8.0: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + type-fest@^1.0.2: version "1.4.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" @@ -14113,6 +15036,11 @@ uint8array-extras@^1.4.0: resolved "https://registry.yarnpkg.com/uint8array-extras/-/uint8array-extras-1.5.0.tgz#10d2a85213de3ada304fea1c454f635c73839e86" integrity sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A== +ulid@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/ulid/-/ulid-2.4.0.tgz#9d9ee22e63f4390ee1bcd9ad09fca39d8ae0afed" + integrity sha512-fIRiVTJNcSRmXKPZtGzFQv9WRrZ3M9eoptl/teFJvjOzmpU+/K/JH6HZ8deBfb5vMEpicJcLn7JmvdknlMq7Zg== + unbox-primitive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" @@ -14133,6 +15061,11 @@ undici-types@~7.19.0: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.19.2.tgz#1b67fc26d0f157a0cba3a58a5b5c1e2276b8ba2a" integrity sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg== +undici@^7.25.0: + version "7.25.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-7.25.0.tgz#7d72fc429a0421769ca2966fd07cac875c85b781" + integrity sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ== + unfetch@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" @@ -14168,11 +15101,6 @@ union@~0.5.0: dependencies: qs "^6.4.0" -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - universalify@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" @@ -14235,13 +15163,30 @@ url-join@^4.0.1: resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== +use-callback-ref@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.3.tgz#98d9fab067075841c5b2c6852090d5d0feabe2bf" + integrity sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg== + dependencies: + tslib "^2.0.0" + +use-isomorphic-layout-effect@^1.1.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz#2f11a525628f56424521c748feabc2ffcc962fce" + integrity sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA== + +use-sidecar@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.3.tgz#10e7fd897d130b896e2c546c63a5e8233d00efdb" + integrity sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ== dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" + detect-node-es "^1.1.0" + tslib "^2.0.0" + +use-sync-external-store@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz#b174bfa65cb2b526732d9f2ac0a408027876f32d" + integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w== util-deprecate@1.0.2, util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" @@ -14258,7 +15203,7 @@ uuid@9.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -uuid@^11.1.1: +uuid@^11.0.0, uuid@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.1.tgz#f6d81d2e1c65d00762e5e29b16c5d2d995e208ad" integrity sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ== @@ -14369,12 +15314,12 @@ vitest@^0.32.0: vite-node "0.32.4" why-is-node-running "^2.2.2" -w3c-xmlserializer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" - integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== +w3c-xmlserializer@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz#f925ba26855158594d907313cedd1476c5967f6c" + integrity sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA== dependencies: - xml-name-validator "^4.0.0" + xml-name-validator "^5.0.0" walker@^1.0.8: version "1.0.8" @@ -14410,10 +15355,10 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== +webidl-conversions@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-8.0.1.tgz#0657e571fe6f06fcb15ca50ed1fdbcb495cd1686" + integrity sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ== webpack-dev-middleware@^7.4.2: version "7.4.5" @@ -14558,18 +15503,19 @@ whatwg-encoding@^2.0.0: dependencies: iconv-lite "0.6.3" -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== +whatwg-mimetype@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz#d8232895dbd527ceaee74efd4162008fb8a8cf48" + integrity sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw== -whatwg-url@^12.0.0, whatwg-url@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-12.0.1.tgz#fd7bcc71192e7c3a2a97b9a8d6b094853ed8773c" - integrity sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ== +whatwg-url@^16.0.0, whatwg-url@^16.0.1: + version "16.0.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-16.0.1.tgz#047f7f4bd36ef76b7198c172d1b1cebc66f764dd" + integrity sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw== dependencies: - tr46 "^4.1.1" - webidl-conversions "^7.0.0" + "@exodus/bytes" "^1.11.0" + tr46 "^6.0.0" + webidl-conversions "^8.0.1" whatwg-url@^5.0.0: version "5.0.0" @@ -14619,6 +15565,11 @@ which-collection@^1.0.1, which-collection@^1.0.2: is-weakmap "^2.0.2" is-weakset "^2.0.3" +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + which-typed-array@^1.1.13, which-typed-array@^1.1.16, which-typed-array@^1.1.19: version "1.1.20" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122" @@ -14657,16 +15608,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@7.0.0, wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@7.0.0, wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -14693,19 +15635,20 @@ wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: string-width "^5.0.1" strip-ansi "^7.0.1" +wrap-ansi@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz#956832dea9494306e6d209eb871643bb873d7c98" + integrity sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + wrappy@1, wrappy@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - write-file-atomic@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" @@ -14714,7 +15657,7 @@ write-file-atomic@^5.0.1: imurmurhash "^0.1.4" signal-exit "^4.0.1" -ws@^8.13.0, ws@^8.18.0: +ws@^8.18.0: version "8.20.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.20.0.tgz#4cd9532358eba60bc863aad1623dfb045a4d4af8" integrity sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA== @@ -14726,16 +15669,26 @@ wsl-utils@^0.1.0: dependencies: is-wsl "^3.1.0" -xml-name-validator@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" - integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== +xml-name-validator@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673" + integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg== + +xml-naming@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/xml-naming/-/xml-naming-0.1.0.tgz#8ab7106c5b8d23caa2fabac1cadf17136379fbd8" + integrity sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw== xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xstate@^4.33.6: + version "4.38.3" + resolved "https://registry.yarnpkg.com/xstate/-/xstate-4.38.3.tgz#4e15e7ad3aa0ca1eea2010548a5379966d8f1075" + integrity sha512-SH7nAaaPQx57dx6qvfcIgqKRXIh4L0A1iYEqim4s1u7c9VoCgzZc+63FY90AKU4ZzOC2cfJzTnpO4zK7fCUzzw== + xtend@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -14746,6 +15699,11 @@ y18n@5.0.8, y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -14781,6 +15739,14 @@ yargs-parser@>=21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-22.0.0.tgz#87b82094051b0567717346ecd00fd14804b357c8" integrity sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw== +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs@17.7.2, yargs@^17.6.2, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" @@ -14794,6 +15760,23 @@ yargs@17.7.2, yargs@^17.6.2, yargs@^17.7.2: y18n "^5.0.5" yargs-parser "^21.1.1" +yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + yauzl@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" From 65d940cd344d82507ebe7f0072ed43719a3b821c Mon Sep 17 00:00:00 2001 From: chnnick Date: Fri, 29 May 2026 16:58:29 -0700 Subject: [PATCH 14/32] Cognito Module as a global import, export CognitoJWTGuard in module for greater accessiblity --- apps/backend/src/app.module.ts | 5 +++-- apps/backend/src/aws/cognito/cognito.module.ts | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/backend/src/app.module.ts b/apps/backend/src/app.module.ts index 84494188d..df2d31bb0 100644 --- a/apps/backend/src/app.module.ts +++ b/apps/backend/src/app.module.ts @@ -4,7 +4,7 @@ import { ConfigModule } from '@nestjs/config'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import AppDataSource from './data-source'; -import { CognitoService } from './aws/cognito/cognito.service'; +import { CognitoModule } from './aws/cognito/cognito.module'; import { UsersModule } from './users/users.module'; @Module({ @@ -13,9 +13,10 @@ import { UsersModule } from './users/users.module'; isGlobal: true, }), TypeOrmModule.forRoot(AppDataSource.options), + CognitoModule, UsersModule, ], controllers: [AppController], - providers: [AppService, CognitoService], + providers: [AppService], }) export class AppModule {} diff --git a/apps/backend/src/aws/cognito/cognito.module.ts b/apps/backend/src/aws/cognito/cognito.module.ts index 91850d851..d1fa5244b 100644 --- a/apps/backend/src/aws/cognito/cognito.module.ts +++ b/apps/backend/src/aws/cognito/cognito.module.ts @@ -1,14 +1,15 @@ -import { Module } from '@nestjs/common'; +import { Global, Module } from '@nestjs/common'; import { CognitoJWTGuard } from './cognito.guard'; import { APP_GUARD } from '@nestjs/core'; import { CognitoService } from './cognito.service'; +@Global() @Module({ providers: [ CognitoService, CognitoJWTGuard, { provide: APP_GUARD, useClass: CognitoJWTGuard }, ], - exports: [CognitoService], + exports: [CognitoService, CognitoJWTGuard], }) export class CognitoModule {} From fc6d8ec53d84e1db99c4fbdafff4795bc96a2dad Mon Sep 17 00:00:00 2001 From: chnnick Date: Tue, 2 Jun 2026 11:34:46 -0700 Subject: [PATCH 15/32] require all three Cognito env variables to enable authentication --- apps/backend/src/aws/cognito/cognito.config.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/backend/src/aws/cognito/cognito.config.ts b/apps/backend/src/aws/cognito/cognito.config.ts index 2c66c0737..f61d130d0 100644 --- a/apps/backend/src/aws/cognito/cognito.config.ts +++ b/apps/backend/src/aws/cognito/cognito.config.ts @@ -1,6 +1,10 @@ // Checks if the authentication is enabled export function isAuthEnabled(): boolean { - return isNonEmptyEnv(process.env.COGNITO_USER_POOL_ID); + return ( + isNonEmptyEnv(process.env.COGNITO_USER_POOL_ID) && + isNonEmptyEnv(process.env.COGNITO_CLIENT_ID) && + isNonEmptyEnv(process.env.COGNITO_REGION) + ); } // Gets the Cognito configuration information @@ -14,11 +18,7 @@ export function getCognitoConfig(): { const userPoolId = process.env.COGNITO_USER_POOL_ID; const clientId = process.env.COGNITO_CLIENT_ID; - if ( - !isNonEmptyEnv(region) || - !isNonEmptyEnv(userPoolId) || - !isNonEmptyEnv(clientId) - ) { + if (!isAuthEnabled()) { return null; } From 4f3d4f17e7117714062d3e3ece77d8f815150ebd Mon Sep 17 00:00:00 2001 From: chnnick Date: Tue, 2 Jun 2026 11:36:54 -0700 Subject: [PATCH 16/32] wrapped getUser tests into describe(), use Request type alias instead of never type for mock requests --- .../src/aws/cognito/cognito.service.spec.ts | 91 +++++++++++-------- 1 file changed, 55 insertions(+), 36 deletions(-) diff --git a/apps/backend/src/aws/cognito/cognito.service.spec.ts b/apps/backend/src/aws/cognito/cognito.service.spec.ts index c913aa947..6a790cf77 100644 --- a/apps/backend/src/aws/cognito/cognito.service.spec.ts +++ b/apps/backend/src/aws/cognito/cognito.service.spec.ts @@ -1,42 +1,61 @@ +import { Request } from 'express'; + import { CognitoService } from './cognito.service'; import { CognitoJwtPayload } from './cognito.types'; -describe('CognitoService', () => { - let service: CognitoService; - - beforeEach(() => { - service = new CognitoService(); - }); - - // Clean up environment variables after each test - afterEach(() => { - delete process.env.COGNITO_USER_POOL_ID; - }); - - it('returns null when there is no user pool ID env variable', () => { - delete process.env.COGNITO_USER_POOL_ID; +type TestRequest = Request & { user?: CognitoJwtPayload }; - expect(service.getUser({ headers: {} } as never)).toBeNull(); - }); - - it('returns the JWT payload when auth is active and user is on the request', () => { - process.env.COGNITO_USER_POOL_ID = 'us-east-2_TestPool'; - const payload: CognitoJwtPayload = { - sub: 'user-1', - client_id: 'test-client', - iss: 'https://cognito-idp.us-east-2.amazonaws.com/us-east-2_TestPool', - exp: 9999999999, - iat: 1, - }; - const request = { user: payload } as never; - - expect(service.getUser(request)).toEqual(payload); - }); - - // edge case: - it('returns null when auth is active but request has no user', () => { - process.env.COGNITO_USER_POOL_ID = 'us-east-2_TestPool'; - - expect(service.getUser({ headers: {} } as never)).toBeNull(); +describe('CognitoService', () => { + describe('getUser', () => { + let service: CognitoService; + + beforeEach(() => { + process.env.COGNITO_USER_POOL_ID = 'us-east-2_TestPool'; + process.env.COGNITO_CLIENT_ID = '4h57k9lmno1pqrstuv2wxyz3ab'; + process.env.COGNITO_REGION = 'us-east-2'; + service = new CognitoService(); + }); + + // Clean up environment variables after each test + afterEach(() => { + delete process.env.COGNITO_USER_POOL_ID; + delete process.env.COGNITO_REGION; + delete process.env.COGNITO_CLIENT_ID; + }); + + it('returns null when there is no user pool ID env variable, but client id and region exist', () => { + delete process.env.COGNITO_USER_POOL_ID; + + expect(service.getUser({ headers: {} } as TestRequest)).toBeNull(); + }); + + it('returns null when there is no region env variable, but client id and user pool ID exist', () => { + delete process.env.COGNITO_REGION; + + expect(service.getUser({ headers: {} } as TestRequest)).toBeNull(); + }); + + it('returns null when there is no client ID env variable, but user pool id and region exist', () => { + delete process.env.COGNITO_CLIENT_ID; + + expect(service.getUser({ headers: {} } as TestRequest)).toBeNull(); + }); + + it('returns the JWT payload when auth is active and user is on the request', () => { + const payload: CognitoJwtPayload = { + sub: 'user-1', + client_id: 'test-client', + iss: 'https://cognito-idp.us-east-2.amazonaws.com/us-east-2_TestPool', + exp: 9999999999, + iat: 1, + }; + const request = { user: payload } as TestRequest; + + expect(service.getUser(request)).toEqual(payload); + }); + + it('returns null when auth is active and user is not on the request', () => { + expect(service.getUser({ headers: {} } as TestRequest)).toBeNull(); + }); }); }); From ad13e1445ad650e93b4bf781ab6bff13f25fc2ba Mon Sep 17 00:00:00 2001 From: chnnick Date: Tue, 2 Jun 2026 12:44:00 -0700 Subject: [PATCH 17/32] use cached jswk client for jwks, typed the payload that returns from verifyToken --- apps/backend/src/aws/cognito/cognito.guard.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/backend/src/aws/cognito/cognito.guard.ts b/apps/backend/src/aws/cognito/cognito.guard.ts index f49da5946..042e0a025 100644 --- a/apps/backend/src/aws/cognito/cognito.guard.ts +++ b/apps/backend/src/aws/cognito/cognito.guard.ts @@ -6,7 +6,7 @@ import { } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import * as jwt from 'jsonwebtoken'; -import jwksClient from 'jwks-rsa'; +import jwksClient, { JwksClient } from 'jwks-rsa'; import { Request } from 'express'; import { IS_PUBLIC_KEY } from './cognito.decorator'; @@ -44,6 +44,8 @@ function extractBearerToken(request: Request): string | undefined { @Injectable() export class CognitoJWTGuard implements CanActivate { + private jwks?: JwksClient; + constructor(private readonly reflector: Reflector) {} // Whether or not the request is allowed to proceed @@ -70,7 +72,7 @@ export class CognitoJWTGuard implements CanActivate { } // Verify the token and attach the JWT payload to request.user - const payload = await this.verifyToken(token); + const payload: CognitoJwtPayload = await this.verifyToken(token); (request as Request & { user: CognitoJwtPayload }).user = payload; return true; } @@ -79,18 +81,21 @@ export class CognitoJWTGuard implements CanActivate { private verifyToken(token: string): Promise { // If the region, user pool ID, or client ID is not set, throw an unauthorized exception by default const config = getCognitoConfig(); + if (!config) { throw new UnauthorizedException(); } // Set up JWKS client to get the public key for the token to verify the JWT token signature - const client = jwksClient({ + this.jwks ??= jwksClient({ cache: true, rateLimit: true, jwksRequestsPerMinute: 5, jwksUri: `${config.issuer}/.well-known/jwks.json`, }); + const client = this.jwks; + // Function to get the public key for the token to verify the JWT token signature const getKey: jwt.GetPublicKeyOrSecret = (header, callback) => { const kid = header.kid; // The key ID (kid) from the JWT header From 167141a1c5dc7331106da072d9600ca451e64509 Mon Sep 17 00:00:00 2001 From: chnnick Date: Tue, 2 Jun 2026 13:03:58 -0700 Subject: [PATCH 18/32] updated documentation after importing CognitoModule into AppModule by default --- apps/backend/src/aws/cognito/README.md | 39 +++++++++++++++++--------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/apps/backend/src/aws/cognito/README.md b/apps/backend/src/aws/cognito/README.md index 72a57534e..b77bd3207 100644 --- a/apps/backend/src/aws/cognito/README.md +++ b/apps/backend/src/aws/cognito/README.md @@ -6,15 +6,21 @@ Copy placeholders from the repo root `example.env` into `.env` (or your deployme |----------|---------| | `COGNITO_USER_POOL_ID` | User pool ID; **must be set** to turn the guard on | | `COGNITO_CLIENT_ID` | App client ID used to validate `aud` / `client_id` on tokens | -| `COGNITO_REGION` | AWS region (builds JWKS issuer URL) +| `COGNITO_REGION` | AWS region (builds JWKS issuer URL) | Leave `COGNITO_USER_POOL_ID` unset to disable auth via JWT enforcement entirely -### Using Cognito in your app: +### Auth model -There are two options for implementing the Cognito authentication guard in your app: +- **Verification** — `CognitoJWTGuard` is the only component that validates JWTs (signature, issuer, audience). Do not add a second Passport/JWKS path for the same user pool. +- **Global guard** — `CognitoModule` registers `CognitoJWTGuard` as an `APP_GUARD`, so every route is protected by default. You do **not** need `@UseGuards(CognitoJWTGuard)` on controllers when using this setup. +- **`request.user`** — After a successful check, the guard sets `request.user` to the decoded JWT payload (`CognitoJwtPayload`: `sub`, `email`, `client_id`, `cognito:groups`, `token_use`, etc.). It is **not** a database user row; resolve local users in your services via `sub` or `email` if needed. -1. Import `CognitoModule` into `AppModule` to protect all modules throughout the application: +### Using Cognito in your app (recommended + implemented: global guard) + +Import `CognitoModule` into `AppModule` (Already ). This enables auth app-wide and exports `CognitoService` for reading `request.user`: + +Note: This has already been implemented by default ```typescript @Module({ @@ -23,7 +29,16 @@ There are two options for implementing the Cognito authentication guard in your export class AppModule {} ``` -2. Import `CognitoJWTGuard` and `CognitoService` into individual modules, then apply the guard with `@UseGuards`: +New controllers are protected automatically. Opt out with `@Public()` (see below). Read the caller with `CognitoService.getUser(req)` or `req.user` after the guard runs. + +### Alternate setup: per-module or per-route guard + +If you **do not** register `APP_GUARD` in `CognitoModule` (or you remove that provider), you can import the guard only where needed: + +1. Add `CognitoJWTGuard` and `CognitoService` to the module `providers` array (and import `CognitoModule` or register those providers yourself). +2. Apply `@UseGuards(CognitoJWTGuard)` on a controller or individual route. + +**Per controller** — all routes on the controller: ```typescript @Module({ @@ -31,11 +46,7 @@ export class AppModule {} providers: [CognitoJWTGuard, CognitoService], }) export class UsersModule {} -``` - - - **Per controller** — all routes in the controller go through the guard: -```typescript @Controller('users') @UseGuards(CognitoJWTGuard) export class UsersController { @@ -44,7 +55,7 @@ export class UsersController { } ``` - - **Per route** — only decorated handlers are protected: +**Per route** — only decorated handlers: ```typescript @Controller('users') @@ -58,7 +69,6 @@ export class UsersController { } ``` - ### Public Routes Use the `@Public()` decorator on routes that are technically protected, but don't require authentication. i.e. health checks, webhooks, or unauthenticated entry points: @@ -76,18 +86,19 @@ export class HealthController { ``` ### `CognitoService.getUser()` -Inject `CognitoService` in controllers or services to extract decoded token payload from the request + +Inject `CognitoService` to extract the same `CognitoJwtPayload` decoded token payload the guard attached to `request.user`: ```typescript @Get('me') me(@Req() req: Request) { const user = this.cognitoService.getUser(req); - // null when auth is disabled, or no valid token was attached + // null when auth env is incomplete/disabled, or when request.user was never set return user; } ``` -The guard sets `request.user` to the verified JWT payload (`CognitoJwtPayload`: `sub`, `email`, `cognito:groups`, etc.). +Returns `null` if Cognito auth is disabled (missing env) or if no verified token was attached. On protected routes with a valid Bearer token, it returns the JWT claims object. ## Token validation From 378435bf2329b3e2dae532572471332808a8b0da Mon Sep 17 00:00:00 2001 From: chnnick Date: Tue, 2 Jun 2026 13:08:00 -0700 Subject: [PATCH 19/32] updated documentation to match new auth disable requirements (missing any env variables) --- apps/backend/src/aws/cognito/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/backend/src/aws/cognito/README.md b/apps/backend/src/aws/cognito/README.md index b77bd3207..d2897a1d5 100644 --- a/apps/backend/src/aws/cognito/README.md +++ b/apps/backend/src/aws/cognito/README.md @@ -8,7 +8,8 @@ Copy placeholders from the repo root `example.env` into `.env` (or your deployme | `COGNITO_CLIENT_ID` | App client ID used to validate `aud` / `client_id` on tokens | | `COGNITO_REGION` | AWS region (builds JWKS issuer URL) | -Leave `COGNITO_USER_POOL_ID` unset to disable auth via JWT enforcement entirely +> [!IMPORTANT] +> If any Cognito env variables are unset: `COGNITO_USER_POOL_ID`, `COGNITO_CLIENT_ID`, `COGNITO_REGION`, authentication via JWT enforcement is **disabled entirely** ### Auth model @@ -20,7 +21,8 @@ Leave `COGNITO_USER_POOL_ID` unset to disable auth via JWT enforcement entirely Import `CognitoModule` into `AppModule` (Already ). This enables auth app-wide and exports `CognitoService` for reading `request.user`: -Note: This has already been implemented by default +> [!IMPORTANT] +> Note: This has already been implemented by default ```typescript @Module({ From 35a5127fad2fc39ce6df38b09a20977148500bbb Mon Sep 17 00:00:00 2001 From: chnnick Date: Tue, 2 Jun 2026 13:16:43 -0700 Subject: [PATCH 20/32] updated tests for missing env variables -> auth disabled --- .../src/aws/cognito/cognito.guard.spec.ts | 56 +++++++++++-------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/apps/backend/src/aws/cognito/cognito.guard.spec.ts b/apps/backend/src/aws/cognito/cognito.guard.spec.ts index 0c7da853f..05ca00cb4 100644 --- a/apps/backend/src/aws/cognito/cognito.guard.spec.ts +++ b/apps/backend/src/aws/cognito/cognito.guard.spec.ts @@ -240,51 +240,59 @@ describe('CognitoJWTGuard', () => { expect(jwt.verify).not.toHaveBeenCalled(); expect(request.user).toBeUndefined(); }); - it('rejects routes when COGNITO_CLIENT_ID is missing', async () => { - process.env.COGNITO_USER_POOL_ID = ACTIVE_ENV.COGNITO_USER_POOL_ID; - process.env.COGNITO_REGION = ACTIVE_ENV.COGNITO_REGION; - delete process.env.COGNITO_CLIENT_ID; + }); - const { context } = createContext('Bearer token'); + describe('when auth is inactive', () => { + beforeEach(() => { + delete process.env.COGNITO_USER_POOL_ID; + }); - await expect(guard.canActivate(context)).rejects.toThrow( - UnauthorizedException, - ); + it('allows requests without a token', async () => { + const { context } = createContext(); + + await expect(guard.canActivate(context)).resolves.toBe(true); expect(jwt.verify).not.toHaveBeenCalled(); }); - it('rejects routes when COGNITO_REGION is missing', async () => { - process.env.COGNITO_USER_POOL_ID = ACTIVE_ENV.COGNITO_USER_POOL_ID; + it('allows requests with a bearer token', async () => { + const { context, request } = createContext('Bearer bad-token'); + + await expect(guard.canActivate(context)).resolves.toBe(true); + expect(jwt.verify).not.toHaveBeenCalled(); + expect(request.user).toBeUndefined(); + }); + + it('allows routes when COGNITO_USER_POOL_ID is missing (auth disabled)', async () => { process.env.COGNITO_CLIENT_ID = ACTIVE_ENV.COGNITO_CLIENT_ID; - delete process.env.COGNITO_REGION; + process.env.COGNITO_REGION = ACTIVE_ENV.COGNITO_REGION; + delete process.env.COGNITO_USER_POOL_ID; const { context } = createContext('Bearer token'); - await expect(guard.canActivate(context)).rejects.toThrow( - UnauthorizedException, - ); + await expect(guard.canActivate(context)).resolves.toBe(true); expect(jwt.verify).not.toHaveBeenCalled(); }); - }); - describe('when auth is inactive', () => { - beforeEach(() => { - delete process.env.COGNITO_USER_POOL_ID; - }); + it('allows routes when COGNITO_CLIENT_ID is missing (auth disabled)', async () => { + process.env.COGNITO_USER_POOL_ID = ACTIVE_ENV.COGNITO_USER_POOL_ID; + process.env.COGNITO_REGION = ACTIVE_ENV.COGNITO_REGION; + delete process.env.COGNITO_CLIENT_ID; - it('allows requests without a token', async () => { - const { context } = createContext(); + const { context } = createContext('Bearer token'); await expect(guard.canActivate(context)).resolves.toBe(true); expect(jwt.verify).not.toHaveBeenCalled(); }); - it('allows requests with a bearer token', async () => { - const { context, request } = createContext('Bearer bad-token'); + it('allows routes when COGNITO_REGION is missing (auth disabled)', async () => { + process.env.COGNITO_USER_POOL_ID = ACTIVE_ENV.COGNITO_USER_POOL_ID; + process.env.COGNITO_CLIENT_ID = ACTIVE_ENV.COGNITO_CLIENT_ID; + delete process.env.COGNITO_REGION; + + const { context } = createContext('Bearer token'); await expect(guard.canActivate(context)).resolves.toBe(true); expect(jwt.verify).not.toHaveBeenCalled(); - expect(request.user).toBeUndefined(); }); }); }); From 2b96133ada164979651a8303a82b212bbbc36cfe Mon Sep 17 00:00:00 2001 From: chnnick Date: Tue, 2 Jun 2026 13:22:55 -0700 Subject: [PATCH 21/32] try to just use cognitoinformationpresent --- apps/frontend/src/auth/auth.config.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/frontend/src/auth/auth.config.ts b/apps/frontend/src/auth/auth.config.ts index 5bef1fb55..45cc2f2d2 100644 --- a/apps/frontend/src/auth/auth.config.ts +++ b/apps/frontend/src/auth/auth.config.ts @@ -20,10 +20,7 @@ export const cognitoInformationPresent = // Configure amplify with cognito if the information is present in the environment variables export function configureAmplify(): void { - if (!isNonEmptyEnv(userPoolId)) { - return; - } - if (!isNonEmptyEnv(userPoolClientId)) { + if (!cognitoInformationPresent) { return; } From cd44f7ab30e894c0828e38a5be479e9c0a2627f6 Mon Sep 17 00:00:00 2001 From: chnnick Date: Tue, 2 Jun 2026 13:34:09 -0700 Subject: [PATCH 22/32] type vite cognito env vars before passing into amplify.configure --- apps/frontend/src/auth/auth.config.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/frontend/src/auth/auth.config.ts b/apps/frontend/src/auth/auth.config.ts index 5bef1fb55..1a4bf2f52 100644 --- a/apps/frontend/src/auth/auth.config.ts +++ b/apps/frontend/src/auth/auth.config.ts @@ -20,18 +20,18 @@ export const cognitoInformationPresent = // Configure amplify with cognito if the information is present in the environment variables export function configureAmplify(): void { - if (!isNonEmptyEnv(userPoolId)) { - return; - } - if (!isNonEmptyEnv(userPoolClientId)) { + if (!cognitoInformationPresent) { return; } + const poolId: string = userPoolId; + const clientId: string = userPoolClientId; + Amplify.configure({ Auth: { Cognito: { - userPoolId, - userPoolClientId, + userPoolId: poolId, + userPoolClientId: clientId, }, }, }); From 146b2719b47330f9e6fa0b9d748525eda41e4a51 Mon Sep 17 00:00:00 2001 From: chnnick Date: Tue, 2 Jun 2026 13:51:18 -0700 Subject: [PATCH 23/32] get rid of VITE specific cognito variables in .env instead have them autogenerated in vite.config, also set the project root to allow frontend access to root /.env file. --- apps/frontend/vite.config.ts | 76 ++++++++++++++++++++---------------- example.env | 2 - 2 files changed, 43 insertions(+), 35 deletions(-) diff --git a/apps/frontend/vite.config.ts b/apps/frontend/vite.config.ts index 6c2f4b9a7..09e512cb8 100644 --- a/apps/frontend/vite.config.ts +++ b/apps/frontend/vite.config.ts @@ -1,46 +1,56 @@ /// -import { defineConfig } from 'vite'; +import { defineConfig, loadEnv } from 'vite'; import react from '@vitejs/plugin-react'; import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin'; import path from 'path'; -export default defineConfig({ - cacheDir: '../../node_modules/.vite/frontend', +// Assumes this file is in /apps/frontend/vite.config.ts and env variables are set in /.env +const workspaceRoot = path.resolve(__dirname, '../..'); - server: { - port: 4200, - host: 'localhost', - }, +export default defineConfig(({ mode }) => { + const env = loadEnv(mode, workspaceRoot, ''); + process.env.VITE_COGNITO_USER_POOL_ID = env.COGNITO_USER_POOL_ID ?? ''; + process.env.VITE_COGNITO_USER_POOL_CLIENT_ID = env.COGNITO_CLIENT_ID ?? ''; - preview: { - port: 4300, - host: 'localhost', - }, + return { + cacheDir: '../../node_modules/.vite/frontend', + envDir: workspaceRoot, - plugins: [react(), nxViteTsPaths()], + server: { + port: 4200, + host: 'localhost', + }, + + preview: { + port: 4300, + host: 'localhost', + }, - // Uncomment this if you are using workers. - // worker: { - // plugins: [ nxViteTsPaths() ], - // }, + plugins: [react(), nxViteTsPaths()], - test: { - globals: true, - cache: { - dir: '../../node_modules/.vitest', + // Uncomment this if you are using workers. + // worker: { + // plugins: [ nxViteTsPaths() ], + // }, + + test: { + globals: true, + cache: { + dir: '../../node_modules/.vitest', + }, + environment: 'jsdom', + include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], }, - environment: 'jsdom', - include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - }, - - resolve: { - alias: { - '@api': path.resolve(__dirname, './src/api'), - '@components': path.resolve(__dirname, './src/components'), - '@containers': path.resolve(__dirname, './src/containers'), - '@public': path.resolve(__dirname, './public'), - '@shared': path.resolve(__dirname, '../../shared'), - '@utils': path.resolve(__dirname, './src/utils'), + + resolve: { + alias: { + '@api': path.resolve(__dirname, './src/api'), + '@components': path.resolve(__dirname, './src/components'), + '@containers': path.resolve(__dirname, './src/containers'), + '@public': path.resolve(__dirname, './public'), + '@shared': path.resolve(__dirname, '../../shared'), + '@utils': path.resolve(__dirname, './src/utils'), + }, }, - }, + }; }); diff --git a/example.env b/example.env index fd54f2f47..384b66ccd 100644 --- a/example.env +++ b/example.env @@ -9,8 +9,6 @@ NX_DB_PORT=5432 COGNITO_USER_POOL_ID=us-east-2_AbCdEf123 COGNITO_CLIENT_ID=4h57k9lmno1pqrstuv2wxyz3ab COGNITO_REGION=us-east-2 -VITE_COGNITO_USER_POOL_ID=us-east-2_AbCdEf123 -VITE_COGNITO_USER_POOL_CLIENT_ID=4h57k9lmno1pqrstuv2wxyz3ab AWS_ACCESS_KEY_ID = 'ABCDEFGHIJK12345678' AWS_SECRET_ACCESS_KEY = 'bhduerv797887veerfwev78899y87tre' From 960951e96f119b95a363838d9e1a4a728a824e30 Mon Sep 17 00:00:00 2001 From: chnnick Date: Tue, 2 Jun 2026 16:10:16 -0700 Subject: [PATCH 24/32] check for cognito region when turning on auth in the frontend --- apps/frontend/src/auth/auth.config.ts | 5 ++++- apps/frontend/vite.config.ts | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/frontend/src/auth/auth.config.ts b/apps/frontend/src/auth/auth.config.ts index 1a4bf2f52..2817e55f0 100644 --- a/apps/frontend/src/auth/auth.config.ts +++ b/apps/frontend/src/auth/auth.config.ts @@ -2,6 +2,7 @@ import { Amplify } from 'aws-amplify'; const userPoolId = import.meta.env.VITE_COGNITO_USER_POOL_ID; const userPoolClientId = import.meta.env.VITE_COGNITO_USER_POOL_CLIENT_ID; +const region = import.meta.env.VITE_COGNITO_REGION; // Fail out if the values are not set in the environment variables even if they exist function isNonEmptyEnv(value: string | undefined): value is string { @@ -16,7 +17,9 @@ function isNonEmptyEnv(value: string | undefined): value is string { // Check if the cognito information is present in the environment variables export const cognitoInformationPresent = - isNonEmptyEnv(userPoolId) && isNonEmptyEnv(userPoolClientId); + isNonEmptyEnv(userPoolId) && + isNonEmptyEnv(userPoolClientId) && + isNonEmptyEnv(region); // Configure amplify with cognito if the information is present in the environment variables export function configureAmplify(): void { diff --git a/apps/frontend/vite.config.ts b/apps/frontend/vite.config.ts index 09e512cb8..22bb472d4 100644 --- a/apps/frontend/vite.config.ts +++ b/apps/frontend/vite.config.ts @@ -11,6 +11,7 @@ export default defineConfig(({ mode }) => { const env = loadEnv(mode, workspaceRoot, ''); process.env.VITE_COGNITO_USER_POOL_ID = env.COGNITO_USER_POOL_ID ?? ''; process.env.VITE_COGNITO_USER_POOL_CLIENT_ID = env.COGNITO_CLIENT_ID ?? ''; + process.env.VITE_COGNITO_REGION = env.COGNITO_REGION ?? ''; return { cacheDir: '../../node_modules/.vite/frontend', From 9dbd28c6114cdd48168f23e3cafda2b2a1c9f717 Mon Sep 17 00:00:00 2001 From: chnnick Date: Thu, 4 Jun 2026 18:03:02 -0700 Subject: [PATCH 25/32] specify frontend root for vite --- apps/frontend/vite.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/frontend/vite.config.ts b/apps/frontend/vite.config.ts index 22bb472d4..09fdba653 100644 --- a/apps/frontend/vite.config.ts +++ b/apps/frontend/vite.config.ts @@ -14,6 +14,7 @@ export default defineConfig(({ mode }) => { process.env.VITE_COGNITO_REGION = env.COGNITO_REGION ?? ''; return { + root: __dirname, cacheDir: '../../node_modules/.vite/frontend', envDir: workspaceRoot, From cba88c41675a44a6db906a04e17ef4d635e3d206 Mon Sep 17 00:00:00 2001 From: chnnick Date: Wed, 10 Jun 2026 11:53:53 -0700 Subject: [PATCH 26/32] type guard + make token_use a required field -> strict token checking --- apps/backend/src/aws/cognito/cognito.types.ts | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/apps/backend/src/aws/cognito/cognito.types.ts b/apps/backend/src/aws/cognito/cognito.types.ts index e45e9e04f..96f47cf48 100644 --- a/apps/backend/src/aws/cognito/cognito.types.ts +++ b/apps/backend/src/aws/cognito/cognito.types.ts @@ -5,10 +5,29 @@ export interface CognitoJwtPayload { sub: string; // Subject (unique identifier for the user) 'cognito:groups'?: string[]; // Groups (ex: ['admin', 'user']) iss: string; // Issuer (ex: https://cognito-idp..amazonaws.com/) - token_use?: 'id' | 'access'; // Token use (ID or access token from Cognito) + token_use: 'id' | 'access'; // Token use (ID or access token from Cognito) aud?: string | string[]; // Audience: Client ID this token is intended for (ex: ) client_id?: string; // Client ID used during authentication (ex: ) exp: number; // Expiration time (Unix timestamp) iat: number; // Issued at time (Unix timestamp) email?: string; // Email (ex: test@example.com) } + +// Runtime type guard for CognitoJwtPayload. jwt.verify proves the token is +// authentic, but not that the decoded claims have the shape we expect, so we +// validate the required fields here before trusting the payload. +export function isCognitoJwtPayload( + value: unknown, +): value is CognitoJwtPayload { + if (typeof value !== 'object' || value === null) { + return false; + } + const payload = value as Record; + return ( + typeof payload.sub === 'string' && + typeof payload.iss === 'string' && + typeof payload.token_use === 'string' && + typeof payload.exp === 'number' && + typeof payload.iat === 'number' + ); +} From 614ae4054e602d243a07877f03b865fb606dbf4c Mon Sep 17 00:00:00 2001 From: chnnick Date: Thu, 11 Jun 2026 14:29:07 -0700 Subject: [PATCH 27/32] README with new auth flow for newbies, updated access token only documentation --- apps/backend/src/aws/cognito/README.md | 113 +++++++++++-------------- 1 file changed, 50 insertions(+), 63 deletions(-) diff --git a/apps/backend/src/aws/cognito/README.md b/apps/backend/src/aws/cognito/README.md index d2897a1d5..694656863 100644 --- a/apps/backend/src/aws/cognito/README.md +++ b/apps/backend/src/aws/cognito/README.md @@ -1,21 +1,46 @@ +## Scaffolding auth flow +Some key concepts you'll need to know are: +- **Authentication (authn)** = *"who are you?"* -> ex: Distinguishing a known user from an unknown one +- **Authorization (authz)** = *"what are you allowed to do?"* -> ex: Distinguishing admin access vs normal user access to routes + +1. **Unauthenticated user hits the app.** A user opens the frontend with no token. If they call a protected (Non Public) backend route, `CognitoJWTGuard` finds no `Authorization: Bearer ` header and responds `401 Unauthorized`. + +2. **User authenticates with Cognito** The frontend sends the user's credentials to Cognito. Cognito verifies the credentials and *authenticates* the user. This happens entirely between the client and Cognito. Our backend is not involved and never sees the password. + +3. **Cognito issues tokens.** On success, Cognito returns signed JWTs, including: + - an **ID token** — describes *who the user is* (identity claims), meant for the frontend. + - an **access token** — the *authorization* credential, meant to be sent to backend APIs and checked by the `CognitoJWTGuard`. (See [Token validation](#token-validation)) + +4. **Frontend calls the backend with the access token.** The client attaches it on every request as a header: `Authorization: Bearer `. + +5. **The Guard checks the token.** `CognitoJWTGuard` runs on every route (it's registered as a global `APP_GUARD`). For each request it: + - lets the request through immediately if auth is disabled (Cognito env vars unset or the route is marked `@Public()`) + - extracts and verifies the Bearer token, then checks the RS256 signature against the pool's public keys (JWKS), the issuer, expiration, that `token_use === 'access'`, and that `client_id` matches our app client. + +6. **Allow or deny.** + - **Valid token** → the guard attaches the decoded claims to `request.user` and the request proceeds to the controller -> Read with `CognitoService.getUser(req)`. + - **Missing or invalid token** (bad signature, expired, wrong token type, wrong client) → `401 Unauthorized`, and the controller never runs. + +So: **every route is protected by default, a request is allowed only if it carries a valid Cognito access token or if the route is marked `@Public()`, which skips the check entirely.** Public routes are for things that must work without a login, like health checks, webhooks, or the login entry point itself. + ## QUICKSTART: Copy placeholders from the repo root `example.env` into `.env` (or your deployment secrets): | Variable | Purpose | |----------|---------| -| `COGNITO_USER_POOL_ID` | User pool ID; **must be set** to turn the guard on | -| `COGNITO_CLIENT_ID` | App client ID used to validate `aud` / `client_id` on tokens | -| `COGNITO_REGION` | AWS region (builds JWKS issuer URL) | +| `COGNITO_USER_POOL_ID` | Your registered users in Cognito to authenticate with | +| `COGNITO_CLIENT_ID` | The application you are building's own id linked to Cognito used to validate `client_id` on tokens | +| `COGNITO_REGION` | AWS region | > [!IMPORTANT] > If any Cognito env variables are unset: `COGNITO_USER_POOL_ID`, `COGNITO_CLIENT_ID`, `COGNITO_REGION`, authentication via JWT enforcement is **disabled entirely** ### Auth model -- **Verification** — `CognitoJWTGuard` is the only component that validates JWTs (signature, issuer, audience). Do not add a second Passport/JWKS path for the same user pool. +- **Verification** — `CognitoJWTGuard` is the only component that validates JWTs (signature, issuer, audience). - **Global guard** — `CognitoModule` registers `CognitoJWTGuard` as an `APP_GUARD`, so every route is protected by default. You do **not** need `@UseGuards(CognitoJWTGuard)` on controllers when using this setup. -- **`request.user`** — After a successful check, the guard sets `request.user` to the decoded JWT payload (`CognitoJwtPayload`: `sub`, `email`, `client_id`, `cognito:groups`, `token_use`, etc.). It is **not** a database user row; resolve local users in your services via `sub` or `email` if needed. +- **`request.user`** — After a successful check, the guard sets `request.user` to the decoded JWT payload (`CognitoJwtPayload`: `sub`, `client_id`, `cognito:groups`, `token_use`, etc.) ### Using Cognito in your app (recommended + implemented: global guard) @@ -33,44 +58,6 @@ export class AppModule {} New controllers are protected automatically. Opt out with `@Public()` (see below). Read the caller with `CognitoService.getUser(req)` or `req.user` after the guard runs. -### Alternate setup: per-module or per-route guard - -If you **do not** register `APP_GUARD` in `CognitoModule` (or you remove that provider), you can import the guard only where needed: - -1. Add `CognitoJWTGuard` and `CognitoService` to the module `providers` array (and import `CognitoModule` or register those providers yourself). -2. Apply `@UseGuards(CognitoJWTGuard)` on a controller or individual route. - -**Per controller** — all routes on the controller: - -```typescript -@Module({ - controllers: [UsersController], - providers: [CognitoJWTGuard, CognitoService], -}) -export class UsersModule {} - -@Controller('users') -@UseGuards(CognitoJWTGuard) -export class UsersController { - constructor(private readonly cognitoService: CognitoService) {} - ... -} -``` - -**Per route** — only decorated handlers: - -```typescript -@Controller('users') -export class UsersController { - @UseGuards(CognitoJWTGuard) - @Get('me') - me(@Req() req: Request) { - return this.cognitoService.getUser(req); - } - ... -} -``` - ### Public Routes Use the `@Public()` decorator on routes that are technically protected, but don't require authentication. i.e. health checks, webhooks, or unauthenticated entry points: @@ -104,34 +91,34 @@ Returns `null` if Cognito auth is disabled (missing env) or if no verified token ## Token validation -- JWKS: `https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json` -- Signature: RS256, issuer must match the pool. -- Audience: each token carries **one** of these — ID tokens use `aud`; access tokens use `client_id` (Cognito does not put `aud` on access tokens). The guard accepts either claim matching `COGNITO_CLIENT_ID`. Amplify API calls typically send the **access** token (see below). +The guard validates access tokens by +- JWKS: https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json +- Signature: RS256; iss must match the pool. +- Expiration: exp is enforced automatically by jsonwebtoken.verify +- token_use: must equal `access`. This is what rejects an ID token presented to the backend. +- client_id: must equal `COGNITO_CLIENT_ID`. On access tokens the app client ID lives in the client_id claim > [!IMPORTANT] -> By default, both ID and access tokens are checked for and accepted. Cognito can be used for both Authentication (ID) and Authorization (Access), if you want to restrict to one specific use, add a `token_use` check in `isAudienceValid` and delete the other (id or access) check. +> The scaffold accepts access tokens only, by design. Backend APIs are resource servers and authorize requests using access tokens; ID tokens are for the frontend to establish who the user is. The token_use check in isAccessTokenValid (below) is what enforces the access-token-only rule. > [!WARNING] -> Do not use the **ID token** for API authorization. ID tokens are intended for your -> client application to establish who the user is: passing them to a backend API -> exposes identity claims unnecessarily and confuses authentication with authorization. -> Backend APIs should validate **access tokens** only. See the `token_use` check in -> `isAudienceValid` below to enforce this. +> Do not use the ID token for API authorization. ID tokens are intended for your client application to establish who the user is; passing them to a backend API exposes identity claims unnecessarily and confuses authentication with authorization. Backend APIs should validate access tokens only. The token_use check in isAccessTokenValid below enforces this. -```typescript -function isAudienceValid(payload: CognitoJwtPayload, clientId: string): boolean { +``` +function isAccessTokenValid(payload: CognitoJwtPayload, clientId: string): boolean { if (payload.token_use !== 'access') return false; return payload.client_id === clientId; } ``` -```typescript -function isAudienceValid(payload: CognitoJwtPayload, clientId: string): boolean { - if (payload.token_use !== 'id') return false; - return payload.aud === clientId; -} -``` + +> [!NOTE] +> `client_id` validation currently accepts a single client. If this pool ever serves +multiple app clients (e.g. a separate web and mobile app sharing one user pool), +change COGNITO_CLIENT_ID to accept a comma-separated list and validate membership +in that allowlist instead of simply an equality check. + ## Helpful Resources for understanding Auth! +- The most amazing explanation of authn (OAUTH 2.0) and authz (OIDC) you'll ever watch: https://www.youtube.com/watch?v=996OiexHze0&t=2126s - Difference between id and access tokens: https://auth0.com/blog/id-token-access-token-what-is-the-difference/ -- What is an Access Token? https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-access-token.html -- What is an ID Token? https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-id-token.html -- Using AWS to verify JWT: https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html \ No newline at end of file +- The most amazing +- Using AWS to verify JWT: https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html From a3c374cd48e939bda04e6918c08e24e99565e50d Mon Sep 17 00:00:00 2001 From: chnnick Date: Thu, 11 Jun 2026 14:36:23 -0700 Subject: [PATCH 28/32] tokens clarification --- apps/backend/src/aws/cognito/README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/backend/src/aws/cognito/README.md b/apps/backend/src/aws/cognito/README.md index 694656863..1bee33b02 100644 --- a/apps/backend/src/aws/cognito/README.md +++ b/apps/backend/src/aws/cognito/README.md @@ -1,15 +1,16 @@ ## Scaffolding auth flow Some key concepts you'll need to know are: -- **Authentication (authn)** = *"who are you?"* -> ex: Distinguishing a known user from an unknown one -- **Authorization (authz)** = *"what are you allowed to do?"* -> ex: Distinguishing admin access vs normal user access to routes +- **Authentication (authn)** = *"who are you?"* -> ex: distinguishing a known user from an unknown one +- **Authorization (authz)** = *"what are you allowed to do?"* -> ex: distinguishing admin access vs normal user access to routes 1. **Unauthenticated user hits the app.** A user opens the frontend with no token. If they call a protected (Non Public) backend route, `CognitoJWTGuard` finds no `Authorization: Bearer ` header and responds `401 Unauthorized`. 2. **User authenticates with Cognito** The frontend sends the user's credentials to Cognito. Cognito verifies the credentials and *authenticates* the user. This happens entirely between the client and Cognito. Our backend is not involved and never sees the password. -3. **Cognito issues tokens.** On success, Cognito returns signed JWTs, including: - - an **ID token** — describes *who the user is* (identity claims), meant for the frontend. - - an **access token** — the *authorization* credential, meant to be sent to backend APIs and checked by the `CognitoJWTGuard`. (See [Token validation](#token-validation)) +3. **Cognito issues tokens.** On success, Cognito returns separate signed JWTs for the following: + - **ID token**: describes *who the user is* (identity claims), meant for the frontend. + - **access token**: the *authorization* credential, meant to be sent to backend APIs and checked by the `CognitoJWTGuard`. (See [Token validation](#token-validation)) + - **refresh token**: used to obtain fresh ID/access tokens when they expire. 4. **Frontend calls the backend with the access token.** The client attaches it on every request as a header: `Authorization: Bearer `. From ac27824d91c0333bedf814c7148dc066129919ba Mon Sep 17 00:00:00 2001 From: chnnick Date: Thu, 11 Jun 2026 14:56:03 -0700 Subject: [PATCH 29/32] get rid of id token in jwtpayload checks for the backend, rename CognitoJWTPayload to just AccessTokenPayload for accuracy, javadoc comments --- apps/backend/src/aws/cognito/cognito.guard.ts | 64 +++++++++---------- .../src/aws/cognito/cognito.service.ts | 28 ++++++-- apps/backend/src/aws/cognito/cognito.types.ts | 21 +++--- 3 files changed, 65 insertions(+), 48 deletions(-) diff --git a/apps/backend/src/aws/cognito/cognito.guard.ts b/apps/backend/src/aws/cognito/cognito.guard.ts index 042e0a025..64c2daf70 100644 --- a/apps/backend/src/aws/cognito/cognito.guard.ts +++ b/apps/backend/src/aws/cognito/cognito.guard.ts @@ -10,29 +10,18 @@ import jwksClient, { JwksClient } from 'jwks-rsa'; import { Request } from 'express'; import { IS_PUBLIC_KEY } from './cognito.decorator'; -import { CognitoJwtPayload } from './cognito.types'; +import { AccessTokenPayload, isAccessTokenPayload } from './cognito.types'; import { getCognitoConfig, isAuthEnabled } from './cognito.config'; -// Checks if client id or audience returned matches your own COGNITO_CLIENT_ID -function isAudienceValid( - payload: CognitoJwtPayload, +// Checks if the token is an access token and client id returned matches your own COGNITO_CLIENT_ID +function isAccessTokenValid( + payload: AccessTokenPayload, clientId: string, ): boolean { - // Check Client ID - if (payload.client_id === clientId) { - return true; - } - - // Check Aud - const aud = payload.aud; - if (typeof aud === 'string') { - return aud === clientId; + if (payload.token_use !== 'access') { + return false; } - if (Array.isArray(aud)) { - return aud.includes(clientId); - } - - return false; + return payload.client_id === clientId; } // Extracts the bearer token from the request's Authorization header @@ -48,14 +37,27 @@ export class CognitoJWTGuard implements CanActivate { constructor(private readonly reflector: Reflector) {} - // Whether or not the request is allowed to proceed + /** + * Determines whether the current request is allowed to proceed to the route handler. + * + * Access is granted without verification when authentication is disabled or when the + * route (handler or controller) is marked public via the {@link IS_PUBLIC_KEY} metadata. + * Otherwise, the bearer token is extracted from the `Authorization` header and verified + * against the Cognito user pool's JWKS endpoint; on success the decoded + * {@link AccessTokenPayload} is attached to `request.user` for downstream handlers. + * + * @param context - The current execution context provided by NestJS. + * @returns `true` when the request is allowed to proceed. + * @throws {UnauthorizedException} If no bearer token is present, the Cognito + * configuration is missing, or the token fails signature/claim verification. + */ async canActivate(context: ExecutionContext): Promise { // If authentication is not enabled, allow the request to proceed if (!isAuthEnabled()) { return true; } - // If the route is public (Either the route is marked as public or the controller/handler is marked as public), allow the request to proceed + // Check if the route is marked as public const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ context.getHandler(), context.getClass(), @@ -64,24 +66,21 @@ export class CognitoJWTGuard implements CanActivate { return true; } - // Extract the bearer token from the request's Authorization header + // Extract the bearer token from the request's Authorization header and verify const request = context.switchToHttp().getRequest(); const token = extractBearerToken(request); if (!token) { throw new UnauthorizedException(); } - - // Verify the token and attach the JWT payload to request.user - const payload: CognitoJwtPayload = await this.verifyToken(token); - (request as Request & { user: CognitoJwtPayload }).user = payload; + const payload: AccessTokenPayload = await this.verifyToken(token); + (request as Request & { user: AccessTokenPayload }).user = payload; return true; } // Verifies the token against user pool JWKS endpoint, and returns the JWT payload if the token is valid - private verifyToken(token: string): Promise { + private verifyToken(token: string): Promise { // If the region, user pool ID, or client ID is not set, throw an unauthorized exception by default const config = getCognitoConfig(); - if (!config) { throw new UnauthorizedException(); } @@ -96,7 +95,6 @@ export class CognitoJWTGuard implements CanActivate { const client = this.jwks; - // Function to get the public key for the token to verify the JWT token signature const getKey: jwt.GetPublicKeyOrSecret = (header, callback) => { const kid = header.kid; // The key ID (kid) from the JWT header if (!kid) { @@ -122,10 +120,12 @@ export class CognitoJWTGuard implements CanActivate { reject(new UnauthorizedException()); return; } - // If the token is valid, return the JWT payload - const payload = decoded as CognitoJwtPayload; - // If the audience is not our own client ID, return an unauthorized exception - if (!isAudienceValid(payload, config.clientId)) { + if (!isAccessTokenPayload(decoded)) { + reject(new UnauthorizedException()); + return; + } + const payload = decoded; + if (!isAccessTokenValid(payload, config.clientId)) { reject(new UnauthorizedException()); return; } diff --git a/apps/backend/src/aws/cognito/cognito.service.ts b/apps/backend/src/aws/cognito/cognito.service.ts index 4b3ce679d..d5de4d55c 100644 --- a/apps/backend/src/aws/cognito/cognito.service.ts +++ b/apps/backend/src/aws/cognito/cognito.service.ts @@ -1,18 +1,34 @@ import { Injectable } from '@nestjs/common'; import { Request } from 'express'; -import { CognitoJwtPayload } from './cognito.types'; +import { AccessTokenPayload } from './cognito.types'; import { isAuthEnabled } from './cognito.config'; @Injectable() export class CognitoService { - // Extracts the verified JWT payload from request.user, as set by CognitoJWTGuard. - // Returns null if auth is disabled or no valid token was attached. - getUser(request: Request): CognitoJwtPayload | null { + /** + * Retrieves the authenticated user's verified access token payload from the request. + * + * The {@link CognitoJWTGuard} verifies the incoming bearer token and attaches the + * decoded payload to `request.user` before the route handler runs. This method reads + * that payload back out in a type-safe way, since Express's `Request` type has no + * knowledge of the `user` property the guard adds. + * + * @param request - The incoming Express request, expected to have passed through {@link CognitoJWTGuard}. + * @returns The verified {@link AccessTokenPayload} for the authenticated user, or `null` + * if authentication is disabled or no valid token was attached to the request. + */ + getUser(request: Request): AccessTokenPayload | null { // If authentication is not enabled, return null if (!isAuthEnabled()) { return null; } - // Return the user from the request - return (request as Request & { user: CognitoJwtPayload }).user ?? null; + // The CognitoJWTGuard attaches the verified JWT payload to request.user, + // but Express's Request type doesn't know about it, so we widen the type. + const authenticatedRequest = request as Request & { + user: AccessTokenPayload; + }; + + // user may be undefined if no token was attached; normalize that to null. + return authenticatedRequest.user ?? null; } } diff --git a/apps/backend/src/aws/cognito/cognito.types.ts b/apps/backend/src/aws/cognito/cognito.types.ts index 96f47cf48..aa3ff3bab 100644 --- a/apps/backend/src/aws/cognito/cognito.types.ts +++ b/apps/backend/src/aws/cognito/cognito.types.ts @@ -1,24 +1,25 @@ -// Cognito ID token: https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-id-token.html +// We only use access tokens to verify the user's identity and allow access to protected resources. // Cognito access token: https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-access-token.html - -export interface CognitoJwtPayload { +export interface AccessTokenPayload { sub: string; // Subject (unique identifier for the user) 'cognito:groups'?: string[]; // Groups (ex: ['admin', 'user']) iss: string; // Issuer (ex: https://cognito-idp..amazonaws.com/) - token_use: 'id' | 'access'; // Token use (ID or access token from Cognito) - aud?: string | string[]; // Audience: Client ID this token is intended for (ex: ) + token_use: 'access'; // Token use (ID or access token from Cognito) client_id?: string; // Client ID used during authentication (ex: ) exp: number; // Expiration time (Unix timestamp) iat: number; // Issued at time (Unix timestamp) email?: string; // Email (ex: test@example.com) } -// Runtime type guard for CognitoJwtPayload. jwt.verify proves the token is -// authentic, but not that the decoded claims have the shape we expect, so we -// validate the required fields here before trusting the payload. -export function isCognitoJwtPayload( +/** + * Runtime type guard for {@link AccessTokenPayload}. + * + * @param value - The value to check, typically a decoded JWT payload. + * @returns `true` if `value` matches the {@link AccessTokenPayload} shape. + */ +export function isAccessTokenPayload( value: unknown, -): value is CognitoJwtPayload { +): value is AccessTokenPayload { if (typeof value !== 'object' || value === null) { return false; } From e13d23cb2764873f0af3be9af7bcaccc4063d7e1 Mon Sep 17 00:00:00 2001 From: chnnick Date: Thu, 11 Jun 2026 16:36:58 -0700 Subject: [PATCH 30/32] updated tests with new groupings --- .../src/aws/cognito/cognito.guard.spec.ts | 382 +++++++++--------- .../src/aws/cognito/cognito.service.spec.ts | 42 +- 2 files changed, 212 insertions(+), 212 deletions(-) diff --git a/apps/backend/src/aws/cognito/cognito.guard.spec.ts b/apps/backend/src/aws/cognito/cognito.guard.spec.ts index 05ca00cb4..cbe338184 100644 --- a/apps/backend/src/aws/cognito/cognito.guard.spec.ts +++ b/apps/backend/src/aws/cognito/cognito.guard.spec.ts @@ -4,7 +4,7 @@ import * as jwt from 'jsonwebtoken'; import { IS_PUBLIC_KEY } from './cognito.decorator'; import { CognitoJWTGuard } from './cognito.guard'; -import { CognitoJwtPayload } from './cognito.types'; +import { AccessTokenPayload } from './cognito.types'; jest.mock('jsonwebtoken'); // Fake the jwks-rsa module to return a mock public key @@ -34,17 +34,45 @@ function setActiveEnv(): void { Object.assign(process.env, ACTIVE_ENV); } -// Helper to simulate execution context when request hits a route +// Builds a structurally valid Cognito access token payload (sub/iss/exp/iat present). +// Pass overrides to set the client_id/token_use claims or to break a required claim. +function buildPayload( + overrides: Partial = {}, +): Record { + return { + sub: 'user-1', + iss: `https://cognito-idp.${ACTIVE_ENV.COGNITO_REGION}.amazonaws.com/${ACTIVE_ENV.COGNITO_USER_POOL_ID}`, + exp: 9999999999, + iat: 1, + ...overrides, + }; +} + +// Makes the mocked jwt.verify succeed with the given decoded value. +function mockVerifyResolves(decoded: unknown): void { + (jwt.verify as jest.Mock).mockImplementation( + (_token, _getKey, _options, callback) => callback(null, decoded), + ); +} + +// Makes the mocked jwt.verify fail with the given error. +function mockVerifyRejects(error: Error): void { + (jwt.verify as jest.Mock).mockImplementation( + (_token, _getKey, _options, callback) => callback(error, undefined), + ); +} + +// Builds ExecutionContext and request with given Authorization header so the guard can be exercised function createContext(authorization?: string): { context: ExecutionContext; - request: Request & { user?: CognitoJwtPayload }; + request: Request & { user?: AccessTokenPayload }; } { - // Request with authorization header (if provided) + // Build request with authorization header (if provided) const request = { headers: authorization ? { authorization } : {}, - } as Request & { user?: CognitoJwtPayload }; + } as Request & { user?: AccessTokenPayload }; - // Execution context with switchToHttp method that returns the request + // Build execution context with switchToHttp method that returns the request const context = { switchToHttp: () => ({ getRequest: () => request }), getHandler: () => jest.fn(), @@ -76,177 +104,170 @@ describe('CognitoJWTGuard', () => { setActiveEnv(); }); - it('rejects routes without a Bearer token', async () => { - const { context } = createContext(); - - await expect(guard.canActivate(context)).rejects.toThrow( - UnauthorizedException, - ); - }); - - it('rejects routes with non-Bearer authorization', async () => { - const { context } = createContext('Basic abc1234567890'); - - await expect(guard.canActivate(context)).rejects.toThrow( - UnauthorizedException, - ); - expect(jwt.verify).not.toHaveBeenCalled(); + // Rejections that happen before jwt.verify is ever called, based purely on + // the Authorization header. + describe('Bearer token extraction', () => { + it('rejects routes without a Bearer token', async () => { + const { context } = createContext(); + + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + expect(jwt.verify).not.toHaveBeenCalled(); + }); + + it('rejects routes with non-Bearer authorization', async () => { + const { context } = createContext('Basic abc1234567890'); + + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + expect(jwt.verify).not.toHaveBeenCalled(); + }); + + it('rejects routes with an empty Bearer token', async () => { + const { context } = createContext('Bearer '); + + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + expect(jwt.verify).not.toHaveBeenCalled(); + }); + + it('rejects routes with a whitespace-only Bearer token', async () => { + const { context } = createContext('Bearer '); + + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + expect(jwt.verify).not.toHaveBeenCalled(); + }); }); - it('rejects routes with empty Bearer token', async () => { - const { context } = createContext('Bearer '); - - await expect(guard.canActivate(context)).rejects.toThrow( - UnauthorizedException, - ); - expect(jwt.verify).not.toHaveBeenCalled(); - }); + // Rejections from jwt.verify itself or from a decoded value that is not a + // well-formed access token payload object. + describe('token verification and payload shape', () => { + it('rejects routes when token verification fails', async () => { + mockVerifyRejects(new Error('invalid signature')); - it('rejects routes with an invalid token', async () => { - (jwt.verify as jest.Mock).mockImplementation( - (_token, _getKey, _options, callback) => { - callback(new Error('invalid signature'), undefined); - }, - ); + const { context } = createContext('Bearer bad-token'); - const { context } = createContext('Bearer bad-token'); + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + }); - await expect(guard.canActivate(context)).rejects.toThrow( - UnauthorizedException, - ); - }); + it('rejects routes when the decoded token is a string', async () => { + mockVerifyResolves('not-an-object'); - it('allows routes with a valid access token (client_id)', async () => { - const payload: CognitoJwtPayload = { - sub: 'user-1', - client_id: ACTIVE_ENV.COGNITO_CLIENT_ID, - token_use: 'access', - iss: `https://cognito-idp.${ACTIVE_ENV.COGNITO_REGION}.amazonaws.com/${ACTIVE_ENV.COGNITO_USER_POOL_ID}`, - exp: 9999999999, - iat: 1, - }; - (jwt.verify as jest.Mock).mockImplementation( - (_token, _getKey, _options, callback) => { - callback(null, payload); - }, - ); - - const { context, request } = createContext('Bearer access-token'); + const { context } = createContext('Bearer weird-token'); - await expect(guard.canActivate(context)).resolves.toBe(true); - expect(request.user).toEqual(payload); - }); + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + }); - it('rejects routes when client_id does not match', async () => { - (jwt.verify as jest.Mock).mockImplementation( - (_token, _getKey, _options, callback) => { - callback(null, { - sub: 'user-1', - client_id: 'wrong-client-id', + it('rejects routes when the payload is missing a required claim', async () => { + // sub is required; an otherwise-valid access token without it must be rejected. + mockVerifyResolves( + buildPayload({ + sub: undefined, token_use: 'access', - iss: `https://cognito-idp.${ACTIVE_ENV.COGNITO_REGION}.amazonaws.com/${ACTIVE_ENV.COGNITO_USER_POOL_ID}`, - exp: 9999999999, - iat: 1, - }); - }, - ); - - const { context } = createContext('Bearer access-token'); - - await expect(guard.canActivate(context)).rejects.toThrow( - UnauthorizedException, - ); - }); + client_id: ACTIVE_ENV.COGNITO_CLIENT_ID, + }), + ); - it('allows routes with a valid ID token (aud)', async () => { - const payload: CognitoJwtPayload = { - sub: 'user-1', - aud: ACTIVE_ENV.COGNITO_CLIENT_ID, - token_use: 'id', - iss: `https://cognito-idp.${ACTIVE_ENV.COGNITO_REGION}.amazonaws.com/${ACTIVE_ENV.COGNITO_USER_POOL_ID}`, - exp: 9999999999, - iat: 1, - }; - (jwt.verify as jest.Mock).mockImplementation( - (_token, _getKey, _options, callback) => { - callback(null, payload); - }, - ); - - const { context, request } = createContext('Bearer id-token'); + const { context } = createContext('Bearer malformed-token'); - await expect(guard.canActivate(context)).resolves.toBe(true); - expect(request.user).toEqual(payload); + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + }); }); - it('rejects routes when audience does not match client id', async () => { - (jwt.verify as jest.Mock).mockImplementation( - (_token, _getKey, _options, callback) => { - callback(null, { - sub: 'user-1', - aud: 'wrong-client', - iss: `https://cognito-idp.${ACTIVE_ENV.COGNITO_REGION}.amazonaws.com/${ACTIVE_ENV.COGNITO_USER_POOL_ID}`, - exp: 9999999999, - iat: 1, - }); - }, - ); - - const { context } = createContext('Bearer token'); - - await expect(guard.canActivate(context)).rejects.toThrow( - UnauthorizedException, - ); - }); - - it('rejects routes when payload has no audience claim', async () => { - (jwt.verify as jest.Mock).mockImplementation( - (_token, _getKey, _options, callback) => { - callback(null, { - sub: 'user-1', - iss: `https://cognito-idp.${ACTIVE_ENV.COGNITO_REGION}.amazonaws.com/${ACTIVE_ENV.COGNITO_USER_POOL_ID}`, - exp: 9999999999, - iat: 1, - }); - }, - ); - - const { context } = createContext('Bearer token'); - - await expect(guard.canActivate(context)).rejects.toThrow( - UnauthorizedException, - ); - }); - - it('allows @Public routes without a token', async () => { - reflector.getAllAndOverride.mockImplementation( - (key) => key === IS_PUBLIC_KEY, - ); - - const { context } = createContext(); - - await expect(guard.canActivate(context)).resolves.toBe(true); - expect(jwt.verify).not.toHaveBeenCalled(); + // Rejections from the access-token authorization checks: the token must be + // an access token (token_use) whose client_id matches our app client. + describe('token type and value validation', () => { + it('rejects ID tokens (token_use is not "access")', async () => { + // Only access tokens are accepted; an ID token carrying the right + // client_id must still be rejected. + mockVerifyResolves( + buildPayload({ + token_use: 'id' as AccessTokenPayload['token_use'], + client_id: ACTIVE_ENV.COGNITO_CLIENT_ID, + }), + ); + + const { context } = createContext('Bearer id-token'); + + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + }); + + it('rejects access tokens whose client_id does not match', async () => { + mockVerifyResolves( + buildPayload({ token_use: 'access', client_id: 'wrong-client-id' }), + ); + + const { context } = createContext('Bearer access-token'); + + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + }); + + it('rejects access tokens with no client_id claim', async () => { + mockVerifyResolves(buildPayload({ token_use: 'access' })); + + const { context } = createContext('Bearer access-token'); + + await expect(guard.canActivate(context)).rejects.toThrow( + UnauthorizedException, + ); + }); + + it('allows routes with a valid access token (client_id)', async () => { + const payload = buildPayload({ + client_id: ACTIVE_ENV.COGNITO_CLIENT_ID, + token_use: 'access', + }); + mockVerifyResolves(payload); + + const { context, request } = createContext('Bearer access-token'); + + await expect(guard.canActivate(context)).resolves.toBe(true); + expect(request.user).toEqual(payload); + }); }); - it('allows @Public routes with any bearer token', async () => { - reflector.getAllAndOverride.mockImplementation( - (key) => key === IS_PUBLIC_KEY, - ); - - const { context, request } = createContext('Bearer bad-token'); - - await expect(guard.canActivate(context)).resolves.toBe(true); - expect(jwt.verify).not.toHaveBeenCalled(); - expect(request.user).toBeUndefined(); + // Routes marked @Public bypass token extraction and verification entirely. + describe('@Public routes', () => { + beforeEach(() => { + reflector.getAllAndOverride.mockImplementation( + (key) => key === IS_PUBLIC_KEY, + ); + }); + + it('allows @Public routes without a token', async () => { + const { context, request } = createContext(); + + await expect(guard.canActivate(context)).resolves.toBe(true); + expect(jwt.verify).not.toHaveBeenCalled(); + expect(request.user).toBeUndefined(); + }); + + it('allows @Public routes without verifying any bearer token', async () => { + const { context, request } = createContext('Bearer bad-token'); + + await expect(guard.canActivate(context)).resolves.toBe(true); + expect(jwt.verify).not.toHaveBeenCalled(); + expect(request.user).toBeUndefined(); + }); }); }); describe('when auth is inactive', () => { - beforeEach(() => { - delete process.env.COGNITO_USER_POOL_ID; - }); - it('allows requests without a token', async () => { const { context } = createContext(); @@ -254,45 +275,26 @@ describe('CognitoJWTGuard', () => { expect(jwt.verify).not.toHaveBeenCalled(); }); - it('allows requests with a bearer token', async () => { - const { context, request } = createContext('Bearer bad-token'); + it('ignores a bearer token when auth is disabled', async () => { + const { context, request } = createContext('Bearer any-token'); await expect(guard.canActivate(context)).resolves.toBe(true); expect(jwt.verify).not.toHaveBeenCalled(); expect(request.user).toBeUndefined(); }); - it('allows routes when COGNITO_USER_POOL_ID is missing (auth disabled)', async () => { - process.env.COGNITO_CLIENT_ID = ACTIVE_ENV.COGNITO_CLIENT_ID; - process.env.COGNITO_REGION = ACTIVE_ENV.COGNITO_REGION; - delete process.env.COGNITO_USER_POOL_ID; - - const { context } = createContext('Bearer token'); - - await expect(guard.canActivate(context)).resolves.toBe(true); - expect(jwt.verify).not.toHaveBeenCalled(); - }); - - it('allows routes when COGNITO_CLIENT_ID is missing (auth disabled)', async () => { - process.env.COGNITO_USER_POOL_ID = ACTIVE_ENV.COGNITO_USER_POOL_ID; - process.env.COGNITO_REGION = ACTIVE_ENV.COGNITO_REGION; - delete process.env.COGNITO_CLIENT_ID; + // Auth requires all three env vars; a single missing one disables it. + it.each(ENV_KEYS)( + 'disables auth when %s is missing', + async (missingKey) => { + setActiveEnv(); + delete process.env[missingKey]; - const { context } = createContext('Bearer token'); + const { context } = createContext('Bearer token'); - await expect(guard.canActivate(context)).resolves.toBe(true); - expect(jwt.verify).not.toHaveBeenCalled(); - }); - - it('allows routes when COGNITO_REGION is missing (auth disabled)', async () => { - process.env.COGNITO_USER_POOL_ID = ACTIVE_ENV.COGNITO_USER_POOL_ID; - process.env.COGNITO_CLIENT_ID = ACTIVE_ENV.COGNITO_CLIENT_ID; - delete process.env.COGNITO_REGION; - - const { context } = createContext('Bearer token'); - - await expect(guard.canActivate(context)).resolves.toBe(true); - expect(jwt.verify).not.toHaveBeenCalled(); - }); + await expect(guard.canActivate(context)).resolves.toBe(true); + expect(jwt.verify).not.toHaveBeenCalled(); + }, + ); }); }); diff --git a/apps/backend/src/aws/cognito/cognito.service.spec.ts b/apps/backend/src/aws/cognito/cognito.service.spec.ts index 6a790cf77..0da172c0f 100644 --- a/apps/backend/src/aws/cognito/cognito.service.spec.ts +++ b/apps/backend/src/aws/cognito/cognito.service.spec.ts @@ -1,9 +1,15 @@ import { Request } from 'express'; import { CognitoService } from './cognito.service'; -import { CognitoJwtPayload } from './cognito.types'; +import { AccessTokenPayload } from './cognito.types'; -type TestRequest = Request & { user?: CognitoJwtPayload }; +type TestRequest = Request & { user?: AccessTokenPayload }; + +const ENV_KEYS = [ + 'COGNITO_USER_POOL_ID', + 'COGNITO_CLIENT_ID', + 'COGNITO_REGION', +] as const; describe('CognitoService', () => { describe('getUser', () => { @@ -18,33 +24,25 @@ describe('CognitoService', () => { // Clean up environment variables after each test afterEach(() => { - delete process.env.COGNITO_USER_POOL_ID; - delete process.env.COGNITO_REGION; - delete process.env.COGNITO_CLIENT_ID; - }); - - it('returns null when there is no user pool ID env variable, but client id and region exist', () => { - delete process.env.COGNITO_USER_POOL_ID; - - expect(service.getUser({ headers: {} } as TestRequest)).toBeNull(); + ENV_KEYS.forEach((key) => delete process.env[key]); }); - it('returns null when there is no region env variable, but client id and user pool ID exist', () => { - delete process.env.COGNITO_REGION; + // Auth requires all three env vars; a single missing one disables it, + // so getUser returns null regardless of the request. + it.each(ENV_KEYS)( + 'returns null when %s is missing (auth disabled)', + (missingKey) => { + delete process.env[missingKey]; - expect(service.getUser({ headers: {} } as TestRequest)).toBeNull(); - }); - - it('returns null when there is no client ID env variable, but user pool id and region exist', () => { - delete process.env.COGNITO_CLIENT_ID; - - expect(service.getUser({ headers: {} } as TestRequest)).toBeNull(); - }); + expect(service.getUser({ headers: {} } as TestRequest)).toBeNull(); + }, + ); it('returns the JWT payload when auth is active and user is on the request', () => { - const payload: CognitoJwtPayload = { + const payload: AccessTokenPayload = { sub: 'user-1', client_id: 'test-client', + token_use: 'access', iss: 'https://cognito-idp.us-east-2.amazonaws.com/us-east-2_TestPool', exp: 9999999999, iat: 1, From 57834c9897c32206cb348204b57000eb9115d726 Mon Sep 17 00:00:00 2001 From: chnnick Date: Thu, 11 Jun 2026 19:06:05 -0700 Subject: [PATCH 31/32] rename new payload type in readme --- apps/backend/src/aws/cognito/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/backend/src/aws/cognito/README.md b/apps/backend/src/aws/cognito/README.md index 1bee33b02..d6452293b 100644 --- a/apps/backend/src/aws/cognito/README.md +++ b/apps/backend/src/aws/cognito/README.md @@ -41,7 +41,7 @@ Copy placeholders from the repo root `example.env` into `.env` (or your deployme - **Verification** — `CognitoJWTGuard` is the only component that validates JWTs (signature, issuer, audience). - **Global guard** — `CognitoModule` registers `CognitoJWTGuard` as an `APP_GUARD`, so every route is protected by default. You do **not** need `@UseGuards(CognitoJWTGuard)` on controllers when using this setup. -- **`request.user`** — After a successful check, the guard sets `request.user` to the decoded JWT payload (`CognitoJwtPayload`: `sub`, `client_id`, `cognito:groups`, `token_use`, etc.) +- **`request.user`** — After a successful check, the guard sets `request.user` to the decoded JWT payload (`AccessTokenPayload`: `sub`, `client_id`, `cognito:groups`, `token_use`, etc.) ### Using Cognito in your app (recommended + implemented: global guard) @@ -77,7 +77,7 @@ export class HealthController { ### `CognitoService.getUser()` -Inject `CognitoService` to extract the same `CognitoJwtPayload` decoded token payload the guard attached to `request.user`: +Inject `CognitoService` to extract the same `AccessTokenPayload` decoded token payload the guard attached to `request.user`: ```typescript @Get('me') @@ -106,7 +106,7 @@ The guard validates access tokens by > Do not use the ID token for API authorization. ID tokens are intended for your client application to establish who the user is; passing them to a backend API exposes identity claims unnecessarily and confuses authentication with authorization. Backend APIs should validate access tokens only. The token_use check in isAccessTokenValid below enforces this. ``` -function isAccessTokenValid(payload: CognitoJwtPayload, clientId: string): boolean { +function isAccessTokenValid(payload: AccessTokenPayload, clientId: string): boolean { if (payload.token_use !== 'access') return false; return payload.client_id === clientId; } From 836bb28522f1f91957b72a3e6f47418190cd38e9 Mon Sep 17 00:00:00 2001 From: nick! Date: Thu, 11 Jun 2026 22:24:17 -0400 Subject: [PATCH 32/32] typo --- apps/backend/src/aws/cognito/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/backend/src/aws/cognito/README.md b/apps/backend/src/aws/cognito/README.md index d6452293b..596d1149a 100644 --- a/apps/backend/src/aws/cognito/README.md +++ b/apps/backend/src/aws/cognito/README.md @@ -121,5 +121,4 @@ in that allowlist instead of simply an equality check. ## Helpful Resources for understanding Auth! - The most amazing explanation of authn (OAUTH 2.0) and authz (OIDC) you'll ever watch: https://www.youtube.com/watch?v=996OiexHze0&t=2126s - Difference between id and access tokens: https://auth0.com/blog/id-token-access-token-what-is-the-difference/ -- The most amazing - Using AWS to verify JWT: https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html