| import type { GenotypeCallback } from './processGenotypes.ts'; | ||
| export declare class Variant { | ||
| CHROM: string | undefined; | ||
| POS: number; | ||
| ID: string[] | undefined; | ||
| REF: string | undefined; | ||
| ALT: string[] | undefined; | ||
| QUAL: number | undefined; | ||
| FILTER: string | string[] | undefined; | ||
| INFO: Record<string, unknown>; | ||
| FORMAT: string | undefined; | ||
| private formatMeta; | ||
| private rest; | ||
| private sampleNames; | ||
| constructor(line: string, infoMeta: Record<string, { | ||
| Type?: string; | ||
| }>, formatMeta: Record<string, { | ||
| Type?: string; | ||
| }>, sampleNames: string[], strict: boolean); | ||
| private parseInfo; | ||
| SAMPLES(): Record<string, Record<string, (string | number | undefined)[] | undefined>>; | ||
| GENOTYPES(): Record<string, string>; | ||
| processGenotypes(callback: GenotypeCallback): void; | ||
| toJSON(): { | ||
| CHROM: string | undefined; | ||
| POS: number; | ||
| ID: string[] | undefined; | ||
| REF: string | undefined; | ||
| ALT: string[] | undefined; | ||
| QUAL: number | undefined; | ||
| FILTER: string | string[] | undefined; | ||
| INFO: Record<string, unknown>; | ||
| FORMAT: string | undefined; | ||
| }; | ||
| } |
+177
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.Variant = void 0; | ||
| const parseGenotypesOnly_ts_1 = require("./parseGenotypesOnly.js"); | ||
| const processGenotypes_ts_1 = require("./processGenotypes.js"); | ||
| function decodeURIComponentNoThrow(uri) { | ||
| try { | ||
| return decodeURIComponent(uri); | ||
| } | ||
| catch (_e) { | ||
| // avoid throwing exception on a failure to decode URI component | ||
| return uri; | ||
| } | ||
| } | ||
| class Variant { | ||
| constructor(line, infoMeta, formatMeta, sampleNames, strict) { | ||
| let currChar = 0; | ||
| let tabCount = 0; | ||
| while (currChar < line.length && tabCount < 9) { | ||
| if (line[currChar] === '\t') { | ||
| tabCount += 1; | ||
| } | ||
| currChar += 1; | ||
| } | ||
| const splitPos = tabCount === 9 ? currChar - 1 : currChar; | ||
| const fields = line.slice(0, splitPos).split('\t'); | ||
| const rest = line.slice(splitPos + 1); | ||
| const [CHROM, POS, ID, REF, ALT, QUAL, FILTER] = fields; | ||
| const filter = FILTER === '.' ? undefined : FILTER.split(';'); | ||
| if (strict && !fields[7]) { | ||
| throw new Error("no INFO field specified, must contain at least a '.' (turn off strict mode to allow)"); | ||
| } | ||
| this.CHROM = CHROM; | ||
| this.POS = +POS; | ||
| this.ID = ID === '.' ? undefined : ID.split(';'); | ||
| this.REF = REF; | ||
| this.ALT = ALT === '.' ? undefined : ALT.split(','); | ||
| this.QUAL = QUAL === '.' ? undefined : +QUAL; | ||
| this.FILTER = filter?.length === 1 && filter[0] === 'PASS' ? 'PASS' : filter; | ||
| this.INFO = | ||
| fields[7] === undefined || fields[7] === '.' | ||
| ? {} | ||
| : this.parseInfo(fields[7], infoMeta); | ||
| this.FORMAT = fields[8]; | ||
| this.formatMeta = formatMeta; | ||
| this.rest = rest; | ||
| this.sampleNames = sampleNames; | ||
| } | ||
| parseInfo(infoStr, infoMeta) { | ||
| const result = {}; | ||
| const hasDecode = infoStr.includes('%'); | ||
| const infoPairs = infoStr.split(';'); | ||
| const pairsLen = infoPairs.length; | ||
| for (let i = 0; i < pairsLen; i++) { | ||
| const pair = infoPairs[i]; | ||
| const eqIdx = pair.indexOf('='); | ||
| const key = eqIdx === -1 ? pair : pair.slice(0, eqIdx); | ||
| const val = eqIdx === -1 ? undefined : pair.slice(eqIdx + 1); | ||
| const itemType = infoMeta[key]?.Type; | ||
| if (itemType === 'Flag') { | ||
| result[key] = true; | ||
| } | ||
| else if (!val) { | ||
| result[key] = true; | ||
| } | ||
| else { | ||
| const isNumber = itemType === 'Integer' || itemType === 'Float'; | ||
| const rawItems = val.split(','); | ||
| const itemsLen = rawItems.length; | ||
| if (hasDecode) { | ||
| const items = []; | ||
| for (let j = 0; j < itemsLen; j++) { | ||
| const v = rawItems[j]; | ||
| if (v === '.') { | ||
| items.push(undefined); | ||
| } | ||
| else { | ||
| const decoded = decodeURIComponentNoThrow(v); | ||
| items.push(isNumber ? Number(decoded) : decoded); | ||
| } | ||
| } | ||
| result[key] = items; | ||
| } | ||
| else { | ||
| const items = []; | ||
| for (let j = 0; j < itemsLen; j++) { | ||
| const v = rawItems[j]; | ||
| if (v === '.') { | ||
| items.push(undefined); | ||
| } | ||
| else { | ||
| items.push(isNumber ? Number(v) : v); | ||
| } | ||
| } | ||
| result[key] = items; | ||
| } | ||
| } | ||
| } | ||
| return result; | ||
| } | ||
| SAMPLES() { | ||
| const genotypes = {}; | ||
| const format = this.FORMAT; | ||
| if (format) { | ||
| const rest = this.rest.split('\t'); | ||
| const formatKeys = format.split(':'); | ||
| const isNumberType = []; | ||
| for (let i = 0; i < formatKeys.length; i++) { | ||
| const r = this.formatMeta[formatKeys[i]]?.Type; | ||
| isNumberType.push(r === 'Integer' || r === 'Float'); | ||
| } | ||
| const numKeys = formatKeys.length; | ||
| const samplesLen = this.sampleNames.length; | ||
| for (let i = 0; i < samplesLen; i++) { | ||
| const sample = this.sampleNames[i]; | ||
| const sampleData = {}; | ||
| const sampleStr = rest[i]; | ||
| const sampleStrLen = sampleStr.length; | ||
| let colStart = 0; | ||
| let colIdx = 0; | ||
| for (let j = 0; j <= sampleStrLen; j++) { | ||
| if (j === sampleStrLen || sampleStr[j] === ':') { | ||
| const val = sampleStr.slice(colStart, j); | ||
| if (val === '' || val === '.') { | ||
| sampleData[formatKeys[colIdx]] = undefined; | ||
| } | ||
| else { | ||
| const items = val.split(','); | ||
| const result = []; | ||
| if (isNumberType[colIdx]) { | ||
| for (let k = 0; k < items.length; k++) { | ||
| const ent = items[k]; | ||
| result.push(ent === '.' ? undefined : +ent); | ||
| } | ||
| } | ||
| else { | ||
| for (let k = 0; k < items.length; k++) { | ||
| const ent = items[k]; | ||
| result.push(ent === '.' ? undefined : ent); | ||
| } | ||
| } | ||
| sampleData[formatKeys[colIdx]] = result; | ||
| } | ||
| colStart = j + 1; | ||
| colIdx += 1; | ||
| if (colIdx >= numKeys) { | ||
| break; | ||
| } | ||
| } | ||
| } | ||
| genotypes[sample] = sampleData; | ||
| } | ||
| } | ||
| return genotypes; | ||
| } | ||
| GENOTYPES() { | ||
| return (0, parseGenotypesOnly_ts_1.parseGenotypesOnly)(this.FORMAT ?? '', this.rest, this.sampleNames); | ||
| } | ||
| processGenotypes(callback) { | ||
| (0, processGenotypes_ts_1.processGenotypes)(this.FORMAT ?? '', this.rest, this.sampleNames.length, callback); | ||
| } | ||
| toJSON() { | ||
| return { | ||
| CHROM: this.CHROM, | ||
| POS: this.POS, | ||
| ID: this.ID, | ||
| REF: this.REF, | ||
| ALT: this.ALT, | ||
| QUAL: this.QUAL, | ||
| FILTER: this.FILTER, | ||
| INFO: this.INFO, | ||
| FORMAT: this.FORMAT, | ||
| }; | ||
| } | ||
| } | ||
| exports.Variant = Variant; | ||
| //# sourceMappingURL=Variant.js.map |
| {"version":3,"file":"Variant.js","sourceRoot":"","sources":["../src/Variant.ts"],"names":[],"mappings":"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"} |
| import type { GenotypeCallback } from './processGenotypes.ts'; | ||
| export declare class Variant { | ||
| CHROM: string | undefined; | ||
| POS: number; | ||
| ID: string[] | undefined; | ||
| REF: string | undefined; | ||
| ALT: string[] | undefined; | ||
| QUAL: number | undefined; | ||
| FILTER: string | string[] | undefined; | ||
| INFO: Record<string, unknown>; | ||
| FORMAT: string | undefined; | ||
| private formatMeta; | ||
| private rest; | ||
| private sampleNames; | ||
| constructor(line: string, infoMeta: Record<string, { | ||
| Type?: string; | ||
| }>, formatMeta: Record<string, { | ||
| Type?: string; | ||
| }>, sampleNames: string[], strict: boolean); | ||
| private parseInfo; | ||
| SAMPLES(): Record<string, Record<string, (string | number | undefined)[] | undefined>>; | ||
| GENOTYPES(): Record<string, string>; | ||
| processGenotypes(callback: GenotypeCallback): void; | ||
| toJSON(): { | ||
| CHROM: string | undefined; | ||
| POS: number; | ||
| ID: string[] | undefined; | ||
| REF: string | undefined; | ||
| ALT: string[] | undefined; | ||
| QUAL: number | undefined; | ||
| FILTER: string | string[] | undefined; | ||
| INFO: Record<string, unknown>; | ||
| FORMAT: string | undefined; | ||
| }; | ||
| } |
+173
| import { parseGenotypesOnly } from "./parseGenotypesOnly.js"; | ||
| import { processGenotypes } from "./processGenotypes.js"; | ||
| function decodeURIComponentNoThrow(uri) { | ||
| try { | ||
| return decodeURIComponent(uri); | ||
| } | ||
| catch (_e) { | ||
| // avoid throwing exception on a failure to decode URI component | ||
| return uri; | ||
| } | ||
| } | ||
| export class Variant { | ||
| constructor(line, infoMeta, formatMeta, sampleNames, strict) { | ||
| let currChar = 0; | ||
| let tabCount = 0; | ||
| while (currChar < line.length && tabCount < 9) { | ||
| if (line[currChar] === '\t') { | ||
| tabCount += 1; | ||
| } | ||
| currChar += 1; | ||
| } | ||
| const splitPos = tabCount === 9 ? currChar - 1 : currChar; | ||
| const fields = line.slice(0, splitPos).split('\t'); | ||
| const rest = line.slice(splitPos + 1); | ||
| const [CHROM, POS, ID, REF, ALT, QUAL, FILTER] = fields; | ||
| const filter = FILTER === '.' ? undefined : FILTER.split(';'); | ||
| if (strict && !fields[7]) { | ||
| throw new Error("no INFO field specified, must contain at least a '.' (turn off strict mode to allow)"); | ||
| } | ||
| this.CHROM = CHROM; | ||
| this.POS = +POS; | ||
| this.ID = ID === '.' ? undefined : ID.split(';'); | ||
| this.REF = REF; | ||
| this.ALT = ALT === '.' ? undefined : ALT.split(','); | ||
| this.QUAL = QUAL === '.' ? undefined : +QUAL; | ||
| this.FILTER = filter?.length === 1 && filter[0] === 'PASS' ? 'PASS' : filter; | ||
| this.INFO = | ||
| fields[7] === undefined || fields[7] === '.' | ||
| ? {} | ||
| : this.parseInfo(fields[7], infoMeta); | ||
| this.FORMAT = fields[8]; | ||
| this.formatMeta = formatMeta; | ||
| this.rest = rest; | ||
| this.sampleNames = sampleNames; | ||
| } | ||
| parseInfo(infoStr, infoMeta) { | ||
| const result = {}; | ||
| const hasDecode = infoStr.includes('%'); | ||
| const infoPairs = infoStr.split(';'); | ||
| const pairsLen = infoPairs.length; | ||
| for (let i = 0; i < pairsLen; i++) { | ||
| const pair = infoPairs[i]; | ||
| const eqIdx = pair.indexOf('='); | ||
| const key = eqIdx === -1 ? pair : pair.slice(0, eqIdx); | ||
| const val = eqIdx === -1 ? undefined : pair.slice(eqIdx + 1); | ||
| const itemType = infoMeta[key]?.Type; | ||
| if (itemType === 'Flag') { | ||
| result[key] = true; | ||
| } | ||
| else if (!val) { | ||
| result[key] = true; | ||
| } | ||
| else { | ||
| const isNumber = itemType === 'Integer' || itemType === 'Float'; | ||
| const rawItems = val.split(','); | ||
| const itemsLen = rawItems.length; | ||
| if (hasDecode) { | ||
| const items = []; | ||
| for (let j = 0; j < itemsLen; j++) { | ||
| const v = rawItems[j]; | ||
| if (v === '.') { | ||
| items.push(undefined); | ||
| } | ||
| else { | ||
| const decoded = decodeURIComponentNoThrow(v); | ||
| items.push(isNumber ? Number(decoded) : decoded); | ||
| } | ||
| } | ||
| result[key] = items; | ||
| } | ||
| else { | ||
| const items = []; | ||
| for (let j = 0; j < itemsLen; j++) { | ||
| const v = rawItems[j]; | ||
| if (v === '.') { | ||
| items.push(undefined); | ||
| } | ||
| else { | ||
| items.push(isNumber ? Number(v) : v); | ||
| } | ||
| } | ||
| result[key] = items; | ||
| } | ||
| } | ||
| } | ||
| return result; | ||
| } | ||
| SAMPLES() { | ||
| const genotypes = {}; | ||
| const format = this.FORMAT; | ||
| if (format) { | ||
| const rest = this.rest.split('\t'); | ||
| const formatKeys = format.split(':'); | ||
| const isNumberType = []; | ||
| for (let i = 0; i < formatKeys.length; i++) { | ||
| const r = this.formatMeta[formatKeys[i]]?.Type; | ||
| isNumberType.push(r === 'Integer' || r === 'Float'); | ||
| } | ||
| const numKeys = formatKeys.length; | ||
| const samplesLen = this.sampleNames.length; | ||
| for (let i = 0; i < samplesLen; i++) { | ||
| const sample = this.sampleNames[i]; | ||
| const sampleData = {}; | ||
| const sampleStr = rest[i]; | ||
| const sampleStrLen = sampleStr.length; | ||
| let colStart = 0; | ||
| let colIdx = 0; | ||
| for (let j = 0; j <= sampleStrLen; j++) { | ||
| if (j === sampleStrLen || sampleStr[j] === ':') { | ||
| const val = sampleStr.slice(colStart, j); | ||
| if (val === '' || val === '.') { | ||
| sampleData[formatKeys[colIdx]] = undefined; | ||
| } | ||
| else { | ||
| const items = val.split(','); | ||
| const result = []; | ||
| if (isNumberType[colIdx]) { | ||
| for (let k = 0; k < items.length; k++) { | ||
| const ent = items[k]; | ||
| result.push(ent === '.' ? undefined : +ent); | ||
| } | ||
| } | ||
| else { | ||
| for (let k = 0; k < items.length; k++) { | ||
| const ent = items[k]; | ||
| result.push(ent === '.' ? undefined : ent); | ||
| } | ||
| } | ||
| sampleData[formatKeys[colIdx]] = result; | ||
| } | ||
| colStart = j + 1; | ||
| colIdx += 1; | ||
| if (colIdx >= numKeys) { | ||
| break; | ||
| } | ||
| } | ||
| } | ||
| genotypes[sample] = sampleData; | ||
| } | ||
| } | ||
| return genotypes; | ||
| } | ||
| GENOTYPES() { | ||
| return parseGenotypesOnly(this.FORMAT ?? '', this.rest, this.sampleNames); | ||
| } | ||
| processGenotypes(callback) { | ||
| processGenotypes(this.FORMAT ?? '', this.rest, this.sampleNames.length, callback); | ||
| } | ||
| toJSON() { | ||
| return { | ||
| CHROM: this.CHROM, | ||
| POS: this.POS, | ||
| ID: this.ID, | ||
| REF: this.REF, | ||
| ALT: this.ALT, | ||
| QUAL: this.QUAL, | ||
| FILTER: this.FILTER, | ||
| INFO: this.INFO, | ||
| FORMAT: this.FORMAT, | ||
| }; | ||
| } | ||
| } | ||
| //# sourceMappingURL=Variant.js.map |
| {"version":3,"file":"Variant.js","sourceRoot":"","sources":["../src/Variant.ts"],"names":[],"mappings":"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"} |
+216
| import { parseGenotypesOnly } from './parseGenotypesOnly.ts' | ||
| import { processGenotypes } from './processGenotypes.ts' | ||
| import type { GenotypeCallback } from './processGenotypes.ts' | ||
| function decodeURIComponentNoThrow(uri: string) { | ||
| try { | ||
| return decodeURIComponent(uri) | ||
| } catch (_e) { | ||
| // avoid throwing exception on a failure to decode URI component | ||
| return uri | ||
| } | ||
| } | ||
| export class Variant { | ||
| CHROM: string | undefined | ||
| POS: number | ||
| ID: string[] | undefined | ||
| REF: string | undefined | ||
| ALT: string[] | undefined | ||
| QUAL: number | undefined | ||
| FILTER: string | string[] | undefined | ||
| INFO: Record<string, unknown> | ||
| FORMAT: string | undefined | ||
| private formatMeta: Record<string, { Type?: string }> | ||
| private rest: string | ||
| private sampleNames: string[] | ||
| constructor( | ||
| line: string, | ||
| infoMeta: Record<string, { Type?: string }>, | ||
| formatMeta: Record<string, { Type?: string }>, | ||
| sampleNames: string[], | ||
| strict: boolean, | ||
| ) { | ||
| let currChar = 0 | ||
| let tabCount = 0 | ||
| while (currChar < line.length && tabCount < 9) { | ||
| if (line[currChar] === '\t') { | ||
| tabCount += 1 | ||
| } | ||
| currChar += 1 | ||
| } | ||
| const splitPos = tabCount === 9 ? currChar - 1 : currChar | ||
| const fields = line.slice(0, splitPos).split('\t') | ||
| const rest = line.slice(splitPos + 1) | ||
| const [CHROM, POS, ID, REF, ALT, QUAL, FILTER] = fields | ||
| const filter = FILTER === '.' ? undefined : FILTER!.split(';') | ||
| if (strict && !fields[7]) { | ||
| throw new Error( | ||
| "no INFO field specified, must contain at least a '.' (turn off strict mode to allow)", | ||
| ) | ||
| } | ||
| this.CHROM = CHROM | ||
| this.POS = +POS! | ||
| this.ID = ID === '.' ? undefined : ID!.split(';') | ||
| this.REF = REF | ||
| this.ALT = ALT === '.' ? undefined : ALT!.split(',') | ||
| this.QUAL = QUAL === '.' ? undefined : +QUAL! | ||
| this.FILTER = filter?.length === 1 && filter[0] === 'PASS' ? 'PASS' : filter | ||
| this.INFO = | ||
| fields[7] === undefined || fields[7] === '.' | ||
| ? {} | ||
| : this.parseInfo(fields[7], infoMeta) | ||
| this.FORMAT = fields[8] | ||
| this.formatMeta = formatMeta | ||
| this.rest = rest | ||
| this.sampleNames = sampleNames | ||
| } | ||
| private parseInfo( | ||
| infoStr: string, | ||
| infoMeta: Record<string, { Type?: string }>, | ||
| ) { | ||
| const result: Record<string, unknown> = {} | ||
| const hasDecode = infoStr.includes('%') | ||
| const infoPairs = infoStr.split(';') | ||
| const pairsLen = infoPairs.length | ||
| for (let i = 0; i < pairsLen; i++) { | ||
| const pair = infoPairs[i]! | ||
| const eqIdx = pair.indexOf('=') | ||
| const key = eqIdx === -1 ? pair : pair.slice(0, eqIdx) | ||
| const val = eqIdx === -1 ? undefined : pair.slice(eqIdx + 1) | ||
| const itemType = infoMeta[key]?.Type | ||
| if (itemType === 'Flag') { | ||
| result[key] = true | ||
| } else if (!val) { | ||
| result[key] = true | ||
| } else { | ||
| const isNumber = itemType === 'Integer' || itemType === 'Float' | ||
| const rawItems = val.split(',') | ||
| const itemsLen = rawItems.length | ||
| if (hasDecode) { | ||
| const items: (string | number | undefined)[] = [] | ||
| for (let j = 0; j < itemsLen; j++) { | ||
| const v = rawItems[j]! | ||
| if (v === '.') { | ||
| items.push(undefined) | ||
| } else { | ||
| const decoded = decodeURIComponentNoThrow(v) | ||
| items.push(isNumber ? Number(decoded) : decoded) | ||
| } | ||
| } | ||
| result[key] = items | ||
| } else { | ||
| const items: (string | number | undefined)[] = [] | ||
| for (let j = 0; j < itemsLen; j++) { | ||
| const v = rawItems[j]! | ||
| if (v === '.') { | ||
| items.push(undefined) | ||
| } else { | ||
| items.push(isNumber ? Number(v) : v) | ||
| } | ||
| } | ||
| result[key] = items | ||
| } | ||
| } | ||
| } | ||
| return result | ||
| } | ||
| SAMPLES() { | ||
| const genotypes = {} as Record< | ||
| string, | ||
| Record<string, (string | number | undefined)[] | undefined> | ||
| > | ||
| const format = this.FORMAT | ||
| if (format) { | ||
| const rest = this.rest.split('\t') | ||
| const formatKeys = format.split(':') | ||
| const isNumberType: boolean[] = [] | ||
| for (let i = 0; i < formatKeys.length; i++) { | ||
| const r = this.formatMeta[formatKeys[i]!]?.Type | ||
| isNumberType.push(r === 'Integer' || r === 'Float') | ||
| } | ||
| const numKeys = formatKeys.length | ||
| const samplesLen = this.sampleNames.length | ||
| for (let i = 0; i < samplesLen; i++) { | ||
| const sample = this.sampleNames[i]! | ||
| const sampleData: Record< | ||
| string, | ||
| (string | number | undefined)[] | undefined | ||
| > = {} | ||
| const sampleStr = rest[i]! | ||
| const sampleStrLen = sampleStr.length | ||
| let colStart = 0 | ||
| let colIdx = 0 | ||
| for (let j = 0; j <= sampleStrLen; j++) { | ||
| if (j === sampleStrLen || sampleStr[j] === ':') { | ||
| const val = sampleStr.slice(colStart, j) | ||
| if (val === '' || val === '.') { | ||
| sampleData[formatKeys[colIdx]!] = undefined | ||
| } else { | ||
| const items = val.split(',') | ||
| const result: (string | number | undefined)[] = [] | ||
| if (isNumberType[colIdx]) { | ||
| for (let k = 0; k < items.length; k++) { | ||
| const ent = items[k]! | ||
| result.push(ent === '.' ? undefined : +ent) | ||
| } | ||
| } else { | ||
| for (let k = 0; k < items.length; k++) { | ||
| const ent = items[k]! | ||
| result.push(ent === '.' ? undefined : ent) | ||
| } | ||
| } | ||
| sampleData[formatKeys[colIdx]!] = result | ||
| } | ||
| colStart = j + 1 | ||
| colIdx += 1 | ||
| if (colIdx >= numKeys) { | ||
| break | ||
| } | ||
| } | ||
| } | ||
| genotypes[sample] = sampleData | ||
| } | ||
| } | ||
| return genotypes | ||
| } | ||
| GENOTYPES() { | ||
| return parseGenotypesOnly(this.FORMAT ?? '', this.rest, this.sampleNames) | ||
| } | ||
| processGenotypes(callback: GenotypeCallback) { | ||
| processGenotypes( | ||
| this.FORMAT ?? '', | ||
| this.rest, | ||
| this.sampleNames.length, | ||
| callback, | ||
| ) | ||
| } | ||
| toJSON() { | ||
| return { | ||
| CHROM: this.CHROM, | ||
| POS: this.POS, | ||
| ID: this.ID, | ||
| REF: this.REF, | ||
| ALT: this.ALT, | ||
| QUAL: this.QUAL, | ||
| FILTER: this.FILTER, | ||
| INFO: this.INFO, | ||
| FORMAT: this.FORMAT, | ||
| } | ||
| } | ||
| } |
+3
-3
@@ -1,9 +0,9 @@ | ||
| ## [6.1.2](https://github.com/GMOD/vcf-js/compare/v6.1.1...v6.1.2) (2026-01-18) | ||
| # [7.0.0](https://github.com/GMOD/vcf-js/compare/v6.1.2...v7.0.0) (2026-01-18) | ||
| ## [6.1.2](https://github.com/GMOD/vcf-js/compare/v6.1.1...v6.1.2) (2026-01-18) | ||
| # [6.1.0](https://github.com/GMOD/vcf-js/compare/v6.0.9...v6.1.0) (2025-11-26) | ||
| ## [6.0.9](https://github.com/GMOD/vcf-js/compare/v6.0.8...v6.0.9) (2025-04-01) | ||
@@ -10,0 +10,0 @@ |
+2
-1
@@ -1,3 +0,4 @@ | ||
| export type { Variant } from './parse.ts'; | ||
| export { Variant } from './Variant.ts'; | ||
| export type { GenotypeCallback } from './processGenotypes.ts'; | ||
| export { default } from './parse.ts'; | ||
| export * from './parseBreakend.ts'; |
+3
-1
@@ -20,3 +20,5 @@ "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.default = void 0; | ||
| exports.default = exports.Variant = void 0; | ||
| var Variant_ts_1 = require("./Variant.js"); | ||
| Object.defineProperty(exports, "Variant", { enumerable: true, get: function () { return Variant_ts_1.Variant; } }); | ||
| var parse_ts_1 = require("./parse.js"); | ||
@@ -23,0 +25,0 @@ Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(parse_ts_1).default; } }); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAEA,uCAAoC;AAA3B,oHAAA,OAAO,OAAA;AAChB,qDAAkC"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,2CAAsC;AAA7B,qGAAA,OAAO,OAAA;AAGhB,uCAAoC;AAA3B,oHAAA,OAAO,OAAA;AAChB,qDAAkC"} |
+8
-54
@@ -0,1 +1,3 @@ | ||
| import { Variant } from './Variant.ts'; | ||
| export { Variant } from './Variant.ts'; | ||
| /** | ||
@@ -16,8 +18,6 @@ * Class representing a VCF parser, instantiated with the VCF header. | ||
| samples: string[]; | ||
| constructor({ header, strict, }: { | ||
| constructor({ header, strict }: { | ||
| header: string; | ||
| strict?: boolean; | ||
| }); | ||
| private parseInfo; | ||
| private parseSamples; | ||
| /** | ||
@@ -52,57 +52,11 @@ * Parse a VCF metadata line (i.e. a line that starts with "##") and add its | ||
| /** | ||
| * Parse a VCF line into an object like | ||
| * Parse a VCF line into a Variant object. | ||
| * | ||
| * ```typescript | ||
| * { | ||
| * CHROM: 'contigA', | ||
| * POS: 3000, | ||
| * ID: ['rs17883296'], | ||
| * REF: 'G', | ||
| * ALT: ['T', 'A'], | ||
| * QUAL: 100, | ||
| * FILTER: 'PASS', | ||
| * INFO: { | ||
| * NS: [3], | ||
| * DP: [14], | ||
| * AF: [0.5], | ||
| * DB: true, | ||
| * XYZ: ['5'], | ||
| * }, | ||
| * SAMPLES: () => ({ | ||
| * HG00096: { | ||
| * GT: ['0|0'], | ||
| * AP: ['0.000', '0.000'], | ||
| * } | ||
| * }), | ||
| * GENOTYPES: () => ({ | ||
| * HG00096: '0|0' | ||
| * }) | ||
| * } | ||
| * ``` | ||
| * The returned Variant has SAMPLES() and GENOTYPES() methods which are | ||
| * lazily evaluated to avoid parsing the potentially long list of samples from | ||
| * e.g. 1000 genotypes data unless requested. | ||
| * | ||
| * SAMPLES and GENOTYPES methods are functions instead of static data fields | ||
| * because it avoids parsing the potentially long list of samples from e.g. | ||
| * 1000 genotypes data unless requested. | ||
| * | ||
| * The SAMPLES function gives all info about the samples | ||
| * | ||
| * The GENOTYPES function only extracts the raw GT string if it exists, for | ||
| * potentially optimized parsing by programs that need it | ||
| * | ||
| * @param {string} line - A string of a line from a VCF | ||
| */ | ||
| parseLine(line: string): { | ||
| CHROM: string | undefined; | ||
| POS: number; | ||
| ALT: string[] | undefined; | ||
| INFO: Record<string, any>; | ||
| REF: string | undefined; | ||
| FILTER: string | string[] | undefined; | ||
| ID: string[] | undefined; | ||
| QUAL: number | undefined; | ||
| FORMAT: string | undefined; | ||
| SAMPLES: () => Record<string, Record<string, (string | number | undefined)[] | undefined>>; | ||
| GENOTYPES: () => Record<string, string>; | ||
| }; | ||
| parseLine(line: string): Variant; | ||
| } | ||
| export type Variant = ReturnType<VCFParser['parseLine']>; |
+10
-195
@@ -6,14 +6,8 @@ "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const parseGenotypesOnly_ts_1 = require("./parseGenotypesOnly.js"); | ||
| exports.Variant = void 0; | ||
| const Variant_ts_1 = require("./Variant.js"); | ||
| const parseMetaString_ts_1 = require("./parseMetaString.js"); | ||
| const vcfReserved_ts_1 = __importDefault(require("./vcfReserved.js")); | ||
| function decodeURIComponentNoThrow(uri) { | ||
| try { | ||
| return decodeURIComponent(uri); | ||
| } | ||
| catch (_e) { | ||
| // avoid throwing exception on a failure to decode URI component | ||
| return uri; | ||
| } | ||
| } | ||
| var Variant_ts_2 = require("./Variant.js"); | ||
| Object.defineProperty(exports, "Variant", { enumerable: true, get: function () { return Variant_ts_2.Variant; } }); | ||
| /** | ||
@@ -31,3 +25,3 @@ * Class representing a VCF parser, instantiated with the VCF header. | ||
| class VCFParser { | ||
| constructor({ header, strict = true, }) { | ||
| constructor({ header, strict = true }) { | ||
| if (!header.length) { | ||
@@ -84,110 +78,2 @@ throw new Error('empty header received'); | ||
| } | ||
| parseInfo(infoStr) { | ||
| const result = {}; | ||
| const hasDecode = infoStr.includes('%'); | ||
| const infoPairs = infoStr.split(';'); | ||
| const infoMeta = this.metadata.INFO; | ||
| const pairsLen = infoPairs.length; | ||
| for (let i = 0; i < pairsLen; i++) { | ||
| const pair = infoPairs[i]; | ||
| const eqIdx = pair.indexOf('='); | ||
| const key = eqIdx === -1 ? pair : pair.slice(0, eqIdx); | ||
| const val = eqIdx === -1 ? undefined : pair.slice(eqIdx + 1); | ||
| const itemType = infoMeta[key]?.Type; | ||
| if (itemType === 'Flag') { | ||
| result[key] = true; | ||
| } | ||
| else if (!val) { | ||
| result[key] = true; | ||
| } | ||
| else { | ||
| const isNumber = itemType === 'Integer' || itemType === 'Float'; | ||
| const rawItems = val.split(','); | ||
| const itemsLen = rawItems.length; | ||
| if (hasDecode) { | ||
| const items = []; | ||
| for (let j = 0; j < itemsLen; j++) { | ||
| const v = rawItems[j]; | ||
| if (v === '.') { | ||
| items.push(undefined); | ||
| } | ||
| else { | ||
| const decoded = decodeURIComponentNoThrow(v); | ||
| items.push(isNumber ? Number(decoded) : decoded); | ||
| } | ||
| } | ||
| result[key] = items; | ||
| } | ||
| else { | ||
| const items = []; | ||
| for (let j = 0; j < itemsLen; j++) { | ||
| const v = rawItems[j]; | ||
| if (v === '.') { | ||
| items.push(undefined); | ||
| } | ||
| else { | ||
| items.push(isNumber ? Number(v) : v); | ||
| } | ||
| } | ||
| result[key] = items; | ||
| } | ||
| } | ||
| } | ||
| return result; | ||
| } | ||
| parseSamples(format, prerest) { | ||
| const genotypes = {}; | ||
| if (format) { | ||
| const rest = prerest.split('\t'); | ||
| const formatKeys = format.split(':'); | ||
| const formatMeta = this.metadata.FORMAT; | ||
| const isNumberType = []; | ||
| for (let i = 0; i < formatKeys.length; i++) { | ||
| const r = formatMeta[formatKeys[i]]?.Type; | ||
| isNumberType.push(r === 'Integer' || r === 'Float'); | ||
| } | ||
| const numKeys = formatKeys.length; | ||
| const samplesLen = this.samples.length; | ||
| for (let i = 0; i < samplesLen; i++) { | ||
| const sample = this.samples[i]; | ||
| const sampleData = {}; | ||
| const sampleStr = rest[i]; | ||
| const sampleStrLen = sampleStr.length; | ||
| let colStart = 0; | ||
| let colIdx = 0; | ||
| for (let j = 0; j <= sampleStrLen; j++) { | ||
| if (j === sampleStrLen || sampleStr[j] === ':') { | ||
| const val = sampleStr.slice(colStart, j); | ||
| if (val === '' || val === '.') { | ||
| sampleData[formatKeys[colIdx]] = undefined; | ||
| } | ||
| else { | ||
| const items = val.split(','); | ||
| const result = []; | ||
| if (isNumberType[colIdx]) { | ||
| for (let k = 0; k < items.length; k++) { | ||
| const ent = items[k]; | ||
| result.push(ent === '.' ? undefined : +ent); | ||
| } | ||
| } | ||
| else { | ||
| for (let k = 0; k < items.length; k++) { | ||
| const ent = items[k]; | ||
| result.push(ent === '.' ? undefined : ent); | ||
| } | ||
| } | ||
| sampleData[formatKeys[colIdx]] = result; | ||
| } | ||
| colStart = j + 1; | ||
| colIdx += 1; | ||
| if (colIdx >= numKeys) { | ||
| break; | ||
| } | ||
| } | ||
| } | ||
| genotypes[sample] = sampleData; | ||
| } | ||
| } | ||
| return genotypes; | ||
| } | ||
| /** | ||
@@ -269,83 +155,12 @@ * Parse a VCF metadata line (i.e. a line that starts with "##") and add its | ||
| /** | ||
| * Parse a VCF line into an object like | ||
| * Parse a VCF line into a Variant object. | ||
| * | ||
| * ```typescript | ||
| * { | ||
| * CHROM: 'contigA', | ||
| * POS: 3000, | ||
| * ID: ['rs17883296'], | ||
| * REF: 'G', | ||
| * ALT: ['T', 'A'], | ||
| * QUAL: 100, | ||
| * FILTER: 'PASS', | ||
| * INFO: { | ||
| * NS: [3], | ||
| * DP: [14], | ||
| * AF: [0.5], | ||
| * DB: true, | ||
| * XYZ: ['5'], | ||
| * }, | ||
| * SAMPLES: () => ({ | ||
| * HG00096: { | ||
| * GT: ['0|0'], | ||
| * AP: ['0.000', '0.000'], | ||
| * } | ||
| * }), | ||
| * GENOTYPES: () => ({ | ||
| * HG00096: '0|0' | ||
| * }) | ||
| * } | ||
| * ``` | ||
| * The returned Variant has SAMPLES() and GENOTYPES() methods which are | ||
| * lazily evaluated to avoid parsing the potentially long list of samples from | ||
| * e.g. 1000 genotypes data unless requested. | ||
| * | ||
| * SAMPLES and GENOTYPES methods are functions instead of static data fields | ||
| * because it avoids parsing the potentially long list of samples from e.g. | ||
| * 1000 genotypes data unless requested. | ||
| * | ||
| * The SAMPLES function gives all info about the samples | ||
| * | ||
| * The GENOTYPES function only extracts the raw GT string if it exists, for | ||
| * potentially optimized parsing by programs that need it | ||
| * | ||
| * @param {string} line - A string of a line from a VCF | ||
| */ | ||
| parseLine(line) { | ||
| let currChar = 0; | ||
| let tabCount = 0; | ||
| while (currChar < line.length && tabCount < 9) { | ||
| if (line[currChar] === '\t') { | ||
| tabCount += 1; | ||
| } | ||
| currChar += 1; | ||
| } | ||
| const splitPos = tabCount === 9 ? currChar - 1 : currChar; | ||
| const fields = line.slice(0, splitPos).split('\t'); | ||
| const rest = line.slice(splitPos + 1); | ||
| const [CHROM, POS, ID, REF, ALT, QUAL, FILTER] = fields; | ||
| const chrom = CHROM; | ||
| const pos = +POS; | ||
| const id = ID === '.' ? undefined : ID.split(';'); | ||
| const ref = REF; | ||
| const alt = ALT === '.' ? undefined : ALT.split(','); | ||
| const qual = QUAL === '.' ? undefined : +QUAL; | ||
| const filter = FILTER === '.' ? undefined : FILTER.split(';'); | ||
| const format = fields[8]; | ||
| if (this.strict && !fields[7]) { | ||
| throw new Error("no INFO field specified, must contain at least a '.' (turn off strict mode to allow)"); | ||
| } | ||
| const info = fields[7] === undefined || fields[7] === '.' | ||
| ? {} | ||
| : this.parseInfo(fields[7]); | ||
| return { | ||
| CHROM: chrom, | ||
| POS: pos, | ||
| ALT: alt, | ||
| INFO: info, | ||
| REF: ref, | ||
| FILTER: filter?.length === 1 && filter[0] === 'PASS' ? 'PASS' : filter, | ||
| ID: id, | ||
| QUAL: qual, | ||
| FORMAT: format, | ||
| SAMPLES: () => this.parseSamples(fields[8] ?? '', rest), | ||
| GENOTYPES: () => (0, parseGenotypesOnly_ts_1.parseGenotypesOnly)(fields[8] ?? '', rest, this.samples), | ||
| }; | ||
| return new Variant_ts_1.Variant(line, this.metadata.INFO, this.metadata.FORMAT, this.samples, this.strict); | ||
| } | ||
@@ -352,0 +167,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":";;;;;AAAA,mEAA4D;AAC5D,6DAAsD;AACtD,sEAA0C;AAE1C,SAAS,yBAAyB,CAAC,GAAW;IAC5C,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC;QACZ,gEAAgE;QAChE,OAAO,GAAG,CAAA;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAqB,SAAS;IAK5B,YAAY,EACV,MAAM,EACN,MAAM,GAAG,IAAI,GAId;QACC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;QAC1C,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC3D,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;QACxD,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,QAAQ,GAAG;YACd,IAAI,EAAE,EAAE,GAAG,wBAAW,CAAC,UAAU,EAAE;YACnC,MAAM,EAAE,EAAE,GAAG,wBAAW,CAAC,cAAc,EAAE;YACzC,GAAG,EAAE,EAAE,GAAG,wBAAW,CAAC,QAAQ,EAAE;YAChC,MAAM,EAAE,EAAE,GAAG,wBAAW,CAAC,WAAW,EAAE;SACvC,CAAA;QAED,IAAI,QAA4B,CAAA;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAE,CAAA;YAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAA;YACjD,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;YAC1B,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,IAAI,CAAA;YACjB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QACnD,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACrC,MAAM,aAAa,GAAG;YACpB,QAAQ;YACR,KAAK;YACL,IAAI;YACJ,KAAK;YACL,KAAK;YACL,MAAM;YACN,QAAQ;YACR,MAAM;SACP,CAAA;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAA;QAC7D,CAAC;aAAM,IACL,UAAU,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM;YAC1C,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,aAAa,CAAC,KAAK,CAAC,CAAC,EACnE,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAA;QACjE,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC;IAEO,SAAS,CAAC,OAAe;QAC/B,MAAM,MAAM,GAAwB,EAAE,CAAA;QACtC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACvC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAA2B,CAAA;QAC1D,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAA;QAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAE,CAAA;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAC/B,MAAM,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;YACtD,MAAM,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;YAC5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAA;YAEpC,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;YACpB,CAAC;iBAAM,IAAI,CAAC,GAAG,EAAE,CAAC;gBAChB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;YACpB,CAAC;iBAAM,CAAC;gBACN,MAAM,QAAQ,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,OAAO,CAAA;gBAC/D,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAA;gBAEhC,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,KAAK,GAAoC,EAAE,CAAA;oBACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;wBAClC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAA;wBACtB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;4BACd,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;wBACvB,CAAC;6BAAM,CAAC;4BACN,MAAM,OAAO,GAAG,yBAAyB,CAAC,CAAC,CAAC,CAAA;4BAC5C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;wBAClD,CAAC;oBACH,CAAC;oBACD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;gBACrB,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,GAAoC,EAAE,CAAA;oBACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;wBAClC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAA;wBACtB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;4BACd,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;wBACvB,CAAC;6BAAM,CAAC;4BACN,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;wBACtC,CAAC;oBACH,CAAC;oBACD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAEO,YAAY,CAAC,MAAc,EAAE,OAAe;QAClD,MAAM,SAAS,GAAG,EAGjB,CAAA;QACD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAChC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACpC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAA6B,CAAA;YAC9D,MAAM,YAAY,GAAc,EAAE,CAAA;YAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,EAAE,IAAI,CAAA;gBAC1C,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,OAAO,CAAC,CAAA;YACrD,CAAC;YACD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAA;YACjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA;YACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAA;gBAC/B,MAAM,UAAU,GAGZ,EAAE,CAAA;gBACN,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;gBAC1B,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAA;gBACrC,IAAI,QAAQ,GAAG,CAAC,CAAA;gBAChB,IAAI,MAAM,GAAG,CAAC,CAAA;gBAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;oBACvC,IAAI,CAAC,KAAK,YAAY,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;wBAC/C,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;wBACxC,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;4BAC9B,UAAU,CAAC,UAAU,CAAC,MAAM,CAAE,CAAC,GAAG,SAAS,CAAA;wBAC7C,CAAC;6BAAM,CAAC;4BACN,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;4BAC5B,MAAM,MAAM,GAAoC,EAAE,CAAA;4BAClD,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;gCACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oCACtC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;oCACrB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;gCAC7C,CAAC;4BACH,CAAC;iCAAM,CAAC;gCACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oCACtC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;oCACrB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;gCAC5C,CAAC;4BACH,CAAC;4BACD,UAAU,CAAC,UAAU,CAAC,MAAM,CAAE,CAAC,GAAG,MAAM,CAAA;wBAC1C,CAAC;wBACD,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAA;wBAChB,MAAM,IAAI,CAAC,CAAA;wBACX,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;4BACtB,MAAK;wBACP,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,SAAS,CAAC,MAAM,CAAC,GAAG,UAAU,CAAA;YAChC,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED;;;;;;OAMG;IACK,aAAa,CAAC,IAAY;QAChC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAA;QAC/D,CAAC;QACD,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAE5C,MAAM,CAAC,GAAG,OAAQ,CAAA;QAClB,IAAI,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;YACvB,CAAC;YACD,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAA;YAC1D,IAAI,EAAE,EAAE,CAAC;gBACP,6CAA6C;gBAC7C,8BAA8B;gBAC9B,CAAC;gBAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAA6B,CAAC,EAAE,CAAC,GAAG,OAAO,CAAA;YAC9D,CAAC;iBAAM,CAAC;gBACN,iDAAiD;gBACjD,iDAAiD;gBACjD,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAA;YAC5B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAA;QAC5B,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,sBAAsB,CAAC,OAAe;QAC5C,MAAM,OAAO,GAAG,IAAA,oCAAe,EAAC,OAAO,CAAC,CAAA;QACxC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAG,CAAA;QACtB,OAAO,OAAO,CAAC,EAAE,CAAA;QACjB,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC1C,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YACzC,CAAC;QACH,CAAC;QACD,OAAO,CAAC,EAAE,EAAE,OAAO,CAAU,CAAA;IAC/B,CAAC;IAED;;;;;;;;OAQG;IACH,WAAW,CAAC,GAAG,IAAc;QAC3B,IAAI,gBAAgB,GAAQ,IAAI,CAAC,QAAQ,CAAA;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAA;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,gBAAgB,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAA;YAC7C,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,OAAO,gBAAgB,CAAA;YACzB,CAAC;QACH,CAAC;QACD,OAAO,gBAAgB,CAAA;IACzB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyCG;IACH,SAAS,CAAC,IAAY;QACpB,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,OAAO,QAAQ,GAAG,IAAI,CAAC,MAAM,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC5B,QAAQ,IAAI,CAAC,CAAA;YACf,CAAC;YACD,QAAQ,IAAI,CAAC,CAAA;QACf,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;QACrC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,CAAA;QACvD,MAAM,KAAK,GAAG,KAAK,CAAA;QACnB,MAAM,GAAG,GAAG,CAAC,GAAI,CAAA;QACjB,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAClD,MAAM,GAAG,GAAG,GAAG,CAAA;QACf,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACrD,MAAM,IAAI,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAK,CAAA;QAC9C,MAAM,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QAExB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,sFAAsF,CACvF,CAAA;QACH,CAAC;QACD,MAAM,IAAI,GACR,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;YAC1C,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QAE/B,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,GAAG;YACR,IAAI,EAAE,IAAI;YACV,GAAG,EAAE,GAAG;YACR,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACtE,EAAE,EAAE,EAAE;YACN,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC;YACvD,SAAS,EAAE,GAAG,EAAE,CAAC,IAAA,0CAAkB,EAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC;SACzE,CAAA;IACH,CAAC;CACF;AAvVD,4BAuVC"} | ||
| {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"} |
+2
-1
@@ -1,3 +0,4 @@ | ||
| export type { Variant } from './parse.ts'; | ||
| export { Variant } from './Variant.ts'; | ||
| export type { GenotypeCallback } from './processGenotypes.ts'; | ||
| export { default } from './parse.ts'; | ||
| export * from './parseBreakend.ts'; |
+1
-0
@@ -0,3 +1,4 @@ | ||
| export { Variant } from "./Variant.js"; | ||
| export { default } from "./parse.js"; | ||
| export * from "./parseBreakend.js"; | ||
| //# sourceMappingURL=index.js.map |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,cAAc,oBAAoB,CAAA"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAGtC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,cAAc,oBAAoB,CAAA"} |
+8
-54
@@ -0,1 +1,3 @@ | ||
| import { Variant } from './Variant.ts'; | ||
| export { Variant } from './Variant.ts'; | ||
| /** | ||
@@ -16,8 +18,6 @@ * Class representing a VCF parser, instantiated with the VCF header. | ||
| samples: string[]; | ||
| constructor({ header, strict, }: { | ||
| constructor({ header, strict }: { | ||
| header: string; | ||
| strict?: boolean; | ||
| }); | ||
| private parseInfo; | ||
| private parseSamples; | ||
| /** | ||
@@ -52,57 +52,11 @@ * Parse a VCF metadata line (i.e. a line that starts with "##") and add its | ||
| /** | ||
| * Parse a VCF line into an object like | ||
| * Parse a VCF line into a Variant object. | ||
| * | ||
| * ```typescript | ||
| * { | ||
| * CHROM: 'contigA', | ||
| * POS: 3000, | ||
| * ID: ['rs17883296'], | ||
| * REF: 'G', | ||
| * ALT: ['T', 'A'], | ||
| * QUAL: 100, | ||
| * FILTER: 'PASS', | ||
| * INFO: { | ||
| * NS: [3], | ||
| * DP: [14], | ||
| * AF: [0.5], | ||
| * DB: true, | ||
| * XYZ: ['5'], | ||
| * }, | ||
| * SAMPLES: () => ({ | ||
| * HG00096: { | ||
| * GT: ['0|0'], | ||
| * AP: ['0.000', '0.000'], | ||
| * } | ||
| * }), | ||
| * GENOTYPES: () => ({ | ||
| * HG00096: '0|0' | ||
| * }) | ||
| * } | ||
| * ``` | ||
| * The returned Variant has SAMPLES() and GENOTYPES() methods which are | ||
| * lazily evaluated to avoid parsing the potentially long list of samples from | ||
| * e.g. 1000 genotypes data unless requested. | ||
| * | ||
| * SAMPLES and GENOTYPES methods are functions instead of static data fields | ||
| * because it avoids parsing the potentially long list of samples from e.g. | ||
| * 1000 genotypes data unless requested. | ||
| * | ||
| * The SAMPLES function gives all info about the samples | ||
| * | ||
| * The GENOTYPES function only extracts the raw GT string if it exists, for | ||
| * potentially optimized parsing by programs that need it | ||
| * | ||
| * @param {string} line - A string of a line from a VCF | ||
| */ | ||
| parseLine(line: string): { | ||
| CHROM: string | undefined; | ||
| POS: number; | ||
| ALT: string[] | undefined; | ||
| INFO: Record<string, any>; | ||
| REF: string | undefined; | ||
| FILTER: string | string[] | undefined; | ||
| ID: string[] | undefined; | ||
| QUAL: number | undefined; | ||
| FORMAT: string | undefined; | ||
| SAMPLES: () => Record<string, Record<string, (string | number | undefined)[] | undefined>>; | ||
| GENOTYPES: () => Record<string, string>; | ||
| }; | ||
| parseLine(line: string): Variant; | ||
| } | ||
| export type Variant = ReturnType<VCFParser['parseLine']>; |
+8
-195
@@ -1,13 +0,5 @@ | ||
| import { parseGenotypesOnly } from "./parseGenotypesOnly.js"; | ||
| import { Variant } from "./Variant.js"; | ||
| import { parseMetaString } from "./parseMetaString.js"; | ||
| import vcfReserved from "./vcfReserved.js"; | ||
| function decodeURIComponentNoThrow(uri) { | ||
| try { | ||
| return decodeURIComponent(uri); | ||
| } | ||
| catch (_e) { | ||
| // avoid throwing exception on a failure to decode URI component | ||
| return uri; | ||
| } | ||
| } | ||
| export { Variant } from "./Variant.js"; | ||
| /** | ||
@@ -25,3 +17,3 @@ * Class representing a VCF parser, instantiated with the VCF header. | ||
| export default class VCFParser { | ||
| constructor({ header, strict = true, }) { | ||
| constructor({ header, strict = true }) { | ||
| if (!header.length) { | ||
@@ -78,110 +70,2 @@ throw new Error('empty header received'); | ||
| } | ||
| parseInfo(infoStr) { | ||
| const result = {}; | ||
| const hasDecode = infoStr.includes('%'); | ||
| const infoPairs = infoStr.split(';'); | ||
| const infoMeta = this.metadata.INFO; | ||
| const pairsLen = infoPairs.length; | ||
| for (let i = 0; i < pairsLen; i++) { | ||
| const pair = infoPairs[i]; | ||
| const eqIdx = pair.indexOf('='); | ||
| const key = eqIdx === -1 ? pair : pair.slice(0, eqIdx); | ||
| const val = eqIdx === -1 ? undefined : pair.slice(eqIdx + 1); | ||
| const itemType = infoMeta[key]?.Type; | ||
| if (itemType === 'Flag') { | ||
| result[key] = true; | ||
| } | ||
| else if (!val) { | ||
| result[key] = true; | ||
| } | ||
| else { | ||
| const isNumber = itemType === 'Integer' || itemType === 'Float'; | ||
| const rawItems = val.split(','); | ||
| const itemsLen = rawItems.length; | ||
| if (hasDecode) { | ||
| const items = []; | ||
| for (let j = 0; j < itemsLen; j++) { | ||
| const v = rawItems[j]; | ||
| if (v === '.') { | ||
| items.push(undefined); | ||
| } | ||
| else { | ||
| const decoded = decodeURIComponentNoThrow(v); | ||
| items.push(isNumber ? Number(decoded) : decoded); | ||
| } | ||
| } | ||
| result[key] = items; | ||
| } | ||
| else { | ||
| const items = []; | ||
| for (let j = 0; j < itemsLen; j++) { | ||
| const v = rawItems[j]; | ||
| if (v === '.') { | ||
| items.push(undefined); | ||
| } | ||
| else { | ||
| items.push(isNumber ? Number(v) : v); | ||
| } | ||
| } | ||
| result[key] = items; | ||
| } | ||
| } | ||
| } | ||
| return result; | ||
| } | ||
| parseSamples(format, prerest) { | ||
| const genotypes = {}; | ||
| if (format) { | ||
| const rest = prerest.split('\t'); | ||
| const formatKeys = format.split(':'); | ||
| const formatMeta = this.metadata.FORMAT; | ||
| const isNumberType = []; | ||
| for (let i = 0; i < formatKeys.length; i++) { | ||
| const r = formatMeta[formatKeys[i]]?.Type; | ||
| isNumberType.push(r === 'Integer' || r === 'Float'); | ||
| } | ||
| const numKeys = formatKeys.length; | ||
| const samplesLen = this.samples.length; | ||
| for (let i = 0; i < samplesLen; i++) { | ||
| const sample = this.samples[i]; | ||
| const sampleData = {}; | ||
| const sampleStr = rest[i]; | ||
| const sampleStrLen = sampleStr.length; | ||
| let colStart = 0; | ||
| let colIdx = 0; | ||
| for (let j = 0; j <= sampleStrLen; j++) { | ||
| if (j === sampleStrLen || sampleStr[j] === ':') { | ||
| const val = sampleStr.slice(colStart, j); | ||
| if (val === '' || val === '.') { | ||
| sampleData[formatKeys[colIdx]] = undefined; | ||
| } | ||
| else { | ||
| const items = val.split(','); | ||
| const result = []; | ||
| if (isNumberType[colIdx]) { | ||
| for (let k = 0; k < items.length; k++) { | ||
| const ent = items[k]; | ||
| result.push(ent === '.' ? undefined : +ent); | ||
| } | ||
| } | ||
| else { | ||
| for (let k = 0; k < items.length; k++) { | ||
| const ent = items[k]; | ||
| result.push(ent === '.' ? undefined : ent); | ||
| } | ||
| } | ||
| sampleData[formatKeys[colIdx]] = result; | ||
| } | ||
| colStart = j + 1; | ||
| colIdx += 1; | ||
| if (colIdx >= numKeys) { | ||
| break; | ||
| } | ||
| } | ||
| } | ||
| genotypes[sample] = sampleData; | ||
| } | ||
| } | ||
| return genotypes; | ||
| } | ||
| /** | ||
@@ -263,85 +147,14 @@ * Parse a VCF metadata line (i.e. a line that starts with "##") and add its | ||
| /** | ||
| * Parse a VCF line into an object like | ||
| * Parse a VCF line into a Variant object. | ||
| * | ||
| * ```typescript | ||
| * { | ||
| * CHROM: 'contigA', | ||
| * POS: 3000, | ||
| * ID: ['rs17883296'], | ||
| * REF: 'G', | ||
| * ALT: ['T', 'A'], | ||
| * QUAL: 100, | ||
| * FILTER: 'PASS', | ||
| * INFO: { | ||
| * NS: [3], | ||
| * DP: [14], | ||
| * AF: [0.5], | ||
| * DB: true, | ||
| * XYZ: ['5'], | ||
| * }, | ||
| * SAMPLES: () => ({ | ||
| * HG00096: { | ||
| * GT: ['0|0'], | ||
| * AP: ['0.000', '0.000'], | ||
| * } | ||
| * }), | ||
| * GENOTYPES: () => ({ | ||
| * HG00096: '0|0' | ||
| * }) | ||
| * } | ||
| * ``` | ||
| * The returned Variant has SAMPLES() and GENOTYPES() methods which are | ||
| * lazily evaluated to avoid parsing the potentially long list of samples from | ||
| * e.g. 1000 genotypes data unless requested. | ||
| * | ||
| * SAMPLES and GENOTYPES methods are functions instead of static data fields | ||
| * because it avoids parsing the potentially long list of samples from e.g. | ||
| * 1000 genotypes data unless requested. | ||
| * | ||
| * The SAMPLES function gives all info about the samples | ||
| * | ||
| * The GENOTYPES function only extracts the raw GT string if it exists, for | ||
| * potentially optimized parsing by programs that need it | ||
| * | ||
| * @param {string} line - A string of a line from a VCF | ||
| */ | ||
| parseLine(line) { | ||
| let currChar = 0; | ||
| let tabCount = 0; | ||
| while (currChar < line.length && tabCount < 9) { | ||
| if (line[currChar] === '\t') { | ||
| tabCount += 1; | ||
| } | ||
| currChar += 1; | ||
| } | ||
| const splitPos = tabCount === 9 ? currChar - 1 : currChar; | ||
| const fields = line.slice(0, splitPos).split('\t'); | ||
| const rest = line.slice(splitPos + 1); | ||
| const [CHROM, POS, ID, REF, ALT, QUAL, FILTER] = fields; | ||
| const chrom = CHROM; | ||
| const pos = +POS; | ||
| const id = ID === '.' ? undefined : ID.split(';'); | ||
| const ref = REF; | ||
| const alt = ALT === '.' ? undefined : ALT.split(','); | ||
| const qual = QUAL === '.' ? undefined : +QUAL; | ||
| const filter = FILTER === '.' ? undefined : FILTER.split(';'); | ||
| const format = fields[8]; | ||
| if (this.strict && !fields[7]) { | ||
| throw new Error("no INFO field specified, must contain at least a '.' (turn off strict mode to allow)"); | ||
| } | ||
| const info = fields[7] === undefined || fields[7] === '.' | ||
| ? {} | ||
| : this.parseInfo(fields[7]); | ||
| return { | ||
| CHROM: chrom, | ||
| POS: pos, | ||
| ALT: alt, | ||
| INFO: info, | ||
| REF: ref, | ||
| FILTER: filter?.length === 1 && filter[0] === 'PASS' ? 'PASS' : filter, | ||
| ID: id, | ||
| QUAL: qual, | ||
| FORMAT: format, | ||
| SAMPLES: () => this.parseSamples(fields[8] ?? '', rest), | ||
| GENOTYPES: () => parseGenotypesOnly(fields[8] ?? '', rest, this.samples), | ||
| }; | ||
| return new Variant(line, this.metadata.INFO, this.metadata.FORMAT, this.samples, this.strict); | ||
| } | ||
| } | ||
| //# sourceMappingURL=parse.js.map |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,WAAW,MAAM,kBAAkB,CAAA;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,OAAO,OAAO,SAAS;IAK5B,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAwC;QACzE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;QAC1C,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC3D,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;QACxD,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,QAAQ,GAAG;YACd,IAAI,EAAE,EAAE,GAAG,WAAW,CAAC,UAAU,EAAE;YACnC,MAAM,EAAE,EAAE,GAAG,WAAW,CAAC,cAAc,EAAE;YACzC,GAAG,EAAE,EAAE,GAAG,WAAW,CAAC,QAAQ,EAAE;YAChC,MAAM,EAAE,EAAE,GAAG,WAAW,CAAC,WAAW,EAAE;SACvC,CAAA;QAED,IAAI,QAA4B,CAAA;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAE,CAAA;YAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAA;YACjD,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;YAC1B,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,IAAI,CAAA;YACjB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QACnD,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACrC,MAAM,aAAa,GAAG;YACpB,QAAQ;YACR,KAAK;YACL,IAAI;YACJ,KAAK;YACL,KAAK;YACL,MAAM;YACN,QAAQ;YACR,MAAM;SACP,CAAA;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAA;QAC7D,CAAC;aAAM,IACL,UAAU,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM;YAC1C,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,aAAa,CAAC,KAAK,CAAC,CAAC,EACnE,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAA;QACjE,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC;IAED;;;;;;OAMG;IACK,aAAa,CAAC,IAAY;QAChC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAA;QAC/D,CAAC;QACD,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAE5C,MAAM,CAAC,GAAG,OAAQ,CAAA;QAClB,IAAI,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;YACvB,CAAC;YACD,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAA;YAC1D,IAAI,EAAE,EAAE,CAAC;gBACP,6CAA6C;gBAC7C,8BAA8B;gBAC9B,CAAC;gBAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAA6B,CAAC,EAAE,CAAC,GAAG,OAAO,CAAA;YAC9D,CAAC;iBAAM,CAAC;gBACN,iDAAiD;gBACjD,iDAAiD;gBACjD,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAA;YAC5B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAA;QAC5B,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,sBAAsB,CAAC,OAAe;QAC5C,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;QACxC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAG,CAAA;QACtB,OAAO,OAAO,CAAC,EAAE,CAAA;QACjB,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC1C,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YACzC,CAAC;QACH,CAAC;QACD,OAAO,CAAC,EAAE,EAAE,OAAO,CAAU,CAAA;IAC/B,CAAC;IAED;;;;;;;;OAQG;IACH,WAAW,CAAC,GAAG,IAAc;QAC3B,IAAI,gBAAgB,GAAQ,IAAI,CAAC,QAAQ,CAAA;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAA;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,gBAAgB,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAA;YAC7C,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,OAAO,gBAAgB,CAAA;YACzB,CAAC;QACH,CAAC;QACD,OAAO,gBAAgB,CAAA;IACzB,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,OAAO,CAChB,IAAI,EACJ,IAAI,CAAC,QAAQ,CAAC,IAAyC,EACvD,IAAI,CAAC,QAAQ,CAAC,MAA2C,EACzD,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,MAAM,CACZ,CAAA;IACH,CAAC;CACF"} |
+1
-1
| { | ||
| "name": "@gmod/vcf", | ||
| "version": "6.1.2", | ||
| "version": "7.0.0", | ||
| "description": "High performance streaming Variant Call Format (VCF) parser in pure JavaScript", | ||
@@ -5,0 +5,0 @@ "type": "module", |
+50
-71
@@ -20,3 +20,3 @@ # vcf-js | ||
| // with import | ||
| import VCF, { parseBreakend } from '@gmod/vcf' | ||
| import VCF, { parseBreakend, Variant } from '@gmod/vcf' | ||
@@ -82,3 +82,3 @@ // with require | ||
| The `variant` object returned by `parseLine()` would be | ||
| The `Variant` object returned by `parseLine()` has these properties: | ||
@@ -101,23 +101,16 @@ ```typescript | ||
| }, | ||
| SAMPLES: () => ({ | ||
| HG00096: { | ||
| GT: ['0|0'], | ||
| AP: ['0.000', '0.000'], | ||
| }, | ||
| }), | ||
| GENOTYPES: () => ({ | ||
| HG00096: '0|0', | ||
| }), | ||
| } | ||
| ``` | ||
| 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. | ||
| The `Variant` class also has methods for accessing sample data: | ||
| 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 | ||
| - `variant.SAMPLES()` - returns full sample data with all FORMAT fields parsed | ||
| - `variant.GENOTYPES()` - returns just the GT strings (faster if that's all you | ||
| need) | ||
| - `variant.processGenotypes(callback)` - calls a callback for each genotype | ||
| without allocating strings (fastest for counting/iteration) | ||
| These methods lazily parse the genotype data, so they only do work when called. | ||
| This saves time especially if your VCF has many samples (e.g. 1000 Genomes). | ||
| The parser will try to convert the values in INFO and FORMAT to the proper types | ||
@@ -273,4 +266,2 @@ using the header metadata. For example, if there is a header line like | ||
| <!-- Generated by documentation.js. Update this documentation by updating the source code. --> | ||
| #### Table of Contents | ||
@@ -281,5 +272,7 @@ | ||
| - [getMetadata](#getmetadata) | ||
| - [Parameters](#parameters-1) | ||
| - [parseLine](#parseline) | ||
| - [Parameters](#parameters-2) | ||
| - [Variant](#variant) | ||
| - [SAMPLES](#samples) | ||
| - [GENOTYPES](#genotypes) | ||
| - [processGenotypes](#processgenotypes) | ||
@@ -292,11 +285,5 @@ ### VCFParser | ||
| - `args` | ||
| **[object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)**  | ||
| - `args.header` | ||
| **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** | ||
| The VCF header. Supports both LF and CRLF newlines. (optional, default `''`) | ||
| - `args.strict` | ||
| **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** | ||
| Whether to parse in strict mode or not (default true) (optional, default | ||
| `true`) | ||
| - `args.header` **string** - The VCF header. Supports both LF and CRLF newlines. | ||
| - `args.strict` **boolean** - Whether to parse in strict mode or not (default | ||
| true) | ||
@@ -310,5 +297,3 @@ #### getMetadata | ||
| - `args` | ||
| **...[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** | ||
| List of metadata filter strings. | ||
| - `...args` **string[]** - List of metadata filter strings. | ||
@@ -319,45 +304,39 @@ Returns **any** An object, string, or number, depending on the filtering | ||
| Parse a VCF line into an object like | ||
| Parse a VCF line into a `Variant` object. | ||
| ```typescript | ||
| { | ||
| CHROM: 'contigA', | ||
| POS: 3000, | ||
| ID: ['rs17883296'], | ||
| REF: 'G', | ||
| ALT: ['T', 'A'], | ||
| QUAL: 100, | ||
| FILTER: 'PASS', | ||
| INFO: { | ||
| NS: [3], | ||
| DP: [14], | ||
| AF: [0.5], | ||
| DB: true, | ||
| XYZ: ['5'], | ||
| }, | ||
| SAMPLES: () => ({ | ||
| HG00096: { | ||
| GT: ['0|0'], | ||
| AP: ['0.000', '0.000'], | ||
| } | ||
| }), | ||
| GENOTYPES: () => ({ | ||
| HG00096: '0|0' | ||
| }) | ||
| } | ||
| ``` | ||
| ##### Parameters | ||
| SAMPLES and GENOTYPES methods are functions instead of static data fields | ||
| because it avoids parsing the potentially long list of samples from e.g. 1000 | ||
| genotypes data unless requested. | ||
| - `line` **string** - A string of a line from a VCF | ||
| The SAMPLES function gives all info about the samples | ||
| Returns **Variant** A Variant instance with the parsed data | ||
| The GENOTYPES function only extracts the raw GT string if it exists, for | ||
| potentially optimized parsing by programs that need it | ||
| ### Variant | ||
| Class representing a parsed VCF variant line. Has data properties (CHROM, POS, | ||
| ID, REF, ALT, QUAL, FILTER, INFO, FORMAT) and methods for accessing sample data. | ||
| #### SAMPLES | ||
| Returns full sample data with all FORMAT fields parsed. | ||
| Returns **Record\<string, Record\<string, (string | number | undefined)[] | | ||
| undefined>>** | ||
| #### GENOTYPES | ||
| Returns just the GT strings for each sample (faster than SAMPLES if you only | ||
| need genotypes). | ||
| Returns **Record\<string, string>** | ||
| #### processGenotypes | ||
| Calls a callback for each genotype without allocating strings. Useful for | ||
| counting or iterating over genotypes with minimal memory allocation. | ||
| ##### Parameters | ||
| - `line` | ||
| **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** | ||
| A string of a line from a VCF | ||
| - `callback` **(str: string, start: number, end: number) => any** - Called for | ||
| each genotype with the raw string and indices. Use `str.slice(start, end)` to | ||
| extract the genotype string, or `str.charCodeAt(start)` to read characters | ||
| without allocation. |
+2
-1
@@ -1,4 +0,5 @@ | ||
| export type { Variant } from './parse.ts' | ||
| export { Variant } from './Variant.ts' | ||
| export type { GenotypeCallback } from './processGenotypes.ts' | ||
| export { default } from './parse.ts' | ||
| export * from './parseBreakend.ts' |
+14
-212
@@ -1,13 +0,6 @@ | ||
| import { parseGenotypesOnly } from './parseGenotypesOnly.ts' | ||
| import { Variant } from './Variant.ts' | ||
| import { parseMetaString } from './parseMetaString.ts' | ||
| import vcfReserved from './vcfReserved.ts' | ||
| function decodeURIComponentNoThrow(uri: string) { | ||
| try { | ||
| return decodeURIComponent(uri) | ||
| } catch (_e) { | ||
| // avoid throwing exception on a failure to decode URI component | ||
| return uri | ||
| } | ||
| } | ||
| export { Variant } from './Variant.ts' | ||
@@ -30,9 +23,3 @@ /** | ||
| constructor({ | ||
| header, | ||
| strict = true, | ||
| }: { | ||
| header: string | ||
| strict?: boolean | ||
| }) { | ||
| constructor({ header, strict = true }: { header: string; strict?: boolean }) { | ||
| if (!header.length) { | ||
@@ -92,115 +79,2 @@ throw new Error('empty header received') | ||
| private parseInfo(infoStr: string) { | ||
| const result: Record<string, any> = {} | ||
| const hasDecode = infoStr.includes('%') | ||
| const infoPairs = infoStr.split(';') | ||
| const infoMeta = this.metadata.INFO as Record<string, any> | ||
| const pairsLen = infoPairs.length | ||
| for (let i = 0; i < pairsLen; i++) { | ||
| const pair = infoPairs[i]! | ||
| const eqIdx = pair.indexOf('=') | ||
| const key = eqIdx === -1 ? pair : pair.slice(0, eqIdx) | ||
| const val = eqIdx === -1 ? undefined : pair.slice(eqIdx + 1) | ||
| const itemType = infoMeta[key]?.Type | ||
| if (itemType === 'Flag') { | ||
| result[key] = true | ||
| } else if (!val) { | ||
| result[key] = true | ||
| } else { | ||
| const isNumber = itemType === 'Integer' || itemType === 'Float' | ||
| const rawItems = val.split(',') | ||
| const itemsLen = rawItems.length | ||
| if (hasDecode) { | ||
| const items: (string | number | undefined)[] = [] | ||
| for (let j = 0; j < itemsLen; j++) { | ||
| const v = rawItems[j]! | ||
| if (v === '.') { | ||
| items.push(undefined) | ||
| } else { | ||
| const decoded = decodeURIComponentNoThrow(v) | ||
| items.push(isNumber ? Number(decoded) : decoded) | ||
| } | ||
| } | ||
| result[key] = items | ||
| } else { | ||
| const items: (string | number | undefined)[] = [] | ||
| for (let j = 0; j < itemsLen; j++) { | ||
| const v = rawItems[j]! | ||
| if (v === '.') { | ||
| items.push(undefined) | ||
| } else { | ||
| items.push(isNumber ? Number(v) : v) | ||
| } | ||
| } | ||
| result[key] = items | ||
| } | ||
| } | ||
| } | ||
| return result | ||
| } | ||
| private parseSamples(format: string, prerest: string) { | ||
| const genotypes = {} as Record< | ||
| string, | ||
| Record<string, (string | number | undefined)[] | undefined> | ||
| > | ||
| if (format) { | ||
| const rest = prerest.split('\t') | ||
| const formatKeys = format.split(':') | ||
| const formatMeta = this.metadata.FORMAT as Record<string, any> | ||
| const isNumberType: boolean[] = [] | ||
| for (let i = 0; i < formatKeys.length; i++) { | ||
| const r = formatMeta[formatKeys[i]!]?.Type | ||
| isNumberType.push(r === 'Integer' || r === 'Float') | ||
| } | ||
| const numKeys = formatKeys.length | ||
| const samplesLen = this.samples.length | ||
| for (let i = 0; i < samplesLen; i++) { | ||
| const sample = this.samples[i]! | ||
| const sampleData: Record< | ||
| string, | ||
| (string | number | undefined)[] | undefined | ||
| > = {} | ||
| const sampleStr = rest[i]! | ||
| const sampleStrLen = sampleStr.length | ||
| let colStart = 0 | ||
| let colIdx = 0 | ||
| for (let j = 0; j <= sampleStrLen; j++) { | ||
| if (j === sampleStrLen || sampleStr[j] === ':') { | ||
| const val = sampleStr.slice(colStart, j) | ||
| if (val === '' || val === '.') { | ||
| sampleData[formatKeys[colIdx]!] = undefined | ||
| } else { | ||
| const items = val.split(',') | ||
| const result: (string | number | undefined)[] = [] | ||
| if (isNumberType[colIdx]) { | ||
| for (let k = 0; k < items.length; k++) { | ||
| const ent = items[k]! | ||
| result.push(ent === '.' ? undefined : +ent) | ||
| } | ||
| } else { | ||
| for (let k = 0; k < items.length; k++) { | ||
| const ent = items[k]! | ||
| result.push(ent === '.' ? undefined : ent) | ||
| } | ||
| } | ||
| sampleData[formatKeys[colIdx]!] = result | ||
| } | ||
| colStart = j + 1 | ||
| colIdx += 1 | ||
| if (colIdx >= numKeys) { | ||
| break | ||
| } | ||
| } | ||
| } | ||
| genotypes[sample] = sampleData | ||
| } | ||
| } | ||
| return genotypes | ||
| } | ||
| /** | ||
@@ -283,91 +157,19 @@ * Parse a VCF metadata line (i.e. a line that starts with "##") and add its | ||
| /** | ||
| * Parse a VCF line into an object like | ||
| * Parse a VCF line into a Variant object. | ||
| * | ||
| * ```typescript | ||
| * { | ||
| * CHROM: 'contigA', | ||
| * POS: 3000, | ||
| * ID: ['rs17883296'], | ||
| * REF: 'G', | ||
| * ALT: ['T', 'A'], | ||
| * QUAL: 100, | ||
| * FILTER: 'PASS', | ||
| * INFO: { | ||
| * NS: [3], | ||
| * DP: [14], | ||
| * AF: [0.5], | ||
| * DB: true, | ||
| * XYZ: ['5'], | ||
| * }, | ||
| * SAMPLES: () => ({ | ||
| * HG00096: { | ||
| * GT: ['0|0'], | ||
| * AP: ['0.000', '0.000'], | ||
| * } | ||
| * }), | ||
| * GENOTYPES: () => ({ | ||
| * HG00096: '0|0' | ||
| * }) | ||
| * } | ||
| * ``` | ||
| * The returned Variant has SAMPLES() and GENOTYPES() methods which are | ||
| * lazily evaluated to avoid parsing the potentially long list of samples from | ||
| * e.g. 1000 genotypes data unless requested. | ||
| * | ||
| * SAMPLES and GENOTYPES methods are functions instead of static data fields | ||
| * because it avoids parsing the potentially long list of samples from e.g. | ||
| * 1000 genotypes data unless requested. | ||
| * | ||
| * The SAMPLES function gives all info about the samples | ||
| * | ||
| * The GENOTYPES function only extracts the raw GT string if it exists, for | ||
| * potentially optimized parsing by programs that need it | ||
| * | ||
| * @param {string} line - A string of a line from a VCF | ||
| */ | ||
| parseLine(line: string) { | ||
| let currChar = 0 | ||
| let tabCount = 0 | ||
| while (currChar < line.length && tabCount < 9) { | ||
| if (line[currChar] === '\t') { | ||
| tabCount += 1 | ||
| } | ||
| currChar += 1 | ||
| } | ||
| const splitPos = tabCount === 9 ? currChar - 1 : currChar | ||
| const fields = line.slice(0, splitPos).split('\t') | ||
| const rest = line.slice(splitPos + 1) | ||
| const [CHROM, POS, ID, REF, ALT, QUAL, FILTER] = fields | ||
| const chrom = CHROM | ||
| const pos = +POS! | ||
| const id = ID === '.' ? undefined : ID!.split(';') | ||
| const ref = REF | ||
| const alt = ALT === '.' ? undefined : ALT!.split(',') | ||
| const qual = QUAL === '.' ? undefined : +QUAL! | ||
| const filter = FILTER === '.' ? undefined : FILTER!.split(';') | ||
| const format = fields[8] | ||
| if (this.strict && !fields[7]) { | ||
| throw new Error( | ||
| "no INFO field specified, must contain at least a '.' (turn off strict mode to allow)", | ||
| ) | ||
| } | ||
| const info = | ||
| fields[7] === undefined || fields[7] === '.' | ||
| ? {} | ||
| : this.parseInfo(fields[7]) | ||
| return { | ||
| CHROM: chrom, | ||
| POS: pos, | ||
| ALT: alt, | ||
| INFO: info, | ||
| REF: ref, | ||
| FILTER: filter?.length === 1 && filter[0] === 'PASS' ? 'PASS' : filter, | ||
| ID: id, | ||
| QUAL: qual, | ||
| FORMAT: format, | ||
| SAMPLES: () => this.parseSamples(fields[8] ?? '', rest), | ||
| GENOTYPES: () => parseGenotypesOnly(fields[8] ?? '', rest, this.samples), | ||
| } | ||
| return new Variant( | ||
| line, | ||
| this.metadata.INFO as Record<string, { Type?: string }>, | ||
| this.metadata.FORMAT as Record<string, { Type?: string }>, | ||
| this.samples, | ||
| this.strict, | ||
| ) | ||
| } | ||
| } | ||
| export type Variant = ReturnType<VCFParser['parseLine']> |
192937
1%61
12.96%3958
-0.75%335
-5.9%