@gmod/vcf
Version:
High performance streaming Variant Call Format (VCF) parser in pure JavaScript
81 lines (77 loc) • 2.21 kB
text/typescript
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'