From d3969966636f6a83eb5e519aeca264226006841d Mon Sep 17 00:00:00 2001 From: Colin Diesh Date: Thu, 12 Dec 2024 10:25:50 -0500 Subject: [PATCH] Adaptation to use generic-filehandle2 (#150) --- CHANGELOG.md | 4 - package.json | 9 +- src/csi.ts | 89 +++++++------- src/indexFile.ts | 2 +- src/tabixIndexedFile.ts | 48 +++----- src/tbi.ts | 62 +++++----- src/virtualOffset.ts | 7 +- test/csi.test.ts | 2 +- test/tbi.test.ts | 2 +- tsconfig.json | 2 +- webpack.config.js | 5 - yarn.lock | 258 ++++++++++++++-------------------------- 12 files changed, 197 insertions(+), 293 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f42f2c..27e1bf2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,7 @@ ## [1.6.1](https://github.com/GMOD/tabix-js/compare/v1.6.0...v1.6.1) (2024-12-07) - - # [1.6.0](https://github.com/GMOD/tabix-js/compare/v1.5.15...v1.6.0) (2024-11-30) - - ## [1.5.15](https://github.com/GMOD/tabix-js/compare/v1.5.14...v1.5.15) (2024-08-30) ## [1.5.14](https://github.com/GMOD/tabix-js/compare/v1.5.13...v1.5.14) (2024-07-23) diff --git a/package.json b/package.json index 52d174e..0df6df7 100644 --- a/package.json +++ b/package.json @@ -42,8 +42,8 @@ ], "dependencies": { "@gmod/abortable-promise-cache": "^2.0.0", - "@gmod/bgzf-filehandle": "^1.3.3", - "generic-filehandle": "^3.0.0", + "@gmod/bgzf-filehandle": "^2.0.0", + "generic-filehandle2": "^0.0.1", "long": "^4.0.0", "quick-lru": "^4.0.0" }, @@ -55,16 +55,13 @@ "@typescript-eslint/eslint-plugin": "^8.0.1", "@typescript-eslint/parser": "^8.0.1", "@vitest/coverage-v8": "^2.0.5", - "buffer": "^6.0.3", "documentation": "^14.0.3", "eslint": "^9.9.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.0.1", "eslint-plugin-unicorn": "^56.0.0", "prettier": "^3.3.3", "rimraf": "^6.0.1", "standard-changelog": "^6.0.0", - "typescript": "~5.6.0", + "typescript": "^5.7.0", "typescript-eslint": "^8.0.1", "vitest": "^2.0.5", "webpack": "^5.93.0", diff --git a/src/csi.ts b/src/csi.ts index 9f680fe..0c74878 100644 --- a/src/csi.ts +++ b/src/csi.ts @@ -1,5 +1,4 @@ import Long from 'long' -import { Buffer } from 'buffer' import { unzip } from '@gmod/bgzf-filehandle' import VirtualOffset, { fromBytes } from './virtualOffset' @@ -11,6 +10,12 @@ import IndexFile, { Options } from './indexFile' const CSI1_MAGIC = 21582659 // CSI\1 const CSI2_MAGIC = 38359875 // CSI\2 +const formats = { + 0: 'generic', + 1: 'SAM', + 2: 'VCF', +} + function lshift(num: number, bits: number) { return num * 2 ** bits } @@ -49,26 +54,27 @@ export default class CSI extends IndexFile { throw new Error('CSI indexes do not support indexcov') } - parseAuxData(bytes: Buffer, offset: number) { - const formatFlags = bytes.readInt32LE(offset) + parseAuxData(bytes: Uint8Array, offset: number) { + const dataView = new DataView(bytes.buffer) + const formatFlags = dataView.getInt32(offset, true) const coordinateType = formatFlags & 0x10000 ? 'zero-based-half-open' : '1-based-closed' - const format = { 0: 'generic', 1: 'SAM', 2: 'VCF' }[formatFlags & 0xf] + const format = formats[(formatFlags & 0xf) as 0 | 1 | 2] if (!format) { throw new Error(`invalid Tabix preset format flags ${formatFlags}`) } const columnNumbers = { - ref: bytes.readInt32LE(offset + 4), - start: bytes.readInt32LE(offset + 8), - end: bytes.readInt32LE(offset + 12), + ref: dataView.getInt32(offset + 4, true), + start: dataView.getInt32(offset + 8, true), + end: dataView.getInt32(offset + 12, true), } - const metaValue = bytes.readInt32LE(offset + 16) + const metaValue = dataView.getInt32(offset + 16, true) const metaChar = metaValue ? String.fromCharCode(metaValue) : null - const skipLines = bytes.readInt32LE(offset + 20) - const nameSectionLength = bytes.readInt32LE(offset + 24) + const skipLines = dataView.getInt32(offset + 20, true) + const nameSectionLength = dataView.getInt32(offset + 24, true) const { refIdToName, refNameToId } = this._parseNameBytes( - bytes.slice(offset + 28, offset + 28 + nameSectionLength), + bytes.subarray(offset + 28, offset + 28 + nameSectionLength), ) return { @@ -82,16 +88,18 @@ export default class CSI extends IndexFile { } } - _parseNameBytes(namesBytes: Buffer) { + _parseNameBytes(namesBytes: Uint8Array) { let currRefId = 0 let currNameStart = 0 const refIdToName = [] const refNameToId: Record = {} + const decoder = new TextDecoder('utf8') for (let i = 0; i < namesBytes.length; i += 1) { if (!namesBytes[i]) { if (currNameStart < i) { - let refName = namesBytes.toString('utf8', currNameStart, i) - refName = this.renameRefSeq(refName) + const refName = this.renameRefSeq( + decoder.decode(namesBytes.subarray(currNameStart, i)), + ) refIdToName[currRefId] = refName refNameToId[refName] = currRefId } @@ -99,30 +107,33 @@ export default class CSI extends IndexFile { currRefId += 1 } } - return { refNameToId, refIdToName } + return { + refNameToId, + refIdToName, + } } // fetch and parse the index async _parse(opts: Options = {}) { const bytes = await unzip(await this.filehandle.readFile(opts)) + const dataView = new DataView(bytes.buffer) // check TBI magic numbers let csiVersion - if (bytes.readUInt32LE(0) === CSI1_MAGIC) { + if (dataView.getUint32(0, true) === CSI1_MAGIC) { csiVersion = 1 - } else if (bytes.readUInt32LE(0) === CSI2_MAGIC) { + } else if (dataView.getUint32(0, true) === CSI2_MAGIC) { csiVersion = 2 } else { throw new Error('Not a CSI file') - // TODO: do we need to support big-endian CSI files? } - this.minShift = bytes.readInt32LE(4) - this.depth = bytes.readInt32LE(8) + this.minShift = dataView.getInt32(4, true) + this.depth = dataView.getInt32(8, true) this.maxBinNumber = ((1 << ((this.depth + 1) * 3)) - 1) / 7 const maxRefLength = 2 ** (this.minShift + this.depth * 3) - const auxLength = bytes.readInt32LE(12) + const auxLength = dataView.getInt32(12, true) const aux = auxLength && auxLength >= 30 ? this.parseAuxData(bytes, 16) @@ -134,35 +145,33 @@ export default class CSI extends IndexFile { coordinateType: 'zero-based-half-open', format: 'generic', } - const refCount = bytes.readInt32LE(16 + auxLength) + const refCount = dataView.getInt32(16 + auxLength, true) // read the indexes for each reference sequence let firstDataLine: VirtualOffset | undefined let currOffset = 16 + auxLength + 4 const indices = new Array(refCount).fill(0).map(() => { - // the binning index - const binCount = bytes.readInt32LE(currOffset) + const binCount = dataView.getInt32(currOffset, true) currOffset += 4 const binIndex: Record = {} - let stats // < provided by parsing a pseudo-bin, if present + let stats for (let j = 0; j < binCount; j += 1) { - const bin = bytes.readUInt32LE(currOffset) + const bin = dataView.getUint32(currOffset, true) if (bin > this.maxBinNumber) { - // this is a fake bin that actually has stats information - // about the reference sequence in it + // this is a fake bin that actually has stats information about the + // reference sequence in it stats = this.parsePseudoBin(bytes, currOffset + 4) currOffset += 4 + 8 + 4 + 16 + 16 } else { const loffset = fromBytes(bytes, currOffset + 4) firstDataLine = this._findFirstData(firstDataLine, loffset) - const chunkCount = bytes.readInt32LE(currOffset + 12) + const chunkCount = dataView.getInt32(currOffset + 12, true) currOffset += 16 const chunks = new Array(chunkCount) for (let k = 0; k < chunkCount; k += 1) { const u = fromBytes(bytes, currOffset) const v = fromBytes(bytes, currOffset + 8) currOffset += 16 - // this._findFirstData(data, u) chunks[k] = new Chunk(u, v, bin) } binIndex[bin] = chunks @@ -186,14 +195,15 @@ export default class CSI extends IndexFile { } } - parsePseudoBin(bytes: Buffer, offset: number) { - const lineCount = longToNumber( - Long.fromBytesLE( - bytes.slice(offset + 28, offset + 36) as unknown as number[], - true, + parsePseudoBin(bytes: Uint8Array, offset: number) { + return { + lineCount: longToNumber( + Long.fromBytesLE( + bytes.subarray(offset + 28, offset + 36) as unknown as number[], + true, + ), ), - ) - return { lineCount } + } } async blocksForRange( @@ -216,9 +226,8 @@ export default class CSI extends IndexFile { return [] } - // const { linearIndex, binIndex } = indexes - - const overlappingBins = this.reg2bins(min, max) // List of bin #s that overlap min, max + // List of bin #s that overlap min, max + const overlappingBins = this.reg2bins(min, max) const chunks: Chunk[] = [] // Find chunks in overlapping bins. Leaf bins (< 4681) are not pruned diff --git a/src/indexFile.ts b/src/indexFile.ts index d65b7bd..8854d53 100644 --- a/src/indexFile.ts +++ b/src/indexFile.ts @@ -1,4 +1,4 @@ -import { GenericFilehandle } from 'generic-filehandle' +import { GenericFilehandle } from 'generic-filehandle2' import VirtualOffset from './virtualOffset' import Chunk from './chunk' diff --git a/src/tabixIndexedFile.ts b/src/tabixIndexedFile.ts index 9dd987f..3f9b48d 100644 --- a/src/tabixIndexedFile.ts +++ b/src/tabixIndexedFile.ts @@ -1,7 +1,6 @@ import AbortablePromiseCache from '@gmod/abortable-promise-cache' import LRU from 'quick-lru' -import { Buffer } from 'buffer' -import { GenericFilehandle, RemoteFile, LocalFile } from 'generic-filehandle' +import { GenericFilehandle, RemoteFile, LocalFile } from 'generic-filehandle2' import { unzip, unzipChunkSlice } from '@gmod/bgzf-filehandle' import { checkAbortSignal } from './util' import IndexFile, { Options, IndexData } from './indexFile' @@ -17,9 +16,6 @@ function isASCII(str: string) { type GetLinesCallback = (line: string, fileOffset: number) => void -const decoder = - typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined - interface GetLinesOpts { [key: string]: unknown signal?: AbortSignal @@ -27,7 +23,7 @@ interface GetLinesOpts { } interface ReadChunk { - buffer: Buffer + buffer: Uint8Array cpositions: number[] dpositions: number[] } @@ -196,6 +192,7 @@ export default class TabixIndexedFile { const chunks = await this.index.blocksForRange(refName, start, end, options) checkAbortSignal(signal) + const decoder = new TextDecoder('utf8') // now go through each chunk and parse and filter the lines out of it for (const c of chunks) { @@ -209,11 +206,11 @@ export default class TabixIndexedFile { let blockStart = 0 let pos = 0 - const str = decoder?.decode(buffer) ?? buffer.toString() // fast path, Buffer is just ASCII chars and not gigantor, can be // converted to string and processed directly. if it is not ASCII or // gigantic (chrome max str len is 512Mb), we have to decode line by line - const strIsASCII = buffer.length < 500_000_000 && isASCII(str) + const str = decoder.decode(buffer) + const strIsASCII = isASCII(str) while (blockStart < str.length) { let line: string let n: number @@ -224,12 +221,12 @@ export default class TabixIndexedFile { } line = str.slice(blockStart, n) } else { - n = buffer.indexOf('\n', blockStart) + n = buffer.indexOf('\n'.charCodeAt(0), blockStart) if (n === -1) { break } const b = buffer.slice(blockStart, n) - line = decoder?.decode(b) ?? b.toString() + line = decoder.decode(b) } // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition @@ -292,10 +289,10 @@ export default class TabixIndexedFile { checkAbortSignal(opts.signal) const maxFetch = (firstDataLine?.blockPosition || 0) + maxBlockSize - // TODO: what if we don't have a firstDataLine, and the header - // actually takes up more than one block? this case is not covered here + // TODO: what if we don't have a firstDataLine, and the header actually + // takes up more than one block? this case is not covered here - const buf = await this._readRegion(0, maxFetch, opts) + const buf = await this.filehandle.read(maxFetch, 0, opts) const bytes = await unzip(buf) // trim off lines after the last non-meta line @@ -324,8 +321,9 @@ export default class TabixIndexedFile { * @returns {Promise} for a string */ async getHeader(opts: Options = {}) { + const decoder = new TextDecoder('utf8') const bytes = await this.getHeaderBuffer(opts) - return bytes.toString('utf8') + return decoder.decode(bytes) } /** @@ -492,32 +490,16 @@ export default class TabixIndexedFile { return this.index.lineCount(refName, opts) } - async _readRegion(pos: number, size: number, opts: Options = {}) { - const b = Buffer.alloc(size) - const { bytesRead, buffer } = await this.filehandle.read( - b, - 0, - size, - pos, - opts, - ) - - return buffer.subarray(0, bytesRead) - } - /** * read and uncompress the data in a chunk (composed of one or more * contiguous bgzip blocks) of the file */ async readChunk(c: Chunk, opts: Options = {}) { - // fetch the uncompressed data, uncompress carefully a block at a time, and - // stop when done - - const data = await this._readRegion( - c.minv.blockPosition, + const ret = await this.filehandle.read( c.fetchedSize(), + c.minv.blockPosition, opts, ) - return unzipChunkSlice(data, c) + return unzipChunkSlice(ret, c) } } diff --git a/src/tbi.ts b/src/tbi.ts index a5b7af1..5a9fffc 100644 --- a/src/tbi.ts +++ b/src/tbi.ts @@ -1,5 +1,4 @@ import Long from 'long' -import { Buffer } from 'buffer' import VirtualOffset, { fromBytes } from './virtualOffset' import Chunk from './chunk' import { unzip } from '@gmod/bgzf-filehandle' @@ -37,11 +36,7 @@ export default class TabixIndex extends IndexFile { if (!idx) { return -1 } - const { stats } = indexData.indices[refId] - if (stats) { - return stats.lineCount - } - return -1 + return indexData.indices[refId].stats?.lineCount ?? -1 } // fetch and parse the index @@ -49,16 +44,16 @@ export default class TabixIndex extends IndexFile { const buf = await this.filehandle.readFile(opts) const bytes = await unzip(buf) checkAbortSignal(opts.signal) + const dataView = new DataView(bytes.buffer) - // check TBI magic numbers - if (bytes.readUInt32LE(0) !== TBI_MAGIC /* "TBI\1" */) { + const magic = dataView.getUint32(0, true) + if (magic !== TBI_MAGIC /* "TBI\1" */) { throw new Error('Not a TBI file') - // TODO: do we need to support big-endian TBI files? } // number of reference sequences in the index - const refCount = bytes.readInt32LE(4) - const formatFlags = bytes.readInt32LE(8) + const refCount = dataView.getUint32(4, true) + const formatFlags = dataView.getUint32(8, true) const coordinateType = formatFlags & 0x10000 ? 'zero-based-half-open' : '1-based-closed' const formatOpts: Record = { @@ -71,19 +66,19 @@ export default class TabixIndex extends IndexFile { throw new Error(`invalid Tabix preset format flags ${formatFlags}`) } const columnNumbers = { - ref: bytes.readInt32LE(12), - start: bytes.readInt32LE(16), - end: bytes.readInt32LE(20), + ref: dataView.getInt32(12, true), + start: dataView.getInt32(16, true), + end: dataView.getInt32(20, true), } - const metaValue = bytes.readInt32LE(24) + const metaValue = dataView.getInt32(24, true) const depth = 5 const maxBinNumber = ((1 << ((depth + 1) * 3)) - 1) / 7 const maxRefLength = 2 ** (14 + depth * 3) const metaChar = metaValue ? String.fromCharCode(metaValue) : null - const skipLines = bytes.readInt32LE(28) + const skipLines = dataView.getInt32(28, true) // read sequence dictionary - const nameSectionLength = bytes.readInt32LE(32) + const nameSectionLength = dataView.getInt32(32, true) const { refNameToId, refIdToName } = this._parseNameBytes( bytes.slice(36, 36 + nameSectionLength), ) @@ -93,26 +88,26 @@ export default class TabixIndex extends IndexFile { let firstDataLine: VirtualOffset | undefined const indices = new Array(refCount).fill(0).map(() => { // the binning index - const binCount = bytes.readInt32LE(currOffset) + const binCount = dataView.getInt32(currOffset, true) currOffset += 4 const binIndex: Record = {} let stats for (let j = 0; j < binCount; j += 1) { - const bin = bytes.readUInt32LE(currOffset) + const bin = dataView.getUint32(currOffset, true) currOffset += 4 if (bin > maxBinNumber + 1) { throw new Error( 'tabix index contains too many bins, please use a CSI index', ) } else if (bin === maxBinNumber + 1) { - const chunkCount = bytes.readInt32LE(currOffset) + const chunkCount = dataView.getInt32(currOffset, true) currOffset += 4 if (chunkCount === 2) { stats = this.parsePseudoBin(bytes, currOffset) } currOffset += 16 * chunkCount } else { - const chunkCount = bytes.readInt32LE(currOffset) + const chunkCount = dataView.getInt32(currOffset, true) currOffset += 4 const chunks = new Array(chunkCount) for (let k = 0; k < chunkCount; k += 1) { @@ -127,7 +122,7 @@ export default class TabixIndex extends IndexFile { } // the linear index - const linearCount = bytes.readInt32LE(currOffset) + const linearCount = dataView.getInt32(currOffset, true) currOffset += 4 const linearIndex = new Array(linearCount) for (let k = 0; k < linearCount; k += 1) { @@ -135,7 +130,11 @@ export default class TabixIndex extends IndexFile { currOffset += 8 firstDataLine = this._findFirstData(firstDataLine, linearIndex[k]) } - return { binIndex, linearIndex, stats } + return { + binIndex, + linearIndex, + stats, + } }) return { @@ -154,26 +153,28 @@ export default class TabixIndex extends IndexFile { } } - parsePseudoBin(bytes: Buffer, offset: number) { + parsePseudoBin(bytes: Uint8Array, offset: number) { const lineCount = longToNumber( Long.fromBytesLE( - bytes.slice(offset + 16, offset + 24) as unknown as number[], + bytes.subarray(offset + 16, offset + 24) as unknown as number[], true, ), ) return { lineCount } } - _parseNameBytes(namesBytes: Buffer) { + _parseNameBytes(namesBytes: Uint8Array) { let currRefId = 0 let currNameStart = 0 const refIdToName: string[] = [] const refNameToId: Record = {} + const decoder = new TextDecoder('utf8') for (let i = 0; i < namesBytes.length; i += 1) { if (!namesBytes[i]) { if (currNameStart < i) { - let refName = namesBytes.toString('utf8', currNameStart, i) - refName = this.renameRefSeq(refName) + const refName = this.renameRefSeq( + decoder.decode(namesBytes.subarray(currNameStart, i)), + ) refIdToName[currRefId] = refName refNameToId[refName] = currRefId } @@ -181,7 +182,10 @@ export default class TabixIndex extends IndexFile { currRefId += 1 } } - return { refNameToId, refIdToName } + return { + refNameToId, + refIdToName, + } } async blocksForRange( diff --git a/src/virtualOffset.ts b/src/virtualOffset.ts index 3793006..91a5b9f 100644 --- a/src/virtualOffset.ts +++ b/src/virtualOffset.ts @@ -1,4 +1,3 @@ -import { Buffer } from 'buffer' export default class VirtualOffset { public blockPosition: number public dataPosition: number @@ -17,11 +16,7 @@ export default class VirtualOffset { ) } } -export function fromBytes(bytes: Buffer, offset = 0, bigendian = false) { - if (bigendian) { - throw new Error('big-endian virtual file offsets not implemented') - } - +export function fromBytes(bytes: Uint8Array, offset = 0) { return new VirtualOffset( bytes[offset + 7]! * 0x10000000000 + bytes[offset + 6]! * 0x100000000 + diff --git a/test/csi.test.ts b/test/csi.test.ts index ec4567e..67a9c66 100644 --- a/test/csi.test.ts +++ b/test/csi.test.ts @@ -1,5 +1,5 @@ import { expect, test } from 'vitest' -import { LocalFile } from 'generic-filehandle' +import { LocalFile } from 'generic-filehandle2' import VirtualOffset from '../src/virtualOffset' import CSI from '../src/csi' diff --git a/test/tbi.test.ts b/test/tbi.test.ts index 601d220..8d7504a 100644 --- a/test/tbi.test.ts +++ b/test/tbi.test.ts @@ -1,5 +1,5 @@ import { vi, expect, test } from 'vitest' -import { LocalFile } from 'generic-filehandle' +import { LocalFile } from 'generic-filehandle2' import VirtualOffset from '../src/virtualOffset' import TBI from '../src/tbi' diff --git a/tsconfig.json b/tsconfig.json index ba32ce6..53602ea 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "moduleResolution": "node", - "target": "es2018", + "target": "es2020", "declaration": true, "noUncheckedIndexedAccess": true, "outDir": "dist", diff --git a/webpack.config.js b/webpack.config.js index 7925392..e2c9dbf 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -3,11 +3,6 @@ const path = require('path') module.exports = { mode: 'production', entry: './dist/index.js', - resolve: { - fallback: { - buffer: require.resolve('buffer/'), - }, - }, output: { path: path.resolve(__dirname, 'dist'), filename: 'tabix-bundle.js', diff --git a/yarn.lock b/yarn.lock index b83ee37..ff65290 100644 --- a/yarn.lock +++ b/yarn.lock @@ -342,13 +342,12 @@ resolved "https://registry.yarnpkg.com/@gmod/abortable-promise-cache/-/abortable-promise-cache-2.0.1.tgz#d01cbcb2d9ad23cf0f421824b7e759a441815ebc" integrity sha512-6PQTJv+uxAb8XE/oL2Uh4EmFJpn65YOTSqGn8HLNXrWRlW1Clp1Oze6biHeRCMonLwEx4oH4bPeyjdcMnNP8pw== -"@gmod/bgzf-filehandle@^1.3.3": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@gmod/bgzf-filehandle/-/bgzf-filehandle-1.5.5.tgz#d9410e5b486cefef39de7d6dcbb517a8bfcf265f" - integrity sha512-3f4mvW0ov7rFip2TQneZJsYiQN6Be0M3ET+k4DS0Mc4GIJJblKARbY4lFt2pT5fpgOmrL55/8A0qwGawKwQN+Q== +"@gmod/bgzf-filehandle@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@gmod/bgzf-filehandle/-/bgzf-filehandle-2.0.0.tgz#1c8d3a16054a50a100cc3637e338abaa2306d60a" + integrity sha512-jCYqAln1ol44ZhG6xZkfvVRyGKU9At5prKYZtLw2LcgWwZ5zQ/0+4wvinNt6PDcc6I45aRqiK6iPQIQg9OCPVA== dependencies: - es6-promisify "^7.0.0" - generic-filehandle "^3.0.0" + generic-filehandle2 "^0.0.1" long "^4.0.0" pako "^1.0.11" @@ -403,9 +402,9 @@ integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== dependencies: "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -468,11 +467,6 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@pkgr/core@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" - integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== - "@rollup/rollup-android-arm-eabi@4.28.1": version "4.28.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz#7f4c4d8cd5ccab6e95d6750dbe00321c1f30791e" @@ -631,16 +625,16 @@ integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== "@types/node@*": - version "22.10.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.1.tgz#41ffeee127b8975a05f8c4f83fb89bcb2987d766" - integrity sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ== + version "22.10.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.2.tgz#a485426e6d1fdafc7b0d4c7b24e2c78182ddabb9" + integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ== dependencies: undici-types "~6.20.0" "@types/node@^20.11.16": - version "20.17.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.9.tgz#5f141d4b7ee125cdee5faefe28de095398865bab" - integrity sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw== + version "20.17.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.10.tgz#3f7166190aece19a0d1d364d75c8b0b5778c1e18" + integrity sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA== dependencies: undici-types "~6.19.2" @@ -669,62 +663,62 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== -"@typescript-eslint/eslint-plugin@8.17.0", "@typescript-eslint/eslint-plugin@^8.0.1": - version "8.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.17.0.tgz#2ee073c421f4e81e02d10e731241664b6253b23c" - integrity sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w== +"@typescript-eslint/eslint-plugin@8.18.0", "@typescript-eslint/eslint-plugin@^8.0.1": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.0.tgz#0901933326aea4443b81df3f740ca7dfc45c7bea" + integrity sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.17.0" - "@typescript-eslint/type-utils" "8.17.0" - "@typescript-eslint/utils" "8.17.0" - "@typescript-eslint/visitor-keys" "8.17.0" + "@typescript-eslint/scope-manager" "8.18.0" + "@typescript-eslint/type-utils" "8.18.0" + "@typescript-eslint/utils" "8.18.0" + "@typescript-eslint/visitor-keys" "8.18.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@8.17.0", "@typescript-eslint/parser@^8.0.1": - version "8.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.17.0.tgz#2ee972bb12fa69ac625b85813dc8d9a5a053ff52" - integrity sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg== +"@typescript-eslint/parser@8.18.0", "@typescript-eslint/parser@^8.0.1": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.18.0.tgz#a1c9456cbb6a089730bf1d3fc47946c5fb5fe67b" + integrity sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q== dependencies: - "@typescript-eslint/scope-manager" "8.17.0" - "@typescript-eslint/types" "8.17.0" - "@typescript-eslint/typescript-estree" "8.17.0" - "@typescript-eslint/visitor-keys" "8.17.0" + "@typescript-eslint/scope-manager" "8.18.0" + "@typescript-eslint/types" "8.18.0" + "@typescript-eslint/typescript-estree" "8.18.0" + "@typescript-eslint/visitor-keys" "8.18.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.17.0": - version "8.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.17.0.tgz#a3f49bf3d4d27ff8d6b2ea099ba465ef4dbcaa3a" - integrity sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg== +"@typescript-eslint/scope-manager@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz#30b040cb4557804a7e2bcc65cf8fdb630c96546f" + integrity sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw== dependencies: - "@typescript-eslint/types" "8.17.0" - "@typescript-eslint/visitor-keys" "8.17.0" + "@typescript-eslint/types" "8.18.0" + "@typescript-eslint/visitor-keys" "8.18.0" -"@typescript-eslint/type-utils@8.17.0": - version "8.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz#d326569f498cdd0edf58d5bb6030b4ad914e63d3" - integrity sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw== +"@typescript-eslint/type-utils@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.18.0.tgz#6f0d12cf923b6fd95ae4d877708c0adaad93c471" + integrity sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow== dependencies: - "@typescript-eslint/typescript-estree" "8.17.0" - "@typescript-eslint/utils" "8.17.0" + "@typescript-eslint/typescript-estree" "8.18.0" + "@typescript-eslint/utils" "8.18.0" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@8.17.0": - version "8.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.17.0.tgz#ef84c709ef8324e766878834970bea9a7e3b72cf" - integrity sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA== +"@typescript-eslint/types@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.18.0.tgz#3afcd30def8756bc78541268ea819a043221d5f3" + integrity sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA== -"@typescript-eslint/typescript-estree@8.17.0": - version "8.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.17.0.tgz#40b5903bc929b1e8dd9c77db3cb52cfb199a2a34" - integrity sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw== +"@typescript-eslint/typescript-estree@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz#d8ca785799fbb9c700cdff1a79c046c3e633c7f9" + integrity sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg== dependencies: - "@typescript-eslint/types" "8.17.0" - "@typescript-eslint/visitor-keys" "8.17.0" + "@typescript-eslint/types" "8.18.0" + "@typescript-eslint/visitor-keys" "8.18.0" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -732,22 +726,22 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@8.17.0": - version "8.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.17.0.tgz#41c05105a2b6ab7592f513d2eeb2c2c0236d8908" - integrity sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w== +"@typescript-eslint/utils@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.18.0.tgz#48f67205d42b65d895797bb7349d1be5c39a62f7" + integrity sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.17.0" - "@typescript-eslint/types" "8.17.0" - "@typescript-eslint/typescript-estree" "8.17.0" + "@typescript-eslint/scope-manager" "8.18.0" + "@typescript-eslint/types" "8.18.0" + "@typescript-eslint/typescript-estree" "8.18.0" -"@typescript-eslint/visitor-keys@8.17.0": - version "8.17.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.17.0.tgz#4dbcd0e28b9bf951f4293805bf34f98df45e1aa8" - integrity sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg== +"@typescript-eslint/visitor-keys@8.18.0": + version "8.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz#7b6d33534fa808e33a19951907231ad2ea5c36dd" + integrity sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw== dependencies: - "@typescript-eslint/types" "8.17.0" + "@typescript-eslint/types" "8.18.0" eslint-visitor-keys "^4.2.0" "@vitest/coverage-v8@^2.0.5": @@ -1105,11 +1099,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - binary-extensions@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" @@ -1152,14 +1141,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - builtin-modules@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" @@ -1496,9 +1477,9 @@ eastasianwidth@^0.2.0: integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.5.41: - version "1.5.71" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.71.tgz#d8b5dba1e55b320f2f4e9b1ca80738f53fcfec2b" - integrity sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA== + version "1.5.73" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz#f32956ce40947fa3c8606726a96cd8fb5bb5f720" + integrity sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg== emoji-regex@^8.0.0: version "8.0.0" @@ -1540,16 +1521,6 @@ es-module-lexer@^1.2.1, es-module-lexer@^1.5.4: resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== -es6-promisify@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.1.1.tgz#46837651b7b06bf6fff893d03f29393668d01621" - integrity sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg== - -es6-promisify@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-7.0.0.tgz#9a710008dd6a4ab75a89e280bad787bfb749927b" - integrity sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q== - esbuild@^0.21.3: version "0.21.5" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" @@ -1599,19 +1570,6 @@ escape-string-regexp@^5.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== -eslint-config-prettier@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" - integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== - -eslint-plugin-prettier@^5.0.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz#d1c8f972d8f60e414c25465c163d16f209411f95" - integrity sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw== - dependencies: - prettier-linter-helpers "^1.0.0" - synckit "^0.9.1" - eslint-plugin-unicorn@^56.0.0: version "56.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.1.tgz#d10a3df69ba885939075bdc95a65a0c872e940d4" @@ -1770,11 +1728,6 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.1.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== - fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" @@ -1892,12 +1845,10 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -generic-filehandle@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/generic-filehandle/-/generic-filehandle-3.2.0.tgz#f65401ce71bccadb796335495c3d9250185876d4" - integrity sha512-tG6ZGpKVQn1N6WLlOFoDZL54wdrBSelY3Mk3R9nTPYas0odoY9LcGvUJmb9jGghFC4hy3WY8EqQUIQk0ni/0jg== - dependencies: - es6-promisify "^6.1.1" +generic-filehandle2@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/generic-filehandle2/-/generic-filehandle2-0.0.1.tgz#7f26ee54a939ed588d6bdb3a453bb2255ccd2be9" + integrity sha512-cySnWoVmNUSkRztAwlghNVAYXUh+VVy/fxn8tT3jZIo8UQEHkYL7ueSUseBZrwqBCq9n06Wp/F4xv2q2/SwYCQ== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" @@ -2186,11 +2137,6 @@ html-void-elements@^2.0.0: resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ignore@^5.2.0, ignore@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" @@ -2433,9 +2379,9 @@ js-yaml@^4.1.0: argparse "^2.0.1" jsesc@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" - integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== jsesc@~0.5.0: version "0.5.0" @@ -2581,9 +2527,9 @@ lru-cache@^6.0.0: yallist "^4.0.0" magic-string@^0.30.11, magic-string@^0.30.12: - version "0.30.14" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.14.tgz#e9bb29870b81cfc1ec3cc656552f5a7fcbf19077" - integrity sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw== + version "0.30.15" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.15.tgz#d5474a2c4c5f35f041349edaba8a5cb02733ed3c" + integrity sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" @@ -3153,9 +3099,9 @@ neo-async@^2.6.2: integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== node-releases@^2.0.18: - version "2.0.18" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" - integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== normalize-package-data@^2.5.0: version "2.5.0" @@ -3420,13 +3366,6 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - prettier@^3.3.3: version "3.4.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" @@ -3932,14 +3871,6 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -synckit@^0.9.1: - version "0.9.2" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62" - integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw== - dependencies: - "@pkgr/core" "^0.1.0" - tslib "^2.6.2" - tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -4022,11 +3953,6 @@ ts-api-utils@^1.3.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== -tslib@^2.6.2: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -4055,18 +3981,18 @@ type-fest@^4.6.0, type-fest@^4.7.1: integrity sha512-G6zXWS1dLj6eagy6sVhOMQiLtJdxQBHIA9Z6HFUNLOlr6MFOgzV8wvmidtPONfPtEUv0uZsy77XJNzTAfwPDaA== typescript-eslint@^8.0.1: - version "8.17.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.17.0.tgz#fa4033c26b3b40f778287bc12918d985481b220b" - integrity sha512-409VXvFd/f1br1DCbuKNFqQpXICoTB+V51afcwG1pn1a3Cp92MqAUges3YjwEdQ0cMUoCIodjVDAYzyD8h3SYA== - dependencies: - "@typescript-eslint/eslint-plugin" "8.17.0" - "@typescript-eslint/parser" "8.17.0" - "@typescript-eslint/utils" "8.17.0" - -typescript@~5.6.0: - version "5.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" - integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + version "8.18.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.18.0.tgz#41026f27a3481185f3239d817ae5b960572145a0" + integrity sha512-Xq2rRjn6tzVpAyHr3+nmSg1/9k9aIHnJ2iZeOH7cfGOWqTkXTm3kwpQglEuLGdNrYvPF+2gtAs+/KF5rjVo+WQ== + dependencies: + "@typescript-eslint/eslint-plugin" "8.18.0" + "@typescript-eslint/parser" "8.18.0" + "@typescript-eslint/utils" "8.18.0" + +typescript@^5.7.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== uglify-js@^3.1.4: version "3.19.3"