diff --git a/cypress.config.js b/cypress.config.js index 9633087d..5e90efb9 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -26,7 +26,8 @@ module.exports = defineConfig({ findFiles, isFileExist }); - } + }, + experimentalStudio: true }, component: { diff --git a/cypress/e2e/app/simple-e2etest.cy.js b/cypress/e2e/app/simple-e2etest.cy.js index e06c6123..ad2c75d3 100644 --- a/cypress/e2e/app/simple-e2etest.cy.js +++ b/cypress/e2e/app/simple-e2etest.cy.js @@ -146,7 +146,7 @@ describe("End to end test using a simple UI path through the app", () => { expect(fileContent.iq.Annotations.IsAbout.Label).to.eq("Assessment tool"); expect(fileContent.iq.Annotations.IsAbout.TermURL).to.eq("nb:Assessment"); expect(fileContent.iq.Annotations.IsPartOf.Label).to.eq("Wechsler Abbreviated Scale of Intelligence"); - expect(fileContent.iq.Annotations.IsPartOf.TermURL).to.eq("cogAtlas:trm_4b94affc43245"); + expect(fileContent.iq.Annotations.IsPartOf.TermURL).to.eq("cogatlas:trm_4b94affc43245"); }); }); diff --git a/cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js b/cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js new file mode 100644 index 00000000..a6eea532 --- /dev/null +++ b/cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js @@ -0,0 +1,114 @@ +describe("to annotate an assessment ", () => { + it("sets up some stuff", () => { + // Load some data + cy.visit('/'); + cy.get('[data-cy="data-table-selector"]').get('input').selectFile('cypress/fixtures/examples/good/example_synthetic.tsv', { force: true }); + + /* ==== Generated with Cypress Studio ==== */ + cy.get('[data-cy="data-dictionary-selector"] > .row > form > .file-selector-button').click(); + cy.get('[data-cy="data-dictionary-selector"] > .row > form > .file-selector-button > input').selectFile('cypress/fixtures/examples/good/example_synthetic.json', { force: true }); + /* ==== End Cypress Studio ==== */ + cy.get("[data-cy='button-nextpage']").click(); + + // Categorize some columns + const desiredColumnMappings = [ + { + "column": "participant_id", + "category": "Subject ID" + }, + { + "column": "pheno_age", + "category": "Age" + + }, + { + "column": "pheno_sex", + "category": "Sex" + }, + { + "column": "pheno_group", + "category": "Diagnosis" + }, + { + "column": "tool1_item1", + "category": "Assessment Tool" + }, + { + "column": "tool1_item2", + "category": "Assessment Tool" + }, + { + "column": "tool2_item1", + "category": "Assessment Tool" + } + ]; + desiredColumnMappings.forEach(desiredColumnMapping => { + cy.get("[data-cy='categorization-table']").contains(desiredColumnMapping.category).click(); + cy.get("[data-cy='column-linking-table']").contains(desiredColumnMapping.column).click(); + }); + // Create two tools + cy.get("[data-cy='toolgroup-select']").type("Montreal Cognitive Assessment{enter}"); + cy.get("[data-cy='toolgroup-select']").type("Unified Parkinson's Disease Rating Scale{enter}"); + // Map columns to tools + const desiredColumnToolMappings = [ + { + "column": "tool1_item1", + "tool": "Montreal Cognitive Assessment" + }, + { + "column": "tool1_item2", + "tool": "Montreal Cognitive Assessment" + }, + { + "column": "tool2_item1", + "tool": "Unified Parkinson's Disease Rating Scale" + } + ]; + desiredColumnToolMappings.forEach(desiredColumnToolMapping => { + cy.get("[data-cy='assessment-tool-table']").contains(desiredColumnToolMapping.tool).click(); + cy.get("[data-cy='assessment-column-table']").contains(desiredColumnToolMapping.column).click(); + }); + + cy.get("[data-cy='button-nextpage']").click(); + + /* ==== Generated with Cypress Studio ==== */ + cy.get('#vs2__combobox > .vs__selected-options > .vs__search').click(); + cy.get('#vs2__option-1').click(); + cy.get('[data-cy="dataTable-pheno_age"] > tbody > :nth-child(3) > [aria-colindex="3"] > [data-cy="missingValueButton_2"]').click(); + cy.get("[data-cy='annotation-category-tabs'] ul").contains("li", "Sex").click(); + cy.get('#vs3__combobox > .vs__selected-options > .vs__search').click(); + cy.get('#vs3__option-1').click(); + cy.get('#vs4__combobox > .vs__selected-options > .vs__search').click(); + cy.get('#vs4__option-0').click(); + cy.get('[data-cy="annot-categorical-Sex"] > .card > .card-body > [data-cy="categoricalTable"] > tbody > :nth-child(3) > [aria-colindex="5"] > [data-cy="missingValueButton_2"]').click(); + cy.get("[data-cy='annotation-category-tabs'] ul").contains("li", "Diagnosis").click(); + cy.get('#vs6__combobox > .vs__selected-options > .vs__search').click(); + cy.get('thead > tr > [aria-colindex="6"]').click(); + cy.get('[data-cy="isControlButton_0"]').click(); + cy.get('#vs7__combobox > .vs__selected-options > .vs__search').click(); + cy.get('#vs7__combobox > .vs__selected-options > .vs__search').clear('a'); + cy.get('#vs7__combobox > .vs__selected-options > .vs__search').type('attention'); + cy.get('#vs7__combobox').click(); + cy.get('#vs7__combobox > .vs__selected-options > .vs__search').clear(); + cy.get('#vs7__combobox > .vs__selected-options > .vs__search').type('Attention deficit hyperactivity disorder'); + cy.get('#vs7__option-2').click(); + cy.get('[aria-colindex="5"] > [data-cy="missingValueButton_2"]').click(); + cy.get("[data-cy='annotation-category-tabs'] ul").contains("li", "Assessment Tool").click(); + cy.get('[data-cy="tool-annotation-for-cogatlas:tsk_4a57abb949ece"] > tbody > :nth-child(4) > [aria-colindex="3"] > [data-cy="missingValueButton_3"]').click(); + cy.get('[data-cy="Assessment Tool"]').contains("Montreal Cognitive Assessment").click(); + cy.get('[data-cy="tool-annotation-for-cogatlas:trm_57964b8a66aed"] > tbody > :nth-child(7) > [aria-colindex="3"] > [data-cy="missingValueButton_6"]').click(); + cy.get('[data-cy="tool-annotation-for-cogatlas:trm_57964b8a66aed"] > tbody > :nth-child(4) > [aria-colindex="3"] > [data-cy="missingValueButton_3"]').click(); + cy.get('[data-cy="button-nextpage"]').click(); + cy.get('[data-cy="download-button"]').click(); + /* ==== End Cypress Studio ==== */ + + cy.task("downloads", "cypress/downloads").then(folderStateAfter => { + cy.readFile('cypress/downloads/' + folderStateAfter[folderStateAfter.length - 1]).then((outputContent) => { + + const expectedOutput = require('../../fixtures/examples/good/example_synthetic_expected_output.json'); + expect(outputContent).to.deep.equal(expectedOutput); + }); + }); + }); + +}); \ No newline at end of file diff --git a/cypress/e2e/page/download-pagetests.cy.js b/cypress/e2e/page/download-pagetests.cy.js index 040eebe9..2bdf4a88 100644 --- a/cypress/e2e/page/download-pagetests.cy.js +++ b/cypress/e2e/page/download-pagetests.cy.js @@ -67,22 +67,26 @@ describe("tests on download page ui via programmatic state loading and store int // 2. Check contents of downloads folder cy.task("downloads", "cypress/downloads").then(folderStateAfter => { - // A. Check number of files in downloads folder has increased by one + // Check that we actually downloaded a file expect(folderStateAfter.length).to.be.eq(folderStateBefore.length + 1); - // B. Check that the last file retrieved by fs.readdirSync contains the data dictionary input file prefix - // as stored in dataDictionary.filename + cy.getVuexStoreValue("dataDictionary").then(dataDictionary => { + // Using the datadictionary name to locate the file downloaded by test for further verification + // may not be a foolproof solution since if another test ends up using the same data dictionary + // as input this approach may grab the wrong file and lead to test(s) failing const dataDictionaryFilenameNoExt = dataDictionary.filename.split(".").slice(0, -1).join("."); - - expect(folderStateAfter[folderStateAfter.length - 1]).to.contain(dataDictionaryFilenameNoExt); + expect(folderStateAfter.some(filename => filename.includes(dataDictionaryFilenameNoExt))).to.be.true; + + // Because we only have access to dataDictionary within the scope of this promise, + // we need to run our next assertion in here + const targetFile = folderStateAfter.filter(filename => filename.includes(dataDictionaryFilenameNoExt))[0]; + cy.readFile('cypress/downloads/' + targetFile).then((fileContent) => { + expect(fileContent.participant_id.Annotations).to.have.property("Identifies"); + expect(fileContent.participant_id.Annotations.Identifies).to.eq("participant"); + }); }); - // C. Check if the last file retrieved contains the Identifies property and its value under the participant_id key - cy.readFile('cypress/downloads/' + folderStateAfter[folderStateAfter.length - 1]).then((fileContent) => { - expect(fileContent.participant_id.Annotations).to.have.property("Identifies"); - expect(fileContent.participant_id.Annotations.Identifies).to.eq("participant"); - }); }); }); }); diff --git a/cypress/e2e/page/my_happy_annotation-page_tests.cy.js b/cypress/e2e/page/my_happy_annotation-page_tests.cy.js deleted file mode 100644 index 3f95377d..00000000 --- a/cypress/e2e/page/my_happy_annotation-page_tests.cy.js +++ /dev/null @@ -1,58 +0,0 @@ -describe("to annotate an assessment ", () => { - - - it("sets up some stuff", () => { - // Load some data - cy.visit('/'); - cy.get('[data-cy="data-table-selector"]').get('input').selectFile('cypress/fixtures/examples/good/example.tsv', { force: true }); - cy.get("[data-cy='button-nextpage']").click(); - - // Categorize some columns - const desiredColumnMappings = [ - { - "column": "participant_id", - "category": "Subject ID" - }, - { - "column": "sex", - "category": "Sex" - }, - { - "column": "group", - "category": "Diagnosis" - }, - { - "column": "stroop", - "category": "Assessment Tool" - }, - { - "column": "iq", - "category": "Assessment Tool" - } - ]; - desiredColumnMappings.forEach(desiredColumnMapping => { - cy.get("[data-cy='categorization-table']").contains(desiredColumnMapping.category).click(); - cy.get("[data-cy='column-linking-table']").contains(desiredColumnMapping.column).click(); - }); - // Create two tools - cy.get("[data-cy='toolgroup-select']").type("Wechsler Abbreviated Scale of Intelligence{enter}"); - cy.get("[data-cy='toolgroup-select']").type("Unified Parkinson's Disease Rating Scale{enter}"); - // Map columns to tools - const desiredColumnToolMappings = [ - { - "column": "iq", - "tool": "Wechsler Abbreviated Scale of Intelligence" - }, - { - "column": "stroop", - "tool": "Unified Parkinson's Disease Rating Scale" - } - ]; - desiredColumnToolMappings.forEach(desiredColumnToolMapping => { - cy.get("[data-cy='assessment-tool-table']").contains(desiredColumnToolMapping.tool).click(); - cy.get("[data-cy='assessment-column-table']").contains(desiredColumnToolMapping.column).click(); - }); - - cy.get("[data-cy='button-nextpage']").click(); - }); -}); \ No newline at end of file diff --git a/cypress/e2e/validate-output.cy.js b/cypress/e2e/validate-output.cy.js new file mode 100644 index 00000000..fa62aa89 --- /dev/null +++ b/cypress/e2e/validate-output.cy.js @@ -0,0 +1,33 @@ +const Ajv = require('ajv'); + +const outputJSONFilePath = 'cypress/fixtures/examples/good/ds003653_participant_annotated_1698934398962.json'; + +const schemaPath = 'cypress/fixtures/schema/neurobagel_data_dictionary.schema.json'; + + +describe('Validate Output', () => { + it('Validates example output against the schema', () => { + + const ajv = new Ajv(); + + cy.readFile(schemaPath) + .then((schema) => { + + const validate = ajv.compile(schema); + + cy.readFile(outputJSONFilePath) + .then((outputJSONData) => { + + const isValid = validate(outputJSONData); + + if (isValid) { + cy.log('JSON is valid according to the schema'); + } else { + cy.log('JSON is not valid according to the schema'); + cy.log(validate.errors); + } + cy.expect(isValid).to.be.true; + }); + }); + }); +}); diff --git a/cypress/fixtures/examples/good/ds003653_participant_annotated_1698934398962.json b/cypress/fixtures/examples/good/ds003653_participant_annotated_1698934398962.json new file mode 100644 index 00000000..df085cbd --- /dev/null +++ b/cypress/fixtures/examples/good/ds003653_participant_annotated_1698934398962.json @@ -0,0 +1,123 @@ +{ + "participant_id": { + "Description": "A participant ID", + "Annotations": { + "IsAbout": { + "Label": "Subject Unique Identifier", + "TermURL": "nb:ParticipantID" + }, + "Identifies": "participant" + } + }, + "age": { + "Annotations": { + "IsAbout": { + "Label": "Age", + "TermURL": "nb:Age" + }, + "Transformation": { + "Label": "integer value", + "TermURL": "nb:FromInt" + }, + "MissingValues": [] + }, + "Description": "age of the participant", + "Units": "years" + }, + "sex": { + "Annotations": { + "IsAbout": { + "Label": "Sex", + "TermURL": "nb:Sex" + }, + "Levels": { + "M": { + "Label": "male", + "TermURL": "bids:male" + }, + "F": { + "Label": "female", + "TermURL": "bids:female" + } + }, + "MissingValues": [] + }, + "Description": "sex of the participant as reported by the participant", + "Levels": { + "M": "male", + "F": "female" + } + }, + "group": { + "Annotations": { + "IsAbout": { + "Label": "Diagnosis", + "TermURL": "nb:Diagnosis" + }, + "Levels": { + "UD": { + "Label": "Acute depression", + "TermURL": "snomed:712823008" + }, + "HC": { + "Label": "Healthy Control", + "TermURL": "ncit:C94342" + }, + "HCconvertedMDD": { + "Label": "Borderline personality disorder", + "TermURL": "snomed:20010003" + } + }, + "MissingValues": [] + }, + "Description": "diagnostic status determined by the study clinician at baseline", + "Levels": { + "UD": "individuals with unipolar depression including those diagnosed with MDD and PDD", + "HC": "healthy controls", + "HCconvertedMDD": "individual that presented as HC at baseline, but converted to MDD during the course of the study" + } + }, + "group_dx": { + "Description": "specific diagnosis determined by the study clinician at baseline", + "missingValues": [], + "Levels": { + "MDD": "major depressive disorder", + "PDD": "persistent depressive disorder", + "HC": "healthy controls", + "HCconvertedMDD": "individual that presented as HC at baseline, but converted to MDD during the course of the study" + } + }, + "number_comorbid_dx": { + "Description": "a number of diagnoses comorbid with UD (e.g., GAD, PTSD)", + "missingValues": [], + "Units": "number" + }, + "medload": { + "Description": "reflects the number of dosage of psychotropic medications taken by participants. Higher numbers correspond to more medications and/or higher medication dosage ", + "missingValues": [], + "Units": "arbitrary units" + }, + "iq": { + "Annotations": { + "IsAbout": { + "TermURL": "nb:Assessment", + "Label": "Assessment tool" + }, + "IsPartOf": { + "TermURL": "cogAtlas:trm_4b94affc43245", + "Label": "Wechsler Abbreviated Scale of Intelligence" + }, + "MissingValues": [] + }, + "Description": "IQ derived based on the NART assessment.", + "Units": "arbitrary units" + }, + "session": { + "Description": "scanning session", + "missingValues": [], + "Levels": { + "1": "baseline", + "2": "6 months follow-up scan" + } + } +} \ No newline at end of file diff --git a/cypress/fixtures/examples/good/example_synthetic.json b/cypress/fixtures/examples/good/example_synthetic.json new file mode 100644 index 00000000..41e75aac --- /dev/null +++ b/cypress/fixtures/examples/good/example_synthetic.json @@ -0,0 +1,34 @@ +{ + "participant_id":{ + "Description":"A participant ID" + }, + "session_id":{ + "Description":"A session ID" + }, + "pheno_age":{ + "Description":"Age of the participant" + }, + "pheno_sex":{ + "Description":"Sex variable", + "Levels":{ + "M":"Male", + "F":"Female" + } + }, + "pheno_group":{ + "Description":"Group variable", + "Levels":{ + "PAT":"Patient", + "CTRL":"Control subject" + } + }, + "tool1_item1":{ + "Description":"item 1 scores for tool1" + }, + "tool1_item2":{ + "Description":"item 2 scores for tool1" + }, + "tool2_item1":{ + "Description":"item 1 scores for tool2" + } +} diff --git a/cypress/fixtures/examples/good/example_synthetic.tsv b/cypress/fixtures/examples/good/example_synthetic.tsv new file mode 100644 index 00000000..675aa6b6 --- /dev/null +++ b/cypress/fixtures/examples/good/example_synthetic.tsv @@ -0,0 +1,11 @@ +participant_id session_id pheno_age pheno_sex pheno_group tool1_item1 tool1_item2 tool2_item1 +sub-01 ses-01 34,1 F CTRL good far hello +sub-01 ses-02 35,3 F CTRL bad near world +sub-02 ses-01 NA M PAT ok missing hello +sub-02 ses-02 39,0 M PAT good middle friends +sub-03 ses-01 22,1 missing NA bad near not completed +sub-03 ses-02 23,2 missing PAT ok far hello +sub-04 ses-01 21,1 F CTRL missing missing hello +sub-04 ses-02 22,3 F CTRL good middle friends +sub-05 ses-01 42,5 M PAT bad near friends +sub-05 ses-02 43,2 M PAT good far world \ No newline at end of file diff --git a/cypress/fixtures/examples/good/example_synthetic_expected_output.json b/cypress/fixtures/examples/good/example_synthetic_expected_output.json new file mode 100644 index 00000000..3f7dafb3 --- /dev/null +++ b/cypress/fixtures/examples/good/example_synthetic_expected_output.json @@ -0,0 +1,131 @@ +{ + "participant_id":{ + "Description":"A participant ID", + "Annotations":{ + "IsAbout":{ + "TermURL":"nb:ParticipantID", + "Label":"Subject Unique Identifier" + }, + "Identifies":"participant" + } + }, + "session_id":{ + "Description":"A session ID" + }, + "pheno_age":{ + "Description":"Age of the participant", + "Annotations":{ + "IsAbout":{ + "TermURL":"nb:Age", + "Label":"Age" + }, + "Transformation":{ + "TermURL":"nb:FromEuro", + "Label":"european decimal value" + }, + "MissingValues":[ + "NA" + ] + } + }, + "pheno_sex":{ + "Description":"Sex variable", + "Levels":{ + "M":"Male", + "F":"Female" + }, + "Annotations":{ + "IsAbout":{ + "TermURL":"nb:Sex", + "Label":"Sex" + }, + "Levels":{ + "M":{ + "TermURL":"snomed:248153007", + "Label":"Male" + }, + "F":{ + "TermURL":"snomed:248152002", + "Label":"Female" + } + }, + "MissingValues":[ + "missing" + ] + } + }, + "pheno_group":{ + "Description":"Group variable", + "Levels":{ + "PAT":"Patient", + "CTRL":"Control subject" + }, + "Annotations":{ + "IsAbout":{ + "TermURL":"nb:Diagnosis", + "Label":"Diagnosis" + }, + "Levels":{ + "PAT":{ + "TermURL":"snomed:406506008", + "Label":"Attention deficit hyperactivity disorder" + }, + "CTRL":{ + "TermURL":"ncit:C94342", + "Label":"Healthy Control" + } + }, + "MissingValues":[ + "NA" + ] + } + }, + "tool1_item1":{ + "Description":"item 1 scores for tool1", + "Annotations":{ + "IsAbout":{ + "TermURL":"nb:Assessment", + "Label":"Assessment tool" + }, + "IsPartOf":{ + "TermURL":"cogatlas:trm_57964b8a66aed", + "Label":"Montreal Cognitive Assessment" + }, + "MissingValues":[ + "missing" + ] + } + }, + "tool1_item2":{ + "Description":"item 2 scores for tool1", + "Annotations":{ + "IsAbout":{ + "TermURL":"nb:Assessment", + "Label":"Assessment tool" + }, + "IsPartOf":{ + "TermURL":"cogatlas:trm_57964b8a66aed", + "Label":"Montreal Cognitive Assessment" + }, + "MissingValues":[ + "missing" + ] + } + }, + "tool2_item1":{ + "Description":"item 1 scores for tool2", + "Annotations":{ + "IsAbout":{ + "TermURL":"nb:Assessment", + "Label":"Assessment tool" + }, + "IsPartOf":{ + "TermURL":"cogatlas:tsk_4a57abb949ece", + "Label":"Unified Parkinson's Disease Rating Scale" + }, + "MissingValues":[ + "not completed" + ] + } + } +} diff --git a/cypress/fixtures/schema/neurobagel_data_dictionary.schema.json b/cypress/fixtures/schema/neurobagel_data_dictionary.schema.json new file mode 100644 index 00000000..7b032302 --- /dev/null +++ b/cypress/fixtures/schema/neurobagel_data_dictionary.schema.json @@ -0,0 +1,277 @@ +{ + "title": "Neurobagel Data Dictionary Schema", + "$ref": "#/definitions/DataDictionary", + "definitions": { + "Identifier": { + "title": "Identifier", + "description": "An identifier of a controlled term with an IRI", + "type": "object", + "properties": { + "TermURL": { + "title": "Termurl", + "description": "An unambiguous identifier for the term, concept or entity that is referenced", + "type": "string" + }, + "Label": { + "title": "Label", + "description": "A human readable label. If more than one label exists for the term, then the preferred label should be used.", + "type": "string" + } + }, + "required": [ + "TermURL", + "Label" + ] + }, + "CategoricalNeurobagel": { + "title": "CategoricalNeurobagel", + "description": "A Neurobagel annotation for a categorical column", + "type": "object", + "properties": { + "IsAbout": { + "title": "Isabout", + "description": "The concept or controlled term that describes this column", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + "MissingValues": { + "title": "Missingvalues", + "description": "A list of unique values that represent invalid responses, typos, or missing data", + "default": [], + "uniqueItems": true, + "type": "array", + "items": { + "type": "string" + } + }, + "Levels": { + "title": "Levels", + "description": "For categorical variables: An object of values (keys) in the column and the semanticterm (URI and label) they are unambiguously mapped to.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Identifier" + } + } + }, + "required": [ + "IsAbout", + "Levels" + ], + "additionalProperties": false + }, + "ContinuousNeurobagel": { + "title": "ContinuousNeurobagel", + "description": "A Neurobagel annotation for a continuous column", + "type": "object", + "properties": { + "IsAbout": { + "title": "Isabout", + "description": "The concept or controlled term that describes this column", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + "MissingValues": { + "title": "Missingvalues", + "description": "A list of unique values that represent invalid responses, typos, or missing data", + "default": [], + "uniqueItems": true, + "type": "array", + "items": { + "type": "string" + } + }, + "Transformation": { + "title": "Transformation", + "description": "For continuous columns this field can be used to describea transformation that can be applied to the values in thiscolumn in order to match the desired format of a standardizeddata element referenced in the IsAbout attribute.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + } + }, + "required": [ + "IsAbout", + "Transformation" + ], + "additionalProperties": false + }, + "IdentifierNeurobagel": { + "title": "IdentifierNeurobagel", + "description": "A Neurobagel annotation for an identifier column", + "type": "object", + "properties": { + "IsAbout": { + "title": "Isabout", + "description": "The concept or controlled term that describes this column", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + "MissingValues": { + "title": "Missingvalues", + "description": "A list of unique values that represent invalid responses, typos, or missing data", + "default": [], + "uniqueItems": true, + "type": "array", + "items": { + "type": "string" + } + }, + "Identifies": { + "title": "Identifies", + "description": "For identifier columns, the type of observation uniquely identified by this column.", + "type": "string" + } + }, + "required": [ + "IsAbout", + "Identifies" + ], + "additionalProperties": false + }, + "ToolNeurobagel": { + "title": "ToolNeurobagel", + "description": "A Neurobagel annotation for an assessment tool column", + "type": "object", + "properties": { + "IsAbout": { + "title": "Isabout", + "description": "The concept or controlled term that describes this column", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + "MissingValues": { + "title": "Missingvalues", + "description": "A list of unique values that represent invalid responses, typos, or missing data", + "default": [], + "uniqueItems": true, + "type": "array", + "items": { + "type": "string" + } + }, + "IsPartOf": { + "title": "Ispartof", + "description": "If the column is a subscale or item of an assessment tool then the assessment tool should be specified here.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + } + }, + "required": [ + "IsAbout", + "IsPartOf" + ], + "additionalProperties": false + }, + "ContinuousColumn": { + "title": "ContinuousColumn", + "description": "A BIDS column annotation for a continuous column", + "type": "object", + "properties": { + "Description": { + "title": "Description", + "description": "Free-form natural language description", + "type": "string" + }, + "Annotations": { + "title": "Annotations", + "description": "Semantic annotations", + "anyOf": [ + { + "$ref": "#/definitions/CategoricalNeurobagel" + }, + { + "$ref": "#/definitions/ContinuousNeurobagel" + }, + { + "$ref": "#/definitions/IdentifierNeurobagel" + }, + { + "$ref": "#/definitions/ToolNeurobagel" + } + ] + }, + "Units": { + "title": "Units", + "description": "Measurement units for the values in this column. SI units in CMIXF formatting are RECOMMENDED (see Units)", + "type": "string" + } + }, + "required": [ + "Description" + ] + }, + "CategoricalColumn": { + "title": "CategoricalColumn", + "description": "A BIDS column annotation for a categorical column", + "type": "object", + "properties": { + "Description": { + "title": "Description", + "description": "Free-form natural language description", + "type": "string" + }, + "Annotations": { + "title": "Annotations", + "description": "Semantic annotations", + "anyOf": [ + { + "$ref": "#/definitions/CategoricalNeurobagel" + }, + { + "$ref": "#/definitions/ContinuousNeurobagel" + }, + { + "$ref": "#/definitions/IdentifierNeurobagel" + }, + { + "$ref": "#/definitions/ToolNeurobagel" + } + ] + }, + "Levels": { + "title": "Levels", + "description": "For categorical variables: An object of possible values (keys) and their descriptions (values). ", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "required": [ + "Description", + "Levels" + ] + }, + "DataDictionary": { + "title": "DataDictionary", + "description": "A data dictionary with human and machine readable information for a tabular data file", + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/definitions/ContinuousColumn" + }, + { + "$ref": "#/definitions/CategoricalColumn" + } + ] + } + } + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 05d51c4f..71c1fa35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "dependencies": { "@nuxtjs/axios": "^5.13.6", + "ajv": "^8.12.0", "bootstrap": "^4.6.1", "bootstrap-vue": "^2.23.1", "core-js": "^3.33.0", @@ -2789,6 +2790,22 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.21.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", @@ -2804,6 +2821,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/eslintrc/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 + }, "node_modules/@eslint/js": { "version": "8.52.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", @@ -4565,13 +4588,13 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { @@ -4603,34 +4626,6 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -6454,6 +6449,34 @@ "webpack": "^4.27.0 || ^5.0.0" } }, + "node_modules/css-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/css-loader/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==" + }, "node_modules/css-loader/node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -8069,6 +8092,22 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -8149,6 +8188,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint/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 + }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -8520,6 +8565,34 @@ "webpack": "^4.4.0 || ^5.0.0" } }, + "node_modules/extract-css-chunks-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/extract-css-chunks-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/extract-css-chunks-webpack-plugin/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==" + }, "node_modules/extract-css-chunks-webpack-plugin/node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -8694,6 +8767,34 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/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==" + }, "node_modules/file-loader/node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -10637,9 +10738,9 @@ "dev": true }, "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==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -13923,6 +14024,34 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/postcss-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/postcss-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/postcss-loader/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==" + }, "node_modules/postcss-loader/node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -15467,6 +15596,34 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/schema-utils/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==" + }, "node_modules/scule": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/scule/-/scule-0.2.1.tgz", @@ -16402,6 +16559,34 @@ "node": ">=0.4.0" } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/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==" + }, "node_modules/terser-webpack-plugin/node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -16502,6 +16687,34 @@ "webpack": "^4.27.0 || ^5.0.0" } }, + "node_modules/thread-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/thread-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/thread-loader/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==" + }, "node_modules/thread-loader/node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -17153,6 +17366,34 @@ } } }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/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==" + }, "node_modules/url-loader/node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -17977,21 +18218,6 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -18003,11 +18229,6 @@ "ajv": "^8.8.2" } }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", @@ -18061,6 +18282,29 @@ "node": ">=0.10.0" } }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/webpack/node_modules/braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", @@ -18226,6 +18470,11 @@ "node": ">=0.10.0" } }, + "node_modules/webpack/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==" + }, "node_modules/webpack/node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -20312,6 +20561,18 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "globals": { "version": "13.21.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", @@ -20320,6 +20581,12 @@ "requires": { "type-fest": "^0.20.2" } + }, + "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 } } }, @@ -21776,13 +22043,13 @@ } }, "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "requires": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, @@ -21798,32 +22065,8 @@ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "requires": { "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - } } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} - }, "ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -23153,6 +23396,28 @@ "semver": "^7.3.5" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "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==" + }, "loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -24030,6 +24295,18 @@ "text-table": "^0.2.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -24080,6 +24357,12 @@ "type-fest": "^0.20.2" } }, + "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 + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -24721,6 +25004,28 @@ "webpack-sources": "^1.1.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "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==" + }, "loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -24854,6 +25159,28 @@ "schema-utils": "^3.0.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "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==" + }, "loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -26260,9 +26587,9 @@ "dev": true }, "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==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -28499,6 +28826,28 @@ "semver": "^7.3.4" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "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==" + }, "loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -29563,6 +29912,30 @@ "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "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==" + } } }, "scule": { @@ -30296,6 +30669,28 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "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==" + }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -30358,6 +30753,28 @@ "schema-utils": "^3.0.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "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==" + }, "loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -30839,6 +31256,28 @@ "schema-utils": "^3.0.0" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "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==" + }, "loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -31456,6 +31895,23 @@ "webpack-sources": "^1.4.1" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", @@ -31590,6 +32046,11 @@ } } }, + "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==" + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -31788,17 +32249,6 @@ "schema-utils": "^4.0.0" }, "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, "ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -31807,11 +32257,6 @@ "fast-deep-equal": "^3.1.3" } }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "schema-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", diff --git a/package.json b/package.json index 6afa9a1f..35c82819 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ }, "dependencies": { "@nuxtjs/axios": "^5.13.6", + "ajv": "^8.12.0", "bootstrap": "^4.6.1", "bootstrap-vue": "^2.23.1", "core-js": "^3.33.0", diff --git a/store/index.js b/store/index.js index a7ec97ef..aa93e7a0 100644 --- a/store/index.js +++ b/store/index.js @@ -20,9 +20,9 @@ export const state = () => ({ "Sex": [ - { label: "male", identifier: "bids:male" }, - { label: "female", identifier: "bids:female" }, - { label: "other", identifier: "bids:other" } + { label: "Male", identifier: "snomed:248153007" }, + { label: "Female", identifier: "snomed:248152002" }, + { label: "Other", identifier: "snomed:32570681000036106" } ], "Diagnosis": diagnosisTerms }, @@ -175,7 +175,7 @@ export const state = () => ({ toolTerms: Object.entries(toolTerms).map(([key, value]) => ({ label: value, - identifier: "cogAtlas:" + key, + identifier: "cogatlas:" + key, selected: false })), @@ -480,6 +480,7 @@ export const getters = { // Transfer unannotated data from the user provided data dictionary to the output columnOutput = p_state.dataDictionary.annotated[columnName]; + delete columnOutput.missingValues; } jsonOutput[columnName] = columnOutput;