Compare commits

...

3 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
d035bcc9a3 Fix throttle TTL to use milliseconds per NestJS v6 docs
Co-authored-by: abouolia <2197422+abouolia@users.noreply.github.com>
2025-10-30 20:05:18 +00:00
copilot-swe-agent[bot]
d9e07fdd99 Initial plan 2025-10-30 20:02:23 +00:00
Ahmed Bouhuolia
8c5a359610 feat: api endpoints throttle 2025-10-30 21:56:41 +02:00
8 changed files with 217 additions and 119 deletions

View File

@@ -39,6 +39,7 @@
"@casl/ability": "^5.4.3",
"@lemonsqueezy/lemonsqueezy.js": "^2.2.0",
"@liaoliaots/nestjs-redis": "^10.0.0",
"@nest-lab/throttler-storage-redis": "^1.1.0",
"@nestjs/bull": "^10.2.1",
"@nestjs/bullmq": "^10.2.2",
"@nestjs/cache-manager": "^2.2.2",

View File

@@ -14,6 +14,7 @@ import jwt from './jwt';
import mail from './mail';
import loops from './loops';
import bankfeed from './bankfeed';
import throttle from './throttle';
export const config = [
systemDatabase,
@@ -32,4 +33,5 @@ export const config = [
mail,
loops,
bankfeed,
throttle,
];

View File

@@ -0,0 +1,16 @@
import { registerAs } from '@nestjs/config';
export default registerAs('throttle', () => ({
global: {
// TTL in milliseconds (NestJS throttler v6+)
ttl: parseInt(process.env.THROTTLE_GLOBAL_TTL ?? '60000', 10),
limit: parseInt(process.env.THROTTLE_GLOBAL_LIMIT ?? '100', 10),
},
auth: {
// TTL in milliseconds (NestJS throttler v6+)
ttl: parseInt(process.env.THROTTLE_AUTH_TTL ?? '60000', 10),
limit: parseInt(process.env.THROTTLE_AUTH_LIMIT ?? '10', 10),
},
}));

View File

@@ -1,7 +1,7 @@
import { MiddlewareConsumer, Module, RequestMethod } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { EventEmitterModule } from '@nestjs/event-emitter';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';
import { join } from 'path';
import { ServeStaticModule } from '@nestjs/serve-static';
import { RedisModule } from '@liaoliaots/nestjs-redis';
@@ -95,6 +95,8 @@ import { BankingCategorizeModule } from '../BankingCategorize/BankingCategorize.
import { TenantModelsInitializeModule } from '../Tenancy/TenantModelsInitialize.module';
import { BillLandedCostsModule } from '../BillLandedCosts/BillLandedCosts.module';
import { SocketModule } from '../Socket/Socket.module';
import { ThrottlerGuard } from '@nestjs/throttler';
import { AppThrottleModule } from './AppThrottle.module';
@Module({
imports: [
@@ -126,6 +128,7 @@ import { SocketModule } from '../Socket/Socket.module';
],
}),
PassportModule,
AppThrottleModule,
BullModule.forRootAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => ({
@@ -231,6 +234,10 @@ import { SocketModule } from '../Socket/Socket.module';
],
controllers: [AppController],
providers: [
{
provide: APP_GUARD,
useClass: ThrottlerGuard,
},
{
provide: APP_INTERCEPTOR,
useClass: SerializeInterceptor,

View File

@@ -0,0 +1,48 @@
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { ThrottlerModule } from '@nestjs/throttler';
import { ThrottlerStorageRedisService } from '@nest-lab/throttler-storage-redis';
@Module({
imports: [
ThrottlerModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (configService: ConfigService) => {
const host = configService.get<string>('redis.host') || 'localhost';
const port = Number(configService.get<number>('redis.port') || 6379);
const password = configService.get<string>('redis.password');
const db = configService.get<number>('redis.db');
const globalTtl = configService.get<number>('throttle.global.ttl');
const globalLimit = configService.get<number>('throttle.global.limit');
const authTtl = configService.get<number>('throttle.auth.ttl');
const authLimit = configService.get<number>('throttle.auth.limit');
return {
throttlers: [
{
name: 'default',
ttl: globalTtl,
limit: globalLimit,
},
{
name: 'auth',
ttl: authTtl,
limit: authLimit,
},
],
storage: new ThrottlerStorageRedisService({
host,
port,
password,
db,
}),
};
},
}),
],
})
export class AppThrottleModule { }

View File

@@ -8,6 +8,7 @@ import {
Request,
UseGuards,
} from '@nestjs/common';
import { Throttle } from '@nestjs/throttler';
import {
ApiTags,
ApiOperation,
@@ -28,6 +29,7 @@ import { SystemUser } from '../System/models/SystemUser';
@ApiTags('Auth')
@ApiExcludeController()
@PublicRoute()
@Throttle({ auth: {} })
export class AuthController {
constructor(
private readonly authApp: AuthenticationApplication,

View File

@@ -6,6 +6,7 @@ import {
} from '@nestjs/swagger';
import { GetAuthenticatedAccount } from './queries/GetAuthedAccount.service';
import { Controller, Get, Post } from '@nestjs/common';
import { Throttle } from '@nestjs/throttler';
import { IgnoreTenantSeededRoute } from '../Tenancy/EnsureTenantIsSeeded.guards';
import { IgnoreTenantInitializedRoute } from '../Tenancy/EnsureTenantIsInitialized.guard';
import { AuthenticationApplication } from './AuthApplication.sevice';
@@ -18,11 +19,12 @@ import { IgnoreUserVerifiedRoute } from './guards/EnsureUserVerified.guard';
@IgnoreTenantSeededRoute()
@IgnoreTenantInitializedRoute()
@IgnoreUserVerifiedRoute()
@Throttle({ auth: {} })
export class AuthedController {
constructor(
private readonly getAuthedAccountService: GetAuthenticatedAccount,
private readonly authApp: AuthenticationApplication,
) {}
) { }
@Post('/signup/verify/resend')
@ApiOperation({ summary: 'Resend the signup confirmation message' })

254
pnpm-lock.yaml generated
View File

@@ -63,6 +63,9 @@ importers:
'@liaoliaots/nestjs-redis':
specifier: ^10.0.0
version: 10.0.0(@nestjs/common@10.4.7)(@nestjs/core@10.4.7)(ioredis@5.6.0)
'@nest-lab/throttler-storage-redis':
specifier: ^1.1.0
version: 1.1.0(@nestjs/common@10.4.7)(@nestjs/core@10.4.7)(@nestjs/throttler@6.2.1)(ioredis@5.6.0)(reflect-metadata@0.2.2)
'@nestjs/bull':
specifier: ^10.2.1
version: 10.2.2(@nestjs/common@10.4.7)(@nestjs/core@10.4.7)(bull@4.16.4)
@@ -1235,7 +1238,7 @@ packages:
'@smithy/util-middleware': 3.0.0
'@smithy/util-retry': 3.0.0
'@smithy/util-utf8': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
transitivePeerDependencies:
- '@aws-sdk/client-sts'
- aws-crt
@@ -1282,7 +1285,7 @@ packages:
'@smithy/util-middleware': 3.0.0
'@smithy/util-retry': 3.0.0
'@smithy/util-utf8': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
dev: false
@@ -1330,7 +1333,7 @@ packages:
'@smithy/util-middleware': 3.0.0
'@smithy/util-retry': 3.0.0
'@smithy/util-utf8': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
dev: false
@@ -1345,7 +1348,7 @@ packages:
'@smithy/smithy-client': 3.0.1
'@smithy/types': 3.0.0
fast-xml-parser: 4.2.5
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/credential-provider-env@3.577.0:
@@ -1355,7 +1358,7 @@ packages:
'@aws-sdk/types': 3.577.0
'@smithy/property-provider': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/credential-provider-http@3.582.0:
@@ -1370,7 +1373,7 @@ packages:
'@smithy/smithy-client': 3.0.1
'@smithy/types': 3.0.0
'@smithy/util-stream': 3.0.1
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/credential-provider-ini@3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0):
@@ -1389,7 +1392,7 @@ packages:
'@smithy/property-provider': 3.0.0
'@smithy/shared-ini-file-loader': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
transitivePeerDependencies:
- '@aws-sdk/client-sso-oidc'
- aws-crt
@@ -1410,7 +1413,7 @@ packages:
'@smithy/property-provider': 3.0.0
'@smithy/shared-ini-file-loader': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
transitivePeerDependencies:
- '@aws-sdk/client-sso-oidc'
- '@aws-sdk/client-sts'
@@ -1425,7 +1428,7 @@ packages:
'@smithy/property-provider': 3.0.0
'@smithy/shared-ini-file-loader': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/credential-provider-sso@3.583.0(@aws-sdk/client-sso-oidc@3.583.0):
@@ -1438,7 +1441,7 @@ packages:
'@smithy/property-provider': 3.0.0
'@smithy/shared-ini-file-loader': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
transitivePeerDependencies:
- '@aws-sdk/client-sso-oidc'
- aws-crt
@@ -1454,7 +1457,7 @@ packages:
'@aws-sdk/types': 3.577.0
'@smithy/property-provider': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/lib-storage@3.583.0(@aws-sdk/client-s3@3.583.0):
@@ -1470,7 +1473,7 @@ packages:
buffer: 5.6.0
events: 3.3.0
stream-browserify: 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-bucket-endpoint@3.577.0:
@@ -1483,7 +1486,7 @@ packages:
'@smithy/protocol-http': 4.0.0
'@smithy/types': 3.0.0
'@smithy/util-config-provider': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-expect-continue@3.577.0:
@@ -1493,7 +1496,7 @@ packages:
'@aws-sdk/types': 3.577.0
'@smithy/protocol-http': 4.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-flexible-checksums@3.577.0:
@@ -1507,7 +1510,7 @@ packages:
'@smithy/protocol-http': 4.0.0
'@smithy/types': 3.0.0
'@smithy/util-utf8': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-host-header@3.577.0:
@@ -1517,7 +1520,7 @@ packages:
'@aws-sdk/types': 3.577.0
'@smithy/protocol-http': 4.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-location-constraint@3.577.0:
@@ -1526,7 +1529,7 @@ packages:
dependencies:
'@aws-sdk/types': 3.577.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-logger@3.577.0:
@@ -1535,7 +1538,7 @@ packages:
dependencies:
'@aws-sdk/types': 3.577.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-recursion-detection@3.577.0:
@@ -1545,7 +1548,7 @@ packages:
'@aws-sdk/types': 3.577.0
'@smithy/protocol-http': 4.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-sdk-s3@3.582.0:
@@ -1560,7 +1563,7 @@ packages:
'@smithy/smithy-client': 3.0.1
'@smithy/types': 3.0.0
'@smithy/util-config-provider': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-signing@3.577.0:
@@ -1573,7 +1576,7 @@ packages:
'@smithy/signature-v4': 3.0.0
'@smithy/types': 3.0.0
'@smithy/util-middleware': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-ssec@3.577.0:
@@ -1582,7 +1585,7 @@ packages:
dependencies:
'@aws-sdk/types': 3.577.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/middleware-user-agent@3.583.0:
@@ -1593,7 +1596,7 @@ packages:
'@aws-sdk/util-endpoints': 3.583.0
'@smithy/protocol-http': 4.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/region-config-resolver@3.577.0:
@@ -1605,7 +1608,7 @@ packages:
'@smithy/types': 3.0.0
'@smithy/util-config-provider': 3.0.0
'@smithy/util-middleware': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/s3-request-presigner@3.583.0:
@@ -1631,7 +1634,7 @@ packages:
'@smithy/protocol-http': 4.0.0
'@smithy/signature-v4': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/token-providers@3.577.0(@aws-sdk/client-sso-oidc@3.583.0):
@@ -1645,7 +1648,7 @@ packages:
'@smithy/property-provider': 3.0.0
'@smithy/shared-ini-file-loader': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/types@3.577.0:
@@ -1653,14 +1656,14 @@ packages:
engines: {node: '>=16.0.0'}
dependencies:
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/util-arn-parser@3.568.0:
resolution: {integrity: sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==}
engines: {node: '>=16.0.0'}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/util-endpoints@3.583.0:
@@ -1670,7 +1673,7 @@ packages:
'@aws-sdk/types': 3.577.0
'@smithy/types': 3.0.0
'@smithy/util-endpoints': 2.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/util-format-url@3.577.0:
@@ -1680,14 +1683,14 @@ packages:
'@aws-sdk/types': 3.577.0
'@smithy/querystring-builder': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/util-locate-window@3.568.0:
resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==}
engines: {node: '>=16.0.0'}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/util-user-agent-browser@3.577.0:
@@ -1696,7 +1699,7 @@ packages:
'@aws-sdk/types': 3.577.0
'@smithy/types': 3.0.0
bowser: 2.11.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/util-user-agent-node@3.577.0:
@@ -1711,13 +1714,13 @@ packages:
'@aws-sdk/types': 3.577.0
'@smithy/node-config-provider': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/util-utf8-browser@3.259.0:
resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@aws-sdk/xml-builder@3.575.0:
@@ -1725,7 +1728,7 @@ packages:
engines: {node: '>=16.0.0'}
dependencies:
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@babel/code-frame@7.10.4:
@@ -6835,6 +6838,23 @@ packages:
tar-fs: 2.1.1
dev: true
/@nest-lab/throttler-storage-redis@1.1.0(@nestjs/common@10.4.7)(@nestjs/core@10.4.7)(@nestjs/throttler@6.2.1)(ioredis@5.6.0)(reflect-metadata@0.2.2):
resolution: {integrity: sha512-7DW8MuqoB+ubu8cWby9Vw56eAFqsHFfowEflHbmmAF2sNByRdzcR4ddcyoYLwL3zG53nLmvzUa4EXoHKB4RoaQ==}
peerDependencies:
'@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0
'@nestjs/core': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0
'@nestjs/throttler': '>=6.0.0'
ioredis: '>=5.0.0'
reflect-metadata: ^0.2.1
dependencies:
'@nestjs/common': 10.4.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)
'@nestjs/core': 10.4.7(@nestjs/common@10.4.7)(@nestjs/platform-express@10.4.7)(@nestjs/websockets@10.4.20)(reflect-metadata@0.2.2)(rxjs@7.8.1)
'@nestjs/throttler': 6.2.1(@nestjs/common@10.4.7)(@nestjs/core@10.4.7)(reflect-metadata@0.2.2)
ioredis: 5.6.0
reflect-metadata: 0.2.2
tslib: 2.8.1
dev: false
/@nestjs/bull-shared@10.2.2(@nestjs/common@10.4.7)(@nestjs/core@10.4.7):
resolution: {integrity: sha512-bMIEILYYovQWfdz6fCSTgqb/zuKyGmNSc7guB56MiZVW84JloUHb8330nNh3VWaamJKGtUzawbEoG2VR3uVeOg==}
peerDependencies:
@@ -7409,7 +7429,7 @@ packages:
hasBin: true
dependencies:
nx: 19.0.7
tslib: 2.8.0
tslib: 2.8.1
transitivePeerDependencies:
- '@swc-node/register'
- '@swc/core'
@@ -7440,7 +7460,7 @@ packages:
nx: 19.0.7
semver: 7.6.2
tmp: 0.2.3
tslib: 2.8.0
tslib: 2.8.1
yargs-parser: 21.1.1
dev: true
@@ -9100,20 +9120,20 @@ packages:
engines: {node: '>=16.0.0'}
dependencies:
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/chunked-blob-reader-native@3.0.0:
resolution: {integrity: sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==}
dependencies:
'@smithy/util-base64': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/chunked-blob-reader@3.0.0:
resolution: {integrity: sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/config-resolver@3.0.0:
@@ -9124,7 +9144,7 @@ packages:
'@smithy/types': 3.0.0
'@smithy/util-config-provider': 3.0.0
'@smithy/util-middleware': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/core@2.0.1:
@@ -9138,7 +9158,7 @@ packages:
'@smithy/smithy-client': 3.0.1
'@smithy/types': 3.0.0
'@smithy/util-middleware': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/credential-provider-imds@3.0.0:
@@ -9149,7 +9169,7 @@ packages:
'@smithy/property-provider': 3.0.0
'@smithy/types': 3.0.0
'@smithy/url-parser': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/eventstream-codec@3.0.0:
@@ -9158,7 +9178,7 @@ packages:
'@aws-crypto/crc32': 3.0.0
'@smithy/types': 3.0.0
'@smithy/util-hex-encoding': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/eventstream-serde-browser@3.0.0:
@@ -9167,7 +9187,7 @@ packages:
dependencies:
'@smithy/eventstream-serde-universal': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/eventstream-serde-config-resolver@3.0.0:
@@ -9175,7 +9195,7 @@ packages:
engines: {node: '>=16.0.0'}
dependencies:
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/eventstream-serde-node@3.0.0:
@@ -9184,7 +9204,7 @@ packages:
dependencies:
'@smithy/eventstream-serde-universal': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/eventstream-serde-universal@3.0.0:
@@ -9193,7 +9213,7 @@ packages:
dependencies:
'@smithy/eventstream-codec': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/fetch-http-handler@3.0.1:
@@ -9203,7 +9223,7 @@ packages:
'@smithy/querystring-builder': 3.0.0
'@smithy/types': 3.0.0
'@smithy/util-base64': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/hash-blob-browser@3.0.0:
@@ -9212,7 +9232,7 @@ packages:
'@smithy/chunked-blob-reader': 3.0.0
'@smithy/chunked-blob-reader-native': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/hash-node@3.0.0:
@@ -9222,7 +9242,7 @@ packages:
'@smithy/types': 3.0.0
'@smithy/util-buffer-from': 3.0.0
'@smithy/util-utf8': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/hash-stream-node@3.0.0:
@@ -9231,21 +9251,21 @@ packages:
dependencies:
'@smithy/types': 3.0.0
'@smithy/util-utf8': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/invalid-dependency@3.0.0:
resolution: {integrity: sha512-F6wBBaEFgJzj0s4KUlliIGPmqXemwP6EavgvDqYwCH40O5Xr2iMHvS8todmGVZtuJCorBkXsYLyTu4PuizVq5g==}
dependencies:
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/is-array-buffer@3.0.0:
resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==}
engines: {node: '>=16.0.0'}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/md5-js@3.0.0:
@@ -9253,7 +9273,7 @@ packages:
dependencies:
'@smithy/types': 3.0.0
'@smithy/util-utf8': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/middleware-content-length@3.0.0:
@@ -9262,7 +9282,7 @@ packages:
dependencies:
'@smithy/protocol-http': 4.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/middleware-endpoint@3.0.0:
@@ -9275,7 +9295,7 @@ packages:
'@smithy/types': 3.0.0
'@smithy/url-parser': 3.0.0
'@smithy/util-middleware': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/middleware-retry@3.0.1:
@@ -9289,7 +9309,7 @@ packages:
'@smithy/types': 3.0.0
'@smithy/util-middleware': 3.0.0
'@smithy/util-retry': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
uuid: 9.0.1
dev: false
@@ -9298,7 +9318,7 @@ packages:
engines: {node: '>=16.0.0'}
dependencies:
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/middleware-stack@3.0.0:
@@ -9306,7 +9326,7 @@ packages:
engines: {node: '>=16.0.0'}
dependencies:
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/node-config-provider@3.0.0:
@@ -9316,7 +9336,7 @@ packages:
'@smithy/property-provider': 3.0.0
'@smithy/shared-ini-file-loader': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/node-http-handler@3.0.0:
@@ -9327,7 +9347,7 @@ packages:
'@smithy/protocol-http': 4.0.0
'@smithy/querystring-builder': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/property-provider@3.0.0:
@@ -9335,7 +9355,7 @@ packages:
engines: {node: '>=16.0.0'}
dependencies:
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/protocol-http@4.0.0:
@@ -9343,7 +9363,7 @@ packages:
engines: {node: '>=16.0.0'}
dependencies:
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/querystring-builder@3.0.0:
@@ -9352,7 +9372,7 @@ packages:
dependencies:
'@smithy/types': 3.0.0
'@smithy/util-uri-escape': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/querystring-parser@3.0.0:
@@ -9360,7 +9380,7 @@ packages:
engines: {node: '>=16.0.0'}
dependencies:
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/service-error-classification@3.0.0:
@@ -9375,7 +9395,7 @@ packages:
engines: {node: '>=16.0.0'}
dependencies:
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/signature-v4@3.0.0:
@@ -9388,7 +9408,7 @@ packages:
'@smithy/util-middleware': 3.0.0
'@smithy/util-uri-escape': 3.0.0
'@smithy/util-utf8': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/smithy-client@3.0.1:
@@ -9400,14 +9420,14 @@ packages:
'@smithy/protocol-http': 4.0.0
'@smithy/types': 3.0.0
'@smithy/util-stream': 3.0.1
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/types@3.0.0:
resolution: {integrity: sha512-VvWuQk2RKFuOr98gFhjca7fkBS+xLLURT8bUjk5XQoV0ZLm7WPwWPPY3/AwzTLuUBDeoKDCthfe1AsTUWaSEhw==}
engines: {node: '>=16.0.0'}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/url-parser@3.0.0:
@@ -9415,7 +9435,7 @@ packages:
dependencies:
'@smithy/querystring-parser': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/util-base64@3.0.0:
@@ -9424,20 +9444,20 @@ packages:
dependencies:
'@smithy/util-buffer-from': 3.0.0
'@smithy/util-utf8': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/util-body-length-browser@3.0.0:
resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/util-body-length-node@3.0.0:
resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==}
engines: {node: '>=16.0.0'}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/util-buffer-from@3.0.0:
@@ -9445,14 +9465,14 @@ packages:
engines: {node: '>=16.0.0'}
dependencies:
'@smithy/is-array-buffer': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/util-config-provider@3.0.0:
resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==}
engines: {node: '>=16.0.0'}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/util-defaults-mode-browser@3.0.1:
@@ -9463,7 +9483,7 @@ packages:
'@smithy/smithy-client': 3.0.1
'@smithy/types': 3.0.0
bowser: 2.11.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/util-defaults-mode-node@3.0.1:
@@ -9476,7 +9496,7 @@ packages:
'@smithy/property-provider': 3.0.0
'@smithy/smithy-client': 3.0.1
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/util-endpoints@2.0.0:
@@ -9485,14 +9505,14 @@ packages:
dependencies:
'@smithy/node-config-provider': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/util-hex-encoding@3.0.0:
resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==}
engines: {node: '>=16.0.0'}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/util-middleware@3.0.0:
@@ -9500,7 +9520,7 @@ packages:
engines: {node: '>=16.0.0'}
dependencies:
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/util-retry@3.0.0:
@@ -9509,7 +9529,7 @@ packages:
dependencies:
'@smithy/service-error-classification': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/util-stream@3.0.1:
@@ -9523,14 +9543,14 @@ packages:
'@smithy/util-buffer-from': 3.0.0
'@smithy/util-hex-encoding': 3.0.0
'@smithy/util-utf8': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/util-uri-escape@3.0.0:
resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==}
engines: {node: '>=16.0.0'}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/util-utf8@3.0.0:
@@ -9538,7 +9558,7 @@ packages:
engines: {node: '>=16.0.0'}
dependencies:
'@smithy/util-buffer-from': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@smithy/util-waiter@3.0.0:
@@ -9547,7 +9567,7 @@ packages:
dependencies:
'@smithy/abort-controller': 3.0.0
'@smithy/types': 3.0.0
tslib: 2.8.0
tslib: 2.8.1
dev: false
/@socket.io/component-emitter@3.1.2:
@@ -12927,7 +12947,7 @@ packages:
esbuild: '>=0.10.0'
dependencies:
esbuild: 0.18.20
tslib: 2.8.0
tslib: 2.8.1
dev: true
/@yarnpkg/fslib@2.10.3:
@@ -12955,7 +12975,7 @@ packages:
engines: {node: '>=14.15.0'}
dependencies:
js-yaml: 3.14.1
tslib: 2.8.0
tslib: 2.8.1
dev: true
/@zkochan/js-yaml@0.0.7:
@@ -13340,7 +13360,7 @@ packages:
resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
engines: {node: '>=10'}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: true
/aria-query@4.2.2:
@@ -13547,21 +13567,21 @@ packages:
resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==}
engines: {node: '>=4'}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: true
/ast-types@0.15.2:
resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==}
engines: {node: '>=4'}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: true
/ast-types@0.16.1:
resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==}
engines: {node: '>=4'}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: true
/async-limiter@1.0.1:
@@ -14574,7 +14594,7 @@ packages:
resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
dependencies:
pascal-case: 3.1.2
tslib: 2.8.0
tslib: 2.8.1
dev: false
/camelcase-css@2.0.1:
@@ -14626,7 +14646,7 @@ packages:
resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==}
dependencies:
no-case: 3.0.4
tslib: 2.8.0
tslib: 2.8.1
upper-case-first: 2.0.2
dev: false
@@ -14705,7 +14725,7 @@ packages:
path-case: 3.0.4
sentence-case: 3.0.4
snake-case: 3.0.4
tslib: 2.8.0
tslib: 2.8.1
dev: false
/char-regex@1.0.2:
@@ -15129,7 +15149,7 @@ packages:
resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==}
dependencies:
no-case: 3.0.4
tslib: 2.8.0
tslib: 2.8.1
upper-case: 2.0.2
dev: false
@@ -16295,7 +16315,7 @@ packages:
resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
dependencies:
no-case: 3.0.4
tslib: 2.8.0
tslib: 2.8.1
dev: false
/dot-prop@5.3.0:
@@ -17817,7 +17837,7 @@ packages:
resolution: {integrity: sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg==}
engines: {node: '>= 10'}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: false
/file-system-cache@2.3.0:
@@ -18794,7 +18814,7 @@ packages:
resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==}
dependencies:
capital-case: 1.0.4
tslib: 2.8.0
tslib: 2.8.1
dev: false
/helmet-crossdomain@0.4.0:
@@ -21792,7 +21812,7 @@ packages:
/lower-case@2.0.2:
resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: false
/lru-cache@10.2.2:
@@ -22691,7 +22711,7 @@ packages:
resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
dependencies:
lower-case: 2.0.2
tslib: 2.8.0
tslib: 2.8.1
dev: false
/nocache@2.1.0:
@@ -23071,7 +23091,7 @@ packages:
tar-stream: 2.2.0
tmp: 0.2.3
tsconfig-paths: 4.2.0
tslib: 2.8.0
tslib: 2.8.1
yargs: 17.7.2
yargs-parser: 21.1.1
optionalDependencies:
@@ -23515,7 +23535,7 @@ packages:
resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
dependencies:
dot-case: 3.0.4
tslib: 2.8.0
tslib: 2.8.1
dev: false
/parent-module@1.0.1:
@@ -23576,7 +23596,7 @@ packages:
resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
dependencies:
no-case: 3.0.4
tslib: 2.8.0
tslib: 2.8.1
dev: false
/pascalcase@0.1.1:
@@ -23645,7 +23665,7 @@ packages:
resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==}
dependencies:
dot-case: 3.0.4
tslib: 2.8.0
tslib: 2.8.1
dev: false
/path-exists@3.0.0:
@@ -25896,7 +25916,7 @@ packages:
'@types/react': 18.3.4
react: 18.3.1
react-style-singleton: 2.2.1(@types/react@18.3.4)(react@18.3.1)
tslib: 2.8.0
tslib: 2.8.1
dev: true
/react-remove-scroll@2.5.5(@types/react@18.3.4)(react@18.3.1):
@@ -25913,7 +25933,7 @@ packages:
react: 18.3.1
react-remove-scroll-bar: 2.3.6(@types/react@18.3.4)(react@18.3.1)
react-style-singleton: 2.2.1(@types/react@18.3.4)(react@18.3.1)
tslib: 2.8.0
tslib: 2.8.1
use-callback-ref: 1.3.2(@types/react@18.3.4)(react@18.3.1)
use-sidecar: 1.1.2(@types/react@18.3.4)(react@18.3.1)
dev: true
@@ -26170,7 +26190,7 @@ packages:
get-nonce: 1.0.1
invariant: 2.2.4
react: 18.3.1
tslib: 2.8.0
tslib: 2.8.1
dev: true
/react-table-sticky@1.1.3:
@@ -26407,7 +26427,7 @@ packages:
ast-types: 0.15.2
esprima: 4.0.1
source-map: 0.6.1
tslib: 2.8.0
tslib: 2.8.1
dev: true
/recast@0.23.9:
@@ -26418,7 +26438,7 @@ packages:
esprima: 4.0.1
source-map: 0.6.1
tiny-invariant: 1.3.3
tslib: 2.8.0
tslib: 2.8.1
dev: true
/rechoir@0.8.0:
@@ -27232,7 +27252,7 @@ packages:
resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==}
dependencies:
no-case: 3.0.4
tslib: 2.8.0
tslib: 2.8.1
upper-case-first: 2.0.2
dev: false
@@ -27462,7 +27482,7 @@ packages:
resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
dependencies:
dot-case: 3.0.4
tslib: 2.8.0
tslib: 2.8.1
dev: false
/snapdragon-node@2.1.1:
@@ -28338,7 +28358,7 @@ packages:
engines: {node: ^14.18.0 || >=16.0.0}
dependencies:
'@pkgr/core': 0.1.1
tslib: 2.8.0
tslib: 2.8.1
dev: true
/tailwindcss@3.4.14(ts-node@10.9.2):
@@ -29469,13 +29489,13 @@ packages:
/upper-case-first@2.0.2:
resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: false
/upper-case@2.0.2:
resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==}
dependencies:
tslib: 2.8.0
tslib: 2.8.1
dev: false
/uri-js@4.4.1:
@@ -29507,7 +29527,7 @@ packages:
dependencies:
'@types/react': 18.3.4
react: 18.3.1
tslib: 2.8.0
tslib: 2.8.1
dev: true
/use-resize-observer@9.1.0(react-dom@18.3.1)(react@18.3.1):
@@ -29534,7 +29554,7 @@ packages:
'@types/react': 18.3.4
detect-node-es: 1.1.0
react: 18.3.1
tslib: 2.8.0
tslib: 2.8.1
dev: true
/use@3.1.1: