From 7a6168b1e30e7fed2a4f4da3da852e038a164b97 Mon Sep 17 00:00:00 2001 From: rmanaem Date: Thu, 2 Nov 2023 10:55:45 -0400 Subject: [PATCH 01/19] Added `ajv` as a dependency --- package-lock.json | 653 ++++++++++++++++++++++++++++++++++++++-------- package.json | 1 + 2 files changed, 550 insertions(+), 104 deletions(-) diff --git a/package-lock.json b/package-lock.json index ccbb43dc..19d13193 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", @@ -6451,6 +6446,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", @@ -8066,6 +8089,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", @@ -8146,6 +8185,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", @@ -8517,6 +8562,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", @@ -8691,6 +8764,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", @@ -10634,9 +10735,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", @@ -13920,6 +14021,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", @@ -15464,6 +15593,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", @@ -16399,6 +16556,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", @@ -16499,6 +16684,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", @@ -17150,6 +17363,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", @@ -17974,21 +18215,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", @@ -18000,11 +18226,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", @@ -18058,6 +18279,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", @@ -18223,6 +18467,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", @@ -20309,6 +20558,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", @@ -20317,6 +20578,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 } } }, @@ -21773,13 +22040,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" } }, @@ -21795,32 +22062,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", @@ -23150,6 +23393,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", @@ -24027,6 +24292,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", @@ -24077,6 +24354,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", @@ -24718,6 +25001,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", @@ -24851,6 +25156,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", @@ -26257,9 +26584,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", @@ -28496,6 +28823,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", @@ -29560,6 +29909,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": { @@ -30293,6 +30666,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", @@ -30355,6 +30750,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", @@ -30836,6 +31253,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", @@ -31453,6 +31892,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", @@ -31587,6 +32043,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", @@ -31785,17 +32246,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", @@ -31804,11 +32254,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 474e32e0..70a3b352 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", From b699685d6299d4d32dca56223069166bc209e9a8 Mon Sep 17 00:00:00 2001 From: rmanaem Date: Thu, 2 Nov 2023 10:57:33 -0400 Subject: [PATCH 02/19] Added example output json --- ...3_participant_annotated_1698934398962.json | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 cypress/fixtures/examples/good/ds003653_participant_annotated_1698934398962.json 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 From 5d75c926fe6a6baffa3316ab946926b8e2b9d9cb Mon Sep 17 00:00:00 2001 From: rmanaem Date: Thu, 2 Nov 2023 10:57:47 -0400 Subject: [PATCH 03/19] Added neurobagel schema to the fixtures --- .../neurobagel_data_dictionary.schema.json | 277 ++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 cypress/fixtures/schema/neurobagel_data_dictionary.schema.json 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 From 214d7ff3f6090555ba9ab8941ba40ff463e02ad7 Mon Sep 17 00:00:00 2001 From: rmanaem Date: Thu, 2 Nov 2023 11:49:02 -0400 Subject: [PATCH 04/19] Added example files --- .../examples/good/example_synthetic copy.json | 34 +++++ ...ynthetic copy_annotated_1698938921939.json | 132 +++++++++++++++++ .../examples/good/example_synthetic.json | 138 ++++++++++++++++++ 3 files changed, 304 insertions(+) create mode 100644 cypress/fixtures/examples/good/example_synthetic copy.json create mode 100644 cypress/fixtures/examples/good/example_synthetic copy_annotated_1698938921939.json create mode 100644 cypress/fixtures/examples/good/example_synthetic.json diff --git a/cypress/fixtures/examples/good/example_synthetic copy.json b/cypress/fixtures/examples/good/example_synthetic copy.json new file mode 100644 index 00000000..65664e91 --- /dev/null +++ b/cypress/fixtures/examples/good/example_synthetic copy.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" + } +} \ No newline at end of file diff --git a/cypress/fixtures/examples/good/example_synthetic copy_annotated_1698938921939.json b/cypress/fixtures/examples/good/example_synthetic copy_annotated_1698938921939.json new file mode 100644 index 00000000..f8f56bfd --- /dev/null +++ b/cypress/fixtures/examples/good/example_synthetic copy_annotated_1698938921939.json @@ -0,0 +1,132 @@ +{ + "participant_id": { + "Description": "A participant ID", + "Annotations": { + "IsAbout": { + "Label": "Subject Unique Identifier", + "TermURL": "nb:ParticipantID" + }, + "Identifies": "participant" + } + }, + "session_id": { + "Description": "A session ID", + "missingValues": [] + }, + "pheno_age": { + "Annotations": { + "IsAbout": { + "Label": "Age", + "TermURL": "nb:Age" + }, + "Transformation": { + "Label": "european decimal value", + "TermURL": "nb:FromEuro" + }, + "MissingValues": [ + "NA" + ] + }, + "Description": "Age of the participant" + }, + "pheno_sex": { + "Annotations": { + "IsAbout": { + "Label": "Sex", + "TermURL": "nb:Sex" + }, + "Levels": { + "F": { + "Label": "female", + "TermURL": "bids:female" + }, + "M": { + "Label": "male", + "TermURL": "bids:male" + } + }, + "MissingValues": [ + "missing" + ] + }, + "Description": "Sex variable", + "Levels": { + "M": "Male", + "F": "Female" + } + }, + "pheno_group": { + "Annotations": { + "IsAbout": { + "Label": "Diagnosis", + "TermURL": "nb:Diagnosis" + }, + "Levels": { + "CTRL": { + "Label": "Healthy Control", + "TermURL": "ncit:C94342" + }, + "PAT": { + "Label": "Attention deficit hyperactivity disorder", + "TermURL": "snomed:406506008" + } + }, + "MissingValues": [ + "NA" + ] + }, + "Description": "Group variable", + "Levels": { + "PAT": "Patient", + "CTRL": "Control subject" + } + }, + "tool1_item1": { + "Annotations": { + "IsAbout": { + "TermURL": "nb:Assessment", + "Label": "Assessment tool" + }, + "IsPartOf": { + "TermURL": "cogAtlas:trm_57964b8a66aed", + "Label": "Montreal Cognitive Assessment" + }, + "MissingValues": [ + "missing" + ] + }, + "Description": "item 1 scores for tool1" + }, + "tool1_item2": { + "Annotations": { + "IsAbout": { + "TermURL": "nb:Assessment", + "Label": "Assessment tool" + }, + "IsPartOf": { + "TermURL": "cogAtlas:trm_57964b8a66aed", + "Label": "Montreal Cognitive Assessment" + }, + "MissingValues": [ + "missing" + ] + }, + "Description": "item 2 scores for tool1" + }, + "tool2_item1": { + "Annotations": { + "IsAbout": { + "TermURL": "nb:Assessment", + "Label": "Assessment tool" + }, + "IsPartOf": { + "TermURL": "cogAtlas:tsk_4a57abb949ece", + "Label": "Unified Parkinson's Disease Rating Scale" + }, + "MissingValues": [ + "not completed" + ] + }, + "Description": "item 1 scores for tool2" + } +} \ 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..f8ceeb70 --- /dev/null +++ b/cypress/fixtures/examples/good/example_synthetic.json @@ -0,0 +1,138 @@ +{ + "participant_id": { + "Description": "A participant ID", + "Annotations": { + "IsAbout": { + "TermURL": "nb:ParticipantID", + "Label": "Unique participant identifier" + }, + "Identifies": "participant" + } + }, + "session_id": { + "Description": "A session ID", + "Annotations": { + "IsAbout": { + "TermURL": "nb:SessionID", + "Label": "Unique session identifier" + }, + "Identifies": "session" + } + }, + "pheno_age": { + "Description": "Age of the participant", + "Annotations": { + "IsAbout": { + "TermURL": "nb:Age", + "Label": "Chronological 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" + ] + } + } +} \ No newline at end of file From 49a62969d58962e83317a15be7ce4ccdfad499a9 Mon Sep 17 00:00:00 2001 From: rmanaem Date: Thu, 2 Nov 2023 11:49:20 -0400 Subject: [PATCH 05/19] Implemented validate-output test --- cypress/e2e/validate-output.cy.js | 37 +++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 cypress/e2e/validate-output.cy.js diff --git a/cypress/e2e/validate-output.cy.js b/cypress/e2e/validate-output.cy.js new file mode 100644 index 00000000..2b4c6b5f --- /dev/null +++ b/cypress/e2e/validate-output.cy.js @@ -0,0 +1,37 @@ +const Ajv = require('ajv'); + +const outputJSONFilePath = 'cypress/fixtures/examples/good/ds003653_participant_annotated_1698934398962.json'; + +const exampleSyntheticFilePath = 'cypress/fixtures/examples/good/example_synthetic.json'; + +const exampleOutputSyntheticFilePath = 'cypress/fixtures/examples/good/example_synthetic copy_annotated_1698938921939.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; + }); + }); + }); +}); From 4bb26d203d96db23debc6ce47427316a212c14ad Mon Sep 17 00:00:00 2001 From: rmanaem Date: Thu, 2 Nov 2023 14:52:28 -0400 Subject: [PATCH 06/19] Renamed example files --- .../examples/good/example_synthetic copy.json | 34 ----- .../examples/good/example_synthetic.json | 116 +----------------- 2 files changed, 6 insertions(+), 144 deletions(-) delete mode 100644 cypress/fixtures/examples/good/example_synthetic copy.json diff --git a/cypress/fixtures/examples/good/example_synthetic copy.json b/cypress/fixtures/examples/good/example_synthetic copy.json deleted file mode 100644 index 65664e91..00000000 --- a/cypress/fixtures/examples/good/example_synthetic copy.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "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" - } -} \ No newline at end of file diff --git a/cypress/fixtures/examples/good/example_synthetic.json b/cypress/fixtures/examples/good/example_synthetic.json index f8ceeb70..65664e91 100644 --- a/cypress/fixtures/examples/good/example_synthetic.json +++ b/cypress/fixtures/examples/good/example_synthetic.json @@ -1,64 +1,18 @@ { "participant_id": { - "Description": "A participant ID", - "Annotations": { - "IsAbout": { - "TermURL": "nb:ParticipantID", - "Label": "Unique participant identifier" - }, - "Identifies": "participant" - } + "Description": "A participant ID" }, "session_id": { - "Description": "A session ID", - "Annotations": { - "IsAbout": { - "TermURL": "nb:SessionID", - "Label": "Unique session identifier" - }, - "Identifies": "session" - } + "Description": "A session ID" }, "pheno_age": { - "Description": "Age of the participant", - "Annotations": { - "IsAbout": { - "TermURL": "nb:Age", - "Label": "Chronological age" - }, - "Transformation": { - "TermURL": "nb:FromEuro", - "Label": "european decimal value" - }, - "MissingValues": [ - "NA" - ] - } + "Description": "Age of the participant" }, "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": { @@ -66,73 +20,15 @@ "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" - ] - } + "Description": "item 1 scores for tool1" }, "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" - ] - } + "Description": "item 2 scores for tool1" }, "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" - ] - } + "Description": "item 1 scores for tool2" } } \ No newline at end of file From db5df3926c6faab987e9dd4fa77310a291e02bb3 Mon Sep 17 00:00:00 2001 From: rmanaem Date: Thu, 2 Nov 2023 14:52:59 -0400 Subject: [PATCH 07/19] Added example file --- .../example_synthetic_expected_output.json | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 cypress/fixtures/examples/good/example_synthetic_expected_output.json 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..f8ceeb70 --- /dev/null +++ b/cypress/fixtures/examples/good/example_synthetic_expected_output.json @@ -0,0 +1,138 @@ +{ + "participant_id": { + "Description": "A participant ID", + "Annotations": { + "IsAbout": { + "TermURL": "nb:ParticipantID", + "Label": "Unique participant identifier" + }, + "Identifies": "participant" + } + }, + "session_id": { + "Description": "A session ID", + "Annotations": { + "IsAbout": { + "TermURL": "nb:SessionID", + "Label": "Unique session identifier" + }, + "Identifies": "session" + } + }, + "pheno_age": { + "Description": "Age of the participant", + "Annotations": { + "IsAbout": { + "TermURL": "nb:Age", + "Label": "Chronological 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" + ] + } + } +} \ No newline at end of file From 8121d0ec943b2ee60f4e1180afad2d1cc09079fc Mon Sep 17 00:00:00 2001 From: rmanaem Date: Thu, 2 Nov 2023 16:16:42 -0400 Subject: [PATCH 08/19] Updated example files --- .../examples/good/example_synthetic.json | 66 ++--- .../examples/good/example_synthetic.tsv | 11 + .../example_synthetic_expected_output.json | 263 +++++++++--------- 3 files changed, 172 insertions(+), 168 deletions(-) create mode 100644 cypress/fixtures/examples/good/example_synthetic.tsv diff --git a/cypress/fixtures/examples/good/example_synthetic.json b/cypress/fixtures/examples/good/example_synthetic.json index 65664e91..41e75aac 100644 --- a/cypress/fixtures/examples/good/example_synthetic.json +++ b/cypress/fixtures/examples/good/example_synthetic.json @@ -1,34 +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" - } -} \ No newline at end of file + "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 index f8ceeb70..3f7dafb3 100644 --- a/cypress/fixtures/examples/good/example_synthetic_expected_output.json +++ b/cypress/fixtures/examples/good/example_synthetic_expected_output.json @@ -1,138 +1,131 @@ { - "participant_id": { - "Description": "A participant ID", - "Annotations": { - "IsAbout": { - "TermURL": "nb:ParticipantID", - "Label": "Unique participant identifier" + "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" }, - "Identifies": "participant" - } - }, - "session_id": { - "Description": "A session ID", - "Annotations": { - "IsAbout": { - "TermURL": "nb:SessionID", - "Label": "Unique session identifier" + "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" }, - "Identifies": "session" - } - }, - "pheno_age": { - "Description": "Age of the participant", - "Annotations": { - "IsAbout": { - "TermURL": "nb:Age", - "Label": "Chronological 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" - ] - } - } -} \ No newline at end of file + "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" + ] + } + } +} From b602484541024ed676f1b47fbbf3c0a524c83642 Mon Sep 17 00:00:00 2001 From: rmanaem Date: Thu, 2 Nov 2023 16:17:18 -0400 Subject: [PATCH 09/19] Enabled cypress studio experimental feature --- cypress.config.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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: { From d3c1954ecf8ad467035993e59c9c42ce839559f8 Mon Sep 17 00:00:00 2001 From: rmanaem Date: Thu, 2 Nov 2023 16:17:49 -0400 Subject: [PATCH 10/19] Removed dead code --- cypress/e2e/validate-output.cy.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cypress/e2e/validate-output.cy.js b/cypress/e2e/validate-output.cy.js index 2b4c6b5f..fa62aa89 100644 --- a/cypress/e2e/validate-output.cy.js +++ b/cypress/e2e/validate-output.cy.js @@ -2,10 +2,6 @@ const Ajv = require('ajv'); const outputJSONFilePath = 'cypress/fixtures/examples/good/ds003653_participant_annotated_1698934398962.json'; -const exampleSyntheticFilePath = 'cypress/fixtures/examples/good/example_synthetic.json'; - -const exampleOutputSyntheticFilePath = 'cypress/fixtures/examples/good/example_synthetic copy_annotated_1698938921939.json'; - const schemaPath = 'cypress/fixtures/schema/neurobagel_data_dictionary.schema.json'; From edf877049bd6924882a78d76f1275af91b69d524 Mon Sep 17 00:00:00 2001 From: rmanaem Date: Thu, 2 Nov 2023 16:22:00 -0400 Subject: [PATCH 11/19] Renamed and expanded previously `my_happy_annotation_page_tests` --- ...ate-output-example-synthetic-e2etest.cy.js | 117 ++++++++++++++++++ .../page/my_happy_annotation-page_tests.cy.js | 58 --------- 2 files changed, 117 insertions(+), 58 deletions(-) create mode 100644 cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js delete mode 100644 cypress/e2e/page/my_happy_annotation-page_tests.cy.js 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..a44fa293 --- /dev/null +++ b/cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js @@ -0,0 +1,117 @@ +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('#__BVID__117___BV_tab_button__').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('#__BVID__156___BV_tab_button__').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('#__BVID__77__BV_tab_controls_').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('#__BVID__77__BV_tab_controls_').click(); + 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('#__BVID__156').click(); + cy.get('[aria-colindex="5"] > [data-cy="missingValueButton_2"]').click(); + cy.get('#__BVID__195___BV_tab_button__').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('#__BVID__225___BV_tab_button__').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/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 From f491e74cb0afbd103c54bae7ca44d2307b84a4f3 Mon Sep 17 00:00:00 2001 From: rmanaem Date: Thu, 2 Nov 2023 16:22:32 -0400 Subject: [PATCH 12/19] Aligned terms and output with schema and examples --- store/index.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/store/index.js b/store/index.js index a7ec97ef..d4b7623e 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; From 14cee55ff3a63b28e5262fa50a57b9b831806ca9 Mon Sep 17 00:00:00 2001 From: rmanaem Date: Thu, 2 Nov 2023 16:33:20 -0400 Subject: [PATCH 13/19] Fixed simple-e2e test --- cypress/e2e/app/simple-e2etest.cy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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"); }); }); From de649808416e2a7a1c3c6211bed09dad00e3ca34 Mon Sep 17 00:00:00 2001 From: rmanaem Date: Thu, 2 Nov 2023 16:44:39 -0400 Subject: [PATCH 14/19] Changed test --- cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js b/cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js index a44fa293..ec4cd20c 100644 --- a/cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js +++ b/cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js @@ -75,7 +75,7 @@ describe("to annotate an assessment ", () => { 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('#__BVID__117___BV_tab_button__').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(); From 5581d54c710f3a237b02b640cc87ebd34f688ed6 Mon Sep 17 00:00:00 2001 From: rmanaem Date: Thu, 2 Nov 2023 17:07:11 -0400 Subject: [PATCH 15/19] Fixed test --- .../app/validate-output-example-synthetic-e2etest.cy.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js b/cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js index ec4cd20c..a6eea532 100644 --- a/cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js +++ b/cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js @@ -81,24 +81,21 @@ describe("to annotate an assessment ", () => { 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('#__BVID__156___BV_tab_button__').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('#__BVID__77__BV_tab_controls_').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('#__BVID__77__BV_tab_controls_').click(); 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('#__BVID__156').click(); cy.get('[aria-colindex="5"] > [data-cy="missingValueButton_2"]').click(); - cy.get('#__BVID__195___BV_tab_button__').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('#__BVID__225___BV_tab_button__').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(); From 235cb3503d5cd216e88e2040db7fb1ffee5e7c23 Mon Sep 17 00:00:00 2001 From: Sebastian Urchs Date: Thu, 2 Nov 2023 18:39:19 -0400 Subject: [PATCH 16/19] [FIX] test to use explicit file loading Previously we relied on a files position in the list of downloaded files. That's brittle. If we look for the correct file instead, it's not brittle. Not brittle is better. Co-authored-by: Arman Jahanpour --- cypress/e2e/page/download-pagetests.cy.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/cypress/e2e/page/download-pagetests.cy.js b/cypress/e2e/page/download-pagetests.cy.js index 040eebe9..da3a27fc 100644 --- a/cypress/e2e/page/download-pagetests.cy.js +++ b/cypress/e2e/page/download-pagetests.cy.js @@ -67,22 +67,23 @@ 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 => { 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"); - }); }); }); }); From 5365a885854c2daece2825f2e3ea1abd4d4ce618 Mon Sep 17 00:00:00 2001 From: rmanaem Date: Fri, 3 Nov 2023 14:18:44 -0400 Subject: [PATCH 17/19] Added a comment on the filename fix for download-pagetest --- cypress/e2e/page/download-pagetests.cy.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cypress/e2e/page/download-pagetests.cy.js b/cypress/e2e/page/download-pagetests.cy.js index da3a27fc..2bdf4a88 100644 --- a/cypress/e2e/page/download-pagetests.cy.js +++ b/cypress/e2e/page/download-pagetests.cy.js @@ -73,6 +73,9 @@ describe("tests on download page ui via programmatic state loading and store int 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.some(filename => filename.includes(dataDictionaryFilenameNoExt))).to.be.true; From 3918b9facc89796118812f59233d860116895355 Mon Sep 17 00:00:00 2001 From: rmanaem Date: Fri, 3 Nov 2023 14:19:05 -0400 Subject: [PATCH 18/19] Capitalized `Other` option for `Sex` category --- store/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/store/index.js b/store/index.js index d4b7623e..aa93e7a0 100644 --- a/store/index.js +++ b/store/index.js @@ -22,7 +22,7 @@ export const state = () => ({ { label: "Male", identifier: "snomed:248153007" }, { label: "Female", identifier: "snomed:248152002" }, - { label: "other", identifier: "snomed:32570681000036106" } + { label: "Other", identifier: "snomed:32570681000036106" } ], "Diagnosis": diagnosisTerms }, From a8b8bc49686f049544a488b3107e12cad25f53db Mon Sep 17 00:00:00 2001 From: rmanaem Date: Fri, 3 Nov 2023 14:22:10 -0400 Subject: [PATCH 19/19] Removed `example_synthetic copy_annotated_*` file --- ...ynthetic copy_annotated_1698938921939.json | 132 ------------------ 1 file changed, 132 deletions(-) delete mode 100644 cypress/fixtures/examples/good/example_synthetic copy_annotated_1698938921939.json diff --git a/cypress/fixtures/examples/good/example_synthetic copy_annotated_1698938921939.json b/cypress/fixtures/examples/good/example_synthetic copy_annotated_1698938921939.json deleted file mode 100644 index f8f56bfd..00000000 --- a/cypress/fixtures/examples/good/example_synthetic copy_annotated_1698938921939.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "participant_id": { - "Description": "A participant ID", - "Annotations": { - "IsAbout": { - "Label": "Subject Unique Identifier", - "TermURL": "nb:ParticipantID" - }, - "Identifies": "participant" - } - }, - "session_id": { - "Description": "A session ID", - "missingValues": [] - }, - "pheno_age": { - "Annotations": { - "IsAbout": { - "Label": "Age", - "TermURL": "nb:Age" - }, - "Transformation": { - "Label": "european decimal value", - "TermURL": "nb:FromEuro" - }, - "MissingValues": [ - "NA" - ] - }, - "Description": "Age of the participant" - }, - "pheno_sex": { - "Annotations": { - "IsAbout": { - "Label": "Sex", - "TermURL": "nb:Sex" - }, - "Levels": { - "F": { - "Label": "female", - "TermURL": "bids:female" - }, - "M": { - "Label": "male", - "TermURL": "bids:male" - } - }, - "MissingValues": [ - "missing" - ] - }, - "Description": "Sex variable", - "Levels": { - "M": "Male", - "F": "Female" - } - }, - "pheno_group": { - "Annotations": { - "IsAbout": { - "Label": "Diagnosis", - "TermURL": "nb:Diagnosis" - }, - "Levels": { - "CTRL": { - "Label": "Healthy Control", - "TermURL": "ncit:C94342" - }, - "PAT": { - "Label": "Attention deficit hyperactivity disorder", - "TermURL": "snomed:406506008" - } - }, - "MissingValues": [ - "NA" - ] - }, - "Description": "Group variable", - "Levels": { - "PAT": "Patient", - "CTRL": "Control subject" - } - }, - "tool1_item1": { - "Annotations": { - "IsAbout": { - "TermURL": "nb:Assessment", - "Label": "Assessment tool" - }, - "IsPartOf": { - "TermURL": "cogAtlas:trm_57964b8a66aed", - "Label": "Montreal Cognitive Assessment" - }, - "MissingValues": [ - "missing" - ] - }, - "Description": "item 1 scores for tool1" - }, - "tool1_item2": { - "Annotations": { - "IsAbout": { - "TermURL": "nb:Assessment", - "Label": "Assessment tool" - }, - "IsPartOf": { - "TermURL": "cogAtlas:trm_57964b8a66aed", - "Label": "Montreal Cognitive Assessment" - }, - "MissingValues": [ - "missing" - ] - }, - "Description": "item 2 scores for tool1" - }, - "tool2_item1": { - "Annotations": { - "IsAbout": { - "TermURL": "nb:Assessment", - "Label": "Assessment tool" - }, - "IsPartOf": { - "TermURL": "cogAtlas:tsk_4a57abb949ece", - "Label": "Unified Parkinson's Disease Rating Scale" - }, - "MissingValues": [ - "not completed" - ] - }, - "Description": "item 1 scores for tool2" - } -} \ No newline at end of file