From 5950b416fa855b6e2236b8887f29b4781eda9611 Mon Sep 17 00:00:00 2001 From: Colin Diesh Date: Sun, 8 Dec 2024 16:01:37 -0500 Subject: [PATCH] Fix parsing header lines where values are containing square bracket lists (#107) --- README.md | 42 +- eslint.config.mjs | 46 + package.json | 3 +- src/index.ts | 8 +- src/parse.ts | 87 +- src/parseMetaString.ts | 60 + test/__snapshots__/parse.test.ts.snap | 1364 ++++++++++++++--- .../parseMetaString.test.ts.snap | 22 + test/data/breakends.vcf | 4 + test/data/clinvar.header.vcf | 42 + test/data/pedigree.vcf | 5 + test/data/sample2genotype.vcf | 11 + test/data/sniffles.vcf | 23 + test/data/spec-example.vcf | 23 + test/data/weird_info_and_missing_format.vcf | 7 + test/data/y-chrom-haploid.vcf | 42 + test/parse.test.ts | 178 +-- test/parseMetaString.test.ts | 21 + yarn.lock | 927 ++++++----- 19 files changed, 1989 insertions(+), 926 deletions(-) create mode 100644 src/parseMetaString.ts create mode 100644 test/__snapshots__/parseMetaString.test.ts.snap create mode 100644 test/data/breakends.vcf create mode 100644 test/data/clinvar.header.vcf create mode 100644 test/data/pedigree.vcf create mode 100644 test/data/sample2genotype.vcf create mode 100644 test/data/sniffles.vcf create mode 100644 test/data/spec-example.vcf create mode 100644 test/data/weird_info_and_missing_format.vcf create mode 100644 test/data/y-chrom-haploid.vcf create mode 100644 test/parseMetaString.test.ts diff --git a/README.md b/README.md index c9ef966..d49fdb4 100644 --- a/README.md +++ b/README.md @@ -96,34 +96,26 @@ The `variant` object returned by `parseLine()` would be DB: true, XYZ: ['5'], }, + SAMPLES: () => ({ + HG00096: { + GT: ['0|0'], + AP: ['0.000', '0.000'], + }, + }), + GENOTYPES: () => ({ + HG00096: '0|0', + }), } ``` -The `variant` object will also has two methods called "`SAMPLES()`" and -"`GENOTYPES()`" that will not be evaluated unless it is called. - -This can save time if you only want the variant information and not the -sample-specific information, especially if your VCF has a lot of samples in it. - -In the above case the `variant.SAMPLES()` object would look like - -```typescript -{ - HG00096: { - GT: ['0|0'], - AP: ['0.000', '0.000'], - }, -} -``` - -whil the `variant.GENOTYPES()` object would look like this (only extracts the GT -as a raw string) +The `variant.SAMPLES()` and `variant.GENOTYPES()` are functions because it does not +try to eagerly parse all the genotype data, so will only do so when you call +either of these which can save time especially if your VCF has a lot of samples +in it. -```typescript -{ - HG00096: '0|0' -} -``` +The `variant.SAMPLES()` function parses out the FORMAT fields, while +`variant.GENOTYPES()` returns just the genotypes string which can be faster if +that is the only information you are interested in The parser will try to convert the values in INFO and FORMAT to the proper types using the header metadata. For example, if there is a header line like @@ -316,7 +308,7 @@ Returns **any** An object, string, or number, depending on the filtering Parse a VCF line into an object like -```json +```typescript { CHROM: 'contigA', POS: 3000, diff --git a/eslint.config.mjs b/eslint.config.mjs index 8e9a31e..6ecc48f 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,4 +1,5 @@ import eslint from '@eslint/js' +import eslintPluginUnicorn from 'eslint-plugin-unicorn' import tseslint from 'typescript-eslint' export default tseslint.config( @@ -17,6 +18,7 @@ export default tseslint.config( ...tseslint.configs.recommended, ...tseslint.configs.stylisticTypeChecked, ...tseslint.configs.strictTypeChecked, + eslintPluginUnicorn.configs['flat/recommended'], { rules: { curly: 'error', @@ -40,6 +42,50 @@ export default tseslint.config( '@typescript-eslint/no-unsafe-return': 'off', '@typescript-eslint/no-non-null-assertion': 'off', '@typescript-eslint/restrict-template-expressions': 'off', + + 'unicorn/no-new-array': 'off', + 'unicorn/no-empty-file': 'off', + 'unicorn/prefer-type-error': 'off', + 'unicorn/prefer-modern-math-apis': 'off', + 'unicorn/prefer-node-protocol': 'off', + 'unicorn/no-unreadable-array-destructuring': 'off', + 'unicorn/no-abusive-eslint-disable': 'off', + 'unicorn/no-array-callback-reference': 'off', + 'unicorn/number-literal-case': 'off', + 'unicorn/prefer-add-event-listener': 'off', + 'unicorn/prefer-top-level-await': 'off', + 'unicorn/consistent-function-scoping': 'off', + 'unicorn/no-await-expression-member': 'off', + 'unicorn/no-lonely-if': 'off', + 'unicorn/consistent-destructuring': 'off', + 'unicorn/prefer-module': 'off', + 'unicorn/prefer-optional-catch-binding': 'off', + 'unicorn/no-useless-undefined': 'off', + 'unicorn/no-null': 'off', + 'unicorn/no-nested-ternary': 'off', + 'unicorn/filename-case': 'off', + 'unicorn/catch-error-name': 'off', + 'unicorn/prevent-abbreviations': 'off', + 'unicorn/prefer-code-point': 'off', + 'unicorn/numeric-separators-style': 'off', + 'unicorn/no-array-for-each': 'off', + 'unicorn/prefer-spread': 'off', + 'unicorn/explicit-length-check': 'off', + 'unicorn/prefer-regexp-test': 'off', + 'unicorn/relative-url-style': 'off', + 'unicorn/prefer-math-trunc': 'off', + 'unicorn/prefer-query-selector': 'off', + 'unicorn/no-negated-condition': 'off', + 'unicorn/switch-case-braces': 'off', + 'unicorn/prefer-switch': 'off', + 'unicorn/better-regex': 'off', + 'unicorn/no-for-loop': 'off', + 'unicorn/escape-case': 'off', + 'unicorn/prefer-number-properties': 'off', + 'unicorn/no-process-exit': 'off', + 'unicorn/prefer-at': 'off', + 'unicorn/prefer-structured-clone': 'off', + 'unicorn/prefer-string-replace-all': 'off', }, }, ) diff --git a/package.json b/package.json index 2878e19..0445a55 100644 --- a/package.json +++ b/package.json @@ -40,13 +40,12 @@ "devDependencies": { "@babel/core": "^7.20.5", "@eslint/js": "^9.7.0", + "@types/node": "^22.10.1", "@typescript-eslint/eslint-plugin": "^8.8.1", "@typescript-eslint/parser": "^8.8.1", "@vitest/coverage-v8": "^2.1.3", "documentation": "^14.0.1", "eslint": "^9.7.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-unicorn": "^56.0.0", "prettier": "^3.2.4", "rimraf": "^6.0.1", diff --git a/src/index.ts b/src/index.ts index a7e9961..ffeb42b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,3 @@ -import VCFParser from './parse' - export interface Breakend { Join: string Replacement: string @@ -42,7 +40,7 @@ export function parseBreakend(breakendString: string): Breakend | undefined { return { Join: 'right', SingleBreakend: true, - Replacement: breakendString.slice(0, breakendString.length - 1), + Replacement: breakendString.slice(0, -1), } } else if (breakendString.startsWith('<')) { const res = /<(.*)>(.*)/.exec(breakendString) @@ -77,6 +75,6 @@ export function parseBreakend(breakendString: string): Breakend | undefined { return undefined } -export default VCFParser - export type { Variant } from './parse' + +export { default } from './parse' diff --git a/src/parse.ts b/src/parse.ts index 555e523..09ed3e6 100644 --- a/src/parse.ts +++ b/src/parse.ts @@ -1,3 +1,4 @@ +import { parseMetaString } from './parseMetaString' import vcfReserved from './vcfReserved' function decodeURIComponentNoThrow(uri: string) { @@ -35,7 +36,7 @@ export default class VCFParser { if (!header.length) { throw new Error('empty header received') } - const headerLines = header.split(/[\r\n]+/).filter(line => line) + const headerLines = header.split(/[\r\n]+/).filter(Boolean) if (!headerLines.length) { throw new Error('no non-empty header lines specified') } @@ -129,7 +130,7 @@ export default class VCFParser { genotypes[sample] = rest[i++]! } } else { - const gtIndex = formatSplit.findIndex(f => f === 'GT') + const gtIndex = formatSplit.indexOf('GT') if (gtIndex === 0) { for (const sample of this.samples) { const val = rest[i++]! @@ -171,7 +172,15 @@ export default class VCFParser { this.metadata[r] = {} } const [id, keyVals] = this.parseStructuredMetaVal(metaVal) - ;(this.metadata[r] as Record)[id] = keyVals + if (id) { + // if there is an ID field in the <> metadata + // e.g. ##INFO= + ;(this.metadata[r] as Record)[id] = keyVals + } else { + // if there is not an ID field in the <> metadata + // e.g. ##ID= + this.metadata[r] = keyVals + } } else { this.metadata[r] = metaVal } @@ -187,8 +196,8 @@ export default class VCFParser { * and 2) an object with the other key-value pairs in the metadata */ private parseStructuredMetaVal(metaVal: string) { - const keyVals = this.parseKeyValue(metaVal.replace(/^<|>$/g, ''), ',') - const id = keyVals.ID as string + const keyVals = parseMetaString(metaVal) + const id = keyVals.ID! delete keyVals.ID if ('Number' in keyVals) { if (!Number.isNaN(Number(keyVals.Number))) { @@ -218,69 +227,10 @@ export default class VCFParser { return filteredMetadata } - /** - * Sometimes VCFs have key-value strings that allow the separator within the - * value if it's in quotes, like: - * 'ID=DB,Number=0,Type=Flag,Description="dbSNP membership, build 129"' - * - * Parse this at a low level since we can't just split at "," (or whatever - * separator). Above line would be parsed to: {ID: 'DB', Number: '0', Type: - * 'Flag', Description: 'dbSNP membership, build 129'} - */ - private parseKeyValue(str: string, pairSeparator = ';') { - const data = {} as Record - let currKey = '' - let currValue = '' - - // states: - // 1: read key to = or pair sep - // 2: read value to sep or quote - // 3: read value to quote - let state = 1 - for (const s of str) { - if (state === 1) { - // read key to = or pair sep - if (s === '=') { - state = 2 - } else if (s !== pairSeparator) { - currKey += s - } else if (currValue === '') { - data[currKey] = undefined - currKey = '' - } - } else if (state === 2) { - // read value to pair sep or quote - if (s === pairSeparator) { - data[currKey] = currValue - currKey = '' - currValue = '' - state = 1 - } else if (s === '"') { - state = 3 - } else { - currValue += s - } - } else if (state === 3) { - // read value to quote - if (s !== '"') { - currValue += s - } else { - state = 2 - } - } - } - if (state === 2 || state === 3) { - data[currKey] = currValue - } else if (state === 1) { - data[currKey] = undefined - } - return data - } - /** * Parse a VCF line into an object like * - * ```json + * ```typescript * { * CHROM: 'contigA', * POS: 3000, @@ -350,7 +300,12 @@ export default class VCFParser { const info = fields[7] === undefined || fields[7] === '.' ? {} - : this.parseKeyValue(fields[7]) + : Object.fromEntries( + fields[7].split(';').map(r => { + const ret = r.split('=') + return [ret[0], ret[1]] + }), + ) for (const key of Object.keys(info)) { const items = (info[key] as string | undefined) diff --git a/src/parseMetaString.ts b/src/parseMetaString.ts new file mode 100644 index 0000000..6033e82 --- /dev/null +++ b/src/parseMetaString.ts @@ -0,0 +1,60 @@ +// constructed with the assistance of claude AI +// +// I first prompted it with a regex that splits a comma separated string with +// awareness of quotation from this stackoverflow queston +// https://stackoverflow.com/a/18893443/2129219, and asked it to add support +// for square brackets +// +// the result was this function +function customSplit(str: string) { + const result = [] + let current = '' + let inQuotes = false + let inBrackets = false + + for (const char of str) { + if (char === '"') { + inQuotes = !inQuotes + current += char + } else if (char === '[') { + inBrackets = true + current += char + } else if (char === ']') { + inBrackets = false + current += char + } else if (char === ',' && !inQuotes && !inBrackets) { + result.push(current.trim()) + current = '' + } else { + current += char + } + } + + if (current) { + result.push(current.trim()) + } + + return result +} + +export function parseMetaString(metaString: string) { + const inside = metaString.replace(/^<|>$/g, '') + return Object.fromEntries( + customSplit(inside).map(f => { + const [key, val] = f.split('=').map(f => f.trim()) + if (val && val.startsWith('[') && val.endsWith(']')) { + return [ + key, + val + .slice(1, -1) + .split(',') + .map(f => f.trim()), + ] + } else if (val && val.startsWith('"') && val.endsWith('"')) { + return [key, val.slice(1, -1)] + } else { + return [key, val?.replaceAll(/^"|"$/g, '')] + } + }), + ) +} diff --git a/test/__snapshots__/parse.test.ts.snap b/test/__snapshots__/parse.test.ts.snap index a2d75e0..f33d218 100644 --- a/test/__snapshots__/parse.test.ts.snap +++ b/test/__snapshots__/parse.test.ts.snap @@ -674,88 +674,6 @@ exports[`can parse a line from the VCF spec 2`] = ` } `; -exports[`can parse a line from the VCF spec 3`] = ` -{ - "ALT": [ - "", - ], - "CHROM": "8", - "FILTER": "PASS", - "GENOTYPES": [Function], - "ID": [ - "28329_0", - ], - "INFO": { - "AF": [ - 0.971429, - ], - "CHR2": [ - "8", - ], - "END": [ - 17709148, - ], - "Kurtosis_quant_start": [ - "20.524521", - ], - "Kurtosis_quant_stop": [ - "3.925926", - ], - "PRECISE": true, - "RE": [ - 34, - ], - "STD_quant_start": [ - "0.000000", - ], - "STD_quant_stop": [ - "0.000000", - ], - "STRANDS": [ - "+-", - ], - "STRANDS2": [ - "20", - "14", - "20", - "14", - ], - "SUPTYPE": [ - "AL", - ], - "SVLEN": [ - 33, - ], - "SVMETHOD": [ - "Snifflesv1.0.3", - ], - "SVTYPE": [ - "DEL", - ], - }, - "POS": 17709115, - "QUAL": undefined, - "REF": "N", - "SAMPLES": [Function], -} -`; - -exports[`can parse a line from the VCF spec 4`] = ` -{ - "/seq/schatz/fritz/sv-paper/real/Nanopore_NA12878/mapped/ngm_Nanopore_human_ngmlr-0.2.3_mapped.bam": { - "DR": [ - 1, - ], - "DV": [ - 34, - ], - "GT": [ - "1/1", - ], - }, -} -`; - exports[`can parse a line from the VCF spec Y chrom (haploid)) 1`] = ` { "ALT": [ @@ -1124,152 +1042,1068 @@ exports[`can parse breakends 1`] = ` ] `; -exports[`parse breakend on thing that looks like symbolic allele but is actually a feature 1`] = ` -{ - "Join": "left", - "MateDirection": "right", - "MatePosition": ":1", - "Replacement": "C", -} -`; - -exports[`parses a line with a breakend ALT 1`] = ` -{ - "ALT": [ - "G]17:198982]", - ], - "CHROM": "2", - "FILTER": "PASS", - "GENOTYPES": [Function], - "ID": [ - "bnd_W", - ], - "INFO": { - "SVTYPE": [ - "BND", - ], - }, - "POS": 321681, - "QUAL": 6, - "REF": "G", - "SAMPLES": [Function], -} -`; - -exports[`parses a line with mix of multiple breakends and non breakends 1`] = ` +exports[`clinvar metadata 1`] = ` { - "ALT": [ - "CTATGTCG", - "C[2 : 321682[", - "C[17 : 198983[", - ], - "CHROM": "13", - "FILTER": "PASS", - "GENOTYPES": [Function], - "ID": [ - "bnd_U", - ], - "INFO": { - "MATEID": [ - "bnd V", - "bnd Z", - ], - "SVTYPE": [ - "BND", - ], + "ALT": { + "*": { + "Description": "Represents any possible alternative allele at this location", + }, + "CNV": { + "Description": "Copy number variable region (may be both deletion and duplication)", + }, + "DEL": { + "Description": "Deletion relative to the reference", + }, + "DEL:ME": { + "Description": "Deletion of mobile element relative to the reference", + }, + "DUP": { + "Description": "Region of elevated copy number relative to the reference", + }, + "DUP:TANDEM": { + "Description": "Tandem duplication", + }, + "INS": { + "Description": "Insertion of novel sequence relative to the reference", + }, + "INS:ME": { + "Description": "Insertion of a mobile element relative to the reference", + }, + "INV": { + "Description": "Inversion of reference sequence", + }, + "NON_REF": { + "Description": "Represents any possible alternative allele at this location", + }, }, - "POS": 123456, - "QUAL": 6, - "REF": "C", - "SAMPLES": [Function], -} -`; - -exports[`shortcut parsing with 1000 genomes 1`] = ` -[ - { - "ALT": [ - "A", - ], - "CHROM": "Y", - "FILTER": "PASS", - "GENOTYPES": [Function], - "ID": [ - "rs11575897", - ], - "INFO": { - "AA": [ - "G", - ], - "AC": [ - 22, - ], - "AF": [ - 0.0178427, - ], - "AFR_AF": [ - 0, - ], - "AMR_AF": [ - 0, - ], - "AN": [ - 1233, - ], - "DP": [ - 84761, - ], - "EAS_AF": [ - 0.0902, - ], - "EUR_AF": [ - 0, - ], - "EX_TARGET": true, - "NS": [ - 1233, - ], - "SAS_AF": [ - 0, - ], - "VT": [ - "SNP", - ], + "FILTER": { + "PASS": { + "Description": "Passed all filters", }, - "POS": 2655180, - "QUAL": 100, - "REF": "G", - "SAMPLES": [Function], }, - { - "ALT": [ - "C", - ], - "CHROM": "Y", - "FILTER": "PASS", - "GENOTYPES": [Function], - "ID": undefined, - "INFO": { - "AA": [ - "A", - ], - "AC": [ - 5, - ], - "AF": [ - 0.00405515, - ], - "AFR_AF": [ - 0, - ], - "AMR_AF": [ - 0, - ], - "AN": [ - 1233, - ], - "DP": [ - 72067, + "FORMAT": { + "AD": { + "Description": "Read depth for each allele", + "Number": "R", + "Type": "Integer", + }, + "ADF": { + "Description": "Read depth for each allele on the forward strand", + "Number": "R", + "Type": "Integer", + }, + "ADR": { + "Description": "Read depth for each allele on the reverse strand", + "Number": "R", + "Type": "Integer", + }, + "DP": { + "Description": "Read depth", + "Number": 1, + "Type": "Integer", + }, + "EC": { + "Description": "Expected alternate allele counts", + "Number": "A", + "Type": "Integer", + }, + "FT": { + "Description": "Filter indicating if this genotype was "called"", + "Number": 1, + "Type": "String", + }, + "GL": { + "Description": "Genotype likelihoods", + "Number": "G", + "Type": "Float", + }, + "GP": { + "Description": "Genotype posterior probabilities", + "Number": "G", + "Type": "Float", + }, + "GQ": { + "Description": "Conditional genotype quality", + "Number": 1, + "Type": "Integer", + }, + "GT": { + "Description": "Genotype", + "Number": 1, + "Type": "String", + }, + "HQ": { + "Description": "Haplotype quality", + "Number": 2, + "Type": "Integer", + }, + "MQ": { + "Description": "RMS mapping quality", + "Number": 1, + "Type": "Integer", + }, + "PL": { + "Description": "Phred-scaled genotype likelihoods rounded to the closest integer", + "Number": "G", + "Type": "Integer", + }, + "PQ": { + "Description": "Phasing quality", + "Number": 1, + "Type": "Integer", + }, + "PS": { + "Description": "Phase set", + "Number": 1, + "Type": "Integer", + }, + }, + "ID": { + "Description": "ClinVar Variation ID", + }, + "INFO": { + "1000G": { + "Description": "1000 Genomes membership", + "Number": 0, + "Type": "Flag", + }, + "AA": { + "Description": "Ancestral allele", + "Number": 1, + "Type": "String", + }, + "AC": { + "Description": "Allele count in genotypes, for each ALT allele, in the same order as listed", + "Number": "A", + "Type": "Integer", + }, + "AD": { + "Description": "Total read depth for each allele", + "Number": "R", + "Type": "Integer", + }, + "ADF": { + "Description": "Read depth for each allele on the forward strand", + "Number": "R", + "Type": "Integer", + }, + "ADR": { + "Description": "Read depth for each allele on the reverse strand", + "Number": "R", + "Type": "Integer", + }, + "AF": { + "Description": "Allele frequency for each ALT allele in the same order as listed (estimated from primary data, not called genotypes)", + "Number": "A", + "Type": "Float", + }, + "AF_ESP": { + "Description": "allele frequencies from GO-ESP", + "Number": 1, + "Type": "Float", + }, + "AF_EXAC": { + "Description": "allele frequencies from ExAC", + "Number": 1, + "Type": "Float", + }, + "AF_TGP": { + "Description": "allele frequencies from TGP", + "Number": 1, + "Type": "Float", + }, + "ALLELEID": { + "Description": "the ClinVar Allele ID", + "Number": 1, + "Type": "Integer", + }, + "AN": { + "Description": "Total number of alleles in called genotypes", + "Number": 1, + "Type": "Integer", + }, + "BKPTID": { + "Description": "ID of the assembled alternate allele in the assembly file", + "Type": "String", + }, + "BQ": { + "Description": "RMS base quality", + "Number": 1, + "Type": "Float", + }, + "CICN": { + "Description": "Confidence interval around copy number for the segment", + "Number": 2, + "Type": "Integer", + }, + "CICNADJ": { + "Description": "Confidence interval around copy number for the adjacency", + "Number": null, + "Type": "Integer", + }, + "CIEND": { + "Description": "Confidence interval around END for imprecise variants", + "Number": 2, + "Type": "Integer", + }, + "CIGAR": { + "Description": "Cigar string describing how to align an alternate allele to the reference allele", + "Number": 1, + "Type": "Float", + }, + "CILEN": { + "Description": "Confidence interval around the inserted material between breakend", + "Number": 2, + "Type": "Integer", + }, + "CIPOS": { + "Description": "Confidence interval around POS for imprecise variants", + "Number": 2, + "Type": "Integer", + }, + "CLNDISDB": { + "Description": "Tag-value pairs of disease database name and identifier submitted for germline classifications, e.g. OMIM:NNNNNN", + "Number": ".", + "Type": "String", + }, + "CLNDISDBINCL": { + "Description": "For included Variant: Tag-value pairs of disease database name and identifier for germline classifications, e.g. OMIM:NNNNNN", + "Number": ".", + "Type": "String", + }, + "CLNDN": { + "Description": "ClinVar's preferred disease name for the concept specified by disease identifiers in CLNDISDB", + "Number": ".", + "Type": "String", + }, + "CLNDNINCL": { + "Description": "For included Variant : ClinVar's preferred disease name for the concept specified by disease identifiers in CLNDISDB", + "Number": ".", + "Type": "String", + }, + "CLNHGVS": { + "Description": "Top-level (primary assembly, alt, or patch) HGVS expression.", + "Number": ".", + "Type": "String", + }, + "CLNREVSTAT": { + "Description": "ClinVar review status of germline classification for the Variation ID", + "Number": ".", + "Type": "String", + }, + "CLNSIG": { + "Description": "Aggregate germline classification for this single variant; multiple values are separated by a vertical bar", + "Number": ".", + "Type": "String", + }, + "CLNSIGCONF": { + "Description": "Conflicting germline classification for this single variant; multiple values are separated by a vertical bar", + "Number": ".", + "Type": "String", + }, + "CLNSIGINCL": { + "Description": "Germline classification for a haplotype or genotype that includes this variant. Reported as pairs of VariationID:classification; multiple values are separated by a vertical bar", + "Number": ".", + "Type": "String", + }, + "CLNVC": { + "Description": "Variant type", + "Number": 1, + "Type": "String", + }, + "CLNVCSO": { + "Description": "Sequence Ontology id for variant type", + "Number": 1, + "Type": "String", + }, + "CLNVI": { + "Description": "the variant's clinical sources reported as tag-value pairs of database and variant identifier", + "Number": ".", + "Type": "String", + }, + "CN": { + "Description": "Copy number of segment containing breakend", + "Number": 1, + "Type": "Integer", + }, + "CNADJ": { + "Description": "Copy number of adjacency", + "Number": null, + "Type": "Integer", + }, + "DB": { + "Description": "dbSNP membership", + "Number": 0, + "Type": "Flag", + }, + "DBRIPID": { + "Description": "ID of this element in DBRIP", + "Number": 1, + "Type": "String", + }, + "DBVARID": { + "Description": "nsv accessions from dbVar for the variant", + "Number": ".", + "Type": "String", + }, + "DGVID": { + "Description": "ID of this element in Database of Genomic Variation", + "Number": 1, + "Type": "String", + }, + "DP": { + "Description": "combined depth across samples", + "Number": 1, + "Type": "Integer", + }, + "DPADJ": { + "Description": "Read Depth of adjacency", + "Type": "Integer", + }, + "END": { + "Description": "End position (for use with symbolic alleles)", + "Number": 1, + "Type": "Integer", + }, + "EVENT": { + "Description": "ID of event associated to breakend", + "Number": 1, + "Type": "String", + }, + "GENEINFO": { + "Description": "Gene(s) for the variant reported as gene symbol:gene id. The gene symbol and id are delimited by a colon (:) and each pair is delimited by a vertical bar (|)", + "Number": 1, + "Type": "String", + }, + "H2": { + "Description": "HapMap2 membership", + "Number": 0, + "Type": "Flag", + }, + "H3": { + "Description": "HapMap3 membership", + "Number": 0, + "Type": "Flag", + }, + "HOMLEN": { + "Description": "Length of base pair identical micro-homology at event breakpoints", + "Type": "Integer", + }, + "HOMSEQ": { + "Description": "Sequence of base pair identical micro-homology at event breakpoints", + "Type": "String", + }, + "IMPRECISE": { + "Description": "Imprecise structural variation", + "Number": 0, + "Type": "Flag", + }, + "MATEID": { + "Description": "ID of mate breakends", + "Number": null, + "Type": "String", + }, + "MC": { + "Description": "comma separated list of molecular consequence in the form of Sequence Ontology ID|molecular_consequence", + "Number": ".", + "Type": "String", + }, + "MEINFO": { + "Description": "Mobile element info of the form NAME,START,END,POLARITY", + "Number": 4, + "Type": "String", + }, + "METRANS": { + "Description": "Mobile element transduction info of the form CHR,START,END,POLARITY", + "Number": 4, + "Type": "String", + }, + "MQ": { + "Description": "RMS mapping quality", + "Number": 1, + "Type": null, + }, + "MQ0": { + "Description": "Number of MAPQ == 0 reads", + "Number": 1, + "Type": "Integer", + }, + "NOVEL": { + "Description": "Indicates a novel structural variation", + "Number": 0, + "Type": "Flag", + }, + "NS": { + "Description": "Number of samples with data", + "Number": 1, + "Type": "Integer", + }, + "ONC": { + "Description": "Aggregate oncogenicity classification for this single variant; multiple values are separated by a vertical bar", + "Number": ".", + "Type": "String", + }, + "ONCCONF": { + "Description": "Conflicting oncogenicity classification for this single variant; multiple values are separated by a vertical bar", + "Number": ".", + "Type": "String", + }, + "ONCDISDB": { + "Description": "Tag-value pairs of disease database name and identifier submitted for oncogenicity classifications, e.g. MedGen:NNNNNN", + "Number": ".", + "Type": "String", + }, + "ONCDISDBINCL": { + "Description": "For included variant: Tag-value pairs of disease database name and identifier for oncogenicity classifications, e.g. OMIM:NNNNNN", + "Number": ".", + "Type": "String", + }, + "ONCDN": { + "Description": "ClinVar's preferred disease name for the concept specified by disease identifiers in ONCDISDB", + "Number": ".", + "Type": "String", + }, + "ONCDNINCL": { + "Description": "For included variant: ClinVar's preferred disease name for the concept specified by disease identifiers in ONCDISDBINCL", + "Number": ".", + "Type": "String", + }, + "ONCINCL": { + "Description": "Oncogenicity classification for a haplotype or genotype that includes this variant. Reported as pairs of VariationID:classification; multiple values are separated by a vertical bar", + "Number": ".", + "Type": "String", + }, + "ONCREVSTAT": { + "Description": "ClinVar review status of oncogenicity classification for the Variation ID", + "Number": ".", + "Type": "String", + }, + "ORIGIN": { + "Description": "Allele origin. One or more of the following values may be added: 0 - unknown; 1 - germline; 2 - somatic; 4 - inherited; 8 - paternal; 16 - maternal; 32 - de-novo; 64 - biparental; 128 - uniparental; 256 - not-tested; 512 - tested-inconclusive; 1073741824 - other", + "Number": ".", + "Type": "String", + }, + "PARID": { + "Description": "ID of partner breakend", + "Number": 1, + "Type": "String", + }, + "RS": { + "Description": "dbSNP ID (i.e. rs number)", + "Number": ".", + "Type": "String", + }, + "SB": { + "Description": "Strand bias", + "Number": 4, + "Type": "Integer", + }, + "SCI": { + "Description": "Aggregate somatic clinical impact for this single variant; multiple values are separated by a vertical bar", + "Number": ".", + "Type": "String", + }, + "SCIDISDB": { + "Description": "Tag-value pairs of disease database name and identifier submitted for somatic clinial impact classifications, e.g. MedGen:NNNNNN", + "Number": ".", + "Type": "String", + }, + "SCIDISDBINCL": { + "Description": "For included variant: Tag-value pairs of disease database name and identifier for somatic clinical impact classifications, e.g. OMIM:NNNNNN", + "Number": ".", + "Type": "String", + }, + "SCIDN": { + "Description": "ClinVar's preferred disease name for the concept specified by disease identifiers in SCIDISDB", + "Number": ".", + "Type": "String", + }, + "SCIDNINCL": { + "Description": "For included variant: ClinVar's preferred disease name for the concept specified by disease identifiers in SCIDISDBINCL", + "Number": ".", + "Type": "String", + }, + "SCIINCL": { + "Description": "Somatic clinical impact classification for a haplotype or genotype that includes this variant. Reported as pairs of VariationID:classification; multiple values are separated by a vertical bar", + "Number": ".", + "Type": "String", + }, + "SCIREVSTAT": { + "Description": "ClinVar review status of somatic clinical impact for the Variation ID", + "Number": ".", + "Type": "String", + }, + "SOMATIC": { + "Description": "Somatic mutation (for cancer genomics)", + "Number": 0, + "Type": "Flag", + }, + "SVLEN": { + "Description": "Difference in length between REF and ALT alleles", + "Number": null, + "Type": "Integer", + }, + "SVTYPE": { + "Description": "Type of structural variant", + "Number": 1, + "Type": "String", + }, + "VALIDATED": { + "Description": "Validated by follow-up experiment", + "Number": 0, + "Type": "Flag", + }, + }, + "fileDate": "2024-12-01", + "fileformat": "VCFv4.1", + "reference": "GRCh37", + "source": "ClinVar", +} +`; + +exports[`parse breakend on thing that looks like symbolic allele but is actually a feature 1`] = ` +{ + "Join": "left", + "MateDirection": "right", + "MatePosition": ":1", + "Replacement": "C", +} +`; + +exports[`parses a line with a breakend ALT 1`] = ` +{ + "ALT": [ + "G]17:198982]", + ], + "CHROM": "2", + "FILTER": "PASS", + "GENOTYPES": [Function], + "ID": [ + "bnd_W", + ], + "INFO": { + "SVTYPE": [ + "BND", + ], + }, + "POS": 321681, + "QUAL": 6, + "REF": "G", + "SAMPLES": [Function], +} +`; + +exports[`parses a line with mix of multiple breakends and non breakends 1`] = ` +{ + "ALT": [ + "CTATGTCG", + "C[2 : 321682[", + "C[17 : 198983[", + ], + "CHROM": "13", + "FILTER": "PASS", + "GENOTYPES": [Function], + "ID": [ + "bnd_U", + ], + "INFO": { + "MATEID": [ + "bnd V", + "bnd Z", + ], + "SVTYPE": [ + "BND", + ], + }, + "POS": 123456, + "QUAL": 6, + "REF": "C", + "SAMPLES": [Function], +} +`; + +exports[`pedigree 1`] = ` +{ + "ALT": { + "*": { + "Description": "Represents any possible alternative allele at this location", + }, + "CNV": { + "Description": "Copy number variable region (may be both deletion and duplication)", + }, + "DEL": { + "Description": "Deletion relative to the reference", + }, + "DEL:ME": { + "Description": "Deletion of mobile element relative to the reference", + }, + "DUP": { + "Description": "Region of elevated copy number relative to the reference", + }, + "DUP:TANDEM": { + "Description": "Tandem duplication", + }, + "INS": { + "Description": "Insertion of novel sequence relative to the reference", + }, + "INS:ME": { + "Description": "Insertion of a mobile element relative to the reference", + }, + "INV": { + "Description": "Inversion of reference sequence", + }, + "NON_REF": { + "Description": "Represents any possible alternative allele at this location", + }, + }, + "FILTER": { + "PASS": { + "Description": "Passed all filters", + }, + }, + "FORMAT": { + "AD": { + "Description": "Read depth for each allele", + "Number": "R", + "Type": "Integer", + }, + "ADF": { + "Description": "Read depth for each allele on the forward strand", + "Number": "R", + "Type": "Integer", + }, + "ADR": { + "Description": "Read depth for each allele on the reverse strand", + "Number": "R", + "Type": "Integer", + }, + "DP": { + "Description": "Read depth", + "Number": 1, + "Type": "Integer", + }, + "EC": { + "Description": "Expected alternate allele counts", + "Number": "A", + "Type": "Integer", + }, + "FT": { + "Description": "Filter indicating if this genotype was "called"", + "Number": 1, + "Type": "String", + }, + "GL": { + "Description": "Genotype likelihoods", + "Number": "G", + "Type": "Float", + }, + "GP": { + "Description": "Genotype posterior probabilities", + "Number": "G", + "Type": "Float", + }, + "GQ": { + "Description": "Conditional genotype quality", + "Number": 1, + "Type": "Integer", + }, + "GT": { + "Description": "Genotype", + "Number": 1, + "Type": "String", + }, + "HQ": { + "Description": "Haplotype quality", + "Number": 2, + "Type": "Integer", + }, + "MQ": { + "Description": "RMS mapping quality", + "Number": 1, + "Type": "Integer", + }, + "PL": { + "Description": "Phred-scaled genotype likelihoods rounded to the closest integer", + "Number": "G", + "Type": "Integer", + }, + "PQ": { + "Description": "Phasing quality", + "Number": 1, + "Type": "Integer", + }, + "PS": { + "Description": "Phase set", + "Number": 1, + "Type": "Integer", + }, + }, + "INFO": { + "1000G": { + "Description": "1000 Genomes membership", + "Number": 0, + "Type": "Flag", + }, + "AA": { + "Description": "Ancestral allele", + "Number": 1, + "Type": "String", + }, + "AC": { + "Description": "Allele count in genotypes, for each ALT allele, in the same order as listed", + "Number": "A", + "Type": "Integer", + }, + "AD": { + "Description": "Total read depth for each allele", + "Number": "R", + "Type": "Integer", + }, + "ADF": { + "Description": "Read depth for each allele on the forward strand", + "Number": "R", + "Type": "Integer", + }, + "ADR": { + "Description": "Read depth for each allele on the reverse strand", + "Number": "R", + "Type": "Integer", + }, + "AF": { + "Description": "Allele frequency for each ALT allele in the same order as listed (estimated from primary data, not called genotypes)", + "Number": "A", + "Type": "Float", + }, + "AN": { + "Description": "Total number of alleles in called genotypes", + "Number": 1, + "Type": "Integer", + }, + "BKPTID": { + "Description": "ID of the assembled alternate allele in the assembly file", + "Type": "String", + }, + "BQ": { + "Description": "RMS base quality", + "Number": 1, + "Type": "Float", + }, + "CICN": { + "Description": "Confidence interval around copy number for the segment", + "Number": 2, + "Type": "Integer", + }, + "CICNADJ": { + "Description": "Confidence interval around copy number for the adjacency", + "Number": null, + "Type": "Integer", + }, + "CIEND": { + "Description": "Confidence interval around END for imprecise variants", + "Number": 2, + "Type": "Integer", + }, + "CIGAR": { + "Description": "Cigar string describing how to align an alternate allele to the reference allele", + "Number": 1, + "Type": "Float", + }, + "CILEN": { + "Description": "Confidence interval around the inserted material between breakend", + "Number": 2, + "Type": "Integer", + }, + "CIPOS": { + "Description": "Confidence interval around POS for imprecise variants", + "Number": 2, + "Type": "Integer", + }, + "CN": { + "Description": "Copy number of segment containing breakend", + "Number": 1, + "Type": "Integer", + }, + "CNADJ": { + "Description": "Copy number of adjacency", + "Number": null, + "Type": "Integer", + }, + "DB": { + "Description": "dbSNP membership", + "Number": 0, + "Type": "Flag", + }, + "DBRIPID": { + "Description": "ID of this element in DBRIP", + "Number": 1, + "Type": "String", + }, + "DBVARID": { + "Description": "ID of this element in DBVAR", + "Number": 1, + "Type": "String", + }, + "DGVID": { + "Description": "ID of this element in Database of Genomic Variation", + "Number": 1, + "Type": "String", + }, + "DP": { + "Description": "combined depth across samples", + "Number": 1, + "Type": "Integer", + }, + "DPADJ": { + "Description": "Read Depth of adjacency", + "Type": "Integer", + }, + "END": { + "Description": "End position (for use with symbolic alleles)", + "Number": 1, + "Type": "Integer", + }, + "EVENT": { + "Description": "ID of event associated to breakend", + "Number": 1, + "Type": "String", + }, + "H2": { + "Description": "HapMap2 membership", + "Number": 0, + "Type": "Flag", + }, + "H3": { + "Description": "HapMap3 membership", + "Number": 0, + "Type": "Flag", + }, + "HOMLEN": { + "Description": "Length of base pair identical micro-homology at event breakpoints", + "Type": "Integer", + }, + "HOMSEQ": { + "Description": "Sequence of base pair identical micro-homology at event breakpoints", + "Type": "String", + }, + "IMPRECISE": { + "Description": "Imprecise structural variation", + "Number": 0, + "Type": "Flag", + }, + "MATEID": { + "Description": "ID of mate breakends", + "Number": null, + "Type": "String", + }, + "MEINFO": { + "Description": "Mobile element info of the form NAME,START,END,POLARITY", + "Number": 4, + "Type": "String", + }, + "METRANS": { + "Description": "Mobile element transduction info of the form CHR,START,END,POLARITY", + "Number": 4, + "Type": "String", + }, + "MQ": { + "Description": "RMS mapping quality", + "Number": 1, + "Type": null, + }, + "MQ0": { + "Description": "Number of MAPQ == 0 reads", + "Number": 1, + "Type": "Integer", + }, + "NOVEL": { + "Description": "Indicates a novel structural variation", + "Number": 0, + "Type": "Flag", + }, + "NS": { + "Description": "Number of samples with data", + "Number": 1, + "Type": "Integer", + }, + "PARID": { + "Description": "ID of partner breakend", + "Number": 1, + "Type": "String", + }, + "SB": { + "Description": "Strand bias", + "Number": 4, + "Type": "Integer", + }, + "SOMATIC": { + "Description": "Somatic mutation (for cancer genomics)", + "Number": 0, + "Type": "Flag", + }, + "SVLEN": { + "Description": "Difference in length between REF and ALT alleles", + "Number": null, + "Type": "Integer", + }, + "SVTYPE": { + "Description": "Type of structural variant", + "Number": 1, + "Type": "String", + }, + "VALIDATED": { + "Description": "Validated by follow-up experiment", + "Number": 0, + "Type": "Flag", + }, + }, + "PEDIGREE": { + "ChildID": { + "Father": "FatherID", + "Mother": "MotherID", + }, + "SampleID": { + "Name_1": "Ancestor_1", + "Name_2": "Ancestor_N", + }, + "SomaticNonTumour": { + "Original": "GermlineID", + }, + "TumourSample": { + "Original": "GermlineID", + }, + }, +} +`; + +exports[`sample to genotype information 1`] = ` +{ + "Assay": { + "Number": ".", + "Type": "String", + "Values": [ + "WholeGenome", + "Exome", + ], + }, + "Disease": { + "Number": ".", + "Type": "String", + "Values": [ + "None", + "Cancer", + ], + }, + "Ethnicity": { + "Number": ".", + "Type": "String", + "Values": [ + "AFR", + "CEU", + "ASN", + "MEX", + ], + }, + "Tissue": { + "Number": ".", + "Type": "String", + "Values": [ + "Blood", + "Breast", + "Colon", + "Lung", + "?", + ], + }, +} +`; + +exports[`sample to genotype information 2`] = `undefined`; + +exports[`shortcut parsing with 1000 genomes 1`] = ` +[ + { + "ALT": [ + "A", + ], + "CHROM": "Y", + "FILTER": "PASS", + "GENOTYPES": [Function], + "ID": [ + "rs11575897", + ], + "INFO": { + "AA": [ + "G", + ], + "AC": [ + 22, + ], + "AF": [ + 0.0178427, + ], + "AFR_AF": [ + 0, + ], + "AMR_AF": [ + 0, + ], + "AN": [ + 1233, + ], + "DP": [ + 84761, + ], + "EAS_AF": [ + 0.0902, + ], + "EUR_AF": [ + 0, + ], + "EX_TARGET": true, + "NS": [ + 1233, + ], + "SAS_AF": [ + 0, + ], + "VT": [ + "SNP", + ], + }, + "POS": 2655180, + "QUAL": 100, + "REF": "G", + "SAMPLES": [Function], + }, + { + "ALT": [ + "C", + ], + "CHROM": "Y", + "FILTER": "PASS", + "GENOTYPES": [Function], + "ID": undefined, + "INFO": { + "AA": [ + "A", + ], + "AC": [ + 5, + ], + "AF": [ + 0.00405515, + ], + "AFR_AF": [ + 0, + ], + "AMR_AF": [ + 0, + ], + "AN": [ + 1233, + ], + "DP": [ + 72067, ], "EAS_AF": [ 0.0205, @@ -1421,6 +2255,88 @@ exports[`shortcut parsing with vcf 4.3 bnd example 1`] = ` ] `; +exports[`sniffles vcf 1`] = ` +{ + "ALT": [ + "", + ], + "CHROM": "8", + "FILTER": "PASS", + "GENOTYPES": [Function], + "ID": [ + "28329_0", + ], + "INFO": { + "AF": [ + 0.971429, + ], + "CHR2": [ + "8", + ], + "END": [ + 17709148, + ], + "Kurtosis_quant_start": [ + "20.524521", + ], + "Kurtosis_quant_stop": [ + "3.925926", + ], + "PRECISE": true, + "RE": [ + 34, + ], + "STD_quant_start": [ + "0.000000", + ], + "STD_quant_stop": [ + "0.000000", + ], + "STRANDS": [ + "+-", + ], + "STRANDS2": [ + "20", + "14", + "20", + "14", + ], + "SUPTYPE": [ + "AL", + ], + "SVLEN": [ + 33, + ], + "SVMETHOD": [ + "Snifflesv1.0.3", + ], + "SVTYPE": [ + "DEL", + ], + }, + "POS": 17709115, + "QUAL": undefined, + "REF": "N", + "SAMPLES": [Function], +} +`; + +exports[`sniffles vcf 2`] = ` +{ + "/seq/schatz/fritz/sv-paper/real/Nanopore_NA12878/mapped/ngm_Nanopore_human_ngmlr-0.2.3_mapped.bam": { + "DR": [ + 1, + ], + "DV": [ + 34, + ], + "GT": [ + "1/1", + ], + }, +} +`; + exports[`snippet from VCF 4.3 spec 1`] = ` [ { diff --git a/test/__snapshots__/parseMetaString.test.ts.snap b/test/__snapshots__/parseMetaString.test.ts.snap new file mode 100644 index 0000000..5ecef5b --- /dev/null +++ b/test/__snapshots__/parseMetaString.test.ts.snap @@ -0,0 +1,22 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`array in values 1`] = ` +{ + "ID": "Assay", + "Number": ".", + "Type": "String", + "Values": [ + "WholeGenome", + "Exome", + ], +} +`; + +exports[`quoted string with comma in description 1`] = ` +{ + "Description": "dbSNP membership, build 129", + "ID": "DB", + "Number": "0", + "Type": "Flag", +} +`; diff --git a/test/data/breakends.vcf b/test/data/breakends.vcf new file mode 100644 index 0000000..1cd8526 --- /dev/null +++ b/test/data/breakends.vcf @@ -0,0 +1,4 @@ +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT BAMs/caudaus.sorted.sam +11 94975747 MantaBND:0:2:3:0:0:0:1 G G]8:107653520] . PASS SVTYPE=BND;MATEID=MantaBND:0:2:3:0:0:0:0;CIPOS=0,2;HOMLEN=2;HOMSEQ=TT;BND_DEPTH=216;MATE_BND_DEPTH=735 PR:SR 722,9:463,15 +11 94975753 MantaDEL:0:1:2:0:0:0 T . PASS END=94987865;SVTYPE=DEL;SVLEN=12112;IMPRECISE;CIPOS=-156,156;CIEND=-150,150 PR 161,13 +11 94987872 MantaBND:0:0:1:0:0:0:0 T T[8:107653411[ . PASS SVTYPE=BND;MATEID=MantaBND:0:0:1:0:0:0:1;BND_DEPTH=171;MATE_BND_DEPTH=830 PR:SR 489,4:520,19 diff --git a/test/data/clinvar.header.vcf b/test/data/clinvar.header.vcf new file mode 100644 index 0000000..b7a5760 --- /dev/null +++ b/test/data/clinvar.header.vcf @@ -0,0 +1,42 @@ +##fileformat=VCFv4.1 +##fileDate=2024-12-01 +##source=ClinVar +##reference=GRCh37 +##ID= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +#CHROM POS ID REF ALT QUAL FILTER INFO diff --git a/test/data/pedigree.vcf b/test/data/pedigree.vcf new file mode 100644 index 0000000..850fec1 --- /dev/null +++ b/test/data/pedigree.vcf @@ -0,0 +1,5 @@ +##PEDIGREE= +##PEDIGREE= +##PEDIGREE= +##PEDIGREE= +#CHROM POS ID REF ALT QUAL FILTER INFO diff --git a/test/data/sample2genotype.vcf b/test/data/sample2genotype.vcf new file mode 100644 index 0000000..28d5bd0 --- /dev/null +++ b/test/data/sample2genotype.vcf @@ -0,0 +1,11 @@ +##fileformat=VCFv4.1 +##fileDate=2024-12-01 +##source=ClinVar +##reference=GRCh37 +##META= +##META= +##META= +##META= +##SAMPLE= +##SAMPLE= +#CHROM POS ID REF ALT QUAL FILTER INFO diff --git a/test/data/sniffles.vcf b/test/data/sniffles.vcf new file mode 100644 index 0000000..2763b6b --- /dev/null +++ b/test/data/sniffles.vcf @@ -0,0 +1,23 @@ +##fileformat=VCFv4.2 +##source=Sniffles +##fileDate=20170420 +##ALT= +##ALT= +##ALT= +##ALT= +##ALT= +##ALT= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT /seq/schatz/fritz/sv-paper/real/Nanopore_NA12878/mapped/ngm_Nanopore_human_ngmlr-0.2.3_mapped.bam +8 17709115 28329_0 N . PASS PRECISE;SVMETHOD=Snifflesv1.0.3;CHR2=8;END=17709148;STD_quant_start=0.000000;STD_quant_stop=0.000000;Kurtosis_quant_start=20.524521;Kurtosis_quant_stop=3.925926;SVTYPE=DEL;SUPTYPE=AL;SVLEN=33;STRANDS=+-;STRANDS2=20,14,20,14;RE=34;AF=0.971429 GT:DR:DV 1/1:1:34 diff --git a/test/data/spec-example.vcf b/test/data/spec-example.vcf new file mode 100644 index 0000000..40f0761 --- /dev/null +++ b/test/data/spec-example.vcf @@ -0,0 +1,23 @@ +##fileformat=VCFv4.3 +##fileDate=20090805 +##source=myImputationProgramV3.1 +##reference=file:///seq/references/1000GenomesPilot-NCBI36.fasta +##contig= +##phasing=partial +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FILTER= +##FILTER= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA00003 diff --git a/test/data/weird_info_and_missing_format.vcf b/test/data/weird_info_and_missing_format.vcf new file mode 100644 index 0000000..1c7c043 --- /dev/null +++ b/test/data/weird_info_and_missing_format.vcf @@ -0,0 +1,7 @@ +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT BAMs/caudaus.sorted.sam +lcl|Scaffald_1 80465 rs118266897 R A 29 PASS NS=3;0,14;AF=0.5;DB;112;PG2.1 +lcl|Scaffald_1 84818 rs118269296 R G 29 PASS NS=3;0,14;AF=0.5;DB;112;PG2.1 +lcl|Scaffald_1 95414 rs118218236 W T 29 PASS NS=3;0,14;AF=0.5;DB;112;PG2.1 +lcl|Scaffald_1 231384 rs118264755 R A 29 PASS NS=3;0,14;AF=0.5;DB;112;PG2.1 +lcl|Scaffald_1 236429 rs118223336 R G 29 PASS NS=3;0,14;AF=6.5;DB;112;PG2.1 +lcl|Scaffald_1 245378 rs118217257 R G 29 PASS NS=3;0,14;AF=0.5;DB;112;PG2.1 diff --git a/test/data/y-chrom-haploid.vcf b/test/data/y-chrom-haploid.vcf new file mode 100644 index 0000000..9018bfb --- /dev/null +++ b/test/data/y-chrom-haploid.vcf @@ -0,0 +1,42 @@ +##fileformat=VCFv4.1 +##FILTER= +##fileDate=20150218 +##reference=ftp://ftp.1000genomes.ebi.ac.uk//vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz +##contig= +##source=freeBayes v0.9.9.2 | GT values over-written with maximum likelihood state (subject to threshold) OR phylogenetic imputation +##INFO= +##FORMAT= +##source=GenomeSTRiP_v1.04 +##ALT= +##FILTER= +##FILTER= +##FILTER== 0.5 && GSDUPLICATESCORE >= 0.0"> +##FILTER== 2.0"> +##FILTER= +##FILTER== 13.0"> +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG00096 HG00101 HG00103 HG001055 +Y 14483990 CNV_Y_14483990_15232198 C 100 PASS AC=1;AF=0.000817661;AN=1223;END=15232198;NS=1233;SVTYPE=CNV;AMR_AF=0;AFR_AF=0;EUR_AF=0.0042;SAS_AF=0;EAS_AF=0;VT=SV;EX_TARGET GT:CN:CNL:CNP:CNQ:GP:GQ:PL 0:1:-1000,0,-119.08:-1000,0,-218.16:99:0,-1000:99:0,10000 0:1:-1000,0,-43.56:-1000,0,-142.64:99:0,-1000:99:0,10000 .:.:.:.:.:.:.:. .:.:.:.:.:.:.:. +Y 2655180 rs11575897 G A 100 PASS AA=G;AC=22;AF=0.0178427;AN=1233;DP=84761;NS=1233;AMR_AF=0;AFR_AF=0;EUR_AF=0;SAS_AF=0;EAS_AF=0.0902;VT=SNP;EX_TARGET GT 0 0 0 . diff --git a/test/parse.test.ts b/test/parse.test.ts index 9c05b58..6c58b60 100644 --- a/test/parse.test.ts +++ b/test/parse.test.ts @@ -1,13 +1,12 @@ -// @ts-nocheck import { test, expect } from 'vitest' import fs from 'fs' import VCF, { parseBreakend } from '../src' -const readVcf = file => { +const readVcf = (file: string) => { const f = fs.readFileSync(file, 'utf8') const lines = f.split('\n') - const header = [] - const rest = [] + const header = [] as string[] + const rest = [] as string[] lines.forEach(line => { if (line.startsWith('#')) { header.push(line) @@ -15,35 +14,16 @@ const readVcf = file => { rest.push(line) } }) - return { header: header.join('\n'), lines: rest } + return { + header: header.join('\n'), + lines: rest, + } } function makeParser() { + const { header } = readVcf('test/data/spec-example.vcf') return new VCF({ - header: `##fileformat=VCFv4.3 -##fileDate=20090805 -##source=myImputationProgramV3.1 -##reference=file:///seq/references/1000GenomesPilot-NCBI36.fasta -##contig= -##phasing=partial -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##FILTER= -##FILTER= -##FORMAT= -##FORMAT= -##FORMAT= -##FORMAT= -##FORMAT= -##FORMAT= -#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tNA00001\tNA00002\tNA00003 -`, + header, }) } @@ -70,12 +50,8 @@ test('can get metadata from the header', () => { Number: 1, Type: 'String', }) -}) -test('can get default metadata not in the header', () => { - const VCFParser = makeParser() - const metadata = VCFParser.getMetadata() - expect(metadata.INFO.AC).toEqual({ + expect(VCFParser.getMetadata('INFO', 'AC')).toEqual({ Number: 'A', Type: 'Integer', Description: @@ -106,7 +82,7 @@ test('parses a line with a breakend ALT', () => { const variant = VCFParser.parseLine( '2\t321681\tbnd_W\tG\tG]17:198982]\t6\tPASS\tSVTYPE=BND', ) - expect(variant.ALT.length).toBe(1) + expect(variant.ALT?.length).toBe(1) expect(variant.INFO.SVTYPE).toEqual(['BND']) expect(variant).toMatchSnapshot() }) @@ -116,7 +92,7 @@ test(`parses a line with mix of multiple breakends and non breakends`, () => { const variant = VCFParser.parseLine( `13\t123456\tbnd_U\tC\tCTATGTCG,C[2 : 321682[,C[17 : 198983[\t6\tPASS\tSVTYPE=BND;MATEID=bnd V,bnd Z`, ) - expect(variant.ALT.length).toBe(3) + expect(variant.ALT?.length).toBe(3) expect(variant.INFO.SVTYPE).toEqual(['BND']) expect(variant).toMatchSnapshot() }) @@ -140,87 +116,24 @@ test('throws errors with bad header lines', () => { }).toThrow(/No format line/) }) -test('can parse a line from the VCF spec', () => { +test('sniffles vcf', () => { + const { header, lines } = readVcf('test/data/sniffles.vcf') const VCFParser = new VCF({ - header: `##fileformat=VCFv4.2 -##source=Sniffles -##fileDate=20170420 -##ALT= -##ALT= -##ALT= -##ALT= -##ALT= -##ALT= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##FORMAT= -##FORMAT= -##FORMAT= -#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT /seq/schatz/fritz/sv-paper/real/Nanopore_NA12878/mapped/ngm_Nanopore_human_ngmlr-0.2.3_mapped.bam`, + header, }) - const variant = VCFParser.parseLine( - '8\t17709115\t28329_0\tN\t\t.\tPASS\tPRECISE;SVMETHOD=Snifflesv1.0.3;CHR2=8;END=17709148;STD_quant_start=0.000000;STD_quant_stop=0.000000;Kurtosis_quant_start=20.524521;Kurtosis_quant_stop=3.925926;SVTYPE=DEL;SUPTYPE=AL;SVLEN=33;STRANDS=+-;STRANDS2=20,14,20,14;RE=34;AF=0.971429\tGT:DR:DV\t1/1:1:34', - ) + const variant = VCFParser.parseLine(lines[0]) expect(variant).toMatchSnapshot() expect(variant.SAMPLES()).toMatchSnapshot() }) test('can parse a line from the VCF spec Y chrom (haploid))', () => { + const { header, lines } = readVcf('test/data/y-chrom-haploid.vcf') const VCFParser = new VCF({ - header: `##fileformat=VCFv4.1 -##FILTER= -##fileDate=20150218 -##reference=ftp://ftp.1000genomes.ebi.ac.uk//vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz -##contig= -##source=freeBayes v0.9.9.2 | GT values over-written with maximum likelihood state (subject to threshold) OR phylogenetic imputation -##INFO= -##FORMAT= -##source=GenomeSTRiP_v1.04 -##ALT= -##FILTER= -##FILTER= -##FILTER== 0.5 && GSDUPLICATESCORE >= 0.0"> -##FILTER== 2.0"> -##FILTER= -##FILTER== 13.0"> -##FORMAT= -##FORMAT= -##FORMAT= -##FORMAT= -##FORMAT= -##FORMAT= -##FORMAT= -##FORMAT= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -##INFO= -#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tHG00096\tHG00101\tHG00103\tHG001055`, + header, }) - const variant = VCFParser.parseLine( - 'Y\t14483990\tCNV_Y_14483990_15232198\tC\t\t100\tPASS\tAC=1;AF=0.000817661;AN=1223;END=15232198;NS=1233;SVTYPE=CNV;AMR_AF=0;AFR_AF=0;EUR_AF=0.0042;SAS_AF=0;EAS_AF=0;VT=SV;EX_TARGET\tGT:CN:CNL:CNP:CNQ:GP:GQ:PL\t0:1:-1000,0,-119.08:-1000,0,-218.16:99:0,-1000:99:0,10000\t0:1:-1000,0,-43.56:-1000,0,-142.64:99:0,-1000:99:0,10000\t.:.:.:.:.:.:.:.\t.:.:.:.:.:.:.:.', - ) - const variant2 = VCFParser.parseLine( - 'Y\t2655180\trs11575897\tG\tA\t100\tPASS\tAA=G;AC=22;AF=0.0178427;AN=1233;DP=84761;NS=1233;AMR_AF=0;AFR_AF=0;EUR_AF=0;SAS_AF=0;EAS_AF=0.0902;VT=SNP;EX_TARGET\tGT\t0\t0\t0\t.', - ) + console.log({ lines }) + const variant = VCFParser.parseLine(lines[0]) + const variant2 = VCFParser.parseLine(lines[1]) expect(variant).toMatchSnapshot() expect(variant.SAMPLES()).toMatchSnapshot() expect(variant2).toMatchSnapshot() @@ -237,34 +150,22 @@ test('snippet from VCF 4.3 spec', () => { expect(variants.map(variant => variant.SAMPLES())).toMatchSnapshot() }) test('can parse breakends', () => { - const header = `#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tBAMs/caudaus.sorted.sam` + const { header, lines } = readVcf('test/data/breakends.vcf') const VCFParser = new VCF({ header, }) - const lines = - `11 94975747 MantaBND:0:2:3:0:0:0:1 G G]8:107653520] . PASS SVTYPE=BND;MATEID=MantaBND:0:2:3:0:0:0:0;CIPOS=0,2;HOMLEN=2;HOMSEQ=TT;BND_DEPTH=216;MATE_BND_DEPTH=735 PR:SR 722,9:463,15 -11 94975753 MantaDEL:0:1:2:0:0:0 T . PASS END=94987865;SVTYPE=DEL;SVLEN=12112;IMPRECISE;CIPOS=-156,156;CIEND=-150,150 PR 161,13 -11 94987872 MantaBND:0:0:1:0:0:0:0 T T[8:107653411[ . PASS SVTYPE=BND;MATEID=MantaBND:0:0:1:0:0:0:1;BND_DEPTH=171;MATE_BND_DEPTH=830 PR:SR 489,4:520,19`.split( - '\n', - ) expect(lines.map(line => VCFParser.parseLine(line))).toMatchSnapshot() }) // from https://github.com/GMOD/jbrowse/issues/1358 test('vcf lines with weird info field and missing format/genotypes', () => { + const { header, lines } = readVcf( + 'test/data/weird_info_and_missing_format.vcf', + ) const VCFParser = new VCF({ - header: `#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tBAMs/caudaus.sorted.sam`, + header, }) - const lines = - `lcl|Scaffald_1\t80465\trs118266897\tR\tA\t29\tPASS\tNS=3;0,14;AF=0.5;DB;112;PG2.1 -lcl|Scaffald_1\t84818\trs118269296\tR\tG\t29\tPASS\tNS=3;0,14;AF=0.5;DB;112;PG2.1 -lcl|Scaffald_1\t95414\trs118218236\tW\tT\t29\tPASS\tNS=3;0,14;AF=0.5;DB;112;PG2.1 -lcl|Scaffald_1\t231384\trs118264755\tR\tA\t29\tPASS\tNS=3;0,14;AF=0.5;DB;112;PG2.1 -lcl|Scaffald_1\t236429\trs118223336\tR\tG\t29\tPASS\tNS=3;0,14;AF=6.5;DB;112;PG2.1 -lcl|Scaffald_1\t245378\trs118217257\tR\tG\t29\tPASS\tNS=3;0,14;AF=0.5;DB;112;PG2.1`.split( - '\n', - ) expect(lines.map(line => VCFParser.parseLine(line))).toMatchSnapshot() }) @@ -303,7 +204,7 @@ test('shortcut parsing with vcf 4.3 bnd example', () => { const VCFParser = new VCF({ header }) const variants = lines.map(line => VCFParser.parseLine(line)) - expect(variants.map(m => m.ALT[0].toString())).toEqual( + expect(variants.map(m => m.ALT?.[0].toString())).toEqual( lines.map(line => line.split('\t')[4]), ) @@ -334,3 +235,28 @@ test('parse breakend on symbolic alleles', () => { test('parse breakend on thing that looks like symbolic allele but is actually a feature', () => { expect(parseBreakend('C')).toMatchSnapshot() }) + +test('clinvar metadata', () => { + const { header } = readVcf('test/data/clinvar.header.vcf') + const VCFParser = new VCF({ + header, + }) + expect(VCFParser.getMetadata()).toMatchSnapshot() +}) + +test('sample to genotype information', () => { + const { header } = readVcf('test/data/sample2genotype.vcf') + const VCFParser = new VCF({ + header, + }) + expect(VCFParser.getMetadata().META).toMatchSnapshot() + expect(VCFParser.getMetadata().SAMPLES).toMatchSnapshot() +}) + +test('pedigree', () => { + const { header } = readVcf('test/data/pedigree.vcf') + const VCFParser = new VCF({ + header, + }) + expect(VCFParser.getMetadata()).toMatchSnapshot() +}) diff --git a/test/parseMetaString.test.ts b/test/parseMetaString.test.ts new file mode 100644 index 0000000..a4c0cb3 --- /dev/null +++ b/test/parseMetaString.test.ts @@ -0,0 +1,21 @@ +import { expect, test } from 'vitest' +import { parseMetaString } from '../src/parseMetaString' + +test('array in values', () => { + const result1 = parseMetaString( + '', + ) + const result2 = parseMetaString( + '', + ) + expect(result1).toEqual(result2) + expect(result1).toMatchSnapshot() +}) + +test('quoted string with comma in description', () => { + expect( + parseMetaString( + '', + ), + ).toMatchSnapshot() +}) diff --git a/yarn.lock b/yarn.lock index 9a6f26f..53254f4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,7 +10,7 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -20,9 +20,9 @@ picocolors "^1.0.0" "@babel/compat-data@^7.25.9": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" - integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" + integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== "@babel/core@^7.18.10", "@babel/core@^7.20.5": version "7.26.0" @@ -45,13 +45,13 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.18.10", "@babel/generator@^7.25.9", "@babel/generator@^7.26.0": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" - integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== +"@babel/generator@^7.18.10", "@babel/generator@^7.26.0", "@babel/generator@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" + integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== dependencies: - "@babel/parser" "^7.26.2" - "@babel/types" "^7.26.0" + "@babel/parser" "^7.26.3" + "@babel/types" "^7.26.3" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -107,12 +107,12 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.0" -"@babel/parser@^7.10.5", "@babel/parser@^7.18.11", "@babel/parser@^7.25.3", "@babel/parser@^7.25.4", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" - integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== +"@babel/parser@^7.10.5", "@babel/parser@^7.18.11", "@babel/parser@^7.25.3", "@babel/parser@^7.25.4", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" + integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== dependencies: - "@babel/types" "^7.26.0" + "@babel/types" "^7.26.3" "@babel/template@^7.25.9": version "7.25.9" @@ -124,22 +124,22 @@ "@babel/types" "^7.25.9" "@babel/traverse@^7.10.5", "@babel/traverse@^7.18.11", "@babel/traverse@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" - integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + version "7.26.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" + integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/generator" "^7.25.9" - "@babel/parser" "^7.25.9" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.3" + "@babel/parser" "^7.26.3" "@babel/template" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/types" "^7.26.3" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.18.10", "@babel/types@^7.25.4", "@babel/types@^7.25.9", "@babel/types@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" - integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== +"@babel/types@^7.18.10", "@babel/types@^7.25.4", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" + integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -157,125 +157,120 @@ "@types/semver" "^7.5.5" semver "^7.5.2" -"@esbuild/aix-ppc64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c" - integrity sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw== - -"@esbuild/android-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz#1add7e0af67acefd556e407f8497e81fddad79c0" - integrity sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w== - -"@esbuild/android-arm@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz#ab7263045fa8e090833a8e3c393b60d59a789810" - integrity sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew== - -"@esbuild/android-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz#e8f8b196cfdfdd5aeaebbdb0110983460440e705" - integrity sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ== - -"@esbuild/darwin-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz#2d0d9414f2acbffd2d86e98253914fca603a53dd" - integrity sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw== - -"@esbuild/darwin-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz#33087aab31a1eb64c89daf3d2cf8ce1775656107" - integrity sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA== - -"@esbuild/freebsd-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz#bb76e5ea9e97fa3c753472f19421075d3a33e8a7" - integrity sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA== - -"@esbuild/freebsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz#e0e2ce9249fdf6ee29e5dc3d420c7007fa579b93" - integrity sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ== - -"@esbuild/linux-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz#d1b2aa58085f73ecf45533c07c82d81235388e75" - integrity sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g== - -"@esbuild/linux-arm@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz#8e4915df8ea3e12b690a057e77a47b1d5935ef6d" - integrity sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw== - -"@esbuild/linux-ia32@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz#8200b1110666c39ab316572324b7af63d82013fb" - integrity sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA== - -"@esbuild/linux-loong64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz#6ff0c99cf647504df321d0640f0d32e557da745c" - integrity sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g== - -"@esbuild/linux-mips64el@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz#3f720ccd4d59bfeb4c2ce276a46b77ad380fa1f3" - integrity sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA== - -"@esbuild/linux-ppc64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz#9d6b188b15c25afd2e213474bf5f31e42e3aa09e" - integrity sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ== - -"@esbuild/linux-riscv64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz#f989fdc9752dfda286c9cd87c46248e4dfecbc25" - integrity sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw== - -"@esbuild/linux-s390x@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz#29ebf87e4132ea659c1489fce63cd8509d1c7319" - integrity sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g== - -"@esbuild/linux-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz#4af48c5c0479569b1f359ffbce22d15f261c0cef" - integrity sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA== - -"@esbuild/netbsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz#1ae73d23cc044a0ebd4f198334416fb26c31366c" - integrity sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg== - -"@esbuild/openbsd-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz#5d904a4f5158c89859fd902c427f96d6a9e632e2" - integrity sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg== - -"@esbuild/openbsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz#4c8aa88c49187c601bae2971e71c6dc5e0ad1cdf" - integrity sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q== - -"@esbuild/sunos-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz#8ddc35a0ea38575fa44eda30a5ee01ae2fa54dd4" - integrity sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA== - -"@esbuild/win32-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz#6e79c8543f282c4539db684a207ae0e174a9007b" - integrity sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA== - -"@esbuild/win32-ia32@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz#057af345da256b7192d18b676a02e95d0fa39103" - integrity sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw== - -"@esbuild/win32-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz#168ab1c7e1c318b922637fad8f339d48b01e1244" - integrity sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA== +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.1" @@ -290,18 +285,20 @@ integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@eslint/config-array@^0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.0.tgz#3251a528998de914d59bb21ba4c11767cf1b3519" - integrity sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ== + version "0.19.1" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.1.tgz#734aaea2c40be22bbb1f2a9dac687c57a6a4c984" + integrity sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA== dependencies: - "@eslint/object-schema" "^2.1.4" + "@eslint/object-schema" "^2.1.5" debug "^4.3.1" minimatch "^3.1.2" "@eslint/core@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.9.0.tgz#168ee076f94b152c01ca416c3e5cf82290ab4fcd" - integrity sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg== + version "0.9.1" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.9.1.tgz#31763847308ef6b7084a4505573ac9402c51f9d1" + integrity sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q== + dependencies: + "@types/json-schema" "^7.0.15" "@eslint/eslintrc@^3.2.0": version "3.2.0" @@ -323,15 +320,15 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.16.0.tgz#3df2b2dd3b9163056616886c86e4082f45dbf3f4" integrity sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg== -"@eslint/object-schema@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" - integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== +"@eslint/object-schema@^2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.5.tgz#8670a8f6258a2be5b2c620ff314a1d984c23eb2e" + integrity sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ== "@eslint/plugin-kit@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz#812980a6a41ecf3a8341719f92a6d1e784a2e0e8" - integrity sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA== + version "0.2.4" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz#2b78e7bb3755784bb13faa8932a1d994d6537792" + integrity sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg== dependencies: levn "^0.4.1" @@ -443,100 +440,100 @@ 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.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.0.tgz#462e7ecdd60968bc9eb95a20d185e74f8243ec1b" - integrity sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ== - -"@rollup/rollup-android-arm64@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.0.tgz#78a2b8a8a55f71a295eb860a654ae90a2b168f40" - integrity sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA== - -"@rollup/rollup-darwin-arm64@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.0.tgz#5b783af714f434f1e66e3cdfa3817e0b99216d84" - integrity sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q== - -"@rollup/rollup-darwin-x64@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.0.tgz#f72484e842521a5261978034e18e20f778a2850d" - integrity sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w== - -"@rollup/rollup-freebsd-arm64@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.0.tgz#3c919dff72b2fe344811a609c674a8347b033f62" - integrity sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ== - -"@rollup/rollup-freebsd-x64@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.0.tgz#b62a3a8365b363b3fdfa6da11a9188b6ab4dca7c" - integrity sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA== - -"@rollup/rollup-linux-arm-gnueabihf@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.0.tgz#0d02cc55bd229bd8ca5c54f65f916ba5e0591c94" - integrity sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w== - -"@rollup/rollup-linux-arm-musleabihf@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.0.tgz#c51d379263201e88a60e92bd8e90878f0c044425" - integrity sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg== - -"@rollup/rollup-linux-arm64-gnu@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.0.tgz#93ce2addc337b5cfa52b84f8e730d2e36eb4339b" - integrity sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg== - -"@rollup/rollup-linux-arm64-musl@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.0.tgz#730af6ddc091a5ba5baac28a3510691725dc808b" - integrity sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw== - -"@rollup/rollup-linux-powerpc64le-gnu@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.0.tgz#b5565aac20b4de60ca1e557f525e76478b5436af" - integrity sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ== - -"@rollup/rollup-linux-riscv64-gnu@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.0.tgz#d488290bf9338bad4ae9409c4aa8a1728835a20b" - integrity sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g== - -"@rollup/rollup-linux-s390x-gnu@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.0.tgz#eb2e3f3a06acf448115045c11a5a96868c95a556" - integrity sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw== - -"@rollup/rollup-linux-x64-gnu@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.0.tgz#065952ef2aea7e837dc7e02aa500feeaff4fc507" - integrity sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw== - -"@rollup/rollup-linux-x64-musl@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.0.tgz#3435d484d05f5c4d1ffd54541b4facce2887103a" - integrity sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw== - -"@rollup/rollup-win32-arm64-msvc@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.0.tgz#69682a2a10d9fedc334f87583cfca83c39c08077" - integrity sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg== - -"@rollup/rollup-win32-ia32-msvc@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.0.tgz#b64470f9ac79abb386829c56750b9a4711be3332" - integrity sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A== - -"@rollup/rollup-win32-x64-msvc@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.0.tgz#cb313feef9ac6e3737067fdf34f42804ac65a6f2" - integrity sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ== +"@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" + integrity sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ== + +"@rollup/rollup-android-arm64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz#17ea71695fb1518c2c324badbe431a0bd1879f2d" + integrity sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA== + +"@rollup/rollup-darwin-arm64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz#dac0f0d0cfa73e7d5225ae6d303c13c8979e7999" + integrity sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ== + +"@rollup/rollup-darwin-x64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz#8f63baa1d31784904a380d2e293fa1ddf53dd4a2" + integrity sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ== + +"@rollup/rollup-freebsd-arm64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz#30ed247e0df6e8858cdc6ae4090e12dbeb8ce946" + integrity sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA== + +"@rollup/rollup-freebsd-x64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz#57846f382fddbb508412ae07855b8a04c8f56282" + integrity sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz#378ca666c9dae5e6f94d1d351e7497c176e9b6df" + integrity sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA== + +"@rollup/rollup-linux-arm-musleabihf@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz#a692eff3bab330d5c33a5d5813a090c15374cddb" + integrity sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg== + +"@rollup/rollup-linux-arm64-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz#6b1719b76088da5ac1ae1feccf48c5926b9e3db9" + integrity sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA== + +"@rollup/rollup-linux-arm64-musl@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz#865baf5b6f5ff67acb32e5a359508828e8dc5788" + integrity sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A== + +"@rollup/rollup-linux-loongarch64-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz#23c6609ba0f7fa7a7f2038b6b6a08555a5055a87" + integrity sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA== + +"@rollup/rollup-linux-powerpc64le-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz#652ef0d9334a9f25b9daf85731242801cb0fc41c" + integrity sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A== + +"@rollup/rollup-linux-riscv64-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz#1eb6651839ee6ebca64d6cc64febbd299e95e6bd" + integrity sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA== + +"@rollup/rollup-linux-s390x-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz#015c52293afb3ff2a293cf0936b1d43975c1e9cd" + integrity sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg== + +"@rollup/rollup-linux-x64-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz#b83001b5abed2bcb5e2dbeec6a7e69b194235c1e" + integrity sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw== + +"@rollup/rollup-linux-x64-musl@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz#6cc7c84cd4563737f8593e66f33b57d8e228805b" + integrity sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g== + +"@rollup/rollup-win32-arm64-msvc@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz#631ffeee094d71279fcd1fe8072bdcf25311bc11" + integrity sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A== + +"@rollup/rollup-win32-ia32-msvc@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz#06d1d60d5b9f718e8a6c4a43f82e3f9e3254587f" + integrity sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA== + +"@rollup/rollup-win32-x64-msvc@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz#4dff5c4259ebe6c5b4a8f2c5bc3829b7a8447ff0" + integrity sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA== "@types/debug@^4.0.0": version "4.1.12" @@ -579,6 +576,13 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== +"@types/node@^22.10.1": + version "22.10.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.1.tgz#41ffeee127b8975a05f8c4f83fb89bcb2987d766" + integrity sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ== + dependencies: + undici-types "~6.20.0" + "@types/normalize-package-data@^2.4.0", "@types/normalize-package-data@^2.4.1", "@types/normalize-package-data@^2.4.3": version "2.4.4" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" @@ -604,62 +608,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.16.0", "@typescript-eslint/eslint-plugin@^8.8.1": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.16.0.tgz#ac56825bcdf3b392fc76a94b1315d4a162f201a6" - integrity sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q== +"@typescript-eslint/eslint-plugin@8.17.0", "@typescript-eslint/eslint-plugin@^8.8.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== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.16.0" - "@typescript-eslint/type-utils" "8.16.0" - "@typescript-eslint/utils" "8.16.0" - "@typescript-eslint/visitor-keys" "8.16.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" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@8.16.0", "@typescript-eslint/parser@^8.8.1": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.16.0.tgz#ee5b2d6241c1ab3e2e53f03fd5a32d8e266d8e06" - integrity sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w== +"@typescript-eslint/parser@8.17.0", "@typescript-eslint/parser@^8.8.1": + version "8.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.17.0.tgz#2ee972bb12fa69ac625b85813dc8d9a5a053ff52" + integrity sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg== dependencies: - "@typescript-eslint/scope-manager" "8.16.0" - "@typescript-eslint/types" "8.16.0" - "@typescript-eslint/typescript-estree" "8.16.0" - "@typescript-eslint/visitor-keys" "8.16.0" + "@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" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.16.0.tgz#ebc9a3b399a69a6052f3d88174456dd399ef5905" - integrity sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg== +"@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== dependencies: - "@typescript-eslint/types" "8.16.0" - "@typescript-eslint/visitor-keys" "8.16.0" + "@typescript-eslint/types" "8.17.0" + "@typescript-eslint/visitor-keys" "8.17.0" -"@typescript-eslint/type-utils@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.16.0.tgz#585388735f7ac390f07c885845c3d185d1b64740" - integrity sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg== +"@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== dependencies: - "@typescript-eslint/typescript-estree" "8.16.0" - "@typescript-eslint/utils" "8.16.0" + "@typescript-eslint/typescript-estree" "8.17.0" + "@typescript-eslint/utils" "8.17.0" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.16.0.tgz#49c92ae1b57942458ab83d9ec7ccab3005e64737" - integrity sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ== +"@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/typescript-estree@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.16.0.tgz#9d741e56e5b13469b5190e763432ce5551a9300c" - integrity sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw== +"@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== dependencies: - "@typescript-eslint/types" "8.16.0" - "@typescript-eslint/visitor-keys" "8.16.0" + "@typescript-eslint/types" "8.17.0" + "@typescript-eslint/visitor-keys" "8.17.0" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -667,28 +671,28 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@8.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.16.0.tgz#c71264c437157feaa97842809836254a6fc833c3" - integrity sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA== +"@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== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.16.0" - "@typescript-eslint/types" "8.16.0" - "@typescript-eslint/typescript-estree" "8.16.0" + "@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.16.0": - version "8.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.16.0.tgz#d5086afc060b01ff7a4ecab8d49d13d5a7b07705" - integrity sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ== +"@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== dependencies: - "@typescript-eslint/types" "8.16.0" + "@typescript-eslint/types" "8.17.0" eslint-visitor-keys "^4.2.0" "@vitest/coverage-v8@^2.1.3": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@vitest/coverage-v8/-/coverage-v8-2.1.6.tgz#cdf43a628a460b9ac1bc2de72540830fa29fe7a1" - integrity sha512-qItJVYDbG3MUFO68dOZUz+rWlqe9LMzotERXFXKg25s2A/kSVsyS9O0yNGrITfBd943GsnBeQZkBUu7Pc+zVeA== + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/coverage-v8/-/coverage-v8-2.1.8.tgz#738527e6e79cef5004248452527e272e0df12284" + integrity sha512-2Y7BPlKH18mAZYAW1tYByudlCYrQyl5RGvnnDYJKW5tCiO5qg3KSAy3XAxcxKz900a0ZXxWtKrMuZLe3lKBpJw== dependencies: "@ampproject/remapping" "^2.3.0" "@bcoe/v8-coverage" "^0.2.3" @@ -703,62 +707,62 @@ test-exclude "^7.0.1" tinyrainbow "^1.2.0" -"@vitest/expect@2.1.6": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.1.6.tgz#5a334eb9ee9287292fbe961955cafb06f7af7da6" - integrity sha512-9M1UR9CAmrhJOMoSwVnPh2rELPKhYo0m/CSgqw9PyStpxtkwhmdM6XYlXGKeYyERY1N6EIuzkQ7e3Lm1WKCoUg== +"@vitest/expect@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.1.8.tgz#13fad0e8d5a0bf0feb675dcf1d1f1a36a1773bc1" + integrity sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw== dependencies: - "@vitest/spy" "2.1.6" - "@vitest/utils" "2.1.6" + "@vitest/spy" "2.1.8" + "@vitest/utils" "2.1.8" chai "^5.1.2" tinyrainbow "^1.2.0" -"@vitest/mocker@2.1.6": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-2.1.6.tgz#d13c5a7bd0abf432e1030f68acb43f51c4b3692e" - integrity sha512-MHZp2Z+Q/A3am5oD4WSH04f9B0T7UvwEb+v5W0kCYMhtXGYbdyl2NUk1wdSMqGthmhpiThPDp/hEoVwu16+u1A== +"@vitest/mocker@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-2.1.8.tgz#51dec42ac244e949d20009249e033e274e323f73" + integrity sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA== dependencies: - "@vitest/spy" "2.1.6" + "@vitest/spy" "2.1.8" estree-walker "^3.0.3" magic-string "^0.30.12" -"@vitest/pretty-format@2.1.6", "@vitest/pretty-format@^2.1.6": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.6.tgz#9bc642047a3efc637b41492b1f222c43be3822e4" - integrity sha512-exZyLcEnHgDMKc54TtHca4McV4sKT+NKAe9ix/yhd/qkYb/TP8HTyXRFDijV19qKqTZM0hPL4753zU/U8L/gAA== +"@vitest/pretty-format@2.1.8", "@vitest/pretty-format@^2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.8.tgz#88f47726e5d0cf4ba873d50c135b02e4395e2bca" + integrity sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ== dependencies: tinyrainbow "^1.2.0" -"@vitest/runner@2.1.6": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.1.6.tgz#948cad2cccfe2e56be5b3f9979cf9a417ca59737" - integrity sha512-SjkRGSFyrA82m5nz7To4CkRSEVWn/rwQISHoia/DB8c6IHIhaE/UNAo+7UfeaeJRE979XceGl00LNkIz09RFsA== +"@vitest/runner@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.1.8.tgz#b0e2dd29ca49c25e9323ea2a45a5125d8729759f" + integrity sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg== dependencies: - "@vitest/utils" "2.1.6" + "@vitest/utils" "2.1.8" pathe "^1.1.2" -"@vitest/snapshot@2.1.6": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.1.6.tgz#21740449221e37f80c4a8fb3e15f100f30e7934d" - integrity sha512-5JTWHw8iS9l3v4/VSuthCndw1lN/hpPB+mlgn1BUhFbobeIUj1J1V/Bj2t2ovGEmkXLTckFjQddsxS5T6LuVWw== +"@vitest/snapshot@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.1.8.tgz#d5dc204f4b95dc8b5e468b455dfc99000047d2de" + integrity sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg== dependencies: - "@vitest/pretty-format" "2.1.6" + "@vitest/pretty-format" "2.1.8" magic-string "^0.30.12" pathe "^1.1.2" -"@vitest/spy@2.1.6": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.1.6.tgz#229f9d48b90b8bdd6573723bdec0699915598080" - integrity sha512-oTFObV8bd4SDdRka5O+mSh5w9irgx5IetrD5i+OsUUsk/shsBoHifwCzy45SAORzAhtNiprUVaK3hSCCzZh1jQ== +"@vitest/spy@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.1.8.tgz#bc41af3e1e6a41ae3b67e51f09724136b88fa447" + integrity sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg== dependencies: tinyspy "^3.0.2" -"@vitest/utils@2.1.6": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.6.tgz#2af6a82c5c45da35ecd322d0568247a6e9c95c5f" - integrity sha512-ixNkFy3k4vokOUTU2blIUvOgKq/N2PW8vKIjZZYsGJCMX69MRa9J2sKqX5hY/k5O5Gty3YJChepkqZ3KM9LyIQ== +"@vitest/utils@2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.8.tgz#f8ef85525f3362ebd37fd25d268745108d6ae388" + integrity sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA== dependencies: - "@vitest/pretty-format" "2.1.6" + "@vitest/pretty-format" "2.1.8" loupe "^3.1.2" tinyrainbow "^1.2.0" @@ -942,9 +946,9 @@ callsites@^3.0.0: integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== caniuse-lite@^1.0.30001669: - version "1.0.30001684" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz#0eca437bab7d5f03452ff0ef9de8299be6b08e16" - integrity sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ== + version "1.0.30001687" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz#d0ac634d043648498eedf7a3932836beba90ebae" + integrity sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ== ccount@^2.0.0: version "2.0.1" @@ -1134,9 +1138,9 @@ de-indent@^1.0.2: integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" @@ -1233,9 +1237,9 @@ eastasianwidth@^0.2.0: integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.5.41: - version "1.5.67" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.67.tgz#66ebd2be4a77469ac2760ef5e9e460ba9a43a845" - integrity sha512-nz88NNBsD7kQSAGGJyp8hS6xSPtWwqNogA0mjtc2nUYeEf3nURK9qpV18TuBdDmEDgVWotS8Wkzf+V52dSQ/LQ== + 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== emoji-regex@^8.0.0: version "8.0.0" @@ -1264,35 +1268,34 @@ 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== -esbuild@^0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.0.tgz#f2d470596885fcb2e91c21eb3da3b3c89c0b55e7" - integrity sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ== +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== optionalDependencies: - "@esbuild/aix-ppc64" "0.24.0" - "@esbuild/android-arm" "0.24.0" - "@esbuild/android-arm64" "0.24.0" - "@esbuild/android-x64" "0.24.0" - "@esbuild/darwin-arm64" "0.24.0" - "@esbuild/darwin-x64" "0.24.0" - "@esbuild/freebsd-arm64" "0.24.0" - "@esbuild/freebsd-x64" "0.24.0" - "@esbuild/linux-arm" "0.24.0" - "@esbuild/linux-arm64" "0.24.0" - "@esbuild/linux-ia32" "0.24.0" - "@esbuild/linux-loong64" "0.24.0" - "@esbuild/linux-mips64el" "0.24.0" - "@esbuild/linux-ppc64" "0.24.0" - "@esbuild/linux-riscv64" "0.24.0" - "@esbuild/linux-s390x" "0.24.0" - "@esbuild/linux-x64" "0.24.0" - "@esbuild/netbsd-x64" "0.24.0" - "@esbuild/openbsd-arm64" "0.24.0" - "@esbuild/openbsd-x64" "0.24.0" - "@esbuild/sunos-x64" "0.24.0" - "@esbuild/win32-arm64" "0.24.0" - "@esbuild/win32-ia32" "0.24.0" - "@esbuild/win32-x64" "0.24.0" + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" @@ -1314,19 +1317,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.1.3: - 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" @@ -1467,11 +1457,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" @@ -1695,9 +1680,9 @@ globals@^14.0.0: integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== globals@^15.9.0: - version "15.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-15.12.0.tgz#1811872883ad8f41055b61457a130221297de5b5" - integrity sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ== + version "15.13.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.13.0.tgz#bbec719d69aafef188ecd67954aae76a696010fc" + integrity sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g== graphemer@^1.4.0: version "1.4.0" @@ -2993,7 +2978,7 @@ pluralize@^8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -postcss@^8.4.48, postcss@^8.4.49: +postcss@^8.4.43, postcss@^8.4.48: version "8.4.49" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== @@ -3007,17 +2992,10 @@ 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.2.4: - version "3.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.1.tgz#e211d451d6452db0a291672ca9154bc8c2579f7b" - integrity sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg== + version "3.4.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== property-information@^6.0.0: version "6.5.0" @@ -3215,31 +3193,32 @@ rimraf@^6.0.1: glob "^11.0.0" package-json-from-dist "^1.0.0" -rollup@^4.23.0: - version "4.28.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.28.0.tgz#eb8d28ed43ef60a18f21d0734d230ee79dd0de77" - integrity sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ== +rollup@^4.20.0: + version "4.28.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.28.1.tgz#7718ba34d62b449dfc49adbfd2f312b4fe0df4de" + integrity sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg== dependencies: "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.28.0" - "@rollup/rollup-android-arm64" "4.28.0" - "@rollup/rollup-darwin-arm64" "4.28.0" - "@rollup/rollup-darwin-x64" "4.28.0" - "@rollup/rollup-freebsd-arm64" "4.28.0" - "@rollup/rollup-freebsd-x64" "4.28.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.28.0" - "@rollup/rollup-linux-arm-musleabihf" "4.28.0" - "@rollup/rollup-linux-arm64-gnu" "4.28.0" - "@rollup/rollup-linux-arm64-musl" "4.28.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.28.0" - "@rollup/rollup-linux-riscv64-gnu" "4.28.0" - "@rollup/rollup-linux-s390x-gnu" "4.28.0" - "@rollup/rollup-linux-x64-gnu" "4.28.0" - "@rollup/rollup-linux-x64-musl" "4.28.0" - "@rollup/rollup-win32-arm64-msvc" "4.28.0" - "@rollup/rollup-win32-ia32-msvc" "4.28.0" - "@rollup/rollup-win32-x64-msvc" "4.28.0" + "@rollup/rollup-android-arm-eabi" "4.28.1" + "@rollup/rollup-android-arm64" "4.28.1" + "@rollup/rollup-darwin-arm64" "4.28.1" + "@rollup/rollup-darwin-x64" "4.28.1" + "@rollup/rollup-freebsd-arm64" "4.28.1" + "@rollup/rollup-freebsd-x64" "4.28.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.28.1" + "@rollup/rollup-linux-arm-musleabihf" "4.28.1" + "@rollup/rollup-linux-arm64-gnu" "4.28.1" + "@rollup/rollup-linux-arm64-musl" "4.28.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.28.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.28.1" + "@rollup/rollup-linux-riscv64-gnu" "4.28.1" + "@rollup/rollup-linux-s390x-gnu" "4.28.1" + "@rollup/rollup-linux-x64-gnu" "4.28.1" + "@rollup/rollup-linux-x64-musl" "4.28.1" + "@rollup/rollup-win32-arm64-msvc" "4.28.1" + "@rollup/rollup-win32-ia32-msvc" "4.28.1" + "@rollup/rollup-win32-x64-msvc" "4.28.1" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -3444,14 +3423,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" - test-exclude@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-7.0.1.tgz#20b3ba4906ac20994e275bbcafd68d510264c2a2" @@ -3508,11 +3479,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" @@ -3536,18 +3502,18 @@ type-fest@^2.0.0, type-fest@^2.5.0: integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== type-fest@^4.6.0, type-fest@^4.7.1: - version "4.29.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.29.0.tgz#c9ac0bd3c7cb2c2fb8fc7b24d5b3eb48daad834e" - integrity sha512-RPYt6dKyemXJe7I6oNstcH24myUGSReicxcHTvCLgzm4e0n8y05dGvcGB15/SoPRBmhlMthWQ9pvKyL81ko8nQ== + version "4.30.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.30.0.tgz#cf411e7630578ad9e9884951dfaeef6588f970fe" + integrity sha512-G6zXWS1dLj6eagy6sVhOMQiLtJdxQBHIA9Z6HFUNLOlr6MFOgzV8wvmidtPONfPtEUv0uZsy77XJNzTAfwPDaA== typescript-eslint@^8.8.1: - version "8.16.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.16.0.tgz#d608c972d6b2461ca10ec30fd3fa62a080baba19" - integrity sha512-wDkVmlY6O2do4V+lZd0GtRfbtXbeD0q9WygwXXSJnC1xorE8eqyC2L1tJimqpSeFrOzRlYtWnUp/uzgHQOgfBQ== + 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.16.0" - "@typescript-eslint/parser" "8.16.0" - "@typescript-eslint/utils" "8.16.0" + "@typescript-eslint/eslint-plugin" "8.17.0" + "@typescript-eslint/parser" "8.17.0" + "@typescript-eslint/utils" "8.17.0" typescript@^5.3.3: version "5.7.2" @@ -3564,6 +3530,11 @@ unc-path-regex@^0.1.2: resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + unicorn-magic@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" @@ -3721,40 +3692,40 @@ vfile@^5.0.0, vfile@^5.3.4: unist-util-stringify-position "^3.0.0" vfile-message "^3.0.0" -vite-node@2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.6.tgz#d7b79c5cde56c749f619dead049944918726b91e" - integrity sha512-DBfJY0n9JUwnyLxPSSUmEePT21j8JZp/sR9n+/gBwQU6DcQOioPdb8/pibWfXForbirSagZCilseYIwaL3f95A== +vite-node@2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.8.tgz#9495ca17652f6f7f95ca7c4b568a235e0c8dbac5" + integrity sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg== dependencies: cac "^6.7.14" debug "^4.3.7" es-module-lexer "^1.5.4" pathe "^1.1.2" - vite "^5.0.0 || ^6.0.0" + vite "^5.0.0" -"vite@^5.0.0 || ^6.0.0": - version "6.0.1" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.1.tgz#24c9caf24998f0598de37bed67e50ec5b9dfeaf0" - integrity sha512-Ldn6gorLGr4mCdFnmeAOLweJxZ34HjKnDm4HGo6P66IEqTxQb36VEdFJQENKxWjupNfoIjvRUnswjn1hpYEpjQ== +vite@^5.0.0: + version "5.4.11" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.11.tgz#3b415cd4aed781a356c1de5a9ebafb837715f6e5" + integrity sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q== dependencies: - esbuild "^0.24.0" - postcss "^8.4.49" - rollup "^4.23.0" + esbuild "^0.21.3" + postcss "^8.4.43" + rollup "^4.20.0" optionalDependencies: fsevents "~2.3.3" vitest@^2.1.3: - version "2.1.6" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.1.6.tgz#44d661c6b3f3a3a0c597143f78d27215ee4666cc" - integrity sha512-isUCkvPL30J4c5O5hgONeFRsDmlw6kzFEdLQHLezmDdKQHy8Ke/B/dgdTMEgU0vm+iZ0TjW8GuK83DiahBoKWQ== - dependencies: - "@vitest/expect" "2.1.6" - "@vitest/mocker" "2.1.6" - "@vitest/pretty-format" "^2.1.6" - "@vitest/runner" "2.1.6" - "@vitest/snapshot" "2.1.6" - "@vitest/spy" "2.1.6" - "@vitest/utils" "2.1.6" + version "2.1.8" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.1.8.tgz#2e6a00bc24833574d535c96d6602fb64163092fa" + integrity sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ== + dependencies: + "@vitest/expect" "2.1.8" + "@vitest/mocker" "2.1.8" + "@vitest/pretty-format" "^2.1.8" + "@vitest/runner" "2.1.8" + "@vitest/snapshot" "2.1.8" + "@vitest/spy" "2.1.8" + "@vitest/utils" "2.1.8" chai "^5.1.2" debug "^4.3.7" expect-type "^1.1.0" @@ -3765,8 +3736,8 @@ vitest@^2.1.3: tinyexec "^0.3.1" tinypool "^1.0.1" tinyrainbow "^1.2.0" - vite "^5.0.0 || ^6.0.0" - vite-node "2.1.6" + vite "^5.0.0" + vite-node "2.1.8" why-is-node-running "^2.3.0" vue-template-compiler@^2.7.8: