From 9ffaa97e30894ec133374da3677c1639250d96b0 Mon Sep 17 00:00:00 2001 From: Dov Benyomin Sohacheski Date: Tue, 5 Nov 2024 09:45:38 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9A=99=20Separate=20configs=20and=20parsers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +- package.json | 12 +- src/VitreaClient.spec.ts | 4 +- src/VitreaClient.ts | 39 +-- src/configs/AbstractConfigParser.ts | 23 ++ .../ConnectionConfigParser.spec.ts} | 23 +- src/configs/ConnectionConfigParser.ts | 30 +++ src/configs/SocketConfigParser.spec.ts | 49 ++++ src/configs/SocketConfigParser.ts | 28 ++ src/configs/index.ts | 6 + src/index.ts | 2 +- src/responses/helpers/ResponseFactory.spec.ts | 2 +- src/responses/helpers/ResponseFactory.ts | 2 +- src/socket/AbstractSocket.ts | 57 ++--- src/utilities/ProtocolVersion.ts | 7 - src/utilities/VBoxConnection.ts | 36 --- yarn.lock | 242 ++++++++++-------- 17 files changed, 332 insertions(+), 237 deletions(-) create mode 100644 src/configs/AbstractConfigParser.ts rename src/{utilities/VBoxConnection.spec.ts => configs/ConnectionConfigParser.spec.ts} (75%) create mode 100644 src/configs/ConnectionConfigParser.ts create mode 100644 src/configs/SocketConfigParser.spec.ts create mode 100644 src/configs/SocketConfigParser.ts create mode 100644 src/configs/index.ts delete mode 100644 src/utilities/ProtocolVersion.ts delete mode 100644 src/utilities/VBoxConnection.ts diff --git a/README.md b/README.md index 9f1fc89..d388b9a 100644 --- a/README.md +++ b/README.md @@ -48,9 +48,10 @@ corresponding default settings. If you prefer not to provide the configuration values directly, you can use environment variables instead. -All `VBoxConfigs` configuration values can be represented as environment variables by converting -the config key to uppercase and prefixing it with `VITREA_VBOX_`. -For instance, the key `username` would be represented as `VITREA_VBOX_USERNAME`. +All `VBoxConfigs` configuration values can be represented as environment variables by +converting the config key to uppercase and prefixing it with `VITREA_VBOX_`. +For instance, the key `username` would be represented as `VITREA_VBOX_USERNAME` and +`requestTimeout` as `VITREA_VBOX_REQUEST_TIMEOUT`. ## Usage diff --git a/package.json b/package.json index 050d916..11afe2c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vitrea-client", - "version": "0.0.3", + "version": "0.0.4", "description": "Vitrea Smart Home API Client", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -32,14 +32,14 @@ "async-mutex": "^0.5.0" }, "devDependencies": { - "@eslint/js": "^9.11.1", - "@types/jest": "^29.5.12", - "eslint": "^9.11.1", + "@eslint/js": "^9.14.0", + "@types/jest": "^29.5.14", + "eslint": "^9.14.0", "eslint-plugin-align-import": "^1.0.0", "jest": "^29.7.0", "ts-jest": "^29.2.5", - "typescript": "^5.6.2", - "typescript-eslint": "^8.8.0" + "typescript": "^5.6.3", + "typescript-eslint": "^8.13.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" diff --git a/src/VitreaClient.spec.ts b/src/VitreaClient.spec.ts index 5529c28..a5b60de 100644 --- a/src/VitreaClient.spec.ts +++ b/src/VitreaClient.spec.ts @@ -1,6 +1,6 @@ import { Socket } from 'net' import { VitreaClient } from './VitreaClient' -import { SocketConfigs } from './socket/AbstractSocket' +import { SocketConfigs } from './configs' import { Login, ToggleHeartbeat } from './requests' import { KeyStatus, RoomMetaData } from './responses' import { BaseRequest, BaseResponse } from './core' @@ -9,7 +9,7 @@ import * as Exceptions from './exceptions' describe('VitreaClient', () => { jest.useFakeTimers() - const getClient = (configs?: SocketConfigs) => { + const getClient = (configs?: Partial) => { return VitreaClient.create({ username: 'admin', password: 'secret' diff --git a/src/VitreaClient.ts b/src/VitreaClient.ts index 46de284..042bc6c 100644 --- a/src/VitreaClient.ts +++ b/src/VitreaClient.ts @@ -1,23 +1,28 @@ -import { Mutex } from 'async-mutex' -import { Events } from './utilities/Events' -import { Timeout } from './socket/Timeout' -import { KeyStatus } from './responses' -import { ProtocolVersion } from './utilities/ProtocolVersion' -import { ResponseFactory } from './responses/helpers' -import { SplitMultipleBuffers } from './utilities/SplitMultipleBuffers' -import { Login, ToggleHeartbeat } from './requests' -import { VitreaHeartbeatHandler } from './socket/VitreaHeartbeatHandler' -import { VBoxConfigs, VBoxConnection } from './utilities/VBoxConnection' -import { AbstractSocket, SocketConfigs } from './socket/AbstractSocket' -import * as Core from './core' +import { Mutex } from 'async-mutex' +import { Events } from './utilities/Events' +import { Timeout } from './socket/Timeout' +import { KeyStatus } from './responses' +import { AbstractSocket } from './socket/AbstractSocket' +import { ResponseFactory } from './responses/helpers' +import { SplitMultipleBuffers } from './utilities/SplitMultipleBuffers' +import { Login, ToggleHeartbeat } from './requests' +import { VitreaHeartbeatHandler } from './socket/VitreaHeartbeatHandler' +import * as Core from './core' +import { + ConnectionConfigs, + ConnectionConfigParser, + ProtocolVersion, + SocketConfigs, + SocketConfigParser +} from './configs' export class VitreaClient extends AbstractSocket { protected readonly mutex = new Mutex() - protected readonly configs: VBoxConfigs + protected readonly configs: ConnectionConfigs protected readonly version: ProtocolVersion - protected constructor(configs: Required, socketConfigs: SocketConfigs) { + protected constructor(configs: ConnectionConfigs, socketConfigs: SocketConfigs) { super(configs.host, configs.port, socketConfigs) this.configs = configs this.heartbeat = new VitreaHeartbeatHandler(this) @@ -107,10 +112,10 @@ export class VitreaClient extends AbstractSocket { this.on(Events.STATUS_UPDATE, listener) } - public static create(configs: Partial = {}, socketConfigs: SocketConfigs = {}) { + public static create(configs: Partial = {}, socketConfigs: Partial = {}) { return new this( - VBoxConnection.create(configs), - socketConfigs + ConnectionConfigParser.create(configs), + SocketConfigParser.create(socketConfigs) ) } } diff --git a/src/configs/AbstractConfigParser.ts b/src/configs/AbstractConfigParser.ts new file mode 100644 index 0000000..9b9bb14 --- /dev/null +++ b/src/configs/AbstractConfigParser.ts @@ -0,0 +1,23 @@ +export abstract class AbstractConfigParser { + protected constructor(protected readonly configs: Partial) { } + + protected validate(lookup: string, found: string | R[T]) { + if (!found && found !== false) { + throw TypeError(`A value for [${lookup}] is required`) + } + + return found + } + + protected get( + key: T, + fallback: R[T] = undefined, + ) { + const lookup: string = key as string + const envLookup = lookup.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toUpperCase() + + const found = this.configs[key] ?? process.env[`VITREA_VBOX_${envLookup}`] ?? fallback + + return this.validate(lookup, found) + } +} diff --git a/src/utilities/VBoxConnection.spec.ts b/src/configs/ConnectionConfigParser.spec.ts similarity index 75% rename from src/utilities/VBoxConnection.spec.ts rename to src/configs/ConnectionConfigParser.spec.ts index f787f2b..3b35939 100644 --- a/src/utilities/VBoxConnection.spec.ts +++ b/src/configs/ConnectionConfigParser.spec.ts @@ -1,8 +1,7 @@ -import { VBoxConnection } from './VBoxConnection' -import { ProtocolVersion } from './ProtocolVersion' +import { ConnectionConfigParser, ProtocolVersion } from './ConnectionConfigParser' -describe('VBoxConnection', () => { +describe('ConnectionConfigParser', () => { const env = process.env beforeEach(() => { @@ -19,7 +18,7 @@ describe('VBoxConnection', () => { process.env.VITREA_VBOX_PASSWORD = 'secret' process.env.VITREA_VBOX_VERSION = 'v1' - const client = VBoxConnection.create() + const client = ConnectionConfigParser.create() expect(client).toStrictEqual({ host: '192.168.1.111', @@ -31,7 +30,7 @@ describe('VBoxConnection', () => { }) it('[create] uses parameters when available', () => { - const client = VBoxConnection.create({ + const client = ConnectionConfigParser.create({ host: '192.168.1.111', port: 1234, username: 'admin', @@ -49,7 +48,7 @@ describe('VBoxConnection', () => { }) it('[create] uses a default port and host', () => { - const client = VBoxConnection.create({ + const client = ConnectionConfigParser.create({ username: 'admin', password: 'secret' }) @@ -64,23 +63,23 @@ describe('VBoxConnection', () => { }) it('[create] raises an exception for missing host', () => { - const callback = () => VBoxConnection.create({ - host: '', - username: 'admin', - password: 'secret' + const callback = () => ConnectionConfigParser.create({ + host: '', + username: 'admin', + password: 'secret' }) expect(callback).toThrow(TypeError) }) it('[create] raises an exception for missing username', () => { - const callback = () => VBoxConnection.create({ password: 'secret' }) + const callback = () => ConnectionConfigParser.create({ password: 'secret' }) expect(callback).toThrow(TypeError) }) it('[create] raises an exception for missing password', () => { - const callback = () => VBoxConnection.create({ username: 'admin' }) + const callback = () => ConnectionConfigParser.create({ username: 'admin' }) expect(callback).toThrow(TypeError) }) diff --git a/src/configs/ConnectionConfigParser.ts b/src/configs/ConnectionConfigParser.ts new file mode 100644 index 0000000..9783628 --- /dev/null +++ b/src/configs/ConnectionConfigParser.ts @@ -0,0 +1,30 @@ +import { AbstractConfigParser } from './AbstractConfigParser' + +export interface ConnectionConfigs { + host: string + port: number + username: string + password: string + version: ProtocolVersion +} + +export const ProtocolVersion = { + V1: 'v1', + V2: 'v2' +} as const + +export type ProtocolVersion = typeof ProtocolVersion[keyof typeof ProtocolVersion] + +export class ConnectionConfigParser extends AbstractConfigParser { + public static create(configs: Partial = {}): ConnectionConfigs { + const instance = new this(configs) + + return { + host: instance.get('host', '192.168.1.23'), + port: Number(instance.get('port', 11501)), + username: instance.get('username'), + password: instance.get('password'), + version: instance.get('version', ProtocolVersion.V2) as ProtocolVersion, + } + } +} diff --git a/src/configs/SocketConfigParser.spec.ts b/src/configs/SocketConfigParser.spec.ts new file mode 100644 index 0000000..1cacb58 --- /dev/null +++ b/src/configs/SocketConfigParser.spec.ts @@ -0,0 +1,49 @@ +import { SocketConfigParser } from './SocketConfigParser' +import { ConsoleLogger, NullLogger } from '../core' + + +describe('SocketConfigParser', () => { + const env = process.env + + beforeEach(() => { + jest.resetModules() + process.env = { ...env } + }) + + afterEach(() => process.env = env) + + it('[create] has default values', () => { + const configs = SocketConfigParser.create() + + expect(configs.log).toBeInstanceOf(NullLogger) + expect(configs.socketSupplier).toBeInstanceOf(Function) + expect(configs.shouldReconnect).toBeTruthy() + expect(configs.requestTimeout).toBe(1000) + }) + + it('[create] uses environment variables when available', () => { + process.env.VITREA_VBOX_REQUEST_TIMEOUT = '2000' + process.env.VITREA_VBOX_SHOULD_RECONNECT = 'false' + + const configs = SocketConfigParser.create() + + expect(configs.shouldReconnect).toBeFalsy() + expect(configs.requestTimeout).toBe(2000) + }) + + it('[create] uses parameters when available', () => { + const supplier = jest.fn() + + const configs = SocketConfigParser.create({ + socketSupplier: supplier, + shouldReconnect: false, + requestTimeout: 2000, + log: new ConsoleLogger() + }) + + expect(configs.log).toBeInstanceOf(ConsoleLogger) + expect(configs.socketSupplier).toBe(supplier) + expect(configs.shouldReconnect).toBeFalsy() + expect(configs.requestTimeout).toBe(2000) + }) +}) diff --git a/src/configs/SocketConfigParser.ts b/src/configs/SocketConfigParser.ts new file mode 100644 index 0000000..c7b2842 --- /dev/null +++ b/src/configs/SocketConfigParser.ts @@ -0,0 +1,28 @@ +import { AbstractConfigParser } from './AbstractConfigParser' +import { LoggerContract, NullLogger } from '../core' +import * as Net from 'net' + +export interface SocketConfigs { + log: LoggerContract, + shouldReconnect: boolean + requestTimeout: number + + socketSupplier(): Net.Socket +} + +export class SocketConfigParser extends AbstractConfigParser { + public toBoolean(value: string | boolean): boolean { + return ['1', 'true', 'TRUE', true].includes(value) + } + + public static create(configs: Partial = {}): Required { + const instance = new this(configs) + + return { + log: instance.configs.log ?? new NullLogger(), + socketSupplier: instance.configs.socketSupplier ?? (() => new Net.Socket()), + shouldReconnect: instance.toBoolean(instance.get('shouldReconnect', true)), + requestTimeout: Number(instance.get('requestTimeout', 1000)) + } + } +} diff --git a/src/configs/index.ts b/src/configs/index.ts new file mode 100644 index 0000000..cb72ee8 --- /dev/null +++ b/src/configs/index.ts @@ -0,0 +1,6 @@ +export { SocketConfigs, SocketConfigParser } from './SocketConfigParser' +export { + ConnectionConfigs, + ConnectionConfigParser, + ProtocolVersion +} from './ConnectionConfigParser' diff --git a/src/index.ts b/src/index.ts index 6db0e6c..79fe76e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ export { ConsoleLogger } from './core' export { VitreaClient } from './VitreaClient' -export { ProtocolVersion } from './utilities/ProtocolVersion' +export { ProtocolVersion } from './configs' export * as Enums from './utilities/Enums' export * as Exceptions from './exceptions' export * as Requests from './requests' diff --git a/src/responses/helpers/ResponseFactory.spec.ts b/src/responses/helpers/ResponseFactory.spec.ts index 4a06ea7..a984323 100644 --- a/src/responses/helpers/ResponseFactory.spec.ts +++ b/src/responses/helpers/ResponseFactory.spec.ts @@ -1,6 +1,6 @@ import { RoomCount } from '../RoomCount' import { NodeMetaDataV2 } from '../NodeMetaDataV2' -import { ProtocolVersion } from '../../utilities/ProtocolVersion' +import { ProtocolVersion } from '../../configs' import { ResponseFactory } from './ResponseFactory' import { DataGramDirection } from '../../utilities/Enums' diff --git a/src/responses/helpers/ResponseFactory.ts b/src/responses/helpers/ResponseFactory.ts index afa2b4e..bf1025e 100644 --- a/src/responses/helpers/ResponseFactory.ts +++ b/src/responses/helpers/ResponseFactory.ts @@ -1,5 +1,5 @@ import { CommandID } from '../ResponseCodes' -import { ProtocolVersion } from '../../utilities/ProtocolVersion' +import { ProtocolVersion } from '../../configs' import { DataGramDirection } from '../../utilities/Enums' import { BaseResponse, DataGram } from '../../core' import * as Responses from '..' diff --git a/src/socket/AbstractSocket.ts b/src/socket/AbstractSocket.ts index 8e1adf7..d7e4d69 100644 --- a/src/socket/AbstractSocket.ts +++ b/src/socket/AbstractSocket.ts @@ -1,48 +1,29 @@ -import { Timeout } from './Timeout' -import { EventEmitter } from 'events' -import { WritableSocketContract } from './WritableSocketContract' -import { AbstractHeartbeatHandler } from './AbstractHeartbeatHandler' -import { LoggerContract, NullLogger } from '../core' -import * as Net from 'net' -import * as Exceptions from '../exceptions' - - -export type SocketConfigs = Partial<{ - log: LoggerContract, - socketSupplier: () => Net.Socket, - shouldReconnect: boolean - requestTimeout: number -}> +import { Timeout } from './Timeout' +import { EventEmitter } from 'events' +import { SocketConfigs } from '../configs' +import { LoggerContract } from '../core' +import { WritableSocketContract } from './WritableSocketContract' +import { AbstractHeartbeatHandler } from './AbstractHeartbeatHandler' +import * as Net from 'net' +import * as Exceptions from '../exceptions' + export abstract class AbstractSocket extends EventEmitter implements WritableSocketContract { protected socket?: Net.Socket protected heartbeat?: AbstractHeartbeatHandler - protected shouldReconnect: boolean - protected readonly socketSupplier?: SocketConfigs['socketSupplier'] protected readonly log: LoggerContract - protected readonly requestTimeout: number protected constructor( protected readonly host: string, protected readonly port: number, - { - log = new NullLogger(), - socketSupplier = undefined, - shouldReconnect = true, - requestTimeout = 1000 - }: SocketConfigs = {} + protected readonly socketConfigs: SocketConfigs, ) { super() - this.socketSupplier = socketSupplier - this.log = log - this.shouldReconnect = shouldReconnect - this.requestTimeout = requestTimeout + this.log = socketConfigs.log } protected createNewSocket(): Net.Socket { - this.socket = this.socketSupplier - ? this.socketSupplier() - : new Net.Socket() + this.socket = this.socketConfigs.socketSupplier() return this.socket .on('connect', this.handleConnect.bind(this)) @@ -63,7 +44,7 @@ export abstract class AbstractSocket extends EventEmitter implements WritableSoc } return new Promise(res => { - const timeout = Timeout.create(this.requestTimeout) + const timeout = Timeout.create(this.socketConfigs.requestTimeout) this.createNewSocket() .on('connect', () => { @@ -81,7 +62,7 @@ export abstract class AbstractSocket extends EventEmitter implements WritableSoc if (this.socket) { this.log.info('Forced a disconnection') this.heartbeat?.pause() - this.shouldReconnect = false + this.socketConfigs.shouldReconnect = false this.socket.end() this.socket = undefined } @@ -112,24 +93,24 @@ export abstract class AbstractSocket extends EventEmitter implements WritableSoc this.socket = undefined - if (this.shouldReconnect) { - this.log.info('Automatically reconnecting', { shouldReconnect: this.shouldReconnect }) + if (this.socketConfigs.shouldReconnect) { + this.log.info('Automatically reconnecting', { shouldReconnect: this.socketConfigs.shouldReconnect }) return await this.connect() } - this.log.info('Not reconnecting', { shouldReconnect: this.shouldReconnect }) + this.log.info('Not reconnecting', { shouldReconnect: this.socketConfigs.shouldReconnect }) } protected handleError(error: Error) { - this.shouldReconnect = false + this.socketConfigs.shouldReconnect = false this.log.error(`An error occurred - ${error.message}`) } protected async handleConnect() { this.log.debug('Connection established') - this.shouldReconnect = true + this.socketConfigs.shouldReconnect = true this.restartHeartbeat() } diff --git a/src/utilities/ProtocolVersion.ts b/src/utilities/ProtocolVersion.ts deleted file mode 100644 index f9f7f6b..0000000 --- a/src/utilities/ProtocolVersion.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const ProtocolVersion = { - V1: 'v1', - V2: 'v2' -} as const - - -export type ProtocolVersion = typeof ProtocolVersion[keyof typeof ProtocolVersion] diff --git a/src/utilities/VBoxConnection.ts b/src/utilities/VBoxConnection.ts deleted file mode 100644 index fc368af..0000000 --- a/src/utilities/VBoxConnection.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { ProtocolVersion } from './ProtocolVersion' - - -export interface VBoxConfigs { - host: string - port?: number - username: string - password: string - version: ProtocolVersion -} - -export class VBoxConnection { - protected static get( - configs: Partial, - key: T, - fallback: VBoxConfigs[T] = null, - ) { - const found = configs[key] ?? process.env[`VITREA_VBOX_${key.toUpperCase()}`] ?? fallback - - if (!found) { - throw TypeError(`A value for [${key}] is required`) - } - - return found - } - - public static create(configs: Partial = {}) : Required { - return { - host: this.get(configs, 'host', '192.168.1.23'), - port: Number(this.get(configs, 'port', 11501)), - username: this.get(configs, 'username'), - password: this.get(configs, 'password'), - version: this.get(configs, 'version', ProtocolVersion.V2) as ProtocolVersion, - } - } -} diff --git a/yarn.lock b/yarn.lock index 8a9ae53..8122b30 100644 --- a/yarn.lock +++ b/yarn.lock @@ -298,11 +298,16 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0": +"@eslint-community/regexpp@^4.10.0": version "4.11.1" resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz" integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== +"@eslint-community/regexpp@^4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + "@eslint/config-array@^0.18.0": version "0.18.0" resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d" @@ -312,10 +317,10 @@ debug "^4.3.1" minimatch "^3.1.2" -"@eslint/core@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.6.0.tgz#9930b5ba24c406d67a1760e94cdbac616a6eb674" - integrity sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg== +"@eslint/core@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.7.0.tgz#a1bb4b6a4e742a5ff1894b7ee76fbf884ec72bd3" + integrity sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw== "@eslint/eslintrc@^3.1.0": version "3.1.0" @@ -332,15 +337,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.11.1": - version "9.11.1" - resolved "https://registry.npmjs.org/@eslint/js/-/js-9.11.1.tgz" - integrity sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA== - -"@eslint/js@^9.11.1": - version "9.11.1" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.11.1.tgz#8bcb37436f9854b3d9a561440daf916acd940986" - integrity sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA== +"@eslint/js@9.14.0", "@eslint/js@^9.14.0": + version "9.14.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.14.0.tgz#2347a871042ebd11a00fd8c2d3d56a265ee6857e" + integrity sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg== "@eslint/object-schema@^2.1.4": version "2.1.4" @@ -354,6 +354,19 @@ dependencies: levn "^0.4.1" +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.6" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" + "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" @@ -364,6 +377,11 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== +"@humanwhocodes/retry@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.0.tgz#b57438cab2a2381b4b597b0ab17339be381bd755" + integrity sha512-xnRgu9DxZbkWak/te3fcytNyp8MTbuiZIaueg2rgEvBuN55n04nwLYLU9TX/VVlusc9L2ZNXi99nUFNkHXtr5g== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" @@ -617,7 +635,7 @@ resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": +"@nodelib/fs.walk@^1.2.3": version "1.2.8" resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -708,10 +726,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^29.5.12": - version "29.5.13" - resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.13.tgz" - integrity sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg== +"@types/jest@^29.5.14": + version "29.5.14" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" + integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -745,62 +763,62 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.0.tgz#b2b02a5447cdc885950eb256b3b8a97b92031bd3" - integrity sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A== +"@typescript-eslint/eslint-plugin@8.13.0": + version "8.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.13.0.tgz#650c50b8c795b5d092189f139f6d00535b5b0f3d" + integrity sha512-nQtBLiZYMUPkclSeC3id+x4uVd1SGtHuElTxL++SfP47jR0zfkZBJHc+gL4qPsgTuypz0k8Y2GheaDYn6Gy3rg== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.8.0" - "@typescript-eslint/type-utils" "8.8.0" - "@typescript-eslint/utils" "8.8.0" - "@typescript-eslint/visitor-keys" "8.8.0" + "@typescript-eslint/scope-manager" "8.13.0" + "@typescript-eslint/type-utils" "8.13.0" + "@typescript-eslint/utils" "8.13.0" + "@typescript-eslint/visitor-keys" "8.13.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.8.0.tgz#ee4397c70230c4eee030456924c0fba480072f5e" - integrity sha512-uEFUsgR+tl8GmzmLjRqz+VrDv4eoaMqMXW7ruXfgThaAShO9JTciKpEsB+TvnfFfbg5IpujgMXVV36gOJRLtZg== +"@typescript-eslint/parser@8.13.0": + version "8.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.13.0.tgz#ef76203b7cac515aa3ccc4f7ce5320dd61c46b29" + integrity sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ== dependencies: - "@typescript-eslint/scope-manager" "8.8.0" - "@typescript-eslint/types" "8.8.0" - "@typescript-eslint/typescript-estree" "8.8.0" - "@typescript-eslint/visitor-keys" "8.8.0" + "@typescript-eslint/scope-manager" "8.13.0" + "@typescript-eslint/types" "8.13.0" + "@typescript-eslint/typescript-estree" "8.13.0" + "@typescript-eslint/visitor-keys" "8.13.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.8.0.tgz#30b23a6ae5708bd7882e40675ef2f1b2beac741f" - integrity sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg== +"@typescript-eslint/scope-manager@8.13.0": + version "8.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.13.0.tgz#2f4aed0b87d72360e64e4ea194b1fde14a59082e" + integrity sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA== dependencies: - "@typescript-eslint/types" "8.8.0" - "@typescript-eslint/visitor-keys" "8.8.0" + "@typescript-eslint/types" "8.13.0" + "@typescript-eslint/visitor-keys" "8.13.0" -"@typescript-eslint/type-utils@8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.8.0.tgz#a0ca1c8a90d94b101176a169d7a0958187408d33" - integrity sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q== +"@typescript-eslint/type-utils@8.13.0": + version "8.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.13.0.tgz#8c8fa68490dcb9ae1687ffc7de8fbe23c26417bd" + integrity sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA== dependencies: - "@typescript-eslint/typescript-estree" "8.8.0" - "@typescript-eslint/utils" "8.8.0" + "@typescript-eslint/typescript-estree" "8.13.0" + "@typescript-eslint/utils" "8.13.0" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.8.0.tgz#08ea5df6c01984d456056434641491fbf7a1bf43" - integrity sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw== +"@typescript-eslint/types@8.13.0": + version "8.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.13.0.tgz#3f35dead2b2491a04339370dcbcd17bbdfc204d8" + integrity sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng== -"@typescript-eslint/typescript-estree@8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz#072eaab97fdb63513fabfe1cf271812affe779e3" - integrity sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw== +"@typescript-eslint/typescript-estree@8.13.0": + version "8.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz#db8c93dd5437ca3ce417a255fb35ddc3c12c3e95" + integrity sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g== dependencies: - "@typescript-eslint/types" "8.8.0" - "@typescript-eslint/visitor-keys" "8.8.0" + "@typescript-eslint/types" "8.13.0" + "@typescript-eslint/visitor-keys" "8.13.0" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -808,22 +826,22 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.8.0.tgz#bd8607e3a68c461b69169c7a5824637dc9e8b3f1" - integrity sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg== +"@typescript-eslint/utils@8.13.0": + version "8.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.13.0.tgz#f6d40e8b5053dcaeabbd2e26463857abf27d62c0" + integrity sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.8.0" - "@typescript-eslint/types" "8.8.0" - "@typescript-eslint/typescript-estree" "8.8.0" + "@typescript-eslint/scope-manager" "8.13.0" + "@typescript-eslint/types" "8.13.0" + "@typescript-eslint/typescript-estree" "8.13.0" -"@typescript-eslint/visitor-keys@8.8.0": - version "8.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.0.tgz#f93965abd38c82a1a1f5574290a50d02daf1cd2e" - integrity sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g== +"@typescript-eslint/visitor-keys@8.13.0": + version "8.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz#e97b0d92b266ef38a1faf40a74da289b66683a5b" + integrity sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw== dependencies: - "@typescript-eslint/types" "8.8.0" + "@typescript-eslint/types" "8.13.0" eslint-visitor-keys "^3.4.3" acorn-jsx@^5.3.2: @@ -836,6 +854,11 @@ acorn@^8.12.0: resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== +acorn@^8.14.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" @@ -1241,10 +1264,10 @@ eslint-plugin-align-import@^1.0.0: resolved "https://registry.npmjs.org/eslint-plugin-align-import/-/eslint-plugin-align-import-1.0.0.tgz" integrity sha512-bUUcAssxWgsmIvDnREgBrIOtNkLcr2QfZf/zjZDtq8LqxKm9krFt2eSRKNTqIoEnEy8EQ4k8qBkm8azQxyC98Q== -eslint-scope@^8.0.2: - version "8.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.1.0.tgz#70214a174d4cbffbc3e8a26911d8bf51b9ae9d30" - integrity sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw== +eslint-scope@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442" + integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -1259,26 +1282,26 @@ eslint-visitor-keys@^4.0.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz" integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== -eslint-visitor-keys@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz#1f785cc5e81eb7534523d85922248232077d2f8c" - integrity sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg== +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== -eslint@^9.11.1: - version "9.11.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.11.1.tgz#701e5fc528990153f9cef696d8427003b5206567" - integrity sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg== +eslint@^9.14.0: + version "9.14.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.14.0.tgz#534180a97c00af08bcf2b60b0ebf0c4d6c1b2c95" + integrity sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.11.0" + "@eslint-community/regexpp" "^4.12.1" "@eslint/config-array" "^0.18.0" - "@eslint/core" "^0.6.0" + "@eslint/core" "^0.7.0" "@eslint/eslintrc" "^3.1.0" - "@eslint/js" "9.11.1" + "@eslint/js" "9.14.0" "@eslint/plugin-kit" "^0.2.0" + "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.3.0" - "@nodelib/fs.walk" "^1.2.8" + "@humanwhocodes/retry" "^0.4.0" "@types/estree" "^1.0.6" "@types/json-schema" "^7.0.15" ajv "^6.12.4" @@ -1286,9 +1309,9 @@ eslint@^9.11.1: cross-spawn "^7.0.2" debug "^4.3.2" escape-string-regexp "^4.0.0" - eslint-scope "^8.0.2" - eslint-visitor-keys "^4.0.0" - espree "^10.1.0" + eslint-scope "^8.2.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" esquery "^1.5.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -1298,13 +1321,11 @@ eslint@^9.11.1: ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - is-path-inside "^3.0.3" json-stable-stringify-without-jsonify "^1.0.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.3" - strip-ansi "^6.0.1" text-table "^0.2.0" espree@^10.0.1: @@ -1316,14 +1337,14 @@ espree@^10.0.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^4.0.0" -espree@^10.1.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.2.0.tgz#f4bcead9e05b0615c968e85f83816bc386a45df6" - integrity sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g== +espree@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== dependencies: - acorn "^8.12.0" + acorn "^8.14.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.1.0" + eslint-visitor-keys "^4.2.0" esprima@^4.0.0: version "4.0.1" @@ -1661,11 +1682,6 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - is-stream@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" @@ -2711,19 +2727,19 @@ type-fest@^0.21.3: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typescript-eslint@^8.8.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.8.0.tgz#93762a4cbd9d586dec0d9ab18e07dea13f497a27" - integrity sha512-BjIT/VwJ8+0rVO01ZQ2ZVnjE1svFBiRczcpr1t1Yxt7sT25VSbPfrJtDsQ8uQTy2pilX5nI9gwxhUyLULNentw== +typescript-eslint@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.13.0.tgz#c7d92cc06188176c7d0e3825e10305b9c22fb102" + integrity sha512-vIMpDRJrQd70au2G8w34mPps0ezFSPMEX4pXkTzUkrNbRX+36ais2ksGWN0esZL+ZMaFJEneOBHzCgSqle7DHw== dependencies: - "@typescript-eslint/eslint-plugin" "8.8.0" - "@typescript-eslint/parser" "8.8.0" - "@typescript-eslint/utils" "8.8.0" + "@typescript-eslint/eslint-plugin" "8.13.0" + "@typescript-eslint/parser" "8.13.0" + "@typescript-eslint/utils" "8.13.0" -typescript@^5.6.2: - version "5.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" - integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== +typescript@^5.6.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== undici-types@~6.19.2: version "6.19.8"