🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@gmod/vcf

Package Overview
Dependencies
Maintainers
6
Versions
48
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@gmod/vcf - npm Package Compare versions

Comparing version
6.1.2
to
7.0.0
+35
dist/Variant.d.ts
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;
};
}
"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;
};
}
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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"}
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 @@

@@ -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';

@@ -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"}

@@ -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']>;

@@ -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":"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"}
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}

@@ -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';

@@ -0,3 +1,4 @@

export { Variant } from "./Variant.js";
export { default } from "./parse.js";
export * from "./parseBreakend.js";
//# sourceMappingURL=index.js.map

@@ -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"}

@@ -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']>;

@@ -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 +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":"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"}
{
"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)**&#x20;
- `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.

@@ -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'

@@ -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']>