UNPKG

@gmod/vcf

Version:

High performance streaming Variant Call Format (VCF) parser in pure JavaScript

81 lines (77 loc) 2.21 kB
export interface Breakend { Join: string Replacement: string MatePosition?: string MateDirection?: string SingleBreakend?: boolean } export function parseBreakend(breakendString: string): Breakend | undefined { const tokens = breakendString.split(/[[\]]/) if (tokens.length > 1) { const MateDirection = breakendString.includes('[') ? 'right' : 'left' let Join let Replacement let MatePosition for (const tok of tokens) { if (tok) { if (tok.includes(':')) { // this is the remote location MatePosition = tok Join = Replacement ? 'right' : 'left' } else { // this is the local alteration Replacement = tok } } } if (!(MatePosition && Join && Replacement)) { throw new Error(`Invalid breakend: ${breakendString}`) } return { MatePosition, Join, Replacement, MateDirection } } else { if (breakendString.startsWith('.')) { return { Join: 'left', SingleBreakend: true, Replacement: breakendString.slice(1), } } else if (breakendString.endsWith('.')) { return { Join: 'right', SingleBreakend: true, Replacement: breakendString.slice(0, -1), } } else if (breakendString.startsWith('<')) { const res = /<(.*)>(.*)/.exec(breakendString) if (!res) { throw new Error(`failed to parse ${breakendString}`) } const Replacement = res[2] return Replacement ? { Join: 'left', Replacement, MateDirection: 'right', MatePosition: `<${res[1]!}>:1`, } : undefined } else if (breakendString.includes('<')) { const res = /(.*)<(.*)>/.exec(breakendString) if (!res) { throw new Error(`failed to parse ${breakendString}`) } const Replacement = res[1] return Replacement ? { Join: 'right', Replacement, MateDirection: 'right', MatePosition: `<${res[2]!}>:1`, } : undefined } } return undefined } export type { Variant } from './parse.ts' export { default } from './parse.ts'