From 98d672baec9fe7d55d5036a039e28a04168cbaee Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Tue, 14 Jun 2022 14:31:43 -0700 Subject: [PATCH 01/23] Update package-lock.json --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 7185fb3..5102d5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "@bcgsc-pori/graphkb-parser", - "version": "1.1.3", + "version": "2.0.0", "license": "GPL-3.0", "dependencies": { "json-cycle": "^1.3.0" From ee7894a125ceff8b53338ce3b3cc8ab8c154a301 Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Tue, 14 Jun 2022 14:33:50 -0700 Subject: [PATCH 02/23] Update package-lock after audit fix for minimist --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5102d5c..0db8597 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16248,9 +16248,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/mixin-deep": { @@ -31264,9 +31264,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "mixin-deep": { From 4862d149d39a93de506f58a281f3166ddec581cf Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Wed, 28 Jun 2023 11:40:13 -0700 Subject: [PATCH 03/23] Add NotImplementedError class --- src/error.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/error.ts b/src/error.ts index 60f2a5a..2f5a3fe 100644 --- a/src/error.ts +++ b/src/error.ts @@ -55,4 +55,11 @@ class ParsingError extends ErrorMixin {} class InputValidationError extends ErrorMixin {} -export { ParsingError, ErrorMixin, InputValidationError }; +class NotImplementedError extends ErrorMixin {} + +export { + ErrorMixin, + InputValidationError, + NotImplementedError, + ParsingError, +}; From bc272a1de767c8a2966b4760cbba457e5072785b Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Wed, 28 Jun 2023 11:41:42 -0700 Subject: [PATCH 04/23] add NotImplementedError --- src/variant.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/variant.ts b/src/variant.ts index 5d1b7ab..18a0516 100644 --- a/src/variant.ts +++ b/src/variant.ts @@ -1,4 +1,4 @@ -import { ParsingError, InputValidationError } from './error'; +import { InputValidationError, NotImplementedError, ParsingError } from './error'; import { createPosition, createBreakRepr, convertPositionToJson, parsePosition, AnyPosition, } from './position'; From 651df1091930504c779b9b475c651d309b4d652b Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Wed, 28 Jun 2023 11:43:56 -0700 Subject: [PATCH 05/23] Update package-lock.json --- package-lock.json | 68 +++++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0db8597..16ad06a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6286,9 +6286,9 @@ "dev": true }, "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, "engines": { "node": ">=0.10" @@ -15948,13 +15948,10 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -16236,9 +16233,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -16909,9 +16906,9 @@ } }, "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true, "engines": { "node": ">=0.6" @@ -18222,9 +18219,9 @@ } }, "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { "minimist": "^1.2.0" @@ -23611,9 +23608,9 @@ "dev": true }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, "dedent": { @@ -31025,13 +31022,10 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true }, "jsprim": { "version": "1.4.2", @@ -31255,9 +31249,9 @@ } }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -31778,9 +31772,9 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true }, "queue-microtask": { @@ -32800,9 +32794,9 @@ }, "dependencies": { "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0" From 157a87ea00704a46386fae8d5a6e4bb07088cd8c Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Wed, 28 Jun 2023 11:48:02 -0700 Subject: [PATCH 06/23] New fusion nomenclature handling in parseVariant --- src/variant.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/variant.ts b/src/variant.ts index 18a0516..a3ea9d9 100644 --- a/src/variant.ts +++ b/src/variant.ts @@ -449,10 +449,14 @@ const parseVariant = (string, requireFeatures = true) => { input: string, }); } + // New fusion nomenclature handling (KBDEV-974) + if (string.split('::').length > 1) { + return parseFusion(string, requireFeatures); + } const split = string.split(':'); if (split.length > 2) { - throw new ParsingError({ message: 'Variant notation must contain a single colon', input: string, violatedAttr: 'punctuation' }); + throw new ParsingError({ message: 'Apart from new fusion nomenclature, variant notation must contain a single colon', input: string, violatedAttr: 'punctuation' }); } else if (split.length === 1) { if (!requireFeatures) { split.unshift(null); From 6b68823d70639dbc87af16bc75bee5ddad33e227 Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Wed, 28 Jun 2023 11:49:28 -0700 Subject: [PATCH 07/23] Add comment in parseVariant --- src/variant.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/variant.ts b/src/variant.ts index a3ea9d9..df5f414 100644 --- a/src/variant.ts +++ b/src/variant.ts @@ -453,6 +453,7 @@ const parseVariant = (string, requireFeatures = true) => { if (string.split('::').length > 1) { return parseFusion(string, requireFeatures); } + // Feature vs Variant strings const split = string.split(':'); if (split.length > 2) { From 67ab7c1526a3cc4a1e438cd22b5af302ae717fe4 Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Wed, 28 Jun 2023 11:50:38 -0700 Subject: [PATCH 08/23] add parseFusion function for new nomenclature --- src/variant.ts | 72 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/src/variant.ts b/src/variant.ts index df5f414..429d9aa 100644 --- a/src/variant.ts +++ b/src/variant.ts @@ -431,8 +431,76 @@ const parseMultiFeature = (string: string): { }); } return { - type: variantType, break1Start, break1End, break2Start, break2End, untemplatedSeqSize, untemplatedSeq, prefix, - }; +/** + * Parse a fusion variant using the new HGVS nomenclature (KBDEV-974) + * + * @param {string} string is a fusion variant using the new nomenclature + * @param {boolean} requireFeatures, if set to false, allows string without feature + * + * @returns {VariantNotation} the parsed content + */ +const parseFusion = (string, requireFeatures = true) => { + const parts = string.split('::'); + + if (parts.length > 3) { + throw new ParsingError({ + message: 'Fusion variant using new nomenclature must contain 1 or 2 double-colon', + input: parts.join('::'), + violatedAttr: 'punctuation', + }); + } + // Special case with a sequence insertion between the 2 fused parts + if (parts.length === 3) { + const [, insertion] = parts; + + // When implemented, sequence insertion need to be in RNA + // if following HGVS standards restricting fusion to 'r' prefix + if (/^[acgu]+$/.test(insertion.toLowerCase())) { + throw new ParsingError({ + message: 'Insertion sequence of fusion variant should be given in ribonucleotides', + input: parts.join('::'), + violatedAttr: 'alphabet', + }); + } + // Feature not implemented yet in GraphKB + throw new NotImplementedError({ + message: 'Inserted sequence in fusion not implemented', + input: parts.join('::'), + }); + } + // Standard 2-parts fusion - Parsing individual parts + const [string1, string2] = parts; + const t1 = parseFusionPart(string1, requireFeatures); + const t2 = parseFusionPart(string2, requireFeatures); + + // Prefix + let prefix; + + if (t1.prefix === t2.prefix) { + // Since each fusion part have it's own prefix, a prefix at the variant + // level is only given if they are the same + prefix = t1.prefix; + } + + try { + return createVariantNotation({ + ...t1, + prefix, + requireFeatures, + reference2: t2.reference1, + break2Start: t2.break1Start, + break2End: t2.break1End, + }); + } catch (err: any) { + if (err.content) { + err.content.parsed = { + string, + reference1: t1.reference1, + reference2: t2.reference1, + }; + } + throw err; + } }; /** From e0a60768218426a2fe50e81f10723ec5bc7a77fd Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Wed, 28 Jun 2023 11:51:48 -0700 Subject: [PATCH 09/23] Add parseFusionPart for individual part parsing --- src/variant.ts | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/src/variant.ts b/src/variant.ts index 429d9aa..274a721 100644 --- a/src/variant.ts +++ b/src/variant.ts @@ -430,7 +430,85 @@ const parseMultiFeature = (string: string): { violatedAttr: 'break2', }); } + +/** + * Parse one side of a fusion variant using the new nomenclature (KBDEV-974) + * + * @param {string} string is one of the fusion part (one side) to be parsed + * @param {boolean} requireFeatures + * + * @returns {VariantNotation} the parsed content + */ +const parseFusionPart = (string, requireFeatures) => { + // Come from a multi-feature variant + const multiFeature = true; + + // Feature vs Variant strings + const stringSplit = string.split(':'); + + if (stringSplit.length > 2) { + throw new ParsingError({ + message: 'Variant notation must contain a single colon', + input: string, + violatedAttr: 'punctuation', + }); + } else if (stringSplit.length === 1) { + if (!requireFeatures) { + stringSplit.unshift(''); + } else { + throw new ParsingError({ + message: 'Feature name not specified. Feature name is required', + violatedAttr: 'reference1', + }); + } + } + const [featureString, variantString] = stringSplit; + + // References + let reference1 = ''; + + if (featureString) { + reference1 = featureString; + } + + // Prefix + const prefix = getPrefix(variantString); + + // if (prefix !== 'r') { + // // A double colon is used to describe RNA fusion transcripts + // // (RNA Deletion - insertion) using exclusively the 'r' prefix + // // https://varnomen.hgvs.org/recommendations/RNA/variant/delins/ + // throw new ParsingError({ + // message: 'Fusion notation must be in rna coordinate system', + // input: string, + // }); + // // The other use case of a double colon, not implemented, is to + // // designate break point junctions creating a ring chromosome + // // https://varnomen.hgvs.org/recommendations/DNA/variant/complex/ + // } + + // Range of positions + const positions = variantString.slice(prefix.length + 1).split('_'); + + if (positions.length !== 2) { + throw new ParsingError({ + message: 'Fusion notation must be a range of positions', + input: string, + }); + } + + // Returns a partial variant notation for that variant's part return { + reference1, + reference2: '', + type: NOTATION_TO_TYPES.fusion, + multiFeature, + prefix, + break1Start: parsePosition(prefix, positions[0]), + break1End: parsePosition(prefix, positions[1]), + }; +}; + /** * Parse a fusion variant using the new HGVS nomenclature (KBDEV-974) * From ca51dfbd4a129a1e54378441e53ec885c8dd64c7 Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Wed, 28 Jun 2023 11:59:09 -0700 Subject: [PATCH 10/23] add data file for tests --- test/data.ts | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 test/data.ts diff --git a/test/data.ts b/test/data.ts new file mode 100644 index 0000000..9803e16 --- /dev/null +++ b/test/data.ts @@ -0,0 +1,173 @@ +import { NOTATION_TO_TYPES } from '../src/constants'; + +const standardVariants = { + 'EGFR:e.20_21ins': { + break1Start: { + '@class': 'ExonicPosition', + pos: 20, + prefix: 'e', + }, + break1Repr: 'e.20', + break2Start: { + '@class': 'ExonicPosition', + pos: 21, + prefix: 'e', + }, + break2Repr: 'e.21', + prefix: 'e', + reference1: 'EGFR', + type: NOTATION_TO_TYPES.ins, + }, + 'KRAS:p.G12D': { + break1Start: { + '@class': 'ProteinPosition', + pos: 12, + prefix: 'p', + refAA: 'G', + }, + break1Repr: 'p.G12', + prefix: 'p', + reference1: 'KRAS', + type: NOTATION_TO_TYPES.mis, + untemplatedSeq: 'D', + }, +}; + +// Actual fusion variant with legacy notation (from KBDEV-974) +const fusionVariants = { + '(ATP1B1,NRG1):fusion(g.169080736,g.32453346)': { + reference1: 'ATP1B1', + reference2: 'NRG1', + multiFeature: true, + type: 'fusion', + break1Start: { + '@class': 'GenomicPosition', + pos: 169080736, + prefix: 'g', + }, + break1Repr: 'g.169080736', + break2Start: { + '@class': 'GenomicPosition', + pos: 32453346, + prefix: 'g', + }, + break2Repr: 'g.32453346', + noFeatures: false, + prefix: 'g', + }, + '(ENST00000357447,ENST00000371953):fusion(c.1118,c.165)': { + reference1: 'ENST00000357447', + reference2: 'ENST00000371953', + multiFeature: true, + type: 'fusion', + break1Start: { + '@class': 'CdsPosition', + pos: 1118, + prefix: 'c', + offset: 0, + }, + break1Repr: 'c.1118', + break2Start: { + '@class': 'CdsPosition', + pos: 165, + prefix: 'c', + offset: 0, + }, + break2Repr: 'c.165', + noFeatures: false, + prefix: 'c', + }, + '(COL1A1,PDGFB):fusion(r.2354,r.852)': { + reference1: 'COL1A1', + reference2: 'PDGFB', + multiFeature: true, + type: 'fusion', + break1Start: { + '@class': 'RnaPosition', + pos: 2354, + prefix: 'r', + offset: 0, + }, + break1Repr: 'r.2354', + break2Start: { + '@class': 'RnaPosition', + pos: 852, + prefix: 'r', + offset: 0, + }, + break2Repr: 'r.852', + noFeatures: false, + prefix: 'r', + }, + '(CLTC,ALK):fusion(e.30,e.20)': { + reference1: 'CLTC', + reference2: 'ALK', + multiFeature: true, + type: 'fusion', + break1Start: { + '@class': 'ExonicPosition', + pos: 30, + prefix: 'e', + }, + break1Repr: 'e.30', + break2Start: { + '@class': 'ExonicPosition', + pos: 20, + prefix: 'e', + }, + break2Repr: 'e.20', + noFeatures: false, + prefix: 'e', + }, + // Cases with mixed prefix + // resulting in malformed positions + '(ZNF532,NUTM1):fusion(p.?4,e.2)': { + reference1: 'ZNF532', + reference2: 'NUTM1', + multiFeature: true, + type: 'fusion', + break1Start: { + '@class': 'ExonicPosition', + pos: 4, + prefix: 'e', + }, + break1Repr: 'e.4', + break2Start: { + '@class': 'ExonicPosition', + pos: 2, + prefix: 'e', + }, + break2Repr: 'e.2', + noFeatures: false, + prefix: 'e', + }, + '(CDH1,LARS):fusion(i.2,e.17)': { + reference1: 'CDH1', + reference2: 'LARS', + multiFeature: true, + type: 'fusion', + break1Start: { + '@class': 'ExonicPosition', + pos: 2, + prefix: 'e', + }, + break1Repr: 'e.2', + break2Start: { + '@class': 'ExonicPosition', + pos: 17, + prefix: 'e', + }, + break2Repr: 'e.17', + noFeatures: false, + prefix: 'e', + }, + // Cases with mixed prefix + // resulting in error + // '(chr3,BRAF):fusion(y.p26.3,e.4)' : { + // }, +}; + +export default { + fusionVariants, + standardVariants, +}; From 60f6dc0f4e069fcc8e5c0c0301348b1d138471fa Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Wed, 28 Jun 2023 12:01:31 -0700 Subject: [PATCH 11/23] Add test for parseVariant function --- test/variant.test.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/test/variant.test.ts b/test/variant.test.ts index 6ad21b6..564b089 100644 --- a/test/variant.test.ts +++ b/test/variant.test.ts @@ -1,3 +1,4 @@ +import data from './data'; import { stringifyVariant, stripParentheses, @@ -159,3 +160,27 @@ describe('jsonifyVariant', () => { }); }); }); + +describe('parseVariant & strignifyVariant', () => { + const variants = { + ...data.standardVariants, + ...data.fusionVariants, + }; + + test.each(Object.keys(variants))('Parsing %s and strignify back', (variantString) => { + const variantNotation = parseVariant(variantString); + + // Parse variant string and compare notations + expect(variantNotation).toStrictEqual( + expect.objectContaining({ + ...variants[variantString], + break1Start: expect.objectContaining( + variants[variantString].break1Start, + ), + }), + ); + // Strignify notation and compare variant strings + expect(stringifyVariant(variants[variantString])).toBe(variantString); + }); +}); + From 28dbbe7a25f609bb8b37b8276e531591bfb3b0dd Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Wed, 28 Jun 2023 12:02:34 -0700 Subject: [PATCH 12/23] Rename test for createVariantNotation function --- test/variant.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/variant.test.ts b/test/variant.test.ts index 564b089..df8a232 100644 --- a/test/variant.test.ts +++ b/test/variant.test.ts @@ -9,7 +9,7 @@ import { import { createPosition } from '../src/position'; import { NOTATION_TO_TYPES } from '../src/constants'; -describe('VariantNotation', () => { +describe('createVariantNotation', () => { test('use object name if no sourceId on reference', () => { const notation = createVariantNotation({ reference1: { name: 'KRAS' }, From 4081c0670fb69870623ca769b3e20296ddc65d78 Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Fri, 30 Jun 2023 14:21:58 -0700 Subject: [PATCH 13/23] Implement inserted sequence in fusion --- src/variant.ts | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/src/variant.ts b/src/variant.ts index 274a721..0cde270 100644 --- a/src/variant.ts +++ b/src/variant.ts @@ -1,4 +1,4 @@ -import { InputValidationError, NotImplementedError, ParsingError } from './error'; +import { InputValidationError, ParsingError } from './error'; import { createPosition, createBreakRepr, convertPositionToJson, parsePosition, AnyPosition, } from './position'; @@ -230,7 +230,22 @@ const stringifyVariant = (variant: VariantNotation): string => { if (!break2Repr) { throw new InputValidationError('Multi-feature notation requires break2Repr'); } - // multi-feature notation + // new fusion nomenclature notation + if (newFusion) { + + let insertedSequence = ''; + if (untemplatedSeq !== undefined && untemplatedSeq !== null) { + insertedSequence = `${untemplatedSeq}::` + } + + if (noFeatures) { + return `${break1Repr}::${insertedSequence}${break2Repr}`; + } + + return `${reference1}:${break1Repr}::${insertedSequence}${reference2}:${break2Repr}`; + } + + // multi-feature notation (incl. legacy fusion notation) let result = noFeatures ? '' : `(${reference1},${reference2}):`; @@ -527,29 +542,30 @@ const parseFusion = (string, requireFeatures = true) => { violatedAttr: 'punctuation', }); } - // Special case with a sequence insertion between the 2 fused parts + + let untemplatedSeq, + untemplatedSeqSize; + + // Special case with a sequence insertion between the 2 fusion parts if (parts.length === 3) { const [, insertion] = parts; // When implemented, sequence insertion need to be in RNA // if following HGVS standards restricting fusion to 'r' prefix - if (/^[acgu]+$/.test(insertion.toLowerCase())) { + if (!/^[ACGU]+$/.test(insertion.toUpperCase())) { throw new ParsingError({ message: 'Insertion sequence of fusion variant should be given in ribonucleotides', - input: parts.join('::'), + input: string, violatedAttr: 'alphabet', }); } - // Feature not implemented yet in GraphKB - throw new NotImplementedError({ - message: 'Inserted sequence in fusion not implemented', - input: parts.join('::'), - }); + untemplatedSeq = insertion.toUpperCase(); + untemplatedSeqSize = insertion.length; } + // Standard 2-parts fusion - Parsing individual parts - const [string1, string2] = parts; - const t1 = parseFusionPart(string1, requireFeatures); - const t2 = parseFusionPart(string2, requireFeatures); + const t1 = parseFusionPart(parts[0], requireFeatures); + const t2 = parseFusionPart(parts[parts.length-1], requireFeatures); // skip middle part if one // Prefix let prefix; @@ -568,6 +584,8 @@ const parseFusion = (string, requireFeatures = true) => { reference2: t2.reference1, break2Start: t2.break1Start, break2End: t2.break1End, + untemplatedSeq, + untemplatedSeqSize, }); } catch (err: any) { if (err.content) { From 0695fc9610ef998fcf03d5c0e02d6e5d118eb665 Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Fri, 30 Jun 2023 14:24:51 -0700 Subject: [PATCH 14/23] Update stringifyVariant function signature --- src/variant.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/variant.ts b/src/variant.ts index 0cde270..f6f12db 100644 --- a/src/variant.ts +++ b/src/variant.ts @@ -203,7 +203,7 @@ const jsonifyVariant = (variant: VariantNotation): { [key: string]: string } => return json; }; -const stringifyVariant = (variant: VariantNotation): string => { +const stringifyVariant = (variant: VariantNotation, newFusion = false): string => { const { multiFeature, noFeatures, From 4e3de6a5fc415a9929e1dd07344a046f7f5edf56 Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Fri, 30 Jun 2023 14:30:39 -0700 Subject: [PATCH 15/23] Minor edits and formatting --- src/variant.ts | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/variant.ts b/src/variant.ts index f6f12db..f8de243 100644 --- a/src/variant.ts +++ b/src/variant.ts @@ -1,6 +1,6 @@ import { InputValidationError, ParsingError } from './error'; import { - createPosition, createBreakRepr, convertPositionToJson, parsePosition, AnyPosition, + createBreakRepr, convertPositionToJson, parsePosition, AnyPosition, } from './position'; import { NOTATION_TO_TYPES, @@ -232,10 +232,10 @@ const stringifyVariant = (variant: VariantNotation, newFusion = false): string = } // new fusion nomenclature notation if (newFusion) { - let insertedSequence = ''; + if (untemplatedSeq !== undefined && untemplatedSeq !== null) { - insertedSequence = `${untemplatedSeq}::` + insertedSequence = `${untemplatedSeq}::`; } if (noFeatures) { @@ -416,7 +416,13 @@ const parseMultiFeature = (string: string): { message: 'Error in parsing the first breakpoint position/range', input: string, parsed: { - type: variantType, break1Start, break1End, break2Start, break2End, untemplatedSeqSize, untemplatedSeq, + type: variantType, + break1Start, + break1End, + break2Start, + break2End, + untemplatedSeqSize, + untemplatedSeq, }, subParserError: err, violatedAttr: 'break1', @@ -439,7 +445,13 @@ const parseMultiFeature = (string: string): { message: 'Error in parsing the second breakpoint position/range', input: string, parsed: { - type: variantType, break1Start, break1End, break2Start, break2End, untemplatedSeqSize, untemplatedSeq, + type: variantType, + break1Start, + break1End, + break2Start, + break2End, + untemplatedSeqSize, + untemplatedSeq, }, subParserError: err, violatedAttr: 'break2', @@ -538,7 +550,7 @@ const parseFusion = (string, requireFeatures = true) => { if (parts.length > 3) { throw new ParsingError({ message: 'Fusion variant using new nomenclature must contain 1 or 2 double-colon', - input: parts.join('::'), + input: string, violatedAttr: 'punctuation', }); } From 0eb733f6eb89dcc07194347a01ee07d5d270fae0 Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Fri, 30 Jun 2023 14:34:10 -0700 Subject: [PATCH 16/23] Add multi-prefix support to fusion --- src/variant.ts | 84 ++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 44 deletions(-) diff --git a/src/variant.ts b/src/variant.ts index f8de243..cca767a 100644 --- a/src/variant.ts +++ b/src/variant.ts @@ -43,7 +43,7 @@ interface VariantNotation { untemplatedSeqSize?: number; type: OntologyTerm | string; refSeq?: string | null; - prefix: Prefix; + prefix: Prefix | null; multiFeature: boolean; truncation?: number | null; notationType?: string; @@ -68,10 +68,10 @@ const createVariantNotation = ({ multiFeature: multiFeatureIn, truncation, notationType, - break1Start: break1StartIn, - break1End: break1EndIn, - break2Start: break2StartIn, - break2End: break2EndIn, + break1Start, + break1End, + break2Start, + break2End, }: { requireFeatures?: boolean; reference1: string | OntologyTerm; @@ -80,7 +80,7 @@ const createVariantNotation = ({ untemplatedSeqSize?: number | null; type: string; refSeq?: string | null; - prefix: Prefix; + prefix: Prefix | null; multiFeature?: boolean; truncation?: number; notationType?: string; @@ -89,7 +89,7 @@ const createVariantNotation = ({ break2Start?: AnyPosition; break2End?: AnyPosition; }): VariantNotation => { - if (!break1StartIn) { + if (!break1Start) { throw new InputValidationError({ message: 'break1Start is a required attribute', violatedAttr: 'break1Start', @@ -122,19 +122,6 @@ const createVariantNotation = ({ }); } - // cast positions - const formatPosition = (input) => { - if (input !== null && input !== undefined) { - return createPosition(prefix, input); - } - return input; - }; - - const break1Start = formatPosition(break1StartIn); - const break1End = formatPosition(break1EndIn); - const break2Start = formatPosition(break2StartIn); - const break2End = formatPosition(break2EndIn); - const break1Repr = createBreakRepr(break1Start, break1End, multiFeature); let break2Repr; @@ -326,7 +313,7 @@ const parseMultiFeature = (string: string): { break2End?: AnyPosition, untemplatedSeqSize?: number | null, untemplatedSeq?: string | null, - prefix: Prefix, + prefix: Prefix | null, } => { if (string.length < 6) { throw new ParsingError(`Too short. Multi-feature notation must be a minimum of six characters: ${string}`); @@ -394,22 +381,23 @@ const parseMultiFeature = (string: string): { violatedAttr: 'punctuation', }); } - let prefix, + let break1Prefix, + break2Prefix, break1Start, break1End, break2Start, break2End; try { - prefix = getPrefix(positions[0]); + break1Prefix = getPrefix(positions[0]); positions[0] = positions[0].slice(2); if (positions[0].includes('_')) { const splitPos = positions[0].indexOf('_'); - break1Start = parsePosition(prefix, positions[0].slice(0, splitPos)); - break1End = parsePosition(prefix, positions[0].slice(splitPos + 1)); + break1Start = parsePosition(break1Prefix, positions[0].slice(0, splitPos)); + break1End = parsePosition(break1Prefix, positions[0].slice(splitPos + 1)); } else { - break1Start = parsePosition(prefix, positions[0]); + break1Start = parsePosition(break1Prefix, positions[0]); } } catch (err) { throw new ParsingError({ @@ -430,15 +418,15 @@ const parseMultiFeature = (string: string): { } try { - prefix = getPrefix(positions[1]); + break2Prefix = getPrefix(positions[1]); positions[1] = positions[1].slice(2); if (positions[1].includes('_')) { const splitPos = positions[1].indexOf('_'); - break2Start = parsePosition(prefix, positions[1].slice(0, splitPos)); - break2End = parsePosition(prefix, positions[1].slice(splitPos + 1)); + break2Start = parsePosition(break2Prefix, positions[1].slice(0, splitPos)); + break2End = parsePosition(break2Prefix, positions[1].slice(splitPos + 1)); } else { - break2Start = parsePosition(prefix, positions[1]); + break2Start = parsePosition(break2Prefix, positions[1]); } } catch (err) { throw new ParsingError({ @@ -458,6 +446,27 @@ const parseMultiFeature = (string: string): { }); } + // prefix + let prefix; + + if (break1Prefix === break2Prefix) { + // Since each fusion part have it's own prefix, a prefix at the variant + // level is only given if they are the same + prefix = break1Prefix; + } + + return { + type: variantType, + break1Start, + break1End, + break2Start, + break2End, + untemplatedSeqSize, + untemplatedSeq, + prefix: prefix || null, + }; +}; + /** * Parse one side of a fusion variant using the new nomenclature (KBDEV-974) * @@ -501,19 +510,6 @@ const parseFusionPart = (string, requireFeatures) => { // Prefix const prefix = getPrefix(variantString); - // if (prefix !== 'r') { - // // A double colon is used to describe RNA fusion transcripts - // // (RNA Deletion - insertion) using exclusively the 'r' prefix - // // https://varnomen.hgvs.org/recommendations/RNA/variant/delins/ - // throw new ParsingError({ - // message: 'Fusion notation must be in rna coordinate system', - // input: string, - // }); - // // The other use case of a double colon, not implemented, is to - // // designate break point junctions creating a ring chromosome - // // https://varnomen.hgvs.org/recommendations/DNA/variant/complex/ - // } - // Range of positions const positions = variantString.slice(prefix.length + 1).split('_'); @@ -591,7 +587,7 @@ const parseFusion = (string, requireFeatures = true) => { try { return createVariantNotation({ ...t1, - prefix, + prefix: prefix || null, requireFeatures, reference2: t2.reference1, break2Start: t2.break1Start, From cadcf22c0c0ec1dd7fc2ef3c7b264dc8e0458ca0 Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Fri, 30 Jun 2023 14:36:03 -0700 Subject: [PATCH 17/23] Update tests for new fusion nomenclature --- test/variant.test.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/variant.test.ts b/test/variant.test.ts index df8a232..37f7ab6 100644 --- a/test/variant.test.ts +++ b/test/variant.test.ts @@ -164,10 +164,11 @@ describe('jsonifyVariant', () => { describe('parseVariant & strignifyVariant', () => { const variants = { ...data.standardVariants, - ...data.fusionVariants, + ...data.legacyNomenclatureFusionVariants, + ...data.newNomenclatureFusionVariants, }; - test.each(Object.keys(variants))('Parsing %s and strignify back', (variantString) => { + test.each(Object.keys(variants))('Parsing and strignifying back %s', (variantString) => { const variantNotation = parseVariant(variantString); // Parse variant string and compare notations @@ -180,7 +181,7 @@ describe('parseVariant & strignifyVariant', () => { }), ); // Strignify notation and compare variant strings - expect(stringifyVariant(variants[variantString])).toBe(variantString); + const newFusion = variantString.split('::').length > 1 + expect(stringifyVariant(variants[variantString], newFusion)).toBe(variantString); }); }); - From 8044b9b096e9a67241d1ac8e5ec05879cc1df0a1 Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Fri, 30 Jun 2023 14:39:53 -0700 Subject: [PATCH 18/23] Update data for tests --- test/data.ts | 325 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 304 insertions(+), 21 deletions(-) diff --git a/test/data.ts b/test/data.ts index 9803e16..73395c5 100644 --- a/test/data.ts +++ b/test/data.ts @@ -33,13 +33,13 @@ const standardVariants = { }, }; -// Actual fusion variant with legacy notation (from KBDEV-974) -const fusionVariants = { +// Actual fusion variant with legacy notation (KBDEV-974) +const legacyNomenclatureFusionVariants = { '(ATP1B1,NRG1):fusion(g.169080736,g.32453346)': { reference1: 'ATP1B1', reference2: 'NRG1', multiFeature: true, - type: 'fusion', + type: NOTATION_TO_TYPES.fusion, break1Start: { '@class': 'GenomicPosition', pos: 169080736, @@ -59,7 +59,7 @@ const fusionVariants = { reference1: 'ENST00000357447', reference2: 'ENST00000371953', multiFeature: true, - type: 'fusion', + type: NOTATION_TO_TYPES.fusion, break1Start: { '@class': 'CdsPosition', pos: 1118, @@ -81,7 +81,7 @@ const fusionVariants = { reference1: 'COL1A1', reference2: 'PDGFB', multiFeature: true, - type: 'fusion', + type: NOTATION_TO_TYPES.fusion, break1Start: { '@class': 'RnaPosition', pos: 2354, @@ -103,7 +103,7 @@ const fusionVariants = { reference1: 'CLTC', reference2: 'ALK', multiFeature: true, - type: 'fusion', + type: NOTATION_TO_TYPES.fusion, break1Start: { '@class': 'ExonicPosition', pos: 30, @@ -119,19 +119,19 @@ const fusionVariants = { noFeatures: false, prefix: 'e', }, - // Cases with mixed prefix - // resulting in malformed positions '(ZNF532,NUTM1):fusion(p.?4,e.2)': { reference1: 'ZNF532', reference2: 'NUTM1', multiFeature: true, - type: 'fusion', + type: NOTATION_TO_TYPES.fusion, break1Start: { - '@class': 'ExonicPosition', + '@class': 'ProteinPosition', pos: 4, - prefix: 'e', + prefix: 'p', + longRefAA: null, + refAA: null, }, - break1Repr: 'e.4', + break1Repr: 'p.?4', break2Start: { '@class': 'ExonicPosition', pos: 2, @@ -139,35 +139,318 @@ const fusionVariants = { }, break2Repr: 'e.2', noFeatures: false, - prefix: 'e', + prefix: null, }, '(CDH1,LARS):fusion(i.2,e.17)': { reference1: 'CDH1', reference2: 'LARS', multiFeature: true, + type: NOTATION_TO_TYPES.fusion, + break1Start: { + '@class': 'IntronicPosition', + pos: 2, + prefix: 'i', + }, + break1Repr: 'i.2', + break2Start: { + '@class': 'ExonicPosition', + pos: 17, + prefix: 'e', + }, + break2Repr: 'e.17', + noFeatures: false, + prefix: null, + }, + '(chr3,BRAF):fusion(y.p26.3,e.4)' : { + reference1: 'chr3', + reference2: 'BRAF', + multiFeature: true, + type: NOTATION_TO_TYPES.fusion, + break1Start: { + arm: 'p', + majorBand: 26, + minorBand: 3, + '@class': 'CytobandPosition', + prefix: 'y', + }, + break1Repr: 'y.p26.3', + break2Start: { + '@class': 'ExonicPosition', + pos: 4, + prefix: 'e', + }, + break2Repr: 'e.4', + noFeatures: false, + prefix: null, + }, +}; + +// New fusion nomenclature (KBDEV-974) +const newNomenclatureFusionVariants = { + 'ATP1B1:g.?_169080736::NRG1:g.32453346_?': { + reference1: 'ATP1B1', + reference2: 'NRG1', + multiFeature: true, + type: NOTATION_TO_TYPES.fusion, + break1Start: { + '@class': 'GenomicPosition', + pos: null, + prefix: 'g', + }, + break1End: { + '@class': 'GenomicPosition', + pos: 169080736, + prefix: 'g', + }, + break1Repr: 'g.?_169080736', + break2End: { + '@class': 'GenomicPosition', + pos: null, + prefix: 'g', + }, + break2Start: { + '@class': 'GenomicPosition', + pos: 32453346, + prefix: 'g', + }, + break2Repr: 'g.32453346_?', + noFeatures: false, + prefix: 'g', + }, + 'ENST00000357447:c.?_1118::ENST00000371953:c.165_?': { + reference1: 'ENST00000357447', + reference2: 'ENST00000371953', + multiFeature: true, + type: 'fusion', + break1Start: { + '@class': 'CdsPosition', + pos: null, + prefix: 'c', + offset: 0, + }, + break1End: { + '@class': 'CdsPosition', + pos: 1118, + prefix: 'c', + offset: 0, + }, + break1Repr: 'c.?_1118', + break2End: { + '@class': 'CdsPosition', + pos: null, + prefix: 'c', + offset: 0, + }, + break2Start: { + '@class': 'CdsPosition', + pos: 165, + prefix: 'c', + offset: 0, + }, + break2Repr: 'c.165_?', + noFeatures: false, + prefix: 'c', + }, + 'COL1A1:r.?_2354::PDGFB:r.852_?': { + reference1: 'COL1A1', + reference2: 'PDGFB', + multiFeature: true, type: 'fusion', break1Start: { + '@class': 'RnaPosition', + pos: null, + prefix: 'r', + offset: 0, + }, + break1End: { + '@class': 'RnaPosition', + pos: 2354, + prefix: 'r', + offset: 0, + }, + break1Repr: 'r.?_2354', + break2End: { + '@class': 'RnaPosition', + pos: null, + prefix: 'r', + offset: 0, + }, + break2Start: { + '@class': 'RnaPosition', + pos: 852, + prefix: 'r', + offset: 0, + }, + break2Repr: 'r.852_?', + noFeatures: false, + prefix: 'r', + }, + 'CLTC:e.?_30::ALK:e.20_?': { + reference1: 'CLTC', + reference2: 'ALK', + multiFeature: true, + type: 'fusion', + break1Start: { + '@class': 'ExonicPosition', + pos: null, + prefix: 'e', + }, + break1End: { + '@class': 'ExonicPosition', + pos: 30, + prefix: 'e', + }, + break1Repr: 'e.?_30', + break2End: { + '@class': 'ExonicPosition', + pos: null, + prefix: 'e', + }, + break2Start: { + '@class': 'ExonicPosition', + pos: 20, + prefix: 'e', + }, + break2Repr: 'e.20_?', + noFeatures: false, + prefix: 'e', + }, + 'ZNF532:p.??_?4::NUTM1:e.2_?': { + reference1: 'ZNF532', + reference2: 'NUTM1', + multiFeature: true, + type: 'fusion', + break1Start: { + '@class': 'ProteinPosition', + pos: null, + prefix: 'p', + longRefAA: null, + refAA: null, + }, + break1End: { + '@class': 'ProteinPosition', + pos: 4, + prefix: 'p', + longRefAA: null, + refAA: null, + }, + break1Repr: 'p.??_?4', + break2End: { + '@class': 'ExonicPosition', + pos: null, + prefix: 'e', + }, + break2Start: { '@class': 'ExonicPosition', pos: 2, prefix: 'e', }, - break1Repr: 'e.2', + break2Repr: 'e.2_?', + noFeatures: false, + prefix: null, + }, + 'CDH1:i.?_2::LARS:e.17_?': { + reference1: 'CDH1', + reference2: 'LARS', + multiFeature: true, + type: 'fusion', + break1Start: { + '@class': 'IntronicPosition', + pos: null, + prefix: 'i', + }, + break1End: { + '@class': 'IntronicPosition', + pos: 2, + prefix: 'i', + }, + break1Repr: 'i.?_2', + break2End: { + '@class': 'ExonicPosition', + pos: null, + prefix: 'e', + }, break2Start: { '@class': 'ExonicPosition', pos: 17, prefix: 'e', }, - break2Repr: 'e.17', + break2Repr: 'e.17_?', noFeatures: false, - prefix: 'e', + prefix: null, + }, + 'chr3:y.p_p26.3::BRAF:e.4_?': { + reference1: 'chr3', + reference2: 'BRAF', + multiFeature: true, + type: 'fusion', + break1Start: { + arm: 'p', + '@class': 'CytobandPosition', + prefix: 'y', + }, + break1End: { + arm: 'p', + majorBand: 26, + minorBand: 3, + '@class': 'CytobandPosition', + prefix: 'y', + }, + break1Repr: 'y.p_p26.3', + break2End: { + '@class': 'ExonicPosition', + pos: null, + prefix: 'e', + }, + break2Start: { + '@class': 'ExonicPosition', + pos: 4, + prefix: 'e', + }, + break2Repr: 'e.4_?', + noFeatures: false, + prefix: null, + }, + 'EPCAM:r.?_555::GUAUGAUUUUUUAAUAA::MSH2:r.212_?': { + reference1: 'EPCAM', + reference2: 'MSH2', + multiFeature: true, + type: 'fusion', + break1Start: { + '@class': 'RnaPosition', + pos: null, + prefix: 'r', + offset: 0, + }, + break1End: { + '@class': 'RnaPosition', + pos: 555, + prefix: 'r', + offset: 0, + }, + break1Repr: 'r.?_555', + break2End: { + '@class': 'RnaPosition', + pos: null, + prefix: 'r', + offset: 0, + }, + break2Start: { + '@class': 'RnaPosition', + pos: 212, + prefix: 'r', + offset: 0, + }, + break2Repr: 'r.212_?', + untemplatedSeq: 'GUAUGAUUUUUUAAUAA', + untemplatedSeqSize: 17, + noFeatures: false, + prefix: 'r', }, - // Cases with mixed prefix - // resulting in error - // '(chr3,BRAF):fusion(y.p26.3,e.4)' : { - // }, }; export default { - fusionVariants, + legacyNomenclatureFusionVariants, + newNomenclatureFusionVariants, standardVariants, }; From 9d43ef641b880a7183d3c484f40bf2c6b43ae7ec Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Fri, 30 Jun 2023 15:21:47 -0700 Subject: [PATCH 19/23] Re-enabling cast position in createVariantNotation --- src/variant.ts | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/variant.ts b/src/variant.ts index cca767a..ef1cb1d 100644 --- a/src/variant.ts +++ b/src/variant.ts @@ -1,6 +1,10 @@ import { InputValidationError, ParsingError } from './error'; import { - createBreakRepr, convertPositionToJson, parsePosition, AnyPosition, + AnyPosition, + convertPositionToJson, + createBreakRepr, + createPosition, + parsePosition, } from './position'; import { NOTATION_TO_TYPES, @@ -68,10 +72,10 @@ const createVariantNotation = ({ multiFeature: multiFeatureIn, truncation, notationType, - break1Start, - break1End, - break2Start, - break2End, + break1Start: break1StartIn, + break1End: break1EndIn, + break2Start: break2StartIn, + break2End: break2EndIn, }: { requireFeatures?: boolean; reference1: string | OntologyTerm; @@ -89,7 +93,7 @@ const createVariantNotation = ({ break2Start?: AnyPosition; break2End?: AnyPosition; }): VariantNotation => { - if (!break1Start) { + if (!break1StartIn) { throw new InputValidationError({ message: 'break1Start is a required attribute', violatedAttr: 'break1Start', @@ -122,6 +126,25 @@ const createVariantNotation = ({ }); } + // cast positions + const formatPosition = (input) => { + if (input !== null && input !== undefined) { + let breakPrefix; + if (typeof input.prefix !== 'undefined') { + breakPrefix = input.prefix; + } else { + breakPrefix = prefix; + } + return createPosition(breakPrefix, input); + } + return input; + }; + + const break1Start = formatPosition(break1StartIn); + const break1End = formatPosition(break1EndIn); + const break2Start = formatPosition(break2StartIn); + const break2End = formatPosition(break2EndIn); + const break1Repr = createBreakRepr(break1Start, break1End, multiFeature); let break2Repr; From 92d19e4c7fc6559b19ed96b32dcaf7249b13e2bc Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Fri, 30 Jun 2023 15:36:20 -0700 Subject: [PATCH 20/23] Fix linting errors --- src/variant.ts | 3 ++- test/data.ts | 2 +- test/variant.test.ts | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/variant.ts b/src/variant.ts index ef1cb1d..30360af 100644 --- a/src/variant.ts +++ b/src/variant.ts @@ -130,6 +130,7 @@ const createVariantNotation = ({ const formatPosition = (input) => { if (input !== null && input !== undefined) { let breakPrefix; + if (typeof input.prefix !== 'undefined') { breakPrefix = input.prefix; } else { @@ -596,7 +597,7 @@ const parseFusion = (string, requireFeatures = true) => { // Standard 2-parts fusion - Parsing individual parts const t1 = parseFusionPart(parts[0], requireFeatures); - const t2 = parseFusionPart(parts[parts.length-1], requireFeatures); // skip middle part if one + const t2 = parseFusionPart(parts[parts.length - 1], requireFeatures); // skip middle part if one // Prefix let prefix; diff --git a/test/data.ts b/test/data.ts index 73395c5..94f67e1 100644 --- a/test/data.ts +++ b/test/data.ts @@ -161,7 +161,7 @@ const legacyNomenclatureFusionVariants = { noFeatures: false, prefix: null, }, - '(chr3,BRAF):fusion(y.p26.3,e.4)' : { + '(chr3,BRAF):fusion(y.p26.3,e.4)': { reference1: 'chr3', reference2: 'BRAF', multiFeature: true, diff --git a/test/variant.test.ts b/test/variant.test.ts index 37f7ab6..7106f3f 100644 --- a/test/variant.test.ts +++ b/test/variant.test.ts @@ -181,7 +181,7 @@ describe('parseVariant & strignifyVariant', () => { }), ); // Strignify notation and compare variant strings - const newFusion = variantString.split('::').length > 1 + const newFusion = variantString.split('::').length > 1; expect(stringifyVariant(variants[variantString], newFusion)).toBe(variantString); }); }); From 2f59a9cb7f5c96a035c663bb2c8dceefb1d605a7 Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Fri, 30 Jun 2023 15:47:54 -0700 Subject: [PATCH 21/23] Refactor some tests --- test/data.ts => data/variants.ts | 0 test/index.test.ts | 2 +- test/variant.test.ts | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename test/data.ts => data/variants.ts (100%) diff --git a/test/data.ts b/data/variants.ts similarity index 100% rename from test/data.ts rename to data/variants.ts diff --git a/test/index.test.ts b/test/index.test.ts index 25a091d..2f2476f 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -153,7 +153,7 @@ test.each([ ['12:y.q13_q14insATCG', 'cannot define sequence elements (untemplatedSeq) at the cytoband level'], ['FEATURE:f.G12D', 'not an accepted prefix'], ['FEATURE:pG12D', 'Missing \'.\' separator after prefix'], - ['FEATURE:OTHER:pG12D', 'Variant notation must contain a single colon'], + ['FEATURE:OTHER:pG12D', 'Apart from new fusion nomenclature, variant notation must contain a single colon'], ['FEATURE:p.G12_HH13insH', 'Failed to parse the initial position'], ['p.G12K', 'Feature name not specified'], ['(,):()', 'Multi-feature notation must be a minimum of six characters'], diff --git a/test/variant.test.ts b/test/variant.test.ts index 7106f3f..79a66b3 100644 --- a/test/variant.test.ts +++ b/test/variant.test.ts @@ -1,4 +1,4 @@ -import data from './data'; +import data from '../data/variants'; import { stringifyVariant, stripParentheses, From e13c7f23cd397a284583cf6541b9ac1a7fdf2921 Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Thu, 6 Jul 2023 16:14:58 -0700 Subject: [PATCH 22/23] Fix typo in test logging --- test/variant.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/variant.test.ts b/test/variant.test.ts index 79a66b3..7ecf47d 100644 --- a/test/variant.test.ts +++ b/test/variant.test.ts @@ -161,14 +161,14 @@ describe('jsonifyVariant', () => { }); }); -describe('parseVariant & strignifyVariant', () => { +describe('parseVariant & stringifyVariant', () => { const variants = { ...data.standardVariants, ...data.legacyNomenclatureFusionVariants, ...data.newNomenclatureFusionVariants, }; - test.each(Object.keys(variants))('Parsing and strignifying back %s', (variantString) => { + test.each(Object.keys(variants))('Parsing and stringifying back %s', (variantString) => { const variantNotation = parseVariant(variantString); // Parse variant string and compare notations From d85ec957c87b1074615d75c19d6f6291b18dd43a Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Wed, 26 Jul 2023 10:24:48 -0700 Subject: [PATCH 23/23] Change release v. and update package-lock.json --- package-lock.json | 555 ++++++++++++++++++++++++++-------------------- package.json | 2 +- 2 files changed, 321 insertions(+), 236 deletions(-) diff --git a/package-lock.json b/package-lock.json index 16ad06a..c12946a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bcgsc-pori/graphkb-parser", - "version": "2.0.0", + "version": "2.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bcgsc-pori/graphkb-parser", - "version": "2.0.0", + "version": "2.1.0", "license": "GPL-3.0", "dependencies": { "json-cycle": "^1.3.0" @@ -85,9 +85,9 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -151,9 +151,9 @@ } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -216,9 +216,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -1597,9 +1597,9 @@ } }, "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2724,9 +2724,9 @@ "dev": true }, "node_modules/@jest/core/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3935,9 +3935,9 @@ "dev": true }, "node_modules/@jest/test-sequencer/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4717,9 +4717,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4786,9 +4786,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4884,9 +4884,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4972,9 +4972,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5501,9 +5501,9 @@ } }, "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -5539,9 +5539,9 @@ } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -5752,26 +5752,35 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/bser": { @@ -5841,14 +5850,24 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001304", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001304.tgz", - "integrity": "sha512-bdsfZd6K6ap87AGqSHJP/s1V+U6Z5lyrcbBu3ovbCCf8cSYpwTtGrCBObMpJqwxfTbLW6YTIdbb1jEeTelcpYQ==", + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, "node_modules/capture-exit": { "version": "2.0.0", @@ -6134,28 +6153,18 @@ } }, "node_modules/core-js-compat": { - "version": "3.20.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.3.tgz", - "integrity": "sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw==", + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", "dev": true, "dependencies": { - "browserslist": "^4.19.1", - "semver": "7.0.0" + "browserslist": "^4.21.9" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/core-js-pure": { "version": "3.19.1", "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.1.tgz", @@ -6411,9 +6420,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.57", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.57.tgz", - "integrity": "sha512-FNC+P5K1n6pF+M0zIK+gFCoXcJhhzDViL3DRIGy2Fv5PohuSES1JHR7T+GlwxSxlzx4yYbsuzCZvHxcBSRCIOw==", + "version": "1.4.471", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.471.tgz", + "integrity": "sha512-GpmGRC1vTl60w/k6YpQ18pSiqnmr0j3un//5TV1idPi6aheNfkT1Ye71tMEabWyNDO6sBMgAR+95Eb0eUUr1tA==", "dev": true }, "node_modules/emittery": { @@ -6670,9 +6679,9 @@ } }, "node_modules/eslint-config-airbnb-base/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -6965,9 +6974,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -7197,9 +7206,9 @@ } }, "node_modules/eslint/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -8870,9 +8879,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -10464,9 +10473,9 @@ "dev": true }, "node_modules/jest-config/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -11088,9 +11097,9 @@ } }, "node_modules/jest-environment-node/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -12049,9 +12058,9 @@ "dev": true }, "node_modules/jest-jasmine2/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -13012,9 +13021,9 @@ "dev": true }, "node_modules/jest-resolve-dependencies/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -13967,9 +13976,9 @@ "dev": true }, "node_modules/jest-runner/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -15160,9 +15169,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -15863,14 +15872,15 @@ } }, "node_modules/jsdom/node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { "node": ">=6" @@ -16134,9 +16144,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -16331,9 +16341,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/normalize-package-data": { @@ -16914,6 +16924,12 @@ "node": ">=0.6" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -17162,6 +17178,12 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "node_modules/resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -17345,9 +17367,9 @@ } }, "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -18410,9 +18432,9 @@ } }, "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, "engines": { "node": ">= 4.0.0" @@ -18466,6 +18488,36 @@ "node": ">=0.10.0" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -18482,6 +18534,16 @@ "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -18674,9 +18736,9 @@ "dev": true }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -18936,9 +18998,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -18986,9 +19048,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -19035,9 +19097,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -19980,9 +20042,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -20847,9 +20909,9 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -21783,9 +21845,9 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -22403,9 +22465,9 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -22441,9 +22503,9 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -22494,9 +22556,9 @@ }, "dependencies": { "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -22550,9 +22612,9 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -22952,9 +23014,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -22983,9 +23045,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -23170,16 +23232,15 @@ } }, "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" } }, "bser": { @@ -23237,9 +23298,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001304", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001304.tgz", - "integrity": "sha512-bdsfZd6K6ap87AGqSHJP/s1V+U6Z5lyrcbBu3ovbCCf8cSYpwTtGrCBObMpJqwxfTbLW6YTIdbb1jEeTelcpYQ==", + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", "dev": true }, "capture-exit": { @@ -23482,21 +23543,12 @@ "dev": true }, "core-js-compat": { - "version": "3.20.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.3.tgz", - "integrity": "sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw==", + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", "dev": true, "requires": { - "browserslist": "^4.19.1", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } + "browserslist": "^4.21.9" } }, "core-js-pure": { @@ -23706,9 +23758,9 @@ } }, "electron-to-chromium": { - "version": "1.4.57", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.57.tgz", - "integrity": "sha512-FNC+P5K1n6pF+M0zIK+gFCoXcJhhzDViL3DRIGy2Fv5PohuSES1JHR7T+GlwxSxlzx4yYbsuzCZvHxcBSRCIOw==", + "version": "1.4.471", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.471.tgz", + "integrity": "sha512-GpmGRC1vTl60w/k6YpQ18pSiqnmr0j3un//5TV1idPi6aheNfkT1Ye71tMEabWyNDO6sBMgAR+95Eb0eUUr1tA==", "dev": true }, "emittery": { @@ -23999,9 +24051,9 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -24081,9 +24133,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -24303,9 +24355,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -25553,9 +25605,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -26772,9 +26824,9 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -27256,9 +27308,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -28007,9 +28059,9 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -28905,9 +28957,9 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -29497,9 +29549,9 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -30415,9 +30467,9 @@ "dev": true }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, "supports-color": { @@ -30953,14 +31005,15 @@ "optional": true }, "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "requires": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" + "universalify": "^0.2.0", + "url-parse": "^1.5.3" } }, "w3c-xmlserializer": { @@ -31169,9 +31222,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -31329,9 +31382,9 @@ "dev": true }, "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "normalize-package-data": { @@ -31777,6 +31830,12 @@ "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -31960,6 +32019,12 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -32089,9 +32154,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "set-blocking": { @@ -32937,9 +33002,9 @@ } }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true }, "unset-value": { @@ -32982,6 +33047,16 @@ } } }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -32997,6 +33072,16 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -33162,9 +33247,9 @@ "dev": true }, "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true }, "wrap-ansi": { diff --git a/package.json b/package.json index b0b712e..21c5389 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bcgsc-pori/graphkb-parser", - "version": "2.0.0", + "version": "2.1.0", "description": "A package for parsing and recreating HGVS-like variant notation used in GraphKB", "main": "dist/index.js", "types": "dist/index.d.ts",