diff --git a/grai-frontend/package-lock.json b/grai-frontend/package-lock.json index cb8e03be6..67b0f2ef5 100644 --- a/grai-frontend/package-lock.json +++ b/grai-frontend/package-lock.json @@ -44,7 +44,7 @@ "chartjs-chart-matrix": "^2.0.1", "dayjs": "^1.11.6", "elkjs": "^0.8.2", - "eslint": "^8.52.0", + "eslint": "^8.53.0", "eslint-plugin-import": "^2.27.5", "graphql": "^16.8.1", "jest-websocket-mock": "^2.5.0", @@ -93,22 +93,22 @@ "integrity": "sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==" }, "node_modules/@algolia/autocomplete-core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.11.1.tgz", - "integrity": "sha512-C4ZaUbwNHOkbXM+vsUpx9AYhfLRCcku4tjn64Dr6/WjBhD1gv/WcI/GlvTc7QU53xPubNm8pfnfFAjRogEdnNQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.12.1.tgz", + "integrity": "sha512-Paf1MEdsU8EA5eApJlp6yNJGn6IfWec6UoJyv6fzI+T2v9nU4ynH4nkq07hzOilImVy33vFlzh1+D7jcU2lMFg==", "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.11.1", - "@algolia/autocomplete-shared": "1.11.1" + "@algolia/autocomplete-plugin-algolia-insights": "1.12.1", + "@algolia/autocomplete-shared": "1.12.1" } }, "node_modules/@algolia/autocomplete-js": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-js/-/autocomplete-js-1.11.1.tgz", - "integrity": "sha512-Oqus5IAz/rGubXvUcGQyhSwFr/KmfHxrmw/u+3pqWWhgErRIF/LQmHO6/+Q4pu21EOAMdKw1p/gSel68e5AaCA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-js/-/autocomplete-js-1.12.1.tgz", + "integrity": "sha512-o8OVeyTSCJ1n5xnULBqlJ3gcimlyevUeNUmGXuHgd6K2TeHmZ8EgaxHWuyzOdgWNjcJpCpjDh4Q/hEvQq3svDQ==", "dependencies": { - "@algolia/autocomplete-core": "1.11.1", - "@algolia/autocomplete-preset-algolia": "1.11.1", - "@algolia/autocomplete-shared": "1.11.1", + "@algolia/autocomplete-core": "1.12.1", + "@algolia/autocomplete-preset-algolia": "1.12.1", + "@algolia/autocomplete-shared": "1.12.1", "htm": "^3.1.1", "preact": "^10.13.2" }, @@ -118,22 +118,22 @@ } }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.11.1.tgz", - "integrity": "sha512-Ajaav4irJrbwLuQ0hYuaZlUH1pY7iobXSFfQsHFSQ+m2Q8r/h1GtkaiRCpcfnwO8CURdcD3RFMc0pClOPzmJeA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.12.1.tgz", + "integrity": "sha512-wZnfgmJA+g+WWkyXRZqv9NvRtOrZCnsZMpSvGe4QdQatEWRTAn2hry1cHMj8+sxwpqQQE7Kt/GAZhElrmErPkw==", "dependencies": { - "@algolia/autocomplete-shared": "1.11.1" + "@algolia/autocomplete-shared": "1.12.1" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.11.1.tgz", - "integrity": "sha512-iso7s41eeywyIwzC7cBMrK0kbWd3J/lKyZceaH0KteWyqoQAeNgNgAfbQsdp2m+bXFglOH4Hklr/0Y5SO8HTlg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.12.1.tgz", + "integrity": "sha512-fbciiuDZ6WsQOhf3Rdm4ctZpOGngg8hNtss4FCJz4FGnGSUxs+H0n38k+FbQ3vcfzQ0nsdAjXWwM4G0OLJE3Mw==", "dependencies": { - "@algolia/autocomplete-shared": "1.11.1" + "@algolia/autocomplete-shared": "1.12.1" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -141,9 +141,9 @@ } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.11.1.tgz", - "integrity": "sha512-bbX7dk41aAy7jlgaJTH/Suv7moGvmkudrrF2ECuMQUrWvl/xGfrj9ZYpLcMsT7TcTYf5SPtK5awXJnpQ4PTKEg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.12.1.tgz", + "integrity": "sha512-Q2NQ9pxSpwi0WsLlGtrnE+nMo4ERgB4YlYi7eW7EIUtD0LSixLQeOqlNNYIhFUYbNYpfG5s9L3W8PMfS2M4qOg==", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" @@ -308,9 +308,9 @@ } }, "node_modules/@apollo/client": { - "version": "3.8.6", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.8.6.tgz", - "integrity": "sha512-FnHg3vhQP8tQzgBs6oTJCFFIbovelDGYujj6MK7CJneiHf62TJstCIO0Ot4A1h7XrgFEtgl8a/OgajQWqrTuYw==", + "version": "3.8.7", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.8.7.tgz", + "integrity": "sha512-DnQtFkQrCyxHTSa9gR84YRLmU/al6HeXcLZazVe+VxKBmx/Hj4rV8xWtzfWYX5ijartsqDR7SJgV037MATEecA==", "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/context": "^0.7.3", @@ -360,70 +360,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { "version": "7.23.2", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", @@ -461,19 +397,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/eslint-parser": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz", @@ -501,15 +424,6 @@ "node": ">=10" } }, - "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", @@ -562,14 +476,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", @@ -592,14 +498,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", @@ -617,15 +515,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", @@ -862,70 +751,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", @@ -2175,15 +2000,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", @@ -2447,15 +2263,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", @@ -2882,6 +2689,11 @@ "stylis": "4.2.0" } }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, "node_modules/@emotion/cache": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", @@ -3342,17 +3154,17 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -3397,9 +3209,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -3488,11 +3300,12 @@ } }, "node_modules/@graphql-tools/utils": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.7.tgz", - "integrity": "sha512-KOdeMj6Hd/MENDaqPbws3YJl3wVy0DeYnL7PyUms5Skyf7uzI9INynDwPMhLXfSb0/ph6BXTwMd5zBtWbF8tBQ==", + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", "dset": "^3.1.2", "tslib": "^2.4.0" }, @@ -3700,6 +3513,64 @@ "@types/yargs-parser": "*" } }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/console/node_modules/jest-message-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", @@ -3737,6 +3608,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/core": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", @@ -3809,16 +3692,74 @@ "@types/yargs-parser": "*" } }, - "node_modules/@jest/core/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^27.5.1", @@ -3846,6 +3787,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/environment": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", @@ -3886,6 +3839,76 @@ "@types/yargs-parser": "*" } }, + "node_modules/@jest/environment/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/environment/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/environment/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/environment/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/environment/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/expect-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", @@ -3939,6 +3962,64 @@ "@types/yargs-parser": "*" } }, + "node_modules/@jest/fake-timers/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/fake-timers/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/fake-timers/node_modules/jest-message-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", @@ -3976,6 +4057,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/@jest/fake-timers/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/globals": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", @@ -4015,6 +4108,55 @@ "@types/yargs-parser": "*" } }, + "node_modules/@jest/globals/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/globals/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/globals/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/globals/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/@jest/globals/node_modules/diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -4039,6 +4181,15 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/@jest/globals/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/globals/node_modules/jest-diff": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", @@ -4098,15 +4249,27 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "node_modules/@jest/globals/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", @@ -4167,6 +4330,64 @@ "@types/yargs-parser": "*" } }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/reporters/node_modules/jest-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", @@ -4193,6 +4414,18 @@ "node": ">=0.10.0" } }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -4267,6 +4500,76 @@ "@types/yargs-parser": "*" } }, + "node_modules/@jest/test-result/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/test-result/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/test-result/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/test-result/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/test-result/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/test-sequencer": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", @@ -4333,6 +4636,70 @@ "@types/yargs-parser": "*" } }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/transform/node_modules/jest-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", @@ -4359,6 +4726,18 @@ "node": ">=0.10.0" } }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", @@ -4375,39 +4754,103 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=6.0.0" + "node": ">=7.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "devOptional": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", @@ -4459,15 +4902,48 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@mui/base": { - "version": "5.0.0-beta.20", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.20.tgz", - "integrity": "sha512-CS2pUuqxST7ch9VNDCklRYDbJ3rru20Tx7na92QvVVKfu3RL4z/QLuVIc8jYGsdCnauMaeUSlFNLAJNb0yXe6w==", + "version": "5.0.0-beta.22", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.22.tgz", + "integrity": "sha512-l4asGID5tmyerx9emJfXOKLyXzaBtdXNIFE3M+IrSZaFtGFvaQKHhc3+nxxSxPf1+G44psjczM0ekRQCdXx9HA==", "dependencies": { - "@babel/runtime": "^7.23.1", + "@babel/runtime": "^7.23.2", "@floating-ui/react-dom": "^2.0.2", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.16", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", "prop-types": "^15.8.1" @@ -4491,20 +4967,20 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.14.tgz", - "integrity": "sha512-Rw/xKiTOUgXD8hdKqj60aC6QcGprMipG7ne2giK6Mz7b4PlhL/xog9xLeclY3BxsRLkZQ05egFnIEY1CSibTbw==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.16.tgz", + "integrity": "sha512-97isBjzH2v1K7oB4UH2f4NOkBShOynY6dhnoR2XlUk/g6bb7ZBv2I3D1hvvqPtpEigKu93e7f/jAYr5d9LOc5w==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui" } }, "node_modules/@mui/icons-material": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.14.tgz", - "integrity": "sha512-vwuaMsKvI7AWTeYqR8wYbpXijuU8PzMAJWRAq2DDIuOZPxjKyHlr8WQ25+azZYkIXtJ7AqnVb1ZmHdEyB4/kug==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.16.tgz", + "integrity": "sha512-wmOgslMEGvbHZjFLru8uH5E+pif/ciXAvKNw16q6joK6EWVWU5rDYWFknDaZhCvz8ZE/K8ZnJQ+lMG6GgHzXbg==", "dependencies": { - "@babel/runtime": "^7.23.1" + "@babel/runtime": "^7.23.2" }, "engines": { "node": ">=12.0.0" @@ -4525,15 +5001,15 @@ } }, "node_modules/@mui/lab": { - "version": "5.0.0-alpha.149", - "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.149.tgz", - "integrity": "sha512-azOkKcyVX4KBZAqSp7eRD4OfKrUrvQXo7x2BjFJil+UeAJiMpB6I5lALo2PDZz3vjtJnHqlURnZtxZOHs1zfEA==", - "dependencies": { - "@babel/runtime": "^7.23.1", - "@mui/base": "5.0.0-beta.20", - "@mui/system": "^5.14.14", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", + "version": "5.0.0-alpha.151", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.151.tgz", + "integrity": "sha512-EAIzoDZ0WATa31m71juG1LnURjsmdkUOjNqy2j5WUp4y80obdGYKTT1Yh1hdI5SKND6621vaBPiGoKITjCZJ8A==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/base": "5.0.0-beta.22", + "@mui/system": "^5.14.16", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.16", "@mui/x-tree-view": "6.0.0-alpha.1", "clsx": "^2.0.0", "prop-types": "^15.8.1" @@ -4548,7 +5024,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material": "^5.0.0", + "@mui/material": ">=5.10.11", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0" @@ -4566,17 +5042,17 @@ } }, "node_modules/@mui/material": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.14.tgz", - "integrity": "sha512-cAmCwAHFQXxb44kWbVFkhKATN8tACgMsFwrXo8ro6WzYW73U/qsR5AcCiJIhCyYYg+gcftfkmNcpRaV3JjhHCg==", - "dependencies": { - "@babel/runtime": "^7.23.1", - "@mui/base": "5.0.0-beta.20", - "@mui/core-downloads-tracker": "^5.14.14", - "@mui/system": "^5.14.14", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", - "@types/react-transition-group": "^4.4.7", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.16.tgz", + "integrity": "sha512-W4zZ4vnxgGk6/HqBwgsDHKU7x2l2NhX+r8gAwfg58Rhu3ikfY7NkIS6y8Gl3NkATc4GG1FNaGjjpQKfJx3U6Jw==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/base": "5.0.0-beta.22", + "@mui/core-downloads-tracker": "^5.14.16", + "@mui/system": "^5.14.16", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.16", + "@types/react-transition-group": "^4.4.8", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1", @@ -4610,12 +5086,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.14.tgz", - "integrity": "sha512-n77au3CQj9uu16hak2Y+rvbGSBaJKxziG/gEbOLVGrAuqZ+ycVSkorCfN6Y/4XgYOpG/xvmuiY3JwhAEOzY3iA==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.16.tgz", + "integrity": "sha512-FNlL0pTSEBh8nXsVWreCHDSHk+jG8cBx1sxRbT8JVtL+PYbYPi802zfV4B00Kkf0LNRVRvAVQwojMWSR/MYGng==", "dependencies": { - "@babel/runtime": "^7.23.1", - "@mui/utils": "^5.14.13", + "@babel/runtime": "^7.23.2", + "@mui/utils": "^5.14.16", "prop-types": "^15.8.1" }, "engines": { @@ -4636,11 +5112,11 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.14.tgz", - "integrity": "sha512-sF3DS2PVG+cFWvkVHQQaGFpL1h6gSwOW3L91pdxPLQDHDZ5mZ/X0SlXU5XA+WjypoysG4urdAQC7CH/BRvUiqg==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.16.tgz", + "integrity": "sha512-FfvYvTG/Zd+KXMMImbcMYEeQAbONGuX5Vx3gBmmtB6KyA7Mvm9Pma1ly3R0gc44yeoFd+2wBjn1feS8h42HW5w==", "dependencies": { - "@babel/runtime": "^7.23.1", + "@babel/runtime": "^7.23.2", "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -4667,15 +5143,15 @@ } }, "node_modules/@mui/system": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.14.tgz", - "integrity": "sha512-y4InFmCgGGWXnz+iK4jRTWVikY0HgYnABjz4wgiUgEa2W1H8M4ow+27BegExUWPkj4TWthQ2qG9FOGSMtI+PKA==", - "dependencies": { - "@babel/runtime": "^7.23.1", - "@mui/private-theming": "^5.14.14", - "@mui/styled-engine": "^5.14.13", - "@mui/types": "^7.2.6", - "@mui/utils": "^5.14.13", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.16.tgz", + "integrity": "sha512-uKnPfsDqDs8bbN54TviAuoGWOmFiQLwNZ3Wvj+OBkJCzwA6QnLb/sSeCB7Pk3ilH4h4jQ0BHtbR+Xpjy9wlOuA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/private-theming": "^5.14.16", + "@mui/styled-engine": "^5.14.16", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.16", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -4706,9 +5182,9 @@ } }, "node_modules/@mui/types": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.6.tgz", - "integrity": "sha512-7sjLQrUmBwufm/M7jw/quNiPK/oor2+pGUQP2CULRcFCArYTq78oJ3D5esTaL0UMkXKJvDqXn6Ike69yAOBQng==", + "version": "7.2.8", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.8.tgz", + "integrity": "sha512-9u0ji+xspl96WPqvrYJF/iO+1tQ1L5GTaDOeG3vCR893yy7VcWwRNiVMmPdPNpMDqx0WV1wtEW9OMwK9acWJzQ==", "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0" }, @@ -4719,12 +5195,12 @@ } }, "node_modules/@mui/utils": { - "version": "5.14.14", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.14.tgz", - "integrity": "sha512-3AKp8uksje5sRfVrtgG9Q/2TBsHWVBUtA0NaXliZqGcXo8J+A+Agp0qUW2rJ+ivgPWTCCubz9FZVT2IQZ3bGsw==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.16.tgz", + "integrity": "sha512-3xV31GposHkwRbQzwJJuooWpK2ybWdEdeUPtRjv/6vjomyi97F3+68l+QVj9tPTvmfSbr2sx5c/NuvDulrdRmA==", "dependencies": { - "@babel/runtime": "^7.23.1", - "@types/prop-types": "^15.7.7", + "@babel/runtime": "^7.23.2", + "@types/prop-types": "^15.7.9", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -4746,14 +5222,14 @@ } }, "node_modules/@mui/x-date-pickers": { - "version": "6.16.3", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.16.3.tgz", - "integrity": "sha512-CBwXrOJ5blqkAdF0d1dWF1RMeCS6ZYDq+53Yf/r+Izqj33+SCw+wAbdrxuIxE2GL3JY5NszEx8JFnCKZIzFZuA==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.18.0.tgz", + "integrity": "sha512-y4UlkHQXiNRfb6FWQ/GWir0sZ+9kL+GEEZssG+XWP3KJ+d3lONRteusl4AJkYJBdIAOh+5LnMV9RAQKq9Sl7yw==", "dependencies": { "@babel/runtime": "^7.23.2", - "@mui/base": "^5.0.0-beta.20", - "@mui/utils": "^5.14.14", - "@types/react-transition-group": "^4.4.7", + "@mui/base": "^5.0.0-beta.22", + "@mui/utils": "^5.14.16", + "@types/react-transition-group": "^4.4.8", "clsx": "^2.0.0", "prop-types": "^15.8.1", "react-transition-group": "^4.4.5" @@ -5233,9 +5709,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.10.0.tgz", - "integrity": "sha512-Lm+fYpMfZoEucJ7cMxgt4dYt8jLfbpwRCzAjm9UgSLOkmlqo9gupxt6YX3DY0Fk155NT9l17d/ydi+964uS9Lw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.11.0.tgz", + "integrity": "sha512-BHdhcWgeiudl91HvVa2wxqZjSHbheSgIiDvxrF1VjFzBzpTtuDPkOdOi3Iqvc08kXtFkLjhbS+ML9aM8mJS+wQ==", "engines": { "node": ">=14.0.0" } @@ -5247,58 +5723,54 @@ "dev": true }, "node_modules/@sentry-internal/tracing": { - "version": "7.74.1", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.74.1.tgz", - "integrity": "sha512-nNaiZreQxCitG2PzYPaC7XtyA9OMsETGYMKAtiK4p62/uTmeYbsBva9BoNx1XeiHRwbrVQYRMKQ9nV5e2jS4/A==", + "version": "7.77.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.77.0.tgz", + "integrity": "sha512-8HRF1rdqWwtINqGEdx8Iqs9UOP/n8E0vXUu3Nmbqj4p5sQPA7vvCfq+4Y4rTqZFc7sNdFpDsRION5iQEh8zfZw==", "dependencies": { - "@sentry/core": "7.74.1", - "@sentry/types": "7.74.1", - "@sentry/utils": "7.74.1", - "tslib": "^2.4.1 || ^1.9.3" + "@sentry/core": "7.77.0", + "@sentry/types": "7.77.0", + "@sentry/utils": "7.77.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/browser": { - "version": "7.74.1", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.74.1.tgz", - "integrity": "sha512-OYWNne/KO60lOvkIpIlJUyiJt/9j8DGI57thSDFEYSmmbNqMitczUTBOaEStouvHKyfchqLZm1CZfWKt+z0VOA==", + "version": "7.77.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.77.0.tgz", + "integrity": "sha512-nJ2KDZD90H8jcPx9BysQLiQW+w7k7kISCWeRjrEMJzjtge32dmHA8G4stlUTRIQugy5F+73cOayWShceFP7QJQ==", "dependencies": { - "@sentry-internal/tracing": "7.74.1", - "@sentry/core": "7.74.1", - "@sentry/replay": "7.74.1", - "@sentry/types": "7.74.1", - "@sentry/utils": "7.74.1", - "tslib": "^2.4.1 || ^1.9.3" + "@sentry-internal/tracing": "7.77.0", + "@sentry/core": "7.77.0", + "@sentry/replay": "7.77.0", + "@sentry/types": "7.77.0", + "@sentry/utils": "7.77.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/core": { - "version": "7.74.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.74.1.tgz", - "integrity": "sha512-LvEhOSfdIvwkr+PdlrT/aA/iOLhkXrSkvjqAQyogE4ddCWeYfS0NoirxNt1EaxMBAWKhYZRqzkA7WA4LDLbzlA==", + "version": "7.77.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.77.0.tgz", + "integrity": "sha512-Tj8oTYFZ/ZD+xW8IGIsU6gcFXD/gfE+FUxUaeSosd9KHwBQNOLhZSsYo/tTVf/rnQI/dQnsd4onPZLiL+27aTg==", "dependencies": { - "@sentry/types": "7.74.1", - "@sentry/utils": "7.74.1", - "tslib": "^2.4.1 || ^1.9.3" + "@sentry/types": "7.77.0", + "@sentry/utils": "7.77.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/react": { - "version": "7.74.1", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.74.1.tgz", - "integrity": "sha512-16oTsNi2hl/S5AL/e5bo9DQZDwXPkX0nC8ajrpU0z2pH4cwjQZUZt/9Xq1+MKqDIEZkqDcMwpTmBptOvy1Pvkw==", + "version": "7.77.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.77.0.tgz", + "integrity": "sha512-Q+htKzib5em0MdaQZMmPomaswaU3xhcVqmLi2CxqQypSjbYgBPPd+DuhrXKoWYLDDkkbY2uyfe4Lp3yLRWeXYw==", "dependencies": { - "@sentry/browser": "7.74.1", - "@sentry/types": "7.74.1", - "@sentry/utils": "7.74.1", - "hoist-non-react-statics": "^3.3.2", - "tslib": "^2.4.1 || ^1.9.3" + "@sentry/browser": "7.77.0", + "@sentry/types": "7.77.0", + "@sentry/utils": "7.77.0", + "hoist-non-react-statics": "^3.3.2" }, "engines": { "node": ">=8" @@ -5308,44 +5780,44 @@ } }, "node_modules/@sentry/replay": { - "version": "7.74.1", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.74.1.tgz", - "integrity": "sha512-qmbOl+jYdyhoHFbPp9WemKx8UojID5hVmuVLxNIP0ANqAwmE9OQEK9YFg2cf7L/TpKb1tqz0qLgi5MYIdcdpgQ==", + "version": "7.77.0", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.77.0.tgz", + "integrity": "sha512-M9Ik2J5ekl+C1Och3wzLRZVaRGK33BlnBwfwf3qKjgLDwfKW+1YkwDfTHbc2b74RowkJbOVNcp4m8ptlehlSaQ==", "dependencies": { - "@sentry/core": "7.74.1", - "@sentry/types": "7.74.1", - "@sentry/utils": "7.74.1" + "@sentry-internal/tracing": "7.77.0", + "@sentry/core": "7.77.0", + "@sentry/types": "7.77.0", + "@sentry/utils": "7.77.0" }, "engines": { "node": ">=12" } }, "node_modules/@sentry/tracing": { - "version": "7.74.1", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.74.1.tgz", - "integrity": "sha512-YqhLMY28uukOR8FtoCMvzdzBYkTtwj/JHUensDEpTZG5OoQTjrcgttpL+WMaCBUy1MpOIo7FyLB5aoRq2U7AIA==", + "version": "7.77.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.77.0.tgz", + "integrity": "sha512-zr6eSCW3NJ124uj4Fy/6hh77cziy43dpYE1WpgvO/yhl1+kdrY2XVJ0bXGqwHU0KBm/eSgHD7yecUxmZUXiabA==", "dependencies": { - "@sentry-internal/tracing": "7.74.1" + "@sentry-internal/tracing": "7.77.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/types": { - "version": "7.74.1", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.74.1.tgz", - "integrity": "sha512-2jIuPc+YKvXqZETwr2E8VYnsH1zsSUR/wkIvg1uTVeVNyoowJv+YsOtCdeGyL2AwiotUBSPKu7O1Lz0kq5rMOQ==", + "version": "7.77.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.77.0.tgz", + "integrity": "sha512-nfb00XRJVi0QpDHg+JkqrmEBHsqBnxJu191Ded+Cs1OJ5oPXEW6F59LVcBScGvMqe+WEk1a73eH8XezwfgrTsA==", "engines": { "node": ">=8" } }, "node_modules/@sentry/utils": { - "version": "7.74.1", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.74.1.tgz", - "integrity": "sha512-qUsqufuHYcy5gFhLZslLxA5kcEOkkODITXW3c7D+x+8iP/AJqa8v8CeUCVNS7RetHCuIeWAbbTClC4c411EwQg==", + "version": "7.77.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.77.0.tgz", + "integrity": "sha512-NmM2kDOqVchrey3N5WSzdQoCsyDkQkiRxExPaNI2oKQ/jMWHs9yt0tSy7otPBcXs0AP59ihl75Bvm1tDRcsp5g==", "dependencies": { - "@sentry/types": "7.74.1", - "tslib": "^2.4.1 || ^1.9.3" + "@sentry/types": "7.77.0" }, "engines": { "node": ">=8" @@ -5626,6 +6098,76 @@ "node": ">=14" } }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/@testing-library/dom/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/dom/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@testing-library/jest-dom": { "version": "5.17.0", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", @@ -5647,6 +6189,20 @@ "yarn": ">=1" } }, + "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/@testing-library/jest-dom/node_modules/chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -5659,6 +6215,41 @@ "node": ">=8" } }, + "node_modules/@testing-library/jest-dom/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@testing-library/jest-dom/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@testing-library/react": { "version": "13.4.0", "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", @@ -5694,43 +6285,107 @@ "node": ">=12" } }, - "node_modules/@testing-library/user-event": { - "version": "14.5.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.1.tgz", - "integrity": "sha512-UCcUKrUYGj7ClomOo2SpNVvx4/fkd/2BbIHDCle8A0ax+P3bU7yJwDBDrS6ZwdTMARWTGODX1hEsCcO+7beJjg==", + "node_modules/@testing-library/react/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=12", - "npm": ">=6" + "node": ">=8" }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, + "node_modules/@testing-library/react/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, + "node_modules/@testing-library/react/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=10.13.0" + "node": ">=7.0.0" } }, - "node_modules/@types/apollo-upload-client": { - "version": "17.0.4", - "resolved": "https://registry.npmjs.org/@types/apollo-upload-client/-/apollo-upload-client-17.0.4.tgz", - "integrity": "sha512-lUoGuvesg4W4mgEk8SRiuh0tDC4mXv92Jj2ogaMEjTR2Wt6eBYCUoy1pDXVapqXv4uZGh+oKlqrtadXySKO+jQ==", - "dependencies": { - "@apollo/client": "^3.7.0", - "@types/extract-files": "*", + "node_modules/@testing-library/react/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@testing-library/react/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.5.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.1.tgz", + "integrity": "sha512-UCcUKrUYGj7ClomOo2SpNVvx4/fkd/2BbIHDCle8A0ax+P3bU7yJwDBDrS6ZwdTMARWTGODX1hEsCcO+7beJjg==", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/apollo-upload-client": { + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@types/apollo-upload-client/-/apollo-upload-client-17.0.4.tgz", + "integrity": "sha512-lUoGuvesg4W4mgEk8SRiuh0tDC4mXv92Jj2ogaMEjTR2Wt6eBYCUoy1pDXVapqXv4uZGh+oKlqrtadXySKO+jQ==", + "dependencies": { + "@apollo/client": "^3.7.0", + "@types/extract-files": "*", "graphql": "14 - 16" } }, @@ -5852,9 +6507,9 @@ } }, "node_modules/@types/d3-array": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.9.tgz", - "integrity": "sha512-mZowFN3p64ajCJJ4riVYlOjNlBJv3hctgAY01pjw3qTnJePD8s9DZmYDzhHKvzfCYvdjwylkU38+Vdt7Cu2FDA==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.0.tgz", + "integrity": "sha512-tjU8juPSfhMnu6mJZPOCVVGba4rZoE0tjHDPb81PYwA8CzbaFscGjgkUM7juUJu6iWA1cCVWNEVwxZ5HN9Jj8Q==" }, "node_modules/@types/d3-axis": { "version": "3.0.5", @@ -6067,9 +6722,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", - "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz", + "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==", "dev": true }, "node_modules/@types/express": { @@ -6107,9 +6762,9 @@ "integrity": "sha512-uK2z1ZHJyC0nQRbuovXFt4mzXDwf27vQeUWNhfKGwRcWW429GOhP8HxUHlM6TLH4bzmlv/HlEjpvJh3JfmGsAA==" }, "node_modules/@types/google.maps": { - "version": "3.54.4", - "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.54.4.tgz", - "integrity": "sha512-cUX4SOo5eN1Fotpcm6cH3//F8/UgXrs6/3OUkLYDkAizGo0AaecjBGCJMmY/n5XcMKogRFrqN/69JNKwCjBskg==" + "version": "3.54.6", + "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.54.6.tgz", + "integrity": "sha512-cTGbsddDgEwZ/6xPywI7HKbeYJkfXFg92HdYnlE0HO3gT/030CVdUHLO2uQOkEo0YMp6TRPqTlAnRGNbQJu8vw==" }, "node_modules/@types/graceful-fs": { "version": "4.1.8", @@ -6173,9 +6828,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.6", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.6.tgz", - "integrity": "sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w==", + "version": "29.5.7", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.7.tgz", + "integrity": "sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -6228,9 +6883,18 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.18.59", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.59.tgz", - "integrity": "sha512-PJ1w2cNeKUEdey4LiPra0ZuxZFOGvetswE8qHRriV/sUkL5Al4tTmPV9D2+Y/TPIxTHHgxTfRjZVKWhPw/ORhQ==" + "version": "16.18.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.60.tgz", + "integrity": "sha512-ZUGPWx5vKfN+G2/yN7pcSNLkIkXEvlwNaJEd4e0ppX7W2S8XAkdc/37hM4OUNJB9sa0p12AOvGvxL4JCPiz9DA==" + }, + "node_modules/@types/node-forge": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.8.tgz", + "integrity": "sha512-vGXshY9vim9CJjrpcS5raqSjEfKlJcWy2HNdgUasR66fAnVEYarrf1ULV4nfvpC1nZq/moA9qyqBcu83x+Jlrg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/normalize-package-data": { "version": "2.4.3", @@ -6271,9 +6935,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.2.31", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.31.tgz", - "integrity": "sha512-c2UnPv548q+5DFh03y8lEDeMfDwBn9G3dRwfkrxQMo/dOtRHUUO57k6pHvBIfH/VF4Nh+98mZ5aaSe+2echD5g==", + "version": "18.2.35", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.35.tgz", + "integrity": "sha512-LG3xpFZ++rTndV+/XFyX5vUP7NI9yxyk+MQvBDq+CVs8I9DLSc3Ymwb1Vmw5YDoeNeHN4PDZa3HylMKJYT9PNQ==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -6449,14 +7113,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.0.tgz", - "integrity": "sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==", - "dependencies": { - "@typescript-eslint/scope-manager": "6.9.0", - "@typescript-eslint/types": "6.9.0", - "@typescript-eslint/typescript-estree": "6.9.0", - "@typescript-eslint/visitor-keys": "6.9.0", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", + "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", + "dependencies": { + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4" }, "engines": { @@ -6476,12 +7140,12 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.0.tgz", - "integrity": "sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", + "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", "dependencies": { - "@typescript-eslint/types": "6.9.0", - "@typescript-eslint/visitor-keys": "6.9.0" + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -6575,10 +7239,43 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/type-utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@typescript-eslint/types": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz", - "integrity": "sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", + "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -6588,12 +7285,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.0.tgz", - "integrity": "sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", + "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", "dependencies": { - "@typescript-eslint/types": "6.9.0", - "@typescript-eslint/visitor-keys": "6.9.0", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -6613,6 +7310,36 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/@typescript-eslint/utils": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", @@ -6735,12 +7462,45 @@ "node": ">=4.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz", - "integrity": "sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", + "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", "dependencies": { - "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/types": "6.9.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -6757,14 +7517,14 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@vitejs/plugin-react": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.0.tgz", - "integrity": "sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.1.tgz", + "integrity": "sha512-Jie2HERK+uh27e+ORXXwEP5h0Y2lS9T2PRGbfebiHGlwzDO0dEnd2aNtOR/qjBlPb1YgxwAONeblL1xqLikLag==", "dependencies": { - "@babel/core": "^7.22.20", + "@babel/core": "^7.23.2", "@babel/plugin-transform-react-jsx-self": "^7.22.5", "@babel/plugin-transform-react-jsx-source": "^7.22.5", - "@types/babel__core": "^7.20.2", + "@types/babel__core": "^7.20.3", "react-refresh": "^0.14.0" }, "engines": { @@ -6921,9 +7681,9 @@ } }, "node_modules/@wry/context": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.3.tgz", - "integrity": "sha512-Nl8WTesHp89RF803Se9X3IiHjdmLBrIvPMaJkl+rKVJAYyPsz1TEUbu89943HpvujtSJgDUx9W4vZw3K1Mr3sA==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.4.tgz", + "integrity": "sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -6932,9 +7692,9 @@ } }, "node_modules/@wry/equality": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.6.tgz", - "integrity": "sha512-D46sfMTngaYlrH+OspKf8mIJETntFnf6Hsjb0V41jAXJ7Bx2kB8Rv8RCUujuVWYttFtHkUNp7g+FwxNQAr6mXA==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.7.tgz", + "integrity": "sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==", "dependencies": { "tslib": "^2.3.0" }, @@ -6990,9 +7750,9 @@ } }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "bin": { "acorn": "bin/acorn" }, @@ -7213,17 +7973,14 @@ } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, "node_modules/any-promise": { @@ -7464,15 +8221,15 @@ "dev": true }, "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/asynciterator.prototype": { "version": "1.0.0", @@ -7555,9 +8312,9 @@ } }, "node_modules/axe-core": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", - "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "dev": true, "engines": { "node": ">=4" @@ -7627,6 +8384,76 @@ "@types/yargs-parser": "*" } }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-loader": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", @@ -7732,15 +8559,6 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.8.6", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", @@ -8088,15 +8906,79 @@ "node": ">=10" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { + "node_modules/bundlewatch/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/bundlewatch/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/bundlewatch/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/bundlewatch/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/bundlewatch/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bundlewatch/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", @@ -8161,9 +9043,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001553", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001553.tgz", - "integrity": "sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A==", + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", "funding": [ { "type": "opencollective", @@ -8213,18 +9095,24 @@ } }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" } }, "node_modules/char-regex": { @@ -8425,77 +9313,6 @@ "node": ">= 4.0" } }, - "node_modules/coa/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/coa/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/coa/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/coa/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", @@ -8503,20 +9320,17 @@ "dev": true }, "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/color-support": { "version": "1.1.3", @@ -8688,9 +9502,9 @@ } }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/cookie": { "version": "0.5.0", @@ -8708,9 +9522,9 @@ "dev": true }, "node_modules/core-js": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.1.tgz", - "integrity": "sha512-qVSq3s+d4+GsqN0teRCJtM6tdEEXyWxjzbhVrCHmBS5ZTM0FS2MOS0D13dUXAWDUN6a+lHI/N1hF9Ytz6iLl9Q==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz", + "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==", "dev": true, "hasInstallScript": true, "funding": { @@ -8719,9 +9533,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.1.tgz", - "integrity": "sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", + "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", "dev": true, "dependencies": { "browserslist": "^4.22.1" @@ -8732,9 +9546,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.1.tgz", - "integrity": "sha512-wCXGbLjnsP10PlK/thHSQlOLlLKNEkaWbTzVvHHZ79fZNeN1gUmw2gBlpItxPv/pvqldevEXFh/d5stdNvl6EQ==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.2.tgz", + "integrity": "sha512-a8zeCdyVk7uF2elKIGz67AjcXOxjRbwOLz8SbklEso1V+2DoW4OkAMZN9S9GBgvZIaqQi/OemFX4OiSoQEmg1Q==", "dev": true, "hasInstallScript": true, "funding": { @@ -8763,6 +9577,17 @@ "node": ">=10" } }, + "node_modules/cross-inspect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.0.tgz", + "integrity": "sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ==", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -8859,6 +9684,39 @@ "webpack": "^5.0.0" } }, + "node_modules/css-loader/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-loader/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/css-minimizer-webpack-plugin": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", @@ -9036,9 +9894,9 @@ "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" }, "node_modules/cssdb": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.8.0.tgz", - "integrity": "sha512-SkeezZOQr5AHt9MgJgSFNyiuJwg1p8AwoVln6JwaQJsyxduRW9QJ+HP/gAQzbsz8SIqINtYvpJKjxTRI67zxLg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.9.0.tgz", + "integrity": "sha512-WPMT9seTQq6fPAa1yN4zjgZZeoTriSN2LqW9C+otjar12DQIWA4LuSfFrvFJiKp4oD0xIk1vumDLw8K9ur4NBw==", "dev": true, "funding": [ { @@ -9835,9 +10693,9 @@ "dev": true }, "node_modules/dset": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz", - "integrity": "sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", + "integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==", "engines": { "node": ">=4" } @@ -9868,9 +10726,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.565", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.565.tgz", - "integrity": "sha512-XbMoT6yIvg2xzcbs5hCADi0dXBh4//En3oFXmtPX+jiyyiCTiM9DGFT2SLottjpEs9Z8Mh8SqahbR96MaHfuSg==" + "version": "1.4.576", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz", + "integrity": "sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==" }, "node_modules/elkjs": { "version": "0.8.2", @@ -10186,14 +11044,14 @@ } }, "node_modules/eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -10426,6 +11284,39 @@ } } }, + "node_modules/eslint-config-react-app/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-config-react-app/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-config-react-app/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -10535,36 +11426,28 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", "dev": true, "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", - "damerau-levenshtein": "^1.0.8", + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", + "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" }, "engines": { "node": ">=4.0" @@ -10573,13 +11456,13 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "dequal": "^2.0.3" } }, "node_modules/eslint-plugin-react": { @@ -10653,15 +11536,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-testing-library": { "version": "5.11.1", "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", @@ -10756,6 +11630,15 @@ "ajv": "^8.8.2" } }, + "node_modules/eslint-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", @@ -10810,6 +11693,51 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "node_modules/eslint/node_modules/globals": { "version": "13.23.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", @@ -10824,6 +11752,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/eslint/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -11386,6 +12333,55 @@ } } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", @@ -11417,6 +12413,27 @@ "node": ">=10" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", @@ -11435,6 +12452,33 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -11444,6 +12488,12 @@ "node": ">=6" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", @@ -11879,15 +12929,6 @@ "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", "dev": true }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -11897,11 +12938,11 @@ } }, "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/has-property-descriptors": { @@ -12949,15 +13990,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -12972,6 +14004,27 @@ "node": ">=10" } }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -12987,6 +14040,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -13053,8 +14139,72 @@ "node": ">=10" } }, - "node_modules/jest": { - "version": "27.5.1", + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "dev": true, @@ -13117,6 +14267,76 @@ "@types/yargs-parser": "*" } }, + "node_modules/jest-changed-files/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-changed-files/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-circus": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", @@ -13172,6 +14392,55 @@ "@types/yargs-parser": "*" } }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/jest-circus/node_modules/diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -13196,6 +14465,15 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-circus/node_modules/jest-diff": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", @@ -13272,6 +14550,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-cli": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", @@ -13331,6 +14621,64 @@ "@types/yargs-parser": "*" } }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-cli/node_modules/jest-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", @@ -13348,6 +14696,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-config": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", @@ -13416,10 +14776,68 @@ "@types/yargs-parser": "*" } }, - "node_modules/jest-config/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "dev": true, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -13442,6 +14860,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", @@ -13457,16 +14887,58 @@ } }, "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/jest-diff/node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -13480,6 +14952,28 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-diff/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-docblock": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", @@ -13533,6 +15027,64 @@ "@types/yargs-parser": "*" } }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-each/node_modules/jest-get-type": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", @@ -13559,6 +15111,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-environment-jsdom": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", @@ -13602,6 +15166,64 @@ "@types/yargs-parser": "*" } }, + "node_modules/jest-environment-jsdom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-environment-jsdom/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-environment-jsdom/node_modules/jest-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", @@ -13619,6 +15241,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-environment-jsdom/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-environment-node": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", @@ -13661,6 +15295,64 @@ "@types/yargs-parser": "*" } }, + "node_modules/jest-environment-node/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-environment-node/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-node/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-environment-node/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-environment-node/node_modules/jest-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", @@ -13678,6 +15370,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-environment-node/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", @@ -13737,6 +15441,64 @@ "@types/yargs-parser": "*" } }, + "node_modules/jest-haste-map/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-haste-map/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-haste-map/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-haste-map/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-haste-map/node_modules/jest-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", @@ -13754,6 +15516,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-haste-map/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-jasmine2": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", @@ -13807,6 +15581,55 @@ "@types/yargs-parser": "*" } }, + "node_modules/jest-jasmine2/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/jest-jasmine2/node_modules/diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -13831,6 +15654,15 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-jasmine2/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-jasmine2/node_modules/jest-diff": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", @@ -13907,6 +15739,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-jasmine2/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-leak-detector": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", @@ -13944,16 +15788,58 @@ } }, "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/jest-matcher-utils/node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -13967,6 +15853,28 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", @@ -13987,16 +15895,58 @@ } }, "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/jest-message-util/node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -14010,6 +15960,28 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-mock": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", @@ -14048,6 +16020,76 @@ "@types/yargs-parser": "*" } }, + "node_modules/jest-mock/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-mock/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-mock/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-mock/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-mock/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", @@ -14101,15 +16143,110 @@ "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", "dev": true, "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.7.tgz", + "integrity": "sha512-lQcYmxWuOfJq4IncK88/nwud9rwr1F04CFc5xzk0k4oKVyz/AI35TfsXmhjf6t8zp8mpCOi17BfvuNWx+zrYkg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-resolve-dependencies/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, - "node_modules/jest-resolve-dependencies/node_modules/@jest/types": { + "node_modules/jest-resolve/node_modules/@jest/types": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", @@ -14125,7 +16262,7 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": { + "node_modules/jest-resolve/node_modules/@types/yargs": { "version": "16.0.7", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.7.tgz", "integrity": "sha512-lQcYmxWuOfJq4IncK88/nwud9rwr1F04CFc5xzk0k4oKVyz/AI35TfsXmhjf6t8zp8mpCOi17BfvuNWx+zrYkg==", @@ -14134,29 +16271,62 @@ "@types/yargs-parser": "*" } }, - "node_modules/jest-resolve/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-resolve/node_modules/@types/yargs": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.7.tgz", - "integrity": "sha512-lQcYmxWuOfJq4IncK88/nwud9rwr1F04CFc5xzk0k4oKVyz/AI35TfsXmhjf6t8zp8mpCOi17BfvuNWx+zrYkg==", + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/jest-resolve/node_modules/jest-util": { @@ -14176,6 +16346,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-runner": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", @@ -14233,6 +16415,64 @@ "@types/yargs-parser": "*" } }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-runner/node_modules/jest-message-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", @@ -14270,6 +16510,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-runtime": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", @@ -14328,6 +16580,64 @@ "@types/yargs-parser": "*" } }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-runtime/node_modules/jest-message-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", @@ -14365,6 +16675,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-serializer": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", @@ -14408,33 +16730,82 @@ "semver": "^7.3.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@types/yargs": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.7.tgz", + "integrity": "sha512-lQcYmxWuOfJq4IncK88/nwud9rwr1F04CFc5xzk0k4oKVyz/AI35TfsXmhjf6t8zp8mpCOi17BfvuNWx+zrYkg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-snapshot/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=7.0.0" } }, - "node_modules/jest-snapshot/node_modules/@types/yargs": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.7.tgz", - "integrity": "sha512-lQcYmxWuOfJq4IncK88/nwud9rwr1F04CFc5xzk0k4oKVyz/AI35TfsXmhjf6t8zp8mpCOi17BfvuNWx+zrYkg==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/jest-snapshot/node_modules/diff-sequences": { "version": "27.5.1", @@ -14460,6 +16831,15 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-snapshot/node_modules/jest-diff": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", @@ -14536,6 +16916,51 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -14552,6 +16977,70 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-validate": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", @@ -14594,6 +17083,64 @@ "@types/yargs-parser": "*" } }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-validate/node_modules/jest-get-type": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", @@ -14603,6 +17150,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-watch-typeahead": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", @@ -14683,35 +17242,72 @@ "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", "dev": true, "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">=7.0.0" } }, - "node_modules/jest-watch-typeahead/node_modules/@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "node_modules/jest-watch-typeahead/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-watch-typeahead/node_modules/emittery": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", @@ -14724,6 +17320,15 @@ "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, + "node_modules/jest-watch-typeahead/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", @@ -14838,6 +17443,18 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-watch-typeahead/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -14902,6 +17519,18 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/jest-watch-typeahead/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-watcher": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", @@ -14945,6 +17574,64 @@ "@types/yargs-parser": "*" } }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-watcher/node_modules/jest-util": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", @@ -14962,6 +17649,18 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-websocket-mock": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/jest-websocket-mock/-/jest-websocket-mock-2.5.0.tgz", @@ -14985,6 +17684,15 @@ "node": ">= 10.13.0" } }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -15001,9 +17709,9 @@ } }, "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", "dev": true, "bin": { "jiti": "bin/jiti.js" @@ -15252,12 +17960,15 @@ "dev": true }, "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, "dependencies": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/launch-editor": { @@ -15444,15 +18155,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -15819,9 +18521,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -17140,9 +19842,9 @@ } }, "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", - "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "dev": true, "engines": { "node": ">= 14" @@ -17170,6 +19872,39 @@ "webpack": "^5.0.0" } }, + "node_modules/postcss-loader/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-loader/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-loader/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/postcss-logical": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", @@ -17881,17 +20616,17 @@ "dev": true }, "node_modules/posthog-js": { - "version": "1.84.3", - "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.84.3.tgz", - "integrity": "sha512-xvPrvp1AENgyblsGU9tHDoMkBE2EHxtlEAZiOaqp2cNivC/L+fSmdfCCtCF1rEUMFDzUkFVvH5zOshOzOfyrMQ==", + "version": "1.88.1", + "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.88.1.tgz", + "integrity": "sha512-+8kFFU5KIcFSm8zB3tX8l0GSPyq/OtMtdrS9dYpMJk6nsEwXvOjkwFEpSrYzL5eGEpTPdbM65M52HvMqqsjpXw==", "dependencies": { "fflate": "^0.4.1" } }, "node_modules/preact": { - "version": "10.18.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.18.1.tgz", - "integrity": "sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg==", + "version": "10.18.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.18.2.tgz", + "integrity": "sha512-X/K43vocUHDg0XhWVmTTMbec4LT/iBMh+csCEqJk+pJqegaXsvjdqN80ZZ3L+93azWCnWCZ+WGwYb8SplxeNjA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -18042,9 +20777,9 @@ "dev": true }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } @@ -18232,6 +20967,64 @@ "node": ">=14" } }, + "node_modules/react-dev-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react-dev-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/react-dev-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/react-dev-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/react-dev-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/react-dev-utils/node_modules/loader-utils": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", @@ -18241,6 +21034,18 @@ "node": ">= 12.13.0" } }, + "node_modules/react-dev-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -18348,9 +21153,9 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/react-json-view-lite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.1.0.tgz", - "integrity": "sha512-90cq69xHA4N3ZxZpIVcsZzWPBWuaEbI9BetfNWp/kDcqSX2gZmpFtTrmrcmmIzcN2WUudxpUb4k/DcjsxjjcVA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.2.0.tgz", + "integrity": "sha512-Z5KSFNDjw3oYr6a2ZZ6SxAiU5OlXrlTbvEUshYeEn9eCEgrfb+DaJRK+6ZG+x7nLVl5RtOOBsfzD5iseUgLMRQ==", "engines": { "node": ">=14" }, @@ -18390,11 +21195,11 @@ } }, "node_modules/react-router": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.17.0.tgz", - "integrity": "sha512-YJR3OTJzi3zhqeJYADHANCGPUu9J+6fT5GLv82UWRGSxu6oJYCKVmxUcaBQuGm9udpWmPsvpme/CdHumqgsoaA==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.18.0.tgz", + "integrity": "sha512-vk2y7Dsy8wI02eRRaRmOs9g2o+aE72YCx5q9VasT1N9v+lrdB79tIqrjMfByHiY5+6aYkH2rUa5X839nwWGPDg==", "dependencies": { - "@remix-run/router": "1.10.0" + "@remix-run/router": "1.11.0" }, "engines": { "node": ">=14.0.0" @@ -18404,12 +21209,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.17.0.tgz", - "integrity": "sha512-qWHkkbXQX+6li0COUUPKAUkxjNNqPJuiBd27dVwQGDNsuFBdMbrS6UZ0CLYc4CsbdLYTckn4oB4tGDuPZpPhaQ==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.18.0.tgz", + "integrity": "sha512-Ubrue4+Ercc/BoDkFQfc6og5zRQ4A8YxSO3Knsne+eRbZ+IepAsK249XBH/XaFuOYOYr3L3r13CXTLvYt5JDjw==", "dependencies": { - "@remix-run/router": "1.10.0", - "react-router": "6.17.0" + "@remix-run/router": "1.11.0", + "react-router": "6.18.0" }, "engines": { "node": ">=14.0.0" @@ -18492,15 +21297,48 @@ } } }, + "node_modules/react-scripts/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/react-scripts/node_modules/react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/react-scripts/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, + "node_modules/react-scripts/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/react-shepherd": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/react-shepherd/-/react-shepherd-4.2.0.tgz", @@ -18955,6 +21793,12 @@ } } }, + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, "node_modules/resolve-url-loader/node_modules/picocolors": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", @@ -19229,11 +22073,12 @@ "dev": true }, "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, "dependencies": { + "@types/node-forge": "^1.3.0", "node-forge": "^1" }, "engines": { @@ -19241,35 +22086,13 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -19620,6 +22443,64 @@ "node": ">=12" } }, + "node_modules/source-map-explorer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/source-map-explorer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/source-map-explorer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/source-map-explorer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/source-map-explorer/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/source-map-explorer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/source-map-explorer/node_modules/open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", @@ -19643,6 +22524,17 @@ "node": ">= 8" } }, + "node_modules/source-map-explorer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -20186,14 +23078,14 @@ } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/supports-hyperlinks": { @@ -20209,6 +23101,27 @@ "node": ">=8" } }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -20254,18 +23167,6 @@ "node": ">=4.0.0" } }, - "node_modules/svgo/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/svgo/node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -20275,35 +23176,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/svgo/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/svgo/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/svgo/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, "node_modules/svgo/node_modules/css-select": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", @@ -20354,24 +23226,6 @@ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, - "node_modules/svgo/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/svgo/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/svgo/node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -20406,18 +23260,6 @@ "boolbase": "~1.0.0" } }, - "node_modules/svgo/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", @@ -20433,9 +23275,9 @@ "dev": true }, "node_modules/tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -20443,10 +23285,10 @@ "chokidar": "^3.5.3", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.12", + "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.18.2", + "jiti": "^1.19.1", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", @@ -20603,9 +23445,9 @@ } }, "node_modules/terser": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", - "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", "devOptional": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -21085,9 +23927,9 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -21232,6 +24074,12 @@ "node": ">=10.12.0" } }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, "node_modules/v8-to-istanbul/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -22110,6 +24958,15 @@ "node": ">=10" } }, + "node_modules/workbox-build/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/workbox-build/node_modules/jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", @@ -22182,6 +25039,18 @@ "node": ">= 8" } }, + "node_modules/workbox-build/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/workbox-build/node_modules/tr46": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", @@ -22387,6 +25256,36 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -22508,9 +25407,9 @@ } }, "node_modules/zustand": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.4.tgz", - "integrity": "sha512-5UTUIAiHMNf5+mFp7/AnzJXS7+XxktULFN0+D1sCiZWyX7ZG+AQpqs2qpYrynRij4QvoDdCD+U+bmg/cG3Ucxw==", + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.6.tgz", + "integrity": "sha512-Rb16eW55gqL4W2XZpJh0fnrATxYEG3Apl2gfHTyDSE965x/zxslTikpNch0JgNjJA9zK6gEFW8Fl6d1rTZaqgg==", "dependencies": { "use-sync-external-store": "1.2.0" }, diff --git a/grai-frontend/package.json b/grai-frontend/package.json index 52dea7524..c54741b76 100644 --- a/grai-frontend/package.json +++ b/grai-frontend/package.json @@ -39,7 +39,7 @@ "chartjs-chart-matrix": "^2.0.1", "dayjs": "^1.11.6", "elkjs": "^0.8.2", - "eslint": "^8.52.0", + "eslint": "^8.53.0", "eslint-plugin-import": "^2.27.5", "graphql": "^16.8.1", "jest-websocket-mock": "^2.5.0", diff --git a/grai-frontend/src/App.test.tsx b/grai-frontend/src/App.test.tsx index 323385957..5eb2efe1f 100644 --- a/grai-frontend/src/App.test.tsx +++ b/grai-frontend/src/App.test.tsx @@ -5,10 +5,6 @@ import App from "./App" test("renders", async () => { render() - await waitFor(() => { - expect(screen.queryByRole("progressbar")).not.toBeInTheDocument() - }) - await waitFor(() => { expect(screen.getByText(/Welcome back!/i)).toBeInTheDocument() }) diff --git a/grai-frontend/src/components/chat/ChatWindow.test.tsx b/grai-frontend/src/components/chat/ChatWindow.test.tsx index b4644d6f5..c21ef7d35 100644 --- a/grai-frontend/src/components/chat/ChatWindow.test.tsx +++ b/grai-frontend/src/components/chat/ChatWindow.test.tsx @@ -1,6 +1,6 @@ import React from "react" import userEvent from "@testing-library/user-event" -import { render, screen, waitFor } from "testing" +import { act, render, screen, waitFor } from "testing" import ChatWindow from "./ChatWindow" const handleInput = jest.fn() @@ -18,11 +18,11 @@ test("type", async () => { expect(screen.getByRole("textbox")).toBeInTheDocument() - user.type(screen.getByRole("textbox"), "Hello") + await act(async () => user.type(screen.getByRole("textbox"), "Hello")) await waitFor(() => expect(screen.getByRole("textbox")).toHaveValue("Hello")) - user.type(screen.getByRole("textbox"), "{enter}") + await act(async () => await user.type(screen.getByRole("textbox"), "{enter}")) await waitFor(() => expect(screen.getByRole("textbox")).toHaveValue("")) diff --git a/grai-frontend/src/components/edges/EdgeLineage.tsx b/grai-frontend/src/components/edges/EdgeLineage.tsx index 011b0b0e9..9ac5e9564 100644 --- a/grai-frontend/src/components/edges/EdgeLineage.tsx +++ b/grai-frontend/src/components/edges/EdgeLineage.tsx @@ -3,8 +3,7 @@ import { gql, useQuery } from "@apollo/client" import { Alert, Box } from "@mui/material" import useWorkspace from "helpers/useWorkspace" import GraphComponent from "components/graph/GraphComponent" -import useFilters from "components/graph/useFilters" -import useInlineFilters from "components/graph/useInlineFilters" +import useCombinedFilters from "components/graph/useCombinedFilters" import GraphError from "components/utils/GraphError" import { GetTablesAndEdgesEdgeLineage, @@ -65,8 +64,8 @@ type EdgeLineageProps = { const EdgeLineage: React.FC = ({ edge }) => { const [value, setValue] = useState(1) const { organisationName, workspaceName } = useWorkspace() - const { filters, setFilters } = useFilters(`edge-${edge.id}-graph-filters`) - const { inlineFilters, setInlineFilters } = useInlineFilters( + const { combinedFilters } = useCombinedFilters( + `edge-${edge.id}-graph-filters`, `edge-${edge.id}-graph-inline-filters`, ) @@ -106,10 +105,7 @@ const EdgeLineage: React.FC = ({ edge }) => { setValue, }, }} - filters={filters ?? []} - setFilters={setFilters} - inlineFilters={inlineFilters ?? []} - setInlineFilters={setInlineFilters} + combinedFilters={combinedFilters} /> ) diff --git a/grai-frontend/src/components/filters/FilterField.tsx b/grai-frontend/src/components/filters/FilterField.tsx index a69319fc1..5bcb920fb 100644 --- a/grai-frontend/src/components/filters/FilterField.tsx +++ b/grai-frontend/src/components/filters/FilterField.tsx @@ -11,15 +11,30 @@ interface FilterFieldProps extends Omit< AutocompleteProps, "renderInput" - > {} + > { + placeholder?: string + compact?: boolean +} -const FilterField = (props: FilterFieldProps) => ( +const FilterField = ({ + compact, + placeholder, + ...rest +}: FilterFieldProps) => ( } + renderInput={params => ( + + )} getOptionDisabled={option => option.disabled ?? false} + disablePortal={compact} /> ) diff --git a/grai-frontend/src/components/filters/FilterRow.tsx b/grai-frontend/src/components/filters/FilterRow.tsx index 26607f956..c2d12802a 100644 --- a/grai-frontend/src/components/filters/FilterRow.tsx +++ b/grai-frontend/src/components/filters/FilterRow.tsx @@ -1,6 +1,6 @@ import React from "react" import { Close } from "@mui/icons-material" -import { Grid, IconButton } from "@mui/material" +import { Box, Grid, IconButton } from "@mui/material" import FilterField from "./FilterField" import FilterRowValue from "./FilterRowValue" import { @@ -19,6 +19,7 @@ type FilterRowProps = { namespaces: string[] tags: string[] sources: Source[] + compact?: boolean } const FilterRow: React.FC = ({ @@ -28,6 +29,7 @@ const FilterRow: React.FC = ({ namespaces, tags, sources, + compact, }) => { const properties = getProperties(namespaces, tags, sources) @@ -53,50 +55,64 @@ const FilterRow: React.FC = ({ } return ( - - - - options={properties} - value={property} - onChange={(event, newValue) => - onChange({ ...filter, type: newValue?.value ?? null }) - } - data-testid="autocomplete-property" - /> + + + + + options={properties} + value={property} + onChange={(event, newValue) => + onChange({ ...filter, type: newValue?.value ?? null }) + } + compact={compact} + data-testid="autocomplete-property" + /> + + + + placeholder="Field" + disabled={!property} + options={property?.fields ?? []} + value={field} + onChange={handleFieldChange} + compact={compact} + data-testid="autocomplete-field" + /> + + + + placeholder="Operator" + disabled={!field} + options={field?.operators ?? []} + value={operator} + onChange={(event, newValue) => + onChange({ ...filter, operator: newValue?.value ?? null }) + } + compact={compact} + data-testid="autocomplete-operator" + /> + + + + - - - disabled={!property} - options={property?.fields ?? []} - value={field} - onChange={handleFieldChange} - data-testid="autocomplete-field" - /> - - - - disabled={!field} - options={field?.operators ?? []} - value={operator} - onChange={(event, newValue) => - onChange({ ...filter, operator: newValue?.value ?? null }) - } - data-testid="autocomplete-operator" - /> - - - - - - - - - - + + + + ) } diff --git a/grai-frontend/src/components/filters/FilterRowValue.tsx b/grai-frontend/src/components/filters/FilterRowValue.tsx index bb1e118e5..eec9dcd48 100644 --- a/grai-frontend/src/components/filters/FilterRowValue.tsx +++ b/grai-frontend/src/components/filters/FilterRowValue.tsx @@ -18,12 +18,14 @@ type FilterRowValueProps = { operator: Operator | null filter: Filter onChange: (filter: Filter) => void + compact?: boolean } const FilterRowValue: React.FC = ({ operator, filter, onChange, + compact, }) => { const handleValueChange = ( event: React.SyntheticEvent, @@ -55,6 +57,9 @@ const FilterRowValue: React.FC = ({ inputProps={{ "data-testid": "value", }} + size={compact ? "small" : undefined} + placeholder={compact ? "Value" : undefined} + sx={{ backgroundColor: "white" }} /> ) @@ -72,7 +77,13 @@ const FilterRowValue: React.FC = ({ ), )} onChange={handleValueChange} - renderInput={params => } + renderInput={params => ( + + )} renderOption={(props, option, { selected }) => (
  • = ({ {typeof option === "string" ? option : option?.label}
  • )} + size={compact ? "small" : undefined} + disablePortal={compact} data-testid="autocomplete-value" /> ) @@ -96,7 +109,15 @@ const FilterRowValue: React.FC = ({ options={operator.options} value={arrayFirst(filter.value)} onChange={handleValueChange} - renderInput={params => } + renderInput={params => ( + + )} + size={compact ? "small" : undefined} + disablePortal={compact} data-testid="autocomplete-value" /> ) diff --git a/grai-frontend/src/components/filters/FilterRows.tsx b/grai-frontend/src/components/filters/FilterRows.tsx index 47cb9165b..a300876bc 100644 --- a/grai-frontend/src/components/filters/FilterRows.tsx +++ b/grai-frontend/src/components/filters/FilterRows.tsx @@ -1,4 +1,5 @@ import React from "react" +import { Box } from "@mui/material" import FilterRowHeader from "components/filters/FilterRowHeader" import FilterRow from "./FilterRow" import { Filter, Source } from "./filters" @@ -9,6 +10,7 @@ type FilterRowsProps = { namespaces: string[] tags: string[] sources: Source[] + compact?: boolean } const FilterRows: React.FC = ({ @@ -17,6 +19,7 @@ const FilterRows: React.FC = ({ namespaces, tags, sources, + compact, }) => { const handleChangeFilters = (index: number) => (filter: Filter) => { const newFilters = [...filters] @@ -32,18 +35,21 @@ const FilterRows: React.FC = ({ return ( <> - - {filters.map((filter, index) => ( - - ))} + {compact !== true && } + + {filters.map((filter, index) => ( + + ))} + ) } diff --git a/grai-frontend/src/components/graph/BaseGraph.tsx b/grai-frontend/src/components/graph/BaseGraph.tsx index ea02272d1..4d1a13d2c 100644 --- a/grai-frontend/src/components/graph/BaseGraph.tsx +++ b/grai-frontend/src/components/graph/BaseGraph.tsx @@ -10,12 +10,11 @@ import ReactFlow, { Viewport, } from "reactflow" import "reactflow/dist/style.css" -import { Filter } from "components/filters/filters" import Loading from "components/layout/Loading" import BaseNode from "./BaseNode" -import { ControlOptions } from "./controls/GraphControls" -import GraphDrawer from "./drawer/GraphDrawer" +import GraphControls, { ControlOptions } from "./controls/GraphControls" import TestEdge from "./TestEdge" +import { CombinedFilters } from "./useCombinedFilters" const nodeTypes = { baseNode: BaseNode, @@ -66,10 +65,7 @@ type BaseGraphProps = { onMove?: (viewport: Viewport) => void onRefresh?: () => void refreshLoading?: boolean - filters: string[] - setFilters: (filters: string[]) => void - inlineFilters: Filter[] - setInlineFilters: (filters: Filter[]) => void + combinedFilters: CombinedFilters defaultViewport?: Viewport } @@ -86,10 +82,7 @@ const BaseGraph: React.FC = ({ onMove, onRefresh, refreshLoading, - filters, - setFilters, - inlineFilters, - setInlineFilters, + combinedFilters, defaultViewport, }) => { const [highlighted, setHighlighted] = useState([]) @@ -130,14 +123,15 @@ const BaseGraph: React.FC = ({ return ( - {/* */} + combinedFilters={combinedFilters} + /> = ({ defaultViewport={defaultViewport} /> {loading && } - - ) } diff --git a/grai-frontend/src/components/graph/GraphComponent.tsx b/grai-frontend/src/components/graph/GraphComponent.tsx index 60a22dd2f..7e5c633f6 100644 --- a/grai-frontend/src/components/graph/GraphComponent.tsx +++ b/grai-frontend/src/components/graph/GraphComponent.tsx @@ -3,7 +3,6 @@ import { gql, useLazyQuery } from "@apollo/client" import { Edge as RFEdge, Node as RFNode, Viewport } from "reactflow" import notEmpty from "helpers/notEmpty" import useWorkspace from "helpers/useWorkspace" -import { Filter } from "components/filters/filters" import { GetGraphLoadTable, GetGraphLoadTableVariables, @@ -11,6 +10,7 @@ import { import BaseGraph from "./BaseGraph" import { BaseNodeData } from "./BaseNode" import { ControlOptions } from "./controls/GraphControls" +import { CombinedFilters } from "./useCombinedFilters" export const GET_GRAPH_LOAD_TABLE = gql` query GetGraphLoadTable( @@ -96,10 +96,7 @@ type GraphComponentProps = { onMove?: (viewport: Viewport) => void onRefresh?: () => void refreshLoading?: boolean - filters: string[] - setFilters: (filters: string[]) => void - inlineFilters: Filter[] - setInlineFilters: (filters: Filter[]) => void + combinedFilters: CombinedFilters defaultViewport?: Viewport } @@ -115,10 +112,7 @@ const GraphComponent: React.FC = ({ onMove, onRefresh, refreshLoading, - filters, - setFilters, - inlineFilters, - setInlineFilters, + combinedFilters, defaultViewport, }) => { const { organisationName, workspaceName } = useWorkspace() @@ -405,10 +399,7 @@ const GraphComponent: React.FC = ({ onMove={onMove} onRefresh={onRefresh} refreshLoading={refreshLoading} - filters={filters} - setFilters={setFilters} - inlineFilters={inlineFilters} - setInlineFilters={setInlineFilters} + combinedFilters={combinedFilters} defaultViewport={defaultViewport} /> ) diff --git a/grai-frontend/src/components/graph/controls/FilterControl.test.tsx b/grai-frontend/src/components/graph/controls/FilterControl.test.tsx index 2c9bd55b5..0bd331e83 100644 --- a/grai-frontend/src/components/graph/controls/FilterControl.test.tsx +++ b/grai-frontend/src/components/graph/controls/FilterControl.test.tsx @@ -1,111 +1,76 @@ -import React from "react" import userEvent from "@testing-library/user-event" import { GraphQLError } from "graphql" -import { act, fireEvent, render, screen, waitFor, within } from "testing" +import { act } from "react-dom/test-utils" +import { render, screen, waitFor } from "testing" import FilterControl, { GET_FILTERS } from "./FilterControl" -test("renders", async () => { - render(, { - withRouter: true, - }) - - expect(screen.getByTestId("FilterAltIcon")).toBeInTheDocument() - - await waitFor(() => { - expect(screen.queryByRole("progressbar")).not.toBeInTheDocument() - }) -}) - -test("create", async () => { - render(, { - withRouter: true, - routes: ["/:organisationName/:workspaceName/filters/create"], - }) - - expect(screen.getByTestId("FilterAltIcon")).toBeInTheDocument() +const combinedFilters = { + filters: [], + setFilters: jest.fn(), + inlineFilters: [], + setInlineFilters: jest.fn(), +} - await waitFor(() => { - expect(screen.queryByRole("progressbar")).not.toBeInTheDocument() - }) - - const autocomplete = screen.getByTestId("filter-control") - autocomplete.focus() - const input = within(autocomplete).getByRole("combobox") - // the value here can be any string you want, so you may also consider to - // wrapper it as a function and pass in inputValue as parameter - fireEvent.change(input, { target: { value: "a" } }) - fireEvent.keyDown(autocomplete, { key: "ArrowDown" }) - fireEvent.keyDown(autocomplete, { key: "Enter" }) +test("renders no filters", async () => { + const mocks = [ + { + request: { + query: GET_FILTERS, + variables: { + organisationName: "", + workspaceName: "", + }, + }, + result: { + data: { + workspace: { + id: "test", + name: "test", + namespaces: { + data: [], + }, + tags: { + data: [], + }, + sources: { + data: [], + }, + filters: { + data: [], + }, + }, + }, + }, + }, + ] - await waitFor(() => { - expect(screen.getByText("New Page")).toBeInTheDocument() - }) -}) + const user = userEvent.setup() -test("manage", async () => { - render(, { + render(, { + mocks, withRouter: true, - routes: ["/:organisationName/:workspaceName/filters"], }) - expect(screen.getByTestId("FilterAltIcon")).toBeInTheDocument() - await waitFor(() => { - expect(screen.queryByRole("progressbar")).not.toBeInTheDocument() + expect(screen.getByText("Filters")).toBeInTheDocument() }) - const autocomplete = screen.getByTestId("filter-control") - autocomplete.focus() - const input = within(autocomplete).getByRole("combobox") - // the value here can be any string you want, so you may also consider to - // wrapper it as a function and pass in inputValue as parameter - fireEvent.change(input, { target: { value: "a" } }) - fireEvent.keyDown(autocomplete, { key: "ArrowDown" }) - fireEvent.keyDown(autocomplete, { key: "ArrowDown" }) - fireEvent.keyDown(autocomplete, { key: "Enter" }) - - await waitFor(() => { - expect(screen.getByText("New Page")).toBeInTheDocument() - }) -}) - -test("select filter", async () => { - const user = userEvent.setup() - - render(, { - withRouter: true, - routes: ["/:organisationName/:workspaceName/filters"], + await act(async () => { + user.click(screen.getByText("Filters")) }) - expect(screen.getByTestId("FilterAltIcon")).toBeInTheDocument() - await waitFor(() => { - expect(screen.queryByRole("progressbar")).not.toBeInTheDocument() + expect(screen.getByRole("button", { name: /add row/i })).toBeInTheDocument() }) - const autocomplete = screen.getByTestId("filter-control") - autocomplete.focus() - const input = within(autocomplete).getByRole("combobox") - // the value here can be any string you want, so you may also consider to - // wrapper it as a function and pass in inputValue as parameter - fireEvent.change(input, { target: { value: "a" } }) - fireEvent.keyDown(autocomplete, { key: "ArrowDown" }) - fireEvent.keyDown(autocomplete, { key: "ArrowDown" }) - fireEvent.keyDown(autocomplete, { key: "ArrowDown" }) - fireEvent.keyDown(autocomplete, { key: "Enter" }) - - // eslint-disable-next-line testing-library/no-wait-for-empty-callback - await waitFor(() => {}) - await act(async () => { - await user.click(screen.getByTestId("CloseIcon")) + user.click(screen.getByRole("button", { name: /cancel/i })) }) - // eslint-disable-next-line testing-library/no-wait-for-empty-callback - await waitFor(() => {}) + await screen.findByText(/saved filters/i) }) -test("empty", async () => { +test("renders filters", async () => { const mocks = [ { request: { @@ -118,35 +83,62 @@ test("empty", async () => { result: { data: { workspace: { - id: "1", - filters: { + id: "test", + name: "test", + namespaces: { data: [], }, tags: { data: [], }, + sources: { + data: [], + }, + filters: { + data: [ + { + id: "test", + name: "test", + }, + ], + }, }, }, }, }, ] - render(, { mocks, withRouter: true }) + const user = userEvent.setup() + + render(, { + mocks, + withRouter: true, + }) + + await waitFor(() => { + expect(screen.getByText("Filters")).toBeInTheDocument() + }) + + await act(async () => { + user.click(screen.getByText("Filters")) + }) await waitFor(() => { - expect(screen.queryByRole("progressbar")).not.toBeInTheDocument() + expect(screen.getByText(/saved filters/i)).toBeInTheDocument() + }) + + expect( + screen.getByRole("button", { name: /add new filter/i }), + ).toBeInTheDocument() + + await act(async () => { + user.click(screen.getByRole("button", { name: /add new filter/i })) }) - const autocomplete = screen.getByTestId("filter-control") - autocomplete.focus() - const input = within(autocomplete).getByRole("combobox") - // the value here can be any string you want, so you may also consider to - // wrapper it as a function and pass in inputValue as parameter - fireEvent.change(input, { target: { value: "a" } }) - fireEvent.keyDown(autocomplete, { key: "ArrowDown" }) + await screen.findByRole("button", { name: /add row/i }) }) -test("error", async () => { +test("errors", async () => { const mocks = [ { request: { @@ -162,7 +154,14 @@ test("error", async () => { }, ] - render(, { mocks, withRouter: true }) + render(, { + mocks, + withRouter: true, + }) + + await waitFor(() => { + expect(screen.getByText("Filters")).toBeInTheDocument() + }) await waitFor(() => { expect(screen.getByText("Error!")).toBeInTheDocument() diff --git a/grai-frontend/src/components/graph/controls/FilterControl.tsx b/grai-frontend/src/components/graph/controls/FilterControl.tsx index 54ec7a814..e5b951d0a 100644 --- a/grai-frontend/src/components/graph/controls/FilterControl.tsx +++ b/grai-frontend/src/components/graph/controls/FilterControl.tsx @@ -1,28 +1,31 @@ -import React from "react" +import React, { useEffect } from "react" import { gql, useQuery } from "@apollo/client" -import { Edit, FilterAlt } from "@mui/icons-material" -import { - Autocomplete, - CircularProgress, - Divider, - IconButton, - InputAdornment, - TextField, - createFilterOptions, -} from "@mui/material" -import { Link } from "react-router-dom" -import useSearchParams from "helpers/useSearchParams" +import { useSnackbar } from "notistack" import useWorkspace from "helpers/useWorkspace" -import GraphError from "components/utils/GraphError" import { GetFiltersControl, GetFiltersControlVariables, } from "./__generated__/GetFiltersControl" +import FilterMenu from "./filters/FilterMenu" +import { CombinedFilters } from "../useCombinedFilters" export const GET_FILTERS = gql` query GetFiltersControl($organisationName: String!, $workspaceName: String!) { workspace(organisationName: $organisationName, name: $workspaceName) { id + name + namespaces { + data + } + tags { + data + } + sources { + data { + id + name + } + } filters { data { id @@ -33,27 +36,29 @@ export const GET_FILTERS = gql` } ` +export type Values = { + namespaces: string[] + tags: string[] + sources: { + id: string + name: string + }[] +} + type Option = { value: string label: string | null } -type FilterOption = - | Option - | { - menuOption: string - label: string | null - } - | { - divider: boolean - } +type FilterControlProps = { + combinedFilters: CombinedFilters +} -const FilterControl: React.FC = () => { - const { organisationName, workspaceName, workspaceNavigate, routePrefix } = - useWorkspace() - const { searchParams, setSearchParam } = useSearchParams() +const FilterControl: React.FC = ({ combinedFilters }) => { + const { enqueueSnackbar } = useSnackbar() + const { organisationName, workspaceName } = useWorkspace() - const { loading, error, data } = useQuery< + const { error, data } = useQuery< GetFiltersControl, GetFiltersControlVariables >(GET_FILTERS, { @@ -63,6 +68,13 @@ const FilterControl: React.FC = () => { }, }) + useEffect(() => { + error && + enqueueSnackbar(error.message, { + variant: "error", + }) + }, [error, enqueueSnackbar]) + const options: Option[] = data?.workspace?.filters?.data .filter(filter => filter.name) @@ -71,122 +83,19 @@ const FilterControl: React.FC = () => { label: filter.name, })) || [] - const filterId = searchParams.get("filter") - - const value = options?.find(filter => filter.value === filterId) || null - - const handleChange = ( - event: React.SyntheticEvent, - newValue: FilterOption | null - ) => { - if (!newValue) { - setSearchParam("filter", null) - return - } - - if ("value" in newValue) { - setSearchParam("filter", newValue.value) - return - } - - if ("menuOption" in newValue) { - workspaceNavigate(newValue.menuOption) - return - } + const values: Values = { + namespaces: data?.workspace.namespaces.data || [], + tags: data?.workspace.tags.data || [], + sources: data?.workspace.sources.data || [], } - const filter = createFilterOptions() - return ( - <> - - options={options} - value={value} - onChange={handleChange} - size="small" - filterOptions={(options, params) => { - const filtered = filter(options, params) - - if (params.inputValue === "") { - if (filtered.length > 0) { - filtered.unshift({ - divider: true, - }) - } - - filtered.unshift( - { - menuOption: "filters/create", - label: "Create filter", - }, - { - menuOption: "filters", - label: "Manage filters", - } - ) - } - - return filtered - }} - getOptionLabel={option => ("label" in option && option.label) || ""} - renderOption={(props, option) => - "divider" in option ? ( - - ) : ( -
  • {option.label}
  • - ) - } - renderInput={params => ( - - - - ), - endAdornment: ( - <> - {loading && ( - - - - )} - {value && ( - - - - - - )} - {params.InputProps.endAdornment} - - ), - }} - /> - )} - data-testid="filter-control" - sx={{ - backgroundColor: "white", - width: 350, - "&.MuiAutocomplete-root:hover .hello": { - visibility: "visible", - }, - }} - /> - {error && } - + ) } diff --git a/grai-frontend/src/components/graph/controls/GraphControls.test.tsx b/grai-frontend/src/components/graph/controls/GraphControls.test.tsx index d9450fbdb..191fb992d 100644 --- a/grai-frontend/src/components/graph/controls/GraphControls.test.tsx +++ b/grai-frontend/src/components/graph/controls/GraphControls.test.tsx @@ -4,12 +4,27 @@ import { ReactFlowProvider } from "reactflow" import { act, render, screen, waitFor } from "testing" import GraphControls from "./GraphControls" +const combinedFilters = { + filters: [], + setFilters: jest.fn(), + inlineFilters: [], + setInlineFilters: jest.fn(), +} + const onSearch = jest.fn() test("renders", async () => { - render(, { - withRouter: true, - }) + render( + , + { + withRouter: true, + }, + ) expect(screen.getByTestId("SearchIcon")).toBeInTheDocument() expect(screen.queryByText("Limit Graph")).toBeFalsy() @@ -27,6 +42,7 @@ test("renders options", async () => { options={{ steps: { value: 1, setValue: (input: number) => {} } }} search={null} onSearch={onSearch} + combinedFilters={combinedFilters} /> , { @@ -40,7 +56,12 @@ test("renders errors", async () => { render( - + , { withRouter: true, diff --git a/grai-frontend/src/components/graph/controls/GraphControls.tsx b/grai-frontend/src/components/graph/controls/GraphControls.tsx index c5f4a1d22..b0fe7ad27 100644 --- a/grai-frontend/src/components/graph/controls/GraphControls.tsx +++ b/grai-frontend/src/components/graph/controls/GraphControls.tsx @@ -8,6 +8,7 @@ import LimitGraphControl from "./LimitGraphControl" import LoadMoreControl, { LoadMoreControlOptions } from "./LoadMoreControl" import SearchControl from "./SearchControl" import StepsControl, { StepsControlOptions } from "./StepsControl" +import { CombinedFilters } from "../useCombinedFilters" export type ControlOptions = { steps?: StepsControlOptions @@ -21,6 +22,7 @@ type GraphControlsProps = { onSearch: (input: string | null) => void onRefresh?: () => void loading?: boolean + combinedFilters: CombinedFilters } const GraphControls: React.FC = ({ @@ -30,6 +32,7 @@ const GraphControls: React.FC = ({ onSearch, onRefresh, loading, + combinedFilters, }) => { const { searchParams, setSearchParam } = useSearchParams() @@ -60,7 +63,7 @@ const GraphControls: React.FC = ({ )} {options?.steps && } - + {options?.loadMore && } diff --git a/grai-frontend/src/components/graph/controls/SearchControl.tsx b/grai-frontend/src/components/graph/controls/SearchControl.tsx index e6219a69d..eff130a99 100644 --- a/grai-frontend/src/components/graph/controls/SearchControl.tsx +++ b/grai-frontend/src/components/graph/controls/SearchControl.tsx @@ -24,18 +24,17 @@ const SearchControl: React.FC = ({ value, onChange }) => { "data-testid": "search-input", }} InputProps={{ - startAdornment: ( - - - - ), - endAdornment: value ? ( + endAdornment: ( - + {value ? ( + + ) : ( + + )} - ) : undefined, + ), }} - sx={{ backgroundColor: "white", width: 350 }} + sx={{ backgroundColor: "white", width: 240 }} /> ) diff --git a/grai-frontend/src/components/graph/controls/__generated__/GetFiltersControl.ts b/grai-frontend/src/components/graph/controls/__generated__/GetFiltersControl.ts index 1fe278620..9b991b339 100644 --- a/grai-frontend/src/components/graph/controls/__generated__/GetFiltersControl.ts +++ b/grai-frontend/src/components/graph/controls/__generated__/GetFiltersControl.ts @@ -7,6 +7,27 @@ // GraphQL query operation: GetFiltersControl // ==================================================== +export interface GetFiltersControl_workspace_namespaces { + __typename: "StrDataWrapper"; + data: string[]; +} + +export interface GetFiltersControl_workspace_tags { + __typename: "StrDataWrapper"; + data: string[]; +} + +export interface GetFiltersControl_workspace_sources_data { + __typename: "Source"; + id: any; + name: string; +} + +export interface GetFiltersControl_workspace_sources { + __typename: "SourcePagination"; + data: GetFiltersControl_workspace_sources_data[]; +} + export interface GetFiltersControl_workspace_filters_data { __typename: "Filter"; id: any; @@ -21,6 +42,10 @@ export interface GetFiltersControl_workspace_filters { export interface GetFiltersControl_workspace { __typename: "Workspace"; id: any; + name: string; + namespaces: GetFiltersControl_workspace_namespaces; + tags: GetFiltersControl_workspace_tags; + sources: GetFiltersControl_workspace_sources; filters: GetFiltersControl_workspace_filters; } diff --git a/grai-frontend/src/components/graph/controls/filters/AddFilter.tsx b/grai-frontend/src/components/graph/controls/filters/AddFilter.tsx new file mode 100644 index 000000000..9b957e021 --- /dev/null +++ b/grai-frontend/src/components/graph/controls/filters/AddFilter.tsx @@ -0,0 +1,61 @@ +import React from "react" +import { Add } from "@mui/icons-material" +import { Box, Button, Divider } from "@mui/material" +import FilterRows from "components/filters/FilterRows" +import { Filter } from "components/filters/filters" +import FilterSave from "./FilterSave" +import { Values } from "../FilterControl" + +type AddFilterProps = { + onClose?: () => void + inlineFilters: Filter[] + setInlineFilters: (filters: Filter[]) => void + values: Values + workspaceId: string +} + +const AddFilter: React.FC = React.forwardRef( + ({ onClose, inlineFilters, setInlineFilters, values, workspaceId }, ref) => { + const handleChange = (filters: Filter[]) => setInlineFilters(filters) + const handleAdd = () => + setInlineFilters([ + ...inlineFilters, + { type: "table", field: null, operator: null, value: null }, + ]) + + return ( + + + + + + + + + + + + + ) + }, +) + +export default AddFilter diff --git a/grai-frontend/src/components/graph/controls/filters/FilterAutocomplete.test.tsx b/grai-frontend/src/components/graph/controls/filters/FilterAutocomplete.test.tsx new file mode 100644 index 000000000..c1965a103 --- /dev/null +++ b/grai-frontend/src/components/graph/controls/filters/FilterAutocomplete.test.tsx @@ -0,0 +1,78 @@ +import userEvent from "@testing-library/user-event" +import { act, render, screen } from "testing" +import FilterAutocomplete from "./FilterAutocomplete" + +const setFilters = jest.fn() + +test("renders empty", async () => { + render( + , + ) + + expect(screen.getByText(/No filters found/i)).toBeInTheDocument() +}) + +test("select", async () => { + const user = userEvent.setup() + + render( + , + ) + + expect(screen.getByText(/filter1/i)).toBeInTheDocument() + + await act(async () => await user.click(screen.getByText(/filter1/i))) + + expect(setFilters).toHaveBeenCalledWith(["filter1"]) +}) + +test("escape", async () => { + const user = userEvent.setup() + const onClose = jest.fn() + + render( + , + ) + + await act(async () => await user.keyboard("{Escape}")) + + expect(onClose).toHaveBeenCalled() +}) + +test("escape no onClose", async () => { + const user = userEvent.setup() + + render( + , + ) + + await act(async () => await user.keyboard("{Escape}")) +}) diff --git a/grai-frontend/src/components/graph/controls/filters/FilterAutocomplete.tsx b/grai-frontend/src/components/graph/controls/filters/FilterAutocomplete.tsx new file mode 100644 index 000000000..ec3d687f2 --- /dev/null +++ b/grai-frontend/src/components/graph/controls/filters/FilterAutocomplete.tsx @@ -0,0 +1,133 @@ +import React from "react" +import { CheckBox, CheckBoxOutlineBlank } from "@mui/icons-material" +import { + Autocomplete, + AutocompleteCloseReason, + Checkbox, + InputBase, + autocompleteClasses, + styled, +} from "@mui/material" + +interface PopperComponentProps { + anchorEl?: any + disablePortal?: boolean + open: boolean +} + +const StyledInput = styled(InputBase)(({ theme }) => ({ + padding: 10, + paddingLeft: "16px", + paddingRight: "16px", + width: "100%", + "& input": { + borderRadius: 4, + backgroundColor: "#fff", + padding: 8, + transition: theme.transitions.create(["border-color", "box-shadow"]), + border: "1px solid #eaecef", + fontSize: 14, + "&:focus": { + boxShadow: "0px 0px 0px 3px rgba(3, 102, 214, 0.3)", + borderColor: "#0366d6", + }, + }, +})) + +function PopperComponent(props: PopperComponentProps) { + const { disablePortal, anchorEl, open, ...other } = props + return +} + +const StyledAutocompletePopper = styled("div")(({ theme }) => ({ + [`& .${autocompleteClasses.paper}`]: { + boxShadow: "none", + margin: 0, + color: "inherit", + fontSize: 13, + }, + [`& .${autocompleteClasses.listbox}`]: { + backgroundColor: "#fff", + padding: "16px", + paddingTop: 0, + paddingBottom: 0, + [`& .${autocompleteClasses.option}`]: { + padding: 2, + borderBottom: "1px solid #eaecef", + '&[aria-selected="true"]': { + backgroundColor: "transparent", + }, + [`&.${autocompleteClasses.focused}, &.${autocompleteClasses.focused}[aria-selected="true"]`]: + { + backgroundColor: theme.palette.action.hover, + }, + }, + }, + [`&.${autocompleteClasses.popperDisablePortal}`]: { + position: "relative", + }, +})) + +const icon = +const checkedIcon = + +export type Option = { + value: string + label: string | null +} + +type FilterAutocompleteProps = { + options: Option[] + onClose?: () => void + filters: string[] + setFilters: (filters: string[]) => void +} + +const FilterAutocomplete: React.FC = ({ + options, + onClose, + filters, + setFilters, +}) => { + const value = options.filter(option => filters.includes(option.value)) + + return ( + + open + multiple + onClose={( + event: React.ChangeEvent<{}>, + reason: AutocompleteCloseReason, + ) => { + if (reason === "escape") { + onClose && onClose() + } + }} + value={value} + onChange={(event, newValue, reason) => + setFilters(newValue.map(option => option.value)) + } + disableCloseOnSelect + PopperComponent={PopperComponent} + noOptionsText="No filters found" + options={options} + getOptionLabel={option => option.label || option.value} + renderOption={(props, option, { selected }) => ( +
  • + + {option.label} +
  • + )} + renderInput={params => ( + + )} + /> + ) +} + +export default FilterAutocomplete diff --git a/grai-frontend/src/components/graph/controls/filters/FilterButton.tsx b/grai-frontend/src/components/graph/controls/filters/FilterButton.tsx new file mode 100644 index 000000000..69afaff34 --- /dev/null +++ b/grai-frontend/src/components/graph/controls/filters/FilterButton.tsx @@ -0,0 +1,84 @@ +import React from "react" +import { FilterAlt } from "@mui/icons-material" +import { Box, Button, Chip, Stack, Typography } from "@mui/material" +import { Filter } from "components/filters/filters" +import { CombinedFilters } from "components/graph/useCombinedFilters" +import { Option } from "./FilterAutocomplete" + +const inlineFilterLabel = (filter: Filter) => + [filter.field, filter.operator, filter.value].join(" ") + +const filterNotEmpty = (filter: Filter) => + filter.field && filter.operator && filter.value + +type FilterButtonProps = { + options: Option[] + combinedFilters: CombinedFilters + onClick?: (event: React.MouseEvent) => void +} + +const FilterButton: React.FC = ({ + options, + combinedFilters, + onClick, +}) => { + const selectedFilters = options.filter( + option => combinedFilters.filters?.includes(option.value), + ) + + const handleRemoveFilter = (filter: string) => + combinedFilters.setFilters( + combinedFilters.filters?.filter(f => f !== filter) ?? [], + ) + + const onRemoveInlineFilter = (index: number) => + combinedFilters.setInlineFilters( + combinedFilters.inlineFilters?.filter((_, i) => i !== index) ?? [], + ) + + return ( + + ) +} + +export default FilterButton diff --git a/grai-frontend/src/components/graph/controls/filters/FilterContent.tsx b/grai-frontend/src/components/graph/controls/filters/FilterContent.tsx new file mode 100644 index 000000000..7d8898c65 --- /dev/null +++ b/grai-frontend/src/components/graph/controls/filters/FilterContent.tsx @@ -0,0 +1,45 @@ +import React, { useState } from "react" +import { Box } from "@mui/material" +import { CombinedFilters } from "components/graph/useCombinedFilters" +import AddFilter from "./AddFilter" +import { Option } from "./FilterAutocomplete" +import SavedFilters from "./SavedFilters" +import { Values } from "../FilterControl" + +type FilterContentProps = { + options: Option[] + onClose?: () => void + combinedFilters: CombinedFilters + values: Values + workspaceId: string +} + +const FilterContent: React.FC = React.forwardRef( + ({ options, onClose, combinedFilters, values, workspaceId }, ref) => { + const [add, setAdd] = useState(options.length === 0) + + return ( + + {add ? ( + setAdd(false)} + inlineFilters={combinedFilters.inlineFilters ?? []} + setInlineFilters={combinedFilters.setInlineFilters} + values={values} + workspaceId={workspaceId} + /> + ) : ( + setAdd(true)} + filters={combinedFilters.filters ?? []} + setFilters={combinedFilters.setFilters} + /> + )}{" "} + + ) + }, +) + +export default FilterContent diff --git a/grai-frontend/src/components/graph/controls/filters/FilterMenu.test.tsx b/grai-frontend/src/components/graph/controls/filters/FilterMenu.test.tsx new file mode 100644 index 000000000..a8cfbf21d --- /dev/null +++ b/grai-frontend/src/components/graph/controls/filters/FilterMenu.test.tsx @@ -0,0 +1,113 @@ +import userEvent from "@testing-library/user-event" +import { act, render, screen } from "testing" +import FilterMenu from "./FilterMenu" + +const combinedFilters = { + filters: [], + setFilters: jest.fn(), + inlineFilters: [], + setInlineFilters: jest.fn(), +} + +const defaultProps = { + workspaceId: "1", + options: [ + { + value: "1", + label: "Test Filter", + }, + ], + values: { + namespaces: [], + tags: [], + sources: [], + }, + combinedFilters, +} + +test("renders", async () => { + render(, { withRouter: true }) + + expect(screen.getByText("Filters")).toBeInTheDocument() +}) + +test("renders filter chips", async () => { + const user = userEvent.setup() + + const combinedFilters = { + filters: ["1"], + setFilters: jest.fn(), + inlineFilters: [], + setInlineFilters: jest.fn(), + } + + render(, { + withRouter: true, + }) + + expect(screen.getByText("Filters")).toBeInTheDocument() + expect(screen.getByText("Test Filter")).toBeInTheDocument() + + await act(async () => await user.click(screen.getByTestId("CancelIcon"))) + + expect(combinedFilters.setFilters).toHaveBeenCalledWith([]) +}) + +test("renders inlineFilter chips", async () => { + const user = userEvent.setup() + + const combinedFilters = { + filters: [], + setFilters: jest.fn(), + inlineFilters: [ + { + type: "table", + field: "name", + operator: "equals", + value: "test", + }, + ], + setInlineFilters: jest.fn(), + } + + render(, { + withRouter: true, + }) + + expect(screen.getByText("Filters")).toBeInTheDocument() + expect(screen.getByText("name equals test")).toBeInTheDocument() + + await act(async () => await user.click(screen.getByTestId("CancelIcon"))) + + expect(combinedFilters.setInlineFilters).toHaveBeenCalledWith([]) +}) + +test("select", async () => { + render(, { withRouter: true }) + + expect(screen.getByText("Filters")).toBeInTheDocument() + + await act(async () => await userEvent.click(screen.getByText("Filters"))) + + expect(screen.getByText(/saved filters/i)).toBeInTheDocument() + + await act(async () => await userEvent.click(screen.getByText("Test Filter"))) + + expect(combinedFilters.setFilters).toHaveBeenCalledWith(["1"]) +}) + +test("close", async () => { + const user = userEvent.setup() + + render(, { withRouter: true }) + + expect(screen.getByText("Filters")).toBeInTheDocument() + + await act(async () => await user.click(screen.getByText("Filters"))) + + expect(screen.getByText(/saved filters/i)).toBeInTheDocument() + + await act(async () => await user.keyboard("{Escape}")) + + expect(screen.queryByText(/saved filters/i)).not.toBeInTheDocument() +}) diff --git a/grai-frontend/src/components/graph/controls/filters/FilterMenu.tsx b/grai-frontend/src/components/graph/controls/filters/FilterMenu.tsx new file mode 100644 index 000000000..642eb37af --- /dev/null +++ b/grai-frontend/src/components/graph/controls/filters/FilterMenu.tsx @@ -0,0 +1,83 @@ +import React, { useState } from "react" +import { ClickAwayListener, Popper, styled } from "@mui/material" +import { CombinedFilters } from "components/graph/useCombinedFilters" +import { Option } from "./FilterAutocomplete" +import FilterButton from "./FilterButton" +import FilterContent from "./FilterContent" +import { Values } from "../FilterControl" + +const StyledPopper = styled(Popper)(({ theme }) => ({ + border: "1px solid #e1e4e8", + boxShadow: "0 8px 24px rgba(149, 157, 165, 0.2)", + borderRadius: 6, + zIndex: theme.zIndex.modal, + fontSize: 13, + color: "#24292e", + backgroundColor: "#fff", +})) + +type FilterMenuProps = { + options: Option[] + combinedFilters: CombinedFilters + values: Values + workspaceId: string +} + +const FilterMenu: React.FC = ({ + options, + combinedFilters, + values, + workspaceId, +}) => { + const [anchorEl, setAnchorEl] = useState(null) + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget) + } + + const handleClose = () => { + if (anchorEl) { + anchorEl.focus() + } + setAnchorEl(null) + } + + const open = Boolean(anchorEl) + const id = open ? "github-label" : undefined + + return ( + <> + + + + + + + + ) +} + +export default FilterMenu diff --git a/grai-frontend/src/components/graph/controls/filters/FilterSave.test.tsx b/grai-frontend/src/components/graph/controls/filters/FilterSave.test.tsx new file mode 100644 index 000000000..97455066d --- /dev/null +++ b/grai-frontend/src/components/graph/controls/filters/FilterSave.test.tsx @@ -0,0 +1,100 @@ +import userEvent from "@testing-library/user-event" +import { GraphQLError } from "graphql" +import { act, render, screen, waitFor } from "testing" +import FilterSave, { CREATE_FILTER } from "./FilterSave" + +test("renders empty", async () => { + render() + + expect( + screen.getByRole("button", { name: /save filter/i }), + ).toBeInTheDocument() +}) + +test("save", async () => { + const user = userEvent.setup() + + const inlineFilters = [ + { + type: null, + field: null, + operator: null, + value: null, + }, + ] + + render() + + expect( + screen.getByRole("button", { name: /save filter/i }), + ).toBeInTheDocument() + + await act( + async () => + await user.click(screen.getByRole("button", { name: /save filter/i })), + ) + + await screen.findByRole("textbox") + + await act(async () => await user.type(screen.getByRole("textbox"), "test")) + + await act( + async () => await user.click(screen.getByRole("button", { name: /save/i })), + ) + + await screen.findByText("Filter created") +}) + +test("error", async () => { + const mocks = [ + { + request: { + query: CREATE_FILTER, + variables: { + workspaceId: "1", + metadata: [{ type: null, field: null, operator: null, value: null }], + name: "test", + }, + }, + result: { + errors: [new GraphQLError("Error!")], + }, + }, + ] + + const user = userEvent.setup() + + const inlineFilters = [ + { + type: null, + field: null, + operator: null, + value: null, + }, + ] + + render(, { + mocks, + }) + + expect( + screen.getByRole("button", { name: /save filter/i }), + ).toBeInTheDocument() + + await act( + async () => + await user.click(screen.getByRole("button", { name: /save filter/i })), + ) + + await screen.findByRole("textbox") + + await act(async () => await user.type(screen.getByRole("textbox"), "test")) + + await act( + async () => await user.click(screen.getByRole("button", { name: /save/i })), + ) + + await waitFor(() => { + expect(screen.getByText("Error!")).toBeInTheDocument() + }) +}) diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/SaveDialog.tsx b/grai-frontend/src/components/graph/controls/filters/FilterSave.tsx similarity index 57% rename from grai-frontend/src/components/graph/drawer/filters-inline/SaveDialog.tsx rename to grai-frontend/src/components/graph/controls/filters/FilterSave.tsx index 9e52d9b99..27d9c8910 100644 --- a/grai-frontend/src/components/graph/drawer/filters-inline/SaveDialog.tsx +++ b/grai-frontend/src/components/graph/controls/filters/FilterSave.tsx @@ -1,16 +1,16 @@ -import React from "react" +import React, { useState } from "react" import { gql, useMutation } from "@apollo/client" -import { Dialog, DialogContent } from "@mui/material" +import { LoadingButton } from "@mui/lab" +import { Button, TextField } from "@mui/material" import { useSnackbar } from "notistack" -import DialogTitle from "components/dialogs/DialogTitle" -import { NewFilter } from "components/filters/__generated__/NewFilter" import { Filter } from "components/filters/filters" +import Form from "components/form/Form" import GraphError from "components/utils/GraphError" import { CreateFilterInline, CreateFilterInlineVariables, } from "./__generated__/CreateFilterInline" -import CreateFilterForm, { Values } from "./CreateFilterForm" +import { NewFilter } from "./__generated__/NewFilter" export const CREATE_FILTER = gql` mutation CreateFilterInline( @@ -27,19 +27,23 @@ export const CREATE_FILTER = gql` } ` -type SaveDialogProps = { +type Values = { + name: string +} + +type FilterSaveProps = { workspaceId: string inlineFilters: Filter[] - open: boolean - onClose: () => void } -const SaveDialog: React.FC = ({ +const FilterSave: React.FC = ({ workspaceId, inlineFilters, - open, - onClose, }) => { + const [expanded, setExpanded] = useState(false) + const [values, setValues] = useState({ + name: "", + }) const { enqueueSnackbar } = useSnackbar() /* istanbul ignore next */ @@ -81,23 +85,55 @@ const SaveDialog: React.FC = ({ }, }) - const handleSave = (values: Values) => + const handleSubmit = () => createFilter({ variables: { workspaceId, metadata: inlineFilters, ...values }, }) .then(() => enqueueSnackbar("Filter created", { variant: "success" })) - .then(onClose) .catch(() => {}) - return ( - - Save Filter - + if (expanded) + return ( +
    + setValues({ ...values, name: e.target.value })} + InputProps={{ + sx: { borderRadius: "4px 0px 0px 4px", ml: 2 }, + }} + inputRef={input => input && input.focus()} + required + /> + + Save + {error && } - - -
    + + ) + + const handleClick = () => setExpanded(true) + + return ( + ) } -export default SaveDialog +export default FilterSave diff --git a/grai-frontend/src/components/graph/controls/filters/SavedFilters.tsx b/grai-frontend/src/components/graph/controls/filters/SavedFilters.tsx new file mode 100644 index 000000000..171048a28 --- /dev/null +++ b/grai-frontend/src/components/graph/controls/filters/SavedFilters.tsx @@ -0,0 +1,65 @@ +import React from "react" +import { Add } from "@mui/icons-material" +import { Box, Button, Typography } from "@mui/material" +import { Link } from "react-router-dom" +import useWorkspace from "helpers/useWorkspace" +import FilterAutocomplete, { Option } from "./FilterAutocomplete" + +type SavedFiltersProps = { + options: Option[] + onClose?: () => void + onAdd?: () => void + filters: string[] + setFilters: (filters: string[]) => void +} + +const SavedFilters: React.FC = React.forwardRef( + ({ options, onClose, onAdd, filters, setFilters }, ref) => { + const { routePrefix } = useWorkspace() + + return ( + + + + + Saved Filters + + + + + + + + + + ) + }, +) + +export default SavedFilters diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/__generated__/CreateFilterInline.ts b/grai-frontend/src/components/graph/controls/filters/__generated__/CreateFilterInline.ts similarity index 100% rename from grai-frontend/src/components/graph/drawer/filters-inline/__generated__/CreateFilterInline.ts rename to grai-frontend/src/components/graph/controls/filters/__generated__/CreateFilterInline.ts diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/__generated__/NewFilter.ts b/grai-frontend/src/components/graph/controls/filters/__generated__/NewFilter.ts similarity index 100% rename from grai-frontend/src/components/graph/drawer/filters-inline/__generated__/NewFilter.ts rename to grai-frontend/src/components/graph/controls/filters/__generated__/NewFilter.ts diff --git a/grai-frontend/src/components/graph/drawer/GraphDrawer.test.tsx b/grai-frontend/src/components/graph/drawer/GraphDrawer.test.tsx deleted file mode 100644 index 7f23b2de6..000000000 --- a/grai-frontend/src/components/graph/drawer/GraphDrawer.test.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import userEvent from "@testing-library/user-event" -import { ReactFlowProvider } from "reactflow" -import { act, render, screen, waitFor } from "testing" -import GraphDrawer from "./GraphDrawer" - -const defaultProps = { - search: "", - onSearch: () => {}, - filters: [], - setFilters: () => {}, - inlineFilters: [], - setInlineFilters: () => {}, -} - -test("renders", async () => { - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByTestId("KeyboardArrowLeftIcon")).toBeInTheDocument() - }) -}) - -test("expand", async () => { - const user = userEvent.setup() - - render( - - - , - { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }, - ) - - await waitFor(() => { - expect(screen.getByTestId("KeyboardArrowLeftIcon")).toBeInTheDocument() - }) - - await act(async () => { - await user.click(screen.getByTestId("KeyboardArrowLeftIcon")) - }) - - await waitFor(() => { - expect(screen.getByTestId("KeyboardArrowRightIcon")).toBeInTheDocument() - }) - - await act(async () => { - await user.click(screen.getByTestId("KeyboardArrowRightIcon")) - }) -}) - -test("filter", async () => { - const user = userEvent.setup() - - render( - - - , - { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }, - ) - - await waitFor(() => { - expect(screen.getByTestId("FilterAltIcon")).toBeInTheDocument() - }) - - await act(async () => { - await user.click(screen.getByTestId("FilterAltIcon")) - }) -}) - -test("filter-list", async () => { - const user = userEvent.setup() - - render( - - - , - { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }, - ) - - await waitFor(() => { - expect(screen.getByTestId("FilterListIcon")).toBeInTheDocument() - }) - - await act(async () => { - await user.click(screen.getByTestId("FilterListIcon")) - }) -}) - -test("filter-list expanded", async () => { - const user = userEvent.setup() - - render( - - - , - { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }, - ) - - await waitFor(() => { - expect(screen.getByTestId("KeyboardArrowRightIcon")).toBeInTheDocument() - }) - - await act(async () => { - await user.click(screen.getByTestId("KeyboardArrowRightIcon")) - }) - - await waitFor(() => { - expect(screen.getByTestId("FilterListIcon")).toBeInTheDocument() - }) - - await act(async () => { - await user.click(screen.getByTestId("FilterListIcon")) - }) -}) diff --git a/grai-frontend/src/components/graph/drawer/GraphDrawer.tsx b/grai-frontend/src/components/graph/drawer/GraphDrawer.tsx deleted file mode 100644 index b384c6192..000000000 --- a/grai-frontend/src/components/graph/drawer/GraphDrawer.tsx +++ /dev/null @@ -1,281 +0,0 @@ -import React from "react" -import { - FilterAlt, - FilterList, - KeyboardArrowLeft, - KeyboardArrowRight, - Refresh, - Search, -} from "@mui/icons-material" -import { TabContext, TabList, TabPanel } from "@mui/lab" -import { - Box, - CircularProgress, - Drawer, - List, - ListItem, - ListItemButton, - ListItemIcon, - ListItemText, - Tab, - Tooltip, -} from "@mui/material" -import { Viewport } from "reactflow" -import useLocalState from "helpers/useLocalState" -import { Filter } from "components/filters/filters" -import GraphFilterInline from "./filters-inline/GraphFilterInline" -import GraphFilters from "./GraphFilters" -import GraphSearch from "./GraphSearch" - -type GraphDrawerProps = { - search: string - onSearch: (search: string | null) => void - loading?: boolean - onRefresh?: () => void - onMove?: (viewport: Viewport) => void - filters: string[] - setFilters: (filters: string[]) => void - inlineFilters: Filter[] - setInlineFilters: (filters: Filter[]) => void -} - -const GraphDrawer: React.FC = ({ - search, - onSearch, - loading, - onRefresh, - onMove, - filters, - setFilters, - inlineFilters, - setInlineFilters, -}) => { - const [tab, setTab] = useLocalState("graph-drawer", null) - - const expand = tab !== null - - const drawerWidth = expand ? 350 : 48 - - return ( - - {expand ? ( - - - - value !== "refresh" && setTab(value)} - > - - {loading ? : } - - } - sx={{ minWidth: 0 }} - /> - - - - } - sx={{ minWidth: 0 }} - className="graph-search" - /> - - - - } - sx={{ minWidth: 0 }} - className="graph-filter" - /> - - - - } - sx={{ minWidth: 0 }} - className="graph-filter-list" - /> - - - - - - - - - - - - - - ) : ( - - - - - - {loading ? : } - - - - - - - setTab("search")} - sx={{ - minHeight: 48, - justifyContent: "center", - px: 2.5, - }} - > - - - - - - - - - setTab("filter")} - sx={{ - minHeight: 48, - justifyContent: "center", - px: 2.5, - }} - > - - - - - - - - - setTab("filter-list")} - sx={{ - minHeight: 48, - justifyContent: "center", - px: 2.5, - }} - > - - - - - - - - )} - - {expand ? ( - - setTab(null)}> - - - - - - - - - ) : ( - - setTab("search")} - sx={{ - minHeight: 48, - justifyContent: "center", - px: 2.5, - }} - > - - - - - - )} - - - ) -} - -export default GraphDrawer diff --git a/grai-frontend/src/components/graph/drawer/GraphFilter.test.tsx b/grai-frontend/src/components/graph/drawer/GraphFilter.test.tsx deleted file mode 100644 index e60e9d55c..000000000 --- a/grai-frontend/src/components/graph/drawer/GraphFilter.test.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import userEvent from "@testing-library/user-event" -import { act } from "react-dom/test-utils" -import { fireEvent, render, screen, waitFor } from "testing" -import GraphFilter from "./GraphFilter" -import useFilters from "../useFilters" - -const setFilters = jest.fn() - -const filter = { - id: "1", - name: "test", - display_name: "test", -} - -test("renders", async () => { - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByText("test")).toBeInTheDocument() - }) -}) - -test("click", async () => { - const user = userEvent.setup() - - const GraphWrapper: React.FC = () => { - const { filters, setFilters } = useFilters() - - return ( - - ) - } - - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByText("test")).toBeInTheDocument() - }) - - await act(async () => { - await user.click(screen.getByText("test")) - }) - - await act(async () => { - await user.click(screen.getByText("test")) - }) -}) - -test("hover", async () => { - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByText("test")).toBeInTheDocument() - }) - - fireEvent.mouseEnter(screen.getByText("test")) - - await waitFor(() => { - expect(screen.getByTestId("EditIcon")).toBeInTheDocument() - }) - - fireEvent.mouseLeave(screen.getByText("test")) -}) diff --git a/grai-frontend/src/components/graph/drawer/GraphFilter.tsx b/grai-frontend/src/components/graph/drawer/GraphFilter.tsx deleted file mode 100644 index a141235c1..000000000 --- a/grai-frontend/src/components/graph/drawer/GraphFilter.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import React, { useState } from "react" -import { Edit } from "@mui/icons-material" -import { - Button, - Checkbox, - IconButton, - ListItem, - ListItemButton, - ListItemIcon, - ListItemText, - Stack, - Tooltip, - Typography, -} from "@mui/material" -import { Link } from "react-router-dom" -import useWorkspace from "helpers/useWorkspace" - -interface Filter { - id: string - name: string | null -} - -type GraphFilterProps = { - filter: Filter - filters: string[] - setFilters: (filters: string[]) => void -} - -const GraphFilter: React.FC = ({ - filter, - filters, - setFilters, -}) => { - const [hover, setHover] = useState(false) - const { routePrefix } = useWorkspace() - - const checked = filters.includes(filter.id) - - const handleToggle = () => - setFilters( - checked ? filters.filter(f => f !== filter.id) : [...filters, filter.id], - ) - - const handleOnly = () => setFilters([filter.id]) - - return ( - - - - - - - - - - - ) - } - disablePadding - onMouseEnter={() => setHover(true)} - onMouseLeave={() => setHover(false)} - > - - - - - - {filter.name} - - } - /> - - - ) -} - -export default GraphFilter diff --git a/grai-frontend/src/components/graph/drawer/GraphFilters.test.tsx b/grai-frontend/src/components/graph/drawer/GraphFilters.test.tsx deleted file mode 100644 index 084c0b406..000000000 --- a/grai-frontend/src/components/graph/drawer/GraphFilters.test.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import userEvent from "@testing-library/user-event" -import { GraphQLError } from "graphql" -import { act } from "react-dom/test-utils" -import { render, screen, waitFor } from "testing" -import GraphFilters, { GET_FILTERS } from "./GraphFilters" - -const setFilters = jest.fn() - -test("renders", async () => { - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByTestId("search-input")).toBeInTheDocument() - }) -}) - -test("search", async () => { - const user = userEvent.setup() - - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByTestId("search-input")).toBeInTheDocument() - }) - - await act(async () => { - await user.type(screen.getByTestId("search-input"), "test") - }) - - await waitFor(() => { - expect(screen.getByTestId("CloseIcon")).toBeInTheDocument() - }) - - await act(async () => { - await user.click(screen.getByTestId("CloseIcon")) - }) -}) - -test("errors", async () => { - const user = userEvent.setup() - - const mocks = [ - { - request: { - query: GET_FILTERS, - variables: { - organisationName: "default", - workspaceName: "demo", - search: "", - }, - }, - result: { - data: { - workspace: { - id: "1", - filters: { - data: [], - }, - }, - }, - }, - }, - { - request: { - query: GET_FILTERS, - variables: { - organisationName: "default", - workspaceName: "demo", - search: "t", - }, - }, - result: { errors: [new GraphQLError("Error!")] }, - }, - ] - - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - mocks, - }) - - await waitFor(() => { - expect(screen.getByTestId("search-input")).toBeInTheDocument() - }) - - await act(async () => { - await user.type(screen.getByTestId("search-input"), "t") - }) - - await waitFor(() => { - expect(screen.getByText("Error!")).toBeInTheDocument() - }) -}) diff --git a/grai-frontend/src/components/graph/drawer/GraphFilters.tsx b/grai-frontend/src/components/graph/drawer/GraphFilters.tsx deleted file mode 100644 index 574ca5096..000000000 --- a/grai-frontend/src/components/graph/drawer/GraphFilters.tsx +++ /dev/null @@ -1,153 +0,0 @@ -import React, { useState } from "react" -import { gql, useQuery } from "@apollo/client" -import { Add, Close } from "@mui/icons-material" -import { - Box, - Button, - Grid, - InputAdornment, - List, - ListItem, - TextField, - Tooltip, -} from "@mui/material" -import { Link } from "react-router-dom" -import useWorkspace from "helpers/useWorkspace" -import Loading from "components/layout/Loading" -import GraphError from "components/utils/GraphError" -import { - GetFiltersDrawer, - GetFiltersDrawerVariables, -} from "./__generated__/GetFiltersDrawer" -import GraphFilter from "./GraphFilter" - -export const GET_FILTERS = gql` - query GetFiltersDrawer( - $organisationName: String! - $workspaceName: String! - $search: String - ) { - workspace(organisationName: $organisationName, name: $workspaceName) { - id - filters(search: $search) { - data { - id - name - } - } - } - } -` - -type GraphFiltersProps = { - filters: string[] - setFilters: (filters: string[]) => void -} - -const GraphFilters: React.FC = ({ filters, setFilters }) => { - const [search, setSearch] = useState("") - const { organisationName, workspaceName, routePrefix } = useWorkspace() - - const { loading, error, data } = useQuery< - GetFiltersDrawer, - GetFiltersDrawerVariables - >(GET_FILTERS, { - variables: { - organisationName, - workspaceName, - search, - }, - context: { - debounceKey: "filters", - debounceTimeout: 1000, - }, - }) - - if (error) return - - return ( - - - setSearch(event.target.value)} - InputProps={{ - endAdornment: search !== "" && ( - - - setSearch("")} - sx={{ color: "divider", cursor: "pointer" }} - /> - - - ), - }} - inputProps={{ - "data-testid": "search-input", - }} - /> - - {loading && } - theme.palette.grey[200], - borderStyle: "solid", - }} - > - theme.palette.grey[200], - borderStyle: "solid", - }} - > - - - - - - - - - - {data?.workspace.filters.data.map(filter => ( - - ))} - - - ) -} - -export default GraphFilters diff --git a/grai-frontend/src/components/graph/drawer/GraphSearch.test.tsx b/grai-frontend/src/components/graph/drawer/GraphSearch.test.tsx deleted file mode 100644 index d4dd3a607..000000000 --- a/grai-frontend/src/components/graph/drawer/GraphSearch.test.tsx +++ /dev/null @@ -1,191 +0,0 @@ -import userEvent from "@testing-library/user-event" -import { GraphQLError } from "graphql" -import { ReactFlowProvider } from "reactflow" -import { act, render, screen, waitFor } from "testing" -import { searchMock } from "pages/Graph.test" -import GraphSearch, { SEARCH_TABLES } from "./GraphSearch" - -const onSearch = jest.fn() - -const mocks = [ - searchMock(), - searchMock("s", [ - { - id: "1", - name: "test table", - display_name: "test table", - data_source: "source", - x: 0, - y: 0, - }, - ]), -] - -test("renders", async () => { - render( - - - , - { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }, - ) - - await waitFor(() => { - expect(screen.getByTestId("search-input")).toBeInTheDocument() - }) -}) - -test("renders search", async () => { - render( - - - , - { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - mocks, - }, - ) - - await waitFor(() => { - expect(screen.getByTestId("search-input")).toBeInTheDocument() - }) - - await waitFor(() => { - expect(screen.getByText("test table")).toBeInTheDocument() - }) -}) - -test("keyboard", async () => { - const user = userEvent.setup() - - render( - - - , - { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - mocks, - }, - ) - - await waitFor(() => { - expect(screen.getByTestId("search-input")).toBeInTheDocument() - }) - - await waitFor(() => { - expect(screen.getByText("test table")).toBeInTheDocument() - }) - - await act(async () => { - await user.keyboard("{arrowup}") - }) - - await act(async () => { - await user.keyboard("{arrowdown}") - }) - - await act(async () => { - await user.keyboard("{enter}") - }) - - await act(async () => { - await user.keyboard("{escape}") - }) -}) - -test("click", async () => { - const user = userEvent.setup() - - render( - - - , - { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - mocks, - }, - ) - - await waitFor(() => { - expect(screen.getByTestId("search-input")).toBeInTheDocument() - }) - - await waitFor(() => { - expect(screen.getByText("test table")).toBeInTheDocument() - }) - - await act(async () => { - await user.click(screen.getByText("test table")) - }) -}) - -test("clear", async () => { - const user = userEvent.setup() - - render( - - - , - { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - mocks, - }, - ) - - await waitFor(() => { - expect(screen.getByTestId("search-input")).toBeInTheDocument() - }) - - await waitFor(() => { - expect(screen.getByText("test table")).toBeInTheDocument() - }) - - await waitFor(() => { - expect(screen.getByTestId("CloseIcon")).toBeInTheDocument() - }) - - await act(async () => { - await user.click(screen.getByTestId("CloseIcon")) - }) -}) - -test("errors", async () => { - const mocks = [ - { - request: { - query: SEARCH_TABLES, - variables: { - organisationName: "default", - workspaceName: "demo", - search: "s", - }, - }, - result: { errors: [new GraphQLError("Error!")] }, - }, - ] - - render( - - - , - { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - mocks, - }, - ) - - await waitFor(() => { - expect(screen.getByTestId("search-input")).toBeInTheDocument() - }) - - await waitFor(() => { - expect(screen.getByText("Error!")).toBeInTheDocument() - }) -}) diff --git a/grai-frontend/src/components/graph/drawer/GraphSearch.tsx b/grai-frontend/src/components/graph/drawer/GraphSearch.tsx deleted file mode 100644 index 49d9393bb..000000000 --- a/grai-frontend/src/components/graph/drawer/GraphSearch.tsx +++ /dev/null @@ -1,171 +0,0 @@ -import React, { useCallback, useEffect, useMemo, useState } from "react" -import { gql, useQuery } from "@apollo/client" -import { Close } from "@mui/icons-material" -import { Box, InputAdornment, List, TextField, Tooltip } from "@mui/material" -import { Viewport, useReactFlow } from "reactflow" -import useWorkspace from "helpers/useWorkspace" -import Loading from "components/layout/Loading" -import GraphError from "components/utils/GraphError" -import { - SearchGraphTables, - SearchGraphTablesVariables, -} from "./__generated__/SearchGraphTables" -import GraphTable from "./GraphTable" - -export const SEARCH_TABLES = gql` - query SearchGraphTables( - $organisationName: String! - $workspaceName: String! - $search: String - ) { - workspace(organisationName: $organisationName, name: $workspaceName) { - id - graph_tables(search: $search) { - id - name - display_name - data_source - x - y - } - } - } -` - -type Position = { - x: number - y: number -} - -type GraphSearchProps = { - search: string - onSearch: (search: string | null) => void - onMove?: (viewport: Viewport) => void -} - -const GraphSearch: React.FC = ({ - search, - onSearch, - onMove, -}) => { - const { organisationName, workspaceName } = useWorkspace() - const reactFlowInstance = useReactFlow() - const [center, setCenter] = useState() - const [selected, setSelected] = useState(0) - - const { loading, error, data } = useQuery< - SearchGraphTables, - SearchGraphTablesVariables - >(SEARCH_TABLES, { - variables: { - organisationName, - workspaceName, - search, - }, - context: { - debounceKey: "edges", - debounceTimeout: 1000, - }, - }) - - useEffect(() => { - if (!center) return - - reactFlowInstance.setCenter(center.x, center.y, { - zoom: 0.75, - }) - - const timer = setTimeout(() => { - onMove && onMove(reactFlowInstance.getViewport()) - }, 1) - - return () => clearTimeout(timer) - }, [center, onMove, reactFlowInstance]) - - const tables = useMemo(() => data?.workspace.graph_tables ?? [], [data]) - - const setTableCenter = useCallback( - (table: { x: number; y: number }) => - setCenter({ x: table.x + 200, y: table.y }), - [], - ) - - useEffect(() => { - const handleKeyDown = (event: KeyboardEvent) => { - if (event.code === "ArrowDown") { - setSelected(Math.min(selected + 1, tables.length - 1)) - } - if (event.code === "ArrowUp") { - setSelected(Math.max(selected - 1, 0)) - } - if (event.code === "Enter") { - setTableCenter(tables[selected]) - } - if (event.code === "Escape") { - onSearch(null) - } - } - - document.addEventListener("keydown", handleKeyDown) - - // Don't forget to clean up - return function cleanup() { - document.removeEventListener("keydown", handleKeyDown) - } - }, [onSearch, selected, tables, setTableCenter]) - - return ( - - - onSearch(event.target.value)} - InputProps={{ - endAdornment: search !== "" && ( - - - onSearch(null)} - sx={{ color: "divider", cursor: "pointer" }} - /> - - - ), - }} - inputProps={{ - "data-testid": "search-input", - }} - /> - - {error && } - {loading && } - theme.palette.grey[200], - borderStyle: "solid", - }} - > - {tables.map((table, index) => ( - setTableCenter(table)} - onHover={() => setSelected(index)} - selected={selected === index} - /> - ))} - - - ) -} - -export default GraphSearch diff --git a/grai-frontend/src/components/graph/drawer/GraphTable.tsx b/grai-frontend/src/components/graph/drawer/GraphTable.tsx deleted file mode 100644 index 89e611c0d..000000000 --- a/grai-frontend/src/components/graph/drawer/GraphTable.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import React from "react" -import { - ListItem, - ListItemButton, - ListItemIcon, - ListItemText, - Typography, -} from "@mui/material" -import DataSourceIcon from "../DataSourceIcon" - -interface Table { - id: string - name: string - display_name: string - data_source: string | null - x: number - y: number -} - -type GraphTableProps = { - table: Table - onClick?: () => void - selected: boolean - onHover?: () => void -} - -const GraphTable: React.FC = ({ - table, - onClick, - selected, - onHover, -}) => ( - - - - {table.data_source && ( - - )} - - - {table.display_name} - - } - /> - - -) - -export default GraphTable diff --git a/grai-frontend/src/components/graph/drawer/__generated__/GetFiltersDrawer.ts b/grai-frontend/src/components/graph/drawer/__generated__/GetFiltersDrawer.ts deleted file mode 100644 index 7c968b149..000000000 --- a/grai-frontend/src/components/graph/drawer/__generated__/GetFiltersDrawer.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -// @generated -// This file was automatically generated and should not be edited. - -// ==================================================== -// GraphQL query operation: GetFiltersDrawer -// ==================================================== - -export interface GetFiltersDrawer_workspace_filters_data { - __typename: "Filter"; - id: any; - name: string | null; -} - -export interface GetFiltersDrawer_workspace_filters { - __typename: "FilterPagination"; - data: GetFiltersDrawer_workspace_filters_data[]; -} - -export interface GetFiltersDrawer_workspace { - __typename: "Workspace"; - id: any; - filters: GetFiltersDrawer_workspace_filters; -} - -export interface GetFiltersDrawer { - workspace: GetFiltersDrawer_workspace; -} - -export interface GetFiltersDrawerVariables { - organisationName: string; - workspaceName: string; - search?: string | null; -} diff --git a/grai-frontend/src/components/graph/drawer/__generated__/GetWorkspaceFilterInline.ts b/grai-frontend/src/components/graph/drawer/__generated__/GetWorkspaceFilterInline.ts deleted file mode 100644 index 078731729..000000000 --- a/grai-frontend/src/components/graph/drawer/__generated__/GetWorkspaceFilterInline.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -// @generated -// This file was automatically generated and should not be edited. - -// ==================================================== -// GraphQL query operation: GetWorkspaceFilterInline -// ==================================================== - -export interface GetWorkspaceFilterInline_workspace_namespaces { - __typename: "StrDataWrapper"; - data: string[]; -} - -export interface GetWorkspaceFilterInline_workspace_tags { - __typename: "StrDataWrapper"; - data: string[]; -} - -export interface GetWorkspaceFilterInline_workspace_sources_data { - __typename: "Source"; - id: any; - name: string; -} - -export interface GetWorkspaceFilterInline_workspace_sources { - __typename: "SourcePagination"; - data: GetWorkspaceFilterInline_workspace_sources_data[]; -} - -export interface GetWorkspaceFilterInline_workspace { - __typename: "Workspace"; - id: any; - name: string; - namespaces: GetWorkspaceFilterInline_workspace_namespaces; - tags: GetWorkspaceFilterInline_workspace_tags; - sources: GetWorkspaceFilterInline_workspace_sources; -} - -export interface GetWorkspaceFilterInline { - workspace: GetWorkspaceFilterInline_workspace; -} - -export interface GetWorkspaceFilterInlineVariables { - organisationName: string; - workspaceName: string; -} diff --git a/grai-frontend/src/components/graph/drawer/__generated__/SearchGraphTables.ts b/grai-frontend/src/components/graph/drawer/__generated__/SearchGraphTables.ts deleted file mode 100644 index 7dcdb00c7..000000000 --- a/grai-frontend/src/components/graph/drawer/__generated__/SearchGraphTables.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -// @generated -// This file was automatically generated and should not be edited. - -// ==================================================== -// GraphQL query operation: SearchGraphTables -// ==================================================== - -export interface SearchGraphTables_workspace_graph_tables { - __typename: "BaseTable"; - id: string; - name: string; - display_name: string; - data_source: string | null; - x: number; - y: number; -} - -export interface SearchGraphTables_workspace { - __typename: "Workspace"; - id: any; - graph_tables: SearchGraphTables_workspace_graph_tables[]; -} - -export interface SearchGraphTables { - workspace: SearchGraphTables_workspace; -} - -export interface SearchGraphTablesVariables { - organisationName: string; - workspaceName: string; - search?: string | null; -} diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/AddButton.test.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/AddButton.test.tsx deleted file mode 100644 index 8d1c3ae33..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/AddButton.test.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import userEvent from "@testing-library/user-event" -import { render, screen, waitFor } from "testing" -import AddButton from "./AddButton" - -const defaultProps = { - fields: [ - { - value: "test", - label: "test", - operators: [], - }, - ], - onAdd: () => {}, -} - -test("renders", async () => { - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByTestId("AddIcon")).toBeInTheDocument() - }) -}) - -test("click", async () => { - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByTestId("AddIcon")).toBeInTheDocument() - }) - - await userEvent.click(screen.getByTestId("AddIcon")) - - await waitFor(() => { - expect(screen.getByText("Choose data field to add")).toBeInTheDocument() - }) -}) - -test("escape", async () => { - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByTestId("AddIcon")).toBeInTheDocument() - }) - - await userEvent.click(screen.getByTestId("AddIcon")) - - await waitFor(() => { - expect(screen.getByText("Choose data field to add")).toBeInTheDocument() - }) - - await userEvent.keyboard("{Escape}") -}) diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/AddButton.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/AddButton.tsx deleted file mode 100644 index c74edde3a..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/AddButton.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React, { useState } from "react" -import { Add } from "@mui/icons-material" -import { Button, Tooltip } from "@mui/material" -import { Field, Filter } from "components/filters/filters" -import AddPopper from "./AddPopper" - -type AddButtonProps = { - fields: Field[] - onAdd: (newFilter: Filter) => void -} - -const AddButton: React.FC = ({ fields, onAdd }) => { - const [anchorEl, setAnchorEl] = useState(null) - - const handleClick = (event: React.MouseEvent) => - setAnchorEl(event.currentTarget) - - return ( - <> - - - - - - ) -} - -export default AddButton diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/AddPopper.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/AddPopper.tsx deleted file mode 100644 index e9fa73855..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/AddPopper.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import React from "react" -import { - Autocomplete, - AutocompleteChangeReason, - AutocompleteCloseReason, - Box, - ClickAwayListener, - Divider, -} from "@mui/material" -import theme from "theme" -import { Field, Filter } from "components/filters/filters" -import PopperComponent from "./PopperComponent" -import StyledInput from "./StyledInput" -import StyledPopper from "./StyledPopper" - -type AddPopperProps = { - anchorEl: null | HTMLElement - setAnchorEl: (anchorEl: null | HTMLElement) => void - fields: Field[] - onAdd: (newFilter: Filter) => void -} - -const AddPopper: React.FC = ({ - anchorEl, - setAnchorEl, - fields, - onAdd, -}) => { - const handleClick = ( - event: React.SyntheticEvent, - value: Field | null, - reason: AutocompleteChangeReason, - ) => { - const field = fields.find(field => field.value === value?.value) - - onAdd({ - type: "table", - field: value?.value ?? null, - operator: field?.operators[0].value ?? null, - value: null, - }) - handleClose() - } - - const handleClose = () => { - if (anchorEl) { - anchorEl.focus() - } - setAnchorEl(null) - } - - const open = Boolean(anchorEl) - const id = open ? "github-label" : undefined - - return ( - - -
    - - Choose data field to add - - - , - reason: AutocompleteCloseReason, - ) => { - if (reason === "escape") { - handleClose() - } - }} - onChange={handleClick} - PopperComponent={PopperComponent} - noOptionsText="No fields found" - options={fields} - renderInput={params => ( - - )} - /> -
    -
    -
    - ) -} - -export default AddPopper diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/CreateFilterForm.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/CreateFilterForm.tsx deleted file mode 100644 index 198d2c522..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/CreateFilterForm.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import React, { useState } from "react" -import { LoadingButton } from "@mui/lab" -import { TextField } from "@mui/material" -import Form from "components/form/Form" - -export type Values = { - name: string -} - -type CreateFilterFormProps = { - loading?: boolean - onSubmit: (values: Values) => void -} - -const CreateFilterForm: React.FC = ({ - loading, - onSubmit, -}) => { - const [values, setValues] = useState({ - name: "", - }) - - const handleSubmit = () => onSubmit(values) - - return ( -
    - setValues({ ...values, name: e.target.value })} - fullWidth - required - margin="normal" - /> - - Save - - - ) -} - -export default CreateFilterForm diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/FilterItem.test.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/FilterItem.test.tsx deleted file mode 100644 index 46a70fecd..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/FilterItem.test.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { render, screen, waitFor } from "testing" -import FilterItem from "./FilterItem" - -const defaultProps = { - filter: { - type: "table", - field: "name", - operator: "equals", - value: "test", - }, - setFilter: () => {}, - field: null, - operator: null, - onDelete: () => {}, -} - -test("renders", async () => { - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByText("name")).toBeInTheDocument() - }) -}) diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/FilterItem.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/FilterItem.tsx deleted file mode 100644 index 8099bfedf..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/FilterItem.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import React, { useState } from "react" -import { Delete } from "@mui/icons-material" -import { Button, Box, Stack, Chip, IconButton, Tooltip } from "@mui/material" -import { Filter, Field, Operator } from "components/filters/filters" -import FilterPopper from "./FilterPopper" - -type FilterItemProps = { - filter: Filter - setFilter: (filter: Filter) => void - field: Field | null - operator: Operator | null - onDelete: () => void -} - -const FilterItem: React.FC = ({ - filter, - setFilter, - field, - operator, - onDelete, -}) => { - const [anchorEl, setAnchorEl] = useState(null) - const [hover, setHover] = useState(false) - - const handleClick = (event: React.MouseEvent) => - setAnchorEl(event.currentTarget) - - const handleDelete = ( - event: React.MouseEvent, - ) => { - event.stopPropagation() - onDelete() - } - - const filterValueToString = (value: string | null) => { - if (!value) return null - - if (!operator?.options) return value - - const option = operator.options.find(option => - typeof option === "string" ? option === value : option.value === value, - ) - - return typeof option === "string" ? option : option?.label ?? value - } - - const filterValue = Array.isArray(filter.value) - ? filter.value.length > 0 - ? filterValueToString(filter.value[0]) + - (filter.value.length > 1 ? ` +${filter.value.length - 1}` : "") - : null - : filterValueToString(filter.value) - - return ( - <> - - - - ) -} - -export default FilterItem diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/FilterPopper.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/FilterPopper.tsx deleted file mode 100644 index f0a2d2bdd..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/FilterPopper.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import React from "react" -import { Delete } from "@mui/icons-material" -import { - Box, - Button, - ButtonGroup, - ClickAwayListener, - Divider, - IconButton, - Tooltip, -} from "@mui/material" -import { Field, Filter, Operator } from "components/filters/filters" -import StyledPopper from "./StyledPopper" -import ValueField from "./ValueField" - -type FilterPopperProps = { - anchorEl: null | HTMLElement - setAnchorEl: (anchorEl: null | HTMLElement) => void - filter: Filter - setFilter: (filter: Filter) => void - field: Field | null - operator: Operator | null - onDelete: () => void -} - -const FilterPopper: React.FC = ({ - anchorEl, - setAnchorEl, - filter, - setFilter, - operator, - field, - onDelete, -}) => { - const handleClose = () => { - if (anchorEl) { - anchorEl.focus() - } - setAnchorEl(null) - } - - const open = Boolean(anchorEl) - const id = open ? "github-label" : undefined - - return ( - - -
    - - Only show Table where {field?.label ?? filter.field} - - - - - - - - - - {field?.operators.map(operator => ( - - - - ))} - - - - -
    -
    -
    - ) -} - -export default FilterPopper diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/FilterRow.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/FilterRow.tsx deleted file mode 100644 index 085b33fad..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/FilterRow.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import React from "react" -import { Filter, Property } from "components/filters/filters" -import FilterItem from "./FilterItem" - -type FilterRowProps = { - properties: Property[] - filter: Filter - setFilter: (filter: Filter) => void - onDelete: () => void -} - -const FilterRow: React.FC = ({ - properties, - filter, - setFilter, - onDelete, -}) => { - const property = - properties.find(property => property.value === filter.type) ?? null - const field = - property?.fields.find(field => field.value === filter.field) ?? null - const operator = - field?.operators.find(operator => operator.value === filter.operator) ?? - null - - return ( - - ) -} - -export default FilterRow diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/GraphFilterInline.test.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/GraphFilterInline.test.tsx deleted file mode 100644 index a1c27b680..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/GraphFilterInline.test.tsx +++ /dev/null @@ -1,465 +0,0 @@ -import userEvent from "@testing-library/user-event" -import { GraphQLError } from "graphql" -import { act, fireEvent, render, screen, waitFor } from "testing" -import GraphFilterInline, { GET_WORKSPACE } from "./GraphFilterInline" - -const setInlineFilters = jest.fn() - -const defaultProps = { - inlineFilters: [ - { - type: "table", - field: "namespace", - operator: "equals", - value: "prod", - }, - ], - setInlineFilters, -} - -const mocks = [ - { - request: { - query: GET_WORKSPACE, - variables: { - organisationName: "default", - workspaceName: "demo", - }, - }, - result: { - data: { - workspace: { - id: "1", - name: "demo", - namespaces: { - data: ["default", "prod"], - }, - tags: { - data: [], - }, - sources: { - data: [], - }, - }, - }, - }, - }, -] - -beforeEach(() => { - window.localStorage.clear() -}) - -afterEach(() => { - window.localStorage.clear() -}) - -test("renders", async () => { - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByText("Save")).toBeInTheDocument() - }) -}) - -test("renders multiple", async () => { - render( - , - { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }, - ) - - await waitFor(() => { - expect(screen.getByText("Save")).toBeInTheDocument() - }) -}) - -test("renders null value", async () => { - render( - , - { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }, - ) - - await waitFor(() => { - expect(screen.getByText("Save")).toBeInTheDocument() - }) -}) - -test("renders data sources", async () => { - render( - , - { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }, - ) - - await waitFor(() => { - expect(screen.getByText("Save")).toBeInTheDocument() - }) -}) - -test("renders not field", async () => { - render( - , - { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }, - ) - - await waitFor(() => { - expect(screen.getByText("Save")).toBeInTheDocument() - }) -}) - -test("from search", async () => { - render(, { - path: ":organisationName/:workspaceName/graph", - route: - '/default/demo/graph?inline-filter=%5B%7B"type"%3A"table"%2C"field"%3A"namespace"%2C"operator"%3A"equals"%2C"value"%3A"default"%7D%5D', - }) - - await waitFor(() => { - expect(screen.getByText("Save")).toBeInTheDocument() - }) -}) - -test("add", async () => { - const user = userEvent.setup() - - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByTestId("AddIcon")).toBeInTheDocument() - }) - - await act(async () => await user.click(screen.getByTestId("AddIcon"))) - - await waitFor(() => { - expect(screen.getByText("Choose data field to add")).toBeInTheDocument() - }) - - await act( - async () => await user.click(screen.getByRole("option", { name: /tag/i })), - ) - - expect(setInlineFilters).toHaveBeenCalledWith([ - { field: "namespace", operator: "equals", type: "table", value: "prod" }, - { field: "tag", operator: "contains", type: "table", value: null }, - ]) -}) - -test("hover", async () => { - const user = userEvent.setup() - - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByText("Namespace")).toBeInTheDocument() - }) - - await act(async () => await user.hover(screen.getByText("Namespace"))) - - await waitFor(() => { - expect(screen.getByTestId("DeleteIcon")).toBeInTheDocument() - }) - - fireEvent.mouseLeave(screen.getByText("Namespace")) - - await waitFor(() => { - expect(screen.queryByTestId("DeleteIcon")).not.toBeInTheDocument() - }) -}) - -test("remove", async () => { - const user = userEvent.setup() - - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByText("Namespace")).toBeInTheDocument() - }) - - await act(async () => await user.hover(screen.getByText("Namespace"))) - - await waitFor(() => { - expect(screen.getByTestId("DeleteIcon")).toBeInTheDocument() - }) - - await act(async () => await user.click(screen.getByTestId("DeleteIcon"))) - - expect(setInlineFilters).toHaveBeenCalledWith([]) -}) - -test("edit", async () => { - const user = userEvent.setup() - - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - mocks, - }) - - await waitFor(() => { - expect(screen.getByText("Namespace")).toBeInTheDocument() - }) - - await act(async () => await user.click(screen.getByText("Namespace"))) - - await waitFor(() => { - expect( - screen.getByText("Only show Table where Namespace"), - ).toBeInTheDocument() - }) - - await waitFor(() => { - expect(screen.getByRole("button", { name: /in/i })).toBeInTheDocument() - }) - - await act( - async () => await user.click(screen.getByRole("button", { name: /in/i })), - ) - - expect(setInlineFilters).toHaveBeenCalledWith([ - { - field: "namespace", - operator: "in", - type: "table", - value: "prod", - }, - ]) - - await waitFor(() => { - expect(screen.getByText("default")).toBeInTheDocument() - }) - - await act(async () => await user.click(screen.getByText("default"))) - - expect(setInlineFilters).toHaveBeenCalledWith([ - { - field: "namespace", - operator: "equals", - type: "table", - value: "default", - }, - ]) - - await act(async () => await user.type(screen.getByRole("listbox"), "prod")) - - await act(async () => await user.keyboard("{escape}")) -}) - -test("edit multiple", async () => { - const user = userEvent.setup() - - render( - , - { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - mocks, - }, - ) - - await waitFor(() => { - expect(screen.getByText("Namespace")).toBeInTheDocument() - }) - - await act(async () => await user.click(screen.getByText("Namespace"))) - - await waitFor(() => { - expect( - screen.getByText("Only show Table where Namespace"), - ).toBeInTheDocument() - }) - - await waitFor(() => { - expect(screen.getByText("default")).toBeInTheDocument() - }) - - await act( - async () => - await act(async () => await user.click(screen.getByText("default"))), - ) - - expect(setInlineFilters).toHaveBeenCalledWith([ - { - field: "namespace", - operator: "in", - type: "table", - value: ["prod", "default"], - }, - ]) - - await act(async () => await user.keyboard("{escape}")) -}) - -test("edit text", async () => { - const user = userEvent.setup() - - render( - , - { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - mocks, - }, - ) - - await waitFor(() => { - expect(screen.getByText("Name")).toBeInTheDocument() - }) - - await act(async () => await user.click(screen.getByText("Name"))) - - await waitFor(() => { - expect(screen.getByText("Only show Table where Name")).toBeInTheDocument() - }) - - await act(async () => await user.type(screen.getByRole("textbox"), "a")) - - await act(async () => await user.keyboard("{escape}")) - - expect(setInlineFilters).toHaveBeenCalledWith([ - { - field: "name", - operator: "equals", - type: "table", - value: "testnamea", - }, - ]) -}) - -test("error", async () => { - const mocks = [ - { - request: { - query: GET_WORKSPACE, - variables: { - organisationName: "default", - workspaceName: "demo", - }, - }, - result: { - errors: [new GraphQLError("Error!")], - }, - }, - ] - - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - mocks, - }) - - await waitFor(() => { - expect(screen.getByText("Error!")).toBeInTheDocument() - }) -}) - -test("not found", async () => { - const mocks = [ - { - request: { - query: GET_WORKSPACE, - variables: { - organisationName: "default", - workspaceName: "demo", - }, - }, - result: { - data: { - workspace: null, - }, - }, - }, - ] - - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - mocks, - }) - - await waitFor(() => { - expect(screen.getByText("Page not found")).toBeInTheDocument() - }) -}) diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/GraphFilterInline.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/GraphFilterInline.tsx deleted file mode 100644 index bdaf46776..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/GraphFilterInline.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import React from "react" -import { gql, useQuery } from "@apollo/client" -import { Box, CircularProgress } from "@mui/material" -import NotFound from "pages/NotFound" -import useWorkspace from "helpers/useWorkspace" -import { Filter, getProperties } from "components/filters/filters" -import GraphError from "components/utils/GraphError" -import AddButton from "./AddButton" -import FilterRow from "./FilterRow" -import SaveButton from "./SaveButton" -import { - GetWorkspaceFilterInline, - GetWorkspaceFilterInlineVariables, -} from "../__generated__/GetWorkspaceFilterInline" - -export const GET_WORKSPACE = gql` - query GetWorkspaceFilterInline( - $organisationName: String! - $workspaceName: String! - ) { - workspace(organisationName: $organisationName, name: $workspaceName) { - id - name - namespaces { - data - } - tags { - data - } - sources { - data { - id - name - } - } - } - } -` -type GraphFilterInlineProps = { - inlineFilters: Filter[] - setInlineFilters: (filters: Filter[]) => void -} - -const GraphFilterInline: React.FC = ({ - inlineFilters, - setInlineFilters, -}) => { - const { organisationName, workspaceName } = useWorkspace() - - const { loading, error, data } = useQuery< - GetWorkspaceFilterInline, - GetWorkspaceFilterInlineVariables - >(GET_WORKSPACE, { - variables: { - organisationName, - workspaceName, - }, - }) - - if (loading) return - if (error) return - - const workspace = data?.workspace - - if (!workspace) return - - const properties = getProperties( - workspace.namespaces.data, - workspace.tags.data, - workspace.sources.data, - ) - - const handleAdd = (newFilter: Filter) => - setInlineFilters([...inlineFilters, newFilter]) - - const handleFilterChange = (index: number) => (filter: Filter) => { - const newFilters = [...inlineFilters] - newFilters[index] = filter - setInlineFilters(newFilters) - } - - const handleFilterDelete = (index: number) => () => { - const newFilters = [...inlineFilters] - newFilters.splice(index, 1) - setInlineFilters(newFilters) - } - - return ( - - - {inlineFilters.map((filter, index) => ( - - ))} - - - ) -} - -export default GraphFilterInline diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/PopperComponent.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/PopperComponent.tsx deleted file mode 100644 index 4c5f39aaf..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/PopperComponent.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React from "react" -import { autocompleteClasses, styled } from "@mui/material" - -const StyledAutocompletePopper = styled("div")(({ theme }) => ({ - [`& .${autocompleteClasses.paper}`]: { - boxShadow: "none", - margin: 0, - color: "inherit", - fontSize: 13, - }, - [`& .${autocompleteClasses.listbox}`]: { - backgroundColor: theme.palette.mode === "light" ? "#fff" : "#1c2128", - padding: 0, - [`& .${autocompleteClasses.option}`]: { - minHeight: "auto", - alignItems: "flex-start", - padding: 8, - borderBottom: `1px solid ${ - theme.palette.mode === "light" ? " #eaecef" : "#30363d" - }`, - '&[aria-selected="true"]': { - backgroundColor: "transparent", - }, - [`&.${autocompleteClasses.focused}, &.${autocompleteClasses.focused}[aria-selected="true"]`]: - { - backgroundColor: theme.palette.action.hover, - }, - }, - }, - [`&.${autocompleteClasses.popperDisablePortal}`]: { - position: "relative", - }, -})) - -interface PopperComponentProps { - anchorEl?: any - disablePortal?: boolean - open: boolean -} - -const PopperComponent: React.FC = props => { - const { disablePortal, anchorEl, open, ...other } = props - return -} - -export default PopperComponent diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/SaveButton.test.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/SaveButton.test.tsx deleted file mode 100644 index 9ed57d5c5..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/SaveButton.test.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import userEvent from "@testing-library/user-event" -import { act, render, screen, waitFor } from "testing" -import SaveButton from "./SaveButton" - -const defaultProps = { - workspaceId: "1", - inlineFilters: [ - { - type: "table", - field: null, - operator: null, - value: null, - }, - ], -} - -test("renders", async () => { - render() - - await waitFor(() => { - expect(screen.getByRole("button", { name: /save/i })).toBeInTheDocument() - }) -}) - -test("open and close", async () => { - const user = userEvent.setup() - - render() - - await waitFor(() => { - expect(screen.getByRole("button", { name: /save/i })).toBeInTheDocument() - }) - - await act( - async () => await user.click(screen.getByRole("button", { name: /save/i })), - ) - - await waitFor(() => { - expect(screen.getByTestId("CloseIcon")).toBeInTheDocument() - }) - - await act(async () => await user.click(screen.getByTestId("CloseIcon"))) -}) diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/SaveButton.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/SaveButton.tsx deleted file mode 100644 index 4ac1a1b22..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/SaveButton.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import React, { useState } from "react" -import { Save } from "@mui/icons-material" -import { Button } from "@mui/material" -import { Filter } from "components/filters/filters" -import SaveDialog from "./SaveDialog" - -type SaveButtonProps = { - workspaceId: string - inlineFilters: Filter[] -} - -const SaveButton: React.FC = ({ - workspaceId, - inlineFilters, -}) => { - const [open, setOpen] = useState(false) - - const handleOpen = () => setOpen(true) - const handleClose = () => setOpen(false) - - return ( - <> - - - - ) -} - -export default SaveButton diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/SaveDialog.test.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/SaveDialog.test.tsx deleted file mode 100644 index 8092ff350..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/SaveDialog.test.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import userEvent from "@testing-library/user-event" -import { GraphQLError } from "graphql" -import { act, render, screen, waitFor } from "testing" -import SaveDialog, { CREATE_FILTER } from "./SaveDialog" - -const defaultProps = { - open: true, - onClose: jest.fn(), - workspaceId: "1", - inlineFilters: [], -} - -test("renders", async () => { - render() - - await waitFor(() => { - expect(screen.getByRole("button", { name: /save/i })).toBeInTheDocument() - }) -}) - -test("submit", async () => { - const user = userEvent.setup() - - render() - - await waitFor(() => { - expect(screen.getByRole("button", { name: /save/i })).toBeInTheDocument() - }) - - await act(async () => user.type(screen.getByLabelText(/name/i), "test")) - - await act( - async () => await user.click(screen.getByRole("button", { name: /save/i })), - ) -}) - -test("error", async () => { - const user = userEvent.setup() - - const mocks = [ - { - request: { - query: CREATE_FILTER, - variables: { - workspaceId: "1", - name: "test", - metadata: [], - }, - }, - result: { - errors: [new GraphQLError("Error!")], - }, - }, - ] - - render(, { mocks }) - - await waitFor(() => { - expect(screen.getByRole("button", { name: /save/i })).toBeInTheDocument() - }) - - await act(async () => user.type(screen.getByLabelText(/name/i), "test")) - - await act( - async () => await user.click(screen.getByRole("button", { name: /save/i })), - ) - - await waitFor(() => { - expect(screen.getByText("Error!")).toBeInTheDocument() - }) -}) diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/StyledInput.test.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/StyledInput.test.tsx deleted file mode 100644 index e78e246e6..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/StyledInput.test.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { createTheme } from "@mui/material" -import { render } from "testing" -import StyledInput from "./StyledInput" - -test("renders", async () => { - render() -}) - -test("renders dark mode", async () => { - const theme = createTheme({ - palette: { - mode: "dark", - }, - }) - - render(, { - theme, - }) -}) diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/StyledInput.ts b/grai-frontend/src/components/graph/drawer/filters-inline/StyledInput.ts deleted file mode 100644 index e06283f8e..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/StyledInput.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { InputBase, styled } from "@mui/material" - -const StyledInput = styled(InputBase)(({ theme }) => ({ - padding: 10, - width: "100%", - borderBottom: `1px solid ${ - theme.palette.mode === "light" ? "#eaecef" : "#30363d" - }`, - "& input": { - borderRadius: 4, - backgroundColor: theme.palette.mode === "light" ? "#fff" : "#0d1117", - padding: 8, - transition: theme.transitions.create(["border-color", "box-shadow"]), - border: `1px solid ${ - theme.palette.mode === "light" ? "#eaecef" : "#30363d" - }`, - fontSize: 14, - "&:focus": { - boxShadow: `0px 0px 0px 3px ${ - theme.palette.mode === "light" - ? "rgba(3, 102, 214, 0.3)" - : "rgb(12, 45, 107)" - }`, - borderColor: theme.palette.mode === "light" ? "#0366d6" : "#388bfd", - }, - }, -})) - -export default StyledInput diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/StyledPopper.ts b/grai-frontend/src/components/graph/drawer/filters-inline/StyledPopper.ts deleted file mode 100644 index 8fa77b316..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/StyledPopper.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Popper, styled } from "@mui/material" - -const StyledPopper = styled(Popper)(({ theme }) => ({ - border: `1px solid ${theme.palette.mode === "light" ? "#e1e4e8" : "#30363d"}`, - boxShadow: `0 8px 24px ${ - theme.palette.mode === "light" ? "rgba(149, 157, 165, 0.2)" : "rgb(1, 4, 9)" - }`, - borderRadius: 6, - width: 300, - zIndex: theme.zIndex.modal, - fontSize: 13, - color: theme.palette.mode === "light" ? "#24292e" : "#c9d1d9", - backgroundColor: theme.palette.mode === "light" ? "#fff" : "#1c2128", -})) - -export default StyledPopper diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/ValueField.test.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/ValueField.test.tsx deleted file mode 100644 index 837de04ba..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/ValueField.test.tsx +++ /dev/null @@ -1,177 +0,0 @@ -import userEvent from "@testing-library/user-event" -import { act, render, screen, waitFor } from "testing" -import ValueField from "./ValueField" - -const operator = { - value: "equals", - label: "Equals", -} - -const defaultProps = { - field: { - value: "name", - label: "Name", - operators: [operator], - }, - operator, - filter: { - type: "table", - field: "name", - operator: "equals", - value: "test", - }, - setFilter: () => {}, - onClose: () => {}, -} - -test("renders", async () => { - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByRole("textbox")).toHaveValue("test") - }) -}) - -test("renders object", async () => { - const user = userEvent.setup() - - const operator = { - value: "equals", - label: "Equals", - options: [ - { value: "test", label: "Test" }, - { value: "test2", label: "Test 2" }, - ], - } - - const props = { - field: { - value: "name", - label: "Name", - operators: [operator], - }, - operator, - filter: { - type: "table", - field: "name", - operator: "equals", - value: "test", - }, - setFilter: () => {}, - onClose: () => {}, - } - - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByText("Test")).toBeInTheDocument() - }) - - await waitFor(() => { - expect(screen.getByText("Test 2")).toBeInTheDocument() - }) - - await act(async () => { - await user.keyboard("{escape}") - }) -}) - -test("renders not operator", async () => { - const user = userEvent.setup() - - const operator = { - value: "equals", - label: "Equals", - options: [ - { value: "test", label: "Test" }, - { value: "test2", label: "Test 2" }, - ], - } - - const props = { - field: { - value: "name", - label: "Name", - operators: [operator], - }, - operator, - filter: { - type: "table", - field: "name", - operator: "not-equals", - value: "test", - }, - setFilter: () => {}, - onClose: () => {}, - } - - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByText("Test")).toBeInTheDocument() - }) - - await waitFor(() => { - expect(screen.getByText("Test 2")).toBeInTheDocument() - }) - - await act(async () => { - await user.keyboard("{escape}") - }) -}) - -test("renders not option", async () => { - const user = userEvent.setup() - - const operator = { - value: "equals", - label: "Equals", - options: [ - { value: "test", label: "Test" }, - { value: "test2", label: "Test 2" }, - ], - } - - const props = { - field: { - value: "name", - label: "Name", - operators: [operator], - }, - operator, - filter: { - type: "table", - field: "name", - operator: "equals", - value: "test3", - }, - setFilter: () => {}, - onClose: () => {}, - } - - render(, { - path: ":organisationName/:workspaceName/graph", - route: "/default/demo/graph", - }) - - await waitFor(() => { - expect(screen.getByText("Test")).toBeInTheDocument() - }) - - await waitFor(() => { - expect(screen.getByText("Test 2")).toBeInTheDocument() - }) - - await act(async () => { - await user.keyboard("{escape}") - }) -}) diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/ValueField.tsx b/grai-frontend/src/components/graph/drawer/filters-inline/ValueField.tsx deleted file mode 100644 index a0c9591d7..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/ValueField.tsx +++ /dev/null @@ -1,187 +0,0 @@ -import React from "react" -import { Close, Done } from "@mui/icons-material" -import { - Autocomplete, - AutocompleteChangeReason, - AutocompleteCloseReason, - Box, -} from "@mui/material" -import arrayWrap from "helpers/arrayWrap" -import notEmpty from "helpers/notEmpty" -import { - Field, - Filter, - OperationOption, - Operator, -} from "components/filters/filters" -import PopperComponent from "./PopperComponent" -import StyledInput from "./StyledInput" - -type ValueFieldProps = { - field: Field | null - operator: Operator | null - filter: Filter - setFilter: (filter: Filter) => void - onClose: () => void -} - -const ValueField: React.FC = ({ - field, - operator, - filter, - setFilter, - onClose, -}) => { - const handleValueChange = ( - event: React.SyntheticEvent, - newValue: - | null - | string - | OperationOption - | (null | string | OperationOption)[], - reason: AutocompleteChangeReason, - ) => - setFilter({ - ...filter, - value: Array.isArray(newValue) - ? newValue - .map(option => - typeof option === "string" ? option : option?.value, - ) - .filter(notEmpty) - : (typeof newValue === "string" ? newValue : newValue?.value) ?? null, - }) - - if (!operator?.options) - return ( - setFilter({ ...filter, value: event.target.value })} - value={filter.value ?? ""} - /> - ) - - if (operator.multiple) - return ( - - open - multiple - onClose={( - _: React.ChangeEvent<{}>, - reason: AutocompleteCloseReason, - ) => { - if (reason === "escape") { - onClose() - } - }} - value={operator.options.filter(option => - arrayWrap(filter.value).includes( - typeof option === "string" ? option : option?.value, - ), - )} - onChange={handleValueChange} - disableCloseOnSelect - PopperComponent={PopperComponent} - renderTags={() => null} - noOptionsText={`No ${field?.label ?? filter.field}`} - renderOption={(props, option, { selected }) => ( -
  • - - - {typeof option === "string" ? option : option?.label} - - -
  • - )} - options={operator.options} - getOptionLabel={option => - (typeof option === "string" ? option : option?.label) ?? "" - } - renderInput={params => ( - - )} - /> - ) - - return ( - - open - onClose={(_: React.ChangeEvent<{}>, reason: AutocompleteCloseReason) => { - if (reason === "escape") { - onClose() - } - }} - value={ - operator.options.find(option => - typeof option === "string" - ? option === filter.value - : option.value === filter.value, - ) ?? null - } - onChange={handleValueChange} - disableCloseOnSelect - PopperComponent={PopperComponent} - noOptionsText={`No ${field?.label ?? filter.field}`} - renderOption={(props, option, { selected }) => ( -
  • - - - {typeof option === "string" ? option : option?.label} - -
  • - )} - options={operator.options} - getOptionLabel={option => - (typeof option === "string" ? option : option?.label) ?? "" - } - renderInput={params => ( - - )} - /> - ) -} - -export default ValueField diff --git a/grai-frontend/src/components/graph/drawer/filters-inline/__generated__/GetWorkspaceFilterInline.ts b/grai-frontend/src/components/graph/drawer/filters-inline/__generated__/GetWorkspaceFilterInline.ts deleted file mode 100644 index 078731729..000000000 --- a/grai-frontend/src/components/graph/drawer/filters-inline/__generated__/GetWorkspaceFilterInline.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -// @generated -// This file was automatically generated and should not be edited. - -// ==================================================== -// GraphQL query operation: GetWorkspaceFilterInline -// ==================================================== - -export interface GetWorkspaceFilterInline_workspace_namespaces { - __typename: "StrDataWrapper"; - data: string[]; -} - -export interface GetWorkspaceFilterInline_workspace_tags { - __typename: "StrDataWrapper"; - data: string[]; -} - -export interface GetWorkspaceFilterInline_workspace_sources_data { - __typename: "Source"; - id: any; - name: string; -} - -export interface GetWorkspaceFilterInline_workspace_sources { - __typename: "SourcePagination"; - data: GetWorkspaceFilterInline_workspace_sources_data[]; -} - -export interface GetWorkspaceFilterInline_workspace { - __typename: "Workspace"; - id: any; - name: string; - namespaces: GetWorkspaceFilterInline_workspace_namespaces; - tags: GetWorkspaceFilterInline_workspace_tags; - sources: GetWorkspaceFilterInline_workspace_sources; -} - -export interface GetWorkspaceFilterInline { - workspace: GetWorkspaceFilterInline_workspace; -} - -export interface GetWorkspaceFilterInlineVariables { - organisationName: string; - workspaceName: string; -} diff --git a/grai-frontend/src/components/graph/useCombinedFilters.ts b/grai-frontend/src/components/graph/useCombinedFilters.ts new file mode 100644 index 000000000..4dc841d77 --- /dev/null +++ b/grai-frontend/src/components/graph/useCombinedFilters.ts @@ -0,0 +1,34 @@ +import { Filter } from "components/filters/filters" +import useFilters from "./useFilters" +import useInlineFilters from "./useInlineFilters" + +export type CombinedFilters = { + filters: string[] | null + setFilters: (filters: string[]) => void + inlineFilters: Filter[] | null + setInlineFilters: (filters: Filter[]) => void +} + +const useCombinedFilters = ( + localStorageKey: string = "graph-filters", + inlineLocalStorageKey: string = "graph-inline-filter", + searchKey: string = "filters", + inlineSearchKey: string = "inline-filter", +) => { + const { filters, setFilters } = useFilters(localStorageKey, searchKey) + const { inlineFilters, setInlineFilters } = useInlineFilters( + inlineLocalStorageKey, + inlineSearchKey, + ) + + const combinedFilters: CombinedFilters = { + filters, + setFilters, + inlineFilters, + setInlineFilters, + } + + return { combinedFilters, ...combinedFilters } +} + +export default useCombinedFilters diff --git a/grai-frontend/src/components/graph/useFilters.test.tsx b/grai-frontend/src/components/graph/useFilters.test.tsx new file mode 100644 index 000000000..0c1957b56 --- /dev/null +++ b/grai-frontend/src/components/graph/useFilters.test.tsx @@ -0,0 +1,42 @@ +import { renderHook } from "@testing-library/react" +import { MemoryRouter, Route, Routes } from "react-router-dom" +import { act } from "testing" +import useFilters from "./useFilters" + +const wrapper = ({ children }: { children: React.ReactElement }) => ( + + + + + +) + +beforeEach(() => { + window.localStorage.clear() +}) + +test("should return null if no filters are present", () => { + const { result } = renderHook(() => useFilters(), { wrapper }) + + expect(result.current.filters).toEqual(null) +}) + +test("set array", async () => { + const { result } = renderHook(() => useFilters(), { wrapper }) + + expect(result.current.filters).toEqual(null) + + await act(async () => result.current.setFilters(["test"])) + + expect(result.current.filters).toEqual(["test"]) +}) + +test("set empty array", async () => { + const { result } = renderHook(() => useFilters(), { wrapper }) + + expect(result.current.filters).toEqual(null) + + await act(async () => result.current.setFilters([])) + + expect(result.current.filters).toEqual(null) +}) diff --git a/grai-frontend/src/components/graph/useInlineFilters.test.tsx b/grai-frontend/src/components/graph/useInlineFilters.test.tsx new file mode 100644 index 000000000..7a29c88c4 --- /dev/null +++ b/grai-frontend/src/components/graph/useInlineFilters.test.tsx @@ -0,0 +1,49 @@ +import { renderHook } from "@testing-library/react" +import { MemoryRouter, Route, Routes } from "react-router-dom" +import { act } from "testing" +import useInlineFilters from "./useInlineFilters" + +const wrapper = ({ children }: { children: React.ReactElement }) => ( + + + + + +) + +beforeEach(() => { + window.localStorage.clear() +}) + +test("should return null if no inlineFilters are present", () => { + const { result } = renderHook(() => useInlineFilters(), { wrapper }) + + expect(result.current.inlineFilters).toEqual(null) +}) + +test("set array", async () => { + const { result } = renderHook(() => useInlineFilters(), { wrapper }) + + expect(result.current.inlineFilters).toEqual(null) + + const filter = { + type: null, + field: null, + operator: null, + value: null, + } + + await act(async () => result.current.setInlineFilters([filter])) + + expect(result.current.inlineFilters).toEqual([filter]) +}) + +test("set empty array", async () => { + const { result } = renderHook(() => useInlineFilters(), { wrapper }) + + expect(result.current.inlineFilters).toEqual(null) + + await act(async () => result.current.setInlineFilters([])) + + expect(result.current.inlineFilters).toEqual(null) +}) diff --git a/grai-frontend/src/components/reports/ReportGraph.tsx b/grai-frontend/src/components/reports/ReportGraph.tsx index 2403085fc..2c4fc5c22 100644 --- a/grai-frontend/src/components/reports/ReportGraph.tsx +++ b/grai-frontend/src/components/reports/ReportGraph.tsx @@ -4,8 +4,7 @@ import GraphComponent, { ResultError, Table, } from "components/graph/GraphComponent" -import useFilters from "components/graph/useFilters" -import useInlineFilters from "components/graph/useInlineFilters" +import useCombinedFilters from "components/graph/useCombinedFilters" import { Run } from "./run/RunLog" type ReportGraphProps = { @@ -21,8 +20,8 @@ const ReportGraph: React.FC = ({ limitGraph, run, }) => { - const { filters, setFilters } = useFilters(`reports-${run?.id}-graph-filters`) - const { inlineFilters, setInlineFilters } = useInlineFilters( + const { combinedFilters } = useCombinedFilters( + `reports-${run?.id}-graph-filters`, `reports-${run?.id}-graph-inline-filters`, ) @@ -36,10 +35,7 @@ const ReportGraph: React.FC = ({ tables={tables} errors={errors} limitGraph={limitGraph} - filters={filters ?? []} - setFilters={setFilters} - inlineFilters={inlineFilters ?? []} - setInlineFilters={setInlineFilters} + combinedFilters={combinedFilters} />
    ) diff --git a/grai-frontend/src/components/sources/SourceLineage.tsx b/grai-frontend/src/components/sources/SourceLineage.tsx index 8a2fc03a5..333024cec 100644 --- a/grai-frontend/src/components/sources/SourceLineage.tsx +++ b/grai-frontend/src/components/sources/SourceLineage.tsx @@ -3,8 +3,7 @@ import { gql, useQuery } from "@apollo/client" import { Alert, Box } from "@mui/material" import useWorkspace from "helpers/useWorkspace" import GraphComponent from "components/graph/GraphComponent" -import useFilters from "components/graph/useFilters" -import useInlineFilters from "components/graph/useInlineFilters" +import useCombinedFilters from "components/graph/useCombinedFilters" import GraphError from "components/utils/GraphError" import { GetTablesAndEdgesSourceLineage, @@ -59,10 +58,8 @@ type SourceLineageProps = { const SourceLineage: React.FC = ({ source }) => { const [value, setValue] = useState(0) const { organisationName, workspaceName } = useWorkspace() - const { filters, setFilters } = useFilters( + const { combinedFilters } = useCombinedFilters( `sources-${source.id}-graph-filters`, - ) - const { inlineFilters, setInlineFilters } = useInlineFilters( `sources-${source.id}-graph-inline-filters`, ) @@ -102,10 +99,7 @@ const SourceLineage: React.FC = ({ source }) => { setValue, }, }} - filters={filters ?? []} - setFilters={setFilters} - inlineFilters={inlineFilters ?? []} - setInlineFilters={setInlineFilters} + combinedFilters={combinedFilters} /> ) diff --git a/grai-frontend/src/components/tables/TableLineage.tsx b/grai-frontend/src/components/tables/TableLineage.tsx index b25cf8f4a..ee71ff000 100644 --- a/grai-frontend/src/components/tables/TableLineage.tsx +++ b/grai-frontend/src/components/tables/TableLineage.tsx @@ -3,8 +3,7 @@ import { gql, useQuery } from "@apollo/client" import { Alert, Box } from "@mui/material" import useWorkspace from "helpers/useWorkspace" import GraphComponent from "components/graph/GraphComponent" -import useFilters from "components/graph/useFilters" -import useInlineFilters from "components/graph/useInlineFilters" +import useCombinedFilters from "components/graph/useCombinedFilters" import GraphError from "components/utils/GraphError" import { GetTablesAndEdgesTableLineage, @@ -60,8 +59,8 @@ type TableLineageProps = { const TableLineage: React.FC = ({ table }) => { const [value, setValue] = useState(1) const { organisationName, workspaceName } = useWorkspace() - const { filters, setFilters } = useFilters(`tables-${table.id}-graph-filters`) - const { inlineFilters, setInlineFilters } = useInlineFilters( + const { combinedFilters } = useCombinedFilters( + `tables-${table.id}-graph-filters`, `tables-${table.id}-graph-inline-filters`, ) @@ -101,10 +100,7 @@ const TableLineage: React.FC = ({ table }) => { setValue, }, }} - filters={filters ?? []} - setFilters={setFilters} - inlineFilters={inlineFilters ?? []} - setInlineFilters={setInlineFilters} + combinedFilters={combinedFilters} /> ) diff --git a/grai-frontend/src/pages/Graph.test.tsx b/grai-frontend/src/pages/Graph.test.tsx index 8e5443db0..a99661ecc 100644 --- a/grai-frontend/src/pages/Graph.test.tsx +++ b/grai-frontend/src/pages/Graph.test.tsx @@ -3,9 +3,7 @@ import userEvent from "@testing-library/user-event" import { GraphQLError } from "graphql" import { act, render, screen, waitFor } from "testing" import { destinationTable, sourceTable, spareTable } from "helpers/testNodes" -import { GET_WORKSPACE } from "components/graph/drawer/filters-inline/GraphFilterInline" -import { GET_FILTERS } from "components/graph/drawer/GraphFilters" -import { SEARCH_TABLES } from "components/graph/drawer/GraphSearch" +import { GET_FILTERS } from "components/graph/controls/FilterControl" import Graph, { GET_TABLES_AND_EDGES } from "./Graph" const baseFilter = { @@ -22,13 +20,28 @@ export const filtersMock = { variables: { organisationName: "default", workspaceName: "demo", - search: "", + // search: "", }, }, result: { data: { workspace: { id: "1", + name: "demo", + namespaces: { + data: ["namespace1", "namespace2"], + }, + tags: { + data: ["tag1", "tag2"], + }, + sources: { + data: [ + { + id: "1", + name: "source1", + }, + ], + }, filters: { data: [ { @@ -105,42 +118,42 @@ const tablesMockWithFilter = { }, } -export const searchMock = (search: string = "", graph_tables: any[] = []) => ({ - request: { - query: SEARCH_TABLES, - variables: { - organisationName: "default", - workspaceName: "demo", - search, - }, - }, - result: { - data: { - workspace: { - id: "1", - graph_tables, - }, - }, - }, -}) +// export const searchMock = (search: string = "", graph_tables: any[] = []) => ({ +// request: { +// query: SEARCH_TABLES, +// variables: { +// organisationName: "default", +// workspaceName: "demo", +// search, +// }, +// }, +// result: { +// data: { +// workspace: { +// id: "1", +// graph_tables, +// }, +// }, +// }, +// }) const mocks = [ filtersMock, filtersMock, tablesMock, tablesMock, - searchMock(), - searchMock(), - searchMock("s", [ - { - id: "1", - name: "test table", - display_name: "test table", - data_source: "source", - x: 0, - y: 0, - }, - ]), + // searchMock(), + // searchMock(), + // searchMock("s", [ + // { + // id: "1", + // name: "test table", + // display_name: "test table", + // data_source: "source", + // x: 0, + // y: 0, + // }, + // ]), ] jest.retryTimes(1) @@ -238,8 +251,8 @@ test("renders empty", async () => { mocks: [ filtersMock, filtersMock, - searchMock(), - searchMock(), + // searchMock(), + // searchMock(), { request: { query: GET_TABLES_AND_EDGES, @@ -386,8 +399,8 @@ test("error", async () => { errors: [new GraphQLError("Error!")], }, }, - searchMock(), - searchMock(), + // searchMock(), + // searchMock(), ] render(, { @@ -406,8 +419,8 @@ test("no nodes", async () => { const mocks = [ filtersMock, filtersMock, - searchMock(), - searchMock(), + // searchMock(), + // searchMock(), { request: { query: GET_TABLES_AND_EDGES, @@ -486,9 +499,9 @@ test("search", async () => { async () => await user.type(screen.getByTestId("search-input"), "s"), ) - await waitFor(() => { - expect(screen.getByText("test table")).toBeInTheDocument() - }) + // await waitFor(() => { + // expect(screen.getByText("test table")).toBeInTheDocument() + // }) }) test("filter", async () => { @@ -522,8 +535,8 @@ test("filter", async () => { tablesMock, tablesMock, tablesMockWithFilter, - searchMock(), - searchMock(), + // searchMock(), + // searchMock(), ], }) @@ -532,19 +545,19 @@ test("filter", async () => { }) await waitFor(() => { - expect(screen.getByTestId("FilterListIcon")).toBeInTheDocument() + expect(screen.getByTestId("FilterAltIcon")).toBeInTheDocument() }) await act(async () => { - await user.click(screen.getByTestId("FilterListIcon")) + await user.click(screen.getByTestId("FilterAltIcon")) }) await waitFor(() => { - expect(screen.getByText("Manage Filters")).toBeInTheDocument() + expect(screen.getByText("Saved Filters")).toBeInTheDocument() }) await act(async () => { - await user.click(screen.getByText("Manage Filters")) + await user.click(screen.getByRole("link", { name: "Manage" })) }) await waitFor(() => { @@ -615,33 +628,6 @@ test("inline filter", async () => { }, }) - const workspacesMock = { - request: { - query: GET_WORKSPACE, - variables: { - organisationName: "default", - workspaceName: "demo", - }, - }, - result: { - data: { - workspace: { - id: "1", - name: "demo", - namespaces: { - data: ["default", "prod"], - }, - tags: { - data: [], - }, - sources: { - data: [], - }, - }, - }, - }, - } - render(, { path: ":organisationName/:workspaceName/graph", route: @@ -654,14 +640,12 @@ test("inline filter", async () => { tablesMock, tablesMock, tablesMockWithFilter, - searchMock(), - searchMock(), + // searchMock(), + // searchMock(), inlineFilterMock(), inlineFilterMock(), inlineFilterMock(), inlineFilterMock("prod"), - workspacesMock, - workspacesMock, ], }) @@ -678,18 +662,18 @@ test("inline filter", async () => { }) await waitFor(() => { - expect(screen.getByText("Namespace")).toBeInTheDocument() + expect(screen.getByText(/Saved Filters/i)).toBeInTheDocument() }) - await act(async () => { - await user.click(screen.getByText("Namespace")) - }) + expect( + screen.getByRole("button", { name: /add new filter/i }), + ).toBeInTheDocument() await act(async () => { - await user.click(screen.getByText("prod")) + await user.click(screen.getByRole("button", { name: /add new filter/i })) }) - await waitFor(async () => { - await user.click(screen.getByTestId("DeleteIcon")) + await act(async () => { + await user.click(screen.getByRole("button", { name: /add row/i })) }) }) diff --git a/grai-frontend/src/pages/Graph.tsx b/grai-frontend/src/pages/Graph.tsx index cc8d0f292..e06f043e0 100644 --- a/grai-frontend/src/pages/Graph.tsx +++ b/grai-frontend/src/pages/Graph.tsx @@ -9,8 +9,7 @@ import GraphComponent, { ResultError, Table, } from "components/graph/GraphComponent" -import useFilters from "components/graph/useFilters" -import useInlineFilters from "components/graph/useInlineFilters" +import useCombinedFilters from "components/graph/useCombinedFilters" import GraphError from "components/utils/GraphError" import { GetTablesAndEdges, @@ -66,8 +65,7 @@ const Graph: React.FC = ({ alwaysShow }) => { zoom: 1, }) - const { filters, setFilters } = useFilters() - const { inlineFilters, setInlineFilters } = useInlineFilters() + const { combinedFilters, filters, inlineFilters } = useCombinedFilters() const [loadGraph, { loading, error, refetch }] = useLazyQuery< GetTablesAndEdges, @@ -135,10 +133,7 @@ const Graph: React.FC = ({ alwaysShow }) => { onMove={setViewport} onRefresh={handleRefresh} refreshLoading={loading} - filters={filters ?? []} - setFilters={setFilters} - inlineFilters={inlineFilters ?? []} - setInlineFilters={setInlineFilters} + combinedFilters={combinedFilters} defaultViewport={viewport} /> diff --git a/grai-frontend/src/pages/reports/PullRequest.test.tsx b/grai-frontend/src/pages/reports/PullRequest.test.tsx index 163a1432f..bef647629 100644 --- a/grai-frontend/src/pages/reports/PullRequest.test.tsx +++ b/grai-frontend/src/pages/reports/PullRequest.test.tsx @@ -1,6 +1,7 @@ import React from "react" import { GraphQLError } from "graphql" import { render, screen, waitFor } from "testing" +import { filtersMock } from "pages/Graph.test" import { destinationTable, sourceTable, spareTable } from "helpers/testNodes" import PullRequest, { GET_PULL_REQUEST } from "./PullRequest" @@ -11,7 +12,7 @@ test("renders", async () => { await waitFor(() => { expect( - screen.getAllByRole("heading", { name: /Hello world/i }) + screen.getAllByRole("heading", { name: /Hello world/i }), ).toBeTruthy() }) @@ -26,7 +27,7 @@ test("renders errors", async () => { request: { query: GET_PULL_REQUEST, variables: { - organisationName: "org", + organisationName: "default", workspaceName: "demo", type: "github", owner: "owner", @@ -90,17 +91,18 @@ test("renders errors", async () => { }, }, }, + filtersMock, ] render(, { mocks, path: "/:organisationName/:workspaceName/reports/:type/:owner/:repo/pulls/:reference", - route: "/org/demo/reports/github/owner/repo/pulls/123", + route: "/default/demo/reports/github/owner/repo/pulls/123", }) await waitFor(() => { expect( - screen.getByRole("heading", { name: /Pull Request Title/i }) + screen.getByRole("heading", { name: /Pull Request Title/i }), ).toBeTruthy() }) @@ -115,7 +117,7 @@ test("not found", async () => { request: { query: GET_PULL_REQUEST, variables: { - organisationName: "org", + organisationName: "default", workspaceName: "demo", type: "github", owner: "owner", @@ -146,7 +148,7 @@ test("not found", async () => { render(, { mocks, path: "/:organisationName/:workspaceName/reports/:type/:owner/:repo/pulls/:reference", - route: "/org/demo/reports/github/owner/repo/pulls/123", + route: "/default/demo/reports/github/owner/repo/pulls/123", }) await waitFor(() => { @@ -160,7 +162,7 @@ test("error", async () => { request: { query: GET_PULL_REQUEST, variables: { - organisationName: "org", + organisationName: "default", workspaceName: "demo", type: "github", owner: "owner", @@ -177,7 +179,7 @@ test("error", async () => { render(, { mocks, path: "/:organisationName/:workspaceName/reports/:type/:owner/:repo/pulls/:reference", - route: "/org/demo/reports/github/owner/repo/pulls/123", + route: "/default/demo/reports/github/owner/repo/pulls/123", }) await waitFor(() => {