diff --git a/src/index.ts b/src/index.ts index bec255e..5c01a83 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,10 +1,11 @@ import VCF from './parse' export interface Breakend { - MatePosition: string Join: string Replacement: string - MateDirection: string + MatePosition?: string + MateDirection?: string + SingleBreakend?: boolean } export function parseBreakend(breakendString: string): Breakend | undefined { @@ -31,6 +32,42 @@ export function parseBreakend(breakendString: string): Breakend | undefined { 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, breakendString.length - 1), + } + } else if (breakendString[0] === '<') { + const res = breakendString.match('<(.*)>(.*)') + if (!res) { + throw new Error(`failed to parse ${breakendString}`) + } + return { + Join: 'left', + Replacement: res?.[2], + MateDirection: 'right', + MatePosition: `<${res?.[1]}>:1`, + } + } else if (breakendString.includes('<')) { + const res = breakendString.match('(.*)<(.*)>') + if (!res) { + throw new Error(`failed to parse ${breakendString}`) + } + return { + Join: 'right', + Replacement: res?.[1], + MateDirection: 'right', + MatePosition: `<${res?.[2]}>:1`, + } + } } return undefined } diff --git a/test/__snapshots__/parse.test.ts.snap b/test/__snapshots__/parse.test.ts.snap index d1e9d67..3a1efd5 100644 --- a/test/__snapshots__/parse.test.ts.snap +++ b/test/__snapshots__/parse.test.ts.snap @@ -1906,25 +1906,34 @@ Array [ ] `; -exports[`vcf 4.3 single breakends 1`] = ` +exports[`vcf 4.3 insertion shorthand 1`] = ` Object { "Join": "right", "MateDirection": "right", - "MatePosition": ":1", - "Replacement": "C", + "MatePosition": ":1", + "Replacement": "G", } `; -exports[`vcf 4.3 single breakends 2`] = ` +exports[`vcf 4.3 insertion shorthand 2`] = ` +Object { + "Join": "left", + "MateDirection": "right", + "MatePosition": ":1", + "Replacement": "G", +} +`; + +exports[`vcf 4.3 insertion shorthand 3`] = ` Object { "Join": "right", "MateDirection": "right", - "MatePosition": "13:123457", - "Replacement": ".", + "MatePosition": ":1", + "Replacement": "C", } `; -exports[`vcf 4.3 single breakends 3`] = ` +exports[`vcf 4.3 insertion shorthand 4`] = ` Object { "Join": "left", "MateDirection": "left", @@ -1933,4 +1942,26 @@ Object { } `; -exports[`vcf 4.3 single breakends 4`] = `undefined`; +exports[`vcf 4.3 single breakends 1`] = ` +Object { + "Join": "right", + "Replacement": "G", + "SingleBreakend": true, +} +`; + +exports[`vcf 4.3 single breakends 2`] = ` +Object { + "Join": "right", + "Replacement": "ACGT", + "SingleBreakend": true, +} +`; + +exports[`vcf 4.3 single breakends 3`] = ` +Object { + "Join": "left", + "Replacement": "ACGT", + "SingleBreakend": true, +} +`; diff --git a/test/parse.test.ts b/test/parse.test.ts index 7c8fb92..f9f5ff6 100644 --- a/test/parse.test.ts +++ b/test/parse.test.ts @@ -345,11 +345,15 @@ test('shortcut parsing with vcf 4.3 bnd example', () => { }) test('vcf 4.3 single breakends', () => { - // inserted contig - expect(parseBreakend('C[:1[')).toMatchSnapshot() // single breakend - expect(parseBreakend('.[13:123457')).toMatchSnapshot() - // large insertion - expect(parseBreakend(']13:123456]AGTNNNNNCAT')).toMatchSnapshot() expect(parseBreakend('G.')).toMatchSnapshot() + expect(parseBreakend('ACGT.')).toMatchSnapshot() + expect(parseBreakend('.ACGT')).toMatchSnapshot() +}) + +test('vcf 4.3 insertion shorthand', () => { + expect(parseBreakend('G')).toMatchSnapshot() + expect(parseBreakend('G')).toMatchSnapshot() + expect(parseBreakend('C[:1[')).toMatchSnapshot() + expect(parseBreakend(']13:123456]AGTNNNNNCAT')).toMatchSnapshot() })