From 88e3a4406bf8414bda0307a25084d392032ccd73 Mon Sep 17 00:00:00 2001 From: Ciaran Schutte Date: Tue, 20 Sep 2022 22:35:58 -0400 Subject: [PATCH 01/80] change is_primary_treatment codelist to yes, no, unknown, not applicable --- schemas/treatment.json | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/schemas/treatment.json b/schemas/treatment.json index f62919fe..4cd2576f 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -97,7 +97,7 @@ "valueType": "string", "restrictions": { "script": "#/script/treatment/checkWhenNoTreatment", - "codeList": "#/list/yes_no" + "codeList": "#/list/yes_no_na" }, "meta": { "core": true, @@ -125,7 +125,7 @@ "restrictions": { "script": "#/script/treatment/checkWhenNoTreatment", "range": { - "exclusiveMin": 0 + "exclusiveMin": 0 } }, "meta": { @@ -143,7 +143,7 @@ "restrictions": { "script": "#/script/treatment/checkWhenNoTreatment", "range": { - "exclusiveMin": 0 + "exclusiveMin": 0 } }, "meta": { @@ -160,10 +160,10 @@ "restrictions": { "script": "#/script/treatment/checkWhenNoTreatment", "range": { - "exclusiveMin": 0 + "exclusiveMin": 0 } }, - "meta": { + "meta": { "displayName": "Days Per Cycle", "dependsOn": "treatment.treatment_type" } @@ -175,10 +175,10 @@ "restrictions": { "script": "#/script/treatment/checkWhenNoTreatment", "range": { - "exclusiveMin": 0 + "exclusiveMin": 0 } }, - "meta": { + "meta": { "displayName": "Number Of Cycles", "dependsOn": "treatment.treatment_type" } @@ -189,11 +189,7 @@ "valueType": "string", "restrictions": { "script": "#/script/treatment/checkWhenNoTreatment", - "codeList": [ - "Curative", - "Palliative", - "Unknown" - ] + "codeList": ["Curative", "Palliative", "Unknown"] }, "meta": { "core": true, @@ -207,12 +203,7 @@ "valueType": "string", "restrictions": { "script": "#/script/treatment/checkWhenNoTreatment", - "codeList": [ - "Adjuvant", - "Advanced/Metastatic", - "Neoadjuvant", - "Not applicable" - ] + "codeList": ["Adjuvant", "Advanced/Metastatic", "Neoadjuvant", "Not applicable"] }, "meta": { "core": true, @@ -337,12 +328,17 @@ "name": "clinical_trials_database", "description": "If the donor is a participant in a clinical trial, indicate the clinical trial database where the clinical trial is registered.", "valueType": "string", - "meta": { + "meta": { "display name": "Clinical Trials Database", "notes": "If the clinical trials database you use is not included in the controlled terminology, please contact us at https://platform.icgc-argo.org/contact to request it be added." - }, + }, "restrictions": { - "codeList": ["NCI Clinical Trials", "EU Clinical Trials Register", "Not applicable", "Unknown"] + "codeList": [ + "NCI Clinical Trials", + "EU Clinical Trials Register", + "Not applicable", + "Unknown" + ] } }, { From d71e7bb6ed58606a4c266e07ccb392a47998db10 Mon Sep 17 00:00:00 2001 From: Ciaran Schutte Date: Tue, 20 Sep 2022 22:36:09 -0400 Subject: [PATCH 02/80] add unit test. add additional valid is_primary_treatment where needed --- tests/treatment/checkWhenNoTreatment.test.js | 447 +++++++++---------- 1 file changed, 214 insertions(+), 233 deletions(-) diff --git a/tests/treatment/checkWhenNoTreatment.test.js b/tests/treatment/checkWhenNoTreatment.test.js index 9334408c..5e8b6b9a 100644 --- a/tests/treatment/checkWhenNoTreatment.test.js +++ b/tests/treatment/checkWhenNoTreatment.test.js @@ -5,16 +5,16 @@ * You should have received a copy of the GNU Affero General Public License along with * this program. If not, see . * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * */ @@ -26,236 +26,217 @@ const loadObjects = require('../loadObjects'); // load in all fields with entries prepopulated to null const treatment = require('../constructDummyData').getSchemaDummy('treatment'); - // key -> name of field, value -> unit tests const myUnitTests = { - 'treatment_start_interval': [ - [ - 'treatment_start_interval is submitted when no treatment was given', - false, - loadObjects(treatment, - { - "treatment_start_interval": 30, - "treatment_type": "No treatment" - } - ) - ], - [ - 'treatment_start_interval is submitted when treatment is given', - true, - loadObjects(treatment, - { - "treatment_start_interval": 409, - "treatment_type": "Chemotherapy" - } - ) - ], - [ - 'treatment_start_interval is not submitted when no treatment is given', - true, - loadObjects(treatment, - { - "treatment_type": "No treatment" - } - ) - ], - [ - 'treatment_start_interval is submitted but treatment_type is not submitted', - true, - loadObjects(treatment, - { - "treatment_start_interval": 30, - } - ) - ], + treatment_start_interval: [ + [ + 'treatment_start_interval is submitted when no treatment was given', + false, + loadObjects(treatment, { + treatment_start_interval: 30, + treatment_type: 'No treatment', + is_primary_treatment: 'Not applicable', + }), ], - 'treatment_duration': [ - [ - 'treatment_duration is submitted when no treatment was given', - false, - loadObjects(treatment, - { - "treatment_duration": 30, - "treatment_type": "No treatment" - } - ) - ], - [ - 'treatment_duration is submitted when treatment is given', - true, - loadObjects(treatment, - { - "treatment_duration": 40, - "treatment_type": "Chemotherapy" - } - ) - ], - [ - 'treatment_duration is missing when treatment is given', - false, - loadObjects(treatment, - { - "treatment_type": "Surgery" - } - ) - ] + [ + 'treatment_start_interval is submitted when treatment is given', + true, + loadObjects(treatment, { + treatment_start_interval: 409, + treatment_type: 'Chemotherapy', + is_primary_treatment: 'Yes', + }), ], - 'is_primary_treatment': [ - [ - 'is_primary_treatment is missing when treatment was given', - false, - loadObjects(treatment, - { - "is_primary_treatment": "", - "treatment_type": "Chemotherapy" - } - ) - ], - [ - 'is_primary_treatment is submitted when no treatment was given', - false, - loadObjects(treatment, - { - "is_primary_treatment": "Yes", - "treatment_type": "No treatment" - } - ) - ], - [ - 'is_primary_treatment is submitted when treatment is given', - true, - loadObjects(treatment, - { - "is_primary_treatment": "No", - "treatment_type": "Chemotherapy" - } - ) - ], - [ - 'is_primary_treatment is not submitted when no treatment is given', - true, - loadObjects(treatment, - { - "is_primary_treatment": "", - "treatment_type": "No treatment" - } - ) - ] + [ + 'treatment_start_interval is not submitted when no treatment is given', + true, + loadObjects(treatment, { + treatment_type: 'No treatment', + is_primary_treatment: 'Not applicable', + }), ], - 'treatment_setting': [ - [ - 'treatment_setting is submitted when no treatment was given', - false, - loadObjects(treatment, - { - "treatment_setting": "neoadjuvant", - "treatment_type": "No treatment" - } - ) - ], - [ - 'treatment_setting is submitted when treatment is given', - true, - loadObjects(treatment, - { - "treatment_setting": "adjuvant", - "treatment_type": "Chemotherapy" - } - ) - ] + [ + 'treatment_start_interval is submitted but treatment_type is not submitted', + true, + loadObjects(treatment, { + treatment_start_interval: 30, + }), ], - 'treatment_intent': [ - [ - 'treatment_intent is submitted when no treatment was given', - false, - loadObjects(treatment, - { - "treatment_intent": "curative", - "treatment_type": "No treatment" - } - ) - ], - [ - 'treatment_intent is submitted when treatment is given', - true, - loadObjects(treatment, - { - "treatment_intent": "palliative", - "treatment_type": "Chemotherapy" - } - ) - ] - ], - 'line_of_treatment': [ - [ - 'line of treatment submitted even though no treatment was given', - false, - loadObjects(treatment, - { - "line_of_treatment": 1, - "treatment_type": "No treatment" - } - ) - ], - [ - 'line of treatment not submitted when no treatment was given', - true, - loadObjects(treatment, - { - "treatment_type": "No treatment" - } - ) - ], - [ - 'line of treatment not submitted when Hormonal therapy given. Should not fail since this field is optional', - true, - loadObjects(treatment, - { - "line_of_treatment": "", - "treatment_type": "Hormonal therapy" - } - ) - ], + ], + treatment_duration: [ + [ + 'treatment_duration is submitted when no treatment was given', + false, + loadObjects(treatment, { + treatment_duration: 30, + treatment_type: 'No treatment', + is_primary_treatment: 'Yes', + }), ], - 'days_per_cycle': [ - [ - 'days per cycle is submitted when Chemotherapy was given', - true, - loadObjects(treatment, - { - "days_per_cycle": 12, - "treatment_type": "Chemotherapy" - } - ) - ] - ] -} - -describe("Common Tests",()=>{ - Object.entries(myUnitTests).forEach(field =>{ - const name = field[0]; - const unitTests = field[1]; - unitTests.forEach(test=>{ - const testIndex = 2; - const testInputs = test[testIndex]; - universalTest(validation()({ $row: testInputs, $name: name, $field: testInputs[name]})); - }) - }) - -}) + [ + 'treatment_duration is submitted when treatment is given', + true, + loadObjects(treatment, { + treatment_duration: 40, + treatment_type: 'Chemotherapy', + is_primary_treatment: 'Yes', + }), + ], + [ + 'treatment_duration is missing when treatment is given', + false, + loadObjects(treatment, { + treatment_type: 'Surgery', + is_primary_treatment: 'Yes', + }), + ], + ], + is_primary_treatment: [ + [ + 'is_primary_treatment is missing when treatment was given', + false, + loadObjects(treatment, { + is_primary_treatment: '', + treatment_type: 'Chemotherapy', + }), + ], + [ + 'is_primary_treatment is submitted when no treatment was given', + false, + loadObjects(treatment, { + is_primary_treatment: 'Yes', + treatment_type: 'No treatment', + }), + ], + [ + 'is_primary_treatment is submitted when treatment is given', + true, + loadObjects(treatment, { + is_primary_treatment: 'No', + treatment_type: 'Chemotherapy', + }), + ], + [ + 'is_primary_treatment is not submitted when no treatment is given', + false, + loadObjects(treatment, { + is_primary_treatment: '', + treatment_type: 'No treatment', + }), + ], + [ + 'is_primary_treatment is not submitted when is_primary_treatment is incorrect', + false, + loadObjects(treatment, { + is_primary_treatment: 'Not applicable', + treatment_type: 'Surgery', + }), + ], + ], + treatment_setting: [ + [ + 'treatment_setting is submitted when no treatment was given', + false, + loadObjects(treatment, { + treatment_setting: 'neoadjuvant', + treatment_type: 'No treatment', + is_primary_treatment: 'Not applicable', + }), + ], + [ + 'treatment_setting is submitted when treatment is given', + true, + loadObjects(treatment, { + treatment_setting: 'adjuvant', + treatment_type: 'Chemotherapy', + is_primary_treatment: 'Yes', + }), + ], + ], + treatment_intent: [ + [ + 'treatment_intent is submitted when no treatment was given', + false, + loadObjects(treatment, { + treatment_intent: 'curative', + treatment_type: 'No treatment', + is_primary_treatment: 'Not applicable', + }), + ], + [ + 'treatment_intent is submitted when treatment is given', + true, + loadObjects(treatment, { + treatment_intent: 'palliative', + treatment_type: 'Chemotherapy', + is_primary_treatment: 'Yes', + }), + ], + ], + line_of_treatment: [ + [ + 'line of treatment submitted even though no treatment was given', + false, + loadObjects(treatment, { + line_of_treatment: 1, + treatment_type: 'No treatment', + }), + ], + [ + 'line of treatment not submitted when no treatment was given', + true, + loadObjects(treatment, { + treatment_type: 'No treatment', + is_primary_treatment: 'Not applicable', + }), + ], + [ + 'line of treatment not submitted when Hormonal therapy given. Should not fail since this field is optional', + true, + loadObjects(treatment, { + line_of_treatment: '', + treatment_type: 'Hormonal therapy', + is_primary_treatment: 'Yes', + }), + ], + ], + days_per_cycle: [ + [ + 'days per cycle is submitted when Chemotherapy was given', + true, + loadObjects(treatment, { + days_per_cycle: 12, + treatment_type: 'Chemotherapy', + is_primary_treatment: 'Yes', + }), + ], + ], +}; -describe("Unit Tests for treatment fields when no treatment is given",()=>{ - Object.entries(myUnitTests).forEach(field => { - const name = field[0]; - const unitTests = field[1]; - describe(`Tests for the ${name} field.`,()=>{ - test.each(unitTests)('\n Test %# : %s \nExpecting result.valid to be: %s',(description,target,inputs) =>{ - const scriptOutput = validation()({ $row: inputs, $field: inputs[name], $name: name}); - expect(scriptOutput.valid).toBe(target); - }) - }) - - }) - -}) +describe('Common Tests', () => { + Object.entries(myUnitTests).forEach(field => { + const name = field[0]; + const unitTests = field[1]; + unitTests.forEach(test => { + const testIndex = 2; + const testInputs = test[testIndex]; + universalTest(validation()({ $row: testInputs, $name: name, $field: testInputs[name] })); + }); + }); +}); +describe('Unit Tests for treatment fields when no treatment is given', () => { + Object.entries(myUnitTests).forEach(field => { + const name = field[0]; + const unitTests = field[1]; + describe(`Tests for the ${name} field.`, () => { + test.each(unitTests)( + '\n Test %# : %s \nExpecting result.valid to be: %s', + (description, target, inputs) => { + const scriptOutput = validation()({ $row: inputs, $field: inputs[name], $name: name }); + expect(scriptOutput.valid).toBe(target); + }, + ); + }); + }); +}); From 09dc2421a15a3987589fcfba7a8c64cd2cb7deb9 Mon Sep 17 00:00:00 2001 From: Ciaran Schutte Date: Tue, 20 Sep 2022 22:36:18 -0400 Subject: [PATCH 03/80] change validation to only allow a combination of is_primary_treatment and treatment_type --- .../treatment/checkWhenNoTreatment.js | 94 ++++++++++++------- 1 file changed, 58 insertions(+), 36 deletions(-) diff --git a/references/validationFunctions/treatment/checkWhenNoTreatment.js b/references/validationFunctions/treatment/checkWhenNoTreatment.js index 02e9e837..80b7fa60 100644 --- a/references/validationFunctions/treatment/checkWhenNoTreatment.js +++ b/references/validationFunctions/treatment/checkWhenNoTreatment.js @@ -5,53 +5,75 @@ * You should have received a copy of the GNU Affero General Public License along with * this program. If not, see . * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * */ /** - * If treatment_type is 'No treatment', the other core treatment fields should not be submitted. + * If treatment_type is 'No treatment', the other core treatment fields should not be submitted. * Ensure interval/duration fields are greater than 0 days */ -const validation = () => - (function validate(inputs) { - const {$row, $name, $field} = inputs; - let result = {valid: true, message: "Ok"}; - const coreFields = ['is_primary_treatment', 'treatment_start_interval', 'treatment_duration', 'treatment_intent', 'treatment_setting', 'response_to_treatment']; - - // checks for a string just consisting of whitespace - const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; +const validation = () => + function validate(inputs) { + const { $row, $name, $field } = inputs; + + let result = { valid: true, message: 'Ok' }; + const coreFields = [ + 'is_primary_treatment', + 'treatment_start_interval', + 'treatment_duration', + 'treatment_intent', + 'treatment_setting', + 'response_to_treatment', + ]; + + // checks for a string just consisting of whitespace + const checkforEmpty = entry => { + return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1')); + }; + + if ($row.treatment_type != null) { + const treatmentType = $row.treatment_type; + const isPrimaryTreatment = $row.is_primary_treatment; - if ($row.treatment_type != null) { - const treatmentType = $row.treatment_type; - if (!(treatmentType.includes("No treatment"))) { - if (coreFields.includes($name)) { - if (!$field || checkforEmpty($field)) { - result = { - valid: false, - message: `The '${$name}' field must be submitted when 'treatment_type' is '${treatmentType}'`, - }; - } - } - } - else if (treatmentType.includes("No treatment") && ($field)) { + if (treatmentType !== 'No treatment') { + if (coreFields.includes($name)) { + if (!$field || checkforEmpty($field)) { result = { - valid: false, - message: `The '${$name}' field should not be submitted if 'treatment_type' is set to '${treatmentType}'`, + valid: false, + message: `The '${$name}' field must be submitted when 'treatment_type' is '${treatmentType}'`, }; - } + } + } + if (!['No', 'Yes'].includes(isPrimaryTreatment)) { + result = { + valid: false, + message: `The 'is_primary_treatment' field must be 'Yes' or 'No' when 'treatment_type' is '${treatmentType}'`, + }; + } + } else if (isPrimaryTreatment !== 'Not applicable') { + result = { + valid: false, + message: `The 'is_primary_treatment' field must be 'Not applicable' when 'treatment_type' is '${treatmentType}'`, + }; + } else if (treatmentType === 'No treatment' && $field) { + result = { + valid: false, + message: `The '${$name}' field should not be submitted if 'treatment_type' is set to '${treatmentType}'`, + }; } - return result; - }); + } + return result; + }; module.exports = validation; From 98894dbb2e6a5437fc8dbbdc4ec694a0974ff4b1 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 25 Oct 2022 15:55:09 -0400 Subject: [PATCH 04/80] Added new terminology for treatment_intent and updated field description. In line with mCODE's procedure intent field --- schemas/treatment.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/schemas/treatment.json b/schemas/treatment.json index f62919fe..f95ebd18 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -185,13 +185,19 @@ }, { "name": "treatment_intent", - "description": "Indicate the intended disease outcome for which the treatment is given. (Reference: NCIt C124307)", + "description": "Indicate the purpose of the treatment, or the desired effect or outcome resulting from the treatment. (Reference: mCODE/FHIR)", "valueType": "string", "restrictions": { "script": "#/script/treatment/checkWhenNoTreatment", "codeList": [ "Curative", + "Diagnostic", + "Forensic", + "Guidance", "Palliative", + "Preventive", + "Screening", + "Supportive", "Unknown" ] }, From e33f0dac1af720d3e0d4924f3f0b746690e765f2 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 25 Oct 2022 16:07:12 -0400 Subject: [PATCH 05/80] Added 'Unknown primary site' to terminology for 'primary_site' --- references/list.json | 74 +++++++++++++++++++++++++++++++++++++++++++- schemas/donor.json | 72 +----------------------------------------- 2 files changed, 74 insertions(+), 72 deletions(-) diff --git a/references/list.json b/references/list.json index c2ac6300..9b8b03d6 100644 --- a/references/list.json +++ b/references/list.json @@ -1026,5 +1026,77 @@ "Triple bypass of pancreas", "Wedge/localised gastric resection", "Wide Local Excision" - ] + ], + "primary_site": [ + "Accessory sinuses", + "Adrenal gland", + "Anus and anal canal", + "Base of tongue", + "Bladder", + "Bones, joints and articular cartilage of limbs", + "Bones, joints and articular cartilage of other and unspecified sites", + "Brain", + "Breast", + "Bronchus and lung", + "Cervix uteri", + "Colon", + "Connective, subcutaneous and other soft tissues", + "Corpus uteri", + "Esophagus", + "Eye and adnexa", + "Floor of mouth", + "Gallbladder", + "Gum", + "Heart, mediastinum, and pleura", + "Hematopoietic and reticuloendothelial systems", + "Hypopharynx", + "Kidney", + "Larynx", + "Lip", + "Liver and intrahepatic bile ducts", + "Lymph nodes", + "Meninges", + "Nasal cavity and middle ear", + "Nasopharynx", + "Oropharynx", + "Other and ill-defined digestive organs", + "Other and ill-defined sites", + "Other and ill-defined sites in lip, oral cavity and pharynx", + "Other and ill-defined sites within respiratory system and intrathoracic organs", + "Other and unspecified female genital organs", + "Other and unspecified major salivary glands", + "Other and unspecified male genital organs", + "Other and unspecified parts of biliary tract", + "Other and unspecified parts of mouth", + "Other and unspecified parts of tongue", + "Other and unspecified urinary organs", + "Other endocrine glands and related structures", + "Ovary", + "Palate", + "Pancreas", + "Parotid gland", + "Penis", + "Peripheral nerves and autonomic nervous system", + "Placenta", + "Prostate gland", + "Pyriform sinus", + "Rectosigmoid junction", + "Rectum", + "Renal pelvis", + "Retroperitoneum and peritoneum", + "Skin", + "Small intestine", + "Spinal cord, cranial nerves, and other parts of central nervous system", + "Stomach", + "Testis", + "Thymus", + "Thyroid gland", + "Tonsil", + "Trachea", + "Unknown primary site", + "Ureter", + "Uterus, NOS", + "Vagina", + "Vulva" + ] } diff --git a/schemas/donor.json b/schemas/donor.json index 566a5845..0c10c288 100644 --- a/schemas/donor.json +++ b/schemas/donor.json @@ -95,77 +95,7 @@ }, "restrictions": { "required": true, - "codeList": [ - "Accessory sinuses", - "Adrenal gland", - "Anus and anal canal", - "Base of tongue", - "Bladder", - "Bones, joints and articular cartilage of limbs", - "Bones, joints and articular cartilage of other and unspecified sites", - "Brain", - "Breast", - "Bronchus and lung", - "Cervix uteri", - "Colon", - "Connective, subcutaneous and other soft tissues", - "Corpus uteri", - "Esophagus", - "Eye and adnexa", - "Floor of mouth", - "Gallbladder", - "Gum", - "Heart, mediastinum, and pleura", - "Hematopoietic and reticuloendothelial systems", - "Hypopharynx", - "Kidney", - "Larynx", - "Lip", - "Liver and intrahepatic bile ducts", - "Lymph nodes", - "Meninges", - "Nasal cavity and middle ear", - "Nasopharynx", - "Oropharynx", - "Other and ill-defined digestive organs", - "Other and ill-defined sites", - "Other and ill-defined sites in lip, oral cavity and pharynx", - "Other and ill-defined sites within respiratory system and intrathoracic organs", - "Other and unspecified female genital organs", - "Other and unspecified major salivary glands", - "Other and unspecified male genital organs", - "Other and unspecified parts of biliary tract", - "Other and unspecified parts of mouth", - "Other and unspecified parts of tongue", - "Other and unspecified urinary organs", - "Other endocrine glands and related structures", - "Ovary", - "Palate", - "Pancreas", - "Parotid gland", - "Penis", - "Peripheral nerves and autonomic nervous system", - "Placenta", - "Prostate gland", - "Pyriform sinus", - "Rectosigmoid junction", - "Rectum", - "Renal pelvis", - "Retroperitoneum and peritoneum", - "Skin", - "Small intestine", - "Spinal cord, cranial nerves, and other parts of central nervous system", - "Stomach", - "Testis", - "Thymus", - "Thyroid gland", - "Tonsil", - "Trachea", - "Ureter", - "Uterus, NOS", - "Vagina", - "Vulva" - ] + "codeList": "#/list/primary_site" } }, { From 2caf3c400a78eb63812fd7dd06bf30ff30a84544 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 25 Oct 2022 16:24:36 -0400 Subject: [PATCH 06/80] Updated validation to allow submission of 'not applicable' in pathological_m_category field when ajcc 7th or 8th editions are used. --- references/list.json | 2 +- .../common/mxCategoryValidation.js | 10 +++++++++ tests/common/mxCategoryValidation.test.js | 22 +++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/references/list.json b/references/list.json index c2ac6300..d873dd86 100644 --- a/references/list.json +++ b/references/list.json @@ -36,7 +36,7 @@ "stage_groups": ["Occult Carcinoma", "Stage 0", "Stage 0a", "Stage 0is", "Stage 1", "Stage 1A", "Stage 1B", "Stage A", "Stage B", "Stage C", "Stage I", "Stage IA", "Stage IA1", "Stage IA2", "Stage IA3", "Stage IAB", "Stage IAE", "Stage IAES", "Stage IAS", "Stage IB", "Stage IB1", "Stage IB2", "Stage IBE", "Stage IBES", "Stage IBS", "Stage IC", "Stage IE", "Stage IEA", "Stage IEB", "Stage IES", "Stage II", "Stage II bulky", "Stage IIA", "Stage IIA1", "Stage IIA2", "Stage IIAE", "Stage IIAES", "Stage IIAS", "Stage IIB", "Stage IIBE", "Stage IIBES", "Stage IIBS", "Stage IIC", "Stage IIE", "Stage IIEA", "Stage IIEB", "Stage IIES", "Stage III", "Stage IIIA", "Stage IIIA1", "Stage IIIA2", "Stage IIIAE", "Stage IIIAES", "Stage IIIAS", "Stage IIIB", "Stage IIIBE", "Stage IIIBES", "Stage IIIBS", "Stage IIIC", "Stage IIIC1", "Stage IIIC2", "Stage IIID", "Stage IIIE", "Stage IIIES", "Stage IIIS", "Stage IIS", "Stage IS", "Stage IV", "Stage IVA", "Stage IVA1", "Stage IVA2", "Stage IVAE", "Stage IVAES", "Stage IVAS", "Stage IVB", "Stage IVBE", "Stage IVBES", "Stage IVBS", "Stage IVC", "Stage IVE", "Stage IVES", "Stage IVS", "Cannot be assessed"], "t_categories": ["T0","T1","T1a","T1a1","T1a2","T1a(s)","T1a(m)","T1b","T1b1","T1b2","T1b(s)","T1b(m)","T1c","T1d","T1mi","T2","T2(s)","T2(m)","T2a","T2a1","T2a2","T2b","T2c","T2d","T3","T3(s)","T3(m)","T3a","T3b","T3c","T3d","T3e","T4","T4a","T4a(s)","T4a(m)","T4b","T4b(s)","T4b(m)","T4c","T4d","T4e","Ta","Tis","Tis(DCIS)","Tis(LAMN)","Tis(LCIS)","Tis(Paget)","Tis(Paget’s)","Tis pd","Tis pu","TX"], "n_categories": ["N0","N0a","N0a (biopsy)","N0b","N0b (no biopsy)","N0(i+)","N0(i-)","N0(mol+)","N0(mol-)","N1","N1a","N1a(sn)","N1b","N1c","N1mi","N2","N2a","N2b","N2c","N2mi","N3","N3a","N3b","N3c","N4","NX"], - "m_categories": ["M0","M0(i+)","M1","M1a","M1a(0)","M1a(1)","M1b","M1b(0)","M1b(1)","M1c","M1c(0)","M1c(1)","M1d","M1d(0)","M1d(1)","M1e","MX"], + "m_categories": ["M0","M0(i+)","M1","M1a","M1a(0)","M1a(1)","M1b","M1b(0)","M1b(1)","M1c","M1c(0)","M1c(1)","M1d","M1d(0)","M1d(1)","M1e","MX", "Not applicable"], "adverse_events": [ "Abdominal distension", "Abdominal infection", diff --git a/references/validationFunctions/common/mxCategoryValidation.js b/references/validationFunctions/common/mxCategoryValidation.js index 5b87f87c..d86d3515 100644 --- a/references/validationFunctions/common/mxCategoryValidation.js +++ b/references/validationFunctions/common/mxCategoryValidation.js @@ -49,6 +49,16 @@ const validation = () => } } } + if ($row[tumourStagingSystem] && $row[tumourStagingSystem] != null && !(checkforEmpty($row[tumourStagingSystem]))) { + if ($row[tumourStagingSystem].trim().toLowerCase() == "ajcc 6th edition") { + if ($field && $field != null && !(checkforEmpty($field)) && $field.trim().toLowerCase() === 'not applicable') { + result = { + valid: false, + message: `The designation of '${$field}' in the '${$name}' field is not a valid M category in the ${tumourStagingSystem} '${$row[tumourStagingSystem]}'.` + }; + } + } + } return result; }); module.exports = validation; diff --git a/tests/common/mxCategoryValidation.test.js b/tests/common/mxCategoryValidation.test.js index f3037ed7..34698227 100644 --- a/tests/common/mxCategoryValidation.test.js +++ b/tests/common/mxCategoryValidation.test.js @@ -31,6 +31,28 @@ const primary_diagnosis = require('../constructDummyData').getSchemaDummy('prima const unitTests = { 'Specimen': [ + [ + 'Pathological staging system set to "AJCC 6th edition" and "not applicable" is submitted in pathological_m_category', + false, + { + row: loadObjects(specimen, { + pathological_tumour_staging_system: 'ajcc 6th edition', + pathological_m_category: 'Not applicable' + }), + name: 'pathological_m_category', + }, + ], + [ + 'Pathological staging system set to "AJCC 7th edition" and "not applicable" submitted in pathological_m_category', + true, + { + row: loadObjects(specimen, { + pathological_tumour_staging_system: 'ajcc 7th edition', + pathological_m_category: 'not Applicable' + }), + name: 'pathological_m_category', + }, + ], [ 'Pathological staging system set to "AJCC 6th edition" and "MX" submitted in pathological_m_category', true, From f2109a79c4735d9ff461e1852a46560b21ae81cb Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 25 Oct 2022 16:49:56 -0400 Subject: [PATCH 07/80] added missing foreignKey to specimen, treatment, follow up, biomarker and specimen tables --- schemas/biomarker.json | 5 +++++ schemas/follow_up.json | 4 ++++ schemas/specimen.json | 2 ++ schemas/treatment.json | 2 ++ 4 files changed, 13 insertions(+) diff --git a/schemas/biomarker.json b/schemas/biomarker.json index eb8b50dc..2cd0cc0c 100644 --- a/schemas/biomarker.json +++ b/schemas/biomarker.json @@ -55,7 +55,9 @@ "valueType": "string", "description": "If the biomarker test was done at the time of primary diagnosis, then indicate the associated submitter_primary_diagnosis_id here.", "meta": { + "validationDependency": true, "displayName": "Submitter Primary Diagnosis ID", + "foreignKey": "primary_diagnosis.submitter_primary_diagnosis_id", "primaryId": true, "notes": "Only one of ['submitter_specimen_id', 'submitter_primary_diagnosis_id', 'submitter_treatment_id', 'submitter_follow_up_id'] is required. If the biomarker test is not associated with a specimen or primary diagnosis, treatment or follow up event, then the 'test_interval' field will be required." }, @@ -69,7 +71,9 @@ "valueType": "string", "description": "If the biomarker test was done at the initiation of a specific treatment regimen, indicate the associated submitter_treatment_id here.", "meta": { + "validationDependency": true, "primaryId": true, + "foreignKey": "treatment.submitter_treatment_id", "displayName": "Submitter Treatment ID", "notes": "Only one of ['submitter_specimen_id', 'submitter_primary_diagnosis_id', 'submitter_treatment_id', 'submitter_follow_up_id'] is required. If the biomarker test is not associated with a specimen or primary diagnosis, treatment or follow up event, then the 'test_interval' field will be required." }, @@ -85,6 +89,7 @@ "meta": { "validationDependency": true, "primaryId": true, + "foreignKey": "follow_up.submitter_follow_up_id", "displayName": "Submitter Follow-Up ID", "notes": "Only one of ['submitter_specimen_id', 'submitter_primary_diagnosis_id', 'submitter_treatment_id', 'submitter_follow_up_id'] is required. If the biomarker test is not associated with a specimen or primary diagnosis, treatment or follow up event, then the 'test_interval' field will be required." }, diff --git a/schemas/follow_up.json b/schemas/follow_up.json index 8219c350..a50dad1c 100644 --- a/schemas/follow_up.json +++ b/schemas/follow_up.json @@ -92,6 +92,8 @@ "valueType": "string", "description": "Indicate if the follow-up is related to a specific primary diagnosis event in the clinical timeline.", "meta": { + "validationDependency": true, + "foreignKey": "primary_diagnosis.submitter_primary_diagnosis_id", "displayName": "Submitter Primary Diagnosis ID", "primaryId": true }, @@ -104,7 +106,9 @@ "valueType": "string", "description": "Indicate if the follow-up is related to a specific treatment event in the clinical timeline.", "meta": { + "validationDependency": true, "primaryId": true, + "foreignKey": "treatment.submitter_treatment_id", "displayName": "Submitter Treatment ID" }, "restrictions": { diff --git a/schemas/specimen.json b/schemas/specimen.json index 25524ad3..bb6aa1b9 100644 --- a/schemas/specimen.json +++ b/schemas/specimen.json @@ -54,7 +54,9 @@ "valueType": "string", "description": "Indicate the primary diagnosis event in the clinical timeline that this specimen acquisition was related to.", "meta": { + "validationDependency": true, "primaryId": true, + "foreignKey": "primary_diagnosis.submitter_primary_diagnosis_id", "displayName": "Submitter Primary Diagnosis ID" }, "restrictions": { diff --git a/schemas/treatment.json b/schemas/treatment.json index f62919fe..bcb306fc 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -53,7 +53,9 @@ "valueType": "string", "description": "Indicate the primary diagnosis event in the clinical timeline that this treatment was related to.", "meta": { + "validationDependency": true, "primaryId": true, + "foreignKey": "primary_diagnosis.submitter_primary_diagnosis_id", "displayName": "Submitter Primary Diagnosis ID" }, "restrictions": { From 9d353dcfc4c442c8eb5167c770961b64cca07869 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 25 Oct 2022 17:38:36 -0400 Subject: [PATCH 08/80] Added new terms to treatment_setting --- schemas/treatment.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/schemas/treatment.json b/schemas/treatment.json index f62919fe..37278809 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -210,8 +210,15 @@ "codeList": [ "Adjuvant", "Advanced/Metastatic", + "Conditioning", + "Induction", + "Maintenance", + "Mobilization", "Neoadjuvant", - "Not applicable" + "Not applicable", + "Preventative", + "Radiosensitization", + "Salvage" ] }, "meta": { From ec09807279aa95b5b2dd74f1b9ec9c9244938551 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 25 Oct 2022 17:39:56 -0400 Subject: [PATCH 09/80] updated 'Preventive' to 'Preventative' --- schemas/treatment.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemas/treatment.json b/schemas/treatment.json index f95ebd18..b7ff818f 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -195,7 +195,7 @@ "Forensic", "Guidance", "Palliative", - "Preventive", + "Preventative", "Screening", "Supportive", "Unknown" From b4f85d68f0668940eedd7185608d30b38d021891 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 25 Oct 2022 17:43:47 -0400 Subject: [PATCH 10/80] Removed 'Unknown' since additional terminology covers all treatment intents now --- schemas/treatment.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/schemas/treatment.json b/schemas/treatment.json index b7ff818f..984ef018 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -197,8 +197,7 @@ "Palliative", "Preventative", "Screening", - "Supportive", - "Unknown" + "Supportive" ] }, "meta": { From 20c39b143981b45e38b307fe186e397ba9de635d Mon Sep 17 00:00:00 2001 From: Hardeep Date: Fri, 11 Nov 2022 12:58:32 -0500 Subject: [PATCH 11/80] Added term 'not applicable' --- schemas/treatment.json | 1 + 1 file changed, 1 insertion(+) diff --git a/schemas/treatment.json b/schemas/treatment.json index 984ef018..328de7fc 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -194,6 +194,7 @@ "Diagnostic", "Forensic", "Guidance", + "Not applicable", "Palliative", "Preventative", "Screening", From 6de639fc8637e4843b203620fcda213b0cc8e03c Mon Sep 17 00:00:00 2001 From: Hardeep Date: Fri, 25 Nov 2022 17:26:49 -0500 Subject: [PATCH 12/80] Added optional field in Donor schema for lost to follow up --- .../donor/lost_to_followup.js | 44 +++++++++++ schemas/donor.json | 13 +++ tests/donor/lost_to_followup.test.js | 79 +++++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 references/validationFunctions/donor/lost_to_followup.js create mode 100644 tests/donor/lost_to_followup.test.js diff --git a/references/validationFunctions/donor/lost_to_followup.js b/references/validationFunctions/donor/lost_to_followup.js new file mode 100644 index 00000000..de254561 --- /dev/null +++ b/references/validationFunctions/donor/lost_to_followup.js @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2022 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +/** + * The lost_to_followup_after_clinical_event field should only be submitted if vital_status is Alive. It should not be allowed to be submitted if vital_status is Deceased. + */ +const validation = () => + (function validate(inputs) { + const {$row, $name, $field} = inputs; + let result = {valid: true, message: "Ok"}; + const currField = typeof($field) === 'string' ? $field.trim().toLowerCase() : $field; + + /* checks for a string just consisting of whitespace */ + const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; + + if (currField != null && !(checkforEmpty(currField))) { + const vitalStatus = $row.vital_status.trim().toLowerCase(); + + if (vitalStatus === "deceased") { + result = {valid: false, message: `${$name} cannot be submitted if the donor's vital_status is deceased.`} + } + } + return result; + }); + + +module.exports = validation; diff --git a/schemas/donor.json b/schemas/donor.json index 566a5845..293ab3bc 100644 --- a/schemas/donor.json +++ b/schemas/donor.json @@ -337,6 +337,19 @@ "units": "months", "dependsOn": "donor.contraception_type" } + }, + { + "description": "If the donor became lost to follow up, indicate the identifier of the clinical event (eg. submitter_primary_diagnosis_id, submitter_treatment_id or submitter_follow_up_id) after which the donor became lost to follow up.", + "name": "lost_to_followup_after_clinical_event", + "valueType": "string", + "restrictions": { + "script": "#/script/donor/lost_to_followup" + }, + "meta": { + "displayName": "Lost To Follow Up After Clinical Event", + "foreignKey": "primary_diagnosis.submitter_primary_diagnosis_id", + "validationDependency": true + } } ] } diff --git a/tests/donor/lost_to_followup.test.js b/tests/donor/lost_to_followup.test.js new file mode 100644 index 00000000..42bdff28 --- /dev/null +++ b/tests/donor/lost_to_followup.test.js @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2020 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +const validation = require('./../../references/validationFunctions/donor/lost_to_followup.js'); +const universalTest = require('../universal'); +const loadObjects = require('../loadObjects'); + +// load in all fields with entries prepopulated to null +const donor = require('../constructDummyData').getSchemaDummy('donor'); + +const myUnitTests = { + "lost_to_followup_after_clinical_event": [ + [ + 'Alive donor with lost to follow up indicated.', + true, + loadObjects(donor, + { + "vital_status": "alive", + "lost_to_followup_after_clinical_event": "PD1" + } + ) + ], + [ + 'Lost to follow up indicated when donor is known to be deceased.', + false, + loadObjects(donor, + { + "vital_status": "deceased", + "lost_to_followup_after_clinical_event" : "Tr-1" + } + ) + + ] + ] +}; + +describe("Common Tests",()=>{ + Object.entries(myUnitTests).forEach(field =>{ + const name = field[0]; + const unitTests = field[1]; + unitTests.forEach(test=>{ + const testIndex = 2; + const testInputs = test[testIndex]; + universalTest(validation()({ $row: testInputs, $name: name, $field: testInputs[name]})); + }) + }) + +}) + +describe("Unit Tests for Lost to follow up",()=>{ + Object.entries(myUnitTests).forEach(field => { + const name = field[0]; + const unitTests = field[1]; + describe(`Tests for the ${name} field.`,() => { + test.each(unitTests)('\n Test %# : %s \nExpecting result.valid to be: %s',(description,target,inputs) =>{ + const scriptOutput = validation()({ $row: inputs, $field: inputs[name], $name: name}); + expect(scriptOutput.valid).toBe(target); + }) + }) + }) +}) + From ca4d3d258cfd5306927a7f846aeff6f552e7d44f Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 29 Nov 2022 16:12:30 -0500 Subject: [PATCH 13/80] Updated validation script to check that 'not applicable' is only submitted when 'treatment_type' is 'no treatment' --- .../treatment/checkWhenNoTreatment.js | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/references/validationFunctions/treatment/checkWhenNoTreatment.js b/references/validationFunctions/treatment/checkWhenNoTreatment.js index 02e9e837..a4678406 100644 --- a/references/validationFunctions/treatment/checkWhenNoTreatment.js +++ b/references/validationFunctions/treatment/checkWhenNoTreatment.js @@ -19,37 +19,45 @@ */ /** - * If treatment_type is 'No treatment', the other core treatment fields should not be submitted. - * Ensure interval/duration fields are greater than 0 days + * If treatment_type is 'No treatment': + * - core fields accepting text should be submitted as 'Not applicable' + * - core fields accepting numbers should be left empty + * - if Extended field that accepts text is submitted, it should be submitted as 'Not applicable'. */ const validation = () => (function validate(inputs) { const {$row, $name, $field} = inputs; let result = {valid: true, message: "Ok"}; - const coreFields = ['is_primary_treatment', 'treatment_start_interval', 'treatment_duration', 'treatment_intent', 'treatment_setting', 'response_to_treatment']; + const coreNumberFields = ['treatment_start_interval', 'treatment_duration'] + const coreTextFields = ['is_primary_treatment', 'treatment_intent', 'treatment_setting', 'response_to_treatment'] // checks for a string just consisting of whitespace const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; - - if ($row.treatment_type != null) { - const treatmentType = $row.treatment_type; - if (!(treatmentType.includes("No treatment"))) { - if (coreFields.includes($name)) { - if (!$field || checkforEmpty($field)) { - result = { - valid: false, - message: `The '${$name}' field must be submitted when 'treatment_type' is '${treatmentType}'`, - }; - } - } - } - else if (treatmentType.includes("No treatment") && ($field)) { - result = { - valid: false, - message: `The '${$name}' field should not be submitted if 'treatment_type' is set to '${treatmentType}'`, - }; - } + const treatmentType = ($row.treatment_type).map(value => value.toLowerCase()); + + if ((!(treatmentType.includes("no treatment"))) && (coreTextFields.includes($name) || coreNumberFields.includes($name))) { + if (!$field || $field === null || checkforEmpty($field)) { + result = { valid: false, message: `The '${$name}' field must be submitted when the 'treatment_type' field is '${treatmentType}'`}; + } + else { + if (coreTextFields.includes($name) && $field.trim().toLowerCase() === 'not applicable') { + result = { valid: false, message: `The '${$name}' field cannot be submitted as 'Not applicable' if the 'treatment_type' field is '${treatmentType}'`}; + } + } + } + else if (treatmentType.includes("no treatment")) { + if ($field && $field != null && !(checkforEmpty($field))) { + if (coreNumberFields.includes($name) || typeof($field) === 'number') { + result = { valid: false, message: `The '${$name}' field cannot be submitted if the 'treatment_type' field is '${treatmentType}'`}; + } + else if ((coreTextFields.includes($name) || typeof($field) === 'string') && $field.trim().toLowerCase() != 'not applicable') { + result = { valid: false, message: `The '${$name}' field must be submitted as 'Not applicable' if the 'treatment_type' field is '${treatmentType}'`}; + } + } + else if (coreTextFields.includes($name)) { + result = { valid: false, message: `The '${$name}' field must be submitted as 'Not applicable' if the 'treatment_type' field is '${treatmentType}'`}; + } } return result; }); From 5d86ca54bc751dc61c6ba51d39e5a33a5b6ff993 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 29 Nov 2022 16:13:15 -0500 Subject: [PATCH 14/80] Updated tests with new treatment intent and setting field checks --- tests/treatment/checkWhenNoTreatment.test.js | 145 +++++++++++++------ 1 file changed, 104 insertions(+), 41 deletions(-) diff --git a/tests/treatment/checkWhenNoTreatment.test.js b/tests/treatment/checkWhenNoTreatment.test.js index 9334408c..955945b7 100644 --- a/tests/treatment/checkWhenNoTreatment.test.js +++ b/tests/treatment/checkWhenNoTreatment.test.js @@ -36,7 +36,7 @@ const myUnitTests = { loadObjects(treatment, { "treatment_start_interval": 30, - "treatment_type": "No treatment" + "treatment_type": ["No treatment"] } ) ], @@ -46,7 +46,7 @@ const myUnitTests = { loadObjects(treatment, { "treatment_start_interval": 409, - "treatment_type": "Chemotherapy" + "treatment_type": ["Chemotherapy"] } ) ], @@ -55,19 +55,10 @@ const myUnitTests = { true, loadObjects(treatment, { - "treatment_type": "No treatment" + "treatment_type": ["No treatment"] } ) - ], - [ - 'treatment_start_interval is submitted but treatment_type is not submitted', - true, - loadObjects(treatment, - { - "treatment_start_interval": 30, - } - ) - ], + ] ], 'treatment_duration': [ [ @@ -76,7 +67,7 @@ const myUnitTests = { loadObjects(treatment, { "treatment_duration": 30, - "treatment_type": "No treatment" + "treatment_type": ["No treatment"] } ) ], @@ -86,7 +77,7 @@ const myUnitTests = { loadObjects(treatment, { "treatment_duration": 40, - "treatment_type": "Chemotherapy" + "treatment_type": ["Chemotherapy"] } ) ], @@ -95,7 +86,7 @@ const myUnitTests = { false, loadObjects(treatment, { - "treatment_type": "Surgery" + "treatment_type": ["Surgery"] } ) ] @@ -107,7 +98,7 @@ const myUnitTests = { loadObjects(treatment, { "is_primary_treatment": "", - "treatment_type": "Chemotherapy" + "treatment_type": ["Chemotherapy"] } ) ], @@ -117,7 +108,7 @@ const myUnitTests = { loadObjects(treatment, { "is_primary_treatment": "Yes", - "treatment_type": "No treatment" + "treatment_type": ["No treatment"] } ) ], @@ -127,17 +118,37 @@ const myUnitTests = { loadObjects(treatment, { "is_primary_treatment": "No", - "treatment_type": "Chemotherapy" + "treatment_type": ["Chemotherapy"] } ) ], [ 'is_primary_treatment is not submitted when no treatment is given', - true, + false, loadObjects(treatment, { "is_primary_treatment": "", - "treatment_type": "No treatment" + "treatment_type": ["No treatment"] + } + ) + ], + [ + 'is_primary_treatment is not applicable when no treatment is given', + true, + loadObjects(treatment, + { + "is_primary_treatment": "not applicable", + "treatment_type": ["No treatment"] + } + ) + ], + [ + 'is_primary_treatment is not applicable when treatment is given', + false, + loadObjects(treatment, + { + "is_primary_treatment": "not applicable", + "treatment_type": ["Chemotherapy", "Surgery"] } ) ] @@ -149,7 +160,7 @@ const myUnitTests = { loadObjects(treatment, { "treatment_setting": "neoadjuvant", - "treatment_type": "No treatment" + "treatment_type": ["No treatment"] } ) ], @@ -159,10 +170,31 @@ const myUnitTests = { loadObjects(treatment, { "treatment_setting": "adjuvant", - "treatment_type": "Chemotherapy" + "treatment_type": ["Chemotherapy"] + } + ) + ], + [ + 'treatment_setting is submitted as not applicable when treatment is given', + false, + loadObjects(treatment, + { + "treatment_setting": "not applicable", + "treatment_type": ["Chemotherapy"] + } + ) + ], + [ + 'treatment_setting is submitted as not applicable when no treatment is given', + true, + loadObjects(treatment, + { + "treatment_setting": "Not Applicable", + "treatment_type": ["no treatment"] } ) ] + ], 'treatment_intent': [ [ @@ -171,7 +203,7 @@ const myUnitTests = { loadObjects(treatment, { "treatment_intent": "curative", - "treatment_type": "No treatment" + "treatment_type": ["No treatment"] } ) ], @@ -181,50 +213,81 @@ const myUnitTests = { loadObjects(treatment, { "treatment_intent": "palliative", - "treatment_type": "Chemotherapy" + "treatment_type": ["Chemotherapy"] + } + ) + ], + [ + 'treatment_intent is submitted as not applicable when treatment is given', + false, + loadObjects(treatment, + { + "treatment_intent": "not applicable", + "treatment_type": ["Radiation therapy"] + } + ) + ], + [ + 'treatment_intent is submitted as not applicable when no treatment is given', + true, + loadObjects(treatment, + { + "treatment_intent": "not applicable", + "treatment_type": ["no treatment"] } ) ] ], - 'line_of_treatment': [ + 'days_per_cycle': [ [ - 'line of treatment submitted even though no treatment was given', - false, + 'days per cycle is submitted when Chemotherapy was given', + true, loadObjects(treatment, { - "line_of_treatment": 1, - "treatment_type": "No treatment" + "days_per_cycle": 12, + "treatment_type": ["Chemotherapy"] } ) ], [ - 'line of treatment not submitted when no treatment was given', - true, + 'days per cycle is submitted when no treatment was given', + false, + loadObjects(treatment, + { + "days_per_cycle": 10, + "treatment_type": ["no treatment"] + } + ) + ] + ], + 'outcome_of_treatment': [ + [ + 'outcome_of_treatment is submitted when no treatment was given', + false, loadObjects(treatment, { - "treatment_type": "No treatment" + "outcome_of_treatment": "treatment completed as prescribed", + "treatment_type": ["no treatment"] } ) ], [ - 'line of treatment not submitted when Hormonal therapy given. Should not fail since this field is optional', + 'outcome_of_treatment is not applicable when no treatment was given', true, loadObjects(treatment, { - "line_of_treatment": "", - "treatment_type": "Hormonal therapy" + "outcome_of_treatment": "Not Applicable", + "treatment_type": ["no treatment"] } ) ], - ], - 'days_per_cycle': [ [ - 'days per cycle is submitted when Chemotherapy was given', + 'outcome_of_treatment is empty when no treatment was given', true, loadObjects(treatment, { - "days_per_cycle": 12, - "treatment_type": "Chemotherapy" + "outcome_of_treatment": "", + "treatment_type": ["no treatment"] } ) ] From 49def22eb5d7a1e304a5a6c14e61a540e31cef38 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 29 Nov 2022 16:55:11 -0500 Subject: [PATCH 15/80] Added new required field 'lymph_nodes_examined_method' --- schemas/primary_diagnosis.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/schemas/primary_diagnosis.json b/schemas/primary_diagnosis.json index 04c6706d..04c96de2 100644 --- a/schemas/primary_diagnosis.json +++ b/schemas/primary_diagnosis.json @@ -145,6 +145,24 @@ "displayName": "Lymph Nodes Examined Status" } }, + { + "name": "lymph_nodes_examined_method", + "description": "Indicate the method used to examine lymph nodes.", + "valueType": "string", + "restrictions": { + "required": true, + "script": "#/script/primary_diagnosis/lymphNodesExaminedMethod", + "codeList": [ + "Imaging", + "Lymph node dissection/pathological exam", + "Physical palpation of patient" + ] + }, + "meta": { + "core": true, + "displayName": "Method Used to Examine Lymph Nodes" + } + }, { "name": "number_lymph_nodes_examined", "description": "The total number of lymph nodes tested for the presence of cancer. (Reference: caDSR CDE ID 3)", From c554de36aabf182ad82a659591f149e5e1fdcdf1 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 29 Nov 2022 16:55:44 -0500 Subject: [PATCH 16/80] Added validation script to validate new 'lymph_nodes_examined_method' field --- .../lymphNodesExaminedMethod.js | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod.js diff --git a/references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod.js b/references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod.js new file mode 100644 index 00000000..986defc6 --- /dev/null +++ b/references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod.js @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2022 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +/** + * Enforces requirement on lymph_nodes_examined_method if lymph_nodes_examined_status is 'Yes'. If 'lymph_nodes_examined_status' is any other value, then 'lymph_nodes_examined_method' should not be submitted. + * @param {object} $row + * @param {string} $field + * @param {string} $name + */ +const validation = () => + (function validate(inputs) { + const {$row, $name, $field} = inputs; + let result = {valid: true, message: "Ok"}; + + const notExamined = ['cannot be determined', 'no', 'no lymph nodes found in resected specimen', 'not applicable']; + const lymphNodesExaminedStatus = $row.lymph_nodes_examined_status.trim().toLowerCase(); + + /* checks for a string just consisting of whitespace */ + const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; + + + if (!$field || $field === null || checkforEmpty($field)) { + if (lymphNodesExaminedStatus === 'yes') { + result = { valid: false, message: `The '${$name}' field must be submitted if the 'lymph_nodes_examined_status' field is 'Yes'`}; + } + } + else { + if (notExamined.includes(lymphNodesExaminedStatus)) { + result = { valid: false, message: `The '${$name}' field should not be submitted if the 'lymph_nodes_examined_status' field is '${lymphNodesExaminedStatus}'`}; + } + } + return result; +}); + +module.exports = validation; From ab97ab3dc6e601134e4d601f1810ce45f00bf42e Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 29 Nov 2022 16:56:21 -0500 Subject: [PATCH 17/80] Added tests for lymphNodesExaminedMethod validation script --- .../lymphNodesExaminedMethod.test.js | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 tests/primary_diagnosis/lymphNodesExaminedMethod.test.js diff --git a/tests/primary_diagnosis/lymphNodesExaminedMethod.test.js b/tests/primary_diagnosis/lymphNodesExaminedMethod.test.js new file mode 100644 index 00000000..a1117d84 --- /dev/null +++ b/tests/primary_diagnosis/lymphNodesExaminedMethod.test.js @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2020 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +const validation = require('../../references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod'); + +const universalTest = require('../universal'); +const loadObjects = require('../loadObjects'); + +// load in all fields with entries prepopulated to null +const primary_diagnosis = require('../constructDummyData').getSchemaDummy('primary_diagnosis'); + + +// key -> name of field, value -> unit tests +const myUnitTests = { + 'lymph_nodes_examined_method': [ + [ + 'lymph nodes were examined and lymph_nodes_examined_method is submitted', + true, + loadObjects(primary_diagnosis, + { + "lymph_nodes_examined_status": "Yes", + "lymph_nodes_examined_method": "imaging" + } + ) + ], + [ + 'lymph nodes were not examined and lymph_nodes_examined_method is submitted', + false, + loadObjects(primary_diagnosis, + { + "lymph_nodes_examined_status": "no", + "lymph_nodes_examined_method": "physical palpation of patient" + } + ) + ], + [ + 'lymph nodes were examined and lymph_nodes_examined_method is left blank', + false, + loadObjects(primary_diagnosis, + { + "lymph_nodes_examined_status": "Yes", + "lymph_nodes_examined_method": "" + } + ) + ], + [ + 'lymph nodes were examined and lymph_nodes_examined_method not submitted', + false, + loadObjects(primary_diagnosis, + { + "lymph_nodes_examined_status": "Yes", + } + ) + ], + [ + 'lymph nodes were not examined and lymph_nodes_examined_method not submitted', + true, + loadObjects(primary_diagnosis, + { + "lymph_nodes_examined_status": "Not applicable" + } + ) + ] + ] +} + + +describe("Common Tests",()=>{ + Object.entries(myUnitTests).forEach(field =>{ + const name = field[0]; + const unitTests = field[1]; + unitTests.forEach(test=>{ + const testIndex = 2; + const testInputs = test[testIndex]; + universalTest(validation()({ $row: testInputs, $name: name, $field: testInputs[name]})); + }) + }) + +}) + +describe("Unit Tests for Lymph Node Fields in Primary Diagnosis",()=>{ + Object.entries(myUnitTests).forEach(field => { + const name = field[0]; + const unitTests = field[1]; + describe(`Tests for the ${name} field.`,()=>{ + test.each(unitTests)('\n Test %# : %s \nExpecting result.valid to be: %s',(description,target,inputs) =>{ + const scriptOutput = validation()({ $row: inputs, $field: inputs[name], $name: name}); + expect(scriptOutput.valid).toBe(target); + }) + }) + + }) + +}) From eb7444ef6132d9193e57f06930aeee1939ada274 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 29 Nov 2022 17:02:19 -0500 Subject: [PATCH 18/80] updated validation script to allow core fields to be empty when treatment_type is 'no treatment' --- tests/treatment/checkWhenNoTreatment.test.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tests/treatment/checkWhenNoTreatment.test.js b/tests/treatment/checkWhenNoTreatment.test.js index 955945b7..5fa75d62 100644 --- a/tests/treatment/checkWhenNoTreatment.test.js +++ b/tests/treatment/checkWhenNoTreatment.test.js @@ -124,7 +124,7 @@ const myUnitTests = { ], [ 'is_primary_treatment is not submitted when no treatment is given', - false, + true, loadObjects(treatment, { "is_primary_treatment": "", @@ -236,7 +236,17 @@ const myUnitTests = { "treatment_type": ["no treatment"] } ) + ], + [ + 'treatment_intent is not submitted when no treatment is given', + true, + loadObjects(treatment, + { + "treatment_type": ["no treatment"] + } + ) ] + ], 'days_per_cycle': [ [ From a6b82088a13969b666986df7b0ab8fa6d0ea7092 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 29 Nov 2022 17:02:45 -0500 Subject: [PATCH 19/80] updated validation script to allow core fields to be empty when treatment_type is 'no treatment' --- .../validationFunctions/treatment/checkWhenNoTreatment.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/references/validationFunctions/treatment/checkWhenNoTreatment.js b/references/validationFunctions/treatment/checkWhenNoTreatment.js index a4678406..00d5f80b 100644 --- a/references/validationFunctions/treatment/checkWhenNoTreatment.js +++ b/references/validationFunctions/treatment/checkWhenNoTreatment.js @@ -52,12 +52,9 @@ const validation = () => result = { valid: false, message: `The '${$name}' field cannot be submitted if the 'treatment_type' field is '${treatmentType}'`}; } else if ((coreTextFields.includes($name) || typeof($field) === 'string') && $field.trim().toLowerCase() != 'not applicable') { - result = { valid: false, message: `The '${$name}' field must be submitted as 'Not applicable' if the 'treatment_type' field is '${treatmentType}'`}; + result = { valid: false, message: `If '${$name}' field is submitted when the 'treatment_type' field is '${treatmentType}', it can only be submitted as 'Not applicable'.`}; } } - else if (coreTextFields.includes($name)) { - result = { valid: false, message: `The '${$name}' field must be submitted as 'Not applicable' if the 'treatment_type' field is '${treatmentType}'`}; - } } return result; }); From 0f75d30c3d9d9112459d836e096d0a1b37482818 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 29 Nov 2022 18:09:03 -0500 Subject: [PATCH 20/80] Changed rTNM and recurrence_stage_group fields from core to extended (removed core:true field) --- schemas/follow_up.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/schemas/follow_up.json b/schemas/follow_up.json index 8219c350..5feced40 100644 --- a/schemas/follow_up.json +++ b/schemas/follow_up.json @@ -228,7 +228,6 @@ "script": "#/script/follow_up/recurrence_tumour_staging_system" }, "meta": { - "core": true, "dependsOn": "follow_up.disease_status_at_followup", "notes": "#/notes/disease_status_requirement", "displayName": "Recurrance Tumour Staging System" @@ -239,7 +238,6 @@ "description": "The code to represent the extent of the primary tumour (T) based on evidence obtained from clinical assessment parameters determined at the time of retreatment for a recurrence or disease progression, according to criteria based on multiple editions of the AJCC's Cancer Staging Manual.", "valueType": "string", "meta": { - "core": true, "dependsOn": "follow_up.recurrence_tumour_staging_system", "notes": "This field is required only if the selected recurrence_tumour_staging_system is any edition of the AJCC cancer staging system.", "displayName": "Recurrence T Category" @@ -253,7 +251,6 @@ "description": "The code to represent the stage of cancer defined by the extent of the regional lymph node (N) involvement for the cancer based on evidence obtained from clinical assessment parameters determined at the time of retreatment for a recurrence or disease progression, according to criteria based on multiple editions of the AJCC's Cancer Staging Manual.", "valueType": "string", "meta": { - "core": true, "dependsOn": "follow_up.recurrence_tumour_staging_system", "notes": "This field is required only if the selected recurrence_tumour_staging_system is any edition of the AJCC cancer staging system.", "displayName": "Recurrence N Category" @@ -267,7 +264,6 @@ "description": "The code to represent the stage of cancer defined by the extent of the distant metastasis (M) for the cancer based on evidence obtained from clinical assessment parameters determined at the time of retreatment for a recurrence or disease progression, according to criteria based on multiple editions of the AJCC's Cancer Staging Manual.", "valueType": "string", "meta": { - "core": true, "dependsOn": "follow_up.recurrence_tumour_staging_system", "notes": "This field is required only if the selected recurrence_tumour_staging_system is any edition of the AJCC cancer staging system.", "displayName": "Recurrence M Category" @@ -282,7 +278,6 @@ "description": "The code to represent the stage group of the tumour, as assigned by the reporting recurrence_tumour_staging_system, that indicates the overall prognostic tumour stage (ie. Stage I, Stage II, Stage III etc.) at the time of retreatment for a recurrence or disease progression.", "valueType": "string", "meta": { - "core": true, "dependsOn": "follow_up.recurrence_tumour_staging_system", "notes": "This field is dependent on the selected recurrence_tumour_staging_system.\nPlease refer to the documentation for Tumour Staging Classifications: http://docs.icgc-argo.org/docs/submission/dictionary-overview#tumour-staging-classifications", "displayName": "Recurrence Stage Group" From 796ad32490a594f83745e238e275999f6b1489ea Mon Sep 17 00:00:00 2001 From: Hardeep Date: Mon, 12 Dec 2022 13:02:48 -0500 Subject: [PATCH 21/80] Added new response_to_treatment_criteria_method field and updated controlled terminology for response_to_treatment --- schemas/treatment.json | 51 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/schemas/treatment.json b/schemas/treatment.json index f62919fe..4da2efa6 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -220,6 +220,27 @@ "dependsOn": "treatment.treatment_type" } }, + { + "name": "response_to_treatment_criteria_method", + "description": "Indicate teh criteria used to assess the donor's overall response to the applied treatment regimen.", + "valueType": "string", + "restrictions": { + "script": "#/script/treatment/checkWhenNoTreatment", + "codeList": [ + "RECIST 1.1", + "iRECIST", + "Cheson CLL Oncology Response Criteria", + "Response Assessment in Neuro-Oncology (RANO)", + "AML Response Criteria", + "Physician Assessed Response Criteria" + ] + }, + "meta": { + "core": true, + "displayName": "Response To Treatment Criteria Method", + "dependsOn": "treatment.treatment_type" + } + }, { "name": "response_to_treatment", "description": "The donor's response to the applied treatment regimen. (Source: RECIST)", @@ -227,17 +248,35 @@ "restrictions": { "script": "#/script/treatment/checkWhenNoTreatment", "codeList": [ - "Complete response", - "Disease progression", - "NED", - "Partial response", - "Stable disease" + "Complete remission", + "Complete remission with incomplete hematologic recovery (CRi)", + "Complete remission without measurable residual disease (CR MRD−)", + "Complete response", + "Disease progression", + "Hematologic relapse (after CRMRD-, CR, CRi)", + "Immune complete response (iCR)", + "Immune confirmed progressive disease (iCPD)", + "Immune partial response (iPR)", + "Immune stable disease (iSD)", + "Immune uncomfirmed progressive disease (iUPD)", + "Minor response", + "Molecular relapse (after CRMRD-)", + "Morphologic leukemia-free state", + "No evidence of disease (NED)", + "Partial remission", + "Partial response", + "Physician assessed complete response", + "Physician assessed partial response", + "Physician assessed stable disease", + "Primary refractory disease", + "Progressive disease", + "Stable disease" ] }, "meta": { "core": true, "displayName": "Response To Treatment", - "dependsOn": "treatment.treatment_type" + "dependsOn": "treatment.response_to_treatment_criteria_method" } }, { From 704735e85e57f243fb92dae3dc0fe0633a3b0d40 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Mon, 12 Dec 2022 16:44:07 -0500 Subject: [PATCH 22/80] Updated valdiation script to check for 'not applicable' --- .../treatment/checkWhenNoTreatment.js | 101 ++-- .../treatment/lineOfTreatment.js | 4 +- tests/treatment/checkWhenNoTreatment.test.js | 519 ++++++++++-------- tests/treatment/lineofTreatment.test.js | 14 +- 4 files changed, 351 insertions(+), 287 deletions(-) diff --git a/references/validationFunctions/treatment/checkWhenNoTreatment.js b/references/validationFunctions/treatment/checkWhenNoTreatment.js index 80b7fa60..00d5f80b 100644 --- a/references/validationFunctions/treatment/checkWhenNoTreatment.js +++ b/references/validationFunctions/treatment/checkWhenNoTreatment.js @@ -5,75 +5,58 @@ * You should have received a copy of the GNU Affero General Public License along with * this program. If not, see . * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * */ /** - * If treatment_type is 'No treatment', the other core treatment fields should not be submitted. - * Ensure interval/duration fields are greater than 0 days + * If treatment_type is 'No treatment': + * - core fields accepting text should be submitted as 'Not applicable' + * - core fields accepting numbers should be left empty + * - if Extended field that accepts text is submitted, it should be submitted as 'Not applicable'. */ -const validation = () => - function validate(inputs) { - const { $row, $name, $field } = inputs; - - let result = { valid: true, message: 'Ok' }; - const coreFields = [ - 'is_primary_treatment', - 'treatment_start_interval', - 'treatment_duration', - 'treatment_intent', - 'treatment_setting', - 'response_to_treatment', - ]; - - // checks for a string just consisting of whitespace - const checkforEmpty = entry => { - return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1')); - }; - - if ($row.treatment_type != null) { - const treatmentType = $row.treatment_type; - const isPrimaryTreatment = $row.is_primary_treatment; - - if (treatmentType !== 'No treatment') { - if (coreFields.includes($name)) { - if (!$field || checkforEmpty($field)) { - result = { - valid: false, - message: `The '${$name}' field must be submitted when 'treatment_type' is '${treatmentType}'`, - }; +const validation = () => + (function validate(inputs) { + const {$row, $name, $field} = inputs; + let result = {valid: true, message: "Ok"}; + const coreNumberFields = ['treatment_start_interval', 'treatment_duration'] + const coreTextFields = ['is_primary_treatment', 'treatment_intent', 'treatment_setting', 'response_to_treatment'] + + // checks for a string just consisting of whitespace + const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; + const treatmentType = ($row.treatment_type).map(value => value.toLowerCase()); + + if ((!(treatmentType.includes("no treatment"))) && (coreTextFields.includes($name) || coreNumberFields.includes($name))) { + if (!$field || $field === null || checkforEmpty($field)) { + result = { valid: false, message: `The '${$name}' field must be submitted when the 'treatment_type' field is '${treatmentType}'`}; + } + else { + if (coreTextFields.includes($name) && $field.trim().toLowerCase() === 'not applicable') { + result = { valid: false, message: `The '${$name}' field cannot be submitted as 'Not applicable' if the 'treatment_type' field is '${treatmentType}'`}; } } - if (!['No', 'Yes'].includes(isPrimaryTreatment)) { - result = { - valid: false, - message: `The 'is_primary_treatment' field must be 'Yes' or 'No' when 'treatment_type' is '${treatmentType}'`, - }; + } + else if (treatmentType.includes("no treatment")) { + if ($field && $field != null && !(checkforEmpty($field))) { + if (coreNumberFields.includes($name) || typeof($field) === 'number') { + result = { valid: false, message: `The '${$name}' field cannot be submitted if the 'treatment_type' field is '${treatmentType}'`}; + } + else if ((coreTextFields.includes($name) || typeof($field) === 'string') && $field.trim().toLowerCase() != 'not applicable') { + result = { valid: false, message: `If '${$name}' field is submitted when the 'treatment_type' field is '${treatmentType}', it can only be submitted as 'Not applicable'.`}; + } } - } else if (isPrimaryTreatment !== 'Not applicable') { - result = { - valid: false, - message: `The 'is_primary_treatment' field must be 'Not applicable' when 'treatment_type' is '${treatmentType}'`, - }; - } else if (treatmentType === 'No treatment' && $field) { - result = { - valid: false, - message: `The '${$name}' field should not be submitted if 'treatment_type' is set to '${treatmentType}'`, - }; } - } - return result; - }; + return result; + }); module.exports = validation; diff --git a/references/validationFunctions/treatment/lineOfTreatment.js b/references/validationFunctions/treatment/lineOfTreatment.js index c0548ede..cae23cd6 100644 --- a/references/validationFunctions/treatment/lineOfTreatment.js +++ b/references/validationFunctions/treatment/lineOfTreatment.js @@ -43,8 +43,8 @@ const validation = () => result = { valid: false, message: `The '${$name}' field must be a value greater than 1`}; } /* if it is unknown whether treatment was primary treatment, then line_of_treatment should not be submitted. If it is, then primary_treatment should be 'no' */ - else if (isPrimaryTreatment === 'unknown') { - result = { valid: false, message: `The '${$name}' field should not be submitted if 'is_primary_treatment' is 'unknown'.`}; + else if (isPrimaryTreatment === 'not applicable') { + result = { valid: false, message: `The '${$name}' field should not be submitted if 'is_primary_treatment' is 'Not applicable'.`}; } } return result; diff --git a/tests/treatment/checkWhenNoTreatment.test.js b/tests/treatment/checkWhenNoTreatment.test.js index 5e8b6b9a..43530b94 100644 --- a/tests/treatment/checkWhenNoTreatment.test.js +++ b/tests/treatment/checkWhenNoTreatment.test.js @@ -5,16 +5,16 @@ * You should have received a copy of the GNU Affero General Public License along with * this program. If not, see . * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * */ @@ -26,217 +26,308 @@ const loadObjects = require('../loadObjects'); // load in all fields with entries prepopulated to null const treatment = require('../constructDummyData').getSchemaDummy('treatment'); + // key -> name of field, value -> unit tests const myUnitTests = { - treatment_start_interval: [ - [ - 'treatment_start_interval is submitted when no treatment was given', - false, - loadObjects(treatment, { - treatment_start_interval: 30, - treatment_type: 'No treatment', - is_primary_treatment: 'Not applicable', - }), - ], - [ - 'treatment_start_interval is submitted when treatment is given', - true, - loadObjects(treatment, { - treatment_start_interval: 409, - treatment_type: 'Chemotherapy', - is_primary_treatment: 'Yes', - }), - ], - [ - 'treatment_start_interval is not submitted when no treatment is given', - true, - loadObjects(treatment, { - treatment_type: 'No treatment', - is_primary_treatment: 'Not applicable', - }), - ], - [ - 'treatment_start_interval is submitted but treatment_type is not submitted', - true, - loadObjects(treatment, { - treatment_start_interval: 30, - }), - ], - ], - treatment_duration: [ - [ - 'treatment_duration is submitted when no treatment was given', - false, - loadObjects(treatment, { - treatment_duration: 30, - treatment_type: 'No treatment', - is_primary_treatment: 'Yes', - }), - ], - [ - 'treatment_duration is submitted when treatment is given', - true, - loadObjects(treatment, { - treatment_duration: 40, - treatment_type: 'Chemotherapy', - is_primary_treatment: 'Yes', - }), - ], - [ - 'treatment_duration is missing when treatment is given', - false, - loadObjects(treatment, { - treatment_type: 'Surgery', - is_primary_treatment: 'Yes', - }), - ], - ], - is_primary_treatment: [ - [ - 'is_primary_treatment is missing when treatment was given', - false, - loadObjects(treatment, { - is_primary_treatment: '', - treatment_type: 'Chemotherapy', - }), - ], - [ - 'is_primary_treatment is submitted when no treatment was given', - false, - loadObjects(treatment, { - is_primary_treatment: 'Yes', - treatment_type: 'No treatment', - }), + 'treatment_start_interval': [ + [ + 'treatment_start_interval is submitted when no treatment was given', + false, + loadObjects(treatment, + { + "treatment_start_interval": 30, + "treatment_type": ["No treatment"] + } + ) + ], + [ + 'treatment_start_interval is submitted when treatment is given', + true, + loadObjects(treatment, + { + "treatment_start_interval": 409, + "treatment_type": ["Chemotherapy"] + } + ) + ], + [ + 'treatment_start_interval is not submitted when no treatment is given', + true, + loadObjects(treatment, + { + "treatment_type": ["No treatment"] + } + ) + ] ], - [ - 'is_primary_treatment is submitted when treatment is given', - true, - loadObjects(treatment, { - is_primary_treatment: 'No', - treatment_type: 'Chemotherapy', - }), + 'treatment_duration': [ + [ + 'treatment_duration is submitted when no treatment was given', + false, + loadObjects(treatment, + { + "treatment_duration": 30, + "treatment_type": ["No treatment"] + } + ) + ], + [ + 'treatment_duration is submitted when treatment is given', + true, + loadObjects(treatment, + { + "treatment_duration": 40, + "treatment_type": ["Chemotherapy"] + } + ) + ], + [ + 'treatment_duration is missing when treatment is given', + false, + loadObjects(treatment, + { + "treatment_type": ["Surgery"] + } + ) + ] ], - [ - 'is_primary_treatment is not submitted when no treatment is given', - false, - loadObjects(treatment, { - is_primary_treatment: '', - treatment_type: 'No treatment', - }), + 'is_primary_treatment': [ + [ + 'is_primary_treatment is missing when treatment was given', + false, + loadObjects(treatment, + { + "treatment_type": ["Chemotherapy"] + } + ) + ], + [ + 'is_primary_treatment is submitted when no treatment was given', + false, + loadObjects(treatment, + { + "is_primary_treatment": "Yes", + "treatment_type": ["No treatment"] + } + ) + ], + [ + 'is_primary_treatment is submitted when treatment is given', + true, + loadObjects(treatment, + { + "is_primary_treatment": "No", + "treatment_type": ["Chemotherapy"] + } + ) + ], + [ + 'is_primary_treatment is not submitted when no treatment is given', + true, + loadObjects(treatment, + { + "is_primary_treatment": "", + "treatment_type": ["No treatment"] + } + ) + ], + [ + 'is_primary_treatment is not applicable when no treatment is given', + true, + loadObjects(treatment, + { + "is_primary_treatment": "not applicable", + "treatment_type": ["No treatment"] + } + ) + ], + [ + 'is_primary_treatment is not applicable when treatment is given', + false, + loadObjects(treatment, + { + "is_primary_treatment": "not applicable", + "treatment_type": ["Chemotherapy", "Surgery"] + } + ) + ] ], - [ - 'is_primary_treatment is not submitted when is_primary_treatment is incorrect', - false, - loadObjects(treatment, { - is_primary_treatment: 'Not applicable', - treatment_type: 'Surgery', - }), - ], - ], - treatment_setting: [ - [ - 'treatment_setting is submitted when no treatment was given', - false, - loadObjects(treatment, { - treatment_setting: 'neoadjuvant', - treatment_type: 'No treatment', - is_primary_treatment: 'Not applicable', - }), - ], - [ - 'treatment_setting is submitted when treatment is given', - true, - loadObjects(treatment, { - treatment_setting: 'adjuvant', - treatment_type: 'Chemotherapy', - is_primary_treatment: 'Yes', - }), - ], - ], - treatment_intent: [ - [ - 'treatment_intent is submitted when no treatment was given', - false, - loadObjects(treatment, { - treatment_intent: 'curative', - treatment_type: 'No treatment', - is_primary_treatment: 'Not applicable', - }), - ], - [ - 'treatment_intent is submitted when treatment is given', - true, - loadObjects(treatment, { - treatment_intent: 'palliative', - treatment_type: 'Chemotherapy', - is_primary_treatment: 'Yes', - }), - ], - ], - line_of_treatment: [ - [ - 'line of treatment submitted even though no treatment was given', - false, - loadObjects(treatment, { - line_of_treatment: 1, - treatment_type: 'No treatment', - }), - ], - [ - 'line of treatment not submitted when no treatment was given', - true, - loadObjects(treatment, { - treatment_type: 'No treatment', - is_primary_treatment: 'Not applicable', - }), - ], - [ - 'line of treatment not submitted when Hormonal therapy given. Should not fail since this field is optional', - true, - loadObjects(treatment, { - line_of_treatment: '', - treatment_type: 'Hormonal therapy', - is_primary_treatment: 'Yes', - }), + 'treatment_setting': [ + [ + 'treatment_setting is submitted when no treatment was given', + false, + loadObjects(treatment, + { + "treatment_setting": "neoadjuvant", + "treatment_type": ["No treatment"] + } + ) + ], + [ + 'treatment_setting is submitted when treatment is given', + true, + loadObjects(treatment, + { + "treatment_setting": "adjuvant", + "treatment_type": ["Chemotherapy"] + } + ) + ], + [ + 'treatment_setting is submitted as not applicable when treatment is given', + false, + loadObjects(treatment, + { + "treatment_setting": "not applicable", + "treatment_type": ["Chemotherapy"] + } + ) + ], + [ + 'treatment_setting is submitted as not applicable when no treatment is given', + true, + loadObjects(treatment, + { + "treatment_setting": "Not Applicable", + "treatment_type": ["no treatment"] + } + ) + ] + ], - ], - days_per_cycle: [ - [ - 'days per cycle is submitted when Chemotherapy was given', - true, - loadObjects(treatment, { - days_per_cycle: 12, - treatment_type: 'Chemotherapy', - is_primary_treatment: 'Yes', - }), + 'treatment_intent': [ + [ + 'treatment_intent is submitted when no treatment was given', + false, + loadObjects(treatment, + { + "treatment_intent": "curative", + "treatment_type": ["No treatment"] + } + ) + ], + [ + 'treatment_intent is submitted when treatment is given', + true, + loadObjects(treatment, + { + "treatment_intent": "palliative", + "treatment_type": ["Chemotherapy"] + } + ) + ], + [ + 'treatment_intent is submitted as not applicable when treatment is given', + false, + loadObjects(treatment, + { + "treatment_intent": "not applicable", + "treatment_type": ["Radiation therapy"] + } + ) + ], + [ + 'treatment_intent is submitted as not applicable when no treatment is given', + true, + loadObjects(treatment, + { + "treatment_intent": "not applicable", + "treatment_type": ["no treatment"] + } + ) + ], + [ + 'treatment_intent is not submitted when no treatment is given', + true, + loadObjects(treatment, + { + "treatment_type": ["no treatment"] + } + ) + ] + + ], + 'days_per_cycle': [ + [ + 'days per cycle is submitted when Chemotherapy was given', + true, + loadObjects(treatment, + { + "days_per_cycle": 12, + "treatment_type": ["Chemotherapy"] + } + ) + ], + [ + 'days per cycle is submitted when no treatment was given', + false, + loadObjects(treatment, + { + "days_per_cycle": 10, + "treatment_type": ["no treatment"] + } + ) + ] ], - ], -}; + 'outcome_of_treatment': [ + [ + 'outcome_of_treatment is submitted when no treatment was given', + false, + loadObjects(treatment, + { + "outcome_of_treatment": "treatment completed as prescribed", + "treatment_type": ["no treatment"] + } + ) + ], + [ + 'outcome_of_treatment is not applicable when no treatment was given', + true, + loadObjects(treatment, + { + "outcome_of_treatment": "Not Applicable", + "treatment_type": ["no treatment"] + } + ) + ], + [ + 'outcome_of_treatment is empty when no treatment was given', + true, + loadObjects(treatment, + { + "outcome_of_treatment": "", + "treatment_type": ["no treatment"] + } + ) + ] + ] +} + +describe("Common Tests",()=>{ + Object.entries(myUnitTests).forEach(field =>{ + const name = field[0]; + const unitTests = field[1]; + unitTests.forEach(test=>{ + const testIndex = 2; + const testInputs = test[testIndex]; + universalTest(validation()({ $row: testInputs, $name: name, $field: testInputs[name]})); + }) + }) + +}) -describe('Common Tests', () => { - Object.entries(myUnitTests).forEach(field => { - const name = field[0]; - const unitTests = field[1]; - unitTests.forEach(test => { - const testIndex = 2; - const testInputs = test[testIndex]; - universalTest(validation()({ $row: testInputs, $name: name, $field: testInputs[name] })); - }); - }); -}); +describe("Unit Tests for treatment fields when no treatment is given",()=>{ + Object.entries(myUnitTests).forEach(field => { + const name = field[0]; + const unitTests = field[1]; + describe(`Tests for the ${name} field.`,()=>{ + test.each(unitTests)('\n Test %# : %s \nExpecting result.valid to be: %s',(description,target,inputs) =>{ + const scriptOutput = validation()({ $row: inputs, $field: inputs[name], $name: name}); + expect(scriptOutput.valid).toBe(target); + }) + }) + + }) + +}) -describe('Unit Tests for treatment fields when no treatment is given', () => { - Object.entries(myUnitTests).forEach(field => { - const name = field[0]; - const unitTests = field[1]; - describe(`Tests for the ${name} field.`, () => { - test.each(unitTests)( - '\n Test %# : %s \nExpecting result.valid to be: %s', - (description, target, inputs) => { - const scriptOutput = validation()({ $row: inputs, $field: inputs[name], $name: name }); - expect(scriptOutput.valid).toBe(target); - }, - ); - }); - }); -}); diff --git a/tests/treatment/lineofTreatment.test.js b/tests/treatment/lineofTreatment.test.js index 54f5c611..0500386d 100644 --- a/tests/treatment/lineofTreatment.test.js +++ b/tests/treatment/lineofTreatment.test.js @@ -51,25 +51,15 @@ const myUnitTests = { ) ], [ - 'is_primary_treatment is unknown, and line_of_treatment is submitted as 1', + 'is_primary_treatment is not applicable, and line_of_treatment is submitted as 1', false, loadObjects(treatment, { - "is_primary_treatment": "unknown", + "is_primary_treatment": "not applicable", "line_of_treatment": 1 } ) ], - [ - 'is_primary_treatment is unknown, and line_of_treatment is submitted as 3', - false, - loadObjects(treatment, - { - "is_primary_treatment": "unknown", - "line_of_treatment": 3 - } - ) - ], [ 'is_primary_treatment is yes, and line_of_treatment is submitted as 2', false, From dbde79e528731e820a7e5f07257041dc7a4de5fc Mon Sep 17 00:00:00 2001 From: Hardeep Date: Mon, 12 Dec 2022 16:45:08 -0500 Subject: [PATCH 23/80] created separate list for yes, no and not applicable for is_primary_treatment field (unknown removed) --- references/list.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/references/list.json b/references/list.json index 1a4fb26f..2b0d7f62 100644 --- a/references/list.json +++ b/references/list.json @@ -1,6 +1,7 @@ { "yes_no": ["Yes", "No", "Unknown"], - "yes_no_na": ["Yes", "No", "Not applicable", "Unknown"], + "yes_no_na": ["Yes", "No", "Not applicable"], + "yes_no_na_unk": ["Yes", "No", "Not applicable", "Unknown"], "exposure_usage": ["Never","Not applicable", "Unknown","Yes, currently","Yes, only in the past"], "exposure_frequency": [ "Never", From 11e8094a9d624c533dfd29ccbadd807998bb1e2e Mon Sep 17 00:00:00 2001 From: Hardeep Date: Mon, 12 Dec 2022 16:45:59 -0500 Subject: [PATCH 24/80] updated codeList to renamed codelist. No changes to actual controlled terminology --- schemas/exposure.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemas/exposure.json b/schemas/exposure.json index 367dc120..0c67d121 100644 --- a/schemas/exposure.json +++ b/schemas/exposure.json @@ -103,7 +103,7 @@ "displayName": "Alcohol History" }, "restrictions": { - "codeList": "#/list/yes_no_na", + "codeList": "#/list/yes_no_na_unk", "script": "#/script/exposure/checkAlcoholHistory" } }, From 9bd35ad6adfe995b25fbfe8eddfdc1980c00ab34 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 13 Dec 2022 11:46:59 -0500 Subject: [PATCH 25/80] added validation check that requires 'not applicable' for core fields when they meet criteria --- .../treatment/checkWhenNoTreatment.js | 5 ++++ tests/treatment/checkWhenNoTreatment.test.js | 23 ++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/references/validationFunctions/treatment/checkWhenNoTreatment.js b/references/validationFunctions/treatment/checkWhenNoTreatment.js index 00d5f80b..0f9f1edc 100644 --- a/references/validationFunctions/treatment/checkWhenNoTreatment.js +++ b/references/validationFunctions/treatment/checkWhenNoTreatment.js @@ -55,6 +55,11 @@ const validation = () => result = { valid: false, message: `If '${$name}' field is submitted when the 'treatment_type' field is '${treatmentType}', it can only be submitted as 'Not applicable'.`}; } } + else { + if (coreTextFields.includes($name)) { + result = { valid: false, message: `If 'treatment_type' is '${treatmentType}', then the '${$name}' field must be submitted as 'Not applicable'.`}; + } + } } return result; }); diff --git a/tests/treatment/checkWhenNoTreatment.test.js b/tests/treatment/checkWhenNoTreatment.test.js index 43530b94..b4a5dad5 100644 --- a/tests/treatment/checkWhenNoTreatment.test.js +++ b/tests/treatment/checkWhenNoTreatment.test.js @@ -123,7 +123,7 @@ const myUnitTests = { ], [ 'is_primary_treatment is not submitted when no treatment is given', - true, + false, loadObjects(treatment, { "is_primary_treatment": "", @@ -131,6 +131,15 @@ const myUnitTests = { } ) ], + [ + 'is_primary_treatment is not submitted when no treatment is given', + false, + loadObjects(treatment, + { + "treatment_type": ["No treatment"] + } + ) + ], [ 'is_primary_treatment is not applicable when no treatment is given', true, @@ -192,8 +201,16 @@ const myUnitTests = { "treatment_type": ["no treatment"] } ) + ], + [ + 'treatment_setting is not submitted when no treatment is given', + false, + loadObjects(treatment, + { + "treatment_type": ["no treatment"] + } + ) ] - ], 'treatment_intent': [ [ @@ -238,7 +255,7 @@ const myUnitTests = { ], [ 'treatment_intent is not submitted when no treatment is given', - true, + false, loadObjects(treatment, { "treatment_type": ["no treatment"] From 1b6e534e380d119d801502b0c0a08110e1bb62cb Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 13 Dec 2022 17:57:09 -0500 Subject: [PATCH 26/80] Added new response to treatment criteria and validation check to ensure correct response is selected based on response_to_treatment_critieria_method value --- .../treatment/responseToTreatment.js | 124 ++++++++++++++++++ schemas/treatment.json | 13 +- tests/treatment/responseToTreatment.test.js | 94 +++++++++++++ 3 files changed, 225 insertions(+), 6 deletions(-) create mode 100644 references/validationFunctions/treatment/responseToTreatment.js create mode 100644 tests/treatment/responseToTreatment.test.js diff --git a/references/validationFunctions/treatment/responseToTreatment.js b/references/validationFunctions/treatment/responseToTreatment.js new file mode 100644 index 00000000..76dc4ef8 --- /dev/null +++ b/references/validationFunctions/treatment/responseToTreatment.js @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2022 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +/** + * Validates to ensure that response_to_treatment is a permissable value based on response_to_treatment_criteria_method + * + * @param {Object} $row The object representing the row for a donor. Object keys represent the fields. + * @param {String} $field The value for the field. + */ +const validation = () => + (function validate(inputs) { + const {$row, $name, $field} = inputs; + let result = { valid: true, message: 'Ok' }; + + /* checks for a string just consisting of whitespace */ + const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; + + if ($field && $field != null && !(checkforEmpty($field))) { + let codeList = []; + switch ($row.response_to_treatment_criteria_method && $row.response_to_treatment_criteria_method.trim().toLowerCase()) { + case 'eln dohner aml oncology response criteria': + codeList = [ + 'complete remission', + 'complete remission with incomplete hematologic recovery (cri)', + 'complete remission without measurable residual disease (cr mrd-)', + 'hematologic relapse (after crmrd-, cr, cri)', + 'molecular relapse (after crmrd-)', + 'morphologic leukemia-free state', + 'partial remission', + 'primary refractory disease', + 'progressive disease', + 'stable disease' + ]; + break; + case 'cheson oncology response criteria': + codeList = [ + 'complete remission', + 'partial remission', + 'progressive disease', + 'stable disease' + ]; + break; + case 'irecist response criteria': + codeList = [ + 'immune complete response (icr)', + 'immune confirmed progressive disease (icpd)', + 'immune partial response (ipr)', + 'immune stable disease (isd)', + 'immune uncomfirmed progressive disease (iupd)' + ]; + break; + case 'recist response criteria': + codeList = [ + 'complete response', + 'no evidence of disease (ned)', + 'partial response', + 'progressive disease', + 'stable disease' + ]; + break; + case 'response assessment in neuro-oncology (rano)': + codeList = [ + 'complete response', + 'minor response', + 'partial response', + 'progressive disease', + 'stable disease' + ]; + break; + case 'physician assessed response criteria': + codeList = [ + 'physician assessed complete response', + 'physician assessed partial response', + 'physician assessed stable disease' + ]; + break; + case 'not applicable': + codeList = [ + 'not applicable' + ]; + break; + default: + codelist = []; + } + + if (!codeList.includes($field.trim().toLowerCase()) && codeList.length) { + const msg = `'${$field}' is not a permissible value. When 'response_to_treatment_criteria' is set to '${ + $row.response_to_treatment_criteria_method}', '${$name}' field must be one of the following: \n${codeList + .map(code => `- "${code}"`) + .join('\n')}`; + + result.valid = false; + result.message = msg; + } + if ($field.trim().toLowerCase() === 'cannot be assessed') { + if ($row[tCategory].trim().toLowerCase() != 'tx' && $row[nCategory].trim().toLowerCase() != 'nx') { + result = { + valid: false, + message: `The submitted term '${$field}' is not permissible for '${row.response_treatment_criteria_method}'.` + }; + } + } + } + return result; + }); + +module.exports = validation; diff --git a/schemas/treatment.json b/schemas/treatment.json index 4da2efa6..019128c7 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -227,12 +227,13 @@ "restrictions": { "script": "#/script/treatment/checkWhenNoTreatment", "codeList": [ - "RECIST 1.1", + "ELN Dohner AML Oncology Response Criteria", + "Cheson Oncology Response Criteria", "iRECIST", - "Cheson CLL Oncology Response Criteria", + "RECIST 1.1", "Response Assessment in Neuro-Oncology (RANO)", - "AML Response Criteria", - "Physician Assessed Response Criteria" + "Physician Assessed Response Criteria", + "Not applicable" ] }, "meta": { @@ -246,13 +247,12 @@ "description": "The donor's response to the applied treatment regimen. (Source: RECIST)", "valueType": "string", "restrictions": { - "script": "#/script/treatment/checkWhenNoTreatment", + "script": "#/script/treatment/responseToTreatment", "codeList": [ "Complete remission", "Complete remission with incomplete hematologic recovery (CRi)", "Complete remission without measurable residual disease (CR MRD−)", "Complete response", - "Disease progression", "Hematologic relapse (after CRMRD-, CR, CRi)", "Immune complete response (iCR)", "Immune confirmed progressive disease (iCPD)", @@ -263,6 +263,7 @@ "Molecular relapse (after CRMRD-)", "Morphologic leukemia-free state", "No evidence of disease (NED)", + "Not applicable", "Partial remission", "Partial response", "Physician assessed complete response", diff --git a/tests/treatment/responseToTreatment.test.js b/tests/treatment/responseToTreatment.test.js new file mode 100644 index 00000000..b6e401df --- /dev/null +++ b/tests/treatment/responseToTreatment.test.js @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2022 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +const validation = require('./../../references/validationFunctions/treatment/responseToTreatment.js'); +const universalTest = require('../universal'); +const loadObjects = require('../loadObjects'); + +// load in all fields with entries prepopulated to null +const dummy = require('../constructDummyData'); +const treatment = require('../constructDummyData').getSchemaDummy('treatment'); + +// the name of the field being validateds + +const myUnitTests = { + 'response_to_treatment': [ + [ + 'response_to_treatment_criteria_method is Cheson Oncology Response Criteria, response_to_treatment is "Stable disease"', + true, + loadObjects(treatment, + { + "response_to_treatment_criteria_method": "Cheson Oncology response criteria", + "response_to_treatment": "stable Disease", + } + ) + ], + [ + 'response_to_treatment_criteria_method is not applicable when response_to_treatment is "Not applicable"', + true, + loadObjects(treatment, + { + "response_to_treatment_criteria_method": "not applicable", + "response_to_treatment": "Not applicable", + } + ) + ], + [ + 'response_to_treatment_criteria_method is "eln dohner aml oncology response criteria" when response_to_treatment is "minor response"', + false, + loadObjects(treatment, + { + "response_to_treatment_criteria_method": "eln dohner aml oncology response criteria", + "response_to_treatment": "minor response", + } + ) + ] + + ] +}; + +describe("Common Tests",()=>{ + Object.entries(myUnitTests).forEach(field =>{ + const name = field[0]; + const unitTests = field[1]; + unitTests.forEach(test=>{ + const testIndex = 2; + const testInputs = test[testIndex]; + universalTest(validation()({ $row: testInputs, $name: name, $field: testInputs[name]})); + }) + }) + +}) + +describe("Unit Tests for response_to_treatment field",()=>{ + Object.entries(myUnitTests).forEach(field => { + const name = field[0]; + const unitTests = field[1]; + describe(`Tests for the ${name} field.`,()=>{ + test.each(unitTests)('\n Test %# : %s \nExpecting result.valid to be: %s',(description,target,inputs) =>{ + const scriptOutput = validation()({ $row: inputs, $field: inputs[name], $name: name}); + expect(scriptOutput.valid).toBe(target); + }) + }) + + }) + +}) + From 9d194bf145f92deda93168d5da71402001a0a29b Mon Sep 17 00:00:00 2001 From: Hardeep Date: Wed, 14 Dec 2022 18:01:50 -0500 Subject: [PATCH 27/80] Added new percent_tumour_cells_measurement_method field. --- schemas/specimen.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/schemas/specimen.json b/schemas/specimen.json index 25524ad3..fb78cba2 100644 --- a/schemas/specimen.json +++ b/schemas/specimen.json @@ -335,6 +335,25 @@ } } }, + { + "name": "percent_tumour_cells_measurement_method", + "description": "Indicate method used to measure percent_tumour_cells.", + "valueType": "string", + "meta": { + "validationDependency": true, + "core": true, + "dependsOn": "sample_registration.tumour_normal_designation", + "notes": "#/notes/if_tumour", + "displayName": "Percent Tumour Cells Measurement Method" + }, + "restrictions": { + "codeList": [ + "Genomics", + "Image analysis", + "Pathology estimate by percent nuclei" + ] + } + }, { "name": "percent_proliferating_cells", "description": "Indicate a value, in decimals, that represents the count of proliferating cells determined during pathologic review of the specimen.", From e998fc8899c247b80fb5a8e723cd771a446a749b Mon Sep 17 00:00:00 2001 From: Hardeep Date: Wed, 14 Dec 2022 18:10:15 -0500 Subject: [PATCH 28/80] corrected RISS to R-ISS in staging_systems --- references/list.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/references/list.json b/references/list.json index c2ac6300..058df22f 100644 --- a/references/list.json +++ b/references/list.json @@ -29,7 +29,7 @@ "FIGO staging system", "Lugano staging system", "Rai staging system", - "Revised International staging system (RISS)", + "Revised International staging system (R-ISS)", "St Jude staging system" ], "drug_dosage_units": ["mg/m2", "IU/m2", "ug/m2", "g/m2", "mg/kg"], From 4c33ac9557f564945c0ef5e722a98fcff10e50ed Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 15 Dec 2022 16:13:32 -0500 Subject: [PATCH 29/80] Added new prescribed_cumulative_drug_dosage field --- schemas/chemotherapy.json | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/schemas/chemotherapy.json b/schemas/chemotherapy.json index 84012900..1d8550f1 100644 --- a/schemas/chemotherapy.json +++ b/schemas/chemotherapy.json @@ -90,19 +90,40 @@ "displayName": "Chemotherapy Dosage Units" } }, + { + "name": "prescribed_cumulative_drug_dosage", + "description": "Indicate the total prescribed drug dose in the same units specified in chemotherapy_dosage_units.", + "valueType": "number", + "restrictions": { + "required": true, + "script": "#/script/chemotherapy/drugDosage", + "range": { + "exclusiveMin": 0 + } + }, + "meta": { + "core": true, + "displayName": "Prescribed Cumulative Drug Dosage", + "dependsOn": "chemotherapy.cumulative_drug_dosage", + "notes": "Either the actual drug dosage (cumulative_drug_dosage) or the prescribed drug dosage (prescribed_cumulative_drug_dosage) field must be submitted." + } + }, { "name": "cumulative_drug_dosage", "description": "Indicate the total actual drug dose in the same units specified in chemotherapy_dosage_units.", "valueType": "number", "restrictions": { "required": true, + "script": "#/script/chemotherapy/drugDosage", "range": { "exclusiveMin": 0 } }, "meta": { "core": true, - "displayName": "Cumulative Drug Dosage" + "displayName": "Actual Cumulative Drug Dosage", + "dependsOn": "treatment.prescribed_cumulative_drug_dosage", + "notes": "Either the actual drug dosage (cumulative_drug_dosage) or the prescribed drug dosage (prescribed_cumulative_drug_dosage) field must be submitted." } }, { From 65372ec2643eb8bc36ca7eb65acb60c7825f4997 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 15 Dec 2022 16:14:15 -0500 Subject: [PATCH 30/80] Added validation script that checks that either cumulative_drug_dosage or prescribed_cumulative_drug_dosage field is submitted. --- .../chemotherapy/drugDosage.js | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 references/validationFunctions/chemotherapy/drugDosage.js diff --git a/references/validationFunctions/chemotherapy/drugDosage.js b/references/validationFunctions/chemotherapy/drugDosage.js new file mode 100644 index 00000000..81069557 --- /dev/null +++ b/references/validationFunctions/chemotherapy/drugDosage.js @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2022 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +/** + * Requirement to submit either prescribed or actual drug dosage. + */ + +const validation = () => + (function validate(inputs) { + const {$row, $name, $field} = inputs; + let result = {valid: true, message: "Ok"}; + let checkField = ""; + + if ($name === 'cumulative_drug_dosage') { checkField = 'prescribed_cumulative_drug_dosage'; } + else if ($name === 'prescribed_cumulative_drug_dosage') { checkField = 'cumulative_drug_dosage'; } + + // checks for a string just consisting of whitespace + const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; + + if ( (!$field || $field === null || checkforEmpty($field)) && (!($row[checkField]) || $row[checkField] === null || checkforEmpty(!($row[checkField])))) { + result = { + valid: false, + message: `Either the 'cumulative_drug_dosage' or the 'prescribed_cumulative_drug_dosage' fields must be submitted.` + }; + } + return result; + }); + +module.exports = validation; From af7e21f0338f5cdc683e932033ce520196c28d4d Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 15 Dec 2022 16:15:00 -0500 Subject: [PATCH 31/80] unit tests for check on cumulative_drug_dosage and prescribed_cumulative_drug_dosage fields. --- tests/chemotherapy/drugDosage.test.js | 129 ++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 tests/chemotherapy/drugDosage.test.js diff --git a/tests/chemotherapy/drugDosage.test.js b/tests/chemotherapy/drugDosage.test.js new file mode 100644 index 00000000..611c51b8 --- /dev/null +++ b/tests/chemotherapy/drugDosage.test.js @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2020 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +const validation = require('../../references/validationFunctions/chemotherapy/drugDosage.js'); + +const universalTest = require('../universal'); +const loadObjects = require('../loadObjects'); + +// load in all fields with entries prepopulated to null +const chemotherapy = require('../constructDummyData').getSchemaDummy('chemotherapy'); + + +// key -> name of field, value -> unit tests +const myUnitTests = { + 'cumulative_drug_dosage': [ + [ + 'cumulative_drug_dosage is submitted when prescribed_cumulative_drug_dosage is missing', + true, + loadObjects(chemotherapy, + { + "cumulative_drug_dosage": 100 + } + ) + ], + [ + 'prescibed_drug_dosage is submitted when cumulative_drug_dosage is missing', + true, + loadObjects(chemotherapy, + { + "prescribed_cumulative_drug_dosage": 150 + } + ) + ], + [ + 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are submitted', + true, + loadObjects(chemotherapy, + { + "cumulative_drug_dosage": 300, + "prescribed_cumulative_drug_dosage": 350 + } + ) + ] + ], + 'prescribed_cumulative_drug_dosage': [ + [ + 'prescibed_cumulative_drug_dosage is submitted when cumulative_drug_dosage is missing', + true, + loadObjects(chemotherapy, + { + "prescribed_cumulative_drug_dosage": 100 + } + ) + ], + [ + 'cumlative__drug_dosage is submitted when prescribed_cumlative_drug_dosage is missing', + true, + loadObjects(chemotherapy, + { + "cumulative_drug_dosage": 150 + } + ) + ], + [ + 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are submitted', + true, + loadObjects(chemotherapy, + { + "cumulative_drug_dosage": 300, + "prescribed_cumulative_drug_dosage": 350 + } + ) + ], + [ + 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are missing', + false, + loadObjects(chemotherapy, + { + } + ) + ] + ] +} + + +describe("Common Tests",()=>{ + Object.entries(myUnitTests).forEach(field =>{ + const name = field[0]; + const unitTests = field[1]; + unitTests.forEach(test=>{ + const testIndex = 2; + const testInputs = test[testIndex]; + universalTest(validation()({ $row: testInputs, $name: name, $field: testInputs[name]})); + }) + }) + +}) + +describe("Unit Tests for chemotherapy fields",()=>{ + Object.entries(myUnitTests).forEach(field => { + const name = field[0]; + const unitTests = field[1]; + describe(`Tests for the ${name} field.`,()=>{ + test.each(unitTests)('\n Test %# : %s \nExpecting result.valid to be: %s',(description,target,inputs) =>{ + const scriptOutput = validation()({ $row: inputs, $field: inputs[name], $name: name}); + expect(scriptOutput.valid).toBe(target); + }) + }) + + }) + +}) From 5824eab403461a6e71542351f9cc04b1046fd0b1 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 15 Dec 2022 16:22:14 -0500 Subject: [PATCH 32/80] Added new prescribed_cumulative_drug_dosage field --- schemas/hormone_therapy.json | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/schemas/hormone_therapy.json b/schemas/hormone_therapy.json index 8015b1a4..4b559589 100644 --- a/schemas/hormone_therapy.json +++ b/schemas/hormone_therapy.json @@ -88,19 +88,40 @@ "displayName": "Hormone Therapy Dosage Units" } }, + { + "name": "prescribed_cumulative_drug_dosage", + "description": "Indicate the total prescribed drug dose in the same units specified in hormone_drug_dosage_units.", + "valueType": "number", + "restrictions": { + "required": true, + "script": "#/script/hormone_therapy/drugDosage", + "range": { + "exclusiveMin": 0 + } + }, + "meta": { + "core": true, + "displayName": "Prescribed Cumulative Drug Dosage", + "dependsOn": "hormone_therapy.cumulative_drug_dosage", + "notes": "Either the actual drug dosage (cumulative_drug_dosage) or the prescribed drug dosage (prescribed_cumulative_drug_dosage) field must be submitted." + } + }, { "name": "cumulative_drug_dosage", - "description": "Indicate total drug dose in units specified in hormone_drug_dosage_units.", + "description": "Indicate the total actual drug dose in the same units specified in hormone_drug_dosage_units.", "valueType": "number", "restrictions": { "required": true, + "script": "#/script/hormone_therapy/drugDosage", "range": { "exclusiveMin": 0 } }, "meta": { "core": true, - "displayName": "Cumulative Drug Dosage" + "displayName": "Actual Cumulative Drug Dosage", + "dependsOn": "treatment.prescribed_cumulative_drug_dosage", + "notes": "Either the actual drug dosage (cumulative_drug_dosage) or the prescribed drug dosage (prescribed_cumulative_drug_dosage) field must be submitted." } } ] From 0e014c2f1b08be783cc02b5b085c7f3cce186300 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 15 Dec 2022 16:22:40 -0500 Subject: [PATCH 33/80] Added validation script that checks that either cumulative_drug_dosage or prescribed_cumulative_drug_dosage field is submitted. --- .../hormone_therapy/drugDosage.js | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 references/validationFunctions/hormone_therapy/drugDosage.js diff --git a/references/validationFunctions/hormone_therapy/drugDosage.js b/references/validationFunctions/hormone_therapy/drugDosage.js new file mode 100644 index 00000000..81069557 --- /dev/null +++ b/references/validationFunctions/hormone_therapy/drugDosage.js @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2022 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +/** + * Requirement to submit either prescribed or actual drug dosage. + */ + +const validation = () => + (function validate(inputs) { + const {$row, $name, $field} = inputs; + let result = {valid: true, message: "Ok"}; + let checkField = ""; + + if ($name === 'cumulative_drug_dosage') { checkField = 'prescribed_cumulative_drug_dosage'; } + else if ($name === 'prescribed_cumulative_drug_dosage') { checkField = 'cumulative_drug_dosage'; } + + // checks for a string just consisting of whitespace + const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; + + if ( (!$field || $field === null || checkforEmpty($field)) && (!($row[checkField]) || $row[checkField] === null || checkforEmpty(!($row[checkField])))) { + result = { + valid: false, + message: `Either the 'cumulative_drug_dosage' or the 'prescribed_cumulative_drug_dosage' fields must be submitted.` + }; + } + return result; + }); + +module.exports = validation; From e0ac3b848f973aff08e9d4932f5cf9f922144a71 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 15 Dec 2022 16:23:23 -0500 Subject: [PATCH 34/80] unit tests for check on cumulative_drug_dosage and prescribed_cumulative_drug_dosage fields. --- tests/hormone_therapy/drugDosage.test.js | 129 +++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 tests/hormone_therapy/drugDosage.test.js diff --git a/tests/hormone_therapy/drugDosage.test.js b/tests/hormone_therapy/drugDosage.test.js new file mode 100644 index 00000000..5297f852 --- /dev/null +++ b/tests/hormone_therapy/drugDosage.test.js @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2020 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +const validation = require('../../references/validationFunctions/hormone_therapy/drugDosage.js'); + +const universalTest = require('../universal'); +const loadObjects = require('../loadObjects'); + +// load in all fields with entries prepopulated to null +const hormone_therapy = require('../constructDummyData').getSchemaDummy('hormone_therapy'); + + +// key -> name of field, value -> unit tests +const myUnitTests = { + 'cumulative_drug_dosage': [ + [ + 'cumulative_drug_dosage is submitted when prescribed_cumulative_drug_dosage is missing', + true, + loadObjects(hormone_therapy, + { + "cumulative_drug_dosage": 100 + } + ) + ], + [ + 'prescibed_drug_dosage is submitted when cumulative_drug_dosage is missing', + true, + loadObjects(hormone_therapy, + { + "prescribed_cumulative_drug_dosage": 150 + } + ) + ], + [ + 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are submitted', + true, + loadObjects(hormone_therapy, + { + "cumulative_drug_dosage": 300, + "prescribed_cumulative_drug_dosage": 350 + } + ) + ] + ], + 'prescribed_cumulative_drug_dosage': [ + [ + 'prescibed_cumulative_drug_dosage is submitted when cumulative_drug_dosage is missing', + true, + loadObjects(hormone_therapy, + { + "prescribed_cumulative_drug_dosage": 100 + } + ) + ], + [ + 'cumlative__drug_dosage is submitted when prescribed_cumlative_drug_dosage is missing', + true, + loadObjects(hormone_therapy, + { + "cumulative_drug_dosage": 150 + } + ) + ], + [ + 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are submitted', + true, + loadObjects(hormone_therapy, + { + "cumulative_drug_dosage": 300, + "prescribed_cumulative_drug_dosage": 350 + } + ) + ], + [ + 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are missing', + false, + loadObjects(hormone_therapy, + { + } + ) + ] + ] +} + + +describe("Common Tests",()=>{ + Object.entries(myUnitTests).forEach(field =>{ + const name = field[0]; + const unitTests = field[1]; + unitTests.forEach(test=>{ + const testIndex = 2; + const testInputs = test[testIndex]; + universalTest(validation()({ $row: testInputs, $name: name, $field: testInputs[name]})); + }) + }) + +}) + +describe("Unit Tests for hormone_therapy fields",()=>{ + Object.entries(myUnitTests).forEach(field => { + const name = field[0]; + const unitTests = field[1]; + describe(`Tests for the ${name} field.`,()=>{ + test.each(unitTests)('\n Test %# : %s \nExpecting result.valid to be: %s',(description,target,inputs) =>{ + const scriptOutput = validation()({ $row: inputs, $field: inputs[name], $name: name}); + expect(scriptOutput.valid).toBe(target); + }) + }) + + }) + +}) From 7d5a7ea051e447726b67da9b0cbc25bb0acf35fe Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 15 Dec 2022 16:35:04 -0500 Subject: [PATCH 35/80] corrected 'dependsOn' field for cumulative drug dosage fields --- schemas/chemotherapy.json | 2 +- schemas/hormone_therapy.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/schemas/chemotherapy.json b/schemas/chemotherapy.json index 1d8550f1..a4a5f7a6 100644 --- a/schemas/chemotherapy.json +++ b/schemas/chemotherapy.json @@ -122,7 +122,7 @@ "meta": { "core": true, "displayName": "Actual Cumulative Drug Dosage", - "dependsOn": "treatment.prescribed_cumulative_drug_dosage", + "dependsOn": "chemotherapy.prescribed_cumulative_drug_dosage", "notes": "Either the actual drug dosage (cumulative_drug_dosage) or the prescribed drug dosage (prescribed_cumulative_drug_dosage) field must be submitted." } }, diff --git a/schemas/hormone_therapy.json b/schemas/hormone_therapy.json index 4b559589..3571dfff 100644 --- a/schemas/hormone_therapy.json +++ b/schemas/hormone_therapy.json @@ -120,7 +120,7 @@ "meta": { "core": true, "displayName": "Actual Cumulative Drug Dosage", - "dependsOn": "treatment.prescribed_cumulative_drug_dosage", + "dependsOn": "hormone_therapy.prescribed_cumulative_drug_dosage", "notes": "Either the actual drug dosage (cumulative_drug_dosage) or the prescribed drug dosage (prescribed_cumulative_drug_dosage) field must be submitted." } } From 7d51f3ed92edff9ceca335933ec5ea17996d8335 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 15 Dec 2022 16:38:00 -0500 Subject: [PATCH 36/80] added drug dosage fields in immunotherapy table --- schemas/immunotherapy.json | 49 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/schemas/immunotherapy.json b/schemas/immunotherapy.json index 6fcf5352..a7140e8d 100644 --- a/schemas/immunotherapy.json +++ b/schemas/immunotherapy.json @@ -94,6 +94,55 @@ "restrictions": { "required": true } + }, + { + "name": "immunotherapy_drug_dosage_units", + "description": "Indicate units used to record immunotherapy drug dosage.", + "valueType": "string", + "restrictions": { + "required": true, + "codeList": "#/list/drug_dosage_units" + }, + "meta": { + "core": true, + "displayName": "Immunotherapy Drug Dosage Units" + } + }, + { + "name": "prescribed_cumulative_drug_dosage", + "description": "Indicate the total prescribed drug dose in the same units specified in immunotherapy_drug_dosage_units.", + "valueType": "number", + "restrictions": { + "required": true, + "script": "#/script/immunotherapy/drugDosage", + "range": { + "exclusiveMin": 0 + } + }, + "meta": { + "core": true, + "displayName": "Prescribed Cumulative Drug Dosage", + "dependsOn": "immunotherapy.cumulative_drug_dosage", + "notes": "Either the actual drug dosage (cumulative_drug_dosage) or the prescribed drug dosage (prescribed_cumulative_drug_dosage) field must be submitted." + } + }, + { + "name": "cumulative_drug_dosage", + "description": "Indicate the total actual drug dose in the same units specified in immunotherapy_drug_dosage_units.", + "valueType": "number", + "restrictions": { + "required": true, + "script": "#/script/immunotherapy/drugDosage", + "range": { + "exclusiveMin": 0 + } + }, + "meta": { + "core": true, + "displayName": "Actual Cumulative Drug Dosage", + "dependsOn": "immunotherapy.prescribed_cumulative_drug_dosage", + "notes": "Either the actual drug dosage (cumulative_drug_dosage) or the prescribed drug dosage (prescribed_cumulative_drug_dosage) field must be submitted." + } } ] } From 416f1242add3036c643406a18bbaaad7a205d7f1 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 15 Dec 2022 16:39:01 -0500 Subject: [PATCH 37/80] Added validation script that checks that either cumulative_drug_dosage or prescribed_cumulative_drug_dosage field is submitted. --- .../immunotherapy/drugDosage.js | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 references/validationFunctions/immunotherapy/drugDosage.js diff --git a/references/validationFunctions/immunotherapy/drugDosage.js b/references/validationFunctions/immunotherapy/drugDosage.js new file mode 100644 index 00000000..81069557 --- /dev/null +++ b/references/validationFunctions/immunotherapy/drugDosage.js @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2022 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +/** + * Requirement to submit either prescribed or actual drug dosage. + */ + +const validation = () => + (function validate(inputs) { + const {$row, $name, $field} = inputs; + let result = {valid: true, message: "Ok"}; + let checkField = ""; + + if ($name === 'cumulative_drug_dosage') { checkField = 'prescribed_cumulative_drug_dosage'; } + else if ($name === 'prescribed_cumulative_drug_dosage') { checkField = 'cumulative_drug_dosage'; } + + // checks for a string just consisting of whitespace + const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; + + if ( (!$field || $field === null || checkforEmpty($field)) && (!($row[checkField]) || $row[checkField] === null || checkforEmpty(!($row[checkField])))) { + result = { + valid: false, + message: `Either the 'cumulative_drug_dosage' or the 'prescribed_cumulative_drug_dosage' fields must be submitted.` + }; + } + return result; + }); + +module.exports = validation; From 3f2425f5ed1107eeb0b63c1f92974d7e6120e41f Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 15 Dec 2022 16:40:03 -0500 Subject: [PATCH 38/80] Added validation script that checks that either cumulative_drug_dosage or prescribed_cumulative_drug_dosage field is submitted. --- tests/immunotherapy/drugDosage.test.js | 129 +++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 tests/immunotherapy/drugDosage.test.js diff --git a/tests/immunotherapy/drugDosage.test.js b/tests/immunotherapy/drugDosage.test.js new file mode 100644 index 00000000..e43734aa --- /dev/null +++ b/tests/immunotherapy/drugDosage.test.js @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2020 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +const validation = require('../../references/validationFunctions/immunotherapy/drugDosage.js'); + +const universalTest = require('../universal'); +const loadObjects = require('../loadObjects'); + +// load in all fields with entries prepopulated to null +const immunotherapy = require('../constructDummyData').getSchemaDummy('immunotherapy'); + + +// key -> name of field, value -> unit tests +const myUnitTests = { + 'cumulative_drug_dosage': [ + [ + 'cumulative_drug_dosage is submitted when prescribed_cumulative_drug_dosage is missing', + true, + loadObjects(immunotherapy, + { + "cumulative_drug_dosage": 100 + } + ) + ], + [ + 'prescibed_drug_dosage is submitted when cumulative_drug_dosage is missing', + true, + loadObjects(immunotherapy, + { + "prescribed_cumulative_drug_dosage": 150 + } + ) + ], + [ + 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are submitted', + true, + loadObjects(immunotherapy, + { + "cumulative_drug_dosage": 300, + "prescribed_cumulative_drug_dosage": 350 + } + ) + ] + ], + 'prescribed_cumulative_drug_dosage': [ + [ + 'prescibed_cumulative_drug_dosage is submitted when cumulative_drug_dosage is missing', + true, + loadObjects(immunotherapy, + { + "prescribed_cumulative_drug_dosage": 100 + } + ) + ], + [ + 'cumlative__drug_dosage is submitted when prescribed_cumlative_drug_dosage is missing', + true, + loadObjects(immunotherapy, + { + "cumulative_drug_dosage": 150 + } + ) + ], + [ + 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are submitted', + true, + loadObjects(immunotherapy, + { + "cumulative_drug_dosage": 300, + "prescribed_cumulative_drug_dosage": 350 + } + ) + ], + [ + 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are missing', + false, + loadObjects(immunotherapy, + { + } + ) + ] + ] +} + + +describe("Common Tests",()=>{ + Object.entries(myUnitTests).forEach(field =>{ + const name = field[0]; + const unitTests = field[1]; + unitTests.forEach(test=>{ + const testIndex = 2; + const testInputs = test[testIndex]; + universalTest(validation()({ $row: testInputs, $name: name, $field: testInputs[name]})); + }) + }) + +}) + +describe("Unit Tests for immunotherapy fields",()=>{ + Object.entries(myUnitTests).forEach(field => { + const name = field[0]; + const unitTests = field[1]; + describe(`Tests for the ${name} field.`,()=>{ + test.each(unitTests)('\n Test %# : %s \nExpecting result.valid to be: %s',(description,target,inputs) =>{ + const scriptOutput = validation()({ $row: inputs, $field: inputs[name], $name: name}); + expect(scriptOutput.valid).toBe(target); + }) + }) + + }) + +}) From aad2881f12beaede354e9ffff949382618342cce Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 15 Dec 2022 17:29:26 -0500 Subject: [PATCH 39/80] corrected recist --- .../validationFunctions/treatment/responseToTreatment.js | 4 ++-- schemas/treatment.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/references/validationFunctions/treatment/responseToTreatment.js b/references/validationFunctions/treatment/responseToTreatment.js index 76dc4ef8..0b30e7e9 100644 --- a/references/validationFunctions/treatment/responseToTreatment.js +++ b/references/validationFunctions/treatment/responseToTreatment.js @@ -57,7 +57,7 @@ const validation = () => 'stable disease' ]; break; - case 'irecist response criteria': + case 'irecist': codeList = [ 'immune complete response (icr)', 'immune confirmed progressive disease (icpd)', @@ -66,7 +66,7 @@ const validation = () => 'immune uncomfirmed progressive disease (iupd)' ]; break; - case 'recist response criteria': + case 'recist': codeList = [ 'complete response', 'no evidence of disease (ned)', diff --git a/schemas/treatment.json b/schemas/treatment.json index 019128c7..3b5d4046 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -230,7 +230,7 @@ "ELN Dohner AML Oncology Response Criteria", "Cheson Oncology Response Criteria", "iRECIST", - "RECIST 1.1", + "RECIST", "Response Assessment in Neuro-Oncology (RANO)", "Physician Assessed Response Criteria", "Not applicable" @@ -251,7 +251,7 @@ "codeList": [ "Complete remission", "Complete remission with incomplete hematologic recovery (CRi)", - "Complete remission without measurable residual disease (CR MRD−)", + "Complete remission without measurable residual disease (CR MRD-)", "Complete response", "Hematologic relapse (after CRMRD-, CR, CRi)", "Immune complete response (iCR)", From d3b88b95ed1c542c6eeb03d072762101ec1018f9 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Fri, 16 Dec 2022 15:36:39 -0500 Subject: [PATCH 40/80] updated term 'dosage' to 'dose' for correct usage. Renamed 'cumulative_drug_dose' to 'actual_drug_dose'. --- references/list.json | 2 +- .../{drugDosage.js => drugDose.js} | 8 ++--- .../{drugDosage.js => drugDose.js} | 8 ++--- schemas/chemotherapy.json | 34 +++++++++--------- schemas/hormone_therapy.json | 32 ++++++++--------- .../{drugDosage.test.js => drugDose.test.js} | 36 +++++++++---------- .../{drugDosage.test.js => drugDose.test.js} | 36 +++++++++---------- 7 files changed, 77 insertions(+), 79 deletions(-) rename references/validationFunctions/chemotherapy/{drugDosage.js => drugDose.js} (83%) rename references/validationFunctions/hormone_therapy/{drugDosage.js => drugDose.js} (83%) rename tests/chemotherapy/{drugDosage.test.js => drugDose.test.js} (74%) rename tests/hormone_therapy/{drugDosage.test.js => drugDose.test.js} (74%) diff --git a/references/list.json b/references/list.json index c2ac6300..c6a55df4 100644 --- a/references/list.json +++ b/references/list.json @@ -32,7 +32,7 @@ "Revised International staging system (RISS)", "St Jude staging system" ], - "drug_dosage_units": ["mg/m2", "IU/m2", "ug/m2", "g/m2", "mg/kg"], + "drug_dose_units": ["mg/m2", "IU/m2", "ug/m2", "g/m2", "mg/kg"], "stage_groups": ["Occult Carcinoma", "Stage 0", "Stage 0a", "Stage 0is", "Stage 1", "Stage 1A", "Stage 1B", "Stage A", "Stage B", "Stage C", "Stage I", "Stage IA", "Stage IA1", "Stage IA2", "Stage IA3", "Stage IAB", "Stage IAE", "Stage IAES", "Stage IAS", "Stage IB", "Stage IB1", "Stage IB2", "Stage IBE", "Stage IBES", "Stage IBS", "Stage IC", "Stage IE", "Stage IEA", "Stage IEB", "Stage IES", "Stage II", "Stage II bulky", "Stage IIA", "Stage IIA1", "Stage IIA2", "Stage IIAE", "Stage IIAES", "Stage IIAS", "Stage IIB", "Stage IIBE", "Stage IIBES", "Stage IIBS", "Stage IIC", "Stage IIE", "Stage IIEA", "Stage IIEB", "Stage IIES", "Stage III", "Stage IIIA", "Stage IIIA1", "Stage IIIA2", "Stage IIIAE", "Stage IIIAES", "Stage IIIAS", "Stage IIIB", "Stage IIIBE", "Stage IIIBES", "Stage IIIBS", "Stage IIIC", "Stage IIIC1", "Stage IIIC2", "Stage IIID", "Stage IIIE", "Stage IIIES", "Stage IIIS", "Stage IIS", "Stage IS", "Stage IV", "Stage IVA", "Stage IVA1", "Stage IVA2", "Stage IVAE", "Stage IVAES", "Stage IVAS", "Stage IVB", "Stage IVBE", "Stage IVBES", "Stage IVBS", "Stage IVC", "Stage IVE", "Stage IVES", "Stage IVS", "Cannot be assessed"], "t_categories": ["T0","T1","T1a","T1a1","T1a2","T1a(s)","T1a(m)","T1b","T1b1","T1b2","T1b(s)","T1b(m)","T1c","T1d","T1mi","T2","T2(s)","T2(m)","T2a","T2a1","T2a2","T2b","T2c","T2d","T3","T3(s)","T3(m)","T3a","T3b","T3c","T3d","T3e","T4","T4a","T4a(s)","T4a(m)","T4b","T4b(s)","T4b(m)","T4c","T4d","T4e","Ta","Tis","Tis(DCIS)","Tis(LAMN)","Tis(LCIS)","Tis(Paget)","Tis(Paget’s)","Tis pd","Tis pu","TX"], "n_categories": ["N0","N0a","N0a (biopsy)","N0b","N0b (no biopsy)","N0(i+)","N0(i-)","N0(mol+)","N0(mol-)","N1","N1a","N1a(sn)","N1b","N1c","N1mi","N2","N2a","N2b","N2c","N2mi","N3","N3a","N3b","N3c","N4","NX"], diff --git a/references/validationFunctions/chemotherapy/drugDosage.js b/references/validationFunctions/chemotherapy/drugDose.js similarity index 83% rename from references/validationFunctions/chemotherapy/drugDosage.js rename to references/validationFunctions/chemotherapy/drugDose.js index 81069557..28ab2344 100644 --- a/references/validationFunctions/chemotherapy/drugDosage.js +++ b/references/validationFunctions/chemotherapy/drugDose.js @@ -19,7 +19,7 @@ */ /** - * Requirement to submit either prescribed or actual drug dosage. + * Requirement to submit either prescribed or actual drug dose. */ const validation = () => @@ -28,8 +28,8 @@ const validation = () => let result = {valid: true, message: "Ok"}; let checkField = ""; - if ($name === 'cumulative_drug_dosage') { checkField = 'prescribed_cumulative_drug_dosage'; } - else if ($name === 'prescribed_cumulative_drug_dosage') { checkField = 'cumulative_drug_dosage'; } + if ($name === 'actual_cumulative_drug_dose') { checkField = 'prescribed_cumulative_drug_dose'; } + else if ($name === 'prescribed_cumulative_drug_dose') { checkField = 'actual_cumulative_drug_dose'; } // checks for a string just consisting of whitespace const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; @@ -37,7 +37,7 @@ const validation = () => if ( (!$field || $field === null || checkforEmpty($field)) && (!($row[checkField]) || $row[checkField] === null || checkforEmpty(!($row[checkField])))) { result = { valid: false, - message: `Either the 'cumulative_drug_dosage' or the 'prescribed_cumulative_drug_dosage' fields must be submitted.` + message: `Either the 'actual_cumulative_drug_dose' or the 'prescribed_cumulative_drug_dose' fields must be submitted.` }; } return result; diff --git a/references/validationFunctions/hormone_therapy/drugDosage.js b/references/validationFunctions/hormone_therapy/drugDose.js similarity index 83% rename from references/validationFunctions/hormone_therapy/drugDosage.js rename to references/validationFunctions/hormone_therapy/drugDose.js index 81069557..28ab2344 100644 --- a/references/validationFunctions/hormone_therapy/drugDosage.js +++ b/references/validationFunctions/hormone_therapy/drugDose.js @@ -19,7 +19,7 @@ */ /** - * Requirement to submit either prescribed or actual drug dosage. + * Requirement to submit either prescribed or actual drug dose. */ const validation = () => @@ -28,8 +28,8 @@ const validation = () => let result = {valid: true, message: "Ok"}; let checkField = ""; - if ($name === 'cumulative_drug_dosage') { checkField = 'prescribed_cumulative_drug_dosage'; } - else if ($name === 'prescribed_cumulative_drug_dosage') { checkField = 'cumulative_drug_dosage'; } + if ($name === 'actual_cumulative_drug_dose') { checkField = 'prescribed_cumulative_drug_dose'; } + else if ($name === 'prescribed_cumulative_drug_dose') { checkField = 'actual_cumulative_drug_dose'; } // checks for a string just consisting of whitespace const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; @@ -37,7 +37,7 @@ const validation = () => if ( (!$field || $field === null || checkforEmpty($field)) && (!($row[checkField]) || $row[checkField] === null || checkforEmpty(!($row[checkField])))) { result = { valid: false, - message: `Either the 'cumulative_drug_dosage' or the 'prescribed_cumulative_drug_dosage' fields must be submitted.` + message: `Either the 'actual_cumulative_drug_dose' or the 'prescribed_cumulative_drug_dose' fields must be submitted.` }; } return result; diff --git a/schemas/chemotherapy.json b/schemas/chemotherapy.json index a4a5f7a6..39405af5 100644 --- a/schemas/chemotherapy.json +++ b/schemas/chemotherapy.json @@ -78,52 +78,50 @@ } }, { - "name": "chemotherapy_dosage_units", - "description": "Indicate units used to record chemotherapy drug dosage.", + "name": "chemotherapy_drug_dose_units", + "description": "Indicate units used to record chemotherapy drug dose.", "valueType": "string", "restrictions": { "required": true, - "codeList": "#/list/drug_dosage_units" + "codeList": "#/list/drug_dose_units" }, "meta": { "core": true, - "displayName": "Chemotherapy Dosage Units" + "displayName": "Chemotherapy Drug Dose Units" } }, { - "name": "prescribed_cumulative_drug_dosage", - "description": "Indicate the total prescribed drug dose in the same units specified in chemotherapy_dosage_units.", + "name": "prescribed_cumulative_drug_dose", + "description": "Indicate the total prescribed drug dose in the same units specified in chemotherapy_drug_dose_units.", "valueType": "number", "restrictions": { - "required": true, - "script": "#/script/chemotherapy/drugDosage", + "script": "#/script/chemotherapy/drugDose", "range": { "exclusiveMin": 0 } }, "meta": { "core": true, - "displayName": "Prescribed Cumulative Drug Dosage", - "dependsOn": "chemotherapy.cumulative_drug_dosage", - "notes": "Either the actual drug dosage (cumulative_drug_dosage) or the prescribed drug dosage (prescribed_cumulative_drug_dosage) field must be submitted." + "displayName": "Prescribed Cumulative Drug Dose", + "dependsOn": "chemotherapy.actual_cumulative_drug_dose", + "notes": "Either the 'actual_cumulative_drug_dose' or the 'prescribed_cumulative_drug_dose' field must be submitted." } }, { - "name": "cumulative_drug_dosage", - "description": "Indicate the total actual drug dose in the same units specified in chemotherapy_dosage_units.", + "name": "actual_cumulative_drug_dose", + "description": "Indicate the total actual drug dose in the same units specified in chemotherapy_drug_dose_units.", "valueType": "number", "restrictions": { - "required": true, - "script": "#/script/chemotherapy/drugDosage", + "script": "#/script/chemotherapy/drugDose", "range": { "exclusiveMin": 0 } }, "meta": { "core": true, - "displayName": "Actual Cumulative Drug Dosage", - "dependsOn": "chemotherapy.prescribed_cumulative_drug_dosage", - "notes": "Either the actual drug dosage (cumulative_drug_dosage) or the prescribed drug dosage (prescribed_cumulative_drug_dosage) field must be submitted." + "displayName": "Actual Cumulative Drug Dose", + "dependsOn": "chemotherapy.prescribed_cumulative_drug_dose", + "notes": "Either the 'actual_cumulative_drug_dose' or the 'prescribed_cumulative_drug_dose' field must be submitted." } }, { diff --git a/schemas/hormone_therapy.json b/schemas/hormone_therapy.json index 3571dfff..322967d9 100644 --- a/schemas/hormone_therapy.json +++ b/schemas/hormone_therapy.json @@ -76,52 +76,52 @@ } }, { - "name": "hormone_drug_dosage_units", - "description": "Indicate the units used to record hormone drug dosage.", + "name": "hormone_drug_dose_units", + "description": "Indicate the units used to record hormone drug dose.", "valueType": "string", "restrictions": { "required": true, - "codeList": "#/list/drug_dosage_units" + "codeList": "#/list/drug_dose_units" }, "meta": { "core": true, - "displayName": "Hormone Therapy Dosage Units" + "displayName": "Hormone Drug Dose Units" } }, { - "name": "prescribed_cumulative_drug_dosage", - "description": "Indicate the total prescribed drug dose in the same units specified in hormone_drug_dosage_units.", + "name": "prescribed_cumulative_drug_dose", + "description": "Indicate the total prescribed drug dose in the same units specified in hormone_drug_dose_units.", "valueType": "number", "restrictions": { "required": true, - "script": "#/script/hormone_therapy/drugDosage", + "script": "#/script/hormone_therapy/drugDose", "range": { "exclusiveMin": 0 } }, "meta": { "core": true, - "displayName": "Prescribed Cumulative Drug Dosage", - "dependsOn": "hormone_therapy.cumulative_drug_dosage", - "notes": "Either the actual drug dosage (cumulative_drug_dosage) or the prescribed drug dosage (prescribed_cumulative_drug_dosage) field must be submitted." + "displayName": "Prescribed Cumulative Drug Dose", + "dependsOn": "hormone_therapy.cumulative_drug_dose", + "notes": "Either the 'actual_cumulative_drug_dose' or the 'prescribed_cumulative_drug_dose' field must be submitted." } }, { - "name": "cumulative_drug_dosage", - "description": "Indicate the total actual drug dose in the same units specified in hormone_drug_dosage_units.", + "name": "actual_cumulative_drug_dose", + "description": "Indicate the total actual drug dose in the same units specified in hormone_drug_dose_units.", "valueType": "number", "restrictions": { "required": true, - "script": "#/script/hormone_therapy/drugDosage", + "script": "#/script/hormone_therapy/drugDose", "range": { "exclusiveMin": 0 } }, "meta": { "core": true, - "displayName": "Actual Cumulative Drug Dosage", - "dependsOn": "hormone_therapy.prescribed_cumulative_drug_dosage", - "notes": "Either the actual drug dosage (cumulative_drug_dosage) or the prescribed drug dosage (prescribed_cumulative_drug_dosage) field must be submitted." + "displayName": "Actual Cumulative Drug Dose", + "dependsOn": "hormone_therapy.prescribed_cumulative_drug_dose", + "notes": "Either the 'actual_cumulative_drug_dose' or the 'prescribed_cumulative_drug_dose' field must be submitted." } } ] diff --git a/tests/chemotherapy/drugDosage.test.js b/tests/chemotherapy/drugDose.test.js similarity index 74% rename from tests/chemotherapy/drugDosage.test.js rename to tests/chemotherapy/drugDose.test.js index 611c51b8..32326c3b 100644 --- a/tests/chemotherapy/drugDosage.test.js +++ b/tests/chemotherapy/drugDose.test.js @@ -18,7 +18,7 @@ * */ -const validation = require('../../references/validationFunctions/chemotherapy/drugDosage.js'); +const validation = require('../../references/validationFunctions/chemotherapy/drugDose.js'); const universalTest = require('../universal'); const loadObjects = require('../loadObjects'); @@ -29,67 +29,67 @@ const chemotherapy = require('../constructDummyData').getSchemaDummy('chemothera // key -> name of field, value -> unit tests const myUnitTests = { - 'cumulative_drug_dosage': [ + 'actual_cumulative_drug_dose': [ [ - 'cumulative_drug_dosage is submitted when prescribed_cumulative_drug_dosage is missing', + 'actual_cumulative_drug_dose is submitted when prescribed_cumulative_drug_dose is missing', true, loadObjects(chemotherapy, { - "cumulative_drug_dosage": 100 + "actual_cumulative_drug_dose": 100 } ) ], [ - 'prescibed_drug_dosage is submitted when cumulative_drug_dosage is missing', + 'prescribed_drug_dose is submitted when actual_cumulative_drug_dose is missing', true, loadObjects(chemotherapy, { - "prescribed_cumulative_drug_dosage": 150 + "prescribed_cumulative_drug_dose": 150 } ) ], [ - 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are submitted', + 'Both actual_cumulative_drug_dose and prescribed_cumulative_drug_dose are submitted', true, loadObjects(chemotherapy, { - "cumulative_drug_dosage": 300, - "prescribed_cumulative_drug_dosage": 350 + "actual_cumulative_drug_dose": 300, + "prescribed_cumulative_drug_dose": 350 } ) ] ], - 'prescribed_cumulative_drug_dosage': [ + 'prescribed_cumulative_drug_dose': [ [ - 'prescibed_cumulative_drug_dosage is submitted when cumulative_drug_dosage is missing', + 'prescibed_cumulative_drug_dose is submitted when actual_cumulative_drug_dose is missing', true, loadObjects(chemotherapy, { - "prescribed_cumulative_drug_dosage": 100 + "prescribed_cumulative_drug_dose": 100 } ) ], [ - 'cumlative__drug_dosage is submitted when prescribed_cumlative_drug_dosage is missing', + 'actual_cumlative__drug_dose is submitted when prescribed_cumlative_drug_dose is missing', true, loadObjects(chemotherapy, { - "cumulative_drug_dosage": 150 + "actual_cumulative_drug_dose": 150 } ) ], [ - 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are submitted', + 'Both actual_cumulative_drug_dose and prescribed_cumulative_drug_dose are submitted', true, loadObjects(chemotherapy, { - "cumulative_drug_dosage": 300, - "prescribed_cumulative_drug_dosage": 350 + "actual_cumulative_drug_dose": 300, + "prescribed_cumulative_drug_dose": 350 } ) ], [ - 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are missing', + 'Both cumulative_drug_dose and prescribed_cumulative_drug_dose are missing', false, loadObjects(chemotherapy, { diff --git a/tests/hormone_therapy/drugDosage.test.js b/tests/hormone_therapy/drugDose.test.js similarity index 74% rename from tests/hormone_therapy/drugDosage.test.js rename to tests/hormone_therapy/drugDose.test.js index 5297f852..10f65454 100644 --- a/tests/hormone_therapy/drugDosage.test.js +++ b/tests/hormone_therapy/drugDose.test.js @@ -18,7 +18,7 @@ * */ -const validation = require('../../references/validationFunctions/hormone_therapy/drugDosage.js'); +const validation = require('../../references/validationFunctions/hormone_therapy/drugDose.js'); const universalTest = require('../universal'); const loadObjects = require('../loadObjects'); @@ -29,67 +29,67 @@ const hormone_therapy = require('../constructDummyData').getSchemaDummy('hormone // key -> name of field, value -> unit tests const myUnitTests = { - 'cumulative_drug_dosage': [ + 'actual_cumulative_drug_dose': [ [ - 'cumulative_drug_dosage is submitted when prescribed_cumulative_drug_dosage is missing', + 'actual_cumulative_drug_dose is submitted when prescribed_cumulative_drug_dose is missing', true, loadObjects(hormone_therapy, { - "cumulative_drug_dosage": 100 + "actual_cumulative_drug_dose": 100 } ) ], [ - 'prescibed_drug_dosage is submitted when cumulative_drug_dosage is missing', + 'prescribed_drug_dose is submitted when actual_cumulative_drug_dose is missing', true, loadObjects(hormone_therapy, { - "prescribed_cumulative_drug_dosage": 150 + "prescribed_cumulative_drug_dose": 150 } ) ], [ - 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are submitted', + 'Both actual_cumulative_drug_dose and prescribed_cumulative_drug_dose are submitted', true, loadObjects(hormone_therapy, { - "cumulative_drug_dosage": 300, - "prescribed_cumulative_drug_dosage": 350 + "actual_cumulative_drug_dose": 300, + "prescribed_cumulative_drug_dose": 350 } ) ] ], - 'prescribed_cumulative_drug_dosage': [ + 'prescribed_cumulative_drug_dose': [ [ - 'prescibed_cumulative_drug_dosage is submitted when cumulative_drug_dosage is missing', + 'prescribed_cumulative_drug_dose is submitted when actual_cumulative_drug_dose is missing', true, loadObjects(hormone_therapy, { - "prescribed_cumulative_drug_dosage": 100 + "prescribed_cumulative_drug_dose": 100 } ) ], [ - 'cumlative__drug_dosage is submitted when prescribed_cumlative_drug_dosage is missing', + 'actual_cumlative_drug_dose is submitted when prescribed_cumlative_drug_dose is missing', true, loadObjects(hormone_therapy, { - "cumulative_drug_dosage": 150 + "actual_cumulative_drug_dose": 150 } ) ], [ - 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are submitted', + 'Both actual_cumulative_drug_dose and prescribed_cumulative_drug_dose are submitted', true, loadObjects(hormone_therapy, { - "cumulative_drug_dosage": 300, - "prescribed_cumulative_drug_dosage": 350 + "actual_cumulative_drug_dose": 300, + "prescribed_cumulative_drug_dose": 350 } ) ], [ - 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are missing', + 'Both actual_cumulative_drug_dose and prescribed_cumulative_drug_dose are missing', false, loadObjects(hormone_therapy, { From b48dcec4149518051b4e7665e515249192fd128a Mon Sep 17 00:00:00 2001 From: Hardeep Date: Fri, 16 Dec 2022 15:51:04 -0500 Subject: [PATCH 41/80] updated term 'dosage' to 'dose' for correct usage. Renamed 'cumulative_drug_dose' to 'actual_drug_dose'. --- references/list.json | 2 +- .../{drugDosage.js => drugDose.js} | 8 ++--- schemas/immunotherapy.json | 34 +++++++++--------- .../{drugDosage.test.js => drugDose.test.js} | 36 +++++++++---------- 4 files changed, 39 insertions(+), 41 deletions(-) rename references/validationFunctions/immunotherapy/{drugDosage.js => drugDose.js} (83%) rename tests/immunotherapy/{drugDosage.test.js => drugDose.test.js} (74%) diff --git a/references/list.json b/references/list.json index c2ac6300..c6a55df4 100644 --- a/references/list.json +++ b/references/list.json @@ -32,7 +32,7 @@ "Revised International staging system (RISS)", "St Jude staging system" ], - "drug_dosage_units": ["mg/m2", "IU/m2", "ug/m2", "g/m2", "mg/kg"], + "drug_dose_units": ["mg/m2", "IU/m2", "ug/m2", "g/m2", "mg/kg"], "stage_groups": ["Occult Carcinoma", "Stage 0", "Stage 0a", "Stage 0is", "Stage 1", "Stage 1A", "Stage 1B", "Stage A", "Stage B", "Stage C", "Stage I", "Stage IA", "Stage IA1", "Stage IA2", "Stage IA3", "Stage IAB", "Stage IAE", "Stage IAES", "Stage IAS", "Stage IB", "Stage IB1", "Stage IB2", "Stage IBE", "Stage IBES", "Stage IBS", "Stage IC", "Stage IE", "Stage IEA", "Stage IEB", "Stage IES", "Stage II", "Stage II bulky", "Stage IIA", "Stage IIA1", "Stage IIA2", "Stage IIAE", "Stage IIAES", "Stage IIAS", "Stage IIB", "Stage IIBE", "Stage IIBES", "Stage IIBS", "Stage IIC", "Stage IIE", "Stage IIEA", "Stage IIEB", "Stage IIES", "Stage III", "Stage IIIA", "Stage IIIA1", "Stage IIIA2", "Stage IIIAE", "Stage IIIAES", "Stage IIIAS", "Stage IIIB", "Stage IIIBE", "Stage IIIBES", "Stage IIIBS", "Stage IIIC", "Stage IIIC1", "Stage IIIC2", "Stage IIID", "Stage IIIE", "Stage IIIES", "Stage IIIS", "Stage IIS", "Stage IS", "Stage IV", "Stage IVA", "Stage IVA1", "Stage IVA2", "Stage IVAE", "Stage IVAES", "Stage IVAS", "Stage IVB", "Stage IVBE", "Stage IVBES", "Stage IVBS", "Stage IVC", "Stage IVE", "Stage IVES", "Stage IVS", "Cannot be assessed"], "t_categories": ["T0","T1","T1a","T1a1","T1a2","T1a(s)","T1a(m)","T1b","T1b1","T1b2","T1b(s)","T1b(m)","T1c","T1d","T1mi","T2","T2(s)","T2(m)","T2a","T2a1","T2a2","T2b","T2c","T2d","T3","T3(s)","T3(m)","T3a","T3b","T3c","T3d","T3e","T4","T4a","T4a(s)","T4a(m)","T4b","T4b(s)","T4b(m)","T4c","T4d","T4e","Ta","Tis","Tis(DCIS)","Tis(LAMN)","Tis(LCIS)","Tis(Paget)","Tis(Paget’s)","Tis pd","Tis pu","TX"], "n_categories": ["N0","N0a","N0a (biopsy)","N0b","N0b (no biopsy)","N0(i+)","N0(i-)","N0(mol+)","N0(mol-)","N1","N1a","N1a(sn)","N1b","N1c","N1mi","N2","N2a","N2b","N2c","N2mi","N3","N3a","N3b","N3c","N4","NX"], diff --git a/references/validationFunctions/immunotherapy/drugDosage.js b/references/validationFunctions/immunotherapy/drugDose.js similarity index 83% rename from references/validationFunctions/immunotherapy/drugDosage.js rename to references/validationFunctions/immunotherapy/drugDose.js index 81069557..28ab2344 100644 --- a/references/validationFunctions/immunotherapy/drugDosage.js +++ b/references/validationFunctions/immunotherapy/drugDose.js @@ -19,7 +19,7 @@ */ /** - * Requirement to submit either prescribed or actual drug dosage. + * Requirement to submit either prescribed or actual drug dose. */ const validation = () => @@ -28,8 +28,8 @@ const validation = () => let result = {valid: true, message: "Ok"}; let checkField = ""; - if ($name === 'cumulative_drug_dosage') { checkField = 'prescribed_cumulative_drug_dosage'; } - else if ($name === 'prescribed_cumulative_drug_dosage') { checkField = 'cumulative_drug_dosage'; } + if ($name === 'actual_cumulative_drug_dose') { checkField = 'prescribed_cumulative_drug_dose'; } + else if ($name === 'prescribed_cumulative_drug_dose') { checkField = 'actual_cumulative_drug_dose'; } // checks for a string just consisting of whitespace const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; @@ -37,7 +37,7 @@ const validation = () => if ( (!$field || $field === null || checkforEmpty($field)) && (!($row[checkField]) || $row[checkField] === null || checkforEmpty(!($row[checkField])))) { result = { valid: false, - message: `Either the 'cumulative_drug_dosage' or the 'prescribed_cumulative_drug_dosage' fields must be submitted.` + message: `Either the 'actual_cumulative_drug_dose' or the 'prescribed_cumulative_drug_dose' fields must be submitted.` }; } return result; diff --git a/schemas/immunotherapy.json b/schemas/immunotherapy.json index a7140e8d..218073a7 100644 --- a/schemas/immunotherapy.json +++ b/schemas/immunotherapy.json @@ -96,52 +96,50 @@ } }, { - "name": "immunotherapy_drug_dosage_units", - "description": "Indicate units used to record immunotherapy drug dosage.", + "name": "immunotherapy_drug_dose_units", + "description": "Indicate units used to record immunotherapy drug dose.", "valueType": "string", "restrictions": { "required": true, - "codeList": "#/list/drug_dosage_units" + "codeList": "#/list/drug_dose_units" }, "meta": { "core": true, - "displayName": "Immunotherapy Drug Dosage Units" + "displayName": "Immunotherapy Drug Dose Units" } }, { - "name": "prescribed_cumulative_drug_dosage", - "description": "Indicate the total prescribed drug dose in the same units specified in immunotherapy_drug_dosage_units.", + "name": "prescribed_cumulative_drug_dose", + "description": "Indicate the total prescribed drug dose in the same units specified in immunotherapy_drug_dose_units.", "valueType": "number", "restrictions": { - "required": true, - "script": "#/script/immunotherapy/drugDosage", + "script": "#/script/immunotherapy/drugDose", "range": { "exclusiveMin": 0 } }, "meta": { "core": true, - "displayName": "Prescribed Cumulative Drug Dosage", - "dependsOn": "immunotherapy.cumulative_drug_dosage", - "notes": "Either the actual drug dosage (cumulative_drug_dosage) or the prescribed drug dosage (prescribed_cumulative_drug_dosage) field must be submitted." + "displayName": "Prescribed Cumulative Drug Dose", + "dependsOn": "immunotherapy.actual_cumulative_drug_dose", + "notes": "Either the 'actual_cumulative_drug_dose' or the 'prescribed_cumulative_drug_dose' field must be submitted." } }, { - "name": "cumulative_drug_dosage", - "description": "Indicate the total actual drug dose in the same units specified in immunotherapy_drug_dosage_units.", + "name": "actual_cumulative_drug_dose", + "description": "Indicate the total actual drug dose in the same units specified in immunotherapy_drug_dose_units.", "valueType": "number", "restrictions": { - "required": true, - "script": "#/script/immunotherapy/drugDosage", + "script": "#/script/immunotherapy/drugDose", "range": { "exclusiveMin": 0 } }, "meta": { "core": true, - "displayName": "Actual Cumulative Drug Dosage", - "dependsOn": "immunotherapy.prescribed_cumulative_drug_dosage", - "notes": "Either the actual drug dosage (cumulative_drug_dosage) or the prescribed drug dosage (prescribed_cumulative_drug_dosage) field must be submitted." + "displayName": "Actual Cumulative Drug Dose", + "dependsOn": "immunotherapy.prescribed_cumulative_drug_dose", + "notes": "Either the 'actual_cumulative_drug_dose' or the 'prescribed_cumulative_drug_dose' field must be submitted." } } ] diff --git a/tests/immunotherapy/drugDosage.test.js b/tests/immunotherapy/drugDose.test.js similarity index 74% rename from tests/immunotherapy/drugDosage.test.js rename to tests/immunotherapy/drugDose.test.js index e43734aa..c10ec069 100644 --- a/tests/immunotherapy/drugDosage.test.js +++ b/tests/immunotherapy/drugDose.test.js @@ -18,7 +18,7 @@ * */ -const validation = require('../../references/validationFunctions/immunotherapy/drugDosage.js'); +const validation = require('../../references/validationFunctions/immunotherapy/drugDose.js'); const universalTest = require('../universal'); const loadObjects = require('../loadObjects'); @@ -29,67 +29,67 @@ const immunotherapy = require('../constructDummyData').getSchemaDummy('immunothe // key -> name of field, value -> unit tests const myUnitTests = { - 'cumulative_drug_dosage': [ + 'actual_cumulative_drug_dose': [ [ - 'cumulative_drug_dosage is submitted when prescribed_cumulative_drug_dosage is missing', + 'actual_cumulative_drug_dose is submitted when prescribed_cumulative_drug_dose is missing', true, loadObjects(immunotherapy, { - "cumulative_drug_dosage": 100 + "actual_cumulative_drug_dose": 100 } ) ], [ - 'prescibed_drug_dosage is submitted when cumulative_drug_dosage is missing', + 'prescribed_drug_dose is submitted when actual_cumulative_drug_dose is missing', true, loadObjects(immunotherapy, { - "prescribed_cumulative_drug_dosage": 150 + "prescribed_cumulative_drug_dose": 150 } ) ], [ - 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are submitted', + 'Both actual_cumulative_drug_dose and prescribed_cumulative_drug_dose are submitted', true, loadObjects(immunotherapy, { - "cumulative_drug_dosage": 300, - "prescribed_cumulative_drug_dosage": 350 + "actual_cumulative_drug_dose": 300, + "prescribed_cumulative_drug_dose": 350 } ) ] ], - 'prescribed_cumulative_drug_dosage': [ + 'prescribed_cumulative_drug_dose': [ [ - 'prescibed_cumulative_drug_dosage is submitted when cumulative_drug_dosage is missing', + 'prescribed_cumulative_drug_dose is submitted when actual_cumulative_drug_dose is missing', true, loadObjects(immunotherapy, { - "prescribed_cumulative_drug_dosage": 100 + "prescribed_cumulative_drug_dose": 100 } ) ], [ - 'cumlative__drug_dosage is submitted when prescribed_cumlative_drug_dosage is missing', + 'actual_cumlative__drug_dose is submitted when prescribed_cumlative_drug_dose is missing', true, loadObjects(immunotherapy, { - "cumulative_drug_dosage": 150 + "actual_cumulative_drug_dose": 150 } ) ], [ - 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are submitted', + 'Both actual_cumulative_drug_dose and prescribed_cumulative_drug_dose are submitted', true, loadObjects(immunotherapy, { - "cumulative_drug_dosage": 300, - "prescribed_cumulative_drug_dosage": 350 + "actual_cumulative_drug_dose": 300, + "prescribed_cumulative_drug_dose": 350 } ) ], [ - 'Both cumulative_drug_dosage and prescribed_cumulative_drug_dosage are missing', + 'Both actual_cumulative_drug_dose and prescribed_cumulative_drug_dose are missing', false, loadObjects(immunotherapy, { From 374fc1b122fb07be6af559da42dc8a7580ade9a7 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Fri, 16 Dec 2022 15:56:55 -0500 Subject: [PATCH 42/80] added 'response_to_treatment_criteria_method' to checkWhenNoTreatment.js check --- .../validationFunctions/treatment/checkWhenNoTreatment.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/references/validationFunctions/treatment/checkWhenNoTreatment.js b/references/validationFunctions/treatment/checkWhenNoTreatment.js index 02e9e837..871192e2 100644 --- a/references/validationFunctions/treatment/checkWhenNoTreatment.js +++ b/references/validationFunctions/treatment/checkWhenNoTreatment.js @@ -27,7 +27,7 @@ const validation = () => (function validate(inputs) { const {$row, $name, $field} = inputs; let result = {valid: true, message: "Ok"}; - const coreFields = ['is_primary_treatment', 'treatment_start_interval', 'treatment_duration', 'treatment_intent', 'treatment_setting', 'response_to_treatment']; + const coreFields = ['is_primary_treatment', 'treatment_start_interval', 'treatment_duration', 'treatment_intent', 'treatment_setting', 'response_to_treatment_criteria_method']; // checks for a string just consisting of whitespace const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; From 033c153af556be011a264790e3d78cb6bf58ca36 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Fri, 16 Dec 2022 17:26:21 -0500 Subject: [PATCH 43/80] added validationDependency and required flags where they were missing and corrected typo --- schemas/treatment.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/schemas/treatment.json b/schemas/treatment.json index 3b5d4046..a7a2c18d 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -188,6 +188,7 @@ "description": "Indicate the intended disease outcome for which the treatment is given. (Reference: NCIt C124307)", "valueType": "string", "restrictions": { + "required": true, "script": "#/script/treatment/checkWhenNoTreatment", "codeList": [ "Curative", @@ -206,6 +207,7 @@ "description": "Indicate the treatment setting, which describes the treatment's purpose in relation to the primary treatment. (Reference: NCIt C124308)", "valueType": "string", "restrictions": { + "required": true, "script": "#/script/treatment/checkWhenNoTreatment", "codeList": [ "Adjuvant", @@ -222,9 +224,10 @@ }, { "name": "response_to_treatment_criteria_method", - "description": "Indicate teh criteria used to assess the donor's overall response to the applied treatment regimen.", + "description": "Indicate the criteria used to assess the donor's overall response to the applied treatment regimen.", "valueType": "string", "restrictions": { + "required": true, "script": "#/script/treatment/checkWhenNoTreatment", "codeList": [ "ELN Dohner AML Oncology Response Criteria", @@ -239,6 +242,7 @@ "meta": { "core": true, "displayName": "Response To Treatment Criteria Method", + "validationDependency": true, "dependsOn": "treatment.treatment_type" } }, @@ -247,6 +251,7 @@ "description": "The donor's response to the applied treatment regimen. (Source: RECIST)", "valueType": "string", "restrictions": { + "required": true, "script": "#/script/treatment/responseToTreatment", "codeList": [ "Complete remission", @@ -301,6 +306,7 @@ }, "meta": { "displayName": "Outcome Of Treatment", + "validationDependency": true, "dependsOn": "treatment.treatment_type" } }, @@ -314,6 +320,7 @@ }, "meta": { "displayName": "Toxicity Type", + "validationDependency": true, "dependsOn": "treatment.outcome_of_treatment" } }, @@ -379,6 +386,7 @@ "valueType": "string", "meta": { "display name": "Clinical Trials Database", + "validationDependency": true, "notes": "If the clinical trials database you use is not included in the controlled terminology, please contact us at https://platform.icgc-argo.org/contact to request it be added." }, "restrictions": { From bc8f65e54ab37464952c9832a7cda38a7e8ff2db Mon Sep 17 00:00:00 2001 From: Hardeep Date: Mon, 19 Dec 2022 12:34:05 -0500 Subject: [PATCH 44/80] removed validationDependency on percent_tumour_cells_measurement_method field --- schemas/specimen.json | 1 - 1 file changed, 1 deletion(-) diff --git a/schemas/specimen.json b/schemas/specimen.json index fb78cba2..f3536ac4 100644 --- a/schemas/specimen.json +++ b/schemas/specimen.json @@ -340,7 +340,6 @@ "description": "Indicate method used to measure percent_tumour_cells.", "valueType": "string", "meta": { - "validationDependency": true, "core": true, "dependsOn": "sample_registration.tumour_normal_designation", "notes": "#/notes/if_tumour", From f436a0a77c1641e37533b47cefa628f2e090594b Mon Sep 17 00:00:00 2001 From: Hardeep Date: Mon, 19 Dec 2022 17:15:06 -0500 Subject: [PATCH 45/80] removed required:true and 'not applicable'. These fields are only required if there was treatment and there is already a validation check for it (checkWhenNoTreatment) --- schemas/treatment.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/schemas/treatment.json b/schemas/treatment.json index a7a2c18d..35fdcd4b 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -227,7 +227,6 @@ "description": "Indicate the criteria used to assess the donor's overall response to the applied treatment regimen.", "valueType": "string", "restrictions": { - "required": true, "script": "#/script/treatment/checkWhenNoTreatment", "codeList": [ "ELN Dohner AML Oncology Response Criteria", @@ -235,8 +234,7 @@ "iRECIST", "RECIST", "Response Assessment in Neuro-Oncology (RANO)", - "Physician Assessed Response Criteria", - "Not applicable" + "Physician Assessed Response Criteria" ] }, "meta": { @@ -251,7 +249,6 @@ "description": "The donor's response to the applied treatment regimen. (Source: RECIST)", "valueType": "string", "restrictions": { - "required": true, "script": "#/script/treatment/responseToTreatment", "codeList": [ "Complete remission", @@ -268,7 +265,6 @@ "Molecular relapse (after CRMRD-)", "Morphologic leukemia-free state", "No evidence of disease (NED)", - "Not applicable", "Partial remission", "Partial response", "Physician assessed complete response", From 1bf0746312731c1870802da9d1ef57e6ac0b2913 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Mon, 19 Dec 2022 17:16:08 -0500 Subject: [PATCH 46/80] updated validation script to remove 'not applicable' --- .../treatment/responseToTreatment.js | 13 ------------- tests/treatment/responseToTreatment.test.js | 10 ---------- 2 files changed, 23 deletions(-) diff --git a/references/validationFunctions/treatment/responseToTreatment.js b/references/validationFunctions/treatment/responseToTreatment.js index 0b30e7e9..f49fe4cc 100644 --- a/references/validationFunctions/treatment/responseToTreatment.js +++ b/references/validationFunctions/treatment/responseToTreatment.js @@ -91,11 +91,6 @@ const validation = () => 'physician assessed stable disease' ]; break; - case 'not applicable': - codeList = [ - 'not applicable' - ]; - break; default: codelist = []; } @@ -109,14 +104,6 @@ const validation = () => result.valid = false; result.message = msg; } - if ($field.trim().toLowerCase() === 'cannot be assessed') { - if ($row[tCategory].trim().toLowerCase() != 'tx' && $row[nCategory].trim().toLowerCase() != 'nx') { - result = { - valid: false, - message: `The submitted term '${$field}' is not permissible for '${row.response_treatment_criteria_method}'.` - }; - } - } } return result; }); diff --git a/tests/treatment/responseToTreatment.test.js b/tests/treatment/responseToTreatment.test.js index b6e401df..5c9dfb03 100644 --- a/tests/treatment/responseToTreatment.test.js +++ b/tests/treatment/responseToTreatment.test.js @@ -40,16 +40,6 @@ const myUnitTests = { } ) ], - [ - 'response_to_treatment_criteria_method is not applicable when response_to_treatment is "Not applicable"', - true, - loadObjects(treatment, - { - "response_to_treatment_criteria_method": "not applicable", - "response_to_treatment": "Not applicable", - } - ) - ], [ 'response_to_treatment_criteria_method is "eln dohner aml oncology response criteria" when response_to_treatment is "minor response"', false, From 2df654f1fc62f58ace3f1a4e2ab9c3871bd80e37 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 20 Dec 2022 13:10:21 -0500 Subject: [PATCH 47/80] changed code list in list.json file to have a separate field for yes and no. Updated affected schemas --- references/list.json | 3 ++- schemas/chemotherapy.json | 2 +- schemas/comorbidity.json | 4 ++-- schemas/family_history.json | 2 +- schemas/specimen.json | 2 +- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/references/list.json b/references/list.json index 7d0a6f4d..486c0bae 100644 --- a/references/list.json +++ b/references/list.json @@ -1,5 +1,6 @@ { - "yes_no": ["Yes", "No", "Unknown"], + "yes_no": ["Yes", "No"], + "yes_no_unk": ["Yes", "No", "Unknown"], "yes_no_na": ["Yes", "No", "Not applicable"], "yes_no_na_unk": ["Yes", "No", "Not applicable", "Unknown"], "exposure_usage": ["Never","Not applicable", "Unknown","Yes, currently","Yes, only in the past"], diff --git a/schemas/chemotherapy.json b/schemas/chemotherapy.json index 84012900..a4477f60 100644 --- a/schemas/chemotherapy.json +++ b/schemas/chemotherapy.json @@ -110,7 +110,7 @@ "description": "Indicate if there was a significant reduction in dose intensity.", "valueType": "string", "restrictions": { - "codeList": "#/list/yes_no" + "codeList": "#/list/yes_no_unk" }, "meta": { "displayName": "Dose Intensity Reduction" diff --git a/schemas/comorbidity.json b/schemas/comorbidity.json index 4e2f75d2..b04d6035 100644 --- a/schemas/comorbidity.json +++ b/schemas/comorbidity.json @@ -38,7 +38,7 @@ "name": "prior_malignancy", "description": "Prior malignancy affecting donor.", "restrictions": { - "codeList": "#/list/yes_no" + "codeList": "#/list/yes_no_unk" }, "valueType": "string", "meta": { @@ -96,7 +96,7 @@ "valueType": "string", "description": "Indicate if the patient is being treated for the comorbidity (this includes prior malignancies).", "restrictions": { - "codeList": "#/list/yes_no", + "codeList": "#/list/yes_no_unk", "script": "#/script/comorbidity/comorbidityOptionalFieldsCheck" }, "meta": { diff --git a/schemas/family_history.json b/schemas/family_history.json index acaad954..2fe485d3 100644 --- a/schemas/family_history.json +++ b/schemas/family_history.json @@ -52,7 +52,7 @@ "description": "Indicate if donor has any genetic relatives with a history of cancer. (Reference: NCIt C159104, caDSR CDE ID 6161023)", "name": "relative_with_cancer_history", "restrictions": { - "codeList": "#/list/yes_no" + "codeList": "#/list/yes_no_unk" }, "valueType": "string", "meta": { diff --git a/schemas/specimen.json b/schemas/specimen.json index bb6aa1b9..1b11d985 100644 --- a/schemas/specimen.json +++ b/schemas/specimen.json @@ -256,7 +256,7 @@ "displayName": "Reference Pathology Confirmed" }, "restrictions": { - "codeList": "#/list/yes_no" + "codeList": "#/list/yes_no_unk" } }, { From 0c3ca82d22124871c393d8a8d13cdc1e8cd7c108 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 20 Dec 2022 13:11:52 -0500 Subject: [PATCH 48/80] Updated validation script to allow is_primary_treatment and other core treatment fields to be empty if treatment_type = 'no treatment', since they are conditional --- .../treatment/checkWhenNoTreatment.js | 33 ++-------- schemas/treatment.json | 2 +- tests/treatment/checkWhenNoTreatment.test.js | 66 +------------------ 3 files changed, 10 insertions(+), 91 deletions(-) diff --git a/references/validationFunctions/treatment/checkWhenNoTreatment.js b/references/validationFunctions/treatment/checkWhenNoTreatment.js index 0f9f1edc..e082a621 100644 --- a/references/validationFunctions/treatment/checkWhenNoTreatment.js +++ b/references/validationFunctions/treatment/checkWhenNoTreatment.js @@ -19,46 +19,25 @@ */ /** - * If treatment_type is 'No treatment': - * - core fields accepting text should be submitted as 'Not applicable' - * - core fields accepting numbers should be left empty - * - if Extended field that accepts text is submitted, it should be submitted as 'Not applicable'. + * If treatment_type is 'No treatment', core treatment fields should not be submitted. */ const validation = () => (function validate(inputs) { const {$row, $name, $field} = inputs; let result = {valid: true, message: "Ok"}; - const coreNumberFields = ['treatment_start_interval', 'treatment_duration'] - const coreTextFields = ['is_primary_treatment', 'treatment_intent', 'treatment_setting', 'response_to_treatment'] + const coreFields = ['treatment_start_interval', 'treatment_duration', 'is_primary_treatment', 'treatment_intent', 'treatment_setting', 'response_to_treatment']; // checks for a string just consisting of whitespace const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; const treatmentType = ($row.treatment_type).map(value => value.toLowerCase()); - if ((!(treatmentType.includes("no treatment"))) && (coreTextFields.includes($name) || coreNumberFields.includes($name))) { - if (!$field || $field === null || checkforEmpty($field)) { + if (!treatmentType.includes("no treatment") && coreFields.includes($name) && (!$field || $field === null || checkforEmpty($field))) { result = { valid: false, message: `The '${$name}' field must be submitted when the 'treatment_type' field is '${treatmentType}'`}; - } - else { - if (coreTextFields.includes($name) && $field.trim().toLowerCase() === 'not applicable') { - result = { valid: false, message: `The '${$name}' field cannot be submitted as 'Not applicable' if the 'treatment_type' field is '${treatmentType}'`}; - } - } } - else if (treatmentType.includes("no treatment")) { - if ($field && $field != null && !(checkforEmpty($field))) { - if (coreNumberFields.includes($name) || typeof($field) === 'number') { - result = { valid: false, message: `The '${$name}' field cannot be submitted if the 'treatment_type' field is '${treatmentType}'`}; - } - else if ((coreTextFields.includes($name) || typeof($field) === 'string') && $field.trim().toLowerCase() != 'not applicable') { - result = { valid: false, message: `If '${$name}' field is submitted when the 'treatment_type' field is '${treatmentType}', it can only be submitted as 'Not applicable'.`}; - } - } - else { - if (coreTextFields.includes($name)) { - result = { valid: false, message: `If 'treatment_type' is '${treatmentType}', then the '${$name}' field must be submitted as 'Not applicable'.`}; - } + else if (treatmentType.includes("no treatment") && ($field && $field != null && !(checkforEmpty($field)))) { + if (coreFields.includes($name) || (typeof($field) === 'string' && $field.trim().toLowerCase() != 'not applicable') || typeof($field) === 'number') { + result = { valid: false, message: `The '${$name}' field cannot be submitted if the 'treatment_type' field is '${treatmentType}'`}; } } return result; diff --git a/schemas/treatment.json b/schemas/treatment.json index b7d884ab..9a00f366 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -99,7 +99,7 @@ "valueType": "string", "restrictions": { "script": "#/script/treatment/checkWhenNoTreatment", - "codeList": "#/list/yes_no_na" + "codeList": "#/list/yes_no" }, "meta": { "core": true, diff --git a/tests/treatment/checkWhenNoTreatment.test.js b/tests/treatment/checkWhenNoTreatment.test.js index 798b0505..3b8a50a2 100644 --- a/tests/treatment/checkWhenNoTreatment.test.js +++ b/tests/treatment/checkWhenNoTreatment.test.js @@ -123,7 +123,7 @@ const myUnitTests = { ], [ 'is_primary_treatment is not submitted when no treatment is given', - false, + true, loadObjects(treatment, { "is_primary_treatment": "", @@ -133,32 +133,12 @@ const myUnitTests = { ], [ 'is_primary_treatment is not submitted when no treatment is given', - false, - loadObjects(treatment, - { - "treatment_type": ["No treatment"] - } - ) - ], - [ - 'is_primary_treatment is not applicable when no treatment is given', true, loadObjects(treatment, { - "is_primary_treatment": "not applicable", "treatment_type": ["No treatment"] } ) - ], - [ - 'is_primary_treatment is not applicable when treatment is given', - false, - loadObjects(treatment, - { - "is_primary_treatment": "not applicable", - "treatment_type": ["Chemotherapy", "Surgery"] - } - ) ] ], 'treatment_setting': [ @@ -182,29 +162,9 @@ const myUnitTests = { } ) ], - [ - 'treatment_setting is submitted as not applicable when treatment is given', - false, - loadObjects(treatment, - { - "treatment_setting": "not applicable", - "treatment_type": ["Chemotherapy"] - } - ) - ], - [ - 'treatment_setting is submitted as not applicable when no treatment is given', - true, - loadObjects(treatment, - { - "treatment_setting": "Not Applicable", - "treatment_type": ["no treatment"] - } - ) - ], [ 'treatment_setting is not submitted when no treatment is given', - false, + true, loadObjects(treatment, { "treatment_type": ["no treatment"] @@ -234,29 +194,9 @@ const myUnitTests = { } ) ], - [ - 'treatment_intent is submitted as not applicable when treatment is given', - false, - loadObjects(treatment, - { - "treatment_intent": "not applicable", - "treatment_type": ["Radiation therapy"] - } - ) - ], - [ - 'treatment_intent is submitted as not applicable when no treatment is given', - true, - loadObjects(treatment, - { - "treatment_intent": "not applicable", - "treatment_type": ["no treatment"] - } - ) - ], [ 'treatment_intent is not submitted when no treatment is given', - false, + true, loadObjects(treatment, { "treatment_type": ["no treatment"] From 13f7ab86eef7586ff7c641bdb9b08b679918441b Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 20 Dec 2022 14:21:49 -0500 Subject: [PATCH 49/80] Updated valdiation script for the response_to_treatment field. --- schemas/treatment.json | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/schemas/treatment.json b/schemas/treatment.json index 35fdcd4b..88d0a56a 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -53,7 +53,9 @@ "valueType": "string", "description": "Indicate the primary diagnosis event in the clinical timeline that this treatment was related to.", "meta": { + "validationDependency": true, "primaryId": true, + "foreignKey": "primary_diagnosis.submitter_primary_diagnosis_id", "displayName": "Submitter Primary Diagnosis ID" }, "restrictions": { @@ -185,15 +187,20 @@ }, { "name": "treatment_intent", - "description": "Indicate the intended disease outcome for which the treatment is given. (Reference: NCIt C124307)", + "description": "Indicate the purpose of the treatment, or the desired effect or outcome resulting from the treatment. (Reference: mCODE/FHIR)", "valueType": "string", "restrictions": { - "required": true, "script": "#/script/treatment/checkWhenNoTreatment", "codeList": [ "Curative", + "Diagnostic", + "Forensic", + "Guidance", + "Not applicable", "Palliative", - "Unknown" + "Preventative", + "Screening", + "Supportive" ] }, "meta": { @@ -207,13 +214,19 @@ "description": "Indicate the treatment setting, which describes the treatment's purpose in relation to the primary treatment. (Reference: NCIt C124308)", "valueType": "string", "restrictions": { - "required": true, "script": "#/script/treatment/checkWhenNoTreatment", "codeList": [ "Adjuvant", "Advanced/Metastatic", + "Conditioning", + "Induction", + "Maintenance", + "Mobilization", "Neoadjuvant", - "Not applicable" + "Not applicable", + "Preventative", + "Radiosensitization", + "Salvage" ] }, "meta": { @@ -246,10 +259,10 @@ }, { "name": "response_to_treatment", - "description": "The donor's response to the applied treatment regimen. (Source: RECIST)", + "description": "The donor's overall response to the applied treatment regimen.", "valueType": "string", "restrictions": { - "script": "#/script/treatment/responseToTreatment", + "script": "#/script/treatment/responseToTreatmentCheck", "codeList": [ "Complete remission", "Complete remission with incomplete hematologic recovery (CRi)", @@ -302,7 +315,6 @@ }, "meta": { "displayName": "Outcome Of Treatment", - "validationDependency": true, "dependsOn": "treatment.treatment_type" } }, @@ -316,7 +328,6 @@ }, "meta": { "displayName": "Toxicity Type", - "validationDependency": true, "dependsOn": "treatment.outcome_of_treatment" } }, @@ -382,7 +393,6 @@ "valueType": "string", "meta": { "display name": "Clinical Trials Database", - "validationDependency": true, "notes": "If the clinical trials database you use is not included in the controlled terminology, please contact us at https://platform.icgc-argo.org/contact to request it be added." }, "restrictions": { From b96f82e1a63bcbfaabf5856166404965b099e999 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 20 Dec 2022 14:22:50 -0500 Subject: [PATCH 50/80] Updated checkWhenNoTreatment script to allow response_to_treatment fields to be empty if no treatment, since they are conditional core fields --- .../treatment/checkWhenNoTreatment.js | 33 +++++++------------ .../treatment/responseToTreatment.js | 17 +++++++--- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/references/validationFunctions/treatment/checkWhenNoTreatment.js b/references/validationFunctions/treatment/checkWhenNoTreatment.js index 871192e2..249d4689 100644 --- a/references/validationFunctions/treatment/checkWhenNoTreatment.js +++ b/references/validationFunctions/treatment/checkWhenNoTreatment.js @@ -19,37 +19,26 @@ */ /** - * If treatment_type is 'No treatment', the other core treatment fields should not be submitted. - * Ensure interval/duration fields are greater than 0 days + * If treatment_type is 'No treatment', core treatment fields should not be submitted. */ const validation = () => (function validate(inputs) { const {$row, $name, $field} = inputs; let result = {valid: true, message: "Ok"}; - const coreFields = ['is_primary_treatment', 'treatment_start_interval', 'treatment_duration', 'treatment_intent', 'treatment_setting', 'response_to_treatment_criteria_method']; + const coreFields = ['treatment_start_interval', 'treatment_duration', 'is_primary_treatment', 'treatment_intent', 'treatment_setting', 'response_to_treatment_criteria_method', 'response_to_treatment']; // checks for a string just consisting of whitespace const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; - - if ($row.treatment_type != null) { - const treatmentType = $row.treatment_type; - if (!(treatmentType.includes("No treatment"))) { - if (coreFields.includes($name)) { - if (!$field || checkforEmpty($field)) { - result = { - valid: false, - message: `The '${$name}' field must be submitted when 'treatment_type' is '${treatmentType}'`, - }; - } - } - } - else if (treatmentType.includes("No treatment") && ($field)) { - result = { - valid: false, - message: `The '${$name}' field should not be submitted if 'treatment_type' is set to '${treatmentType}'`, - }; - } + const treatmentType = ($row.treatment_type).map(value => value.toLowerCase()); + + if (!treatmentType.includes("no treatment") && coreFields.includes($name) && (!$field || $field === null || checkforEmpty($field))) { + result = { valid: false, message: `The '${$name}' field must be submitted when the 'treatment_type' field is '${treatmentType}'`}; + } + else if (treatmentType.includes("no treatment") && ($field && $field != null && !(checkforEmpty($field)))) { + if (coreFields.includes($name) || (typeof($field) === 'string' && $field.trim().toLowerCase() != 'not applicable') || typeof($field) === 'number') { + result = { valid: false, message: `The '${$name}' field cannot be submitted if the 'treatment_type' field is '${treatmentType}'`}; + } } return result; }); diff --git a/references/validationFunctions/treatment/responseToTreatment.js b/references/validationFunctions/treatment/responseToTreatment.js index f49fe4cc..f8d86d1c 100644 --- a/references/validationFunctions/treatment/responseToTreatment.js +++ b/references/validationFunctions/treatment/responseToTreatment.js @@ -31,9 +31,8 @@ const validation = () => /* checks for a string just consisting of whitespace */ const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; - - if ($field && $field != null && !(checkforEmpty($field))) { - let codeList = []; + let codeList = []; + switch ($row.response_to_treatment_criteria_method && $row.response_to_treatment_criteria_method.trim().toLowerCase()) { case 'eln dohner aml oncology response criteria': codeList = [ @@ -95,9 +94,10 @@ const validation = () => codelist = []; } + if ($field && $field != null && !(checkforEmpty($field))) { if (!codeList.includes($field.trim().toLowerCase()) && codeList.length) { - const msg = `'${$field}' is not a permissible value. When 'response_to_treatment_criteria' is set to '${ - $row.response_to_treatment_criteria_method}', '${$name}' field must be one of the following: \n${codeList + const msg = `'${$field}' is not a permissible value. When 'response_to_treatment_criteria_method' is set to '${ + $row.response_to_treatment_criteria_method}', the '${$name}' field must be one of the following: \n${codeList .map(code => `- "${code}"`) .join('\n')}`; @@ -105,6 +105,13 @@ const validation = () => result.message = msg; } } + else { + if ($row.response_to_treatment_criteria_method && $row.response_to_treatment_criteria_method != null && !(checkforEmpty($row.response_to_treatment_criteria_method))) { + result = { valid: false, message: `The '${$name}' field must be submitted when 'response_to_treatment_criteria_method' is set to '${$row.response_to_treatment_criteria_method}'. The '${$name}' field must be one of the following: \n${codeList + .map(code => `- "${code}"`) + .join('\n')}`}; + } + } return result; }); From c91b97a1d837db1bf3dce5f3f1a03cdc71b25c6f Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 20 Dec 2022 14:23:49 -0500 Subject: [PATCH 51/80] Combined two valdiation scripts --- .../treatment/responseToTreatmentCheck.js | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 references/validationFunctions/treatment/responseToTreatmentCheck.js diff --git a/references/validationFunctions/treatment/responseToTreatmentCheck.js b/references/validationFunctions/treatment/responseToTreatmentCheck.js new file mode 100644 index 00000000..8d0595f0 --- /dev/null +++ b/references/validationFunctions/treatment/responseToTreatmentCheck.js @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +const checkWhenNoTreatment = require('./checkWhenNoTreatment'); +const responseToTreatment = require('./responseToTreatment'); + + +module.exports = [ + checkWhenNoTreatment, + responseToTreatment +]; From fad754cd19422f5cd2dc559f178208d9515965ef Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 20 Dec 2022 14:24:23 -0500 Subject: [PATCH 52/80] added checks for updates done in validation scripts --- tests/treatment/checkWhenNoTreatment.test.js | 132 +++++++++++++------ tests/treatment/responseToTreatment.test.js | 10 +- 2 files changed, 101 insertions(+), 41 deletions(-) diff --git a/tests/treatment/checkWhenNoTreatment.test.js b/tests/treatment/checkWhenNoTreatment.test.js index 9334408c..a9c84120 100644 --- a/tests/treatment/checkWhenNoTreatment.test.js +++ b/tests/treatment/checkWhenNoTreatment.test.js @@ -36,7 +36,7 @@ const myUnitTests = { loadObjects(treatment, { "treatment_start_interval": 30, - "treatment_type": "No treatment" + "treatment_type": ["No treatment"] } ) ], @@ -46,7 +46,7 @@ const myUnitTests = { loadObjects(treatment, { "treatment_start_interval": 409, - "treatment_type": "Chemotherapy" + "treatment_type": ["Chemotherapy"] } ) ], @@ -55,19 +55,10 @@ const myUnitTests = { true, loadObjects(treatment, { - "treatment_type": "No treatment" + "treatment_type": ["No treatment"] } ) - ], - [ - 'treatment_start_interval is submitted but treatment_type is not submitted', - true, - loadObjects(treatment, - { - "treatment_start_interval": 30, - } - ) - ], + ] ], 'treatment_duration': [ [ @@ -76,7 +67,7 @@ const myUnitTests = { loadObjects(treatment, { "treatment_duration": 30, - "treatment_type": "No treatment" + "treatment_type": ["No treatment"] } ) ], @@ -86,7 +77,7 @@ const myUnitTests = { loadObjects(treatment, { "treatment_duration": 40, - "treatment_type": "Chemotherapy" + "treatment_type": ["Chemotherapy"] } ) ], @@ -95,7 +86,7 @@ const myUnitTests = { false, loadObjects(treatment, { - "treatment_type": "Surgery" + "treatment_type": ["Surgery"] } ) ] @@ -106,8 +97,7 @@ const myUnitTests = { false, loadObjects(treatment, { - "is_primary_treatment": "", - "treatment_type": "Chemotherapy" + "treatment_type": ["Chemotherapy"] } ) ], @@ -117,7 +107,7 @@ const myUnitTests = { loadObjects(treatment, { "is_primary_treatment": "Yes", - "treatment_type": "No treatment" + "treatment_type": ["No treatment"] } ) ], @@ -127,7 +117,7 @@ const myUnitTests = { loadObjects(treatment, { "is_primary_treatment": "No", - "treatment_type": "Chemotherapy" + "treatment_type": ["Chemotherapy"] } ) ], @@ -137,7 +127,16 @@ const myUnitTests = { loadObjects(treatment, { "is_primary_treatment": "", - "treatment_type": "No treatment" + "treatment_type": ["No treatment"] + } + ) + ], + [ + 'is_primary_treatment is not submitted when no treatment is given', + true, + loadObjects(treatment, + { + "treatment_type": ["No treatment"] } ) ] @@ -149,7 +148,7 @@ const myUnitTests = { loadObjects(treatment, { "treatment_setting": "neoadjuvant", - "treatment_type": "No treatment" + "treatment_type": ["No treatment"] } ) ], @@ -159,10 +158,20 @@ const myUnitTests = { loadObjects(treatment, { "treatment_setting": "adjuvant", - "treatment_type": "Chemotherapy" + "treatment_type": ["Chemotherapy"] + } + ) + ], + [ + 'treatment_setting is not submitted when no treatment is given', + true, + loadObjects(treatment, + { + "treatment_type": ["no treatment"] } ) ] + ], 'treatment_intent': [ [ @@ -171,7 +180,7 @@ const myUnitTests = { loadObjects(treatment, { "treatment_intent": "curative", - "treatment_type": "No treatment" + "treatment_type": ["No treatment"] } ) ], @@ -181,54 +190,97 @@ const myUnitTests = { loadObjects(treatment, { "treatment_intent": "palliative", - "treatment_type": "Chemotherapy" + "treatment_type": ["Chemotherapy"] + } + ) + ], + [ + 'treatment_intent is not submitted when no treatment is given', + true, + loadObjects(treatment, + { + "treatment_type": ["no treatment"] } ) ] + ], - 'line_of_treatment': [ + 'days_per_cycle': [ [ - 'line of treatment submitted even though no treatment was given', + 'days per cycle is submitted when Chemotherapy was given', + true, + loadObjects(treatment, + { + "days_per_cycle": 12, + "treatment_type": ["Chemotherapy"] + } + ) + ], + [ + 'days per cycle is submitted when no treatment was given', false, loadObjects(treatment, { - "line_of_treatment": 1, - "treatment_type": "No treatment" + "days_per_cycle": 10, + "treatment_type": ["no treatment"] + } + ) + ] + ], + 'outcome_of_treatment': [ + [ + 'outcome_of_treatment is submitted when no treatment was given', + false, + loadObjects(treatment, + { + "outcome_of_treatment": "treatment completed as prescribed", + "treatment_type": ["no treatment"] } ) ], [ - 'line of treatment not submitted when no treatment was given', + 'outcome_of_treatment is not applicable when no treatment was given', true, loadObjects(treatment, { - "treatment_type": "No treatment" + "outcome_of_treatment": "Not Applicable", + "treatment_type": ["no treatment"] } ) ], [ - 'line of treatment not submitted when Hormonal therapy given. Should not fail since this field is optional', + 'outcome_of_treatment is empty when no treatment was given', true, loadObjects(treatment, { - "line_of_treatment": "", - "treatment_type": "Hormonal therapy" + "outcome_of_treatment": "", + "treatment_type": ["no treatment"] } ) - ], + ] ], - 'days_per_cycle': [ + 'response_to_treatment_criteria_method': [ [ - 'days per cycle is submitted when Chemotherapy was given', - true, + 'response_to_treatment_criteria_method is submitted when no treatment was given', + false, loadObjects(treatment, { - "days_per_cycle": 12, - "treatment_type": "Chemotherapy" + "response_to_treatment_criteria_method": "RECIST", + "treatment_type": ["no treatment"] + } + ) + ], + [ + 'response_to_treatment_criteria_method is missing when radiation treatment was given', + false, + loadObjects(treatment, + { + "treatment_type": ["radiation therapy"] } ) ] ] + } describe("Common Tests",()=>{ diff --git a/tests/treatment/responseToTreatment.test.js b/tests/treatment/responseToTreatment.test.js index 5c9dfb03..fd42a62b 100644 --- a/tests/treatment/responseToTreatment.test.js +++ b/tests/treatment/responseToTreatment.test.js @@ -49,8 +49,16 @@ const myUnitTests = { "response_to_treatment": "minor response", } ) + ], + [ + 'response_to_treatment_criteria_method is recist and response_to_treatment is missing', + false, + loadObjects(treatment, + { + "response_to_treatment_criteria_method": "recist", + } + ) ] - ] }; From f7a797147cfb78ebfd7952a8b0a68d55e5a66cc0 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 20 Dec 2022 14:28:29 -0500 Subject: [PATCH 53/80] removed 'not applicable' from treatment_intent and treatment_setting fields. These fields are conditional and won't be required if there was no ttreatment --- schemas/treatment.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/schemas/treatment.json b/schemas/treatment.json index 88d0a56a..dbb9e90f 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -196,7 +196,6 @@ "Diagnostic", "Forensic", "Guidance", - "Not applicable", "Palliative", "Preventative", "Screening", @@ -223,7 +222,6 @@ "Maintenance", "Mobilization", "Neoadjuvant", - "Not applicable", "Preventative", "Radiosensitization", "Salvage" From 143b0b6d5010017b6d8284e18e24481bf5d41fc4 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Wed, 21 Dec 2022 15:43:08 -0500 Subject: [PATCH 54/80] Removed 'required:true' and added 'dependsOn' to lymph_nodes_examined_method field, because it should be empty if lymph_nodes_examined_status is 'no' --- schemas/primary_diagnosis.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemas/primary_diagnosis.json b/schemas/primary_diagnosis.json index 04c96de2..1b99aa6e 100644 --- a/schemas/primary_diagnosis.json +++ b/schemas/primary_diagnosis.json @@ -150,7 +150,6 @@ "description": "Indicate the method used to examine lymph nodes.", "valueType": "string", "restrictions": { - "required": true, "script": "#/script/primary_diagnosis/lymphNodesExaminedMethod", "codeList": [ "Imaging", @@ -160,6 +159,7 @@ }, "meta": { "core": true, + "dependsOn": "primary_diagnosis.lymph_nodes_examined_status", "displayName": "Method Used to Examine Lymph Nodes" } }, From 164d01730dcdc24dcae133bde416cbc07c3bc444 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Wed, 21 Dec 2022 16:17:34 -0500 Subject: [PATCH 55/80] updated validation script that makes rTNM optional --- .../requiredWhenProgressOrRelapseRecur.js | 17 ++++++++++++----- .../requiredWhenProgressOrRelapseRecur.test.js | 8 ++++---- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/references/validationFunctions/follow_up/baseScripts/requiredWhenProgressOrRelapseRecur.js b/references/validationFunctions/follow_up/baseScripts/requiredWhenProgressOrRelapseRecur.js index 2ed209db..ec34452e 100644 --- a/references/validationFunctions/follow_up/baseScripts/requiredWhenProgressOrRelapseRecur.js +++ b/references/validationFunctions/follow_up/baseScripts/requiredWhenProgressOrRelapseRecur.js @@ -38,12 +38,19 @@ const validation = () => /* checks for a string just consisting of whitespace */ const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; - - if ((!$field || checkforEmpty($field)) && (stateOfProgression(diseaseStatus) || relapseOrRecurrence)) { - result = {valid: false, message: `'${$name}' is a required field if 'disease_status_at_followup' is set a state of progression, relapse, or recurrence.` } + + if ($name === 'recurrence_tumour_staging_system') { + if (!(!$field || checkforEmpty($field)) && !stateOfProgression(diseaseStatus) && !relapseOrRecurrence) { + result = {valid: false, message: `'${$name}' should not be submitted if 'disease_status_at_followup' is not a state of progression, relapse, or recurrence.` } + } } - else if (!(!$field || checkforEmpty($field)) && !stateOfProgression(diseaseStatus) && !relapseOrRecurrence) { - result = {valid: false, message: `'${$name}' cannot be provided if 'disease_status_at_followup' is not a state of progression, relapse, or recurrence.` } + else { + if ((!$field || checkforEmpty($field)) && (stateOfProgression(diseaseStatus) || relapseOrRecurrence)) { + result = {valid: false, message: `'${$name}' is a required field if 'disease_status_at_followup' is set a state of progression, relapse, or recurrence.` } + } + else if (!(!$field || checkforEmpty($field)) && !stateOfProgression(diseaseStatus) && !relapseOrRecurrence) { + result = {valid: false, message: `'${$name}' should not be submitted if 'disease_status_at_followup' is not a state of progression, relapse, or recurrence.` } + } } } return result; diff --git a/tests/follow_up/requiredWhenProgressOrRelapseRecur.test.js b/tests/follow_up/requiredWhenProgressOrRelapseRecur.test.js index 624da917..80f20dee 100644 --- a/tests/follow_up/requiredWhenProgressOrRelapseRecur.test.js +++ b/tests/follow_up/requiredWhenProgressOrRelapseRecur.test.js @@ -162,7 +162,7 @@ const myUnitTests = { ], [ 'Disease status is relapse, without provided RTSS', - false, + true, loadObjects(followUp, { "disease_status_at_followup": "relapse or recurrence" @@ -171,7 +171,7 @@ const myUnitTests = { ], [ 'Disease status is distant progression, without provided RTSS', - false, + true, loadObjects(followUp, { "disease_status_at_followup": "distant progression" @@ -179,7 +179,7 @@ const myUnitTests = { ) ], [ - 'Disease status is loco-regional progression, without provided RTSS', + 'Disease status is loco-regional progression, with provided RTSS', true, loadObjects(followUp, { @@ -199,7 +199,7 @@ const myUnitTests = { ) ], [ - 'Disease status is no evidence of disease, without provided RTSS', + 'Disease status is no evidence of disease, with provided RTSS', false, loadObjects(followUp, { From 5b5eb839435ce1d018052c06ebd1758d0e78ac35 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Wed, 21 Dec 2022 16:29:42 -0500 Subject: [PATCH 56/80] updated description for cumulative_drug_dose fields to include the word 'cumulative'. Removed 'required:true' in the hormone_therapy file so either field is allowed to be missing --- schemas/chemotherapy.json | 4 ++-- schemas/hormone_therapy.json | 8 +++----- schemas/immunotherapy.json | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/schemas/chemotherapy.json b/schemas/chemotherapy.json index e3ea8cf0..8325865d 100644 --- a/schemas/chemotherapy.json +++ b/schemas/chemotherapy.json @@ -92,7 +92,7 @@ }, { "name": "prescribed_cumulative_drug_dose", - "description": "Indicate the total prescribed drug dose in the same units specified in chemotherapy_drug_dose_units.", + "description": "Indicate the total prescribed cumulative drug dose in the same units specified in chemotherapy_drug_dose_units.", "valueType": "number", "restrictions": { "script": "#/script/chemotherapy/drugDose", @@ -109,7 +109,7 @@ }, { "name": "actual_cumulative_drug_dose", - "description": "Indicate the total actual drug dose in the same units specified in chemotherapy_drug_dose_units.", + "description": "Indicate the total actual cumulative drug dose in the same units specified in chemotherapy_drug_dose_units.", "valueType": "number", "restrictions": { "script": "#/script/chemotherapy/drugDose", diff --git a/schemas/hormone_therapy.json b/schemas/hormone_therapy.json index 322967d9..948529de 100644 --- a/schemas/hormone_therapy.json +++ b/schemas/hormone_therapy.json @@ -90,10 +90,9 @@ }, { "name": "prescribed_cumulative_drug_dose", - "description": "Indicate the total prescribed drug dose in the same units specified in hormone_drug_dose_units.", + "description": "Indicate the total prescribed cumulative drug dose in the same units specified in hormone_drug_dose_units.", "valueType": "number", "restrictions": { - "required": true, "script": "#/script/hormone_therapy/drugDose", "range": { "exclusiveMin": 0 @@ -102,16 +101,15 @@ "meta": { "core": true, "displayName": "Prescribed Cumulative Drug Dose", - "dependsOn": "hormone_therapy.cumulative_drug_dose", + "dependsOn": "hormone_therapy.actual_cumulative_drug_dose", "notes": "Either the 'actual_cumulative_drug_dose' or the 'prescribed_cumulative_drug_dose' field must be submitted." } }, { "name": "actual_cumulative_drug_dose", - "description": "Indicate the total actual drug dose in the same units specified in hormone_drug_dose_units.", + "description": "Indicate the total actual cumulative drug dose in the same units specified in hormone_drug_dose_units.", "valueType": "number", "restrictions": { - "required": true, "script": "#/script/hormone_therapy/drugDose", "range": { "exclusiveMin": 0 diff --git a/schemas/immunotherapy.json b/schemas/immunotherapy.json index 218073a7..9fe1b3a4 100644 --- a/schemas/immunotherapy.json +++ b/schemas/immunotherapy.json @@ -110,7 +110,7 @@ }, { "name": "prescribed_cumulative_drug_dose", - "description": "Indicate the total prescribed drug dose in the same units specified in immunotherapy_drug_dose_units.", + "description": "Indicate the total prescribed cumulative drug dose in the same units specified in immunotherapy_drug_dose_units.", "valueType": "number", "restrictions": { "script": "#/script/immunotherapy/drugDose", @@ -127,7 +127,7 @@ }, { "name": "actual_cumulative_drug_dose", - "description": "Indicate the total actual drug dose in the same units specified in immunotherapy_drug_dose_units.", + "description": "Indicate the total actual cumulative drug dose in the same units specified in immunotherapy_drug_dose_units.", "valueType": "number", "restrictions": { "script": "#/script/immunotherapy/drugDose", From 6c250cd8ef7676b0ead404a798ac0dc4792d977c Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 22 Dec 2022 15:11:44 -0500 Subject: [PATCH 57/80] removed 'Tumour - unknown if derived from primary or metastatic' since SONG changes have not been deployed to PROD yet. Will add in future dictionary release when SONG ready --- schemas/sample_registration.json | 1 - 1 file changed, 1 deletion(-) diff --git a/schemas/sample_registration.json b/schemas/sample_registration.json index 292f9cba..cc9b498c 100644 --- a/schemas/sample_registration.json +++ b/schemas/sample_registration.json @@ -136,7 +136,6 @@ "Primary tumour - adjacent to normal", "Primary tumour", "Recurrent tumour", - "Tumour - unknown if derived from primary or metastatic", "Xenograft - derived from primary tumour", "Xenograft - derived from tumour cell line" ], From 83ce0a210ad49c3ff0d4603e574b1864cce10e92 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 22 Dec 2022 15:12:13 -0500 Subject: [PATCH 58/80] Updated response to treatment criteria terms and methods --- schemas/treatment.json | 58 ++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/schemas/treatment.json b/schemas/treatment.json index c99254a7..820d95b6 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -235,13 +235,13 @@ }, { "name": "response_to_treatment_criteria_method", - "description": "Indicate the criteria used to assess the donor's overall response to the applied treatment regimen.", + "description": "Indicate the criteria used to assess the donor's response to the applied treatment regimen.", "valueType": "string", "restrictions": { "script": "#/script/treatment/checkWhenNoTreatment", "codeList": [ - "ELN Dohner AML Oncology Response Criteria", - "Cheson Oncology Response Criteria", + "ELN Dohner AML 2017 Oncology Response Criteria", + "IWG Cheson AML 2003 Oncology Response Criteria", "iRECIST", "RECIST", "Response Assessment in Neuro-Oncology (RANO)", @@ -257,39 +257,43 @@ }, { "name": "response_to_treatment", - "description": "The donor's overall response to the applied treatment regimen.", + "description": "The donor's response to the applied treatment regimen.", "valueType": "string", "restrictions": { "script": "#/script/treatment/responseToTreatmentCheck", "codeList": [ - "Complete remission", - "Complete remission with incomplete hematologic recovery (CRi)", - "Complete remission without measurable residual disease (CR MRD-)", - "Complete response", - "Hematologic relapse (after CRMRD-, CR, CRi)", - "Immune complete response (iCR)", - "Immune confirmed progressive disease (iCPD)", - "Immune partial response (iPR)", - "Immune stable disease (iSD)", - "Immune uncomfirmed progressive disease (iUPD)", - "Minor response", - "Molecular relapse (after CRMRD-)", - "Morphologic leukemia-free state", - "No evidence of disease (NED)", - "Partial remission", - "Partial response", - "Physician assessed complete response", - "Physician assessed partial response", - "Physician assessed stable disease", - "Primary refractory disease", - "Progressive disease", - "Stable disease" + "Complete remission", + "Complete remission with incomplete hematologic recovery (CRi)", + "Complete remission without minimal residual disease (CRMRD-)", + "Complete response", + "Cytogenetic complete remission (CRc)", + "Hematologic relapse (after CRMRD-, CR, CRi)", + "Immune complete response (iCR)", + "Immune confirmed progressive disease (iCPD)", + "Immune partial response (iPR)", + "Immune stable disease (iSD)", + "Immune unconfirmed progressive disease (iUPD)", + "Minor response", + "Molecular complete remission (CRm)", + "Molecular relapse (after CRMRD-)", + "Morphologic complete remission", + "Morphologic complete remission with incomplete blood count recovery (CRi)", + "Morphologic leukemia-free state", + "No evidence of disease (NED)", + "Partial remission", + "Partial response", + "Physician assessed complete response", + "Physician assessed partial response", + "Physician assessed stable disease", + "Progressive disease", + "Stable disease" ] }, "meta": { "core": true, "displayName": "Response To Treatment", - "dependsOn": "treatment.response_to_treatment_criteria_method" + "dependsOn": "treatment.response_to_treatment_criteria_method", + "notes": "This field depends on the selected response_to_treatment_criteria_method. Please refer to the documentation for Response to Treatment Criteria: http://docs.icgc-argo.org/docs/submission/dictionary-overview#response-to-treatment-criteria" } }, { From c61eb424ea9626a67c50f2d2004f92c536e5e6b0 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 22 Dec 2022 15:12:50 -0500 Subject: [PATCH 59/80] Updated validation script and tests to reflect updated response criteria terms and methods --- .../treatment/responseToTreatment.js | 20 +++++++++---------- tests/treatment/responseToTreatment.test.js | 20 ++++++++++++++----- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/references/validationFunctions/treatment/responseToTreatment.js b/references/validationFunctions/treatment/responseToTreatment.js index f8d86d1c..9abc07d0 100644 --- a/references/validationFunctions/treatment/responseToTreatment.js +++ b/references/validationFunctions/treatment/responseToTreatment.js @@ -34,26 +34,26 @@ const validation = () => let codeList = []; switch ($row.response_to_treatment_criteria_method && $row.response_to_treatment_criteria_method.trim().toLowerCase()) { - case 'eln dohner aml oncology response criteria': + case 'eln dohner aml 2017 oncology response criteria': codeList = [ 'complete remission', 'complete remission with incomplete hematologic recovery (cri)', - 'complete remission without measurable residual disease (cr mrd-)', + 'complete remission without minimal residual disease (crmrd-)', 'hematologic relapse (after crmrd-, cr, cri)', 'molecular relapse (after crmrd-)', - 'morphologic leukemia-free state', 'partial remission', - 'primary refractory disease', 'progressive disease', 'stable disease' ]; break; - case 'cheson oncology response criteria': + case 'iwg cheson aml 2003 oncology response criteria': codeList = [ - 'complete remission', - 'partial remission', - 'progressive disease', - 'stable disease' + 'cytogenetic complete remission (crc)', + 'molecular complete remission (crm)', + 'morphologic complete remission', + 'morphologic complete remission with incomplete blood count recovery (cri)', + 'morphologic leukemia-free state', + 'partial remission' ]; break; case 'irecist': @@ -62,7 +62,7 @@ const validation = () => 'immune confirmed progressive disease (icpd)', 'immune partial response (ipr)', 'immune stable disease (isd)', - 'immune uncomfirmed progressive disease (iupd)' + 'immune unconfirmed progressive disease (iupd)' ]; break; case 'recist': diff --git a/tests/treatment/responseToTreatment.test.js b/tests/treatment/responseToTreatment.test.js index fd42a62b..9808e963 100644 --- a/tests/treatment/responseToTreatment.test.js +++ b/tests/treatment/responseToTreatment.test.js @@ -31,21 +31,31 @@ const treatment = require('../constructDummyData').getSchemaDummy('treatment'); const myUnitTests = { 'response_to_treatment': [ [ - 'response_to_treatment_criteria_method is Cheson Oncology Response Criteria, response_to_treatment is "Stable disease"', - true, + 'response_to_treatment_criteria_method is IWG Cheson AML 2003 Oncology Response Criteria, response_to_treatment is "Stable disease" which does not exist', + false, loadObjects(treatment, { - "response_to_treatment_criteria_method": "Cheson Oncology response criteria", + "response_to_treatment_criteria_method": "IWG Cheson AML 2003 Oncology Response Criteria", "response_to_treatment": "stable Disease", } ) ], [ - 'response_to_treatment_criteria_method is "eln dohner aml oncology response criteria" when response_to_treatment is "minor response"', + 'response_to_treatment_criteria_method is "Response Assessment in Neuro-Oncology (RANO)" when response_to_treatment is "minor response"', + true, + loadObjects(treatment, + { + "response_to_treatment_criteria_method": "Response Assessment in Neuro-Oncology (RANO)", + "response_to_treatment": "minor response", + } + ) + ], + [ + 'response_to_treatment_criteria_method is "recist" when response_to_treatment is "minor response"', false, loadObjects(treatment, { - "response_to_treatment_criteria_method": "eln dohner aml oncology response criteria", + "response_to_treatment_criteria_method": "recist", "response_to_treatment": "minor response", } ) From 9f6e89efcd60e0e8323e00a0704d6d0dcdfbbb4f Mon Sep 17 00:00:00 2001 From: Hardeep Date: Mon, 20 Mar 2023 16:23:20 -0400 Subject: [PATCH 60/80] Adding new specimen_type term back in, now that SONG has been updated --- schemas/sample_registration.json | 1 + 1 file changed, 1 insertion(+) diff --git a/schemas/sample_registration.json b/schemas/sample_registration.json index cc9b498c..292f9cba 100644 --- a/schemas/sample_registration.json +++ b/schemas/sample_registration.json @@ -136,6 +136,7 @@ "Primary tumour - adjacent to normal", "Primary tumour", "Recurrent tumour", + "Tumour - unknown if derived from primary or metastatic", "Xenograft - derived from primary tumour", "Xenograft - derived from tumour cell line" ], From dbb7d3e997a1bde5091dde62bd5e1ce0289932f5 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 23 Mar 2023 15:43:48 -0400 Subject: [PATCH 61/80] changed anatomic_site_progression_or_recurrence field to accept multiple values --- schemas/follow_up.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/schemas/follow_up.json b/schemas/follow_up.json index 8bc89caa..8d800f68 100644 --- a/schemas/follow_up.json +++ b/schemas/follow_up.json @@ -208,9 +208,10 @@ } }, { - "description": "Indicate the ICD-O-3 topography code for the anatomic site where disease progression, relapse or recurrence occurred, according to the International Classification of Diseases for Oncology, 3rd Edition (WHO ICD-O-3). Refer to the ICD-O-3 manual for guidelines at https://apps.who.int/iris/handle/10665/42344.", + "description": "Indicate the ICD-O-3 topography code for the anatomic site(s) where disease progression, relapse or recurrence occurred, according to the International Classification of Diseases for Oncology, 3rd Edition (WHO ICD-O-3). Refer to the ICD-O-3 manual for guidelines at https://apps.who.int/iris/handle/10665/42344.", "name": "anatomic_site_progression_or_recurrence", "valueType": "string", + "isArray": true, "restrictions": { "script": "#/script/follow_up/anatomic_site_progression_or_recurrence", "regex": "^[C][0-9]{2}(.[0-9]{1})?$" @@ -220,7 +221,7 @@ "dependsOn": "follow_up.disease_status_at_followup", "displayName": "Anatomic Site Progression or Recurrences", "examples": "C50.1,C18", - "notes": "#/notes/disease_status_requirement" + "notes": "This field is required to be submitted if disease_status_at_followup indicates a state of progression, relapse, or recurrence.\nTo include multiple values, separate values with a pipe delimiter '|' within your file." } }, { From f8928319dd6529bc16c950798c3eb53e11671b6b Mon Sep 17 00:00:00 2001 From: Hardeep Date: Fri, 21 Apr 2023 12:31:10 -0400 Subject: [PATCH 62/80] Updated unit tests to account for missing required 'lymph_nodes_examined_status' field --- tests/primary_diagnosis/lymphNodesExaminedMethod.test.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/primary_diagnosis/lymphNodesExaminedMethod.test.js b/tests/primary_diagnosis/lymphNodesExaminedMethod.test.js index a1117d84..cbf11acb 100644 --- a/tests/primary_diagnosis/lymphNodesExaminedMethod.test.js +++ b/tests/primary_diagnosis/lymphNodesExaminedMethod.test.js @@ -77,7 +77,16 @@ const myUnitTests = { "lymph_nodes_examined_status": "Not applicable" } ) + ], + [ + 'lymph_nodes_examined_status is missing and lymph_nodes_examined_method not submitted', + false, + loadObjects(primary_diagnosis, + { + } + ) ] + ] } From c9ff2d3a9a7b851ce6d84f5be21364a3564a1cc5 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Fri, 21 Apr 2023 12:31:46 -0400 Subject: [PATCH 63/80] Updated validation script to check required 'lymph_nodes_examined_status' field --- .../lymphNodesExaminedMethod.js | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod.js b/references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod.js index 986defc6..644a5cdc 100644 --- a/references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod.js +++ b/references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod.js @@ -30,21 +30,25 @@ const validation = () => let result = {valid: true, message: "Ok"}; const notExamined = ['cannot be determined', 'no', 'no lymph nodes found in resected specimen', 'not applicable']; - const lymphNodesExaminedStatus = $row.lymph_nodes_examined_status.trim().toLowerCase(); - /* checks for a string just consisting of whitespace */ const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; - - if (!$field || $field === null || checkforEmpty($field)) { - if (lymphNodesExaminedStatus === 'yes') { - result = { valid: false, message: `The '${$name}' field must be submitted if the 'lymph_nodes_examined_status' field is 'Yes'`}; - } + if ($row.lymph_nodes_examined_status === null) { + result = {valid: false, message: `The 'lymph_nodes_examined_status' field must be submitted.`}; } else { - if (notExamined.includes(lymphNodesExaminedStatus)) { - result = { valid: false, message: `The '${$name}' field should not be submitted if the 'lymph_nodes_examined_status' field is '${lymphNodesExaminedStatus}'`}; - } + const lymphNodesExaminedStatus = $row.lymph_nodes_examined_status.trim().toLowerCase(); + + if (!$field || $field === null || checkforEmpty($field)) { + if (lymphNodesExaminedStatus === 'yes') { + result = { valid: false, message: `The '${$name}' field must be submitted if the 'lymph_nodes_examined_status' field is 'Yes'`}; + } + } + else { + if (notExamined.includes(lymphNodesExaminedStatus)) { + result = { valid: false, message: `The '${$name}' field should not be submitted if the 'lymph_nodes_examined_status' field is '${lymphNodesExaminedStatus}'`}; + } + } } return result; }); From 9c73264ee30b8635120fd070d0e201e35434356b Mon Sep 17 00:00:00 2001 From: Hardeep Date: Fri, 21 Apr 2023 14:37:14 -0400 Subject: [PATCH 64/80] Additional fixes to validation script for 'lymph_nodes_examined_method'. Added check for when field is not submitted, empty or null --- .../primary_diagnosis/lymphNodesExaminedMethod.js | 2 +- tests/primary_diagnosis/lymphNodesExaminedMethod.test.js | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod.js b/references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod.js index 644a5cdc..8076d439 100644 --- a/references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod.js +++ b/references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod.js @@ -33,7 +33,7 @@ const validation = () => /* checks for a string just consisting of whitespace */ const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; - if ($row.lymph_nodes_examined_status === null) { + if (!$row.lymph_nodes_examined_status || $row.lymph_nodes_examined_status === null || checkforEmpty($row.lymph_nodes_examined_status)) { result = {valid: false, message: `The 'lymph_nodes_examined_status' field must be submitted.`}; } else { diff --git a/tests/primary_diagnosis/lymphNodesExaminedMethod.test.js b/tests/primary_diagnosis/lymphNodesExaminedMethod.test.js index cbf11acb..aacfb46b 100644 --- a/tests/primary_diagnosis/lymphNodesExaminedMethod.test.js +++ b/tests/primary_diagnosis/lymphNodesExaminedMethod.test.js @@ -78,6 +78,15 @@ const myUnitTests = { } ) ], + [ + 'lymph_nodes_examined_method is missing', + false, + loadObjects(primary_diagnosis, + { + "lymph_nodes_examined_method": null + } + ) + ], [ 'lymph_nodes_examined_status is missing and lymph_nodes_examined_method not submitted', false, From a714723a2d550a55263864b764d0095bf8b04223 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Tue, 9 May 2023 14:51:16 -0400 Subject: [PATCH 65/80] Updated 'examples' for the 'anatomic_site_progression_or_recurrence' field by replacing comma character with '|' character to indicate it accepts multiple values --- schemas/follow_up.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemas/follow_up.json b/schemas/follow_up.json index 8d800f68..2cc731a0 100644 --- a/schemas/follow_up.json +++ b/schemas/follow_up.json @@ -220,7 +220,7 @@ "core": true, "dependsOn": "follow_up.disease_status_at_followup", "displayName": "Anatomic Site Progression or Recurrences", - "examples": "C50.1,C18", + "examples": "C50.1|C18", "notes": "This field is required to be submitted if disease_status_at_followup indicates a state of progression, relapse, or recurrence.\nTo include multiple values, separate values with a pipe delimiter '|' within your file." } }, From c31ff45243857e09f86f0edb871d35c2342af947 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 8 Jun 2023 10:55:25 -0400 Subject: [PATCH 66/80] Updated valdiation script for lymph_nodes_examined_method to take into account when lymph_nodes_examined_status has exception value 'unknown' --- .../lymphNodesExaminedMethod.js | 2 +- .../lymphNodesExaminedMethod.test.js | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod.js b/references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod.js index 8076d439..2a96a87e 100644 --- a/references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod.js +++ b/references/validationFunctions/primary_diagnosis/lymphNodesExaminedMethod.js @@ -29,7 +29,7 @@ const validation = () => const {$row, $name, $field} = inputs; let result = {valid: true, message: "Ok"}; - const notExamined = ['cannot be determined', 'no', 'no lymph nodes found in resected specimen', 'not applicable']; + const notExamined = ['cannot be determined', 'no', 'no lymph nodes found in resected specimen', 'not applicable', 'unknown']; /* checks for a string just consisting of whitespace */ const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; diff --git a/tests/primary_diagnosis/lymphNodesExaminedMethod.test.js b/tests/primary_diagnosis/lymphNodesExaminedMethod.test.js index aacfb46b..2fb9ec08 100644 --- a/tests/primary_diagnosis/lymphNodesExaminedMethod.test.js +++ b/tests/primary_diagnosis/lymphNodesExaminedMethod.test.js @@ -60,6 +60,26 @@ const myUnitTests = { } ) ], + [ + 'lymph nodes examined status is unknown and lymph_nodes_examined_method is left blank', + true, + loadObjects(primary_diagnosis, + { + "lymph_nodes_examined_status": "Unknown", + "lymph_nodes_examined_method": "" + } + ) + ], + [ + 'lymph nodes examined status is unknown and lymph_nodes_examined_method is submitted', + false, + loadObjects(primary_diagnosis, + { + "lymph_nodes_examined_status": "Unknown", + "lymph_nodes_examined_method": "Imaging" + } + ) + ], [ 'lymph nodes were examined and lymph_nodes_examined_method not submitted', false, From 28b5e238a4d5f534a640392d6f039bbf2be4878f Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 8 Jun 2023 11:37:36 -0400 Subject: [PATCH 67/80] Updated tumour_grade validation script to take into account exception values ("unknown" and "not applicable") on tumour_grading_system --- .../validationFunctions/specimen/tumourGrade.js | 6 ++++++ tests/specimen/tumourGrade.test.js | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/references/validationFunctions/specimen/tumourGrade.js b/references/validationFunctions/specimen/tumourGrade.js index 4f925040..068a4343 100644 --- a/references/validationFunctions/specimen/tumourGrade.js +++ b/references/validationFunctions/specimen/tumourGrade.js @@ -95,6 +95,12 @@ const validation = () => case 'nuclear grading system for dcis': codeList = tieredGradingList; break; + case 'unknown': + codeList = ['unknown']; + break; + case 'not applicable': + codeList = ['not applicable']; + break; } if (!codeList.includes($field.trim().toLowerCase())) { diff --git a/tests/specimen/tumourGrade.test.js b/tests/specimen/tumourGrade.test.js index 538228d6..fe920ed7 100644 --- a/tests/specimen/tumourGrade.test.js +++ b/tests/specimen/tumourGrade.test.js @@ -203,6 +203,22 @@ const unitTests = [ tumour_grade: 'g4' }), ], + [ + 'tumour_grading_system has an exception value of "not applicable", while tumour_grade is submitted as "G3"', + false, + loadObjects(specimen, { + tumour_grading_system: 'Not applicable', + tumour_grade: 'G3', + }), + ], + [ + 'tumour_grading_system has an exception value of "unknown", while tumour_grade is submitted as "G2"', + false, + loadObjects(specimen, { + tumour_grading_system: 'unknown', + tumour_grade: 'G2', + }), + ], // [ // 'both grade system and grade are undefined', // false, From ed30bad516a457c69476520da563b263c983c5b3 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Fri, 28 Jul 2023 18:17:17 -0400 Subject: [PATCH 68/80] Added 'validationDependecy' field to each of the actual/prescribed dose fields --- schemas/chemotherapy.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/schemas/chemotherapy.json b/schemas/chemotherapy.json index 8325865d..d0bdb4c6 100644 --- a/schemas/chemotherapy.json +++ b/schemas/chemotherapy.json @@ -103,6 +103,7 @@ "meta": { "core": true, "displayName": "Prescribed Cumulative Drug Dose", + "validationDependency": true, "dependsOn": "chemotherapy.actual_cumulative_drug_dose", "notes": "Either the 'actual_cumulative_drug_dose' or the 'prescribed_cumulative_drug_dose' field must be submitted." } @@ -120,6 +121,7 @@ "meta": { "core": true, "displayName": "Actual Cumulative Drug Dose", + "validationDependency": true, "dependsOn": "chemotherapy.prescribed_cumulative_drug_dose", "notes": "Either the 'actual_cumulative_drug_dose' or the 'prescribed_cumulative_drug_dose' field must be submitted." } From 6857a0f3ee5b370bbe0ae382de3dfaa5cb6edcbc Mon Sep 17 00:00:00 2001 From: Hardeep Date: Fri, 28 Jul 2023 18:18:46 -0400 Subject: [PATCH 69/80] Updated drugDose validation script to check 'chemotherapy_drug_dose_units' field for exception value of 'not applicable' and then check that the prescribed and actual drug dose fields are not submitted --- .../chemotherapy/drugDose.js | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/references/validationFunctions/chemotherapy/drugDose.js b/references/validationFunctions/chemotherapy/drugDose.js index 28ab2344..cfc56539 100644 --- a/references/validationFunctions/chemotherapy/drugDose.js +++ b/references/validationFunctions/chemotherapy/drugDose.js @@ -33,12 +33,23 @@ const validation = () => // checks for a string just consisting of whitespace const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; - - if ( (!$field || $field === null || checkforEmpty($field)) && (!($row[checkField]) || $row[checkField] === null || checkforEmpty(!($row[checkField])))) { - result = { - valid: false, - message: `Either the 'actual_cumulative_drug_dose' or the 'prescribed_cumulative_drug_dose' fields must be submitted.` - }; + + // Check for when chemotherapy dose has a clinical exception value of 'not applicable' + if ($row.chemotherapy_drug_dose_units && $row.chemotherapy_drug_dose_units != null && !(checkforEmpty($row.chemotherapy_drug_dose_units)) && $row.chemotherapy_drug_dose_units.trim().toLowerCase() === 'not applicable') { + if ($field && $field != null && !(checkforEmpty($field))) { + result = { + valid: false, + message: `The '${$name}' field cannot be submitted when 'chemotherapy_drug_dose_units' = 'Not applicable'` + }; + } + } + else { + if ( (!$field || $field === null || checkforEmpty($field)) && (!($row[checkField]) || $row[checkField] === null || checkforEmpty(!($row[checkField])))) { + result = { + valid: false, + message: `Either the 'actual_cumulative_drug_dose' or the 'prescribed_cumulative_drug_dose' fields must be submitted.` + }; + } } return result; }); From 540c7fa01bf398881fa1057a631026626a34cfb0 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Fri, 28 Jul 2023 18:19:44 -0400 Subject: [PATCH 70/80] added unit tests checking 'chemotherapy_drug_dose_units' for exception value of 'not applicable' and prescribed/actual drug dose field values --- tests/chemotherapy/drugDose.test.js | 38 +++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/chemotherapy/drugDose.test.js b/tests/chemotherapy/drugDose.test.js index 32326c3b..fe02e8e3 100644 --- a/tests/chemotherapy/drugDose.test.js +++ b/tests/chemotherapy/drugDose.test.js @@ -57,6 +57,25 @@ const myUnitTests = { "prescribed_cumulative_drug_dose": 350 } ) + ], + [ + 'chemotherapy_drug_dose_units is not applicable and actual_cumulative_drug_dose is submitted', + false, + loadObjects(chemotherapy, + { + "chemotherapy_drug_dose_units": 'not applicable', + "actual_cumulative_drug_dose": 300, + } + ) + ], + [ + 'chemotherapy_drug_dose_units is not applicable and actual_cumulative_drug_dose is not submitted', + true, + loadObjects(chemotherapy, + { + "chemotherapy_drug_dose_units": 'not applicable' + } + ) ] ], 'prescribed_cumulative_drug_dose': [ @@ -88,6 +107,25 @@ const myUnitTests = { } ) ], + [ + 'chemotherapy_drug_dose_units is not applicable and prescribed_cumulative_drug_dose is submitted', + false, + loadObjects(chemotherapy, + { + "chemotherapy_drug_dose_units": 'not applicable', + "prescribed_cumulative_drug_dose": 350 + } + ) + ], + [ + 'chemotherapy_drug_dose_units is not applicable and prescribed_cumulative_drug_dose is not submitted', + true, + loadObjects(chemotherapy, + { + "chemotherapy_drug_dose_units": 'not applicable' + } + ) + ], [ 'Both cumulative_drug_dose and prescribed_cumulative_drug_dose are missing', false, From 96eba9c6057aef2b0938ecf00eb686edf6f0a0ba Mon Sep 17 00:00:00 2001 From: Dan Date: Mon, 11 Sep 2023 10:10:44 -0400 Subject: [PATCH 71/80] =?UTF-8?q?=F0=9F=95=B7=EF=B8=8F=20#405=20Updated=20?= =?UTF-8?q?Submitter=20Donor=20Id=20Regex=20(#412)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Regex w/ Unit Tests * Remove Logging * Move to Common * Revise Shared Logic, Add PD Test --- package-lock.json | 4552 ++++++++++------- references/regex.json | 2 +- .../common/submitterIdRegex.js | 47 + tests/common/submitterIdRegex.test.js | 91 + 4 files changed, 2962 insertions(+), 1730 deletions(-) create mode 100644 references/validationFunctions/common/submitterIdRegex.js create mode 100644 tests/common/submitterIdRegex.test.js diff --git a/package-lock.json b/package-lock.json index df77f9f6..2b6a180a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,24 +1,39 @@ { "name": "dictionary", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@babel/code-frame": { + "packages": { + "": { + "name": "dictionary", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "auto-load": "^3.0.4", + "chalk": "^3.0.0", + "inquirer": "^7.0.1", + "jest": "^25.2.3", + "json-beautify": "^1.1.1", + "prettier": "^1.19.1", + "querystring": "^0.2.0", + "yargs": "^15.0.2" + } + }, + "node_modules/@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, - "requires": { + "dependencies": { "@babel/highlight": "^7.8.3" } }, - "@babel/core": { + "node_modules/@babel/core": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.8.3", "@babel/generator": "^7.9.0", "@babel/helper-module-transforms": "^7.9.0", @@ -36,100 +51,113 @@ "semver": "^5.4.1", "source-map": "^0.5.0" }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "ms": "^2.1.1" + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" } }, - "@babel/generator": { + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { "version": "7.9.4", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.9.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } } }, - "@babel/helper-function-name": { + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-function-name": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-get-function-arity": "^7.8.3", "@babel/template": "^7.8.3", "@babel/types": "^7.8.3" } }, - "@babel/helper-get-function-arity": { + "node_modules/@babel/helper-get-function-arity": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.8.3" } }, - "@babel/helper-member-expression-to-functions": { + "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.8.3" } }, - "@babel/helper-module-imports": { + "node_modules/@babel/helper-module-imports": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.8.3" } }, - "@babel/helper-module-transforms": { + "node_modules/@babel/helper-module-transforms": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-module-imports": "^7.8.3", "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-simple-access": "^7.8.3", @@ -139,173 +167,195 @@ "lodash": "^4.17.13" } }, - "@babel/helper-optimise-call-expression": { + "node_modules/@babel/helper-optimise-call-expression": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.8.3" } }, - "@babel/helper-plugin-utils": { + "node_modules/@babel/helper-plugin-utils": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true }, - "@babel/helper-replace-supers": { + "node_modules/@babel/helper-replace-supers": { "version": "7.8.6", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", "@babel/traverse": "^7.8.6", "@babel/types": "^7.8.6" } }, - "@babel/helper-simple-access": { + "node_modules/@babel/helper-simple-access": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", "dev": true, - "requires": { + "dependencies": { "@babel/template": "^7.8.3", "@babel/types": "^7.8.3" } }, - "@babel/helper-split-export-declaration": { + "node_modules/@babel/helper-split-export-declaration": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.8.3" } }, - "@babel/helper-validator-identifier": { + "node_modules/@babel/helper-validator-identifier": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", "dev": true }, - "@babel/helpers": { + "node_modules/@babel/helpers": { "version": "7.9.2", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", "dev": true, - "requires": { + "dependencies": { "@babel/template": "^7.8.3", "@babel/traverse": "^7.9.0", "@babel/types": "^7.9.0" } }, - "@babel/highlight": { + "node_modules/@babel/highlight": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "@babel/parser": { + "node_modules/@babel/parser": { "version": "7.9.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", - "dev": true + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/plugin-syntax-bigint": { + "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-object-rest-spread": { + "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/template": { + "node_modules/@babel/template": { "version": "7.8.6", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.8.3", "@babel/parser": "^7.8.6", "@babel/types": "^7.8.6" } }, - "@babel/traverse": { + "node_modules/@babel/traverse": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.8.3", "@babel/generator": "^7.9.0", "@babel/helper-function-name": "^7.8.3", @@ -315,88 +365,102 @@ "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" - }, + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "ms": "^2.1.1" } }, - "@babel/types": { + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/types": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-validator-identifier": "^7.9.0", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, - "@bcoe/v8-coverage": { + "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "@cnakazawa/watch": { + "node_modules/@cnakazawa/watch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "dev": true, - "requires": { + "dependencies": { "exec-sh": "^0.3.2", "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" } }, - "@istanbuljs/load-nyc-config": { + "node_modules/@istanbuljs/load-nyc-config": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "@istanbuljs/schema": { + "node_modules/@istanbuljs/schema": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "@jest/console": { + "node_modules/@jest/console": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.2.3.tgz", "integrity": "sha512-k+37B1aSvOt9tKHWbZZSOy1jdgzesB0bj96igCVUG1nAH1W5EoUfgc5EXbBVU08KSLvkVdWopLXaO3xfVGlxtQ==", "dev": true, - "requires": { + "dependencies": { "@jest/source-map": "^25.2.1", "chalk": "^3.0.0", "jest-util": "^25.2.3", "slash": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@jest/core": { + "node_modules/@jest/core": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.2.3.tgz", "integrity": "sha512-Ifz3aEkGvZhwijLMmWa7sloZVEMdxpzjFv3CKHv3eRYRShTN8no6DmyvvxaZBjLalOlRalJ7HDgc733J48tSuw==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^25.2.3", "@jest/reporters": "^25.2.3", "@jest/test-result": "^25.2.3", @@ -426,48 +490,58 @@ "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@jest/core/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "@jest/environment": { + "node_modules/@jest/environment": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.2.3.tgz", "integrity": "sha512-zRypAMQnNo8rD0rCbI9+5xf+Lu+uvunKZNBcIWjb3lTATSomKbgYO+GYewGDYn7pf+30XCNBc6SH1rnBUN1ioA==", "dev": true, - "requires": { + "dependencies": { "@jest/fake-timers": "^25.2.3", "@jest/types": "^25.2.3", "jest-mock": "^25.2.3" + }, + "engines": { + "node": ">= 8.3" } }, - "@jest/fake-timers": { + "node_modules/@jest/fake-timers": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.2.3.tgz", "integrity": "sha512-B6Qxm86fl613MV8egfvh1mRTMu23hMNdOUjzPhKl/4Nm5cceHz6nwLn0nP0sJXI/ue1vu71aLbtkgVBCgc2hYA==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^25.2.3", "jest-message-util": "^25.2.3", "jest-mock": "^25.2.3", "jest-util": "^25.2.3", "lolex": "^5.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@jest/reporters": { + "node_modules/@jest/reporters": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.2.3.tgz", "integrity": "sha512-S0Zca5e7tTfGgxGRvBh6hktNdOBzqc6HthPzYHPRFYVW81SyzCqHTaNZydtDIVehb9s6NlyYZpcF/I2vco+lNw==", "dev": true, - "requires": { + "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^25.2.3", "@jest/test-result": "^25.2.3", @@ -486,56 +560,70 @@ "jest-resolve": "^25.2.3", "jest-util": "^25.2.3", "jest-worker": "^25.2.1", - "node-notifier": "^6.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^3.1.0", "terminal-link": "^2.0.0", "v8-to-istanbul": "^4.0.1" + }, + "engines": { + "node": ">= 8.3" + }, + "optionalDependencies": { + "node-notifier": "^6.0.0" } }, - "@jest/source-map": { + "node_modules/@jest/source-map": { "version": "25.2.1", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.1.tgz", "integrity": "sha512-PgScGJm1U27+9Te/cxP4oUFqJ2PX6NhBL2a6unQ7yafCgs8k02c0LSyjSIx/ao0AwcAdCczfAPDf5lJ7zoB/7A==", "dev": true, - "requires": { + "dependencies": { "callsites": "^3.0.0", "graceful-fs": "^4.2.3", "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@jest/test-result": { + "node_modules/@jest/test-result": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.2.3.tgz", "integrity": "sha512-cNYidqERTcT+xqZZ5FPSvji7Bd2YYq9M/VJCEUmgTVRFZRPOPSu65crEzQJ4czcDChEJ9ovzZ65r3UBlajnh3w==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^25.2.3", "@jest/transform": "^25.2.3", "@jest/types": "^25.2.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@jest/test-sequencer": { + "node_modules/@jest/test-sequencer": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.2.3.tgz", "integrity": "sha512-trHwV/wCrxWyZyNyNBUQExsaHyBVQxJwH3butpEcR+KBJPfaTUxtpXaxfs38IXXAhH68J4kPZgAaRRfkFTLunA==", "dev": true, - "requires": { + "dependencies": { "@jest/test-result": "^25.2.3", "jest-haste-map": "^25.2.3", "jest-runner": "^25.2.3", "jest-runtime": "^25.2.3" + }, + "engines": { + "node": ">= 8.3" } }, - "@jest/transform": { + "node_modules/@jest/transform": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.2.3.tgz", "integrity": "sha512-w1nfAuYP4OAiEDprFkE/2iwU86jL/hK3j1ylMcYOA3my5VOHqX0oeBcBxS2fUKWse2V4izuO2jqes0yNTDMlzw==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.1.0", "@jest/types": "^25.2.3", "babel-plugin-istanbul": "^6.0.0", @@ -552,35 +640,41 @@ "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@jest/types": { + "node_modules/@jest/types": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.2.3.tgz", "integrity": "sha512-6oLQwO9mKif3Uph3RX5J1i3S7X7xtDHWBaaaoeKw8hOzV6YUd0qDcYcHZ6QXMHDIzSr7zzrEa51o2Ovlj6AtKQ==", "dev": true, - "requires": { + "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", "@types/yargs": "^15.0.0", "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "@sinonjs/commons": { + "node_modules/@sinonjs/commons": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", "dev": true, - "requires": { + "dependencies": { "type-detect": "4.0.8" } }, - "@types/babel__core": { + "node_modules/@types/babel__core": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.6.tgz", "integrity": "sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg==", "dev": true, - "requires": { + "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", "@types/babel__generator": "*", @@ -588,277 +682,335 @@ "@types/babel__traverse": "*" } }, - "@types/babel__generator": { + "node_modules/@types/babel__generator": { "version": "7.6.1", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.0.0" } }, - "@types/babel__template": { + "node_modules/@types/babel__template": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", "dev": true, - "requires": { + "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, - "@types/babel__traverse": { + "node_modules/@types/babel__traverse": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.9.tgz", "integrity": "sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.3.0" } }, - "@types/color-name": { + "node_modules/@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, - "@types/istanbul-lib-coverage": { + "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", "dev": true }, - "@types/istanbul-lib-report": { + "node_modules/@types/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, - "requires": { + "dependencies": { "@types/istanbul-lib-coverage": "*" } }, - "@types/istanbul-reports": { + "node_modules/@types/istanbul-reports": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", "dev": true, - "requires": { + "dependencies": { "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, - "@types/prettier": { + "node_modules/@types/prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", "dev": true }, - "@types/stack-utils": { + "node_modules/@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", "dev": true }, - "@types/yargs": { + "node_modules/@types/yargs": { "version": "15.0.4", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, - "requires": { + "dependencies": { "@types/yargs-parser": "*" } }, - "@types/yargs-parser": { + "node_modules/@types/yargs-parser": { "version": "15.0.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", "dev": true }, - "abab": { + "node_modules/abab": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", "dev": true }, - "acorn": { + "node_modules/acorn": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "dev": true + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "acorn-globals": { + "node_modules/acorn-globals": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", "dev": true, - "requires": { + "dependencies": { "acorn": "^6.0.1", "acorn-walk": "^6.0.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - } + "engines": { + "node": ">=0.4.0" } }, - "acorn-walk": { + "node_modules/acorn-walk": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, - "ajv": { + "node_modules/ajv": { "version": "6.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, - "requires": { + "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, - "ansi-escapes": { + "node_modules/ansi-escapes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", "dev": true, - "requires": { + "dependencies": { "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" } }, - "ansi-regex": { + "node_modules/ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "ansi-styles": { + "node_modules/ansi-styles": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.0.tgz", "integrity": "sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg==", "dev": true, - "requires": { + "dependencies": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" } }, - "anymatch": { + "node_modules/anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, - "requires": { + "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "argparse": { + "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "requires": { + "dependencies": { "sprintf-js": "~1.0.2" } }, - "arr-diff": { + "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "arr-flatten": { + "node_modules/arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "arr-union": { + "node_modules/arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "array-equal": { + "node_modules/array-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, - "array-unique": { + "node_modules/array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "asn1": { + "node_modules/asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, - "requires": { + "dependencies": { "safer-buffer": "~2.1.0" } }, - "assert-plus": { + "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8" + } }, - "assign-symbols": { + "node_modules/assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "astral-regex": { + "node_modules/astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "asynckit": { + "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "atob": { + "node_modules/atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } }, - "auto-load": { + "node_modules/auto-load": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/auto-load/-/auto-load-3.0.4.tgz", "integrity": "sha512-ufENezHsnouUiIgwCMuqzcdiABBucBb8CV/5uchw9XuMhf8KXIqF3PgxRzhIuW3C470gjb5niq6zaaF9nhjPIQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=4.0.0" + } }, - "aws-sign2": { + "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "aws4": { + "node_modules/aws4": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", "dev": true }, - "babel-jest": { + "node_modules/babel-jest": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.2.3.tgz", "integrity": "sha512-03JjvEwuDrEz/A45K8oggAv+Vqay0xcOdNTJxYFxiuZvB5vlHKo1iZg9Pi5vQTHhNCKpGLb7L/jvUUafyh9j7g==", "dev": true, - "requires": { + "dependencies": { "@jest/transform": "^25.2.3", "@jest/types": "^25.2.3", "@types/babel__core": "^7.1.0", @@ -866,53 +1018,71 @@ "babel-preset-jest": "^25.2.1", "chalk": "^3.0.0", "slash": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "babel-plugin-istanbul": { + "node_modules/babel-plugin-istanbul": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^4.0.0", "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "babel-plugin-jest-hoist": { + "node_modules/babel-plugin-jest-hoist": { "version": "25.2.1", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.1.tgz", "integrity": "sha512-HysbCQfJhxLlyxDbKcB2ucGYV0LjqK4h6dBoI3RtFuOxTiTWK6XGZMsHb0tGh8iJdV4hC6Z2GCHzVvDeh9i0lQ==", "dev": true, - "requires": { + "dependencies": { "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 8.3" } }, - "babel-preset-jest": { + "node_modules/babel-preset-jest": { "version": "25.2.1", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.2.1.tgz", "integrity": "sha512-zXHJBM5iR8oEO4cvdF83AQqqJf3tJrXy3x8nfu2Nlqvn4cneg4Ca8M7cQvC5S9BzDDy1O0tZ9iXru9J6E3ym+A==", "dev": true, - "requires": { + "dependencies": { "@babel/plugin-syntax-bigint": "^7.0.0", "@babel/plugin-syntax-object-rest-spread": "^7.0.0", "babel-plugin-jest-hoist": "^25.2.1" + }, + "engines": { + "node": ">= 8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "balanced-match": { + "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "base": { + "node_modules/base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, - "requires": { + "dependencies": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", "component-emitter": "^1.2.1", @@ -921,119 +1091,133 @@ "mixin-deep": "^1.2.0", "pascalcase": "^0.1.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "bcrypt-pbkdf": { + "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, - "requires": { + "dependencies": { "tweetnacl": "^0.14.3" } }, - "brace-expansion": { + "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "requires": { + "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "braces": { + "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "requires": { + "dependencies": { "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "browser-process-hrtime": { + "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, - "browser-resolve": { + "node_modules/browser-resolve": { "version": "1.11.3", "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", "dev": true, - "requires": { - "resolve": "1.1.7" - }, "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } + "resolve": "1.1.7" } }, - "bser": { + "node_modules/browser-resolve/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, - "requires": { + "dependencies": { "node-int64": "^0.4.0" } }, - "buffer-from": { + "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "cache-base": { + "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, - "requires": { + "dependencies": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", "get-value": "^2.0.6", @@ -1043,435 +1227,538 @@ "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "callsites": { + "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "camelcase": { + "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "capture-exit": { + "node_modules/capture-exit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, - "requires": { + "dependencies": { "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "caseless": { + "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "chalk": { + "node_modules/chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "chardet": { + "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "ci-info": { + "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "class-utils": { + "node_modules/class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, - "requires": { + "dependencies": { "arr-union": "^3.1.0", "define-property": "^0.2.5", "isobject": "^3.0.0", "static-extend": "^0.1.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "cli-cursor": { + "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, - "requires": { + "dependencies": { "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" } }, - "cli-width": { + "node_modules/cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, - "cliui": { + "node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, - "requires": { + "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" - }, + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "co": { + "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } }, - "collect-v8-coverage": { + "node_modules/collect-v8-coverage": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz", "integrity": "sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ==", "dev": true }, - "collection-visit": { + "node_modules/collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, - "requires": { + "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "color-convert": { + "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { + "dependencies": { "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "combined-stream": { + "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "requires": { + "dependencies": { "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "component-emitter": { + "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "concat-map": { + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "convert-source-map": { + "node_modules/convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, - "requires": { + "dependencies": { "safe-buffer": "~5.1.1" } }, - "copy-descriptor": { + "node_modules/copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "core-util-is": { + "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "cross-spawn": { + "node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, - "requires": { + "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "cssom": { + "node_modules/cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", "dev": true }, - "cssstyle": { + "node_modules/cssstyle": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", "dev": true, - "requires": { + "dependencies": { "cssom": "~0.3.6" }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } + "engines": { + "node": ">=8" } }, - "dashdash": { + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, - "requires": { + "dependencies": { "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" } }, - "data-urls": { + "node_modules/data-urls": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dev": true, - "requires": { + "dependencies": { "abab": "^2.0.0", "whatwg-mimetype": "^2.2.0", "whatwg-url": "^7.0.0" } }, - "decamelize": { + "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "decode-uri-component": { + "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=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10" + } }, - "deep-is": { + "node_modules/deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "deepmerge": { + "node_modules/deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "define-property": { + "node_modules/define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, - "requires": { + "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "delayed-stream": { + "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, - "detect-newline": { + "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "diff-sequences": { + "node_modules/diff-sequences": { "version": "25.2.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.1.tgz", "integrity": "sha512-foe7dXnGlSh3jR1ovJmdv+77VQj98eKCHHwJPbZ2eEf0fHwKbkZicpPxEch9smZ+n2dnF6QFwkOQdLq9hpeJUg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8.3" + } }, - "domexception": { + "node_modules/domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "dev": true, - "requires": { + "dependencies": { "webidl-conversions": "^4.0.2" } }, - "ecc-jsbn": { + "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, - "requires": { + "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, - "emoji-regex": { + "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "end-of-stream": { + "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, - "requires": { + "dependencies": { "once": "^1.4.0" } }, - "escape-string-regexp": { + "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, - "escodegen": { + "node_modules/escodegen": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", "dev": true, - "requires": { + "dependencies": { "esprima": "^4.0.1", "estraverse": "^4.2.0", "esutils": "^2.0.2", - "optionator": "^0.8.1", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { "source-map": "~0.6.1" } }, - "esprima": { + "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "estraverse": { + "node_modules/estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "dev": true, + "engines": { + "node": ">=4.0" + } }, - "esutils": { + "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "exec-sh": { + "node_modules/exec-sh": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", "dev": true }, - "execa": { + "node_modules/execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, - "requires": { + "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", "is-stream": "^1.1.0", @@ -1479,20 +1766,26 @@ "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" } }, - "exit": { + "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, - "expand-brackets": { + "node_modules/expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, - "requires": { + "dependencies": { "debug": "^2.3.3", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", @@ -1501,94 +1794,111 @@ "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "expect": { + "node_modules/expect": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/expect/-/expect-25.2.3.tgz", "integrity": "sha512-kil4jFRFAK2ySyCyXPqYrphc3EiiKKFd9BthrkKAyHcqr1B84xFTuj5kO8zL+eHRRjT2jQsOPExO0+1Q/fuUXg==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^25.2.3", "ansi-styles": "^4.0.0", "jest-get-type": "^25.2.1", "jest-matcher-utils": "^25.2.3", "jest-message-util": "^25.2.3", "jest-regex-util": "^25.2.1" + }, + "engines": { + "node": ">= 8.3" } }, - "extend": { + "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extend-shallow": { + "node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, - "requires": { + "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" } }, - "external-editor": { + "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, - "requires": { + "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" } }, - "extglob": { + "node_modules/extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, - "requires": { + "dependencies": { "array-unique": "^0.3.2", "define-property": "^1.0.0", "expand-brackets": "^2.1.4", @@ -1598,390 +1908,499 @@ "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "extsprintf": { + "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "dev": true, + "engines": [ + "node >=0.6.0" + ] }, - "fast-deep-equal": { + "node_modules/fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", "dev": true }, - "fast-json-stable-stringify": { + "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "fast-levenshtein": { + "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fb-watchman": { + "node_modules/fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", "dev": true, - "requires": { + "dependencies": { "bser": "2.1.1" } }, - "figures": { + "node_modules/figures": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", "dev": true, - "requires": { + "dependencies": { "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" } }, - "fill-range": { + "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "requires": { + "dependencies": { "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "find-up": { + "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "requires": { + "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "for-in": { + "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "forever-agent": { + "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "form-data": { + "node_modules/form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, - "requires": { + "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" } }, - "fragment-cache": { + "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, - "requires": { + "dependencies": { "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "fs.realpath": { + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { + "node_modules/fsevents": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", "dev": true, - "optional": true + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "gensync": { + "node_modules/gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "get-caller-file": { + "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "get-stream": { + "node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, - "requires": { + "dependencies": { "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "get-value": { + "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "getpass": { + "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, - "requires": { + "dependencies": { "assert-plus": "^1.0.0" } }, - "glob": { + "node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, - "requires": { + "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "globals": { + "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "graceful-fs": { + "node_modules/graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, - "growly": { + "node_modules/growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "dev": true, "optional": true }, - "har-schema": { + "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "har-validator": { + "node_modules/har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "deprecated": "this library is no longer supported", "dev": true, - "requires": { + "dependencies": { "ajv": "^6.5.5", "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "has-flag": { + "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "has-value": { + "node_modules/has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, - "requires": { + "dependencies": { "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "has-values": { + "node_modules/has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, - "requires": { + "dependencies": { "is-number": "^3.0.0", "kind-of": "^4.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "html-encoding-sniffer": { + "node_modules/html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, - "requires": { + "dependencies": { "whatwg-encoding": "^1.0.1" } }, - "html-escaper": { + "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "http-signature": { + "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, - "requires": { + "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "human-signals": { + "node_modules/human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.12.0" + } }, - "iconv-lite": { + "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "requires": { + "dependencies": { "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "import-local": { + "node_modules/import-local": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", "dev": true, - "requires": { + "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" } }, - "imurmurhash": { + "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, - "requires": { + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "inquirer": { + "node_modules/inquirer": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.1.tgz", "integrity": "sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw==", "dev": true, - "requires": { + "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^2.4.2", "cli-cursor": "^3.1.0", @@ -1996,245 +2415,306 @@ "strip-ansi": "^5.1.0", "through": "^2.3.6" }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "ip-regex": { + "node_modules/ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "is-accessor-descriptor": { + "node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, - "requires": { + "dependencies": { "kind-of": "^3.0.2" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-ci": { + "node_modules/is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, - "requires": { + "dependencies": { "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" } }, - "is-data-descriptor": { + "node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, - "requires": { + "dependencies": { "kind-of": "^3.0.2" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-descriptor": { + "node_modules/is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, - "requires": { + "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "is-extendable": { + "node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-fullwidth-code-point": { + "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "is-generator-fn": { + "node_modules/is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "is-number": { + "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "is-plain-object": { + "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, - "requires": { + "dependencies": { "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-promise": { + "node_modules/is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, - "is-stream": { + "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-typedarray": { + "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-windows": { + "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-wsl": { + "node_modules/is-wsl": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", "dev": true, - "optional": true + "optional": true, + "engines": { + "node": ">=8" + } }, - "isarray": { + "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isobject": { + "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "isstream": { + "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "istanbul-lib-coverage": { + "node_modules/istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "istanbul-lib-instrument": { + "node_modules/istanbul-lib-instrument": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.7.5", "@babel/parser": "^7.7.5", "@babel/template": "^7.7.4", @@ -2242,219 +2722,212 @@ "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" } }, - "istanbul-lib-report": { + "node_modules/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, - "requires": { + "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "istanbul-lib-source-maps": { + "node_modules/istanbul-lib-source-maps": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, - "requires": { + "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "ms": "^2.1.1" } }, - "istanbul-reports": { + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/istanbul-reports": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.1.tgz", "integrity": "sha512-Vm9xwCiQ8t2cNNnckyeAV0UdxKpcQUz4nMxsBvIu8n2kmPSiyb5uaF/8LpmKr+yqL/MdOXaX2Nmdo4Qyxium9Q==", "dev": true, - "requires": { + "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "jest": { + "node_modules/jest": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest/-/jest-25.2.3.tgz", "integrity": "sha512-UbUmyGeZt0/sCIj/zsWOY0qFfQsx2qEFIZp0iEj8yVH6qASfR22fJOf12gFuSPsdSufam+llZBB0MdXWCg6EEQ==", "dev": true, - "requires": { + "dependencies": { "@jest/core": "^25.2.3", "import-local": "^3.0.2", "jest-cli": "^25.2.3" }, - "dependencies": { - "jest-cli": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.2.3.tgz", - "integrity": "sha512-T7G0TOkFj0wr33ki5xoq3bxkKC+liwJfjV9SmYIKBozwh91W4YjL1o1dgVCUTB1+sKJa/DiAY0p+eXYE6v2RGw==", - "dev": true, - "requires": { - "@jest/core": "^25.2.3", - "@jest/test-result": "^25.2.3", - "@jest/types": "^25.2.3", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^25.2.3", - "jest-util": "^25.2.3", - "jest-validate": "^25.2.3", - "prompts": "^2.0.1", - "realpath-native": "^2.0.0", - "yargs": "^15.3.1" - } - }, - "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" - } - }, - "yargs-parser": { - "version": "18.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", - "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-changed-files": { + "node_modules/jest-changed-files": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.2.3.tgz", "integrity": "sha512-EFxy94dvvbqRB36ezIPLKJ4fDIC+jAdNs8i8uTwFpaXd6H3LVc3ova1lNS4ZPWk09OCR2vq5kSdSQgar7zMORg==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^25.2.3", "execa": "^3.2.0", "throat": "^5.0.0" }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-changed-files/node_modules/cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, "dependencies": { - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": "^8.12.0 || >=9.7.0" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" } }, - "jest-config": { + "node_modules/jest-config": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.2.3.tgz", "integrity": "sha512-UpTNxN8DgmLLCXFizGuvwIw+ZAPB0T3jbKaFEkzJdGqhSsQrVrk1lxhZNamaVIpWirM2ptYmqwUzvoobGCEkiQ==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.1.0", "@jest/test-sequencer": "^25.2.3", "@jest/types": "^25.2.3", @@ -2473,86 +2946,106 @@ "micromatch": "^4.0.2", "pretty-format": "^25.2.3", "realpath-native": "^2.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-diff": { + "node_modules/jest-diff": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.2.3.tgz", "integrity": "sha512-VtZ6LAQtaQpFsmEzps15dQc5ELbJxy4L2DOSo2Ev411TUEtnJPkAMD7JneVypeMJQ1y3hgxN9Ao13n15FAnavg==", "dev": true, - "requires": { + "dependencies": { "chalk": "^3.0.0", "diff-sequences": "^25.2.1", "jest-get-type": "^25.2.1", "pretty-format": "^25.2.3" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-docblock": { + "node_modules/jest-docblock": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.2.3.tgz", "integrity": "sha512-d3/tmjLLrH5fpRGmIm3oFa3vOaD/IjPxtXVOrfujpfJ9y1tCDB1x/tvunmdOVAyF03/xeMwburl6ITbiQT1mVA==", "dev": true, - "requires": { + "dependencies": { "detect-newline": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-each": { + "node_modules/jest-each": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.2.3.tgz", "integrity": "sha512-RTlmCjsBDK2c9T5oO4MqccA3/5Y8BUtiEy7OOQik1iyCgdnNdHbI0pNEpyapZPBG0nlvZ4mIu7aY6zNUvLraAQ==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^25.2.3", "chalk": "^3.0.0", "jest-get-type": "^25.2.1", "jest-util": "^25.2.3", "pretty-format": "^25.2.3" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-environment-jsdom": { + "node_modules/jest-environment-jsdom": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.2.3.tgz", "integrity": "sha512-TLg7nizxIYJafz6tOBAVSmO5Ekswf6Cf3Soseov+mgonXfdYi1I0OZlHlZMJb2fGyXem2ndYFCLrMkwcWPKAnQ==", "dev": true, - "requires": { + "dependencies": { "@jest/environment": "^25.2.3", "@jest/fake-timers": "^25.2.3", "@jest/types": "^25.2.3", "jest-mock": "^25.2.3", "jest-util": "^25.2.3", "jsdom": "^15.2.1" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-environment-node": { + "node_modules/jest-environment-node": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.2.3.tgz", "integrity": "sha512-Tu/wlGXfoLtBR4Ym+isz58z3TJkMYX4VnFTkrsxaTGYAxNLN7ArCwL51Ki0WrMd89v+pbCLDj/hDjrb4a2sOrw==", "dev": true, - "requires": { + "dependencies": { "@jest/environment": "^25.2.3", "@jest/fake-timers": "^25.2.3", "@jest/types": "^25.2.3", "jest-mock": "^25.2.3", "jest-util": "^25.2.3", "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-get-type": { + "node_modules/jest-get-type": { "version": "25.2.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.1.tgz", "integrity": "sha512-EYjTiqcDTCRJDcSNKbLTwn/LcDPEE7ITk8yRMNAOjEsN6yp+Uu+V1gx4djwnuj/DvWg0YGmqaBqPVGsPxlvE7w==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8.3" + } }, - "jest-haste-map": { + "node_modules/jest-haste-map": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.2.3.tgz", "integrity": "sha512-pAP22OHtPr4qgZlJJFks2LLgoQUr4XtM1a+F5UaPIZNiCRnePA0hM3L7aiJ0gzwiNIYwMTfKRwG/S1L28J3A3A==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^25.2.3", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", "graceful-fs": "^4.2.3", "jest-serializer": "^25.2.1", "jest-util": "^25.2.3", @@ -2561,14 +3054,20 @@ "sane": "^4.0.3", "walker": "^1.0.7", "which": "^2.0.2" + }, + "engines": { + "node": ">= 8.3" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" } }, - "jest-jasmine2": { + "node_modules/jest-jasmine2": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.2.3.tgz", "integrity": "sha512-x9PEGPFdnkSwJj1UG4QxG9JxFdyP8fuJ/UfKXd/eSpK8w9x7MP3VaQDuPQF0UQhCT0YeOITEPkQyqS+ptt0suA==", "dev": true, - "requires": { + "dependencies": { "@babel/traverse": "^7.1.0", "@jest/environment": "^25.2.3", "@jest/source-map": "^25.2.1", @@ -2586,36 +3085,45 @@ "jest-util": "^25.2.3", "pretty-format": "^25.2.3", "throat": "^5.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-leak-detector": { + "node_modules/jest-leak-detector": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.2.3.tgz", "integrity": "sha512-yblCMPE7NJKl7778Cf/73yyFWAas5St0iiEBwq7RDyaz6Xd4WPFnPz2j7yDb/Qce71A1IbDoLADlcwD8zT74Aw==", "dev": true, - "requires": { + "dependencies": { "jest-get-type": "^25.2.1", "pretty-format": "^25.2.3" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-matcher-utils": { + "node_modules/jest-matcher-utils": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.2.3.tgz", "integrity": "sha512-ZmiXiwQRVM9MoKjGMP5YsGGk2Th5ncyRxfXKz5AKsmU8m43kgNZirckVzaP61MlSa9LKmXbevdYqVp1ZKAw2Rw==", "dev": true, - "requires": { + "dependencies": { "chalk": "^3.0.0", "jest-diff": "^25.2.3", "jest-get-type": "^25.2.1", "pretty-format": "^25.2.3" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-message-util": { + "node_modules/jest-message-util": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.2.3.tgz", "integrity": "sha512-DcyDmdO5LVIeS0ngRvd7rk701XL60dAakUeQJ1tQRby27fyLYXD+V0nqVaC194W7fIlohjVQOZPHmKXIjn+Byw==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.0.0", "@jest/test-result": "^25.2.3", "@jest/types": "^25.2.3", @@ -2624,60 +3132,86 @@ "micromatch": "^4.0.2", "slash": "^3.0.0", "stack-utils": "^1.0.1" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-mock": { + "node_modules/jest-mock": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.2.3.tgz", "integrity": "sha512-xlf+pyY0j47zoCs8zGGOGfWyxxLximE8YFOfEK8s4FruR8DtM/UjNj61um+iDuMAFEBDe1bhCXkqiKoCmWjJzg==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^25.2.3" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-pnp-resolver": { + "node_modules/jest-pnp-resolver": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } }, - "jest-regex-util": { + "node_modules/jest-regex-util": { "version": "25.2.1", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.1.tgz", "integrity": "sha512-wroFVJw62LdqTdkL508ZLV82FrJJWVJMIuYG7q4Uunl1WAPTf4ftPKrqqfec4SvOIlvRZUdEX2TFpWR356YG/w==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8.3" + } }, - "jest-resolve": { + "node_modules/jest-resolve": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.2.3.tgz", "integrity": "sha512-1vZMsvM/DBH258PnpUNSXIgtzpYz+vCVCj9+fcy4akZl4oKbD+9hZSlfe9RIDpU0Fc28ozHQrmwX3EqFRRIHGg==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^25.2.3", "browser-resolve": "^1.11.3", "chalk": "^3.0.0", "jest-pnp-resolver": "^1.2.1", "realpath-native": "^2.0.0", "resolve": "^1.15.1" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-resolve-dependencies": { + "node_modules/jest-resolve-dependencies": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.2.3.tgz", "integrity": "sha512-mcWlvjXLlNzgdE9EQxHuaeWICNxozanim87EfyvPwTY0ryWusFZbgF6F8u3E0syJ4FFSooEm0lQ6fgYcnPGAFw==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^25.2.3", "jest-regex-util": "^25.2.1", "jest-snapshot": "^25.2.3" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-runner": { + "node_modules/jest-runner": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.2.3.tgz", "integrity": "sha512-E+u2Zm2TmtTOFEbKs5jllLiV2fwiX77cYc08RdyYZNe/s06wQT3P47aV6a8Rv61L7E2Is7OmozLd0KI/DITRpg==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^25.2.3", "@jest/environment": "^25.2.3", "@jest/test-result": "^25.2.3", @@ -2697,14 +3231,17 @@ "jest-worker": "^25.2.1", "source-map-support": "^0.5.6", "throat": "^5.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-runtime": { + "node_modules/jest-runtime": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.2.3.tgz", "integrity": "sha512-PZRFeUVF08N24v2G73SDF0b0VpLG7cRNOJ3ggj5TnArBVHkkrWzM3z7txB9OupWu7OO8bH/jFogk6sSjnHLFXQ==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^25.2.3", "@jest/environment": "^25.2.3", "@jest/source-map": "^25.2.1", @@ -2731,50 +3268,63 @@ "strip-bom": "^4.0.0", "yargs": "^15.3.1" }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-runtime/node_modules/yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, "dependencies": { - "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" - } - }, - "yargs-parser": { - "version": "18.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", - "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/yargs-parser": { + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" } }, - "jest-serializer": { + "node_modules/jest-serializer": { "version": "25.2.1", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.1.tgz", "integrity": "sha512-fibDi7M5ffx6c/P66IkvR4FKkjG5ldePAK1WlbNoaU4GZmIAkS9Le/frAwRUFEX0KdnisSPWf+b1RC5jU7EYJQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8.3" + } }, - "jest-snapshot": { + "node_modules/jest-snapshot": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.2.3.tgz", "integrity": "sha512-HlFVbE6vOZ541mtkwjuAe0rfx9EWhB+QXXneLNOP/s3LlHxGQtX7WFXY5OiH4CkAnCc6BpzLNYS9nfINNRb4Zg==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.0.0", "@jest/types": "^25.2.3", "@types/prettier": "^1.19.0", @@ -2789,86 +3339,166 @@ "natural-compare": "^1.4.0", "pretty-format": "^25.2.3", "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-util": { + "node_modules/jest-util": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.2.3.tgz", "integrity": "sha512-7tWiMICVSo9lNoObFtqLt9Ezt5exdFlWs5fLe1G4XLY2lEbZc814cw9t4YHScqBkWMfzth8ASHKlYBxiX2rdCw==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^25.2.3", "chalk": "^3.0.0", "is-ci": "^2.0.0", "make-dir": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-validate": { + "node_modules/jest-validate": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.2.3.tgz", "integrity": "sha512-GObn91jzU0B0Bv4cusAwjP6vnWy78hJUM8MOSz7keRfnac/ZhQWIsUjvk01IfeXNTemCwgR57EtdjQMzFZGREg==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^25.2.3", "camelcase": "^5.3.1", "chalk": "^3.0.0", "jest-get-type": "^25.2.1", "leven": "^3.1.0", "pretty-format": "^25.2.3" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-watcher": { + "node_modules/jest-watcher": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.2.3.tgz", "integrity": "sha512-F6ERbdvJk8nbaRon9lLQVl4kp+vToCCHmy+uWW5QQ8/8/g2jkrZKJQnlQINrYQp0ewg31Bztkhs4nxsZMx6wDg==", "dev": true, - "requires": { + "dependencies": { "@jest/test-result": "^25.2.3", "@jest/types": "^25.2.3", "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", "jest-util": "^25.2.3", "string-length": "^3.1.0" + }, + "engines": { + "node": ">= 8.3" } }, - "jest-worker": { + "node_modules/jest-worker": { "version": "25.2.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.1.tgz", "integrity": "sha512-IHnpekk8H/hCUbBlfeaPZzU6v75bqwJp3n4dUrQuQOAgOneI4tx3jV2o8pvlXnDfcRsfkFIUD//HWXpCmR+evQ==", "dev": true, - "requires": { + "dependencies": { "merge-stream": "^2.0.0", "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "js-tokens": { + "node_modules/jest/node_modules/jest-cli": { + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.2.3.tgz", + "integrity": "sha512-T7G0TOkFj0wr33ki5xoq3bxkKC+liwJfjV9SmYIKBozwh91W4YjL1o1dgVCUTB1+sKJa/DiAY0p+eXYE6v2RGw==", + "dev": true, + "dependencies": { + "@jest/core": "^25.2.3", + "@jest/test-result": "^25.2.3", + "@jest/types": "^25.2.3", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^25.2.3", + "jest-util": "^25.2.3", + "jest-validate": "^25.2.3", + "prompts": "^2.0.1", + "realpath-native": "^2.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest/node_modules/yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/yargs-parser": { + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "js-yaml": { + "node_modules/js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, - "requires": { + "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "jsbn": { + "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, - "jsdom": { + "node_modules/jsdom": { "version": "15.2.1", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", "dev": true, - "requires": { + "dependencies": { "abab": "^2.0.0", "acorn": "^7.1.0", "acorn-globals": "^4.3.2", @@ -2895,241 +3525,316 @@ "whatwg-url": "^7.0.0", "ws": "^7.0.0", "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } } }, - "jsesc": { + "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } }, - "json-beautify": { + "node_modules/json-beautify": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/json-beautify/-/json-beautify-1.1.1.tgz", "integrity": "sha512-17j+Hk2lado0xqKtUcyAjK0AtoHnPSIgktWRsEXgdFQFG9UnaGw6CHa0J7xsvulxRpFl6CrkDFHght1p5ZJc4A==", - "dev": true + "dev": true, + "bin": { + "json-beautify": "bin/json-beautify" + } }, - "json-schema": { + "node_modules/json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, - "json-schema-traverse": { + "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stringify-safe": { + "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "json5": { + "node_modules/json5": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", "dev": true, - "requires": { + "dependencies": { "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, - "jsprim": { + "node_modules/jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, - "requires": { + "engines": [ + "node >=0.6.0" + ], + "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" } }, - "kind-of": { + "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "kleur": { + "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "leven": { + "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "levn": { + "node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, - "requires": { + "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "locate-path": { + "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "requires": { + "dependencies": { "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "lodash": { + "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "lodash.sortby": { + "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, - "lolex": { + "node_modules/lolex": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", "dev": true, - "requires": { + "dependencies": { "@sinonjs/commons": "^1.7.0" } }, - "make-dir": { + "node_modules/make-dir": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", "dev": true, - "requires": { + "dependencies": { "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "makeerror": { + "node_modules/makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, - "requires": { + "dependencies": { "tmpl": "1.0.x" } }, - "map-cache": { + "node_modules/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "map-visit": { + "node_modules/map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, - "requires": { + "dependencies": { "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "merge-stream": { + "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "micromatch": { + "node_modules/micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, - "requires": { + "dependencies": { "braces": "^3.0.1", "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" } }, - "mime-db": { + "node_modules/mime-db": { "version": "1.43.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.26", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", "dev": true, - "requires": { + "dependencies": { "mime-db": "1.43.0" + }, + "engines": { + "node": ">= 0.6" } }, - "mimic-fn": { + "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "minimatch": { + "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "minimist": { + "node_modules/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "mixin-deep": { + "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, - "requires": { + "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" } }, - "ms": { + "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "mute-stream": { + "node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "nanomatch": { + "node_modules/nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, - "requires": { + "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "define-property": "^2.0.2", @@ -3141,406 +3846,524 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "natural-compare": { + "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "nice-try": { + "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node-int64": { + "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, - "node-modules-regexp": { + "node_modules/node-modules-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node-notifier": { + "node_modules/node-notifier": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", "dev": true, "optional": true, - "requires": { + "dependencies": { "growly": "^1.3.0", "is-wsl": "^2.1.1", "semver": "^6.3.0", "shellwords": "^0.1.1", "which": "^1.3.1" - }, + } + }, + "node_modules/node-notifier/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "optional": true, "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "optional": true, - "requires": { - "isexe": "^2.0.0" - } - } + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "normalize-path": { + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "npm-run-path": { + "node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, - "requires": { + "dependencies": { "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "nwsapi": { + "node_modules/nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, - "oauth-sign": { + "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "object-copy": { + "node_modules/object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, - "requires": { + "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", "kind-of": "^3.0.3" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "object-visit": { + "node_modules/object-copy/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, - "requires": { + "dependencies": { "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "object.pick": { + "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, - "requires": { + "dependencies": { "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, - "requires": { + "dependencies": { "wrappy": "1" } }, - "onetime": { + "node_modules/onetime": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, - "requires": { + "dependencies": { "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" } }, - "optionator": { + "node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, - "requires": { + "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" } }, - "os-tmpdir": { + "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "p-each-series": { + "node_modules/p-each-series": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "p-finally": { + "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "p-limit": { + "node_modules/p-limit": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, - "requires": { + "dependencies": { "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "p-locate": { + "node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "requires": { + "dependencies": { "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "p-try": { + "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "parse5": { + "node_modules/parse5": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", "dev": true }, - "pascalcase": { + "node_modules/pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-exists": { + "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-key": { + "node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "performance-now": { + "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, - "picomatch": { + "node_modules/picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pirates": { + "node_modules/pirates": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", "dev": true, - "requires": { + "dependencies": { "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" } }, - "pkg-dir": { + "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "requires": { + "dependencies": { "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "pn": { + "node_modules/pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", "dev": true }, - "posix-character-classes": { + "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "prelude-ls": { + "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, - "prettier": { + "node_modules/prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=4" + } }, - "pretty-format": { + "node_modules/pretty-format": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.3.tgz", "integrity": "sha512-IP4+5UOAVGoyqC/DiomOeHBUKN6q00gfyT2qpAsRH64tgOKB2yF7FHJXC18OCiU0/YFierACup/zdCOWw0F/0w==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^25.2.3", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" } }, - "prompts": { + "node_modules/prompts": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", "dev": true, - "requires": { + "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.4" + }, + "engines": { + "node": ">= 6" } }, - "psl": { + "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, - "pump": { + "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, - "requires": { + "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, - "punycode": { + "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "qs": { + "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==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.6" + } }, - "querystring": { + "node_modules/querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } }, - "react-is": { + "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, - "realpath-native": { + "node_modules/realpath-native": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "regex-not": { + "node_modules/regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, - "requires": { + "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "remove-trailing-separator": { + "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, - "repeat-element": { + "node_modules/repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "repeat-string": { + "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10" + } }, - "request": { + "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, - "requires": { + "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", @@ -3562,400 +4385,497 @@ "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } + "engines": { + "node": ">= 6" } }, - "request-promise-core": { + "node_modules/request-promise-core": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", "dev": true, - "requires": { + "dependencies": { "lodash": "^4.17.15" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" } }, - "request-promise-native": { + "node_modules/request-promise-native": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", "dev": true, - "requires": { + "dependencies": { "request-promise-core": "1.1.3", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" } }, - "require-directory": { + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "require-main-filename": { + "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "resolve": { + "node_modules/resolve": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", "dev": true, - "requires": { + "dependencies": { "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-cwd": { + "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "requires": { + "dependencies": { "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "resolve-url": { + "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", "dev": true }, - "restore-cursor": { + "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, - "requires": { + "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" } }, - "ret": { + "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12" + } }, - "rimraf": { + "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "requires": { + "dependencies": { "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "rsvp": { + "node_modules/rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true + "dev": true, + "engines": { + "node": "6.* || >= 7.*" + } }, - "run-async": { + "node_modules/run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, - "requires": { + "dependencies": { "is-promise": "^2.1.0" + }, + "engines": { + "node": ">=0.12.0" } }, - "rxjs": { + "node_modules/rxjs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", "dev": true, - "requires": { + "dependencies": { "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" } }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "safe-regex": { + "node_modules/safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, - "requires": { + "dependencies": { "ret": "~0.1.10" } }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "sane": { + "node_modules/sane": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", + "dev": true, + "dependencies": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/sane/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/sane/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" + "dependencies": { + "remove-trailing-separator": "^1.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "saxes": { + "node_modules/saxes": { "version": "3.1.11", "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", "dev": true, - "requires": { + "dependencies": { "xmlchars": "^2.1.1" + }, + "engines": { + "node": ">=8" } }, - "semver": { + "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "set-blocking": { + "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "set-value": { + "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, - "requires": { + "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "shebang-command": { + "node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, - "requires": { + "dependencies": { "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "shellwords": { + "node_modules/shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true, "optional": true }, - "signal-exit": { + "node_modules/signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, - "sisteransi": { + "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "snapdragon": { + "node_modules/snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, - "requires": { + "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", "define-property": "^0.2.5", @@ -3965,131 +4885,162 @@ "source-map-resolve": "^0.5.0", "use": "^3.1.0" }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "engines": { + "node": ">=0.10.0" } }, - "snapdragon-node": { + "node_modules/snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, - "requires": { + "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", "snapdragon-util": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "snapdragon-util": { + "node_modules/snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, - "requires": { + "dependencies": { "kind-of": "^3.2.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "source-map": { + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "source-map-resolve": { + "node_modules/source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "dev": true, - "requires": { + "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", @@ -4097,43 +5048,47 @@ "urix": "^0.1.0" } }, - "source-map-support": { + "node_modules/source-map-support": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "dev": true, - "requires": { + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "source-map-url": { + "node_modules/source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", "dev": true }, - "split-string": { + "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, - "requires": { + "dependencies": { "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "sprintf-js": { + "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sshpk": { + "node_modules/sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, - "requires": { + "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", @@ -4143,566 +5098,705 @@ "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" } }, - "stack-utils": { + "node_modules/stack-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "static-extend": { + "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, - "requires": { + "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "stealthy-require": { + "node_modules/stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "string-length": { + "node_modules/string-length": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", "dev": true, - "requires": { + "dependencies": { "astral-regex": "^1.0.0", "strip-ansi": "^5.2.0" + }, + "engines": { + "node": ">=8" } }, - "string-width": { + "node_modules/string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, - "requires": { + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "strip-ansi": { + "node_modules/strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, - "requires": { + "dependencies": { "ansi-regex": "^4.1.0" }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" } }, - "strip-bom": { + "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "strip-eof": { + "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "strip-final-newline": { + "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "supports-color": { + "node_modules/supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "supports-hyperlinks": { + "node_modules/supports-hyperlinks": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" } }, - "symbol-tree": { + "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "terminal-link": { + "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, - "requires": { + "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "test-exclude": { + "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "requires": { + "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" } }, - "throat": { + "node_modules/throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, - "through": { + "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "tmp": { + "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, - "requires": { + "dependencies": { "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" } }, - "tmpl": { + "node_modules/tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, - "to-fast-properties": { + "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "to-object-path": { + "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, - "requires": { + "dependencies": { "kind-of": "^3.0.2" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "to-regex": { + "node_modules/to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, - "requires": { + "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "tough-cookie": { + "node_modules/tough-cookie": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", "dev": true, - "requires": { + "dependencies": { "ip-regex": "^2.1.0", "psl": "^1.1.28", "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" } }, - "tr46": { + "node_modules/tr46": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "dev": true, - "requires": { + "dependencies": { "punycode": "^2.1.0" } }, - "tslib": { + "node_modules/tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true }, - "tunnel-agent": { + "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, - "requires": { + "dependencies": { "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" } }, - "tweetnacl": { + "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, - "type-check": { + "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, - "requires": { + "dependencies": { "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "type-detect": { + "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "type-fest": { + "node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "typedarray-to-buffer": { + "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, - "requires": { + "dependencies": { "is-typedarray": "^1.0.0" } }, - "union-value": { + "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, - "requires": { + "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "unset-value": { + "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, - "requires": { + "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "uri-js": { + "node_modules/uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, - "requires": { + "dependencies": { "punycode": "^2.1.0" } }, - "urix": { + "node_modules/urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, - "use": { + "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "uuid": { + "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } }, - "v8-to-istanbul": { + "node_modules/v8-to-istanbul": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.2.tgz", "integrity": "sha512-G9R+Hpw0ITAmPSr47lSlc5A1uekSYzXxTMlFxso2xoffwo4jQnzbv1p9yXIinO8UMZKfAFewaCHwWvnH4Jb4Ug==", "dev": true, - "requires": { + "dependencies": { "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0", "source-map": "^0.7.3" }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } + "engines": { + "node": "8.x.x || >=10.10.0" } }, - "verror": { + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, - "requires": { + "engines": [ + "node >=0.6.0" + ], + "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, - "w3c-hr-time": { + "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "dev": true, - "requires": { + "dependencies": { "browser-process-hrtime": "^1.0.0" } }, - "w3c-xmlserializer": { + "node_modules/w3c-xmlserializer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", "dev": true, - "requires": { + "dependencies": { "domexception": "^1.0.1", "webidl-conversions": "^4.0.2", "xml-name-validator": "^3.0.0" } }, - "walker": { + "node_modules/walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "dev": true, - "requires": { + "dependencies": { "makeerror": "1.0.x" } }, - "webidl-conversions": { + "node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, - "whatwg-encoding": { + "node_modules/whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, - "requires": { + "dependencies": { "iconv-lite": "0.4.24" } }, - "whatwg-mimetype": { + "node_modules/whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true }, - "whatwg-url": { + "node_modules/whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, - "requires": { + "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "which-module": { + "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "word-wrap": { + "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==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write-file-atomic": { + "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, - "requires": { + "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, - "ws": { + "node_modules/ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "xml-name-validator": { + "node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, - "xmlchars": { + "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "y18n": { + "node_modules/y18n": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, - "yargs": { + "node_modules/yargs": { "version": "15.0.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.0.2.tgz", "integrity": "sha512-GH/X/hYt+x5hOat4LMnCqMd8r5Cv78heOMIJn1hr7QPPBqfeC6p89Y78+WB9yGDvfpCvgasfmWLzNzEioOUD9Q==", "dev": true, - "requires": { + "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", @@ -4716,12 +5810,12 @@ "yargs-parser": "^16.1.0" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "16.1.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } diff --git a/references/regex.json b/references/regex.json index 8dab58ac..f03ad3cf 100644 --- a/references/regex.json +++ b/references/regex.json @@ -1,3 +1,3 @@ { - "submitter_id": "^[A-Za-z0-9\\-\\._]{1,64}" + "submitter_id": "^[A-Za-z0-9\\-\\._]{1,64}$" } diff --git a/references/validationFunctions/common/submitterIdRegex.js b/references/validationFunctions/common/submitterIdRegex.js new file mode 100644 index 00000000..90bc2a51 --- /dev/null +++ b/references/validationFunctions/common/submitterIdRegex.js @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2023 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +const regex = require('../../regex.json'); + +/** + * Insures there are no invalid characters in Submitter Donor Id + * @param {object} $row + * @param {string} $name + */ +const validation = () => + function validate(inputs) { + let result = { valid: true, message: 'Ok' }; + const { $row, $name } = inputs; + const { row } = $row; + const value = row[$name]; + const submitterIdRegex = new RegExp(regex.submitter_id); + const match = value.match(submitterIdRegex); + + if (!match) { + result = { + valid: false, + message: `'${$name}' contains invalid characters.`, + }; + } + + return result; + }; + +module.exports = validation; diff --git a/tests/common/submitterIdRegex.test.js b/tests/common/submitterIdRegex.test.js new file mode 100644 index 00000000..1fb3a950 --- /dev/null +++ b/tests/common/submitterIdRegex.test.js @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2023 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +const validation = require('../../references/validationFunctions/common/submitterIdRegex.js'); +const universalTest = require('../universal'); +const loadObjects = require('../loadObjects'); + +const sampleReg = require('../constructDummyData').getSchemaDummy('sample_registration'); +const primaryDiagnosis = require('../constructDummyData').getSchemaDummy('primary_diagnosis'); + +const allUnitTests = { + submitter_donor_id: [ + [ + 'Submitter Donor Id does not contain invalid characters', + false, + { + row: loadObjects(sampleReg, { + submitter_donor_id: 'S1529515-1B, 1D', + }), + name: 'submitter_donor_id', + }, + ], + [ + 'Valid Submitter Donor Id matches Regex', + true, + { + row: loadObjects(sampleReg, { + submitter_donor_id: 'ICGC_0400', + }), + name: 'submitter_donor_id', + }, + ], + ], + submitter_primary_diagnosis_id: [ + [ + 'Submitter Primary Diagnosis Id does not contain invalid characters', + false, + { + row: loadObjects(primaryDiagnosis, { + submitter_primary_diagnosis_id: 'O1800469(17-24717)', + }), + name: 'submitter_primary_diagnosis_id', + }, + ], + ], +}; + +describe('Common Tests', () => { + Object.entries(allUnitTests).forEach(field => { + const name = field[0]; + const unitTests = field[1]; + unitTests.forEach(test => { + const testIndex = 2; + const testInputs = test[testIndex]; + universalTest(validation()({ $row: testInputs, $name: name, $field: testInputs[name] })); + }); + }); +}); + +describe('Unit Tests for Submitter Id Regexz', () => { + Object.entries(allUnitTests).forEach(field => { + const name = field[0]; + const unitTests = field[1]; + describe(`Tests for the ${name} field.`, () => { + test.each(unitTests)( + '\n Test %# : %s \nExpecting result.valid to be: %s', + (description, target, inputs) => { + const scriptOutput = validation()({ $row: inputs, $field: inputs[name], $name: name }); + expect(scriptOutput.valid).toBe(target); + }, + ); + }); + }); +}); From 3ee0fa55c9a5b552ad5339396326d99be38ab978 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Fri, 15 Sep 2023 16:38:20 -0400 Subject: [PATCH 72/80] Updated 'lost_to_followup_after_clinical_event' field to 'lost_to_followup_after_clinical_event_id' --- references/validationFunctions/donor/lost_to_followup.js | 4 ++-- schemas/donor.json | 2 +- tests/donor/lost_to_followup.test.js | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/references/validationFunctions/donor/lost_to_followup.js b/references/validationFunctions/donor/lost_to_followup.js index de254561..5d0f159c 100644 --- a/references/validationFunctions/donor/lost_to_followup.js +++ b/references/validationFunctions/donor/lost_to_followup.js @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 The Ontario Institute for Cancer Research. All rights reserved + * Copyright (c) 2023 The Ontario Institute for Cancer Research. All rights reserved * * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. * You should have received a copy of the GNU Affero General Public License along with @@ -19,7 +19,7 @@ */ /** - * The lost_to_followup_after_clinical_event field should only be submitted if vital_status is Alive. It should not be allowed to be submitted if vital_status is Deceased. + * The lost_to_followup_after_clinical_event_id field should only be submitted if vital_status is Alive. It should not be allowed to be submitted if vital_status is Deceased. */ const validation = () => (function validate(inputs) { diff --git a/schemas/donor.json b/schemas/donor.json index 293ab3bc..f354e09e 100644 --- a/schemas/donor.json +++ b/schemas/donor.json @@ -340,7 +340,7 @@ }, { "description": "If the donor became lost to follow up, indicate the identifier of the clinical event (eg. submitter_primary_diagnosis_id, submitter_treatment_id or submitter_follow_up_id) after which the donor became lost to follow up.", - "name": "lost_to_followup_after_clinical_event", + "name": "lost_to_followup_after_clinical_event_id", "valueType": "string", "restrictions": { "script": "#/script/donor/lost_to_followup" diff --git a/tests/donor/lost_to_followup.test.js b/tests/donor/lost_to_followup.test.js index 42bdff28..c6a5b2d2 100644 --- a/tests/donor/lost_to_followup.test.js +++ b/tests/donor/lost_to_followup.test.js @@ -26,14 +26,14 @@ const loadObjects = require('../loadObjects'); const donor = require('../constructDummyData').getSchemaDummy('donor'); const myUnitTests = { - "lost_to_followup_after_clinical_event": [ + "lost_to_followup_after_clinical_event_id": [ [ 'Alive donor with lost to follow up indicated.', true, loadObjects(donor, { "vital_status": "alive", - "lost_to_followup_after_clinical_event": "PD1" + "lost_to_followup_after_clinical_event_id": "PD1" } ) ], @@ -43,7 +43,7 @@ const myUnitTests = { loadObjects(donor, { "vital_status": "deceased", - "lost_to_followup_after_clinical_event" : "Tr-1" + "lost_to_followup_after_clinical_event_id" : "Tr-1" } ) From ec6b807708cfdf00da0110e8e9dd31739e821d80 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 21 Sep 2023 14:48:42 -0400 Subject: [PATCH 73/80] Added 'physician assessed progressive disease' to 'Physican Assessed Response Criteria' codelist --- references/validationFunctions/treatment/responseToTreatment.js | 1 + 1 file changed, 1 insertion(+) diff --git a/references/validationFunctions/treatment/responseToTreatment.js b/references/validationFunctions/treatment/responseToTreatment.js index 9abc07d0..1c72c2cc 100644 --- a/references/validationFunctions/treatment/responseToTreatment.js +++ b/references/validationFunctions/treatment/responseToTreatment.js @@ -87,6 +87,7 @@ const validation = () => codeList = [ 'physician assessed complete response', 'physician assessed partial response', + 'physician assessed progressive disease', 'physician assessed stable disease' ]; break; From c4d00ac7c712f4715e3ac34fb66fe26e48772863 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 21 Sep 2023 14:54:57 -0400 Subject: [PATCH 74/80] Added 'Physician assessed progressive disease' to 'response_to_treatment' codelist --- schemas/treatment.json | 1 + 1 file changed, 1 insertion(+) diff --git a/schemas/treatment.json b/schemas/treatment.json index 820d95b6..9c15d492 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -284,6 +284,7 @@ "Partial response", "Physician assessed complete response", "Physician assessed partial response", + "Physician assessed progressive disease", "Physician assessed stable disease", "Progressive disease", "Stable disease" From 720d7b948bfd334889e8f7a1eb86c1f957fbddd6 Mon Sep 17 00:00:00 2001 From: Hardeep Date: Thu, 21 Sep 2023 15:48:36 -0400 Subject: [PATCH 75/80] Added two new terms ('Cell line - derived from metastatic tumour' and 'Xenograft - derived from metastatic tumour') to 'specimen_type' codelist --- schemas/sample_registration.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/schemas/sample_registration.json b/schemas/sample_registration.json index 292f9cba..718cc3c4 100644 --- a/schemas/sample_registration.json +++ b/schemas/sample_registration.json @@ -123,6 +123,7 @@ "restrictions": { "required": true, "codeList": [ + "Cell line - derived from metastatic tumour", "Cell line - derived from normal", "Cell line - derived from tumour", "Cell line - derived from xenograft tumour", @@ -137,6 +138,7 @@ "Primary tumour", "Recurrent tumour", "Tumour - unknown if derived from primary or metastatic", + "Xenograft - derived from metastatic tumour", "Xenograft - derived from primary tumour", "Xenograft - derived from tumour cell line" ], From 31b643fcca4c7415cd99a332f1869edf02e28de6 Mon Sep 17 00:00:00 2001 From: Anders Richardsson <2107110+justincorrigible@users.noreply.github.com> Date: Mon, 16 Oct 2023 12:35:19 -0400 Subject: [PATCH 76/80] update node setup script for tests@main Action workflow --- .github/workflows/test.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 06416c24..98955c9b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,14 +9,13 @@ on: jobs: build: - runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 + - uses: actions/setup-node@v3 with: - node-version: '12.x' + node-version: "18.x" - run: npm ci - - run: npm i object.fromentries + - run: npm i object.fromentries - run: npm test From 53fcb45d5a79eaea72567fb462e0634aa839e42b Mon Sep 17 00:00:00 2001 From: Anders Richardsson <2107110+caravinci@users.noreply.github.com> Date: Wed, 25 Oct 2023 14:54:55 -0400 Subject: [PATCH 77/80] add unknown treatment exception validations --- .gitignore | 1 + .../treatment/checkWhenNoTreatment.js | 97 ++- tests/treatment/checkWhenNoTreatment.test.js | 604 +++++++++++------- 3 files changed, 446 insertions(+), 256 deletions(-) diff --git a/.gitignore b/.gitignore index c25e1928..f985e1de 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.DS_Store node_modules dictionary.json populated_dictionary.json diff --git a/references/validationFunctions/treatment/checkWhenNoTreatment.js b/references/validationFunctions/treatment/checkWhenNoTreatment.js index 249d4689..e6318a45 100644 --- a/references/validationFunctions/treatment/checkWhenNoTreatment.js +++ b/references/validationFunctions/treatment/checkWhenNoTreatment.js @@ -5,42 +5,81 @@ * You should have received a copy of the GNU Affero General Public License along with * this program. If not, see . * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * */ /** - * If treatment_type is 'No treatment', core treatment fields should not be submitted. + * If treatment_type is 'No treatment' or 'Unknown', core treatment fields should not be submitted. */ -const validation = () => - (function validate(inputs) { - const {$row, $name, $field} = inputs; - let result = {valid: true, message: "Ok"}; - const coreFields = ['treatment_start_interval', 'treatment_duration', 'is_primary_treatment', 'treatment_intent', 'treatment_setting', 'response_to_treatment_criteria_method', 'response_to_treatment']; - - // checks for a string just consisting of whitespace - const checkforEmpty = (entry) => {return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1'))}; - const treatmentType = ($row.treatment_type).map(value => value.toLowerCase()); - - if (!treatmentType.includes("no treatment") && coreFields.includes($name) && (!$field || $field === null || checkforEmpty($field))) { - result = { valid: false, message: `The '${$name}' field must be submitted when the 'treatment_type' field is '${treatmentType}'`}; - } - else if (treatmentType.includes("no treatment") && ($field && $field != null && !(checkforEmpty($field)))) { - if (coreFields.includes($name) || (typeof($field) === 'string' && $field.trim().toLowerCase() != 'not applicable') || typeof($field) === 'number') { - result = { valid: false, message: `The '${$name}' field cannot be submitted if the 'treatment_type' field is '${treatmentType}'`}; +const validation = () => + (function validate(inputs) { + const { $row, $name, $field } = inputs; + const result = { valid: true, message: 'Ok' }; + + const arrayItemsInSecondArray = (arr1, arr2) => { + return arr2.some(arr2Item => { + return arr1.includes(arr2Item); + }); + }; + + const coreFields = [ + 'treatment_start_interval', + 'treatment_duration', + 'is_primary_treatment', + 'treatment_intent', + 'treatment_setting', + 'response_to_treatment_criteria_method', + 'response_to_treatment', + ]; + + const treatmentExceptionTypes = ['no treatment', 'unknown']; + + // checks for a string just consisting of whitespace + const checkforEmpty = entry => { + return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1')); + }; + const treatmentTypes = $row.treatment_type.map(value => value.toLowerCase()); + + const recordHasTreatments = !arrayItemsInSecondArray( + treatmentExceptionTypes, + treatmentTypes, + ); + + if (recordHasTreatments) { + if ( + coreFields.includes($name) && + (!$field || $field === null || checkforEmpty($field)) + ) { + return { + valid: false, + message: `The '${$name}' field must be submitted when the 'treatment_type' field is '${treatmentTypes}'`, + }; + } + + } else if ($field && $field != null && !checkforEmpty($field)) { + if ( + coreFields.includes($name) || + (typeof $field === 'string' && $field.trim().toLowerCase() != 'not applicable') || + typeof $field === 'number' + ) { + return { + valid: false, + message: `The '${$name}' field cannot be submitted if the 'treatment_type' field is '${treatmentTypes}'`, + }; + } } - } - return result; - }); + return result; + }); module.exports = validation; diff --git a/tests/treatment/checkWhenNoTreatment.test.js b/tests/treatment/checkWhenNoTreatment.test.js index b85b5994..0361f790 100644 --- a/tests/treatment/checkWhenNoTreatment.test.js +++ b/tests/treatment/checkWhenNoTreatment.test.js @@ -5,16 +5,16 @@ * You should have received a copy of the GNU Affero General Public License along with * this program. If not, see . * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * */ @@ -26,288 +26,438 @@ const loadObjects = require('../loadObjects'); // load in all fields with entries prepopulated to null const treatment = require('../constructDummyData').getSchemaDummy('treatment'); - // key -> name of field, value -> unit tests const myUnitTests = { - 'treatment_start_interval': [ + treatment_start_interval: [ + [ + 'treatment_start_interval is submitted when treatment was given', + true, + loadObjects(treatment, { + treatment_start_interval: 409, + treatment_type: ['Chemotherapy'], + }), + ], + [ + 'treatment_start_interval is missing when treatment was given', + false, + loadObjects(treatment, { + treatment_type: ['Surgery'], + }), + ], [ 'treatment_start_interval is submitted when no treatment was given', false, - loadObjects(treatment, - { - "treatment_start_interval": 30, - "treatment_type": ["No treatment"] - } - ) + loadObjects(treatment, { + treatment_start_interval: 30, + treatment_type: ['No treatment'], + }), ], [ - 'treatment_start_interval is submitted when treatment is given', + 'treatment_start_interval is submitted when treatment was unknown', + false, + loadObjects(treatment, { + treatment_start_interval: 30, + treatment_type: ['Unknown'], + }), + ], + [ + 'treatment_start_interval is missing when no treatment was given', true, - loadObjects(treatment, - { - "treatment_start_interval": 409, - "treatment_type": ["Chemotherapy"] - } - ) + loadObjects(treatment, { + treatment_type: ['No treatment'], + }), ], [ - 'treatment_start_interval is not submitted when no treatment is given', + 'treatment_start_interval is missing when treatment was unknown', true, - loadObjects(treatment, - { - "treatment_type": ["No treatment"] - } - ) - ] + loadObjects(treatment, { + treatment_type: ['Unknown'], + }), + ], ], - 'treatment_duration': [ + treatment_duration: [ [ - 'treatment_duration is submitted when no treatment was given', + 'treatment_duration is submitted when treatment was given', + true, + loadObjects(treatment, { + treatment_duration: 40, + treatment_type: ['Chemotherapy'], + }), + ], + [ + 'treatment_duration is missing when treatment was given', false, - loadObjects(treatment, - { - "treatment_duration": 30, - "treatment_type": ["No treatment"] - } - ) + loadObjects(treatment, { + treatment_type: ['Surgery'], + }), ], [ - 'treatment_duration is submitted when treatment is given', + 'treatment_duration is missing when no treatment was given', true, - loadObjects(treatment, - { - "treatment_duration": 40, - "treatment_type": ["Chemotherapy"] - } - ) + loadObjects(treatment, { + treatment_type: ['No treatment'], + }), ], [ - 'treatment_duration is missing when treatment is given', + 'treatment_duration is missing when treatment was unknown', + true, + loadObjects(treatment, { + treatment_type: ['Unknown'], + }), + ], + [ + 'treatment_duration is submitted when no treatment was given', false, - loadObjects(treatment, - { - "treatment_type": ["Surgery"] - } - ) - ] + loadObjects(treatment, { + treatment_duration: 30, + treatment_type: ['No treatment'], + }), + ], + [ + 'treatment_duration is submitted when treatment was unknown', + false, + loadObjects(treatment, { + treatment_duration: 30, + treatment_type: ['Unknown'], + }), + ], ], - 'is_primary_treatment': [ + is_primary_treatment: [ + [ + 'is_primary_treatment is submitted when treatment was given', + true, + loadObjects(treatment, { + is_primary_treatment: 'No', + treatment_type: ['Chemotherapy'], + }), + ], + [ + 'is_primary_treatment is missing when no treatment was given', + true, + loadObjects(treatment, { + treatment_type: ['No treatment'], + }), + ], + [ + 'is_primary_treatment is missing when no treatment was given', + true, + loadObjects(treatment, { + treatment_type: ['Unknown'], + }), + ], + [ + 'is_primary_treatment is empty when no treatment was given', + true, + loadObjects(treatment, { + is_primary_treatment: '', + treatment_type: ['No treatment'], + }), + ], + [ + 'is_primary_treatment is empty when no treatment was given', + true, + loadObjects(treatment, { + is_primary_treatment: '', + treatment_type: ['Unknown'], + }), + ], [ 'is_primary_treatment is missing when treatment was given', false, - loadObjects(treatment, - { - "treatment_type": ["Chemotherapy"] - } - ) + loadObjects(treatment, { + treatment_type: ['Chemotherapy'], + }), ], [ 'is_primary_treatment is submitted when no treatment was given', false, - loadObjects(treatment, - { - "is_primary_treatment": "Yes", - "treatment_type": ["No treatment"] - } - ) + loadObjects(treatment, { + is_primary_treatment: 'Yes', + treatment_type: ['No treatment'], + }), ], [ - 'is_primary_treatment is submitted when treatment is given', + 'is_primary_treatment is submitted when treatment was unknown', + false, + loadObjects(treatment, { + is_primary_treatment: 'Yes', + treatment_type: ['Unknown'], + }), + ], + ], + treatment_setting: [ + [ + 'treatment_setting is submitted when treatment was given', true, - loadObjects(treatment, - { - "is_primary_treatment": "No", - "treatment_type": ["Chemotherapy"] - } - ) + loadObjects(treatment, { + treatment_setting: 'adjuvant', + treatment_type: ['Chemotherapy'], + }), + ], + [ + 'treatment_setting is missing when treatment was given', + false, + loadObjects(treatment, { + treatment_type: ['Surgery'], + }), ], [ - 'is_primary_treatment is not submitted when no treatment is given', + 'treatment_setting is missing when no treatment was given', true, - loadObjects(treatment, - { - "is_primary_treatment": "", - "treatment_type": ["No treatment"] - } - ) + loadObjects(treatment, { + treatment_type: ['no treatment'], + }), ], [ - 'is_primary_treatment is not submitted when no treatment is given', + 'treatment_setting is missing when treatment was unknowm', true, - loadObjects(treatment, - { - "treatment_type": ["No treatment"] - } - ) - ] - ], - 'treatment_setting': [ + loadObjects(treatment, { + treatment_type: ['Unknown'], + }), + ], [ 'treatment_setting is submitted when no treatment was given', false, - loadObjects(treatment, - { - "treatment_setting": "neoadjuvant", - "treatment_type": ["No treatment"] - } - ) + loadObjects(treatment, { + treatment_setting: 'neoadjuvant', + treatment_type: ['No treatment'], + }), + ], + [ + 'treatment_setting is submitted when treatment was unknown', + false, + loadObjects(treatment, { + treatment_setting: 'neoadjuvant', + treatment_type: ['Unknown'], + }), ], + ], + treatment_intent: [ [ - 'treatment_setting is submitted when treatment is given', + 'treatment_intent is submitted when treatment was given', true, - loadObjects(treatment, - { - "treatment_setting": "adjuvant", - "treatment_type": ["Chemotherapy"] - } - ) + loadObjects(treatment, { + treatment_intent: 'palliative', + treatment_type: ['Chemotherapy'], + }), ], [ - 'treatment_setting is not submitted when no treatment is given', + 'treatment_intent is missing when treatment was given', + false, + loadObjects(treatment, { + treatment_type: ['Surgery'], + }), + ], + [ + 'treatment_intent is not submitted when no treatment was given', true, - loadObjects(treatment, - { - "treatment_type": ["no treatment"] - } - ) - ] - - ], - 'treatment_intent': [ + loadObjects(treatment, { + treatment_type: ['No treatment'], + }), + ], + [ + 'treatment_intent is not submitted when treatment was unknown', + true, + loadObjects(treatment, { + treatment_type: ['Unknown'], + }), + ], [ 'treatment_intent is submitted when no treatment was given', false, - loadObjects(treatment, - { - "treatment_intent": "curative", - "treatment_type": ["No treatment"] - } - ) + loadObjects(treatment, { + treatment_intent: 'curative', + treatment_type: ['No treatment'], + }), ], [ - 'treatment_intent is submitted when treatment is given', + 'treatment_intent is submitted when treatment was unknown', + false, + loadObjects(treatment, { + treatment_intent: 'curative', + treatment_type: ['Unknown'], + }), + ], + ], + days_per_cycle: [ + [ + 'days per cycle is submitted when treatment was given', true, - loadObjects(treatment, - { - "treatment_intent": "palliative", - "treatment_type": ["Chemotherapy"] - } - ) + loadObjects(treatment, { + days_per_cycle: 12, + treatment_type: ['Chemotherapy'], + }), ], [ - 'treatment_intent is not submitted when no treatment is given', + 'days per cycle is missing when treatment was given', true, - loadObjects(treatment, - { - "treatment_type": ["no treatment"] - } - ) - ] - - ], - 'days_per_cycle': [ - [ - 'days per cycle is submitted when Chemotherapy was given', - true, - loadObjects(treatment, - { - "days_per_cycle": 12, - "treatment_type": ["Chemotherapy"] - } - ) - ], - [ - 'days per cycle is submitted when no treatment was given', - false, - loadObjects(treatment, - { - "days_per_cycle": 10, - "treatment_type": ["no treatment"] - } - ) - ] + loadObjects(treatment, { + treatment_type: ['Surgery'], + }), + ], + [ + 'days per cycle is missing when no treatment was given', + true, + loadObjects(treatment, { + treatment_type: ['No treatment'], + }), + ], + [ + 'days per cycle is missing when treatment was unknown', + true, + loadObjects(treatment, { + treatment_type: ['Unknown'], + }), + ], + [ + 'days per cycle is submitted when no treatment was given', + false, + loadObjects(treatment, { + days_per_cycle: 10, + treatment_type: ['No treatment'], + }), + ], + [ + 'days per cycle is submitted when treatment was unknown', + false, + loadObjects(treatment, { + days_per_cycle: 10, + treatment_type: ['Unknown'], + }), + ], + ], + outcome_of_treatment: [ + [ + 'outcome_of_treatment is submitted when treatment was given', + true, + loadObjects(treatment, { + outcome_of_treatment: 'treatment completed as prescribed', + treatment_type: ['Chemotherapy'], + }), + ], + [ + 'outcome_of_treatment is missing when treatment was given', + true, + loadObjects(treatment, { + treatment_type: ['Surgery'], + }), + ], + [ + 'outcome_of_treatment is not applicable when no treatment was given', + true, + loadObjects(treatment, { + outcome_of_treatment: 'Not Applicable', + treatment_type: ['No treatment'], + }), + ], + [ + 'outcome_of_treatment is not applicable when treatment was unknown', + true, + loadObjects(treatment, { + outcome_of_treatment: 'Not Applicable', + treatment_type: ['Unknown'], + }), + ], + [ + 'outcome_of_treatment is empty when no treatment was given', + true, + loadObjects(treatment, { + outcome_of_treatment: '', + treatment_type: ['No treatment'], + }), + ], + [ + 'outcome_of_treatment is empty when treatment was unknown', + true, + loadObjects(treatment, { + outcome_of_treatment: '', + treatment_type: ['Unknown'], + }), + ], + [ + 'outcome_of_treatment is missing when no treatment was given', + true, + loadObjects(treatment, { + treatment_type: ['No treatment'], + }), + ], + [ + 'outcome_of_treatment is missing when treatment was unknown', + true, + loadObjects(treatment, { + treatment_type: ['Unknown'], + }), + ], + [ + 'outcome_of_treatment is submitted when no treatment was given', + false, + loadObjects(treatment, { + outcome_of_treatment: 'treatment completed as prescribed', + treatment_type: ['No treatment'], + }), + ], + [ + 'outcome_of_treatment is submitted when treatment was unknown', + false, + loadObjects(treatment, { + outcome_of_treatment: 'treatment completed as prescribed', + treatment_type: ['Unknown'], + }), + ], ], - 'outcome_of_treatment': [ - [ - 'outcome_of_treatment is submitted when no treatment was given', - false, - loadObjects(treatment, - { - "outcome_of_treatment": "treatment completed as prescribed", - "treatment_type": ["no treatment"] - } - ) - ], - [ - 'outcome_of_treatment is not applicable when no treatment was given', - true, - loadObjects(treatment, - { - "outcome_of_treatment": "Not Applicable", - "treatment_type": ["no treatment"] - } - ) - ], - [ - 'outcome_of_treatment is empty when no treatment was given', - true, - loadObjects(treatment, - { - "outcome_of_treatment": "", - "treatment_type": ["no treatment"] - } - ) - ] + response_to_treatment_criteria_method: [ + [ + 'response_to_treatment_criteria_method is submitted when no treatment was given', + false, + loadObjects(treatment, { + response_to_treatment_criteria_method: 'RECIST', + treatment_type: ['no treatment'], + }), + ], + [ + 'response_to_treatment_criteria_method is missing when radiation treatment was given', + false, + loadObjects(treatment, { + treatment_type: ['radiation therapy'], + }), + ], ], - 'response_to_treatment_criteria_method': [ - [ - 'response_to_treatment_criteria_method is submitted when no treatment was given', - false, - loadObjects(treatment, - { - "response_to_treatment_criteria_method": "RECIST", - "treatment_type": ["no treatment"] - } - ) - ], - [ - 'response_to_treatment_criteria_method is missing when radiation treatment was given', - false, - loadObjects(treatment, - { - "treatment_type": ["radiation therapy"] - } - ) - ] - ] +}; -} - -describe("Common Tests",()=>{ - Object.entries(myUnitTests).forEach(field =>{ +describe('Common Tests', () => { + Object.entries(myUnitTests).forEach(field => { const name = field[0]; const unitTests = field[1]; - unitTests.forEach(test=>{ + + unitTests.forEach(test => { const testIndex = 2; const testInputs = test[testIndex]; - universalTest(validation()({ $row: testInputs, $name: name, $field: testInputs[name]})); - }) - }) - -}) -describe("Unit Tests for treatment fields when no treatment is given",()=>{ + universalTest( + validation()({ $row: testInputs, $name: name, $field: testInputs[name] }), + ); + }); + }); +}); + +describe('Unit Tests for treatment fields when no treatment was given', () => { Object.entries(myUnitTests).forEach(field => { const name = field[0]; const unitTests = field[1]; - describe(`Tests for the ${name} field.`,()=>{ - test.each(unitTests)('\n Test %# : %s \nExpecting result.valid to be: %s',(description,target,inputs) =>{ - const scriptOutput = validation()({ $row: inputs, $field: inputs[name], $name: name}); - expect(scriptOutput.valid).toBe(target); - }) - }) - - }) - -}) + describe(`Tests for the ${name} field.`, () => { + test.each(unitTests)( + '\n Test %# : %s \nExpecting result.valid to be: %s', + (description, target, inputs) => { + const scriptOutput = validation()({ + $row: inputs, + $field: inputs[name], + $name: name, + }); + + expect(scriptOutput.valid).toBe(target); + }, + ); + }); + }); +}); From b7713023efe12d3fe3816432a04bf9fa428b18a2 Mon Sep 17 00:00:00 2001 From: Anders Richardsson <2107110+justincorrigible@users.noreply.github.com> Date: Tue, 31 Oct 2023 19:11:53 -0400 Subject: [PATCH 78/80] add percent tumour cell exception validations (#424) --- .../specimen/percentageTumourCells.js | 49 +++++++++++ schemas/specimen.json | 55 ++++++------ tests/specimen/percentageTumourCells.test.js | 86 +++++++++++++++++++ 3 files changed, 164 insertions(+), 26 deletions(-) create mode 100644 references/validationFunctions/specimen/percentageTumourCells.js create mode 100644 tests/specimen/percentageTumourCells.test.js diff --git a/references/validationFunctions/specimen/percentageTumourCells.js b/references/validationFunctions/specimen/percentageTumourCells.js new file mode 100644 index 00000000..4dcd9ab8 --- /dev/null +++ b/references/validationFunctions/specimen/percentageTumourCells.js @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2023 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +const validation = () => +(function validate(inputs) { + // When $name is percent_tumour_cells, and $field is a number between 0 and 1 + const {$row, $name, $field} = inputs; + + const result = { valid: true, message: 'Ok' }; + const measurementMethodExceptionTypes = ['not applicable']; + + // checks for a string just consisting of whitespace + const checkforEmpty = (entry) => { + return /^\s+$/g.test(decodeURI(entry).replace(/^"(.*)"$/, '$1')); + }; + + const fieldHasValue = $field && $field != null && !(checkforEmpty($field)); + const measurementMethod = $row?.percent_tumour_cells_measurement_method?.trim?.().toLowerCase(); + + if (fieldHasValue) { + if (measurementMethodExceptionTypes.includes(measurementMethod)) { + return { + valid: false, + message: `The '${$name}' field cannot be submitted when 'percent_tumour_cells_measurement_method' = 'Not applicable'` + }; + } + } + + return result; + }); + +module.exports = validation; diff --git a/schemas/specimen.json b/schemas/specimen.json index b7fc9a40..e5500a6d 100644 --- a/schemas/specimen.json +++ b/schemas/specimen.json @@ -152,7 +152,7 @@ "restrictions": { "required": true, "range": { - "min": 0 + "min": 0 } } }, @@ -220,7 +220,9 @@ "Unknown" ] }, - "meta": { "displayName": "Specimen Processing" } + "meta": { + "displayName": "Specimen Processing" + } }, { "name": "specimen_storage", @@ -331,10 +333,11 @@ "displayName": "Percent Tumour Cells" }, "restrictions": { - "range": { - "min": 0, - "max": 1 - } + "range": { + "min": 0, + "max": 1 + }, + "script": "#/script/specimen/percentageTumourCells" } }, { @@ -349,9 +352,9 @@ }, "restrictions": { "codeList": [ - "Genomics", - "Image analysis", - "Pathology estimate by percent nuclei" + "Genomics", + "Image analysis", + "Pathology estimate by percent nuclei" ] } }, @@ -365,10 +368,10 @@ "displayName": "Percent Proliferating Cells" }, "restrictions": { - "range": { - "min": 0, - "max": 1 - } + "range": { + "min": 0, + "max": 1 + } } }, { @@ -381,10 +384,10 @@ "displayName": "Percent Inflammatory Tissue" }, "restrictions": { - "range": { - "min": 0, - "max": 1 - } + "range": { + "min": 0, + "max": 1 + } } }, { @@ -397,10 +400,10 @@ "displayName": "Percent Stromal Cells" }, "restrictions": { - "range": { - "min": 0, - "max": 1 - } + "range": { + "min": 0, + "max": 1 + } } }, { @@ -413,11 +416,11 @@ "displayName": "Percent Necrosis" }, "restrictions": { - "range": { - "min": 0, - "max": 1 - } + "range": { + "min": 0, + "max": 1 + } } } ] -} +} \ No newline at end of file diff --git a/tests/specimen/percentageTumourCells.test.js b/tests/specimen/percentageTumourCells.test.js new file mode 100644 index 00000000..55543dba --- /dev/null +++ b/tests/specimen/percentageTumourCells.test.js @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2023 The Ontario Institute for Cancer Research. All rights reserved + * + * This program and the accompanying materials are made available under the terms of the GNU Affero General Public License v3.0. + * You should have received a copy of the GNU Affero General Public License along with + * this program. If not, see . + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +const validation = require('./../../references/validationFunctions/specimen/percentageTumourCells.js'); +const universalTest = require('../universal'); +const loadObjects = require('../loadObjects'); + +// load in all fields with entries prepopulated to null +const specimen = require('../constructDummyData').getSchemaDummy('specimen'); + +// the name of the field being validateds +const name = 'percent_tumour_cells'; + +const unitTests = [ + [ + 'A percentage of tumour cells is given, and a measurement method is given too', + true, + loadObjects(specimen, { + percent_tumour_cells: 0.5, + percent_tumour_cells_measurement_method: 'Genomics', + }), + ], + [ + 'A percentage of tumour cells is given, and a measurement method does not apply', + false, + loadObjects(specimen, { + percent_tumour_cells: 0.5, + percent_tumour_cells_measurement_method: 'Not applicable', + }), + ], + [ + 'A percentage of tumour cells is given, and a measurement method is missing', + true, + loadObjects(specimen, { + percent_tumour_cells: 0.5, + }), + ], + [ + 'A percentage of tumour cells is missing, and a measurement method is given too', + true, + loadObjects(specimen, { + percent_tumour_cells_measurement_method: 'Image analysis', + }), + ], + [ + 'A percentage of tumour cells is missing, and a measurement method does not apply', + true, + loadObjects(specimen, { + percent_tumour_cells_measurement_method: 'Not applicable', + }), + ], + ['Both fields are undefined', true, specimen] +]; + +describe('Common Tests', () => { + unitTests.forEach(([description, expected, testInputs]) => { + universalTest(validation()({ $row: testInputs, $name: name, $field: testInputs[name]})); + }); +}); + +describe('Unit Tests for Tumour Grade', () => { + test.each(unitTests)( + '\n Test %# : %s \nExpecting result.valid to be: %s', + (description, target, inputs) => { + const scriptOutput = validation()({ $row: inputs, $field: inputs[name], $name: name}); + expect(scriptOutput.valid).toBe(target); + }, + ); +}); From 4c6f90cfb64511dac62a3538e39737a90e6cd470 Mon Sep 17 00:00:00 2001 From: Linda Xiang Date: Thu, 14 Dec 2023 11:23:49 -0500 Subject: [PATCH 79/80] add new value of end of life care into treatment_type --- schemas/treatment.json | 1 + 1 file changed, 1 insertion(+) diff --git a/schemas/treatment.json b/schemas/treatment.json index 9c15d492..ded341b3 100644 --- a/schemas/treatment.json +++ b/schemas/treatment.json @@ -75,6 +75,7 @@ "Bone marrow transplant", "Chemotherapy", "Endoscopic therapy", + "End of life care", "Hormonal therapy", "Immunotherapy", "No treatment", From c82d76bbfe6c9f2bbc480df9d0f1feb6587b58c5 Mon Sep 17 00:00:00 2001 From: Linda Xiang Date: Tue, 16 Apr 2024 11:33:13 -0400 Subject: [PATCH 80/80] add new value of mg into the dose_unit --- references/list.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/references/list.json b/references/list.json index 33b37e5a..cee5072c 100644 --- a/references/list.json +++ b/references/list.json @@ -34,7 +34,7 @@ "Revised International staging system (R-ISS)", "St Jude staging system" ], - "drug_dose_units": ["mg/m2", "IU/m2", "ug/m2", "g/m2", "mg/kg"], + "drug_dose_units": ["mg/m2", "IU/m2", "ug/m2", "g/m2", "mg/kg", "mg"], "stage_groups": ["Occult Carcinoma", "Stage 0", "Stage 0a", "Stage 0is", "Stage 1", "Stage 1A", "Stage 1B", "Stage A", "Stage B", "Stage C", "Stage I", "Stage IA", "Stage IA1", "Stage IA2", "Stage IA3", "Stage IAB", "Stage IAE", "Stage IAES", "Stage IAS", "Stage IB", "Stage IB1", "Stage IB2", "Stage IBE", "Stage IBES", "Stage IBS", "Stage IC", "Stage IE", "Stage IEA", "Stage IEB", "Stage IES", "Stage II", "Stage II bulky", "Stage IIA", "Stage IIA1", "Stage IIA2", "Stage IIAE", "Stage IIAES", "Stage IIAS", "Stage IIB", "Stage IIBE", "Stage IIBES", "Stage IIBS", "Stage IIC", "Stage IIE", "Stage IIEA", "Stage IIEB", "Stage IIES", "Stage III", "Stage IIIA", "Stage IIIA1", "Stage IIIA2", "Stage IIIAE", "Stage IIIAES", "Stage IIIAS", "Stage IIIB", "Stage IIIBE", "Stage IIIBES", "Stage IIIBS", "Stage IIIC", "Stage IIIC1", "Stage IIIC2", "Stage IIID", "Stage IIIE", "Stage IIIES", "Stage IIIS", "Stage IIS", "Stage IS", "Stage IV", "Stage IVA", "Stage IVA1", "Stage IVA2", "Stage IVAE", "Stage IVAES", "Stage IVAS", "Stage IVB", "Stage IVBE", "Stage IVBES", "Stage IVBS", "Stage IVC", "Stage IVE", "Stage IVES", "Stage IVS", "Cannot be assessed"], "t_categories": ["T0","T1","T1a","T1a1","T1a2","T1a(s)","T1a(m)","T1b","T1b1","T1b2","T1b(s)","T1b(m)","T1c","T1d","T1mi","T2","T2(s)","T2(m)","T2a","T2a1","T2a2","T2b","T2c","T2d","T3","T3(s)","T3(m)","T3a","T3b","T3c","T3d","T3e","T4","T4a","T4a(s)","T4a(m)","T4b","T4b(s)","T4b(m)","T4c","T4d","T4e","Ta","Tis","Tis(DCIS)","Tis(LAMN)","Tis(LCIS)","Tis(Paget)","Tis(Paget’s)","Tis pd","Tis pu","TX"], "n_categories": ["N0","N0a","N0a (biopsy)","N0b","N0b (no biopsy)","N0(i+)","N0(i-)","N0(mol+)","N0(mol-)","N1","N1a","N1a(sn)","N1b","N1c","N1mi","N2","N2a","N2b","N2c","N2mi","N3","N3a","N3b","N3c","N4","NX"],