diff --git a/LICENCE b/LICENCE index 78c16c6..ac373bc 100644 --- a/LICENCE +++ b/LICENCE @@ -1,4 +1,5 @@ -The parties agree that the Licence below is to be governed by Singapore law. +The parties agree that the Licence below is to be governed by and construed in +accordance with the law of the Republic of Singapore. EUROPEAN UNION PUBLIC LICENCE v. 1.2 EUPL © the European Union 2007, 2016 diff --git a/package-lock.json b/package-lock.json index 50e20d4..f6188df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,20 +1,21 @@ { "name": "clerkent", - "version": "3.4.8", + "version": "3.4.11", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "clerkent", - "version": "3.4.8", - "license": "Parity-7.0.0", + "version": "3.4.11", + "license": "EUPL-1.2", "os": [ "linux" ], "dependencies": { - "@babel/runtime": "^7.20.6", - "axios": "^1.2.1", - "axios-cache-interceptor": "^0.10.7", + "@babel/runtime": "^7.20.13", + "async-mutex": "^0.4.0", + "axios": "^1.2.3", + "axios-cache-interceptor": "^1.0.0", "cheerio": "^1.0.0-rc.12", "fuse.js": "^6.6.2", "leven": "^4.0.0", @@ -27,56 +28,56 @@ "svg-country-flags": "^1.2.10" }, "devDependencies": { - "@babel/cli": "^7.19.3", - "@babel/core": "^7.20.5", - "@babel/node": "^7.20.5", - "@babel/plugin-transform-react-jsx": "^7.19.0", + "@babel/cli": "^7.20.7", + "@babel/core": "^7.20.12", + "@babel/node": "^7.20.7", + "@babel/plugin-transform-react-jsx": "^7.20.13", "@babel/plugin-transform-runtime": "^7.19.6", "@babel/preset-env": "^7.20.2", "@babel/preset-typescript": "^7.18.6", - "@testing-library/preact": "^3.2.2", - "@types/jest": "^29.2.4", + "@testing-library/preact": "^3.2.3", + "@types/jest": "^29.2.6", "@types/memoizee": "^0.4.8", - "@types/node": "^18.11.12", + "@types/node": "^18.11.18", "@types/qs": "^6.9.7", - "@types/sharp": "^0.31.0", + "@types/sharp": "^0.31.1", "@types/webpack": "^5.28.0", - "@typescript-eslint/eslint-plugin": "^5.46.0", - "@typescript-eslint/parser": "^5.46.0", + "@typescript-eslint/eslint-plugin": "^5.49.0", + "@typescript-eslint/parser": "^5.49.0", "autoprefixer": "^10.4.13", - "babel-loader": "^9.1.0", + "babel-loader": "^9.1.2", "clean-webpack-plugin": "^4.0.0", "codecov": "^3.8.3", "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.7.2", - "eslint": "^8.29.0", + "css-loader": "^6.7.3", + "eslint": "^8.32.0", "eslint-config-preact": "^1.3.0", "eslint-plugin-disable": "^2.0.3", - "eslint-plugin-import": "^2.26.0", + "eslint-plugin-import": "^2.27.5", "eslint-plugin-json-format": "^2.0.1", - "eslint-plugin-jsx-a11y": "^6.6.1", + "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-node": "^11.1.0", "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-sonarjs": "^0.17.0", + "eslint-plugin-sonarjs": "^0.18.0", "eslint-plugin-sort-keys-fix": "^1.1.2", - "eslint-plugin-unicorn": "^45.0.1", + "eslint-plugin-unicorn": "^45.0.2", "file-loader": "^6.2.0", "filemanager-webpack-plugin": "^7.0.0", - "fork-ts-checker-webpack-plugin": "^7.2.13", + "fork-ts-checker-webpack-plugin": "^7.3.0", "html-webpack-plugin": "^5.5.0", - "husky": "^8.0.2", + "husky": "^8.0.3", "jest": "^29.3.1", "jest-environment-jsdom": "^29.3.1", "lint-staged": "^13.1.0", "mini-css-extract-plugin": "^2.7.2", - "postcss": "^8.4.19", + "postcss": "^8.4.21", "postcss-loader": "^7.0.2", "resolve-url-loader": "^5.0.0", - "sharp": "^0.31.2", + "sharp": "^0.31.3", "svg-inline-loader": "^0.8.2", "tailwindcss": "^3.2.4", "terser-webpack-plugin": "^5.3.6", - "ts-jest": "^29.0.3", + "ts-jest": "^29.0.5", "ts-node": "^10.9.1", "tsc-files": "^1.1.3", "typescript": "^4.9.4", @@ -100,9 +101,9 @@ } }, "node_modules/@babel/cli": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.19.3.tgz", - "integrity": "sha512-643/TybmaCAe101m2tSVHi9UKpETXP9c/Ff4mD2tAwkdP6esKIfaauZFc67vGEM6r9fekbEGid+sZhbEnSe3dg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.20.7.tgz", + "integrity": "sha512-WylgcELHB66WwQqItxNILsMlaTd8/SO6SgTTjMp4uCI7P4QyH1r3nqgFmO3BfM4AtfniHgFMH3EpYFj/zynBkQ==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.8", @@ -140,32 +141,32 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", - "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz", - "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==", + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.5", - "@babel/parser": "^7.20.5", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", + "json5": "^2.2.2", "semver": "^6.3.0" }, "engines": { @@ -204,11 +205,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", - "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", "dependencies": { - "@babel/types": "^7.20.5", + "@babel/types": "^7.20.7", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -255,13 +256,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "dependencies": { - "@babel/compat-data": "^7.20.0", + "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "engines": { @@ -271,6 +273,19 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", @@ -392,18 +407,18 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -537,13 +552,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", - "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -563,9 +578,9 @@ } }, "node_modules/@babel/node": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.20.5.tgz", - "integrity": "sha512-ElSr40UtumWE4fYYF1xfLP2C6b9nfS/rswK7YYpLo9HDGEXGXEAWZaGCxIirxGIDyoV0rbl6jV1LyFMQ6ZOQSA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.20.7.tgz", + "integrity": "sha512-AQt3gVcP+fpFuoFn4FmIW/+5JovvEoA9og4Y1LrRw0pv3jkl4tujZMMy3X/3ugjLrEy3k1aNywo3JIl3g+jVXQ==", "dev": true, "dependencies": { "@babel/register": "^7.18.9", @@ -586,9 +601,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", - "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1506,16 +1521,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", - "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.13.tgz", + "integrity": "sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.19.0" + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -1841,9 +1856,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", - "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -1851,45 +1866,32 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz", - "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==", - "dev": true, - "dependencies": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", - "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", + "@babel/generator": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.5", - "@babel/types": "^7.20.5", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1898,9 +1900,9 @@ } }, "node_modules/@babel/types": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", - "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", "dependencies": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", @@ -2093,15 +2095,15 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2122,9 +2124,9 @@ "dev": true }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2174,9 +2176,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -3231,9 +3233,9 @@ } }, "node_modules/@testing-library/preact": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@testing-library/preact/-/preact-3.2.2.tgz", - "integrity": "sha512-mMPEp/9TOOqf3QqDHY02ieGFfRbi8fAxZvRifn+vOzrdNcCR1zchwPA6BvqXG3wAweRan4QJioYgEc1cePeC3g==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@testing-library/preact/-/preact-3.2.3.tgz", + "integrity": "sha512-y6Kklp1XK3f1X2fWCbujmJyzkf+1BgLYXNgAx21j9+D4CoqMTz5qC4SQufb1L6q/jxLGACzrQ90ewVOTBvHOfg==", "dev": true, "dependencies": { "@testing-library/dom": "^8.11.1" @@ -3410,9 +3412,9 @@ } }, "node_modules/@types/jest": { - "version": "29.2.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.4.tgz", - "integrity": "sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==", + "version": "29.2.6", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.6.tgz", + "integrity": "sha512-XEUC/Tgw3uMh6Ho8GkUtQ2lPhY5Fmgyp3TdlkTJs1W9VgNxs+Ow/x3Elh8lHQKqCbZL0AubQuqWjHVT033Hhrw==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -3487,9 +3489,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.12.tgz", - "integrity": "sha512-FgD3NtTAKvyMmD44T07zz2fEf+OKwutgBCEVM8GcvMGVGaDktiLNTDvPwC/LUe3PinMW+X6CuLOF2Ui1mAlSXg==", + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -3550,9 +3552,9 @@ "dev": true }, "node_modules/@types/sharp": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.31.0.tgz", - "integrity": "sha512-nwivOU101fYInCwdDcH/0/Ru6yIRXOpORx25ynEOc6/IakuCmjOAGpaO5VfUl4QkDtUC6hj+Z2eCQvgXOioknw==", + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.31.1.tgz", + "integrity": "sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag==", "dev": true, "dependencies": { "@types/node": "*" @@ -3597,14 +3599,14 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.0.tgz", - "integrity": "sha512-QrZqaIOzJAjv0sfjY4EjbXUi3ZOFpKfzntx22gPGr9pmFcTjcFw/1sS1LJhEubfAGwuLjNrPV0rH+D1/XZFy7Q==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.49.0.tgz", + "integrity": "sha512-IhxabIpcf++TBaBa1h7jtOWyon80SXPRLDq0dVz5SLFC/eW6tofkw/O7Ar3lkx5z5U6wzbKDrl2larprp5kk5Q==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.46.0", - "@typescript-eslint/type-utils": "5.46.0", - "@typescript-eslint/utils": "5.46.0", + "@typescript-eslint/scope-manager": "5.49.0", + "@typescript-eslint/type-utils": "5.49.0", + "@typescript-eslint/utils": "5.49.0", "debug": "^4.3.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", @@ -3630,13 +3632,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz", - "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz", + "integrity": "sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/visitor-keys": "5.46.0" + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3647,9 +3649,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz", - "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.49.0.tgz", + "integrity": "sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3660,13 +3662,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz", - "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz", + "integrity": "sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/visitor-keys": "5.46.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3687,16 +3689,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.0.tgz", - "integrity": "sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.49.0.tgz", + "integrity": "sha512-cPJue/4Si25FViIb74sHCLtM4nTSBXtLx1d3/QT6mirQ/c65bV8arBEebBJJizfq8W2YyMoPI/WWPFWitmNqnQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.46.0", - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/typescript-estree": "5.46.0", + "@typescript-eslint/scope-manager": "5.49.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/typescript-estree": "5.49.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -3713,12 +3715,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", - "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz", + "integrity": "sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/types": "5.49.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -3764,14 +3766,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.0.tgz", - "integrity": "sha512-joNO6zMGUZg+C73vwrKXCd8usnsmOYmgW/w5ZW0pG0RGvqeznjtGDk61EqqTpNrFLUYBW2RSBFrxdAZMqA4OZA==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.49.0.tgz", + "integrity": "sha512-veDlZN9mUhGqU31Qiv2qEp+XrJj5fgZpJ8PW30sHU+j/8/e5ruAhLaVDAeznS7A7i4ucb/s8IozpDtt9NqCkZg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.46.0", - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/typescript-estree": "5.46.0", + "@typescript-eslint/scope-manager": "5.49.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/typescript-estree": "5.49.0", "debug": "^4.3.4" }, "engines": { @@ -3791,13 +3793,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz", - "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz", + "integrity": "sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/visitor-keys": "5.46.0" + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3808,9 +3810,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz", - "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.49.0.tgz", + "integrity": "sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3821,13 +3823,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz", - "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz", + "integrity": "sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/visitor-keys": "5.46.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3848,12 +3850,12 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", - "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz", + "integrity": "sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/types": "5.49.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -3897,13 +3899,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.0.tgz", - "integrity": "sha512-dwv4nimVIAsVS2dTA0MekkWaRnoYNXY26dKz8AN5W3cBFYwYGFQEqm/cG+TOoooKlncJS4RTbFKgcFY/pOiBCg==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.49.0.tgz", + "integrity": "sha512-eUgLTYq0tR0FGU5g1YHm4rt5H/+V2IPVkP0cBmbhRyEmyGe4XvJ2YJ6sYTmONfjmdMqyMLad7SB8GvblbeESZA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.46.0", - "@typescript-eslint/utils": "5.46.0", + "@typescript-eslint/typescript-estree": "5.49.0", + "@typescript-eslint/utils": "5.49.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -3924,13 +3926,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz", - "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz", + "integrity": "sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/visitor-keys": "5.46.0" + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3941,9 +3943,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz", - "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.49.0.tgz", + "integrity": "sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3954,13 +3956,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz", - "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz", + "integrity": "sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/visitor-keys": "5.46.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3981,16 +3983,16 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.0.tgz", - "integrity": "sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.49.0.tgz", + "integrity": "sha512-cPJue/4Si25FViIb74sHCLtM4nTSBXtLx1d3/QT6mirQ/c65bV8arBEebBJJizfq8W2YyMoPI/WWPFWitmNqnQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.46.0", - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/typescript-estree": "5.46.0", + "@typescript-eslint/scope-manager": "5.49.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/typescript-estree": "5.49.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -4007,12 +4009,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", - "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz", + "integrity": "sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/types": "5.49.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -4653,24 +4655,24 @@ } }, "node_modules/aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", "dev": true, - "engines": { - "node": ">=6.0" + "dependencies": { + "deep-equal": "^2.0.5" } }, "node_modules/array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" }, "engines": { @@ -4699,14 +4701,14 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -4717,14 +4719,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -4789,6 +4791,14 @@ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, + "node_modules/async-mutex": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.0.tgz", + "integrity": "sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -4827,19 +4837,31 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axe-core": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", - "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz", + "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/axios": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz", - "integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.3.tgz", + "integrity": "sha512-pdDkMYJeuXLZ6Xj/Q5J3Phpe+jbGdsSzlQaFVkMQzRUL05+6+tetX8TV3p4HrU4kzuO9bt+io/yGQxuyxA/xcw==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -4847,23 +4869,32 @@ } }, "node_modules/axios-cache-interceptor": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/axios-cache-interceptor/-/axios-cache-interceptor-0.10.7.tgz", - "integrity": "sha512-UjpxChG5DpF6Kf1IPGMLOzRDNL8ZNS6TOn1jTaVvCE7cWFU904jJwi0T1s+IbijpnLEjK2iq5uLIuR8Sj+RsFQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/axios-cache-interceptor/-/axios-cache-interceptor-1.0.0.tgz", + "integrity": "sha512-gjgWfsmF4MHNbFxVckH6zhFbovlI6W1eYepyBNPjGTjMFhVZWM+/nvCCXHnkK520xJ+Kt+1r4lqIXSz6dcjr2w==", "dependencies": { "cache-parser": "^1.2.4", "fast-defer": "^1.1.7", "object-code": "^1.2.4" }, + "engines": { + "node": ">=12" + }, "funding": { "url": "https://github.com/ArthurFiorette/axios-cache-interceptor?sponsor=1" + }, + "peerDependencies": { + "axios": "^1" } }, "node_modules/axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } }, "node_modules/babel-jest": { "version": "29.3.1", @@ -4966,9 +4997,9 @@ } }, "node_modules/babel-loader": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.0.tgz", - "integrity": "sha512-Antt61KJPinUMwHwIIz9T5zfMgevnfZkEVWYDWlG888fgdvRRGD0JTuf/fFozQnfT+uq64sk1bmdHDy/mOEWnA==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", + "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", "dev": true, "dependencies": { "find-cache-dir": "^3.3.2", @@ -5949,17 +5980,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-pure": { - "version": "3.23.5", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.23.5.tgz", - "integrity": "sha512-8t78LdpKSuCq4pJYCYk8hl7XEkAX+BP16yRIwL3AanTksxuEf7CM83vRyctmiEL8NDZ3jpUcv56fk9/zG3aIuw==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -6027,13 +6047,13 @@ } }, "node_modules/css-loader": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.2.tgz", - "integrity": "sha512-oqGbbVcBJkm8QwmnNzrFrWTnudnRZC+1eXikLJl0n4ljcfotgRifpg2a1lKy8jTrc4/d9A/ap1GFq1jDKG7J+Q==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.18", + "postcss": "^8.4.19", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", @@ -6206,6 +6226,40 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, + "node_modules/deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-equal/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -6617,34 +6671,44 @@ } }, "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "dependencies": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" @@ -6659,12 +6723,52 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -6825,13 +6929,13 @@ } }, "node_modules/eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", - "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz", + "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -6850,7 +6954,7 @@ "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", @@ -6901,13 +7005,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, "dependencies": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -6920,16 +7025,20 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", "dev": true, "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "debug": "^3.2.7" }, "engines": { "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, "node_modules/eslint-module-utils/node_modules/debug": { @@ -6941,73 +7050,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-module-utils/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/eslint-plugin-compat": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.0.2.tgz", @@ -7101,23 +7143,25 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", "has": "^1.0.3", - "is-core-module": "^2.8.1", + "is-core-module": "^2.11.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", "tsconfig-paths": "^3.14.1" }, "engines": { @@ -7128,12 +7172,12 @@ } }, "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { @@ -7148,12 +7192,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, "node_modules/eslint-plugin-jest": { "version": "25.7.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", @@ -7201,23 +7239,26 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", - "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", + "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==", "dev": true, "dependencies": { - "@babel/runtime": "^7.18.9", - "aria-query": "^4.2.2", - "array-includes": "^3.1.5", + "@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.4.3", - "axobject-query": "^2.2.0", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "has": "^1.0.3", - "jsx-ast-utils": "^3.3.2", - "language-tags": "^1.0.5", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", "semver": "^6.3.0" }, "engines": { @@ -7227,19 +7268,6 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "engines": { - "node": ">=6.0" - } - }, "node_modules/eslint-plugin-node": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", @@ -7354,9 +7382,9 @@ } }, "node_modules/eslint-plugin-sonarjs": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.17.0.tgz", - "integrity": "sha512-jtGtxI49UbJJeJj7CVRLI3+LLH+y+hkR3GOOwM7vBbci9DEFIRGCWvEd2BJScrzltZ6D6iubukTAfc9cyG7sdw==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.18.0.tgz", + "integrity": "sha512-DJ3osLnt6KFdT5e9ZuIDOjT5A6wUGSLeiJJT03lPgpdD+7CVWlYAw9Goe3bt7SmbFO3Xh89NOCZAuB9XA7bAUQ==", "dev": true, "engines": { "node": ">=14" @@ -7416,13 +7444,13 @@ } }, "node_modules/eslint-plugin-unicorn": { - "version": "45.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-45.0.1.tgz", - "integrity": "sha512-tLnIw5oDJJc3ILYtlKtqOxPP64FZLTkZkgeuoN6e7x6zw+rhBjOxyvq2c7577LGxXuIhBYrwisZuKNqOOHp3BA==", + "version": "45.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-45.0.2.tgz", + "integrity": "sha512-Y0WUDXRyGDMcKLiwgL3zSMpHrXI00xmdyixEGIg90gHnj0PcHY4moNv3Ppje/kDivdAy5vUeUr7z211ImPv2gw==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.19.1", - "@eslint-community/eslint-utils": "^4.1.0", + "@eslint-community/eslint-utils": "^4.1.2", "ci-info": "^3.6.1", "clean-regexp": "^1.0.0", "esquery": "^1.4.0", @@ -7647,9 +7675,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -8198,10 +8226,19 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", - "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz", + "integrity": "sha512-IN+XTzusCjR5VgntYFgxbxVx3WraPRnKehBFrf00cMSrtUuW9MsG9dhL6MWpY6MkjC3wVwoujfCDgZZCQwbswA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", @@ -8471,9 +8508,9 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -8581,6 +8618,21 @@ "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -8610,6 +8662,18 @@ "node": ">=8" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -8662,6 +8726,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -8854,9 +8930,9 @@ } }, "node_modules/husky": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.2.tgz", - "integrity": "sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", "dev": true, "bin": { "husky": "lib/bin.js" @@ -9069,12 +9145,12 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" }, @@ -9091,6 +9167,36 @@ "node": ">= 0.10" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -9152,9 +9258,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { "node": ">= 0.4" @@ -9164,9 +9270,9 @@ } }, "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dependencies": { "has": "^1.0.3" }, @@ -9231,6 +9337,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -9348,6 +9463,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -9402,6 +9526,34 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -9414,6 +9566,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -11660,9 +11825,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -11683,13 +11848,13 @@ } }, "node_modules/jsx-ast-utils": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz", - "integrity": "sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", "dev": true, "dependencies": { "array-includes": "^3.1.5", - "object.assign": "^4.1.2" + "object.assign": "^4.1.3" }, "engines": { "node": ">=4.0" @@ -12831,6 +12996,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -12841,14 +13022,14 @@ } }, "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -12859,28 +13040,28 @@ } }, "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -12921,14 +13102,14 @@ } }, "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -13315,9 +13496,9 @@ } }, "node_modules/postcss": { - "version": "8.4.19", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", - "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", "dev": true, "funding": [ { @@ -14464,6 +14645,20 @@ "regexp-tree": "~0.1.1" } }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -14579,9 +14774,9 @@ } }, "node_modules/sharp": { - "version": "0.31.2", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.2.tgz", - "integrity": "sha512-DUdNVEXgS5A97cTagSLIIp8dUZ/lZtk78iNVZgHdHbx1qnQR7JAHY0BnXnwwH39Iw+VKhO08CTYhIg0p98vQ5Q==", + "version": "0.31.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.3.tgz", + "integrity": "sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -14903,6 +15098,18 @@ "node": ">=8" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/stream-events": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", @@ -15027,28 +15234,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15536,15 +15743,15 @@ } }, "node_modules/ts-jest": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", - "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", + "version": "29.0.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", + "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", "dev": true, "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", "jest-util": "^29.0.0", - "json5": "^2.2.1", + "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", "semver": "7.x", @@ -15699,8 +15906,7 @@ "node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -15773,6 +15979,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "4.9.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", @@ -16280,6 +16500,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", @@ -16584,9 +16839,9 @@ } }, "@babel/cli": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.19.3.tgz", - "integrity": "sha512-643/TybmaCAe101m2tSVHi9UKpETXP9c/Ff4mD2tAwkdP6esKIfaauZFc67vGEM6r9fekbEGid+sZhbEnSe3dg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.20.7.tgz", + "integrity": "sha512-WylgcELHB66WwQqItxNILsMlaTd8/SO6SgTTjMp4uCI7P4QyH1r3nqgFmO3BfM4AtfniHgFMH3EpYFj/zynBkQ==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.8", @@ -16609,29 +16864,29 @@ } }, "@babel/compat-data": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", - "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==" + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==" }, "@babel/core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz", - "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==", + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.5", - "@babel/parser": "^7.20.5", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", + "json5": "^2.2.2", "semver": "^6.3.0" } }, @@ -16655,11 +16910,11 @@ } }, "@babel/generator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", - "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", "requires": { - "@babel/types": "^7.20.5", + "@babel/types": "^7.20.7", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -16696,14 +16951,30 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "requires": { - "@babel/compat-data": "^7.20.0", + "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } } }, "@babel/helper-create-class-features-plugin": { @@ -16794,18 +17065,18 @@ } }, "@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" } }, "@babel/helper-optimise-call-expression": { @@ -16900,13 +17171,13 @@ } }, "@babel/helpers": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", - "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" } }, "@babel/highlight": { @@ -16920,9 +17191,9 @@ } }, "@babel/node": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.20.5.tgz", - "integrity": "sha512-ElSr40UtumWE4fYYF1xfLP2C6b9nfS/rswK7YYpLo9HDGEXGXEAWZaGCxIirxGIDyoV0rbl6jV1LyFMQ6ZOQSA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.20.7.tgz", + "integrity": "sha512-AQt3gVcP+fpFuoFn4FmIW/+5JovvEoA9og4Y1LrRw0pv3jkl4tujZMMy3X/3ugjLrEy3k1aNywo3JIl3g+jVXQ==", "dev": true, "requires": { "@babel/register": "^7.18.9", @@ -16934,9 +17205,9 @@ } }, "@babel/parser": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", - "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==" + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", @@ -17527,16 +17798,16 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", - "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.13.tgz", + "integrity": "sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.19.0" + "@babel/types": "^7.20.7" } }, "@babel/plugin-transform-regenerator": { @@ -17769,54 +18040,44 @@ } }, "@babel/runtime": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", - "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", "requires": { "regenerator-runtime": "^0.13.11" } }, - "@babel/runtime-corejs3": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz", - "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==", - "dev": true, - "requires": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" - } - }, "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" } }, "@babel/traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", - "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", + "@babel/generator": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.5", - "@babel/types": "^7.20.5", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", - "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", "requires": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", @@ -17972,15 +18233,15 @@ } }, "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -17995,9 +18256,9 @@ "dev": true }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -18034,9 +18295,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -18845,9 +19106,9 @@ } }, "@testing-library/preact": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@testing-library/preact/-/preact-3.2.2.tgz", - "integrity": "sha512-mMPEp/9TOOqf3QqDHY02ieGFfRbi8fAxZvRifn+vOzrdNcCR1zchwPA6BvqXG3wAweRan4QJioYgEc1cePeC3g==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@testing-library/preact/-/preact-3.2.3.tgz", + "integrity": "sha512-y6Kklp1XK3f1X2fWCbujmJyzkf+1BgLYXNgAx21j9+D4CoqMTz5qC4SQufb1L6q/jxLGACzrQ90ewVOTBvHOfg==", "dev": true, "requires": { "@testing-library/dom": "^8.11.1" @@ -19015,9 +19276,9 @@ } }, "@types/jest": { - "version": "29.2.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.4.tgz", - "integrity": "sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==", + "version": "29.2.6", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.6.tgz", + "integrity": "sha512-XEUC/Tgw3uMh6Ho8GkUtQ2lPhY5Fmgyp3TdlkTJs1W9VgNxs+Ow/x3Elh8lHQKqCbZL0AubQuqWjHVT033Hhrw==", "dev": true, "requires": { "expect": "^29.0.0", @@ -19087,9 +19348,9 @@ "dev": true }, "@types/node": { - "version": "18.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.12.tgz", - "integrity": "sha512-FgD3NtTAKvyMmD44T07zz2fEf+OKwutgBCEVM8GcvMGVGaDktiLNTDvPwC/LUe3PinMW+X6CuLOF2Ui1mAlSXg==", + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", "dev": true }, "@types/normalize-package-data": { @@ -19150,9 +19411,9 @@ "dev": true }, "@types/sharp": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.31.0.tgz", - "integrity": "sha512-nwivOU101fYInCwdDcH/0/Ru6yIRXOpORx25ynEOc6/IakuCmjOAGpaO5VfUl4QkDtUC6hj+Z2eCQvgXOioknw==", + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.31.1.tgz", + "integrity": "sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag==", "dev": true, "requires": { "@types/node": "*" @@ -19197,14 +19458,14 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.0.tgz", - "integrity": "sha512-QrZqaIOzJAjv0sfjY4EjbXUi3ZOFpKfzntx22gPGr9pmFcTjcFw/1sS1LJhEubfAGwuLjNrPV0rH+D1/XZFy7Q==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.49.0.tgz", + "integrity": "sha512-IhxabIpcf++TBaBa1h7jtOWyon80SXPRLDq0dVz5SLFC/eW6tofkw/O7Ar3lkx5z5U6wzbKDrl2larprp5kk5Q==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.46.0", - "@typescript-eslint/type-utils": "5.46.0", - "@typescript-eslint/utils": "5.46.0", + "@typescript-eslint/scope-manager": "5.49.0", + "@typescript-eslint/type-utils": "5.49.0", + "@typescript-eslint/utils": "5.49.0", "debug": "^4.3.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", @@ -19214,29 +19475,29 @@ }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz", - "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz", + "integrity": "sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/visitor-keys": "5.46.0" + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0" } }, "@typescript-eslint/types": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz", - "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.49.0.tgz", + "integrity": "sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz", - "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz", + "integrity": "sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/visitor-keys": "5.46.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -19245,28 +19506,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.0.tgz", - "integrity": "sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.49.0.tgz", + "integrity": "sha512-cPJue/4Si25FViIb74sHCLtM4nTSBXtLx1d3/QT6mirQ/c65bV8arBEebBJJizfq8W2YyMoPI/WWPFWitmNqnQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.46.0", - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/typescript-estree": "5.46.0", + "@typescript-eslint/scope-manager": "5.49.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/typescript-estree": "5.49.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", - "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz", + "integrity": "sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/types": "5.49.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -19291,41 +19552,41 @@ } }, "@typescript-eslint/parser": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.0.tgz", - "integrity": "sha512-joNO6zMGUZg+C73vwrKXCd8usnsmOYmgW/w5ZW0pG0RGvqeznjtGDk61EqqTpNrFLUYBW2RSBFrxdAZMqA4OZA==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.49.0.tgz", + "integrity": "sha512-veDlZN9mUhGqU31Qiv2qEp+XrJj5fgZpJ8PW30sHU+j/8/e5ruAhLaVDAeznS7A7i4ucb/s8IozpDtt9NqCkZg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.46.0", - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/typescript-estree": "5.46.0", + "@typescript-eslint/scope-manager": "5.49.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/typescript-estree": "5.49.0", "debug": "^4.3.4" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz", - "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz", + "integrity": "sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/visitor-keys": "5.46.0" + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0" } }, "@typescript-eslint/types": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz", - "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.49.0.tgz", + "integrity": "sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz", - "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz", + "integrity": "sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/visitor-keys": "5.46.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -19334,12 +19595,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", - "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz", + "integrity": "sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/types": "5.49.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -19365,41 +19626,41 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.0.tgz", - "integrity": "sha512-dwv4nimVIAsVS2dTA0MekkWaRnoYNXY26dKz8AN5W3cBFYwYGFQEqm/cG+TOoooKlncJS4RTbFKgcFY/pOiBCg==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.49.0.tgz", + "integrity": "sha512-eUgLTYq0tR0FGU5g1YHm4rt5H/+V2IPVkP0cBmbhRyEmyGe4XvJ2YJ6sYTmONfjmdMqyMLad7SB8GvblbeESZA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.46.0", - "@typescript-eslint/utils": "5.46.0", + "@typescript-eslint/typescript-estree": "5.49.0", + "@typescript-eslint/utils": "5.49.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz", - "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz", + "integrity": "sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/visitor-keys": "5.46.0" + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0" } }, "@typescript-eslint/types": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz", - "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.49.0.tgz", + "integrity": "sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz", - "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz", + "integrity": "sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/visitor-keys": "5.46.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/visitor-keys": "5.49.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -19408,28 +19669,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.0.tgz", - "integrity": "sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.49.0.tgz", + "integrity": "sha512-cPJue/4Si25FViIb74sHCLtM4nTSBXtLx1d3/QT6mirQ/c65bV8arBEebBJJizfq8W2YyMoPI/WWPFWitmNqnQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.46.0", - "@typescript-eslint/types": "5.46.0", - "@typescript-eslint/typescript-estree": "5.46.0", + "@typescript-eslint/scope-manager": "5.49.0", + "@typescript-eslint/types": "5.49.0", + "@typescript-eslint/typescript-estree": "5.49.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", - "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", + "version": "5.49.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz", + "integrity": "sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/types": "5.49.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -19941,21 +20202,24 @@ "dev": true }, "aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", - "dev": true + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "requires": { + "deep-equal": "^2.0.5" + } }, "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" } }, @@ -19972,26 +20236,26 @@ "dev": true }, "array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" } }, @@ -20043,6 +20307,14 @@ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, + "async-mutex": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.0.tgz", + "integrity": "sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==", + "requires": { + "tslib": "^2.4.0" + } + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -20062,16 +20334,22 @@ "postcss-value-parser": "^4.2.0" } }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, "axe-core": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", - "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz", + "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==", "dev": true }, "axios": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz", - "integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.3.tgz", + "integrity": "sha512-pdDkMYJeuXLZ6Xj/Q5J3Phpe+jbGdsSzlQaFVkMQzRUL05+6+tetX8TV3p4HrU4kzuO9bt+io/yGQxuyxA/xcw==", "requires": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -20079,9 +20357,9 @@ } }, "axios-cache-interceptor": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/axios-cache-interceptor/-/axios-cache-interceptor-0.10.7.tgz", - "integrity": "sha512-UjpxChG5DpF6Kf1IPGMLOzRDNL8ZNS6TOn1jTaVvCE7cWFU904jJwi0T1s+IbijpnLEjK2iq5uLIuR8Sj+RsFQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/axios-cache-interceptor/-/axios-cache-interceptor-1.0.0.tgz", + "integrity": "sha512-gjgWfsmF4MHNbFxVckH6zhFbovlI6W1eYepyBNPjGTjMFhVZWM+/nvCCXHnkK520xJ+Kt+1r4lqIXSz6dcjr2w==", "requires": { "cache-parser": "^1.2.4", "fast-defer": "^1.1.7", @@ -20089,10 +20367,13 @@ } }, "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dev": true, + "requires": { + "deep-equal": "^2.0.5" + } }, "babel-jest": { "version": "29.3.1", @@ -20167,9 +20448,9 @@ } }, "babel-loader": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.0.tgz", - "integrity": "sha512-Antt61KJPinUMwHwIIz9T5zfMgevnfZkEVWYDWlG888fgdvRRGD0JTuf/fFozQnfT+uq64sk1bmdHDy/mOEWnA==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", + "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", "dev": true, "requires": { "find-cache-dir": "^3.3.2", @@ -20875,12 +21156,6 @@ "browserslist": "^4.21.4" } }, - "core-js-pure": { - "version": "3.23.5", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.23.5.tgz", - "integrity": "sha512-8t78LdpKSuCq4pJYCYk8hl7XEkAX+BP16yRIwL3AanTksxuEf7CM83vRyctmiEL8NDZ3jpUcv56fk9/zG3aIuw==", - "dev": true - }, "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -20933,13 +21208,13 @@ } }, "css-loader": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.2.tgz", - "integrity": "sha512-oqGbbVcBJkm8QwmnNzrFrWTnudnRZC+1eXikLJl0n4ljcfotgRifpg2a1lKy8jTrc4/d9A/ap1GFq1jDKG7J+Q==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", "dev": true, "requires": { "icss-utils": "^5.1.0", - "postcss": "^8.4.18", + "postcss": "^8.4.19", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", @@ -21065,6 +21340,39 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, + "deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -21378,34 +21686,44 @@ } }, "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "requires": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" } }, "es-array-method-boxes-properly": { @@ -21414,12 +21732,48 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, + "es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, "es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, "es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -21545,13 +21899,13 @@ } }, "eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", - "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz", + "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -21570,7 +21924,7 @@ "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", @@ -21657,9 +22011,9 @@ } }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -21721,13 +22075,14 @@ } }, "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, "requires": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" }, "dependencies": { "debug": { @@ -21742,13 +22097,12 @@ } }, "eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", "dev": true, "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "debug": "^3.2.7" }, "dependencies": { "debug": { @@ -21759,55 +22113,6 @@ "requires": { "ms": "^2.1.1" } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true } } }, @@ -21875,33 +22180,35 @@ } }, "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", "has": "^1.0.3", - "is-core-module": "^2.8.1", + "is-core-module": "^2.11.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", "tsconfig-paths": "^3.14.1" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "doctrine": { @@ -21912,12 +22219,6 @@ "requires": { "esutils": "^2.0.2" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true } } }, @@ -21947,36 +22248,27 @@ } }, "eslint-plugin-jsx-a11y": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", - "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", + "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==", "dev": true, "requires": { - "@babel/runtime": "^7.18.9", - "aria-query": "^4.2.2", - "array-includes": "^3.1.5", + "@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.4.3", - "axobject-query": "^2.2.0", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "has": "^1.0.3", - "jsx-ast-utils": "^3.3.2", - "language-tags": "^1.0.5", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", "semver": "^6.3.0" - }, - "dependencies": { - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - } } }, "eslint-plugin-node": { @@ -22062,9 +22354,9 @@ "requires": {} }, "eslint-plugin-sonarjs": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.17.0.tgz", - "integrity": "sha512-jtGtxI49UbJJeJj7CVRLI3+LLH+y+hkR3GOOwM7vBbci9DEFIRGCWvEd2BJScrzltZ6D6iubukTAfc9cyG7sdw==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.18.0.tgz", + "integrity": "sha512-DJ3osLnt6KFdT5e9ZuIDOjT5A6wUGSLeiJJT03lPgpdD+7CVWlYAw9Goe3bt7SmbFO3Xh89NOCZAuB9XA7bAUQ==", "dev": true, "requires": {} }, @@ -22106,13 +22398,13 @@ } }, "eslint-plugin-unicorn": { - "version": "45.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-45.0.1.tgz", - "integrity": "sha512-tLnIw5oDJJc3ILYtlKtqOxPP64FZLTkZkgeuoN6e7x6zw+rhBjOxyvq2c7577LGxXuIhBYrwisZuKNqOOHp3BA==", + "version": "45.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-45.0.2.tgz", + "integrity": "sha512-Y0WUDXRyGDMcKLiwgL3zSMpHrXI00xmdyixEGIg90gHnj0PcHY4moNv3Ppje/kDivdAy5vUeUr7z211ImPv2gw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.19.1", - "@eslint-community/eslint-utils": "^4.1.0", + "@eslint-community/eslint-utils": "^4.1.2", "ci-info": "^3.6.1", "clean-regexp": "^1.0.0", "esquery": "^1.4.0", @@ -22563,10 +22855,19 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "fork-ts-checker-webpack-plugin": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", - "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz", + "integrity": "sha512-IN+XTzusCjR5VgntYFgxbxVx3WraPRnKehBFrf00cMSrtUuW9MsG9dhL6MWpY6MkjC3wVwoujfCDgZZCQwbswA==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", @@ -22752,9 +23053,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -22829,6 +23130,15 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -22851,6 +23161,15 @@ } } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -22891,6 +23210,12 @@ "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -23031,9 +23356,9 @@ "dev": true }, "husky": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.2.tgz", - "integrity": "sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", "dev": true }, "iconv-lite": { @@ -23175,12 +23500,12 @@ "dev": true }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "dev": true, "requires": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" } @@ -23191,6 +23516,27 @@ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -23234,15 +23580,15 @@ } }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "requires": { "has": "^1.0.3" } @@ -23283,6 +23629,12 @@ "is-extglob": "^2.1.1" } }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true + }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -23364,6 +23716,12 @@ "has-tostringtag": "^1.0.0" } }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true + }, "is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -23397,6 +23755,25 @@ "has-symbols": "^1.0.2" } }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -23406,6 +23783,16 @@ "call-bind": "^1.0.2" } }, + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -25084,9 +25471,9 @@ "dev": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonfile": { "version": "6.1.0", @@ -25099,13 +25486,13 @@ } }, "jsx-ast-utils": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz", - "integrity": "sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", "dev": true, "requires": { "array-includes": "^3.1.5", - "object.assign": "^4.1.2" + "object.assign": "^4.1.3" } }, "kind-of": { @@ -25986,6 +26373,16 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -25993,37 +26390,37 @@ "dev": true }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.getownpropertydescriptors": { @@ -26049,14 +26446,14 @@ } }, "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "once": { @@ -26328,9 +26725,9 @@ "dev": true }, "postcss": { - "version": "8.4.19", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", - "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", "dev": true, "requires": { "nanoid": "^3.3.4", @@ -27167,6 +27564,17 @@ "regexp-tree": "~0.1.1" } }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -27261,9 +27669,9 @@ } }, "sharp": { - "version": "0.31.2", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.2.tgz", - "integrity": "sha512-DUdNVEXgS5A97cTagSLIIp8dUZ/lZtk78iNVZgHdHbx1qnQR7JAHY0BnXnwwH39Iw+VKhO08CTYhIg0p98vQ5Q==", + "version": "0.31.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.3.tgz", + "integrity": "sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg==", "dev": true, "requires": { "color": "^4.2.3", @@ -27509,6 +27917,15 @@ } } }, + "stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "requires": { + "internal-slot": "^1.0.4" + } + }, "stream-events": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", @@ -27596,25 +28013,25 @@ } }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "strip-ansi": { @@ -27986,15 +28403,15 @@ } }, "ts-jest": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", - "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", + "version": "29.0.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", + "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", "dev": true, "requires": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", "jest-util": "^29.0.0", - "json5": "^2.2.1", + "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", "semver": "7.x", @@ -28086,8 +28503,7 @@ "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "tsutils": { "version": "3.21.0", @@ -28141,6 +28557,17 @@ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, "typescript": { "version": "4.9.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", @@ -28502,6 +28929,32 @@ "is-symbol": "^1.0.3" } }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, "wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", diff --git a/package.json b/package.json index fa195b5..08b3c32 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clerkent", - "version": "3.4.11", + "version": "3.5.0", "private": true, "description": "quick search legal search", "repository": "https://github.com/lacuna-technologies/clerkent.git", @@ -41,9 +41,10 @@ ] }, "dependencies": { - "@babel/runtime": "^7.20.6", - "axios": "^1.2.1", - "axios-cache-interceptor": "^0.10.7", + "@babel/runtime": "^7.20.13", + "async-mutex": "^0.4.0", + "axios": "^1.2.3", + "axios-cache-interceptor": "^1.0.0", "cheerio": "^1.0.0-rc.12", "fuse.js": "^6.6.2", "leven": "^4.0.0", @@ -56,56 +57,56 @@ "svg-country-flags": "^1.2.10" }, "devDependencies": { - "@babel/cli": "^7.19.3", - "@babel/core": "^7.20.5", - "@babel/node": "^7.20.5", - "@babel/plugin-transform-react-jsx": "^7.19.0", + "@babel/cli": "^7.20.7", + "@babel/core": "^7.20.12", + "@babel/node": "^7.20.7", + "@babel/plugin-transform-react-jsx": "^7.20.13", "@babel/plugin-transform-runtime": "^7.19.6", "@babel/preset-env": "^7.20.2", "@babel/preset-typescript": "^7.18.6", - "@testing-library/preact": "^3.2.2", - "@types/jest": "^29.2.4", + "@testing-library/preact": "^3.2.3", + "@types/jest": "^29.2.6", "@types/memoizee": "^0.4.8", - "@types/node": "^18.11.12", + "@types/node": "^18.11.18", "@types/qs": "^6.9.7", - "@types/sharp": "^0.31.0", + "@types/sharp": "^0.31.1", "@types/webpack": "^5.28.0", - "@typescript-eslint/eslint-plugin": "^5.46.0", - "@typescript-eslint/parser": "^5.46.0", + "@typescript-eslint/eslint-plugin": "^5.49.0", + "@typescript-eslint/parser": "^5.49.0", "autoprefixer": "^10.4.13", - "babel-loader": "^9.1.0", + "babel-loader": "^9.1.2", "clean-webpack-plugin": "^4.0.0", "codecov": "^3.8.3", "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.7.2", - "eslint": "^8.29.0", + "css-loader": "^6.7.3", + "eslint": "^8.32.0", "eslint-config-preact": "^1.3.0", "eslint-plugin-disable": "^2.0.3", - "eslint-plugin-import": "^2.26.0", + "eslint-plugin-import": "^2.27.5", "eslint-plugin-json-format": "^2.0.1", - "eslint-plugin-jsx-a11y": "^6.6.1", + "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-node": "^11.1.0", "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-sonarjs": "^0.17.0", + "eslint-plugin-sonarjs": "^0.18.0", "eslint-plugin-sort-keys-fix": "^1.1.2", - "eslint-plugin-unicorn": "^45.0.1", + "eslint-plugin-unicorn": "^45.0.2", "file-loader": "^6.2.0", "filemanager-webpack-plugin": "^7.0.0", - "fork-ts-checker-webpack-plugin": "^7.2.13", + "fork-ts-checker-webpack-plugin": "^7.3.0", "html-webpack-plugin": "^5.5.0", - "husky": "^8.0.2", + "husky": "^8.0.3", "jest": "^29.3.1", "jest-environment-jsdom": "^29.3.1", "lint-staged": "^13.1.0", "mini-css-extract-plugin": "^2.7.2", - "postcss": "^8.4.19", + "postcss": "^8.4.21", "postcss-loader": "^7.0.2", "resolve-url-loader": "^5.0.0", - "sharp": "^0.31.2", + "sharp": "^0.31.3", "svg-inline-loader": "^0.8.2", "tailwindcss": "^3.2.4", "terser-webpack-plugin": "^5.3.6", - "ts-jest": "^29.0.3", + "ts-jest": "^29.0.5", "ts-node": "^10.9.1", "tsc-files": "^1.1.3", "typescript": "^4.9.4", diff --git a/src/Background.tsx b/src/Background.tsx index bbc49c5..954cbdc 100644 --- a/src/Background.tsx +++ b/src/Background.tsx @@ -7,25 +7,9 @@ import Finder from './utils/Finder' import Storage from './utils/Storage' import Scraper from './utils/scraper' import Logger from './utils/Logger' -import { Helpers } from './utils' +import { Constants, Helpers } from './utils' import Browser from 'utils/Browser' -const getScraperResult = ( - targets: Finder.FinderResult[], - jurisdiction: Law.JurisdictionCode, -): Promise => { - const { type } = targets[0] - switch (type) { - case `case-citation`: { - return Scraper.getCaseByCitation(targets[0] as Finder.CaseCitationFinderResult, jurisdiction) - } - case `case-name`: { - return Scraper.getCaseByName(targets[0] as Finder.CaseNameFinderResult, jurisdiction) - } - } - return Promise.resolve([]) -} - // used by ContentScript/Highlighter for citation hover const viewCitation = async (port: Runtime.Port, otherProperties: Messenger.OtherProperties) => { const { citation, source } = otherProperties @@ -39,28 +23,37 @@ const viewCitation = async (port: Runtime.Port, otherProperties: Messenger.Other source: Messenger.TARGETS.background, target: source, } + if(targets.length === 0){ return port.postMessage(noResultMessage) } - const result = await Scraper.getCaseByCitation(targets[0] as Finder.CaseCitationFinderResult) + const eventTarget = await Scraper.getCaseByCitation(targets[0] as Finder.CaseCitationFinderResult) + const query = targets[0].type === `case-citation` + ? targets[0].citation + : (targets[0] as Finder.CaseNameFinderResult).name - if(result.length === 0){ - return port.postMessage(noResultMessage) - } + eventTarget.addEventListener(`${Constants.EVENTS.CASE_RESULTS}-${query}`, async (event: CustomEvent) => { + const { detail: { done, results } }: { detail: { done: boolean, results: Law.Case[] } } = event - if(citation === await Storage.get(`CURRENT_HIGHLIGHTED_CITATION`)){ // ignore outdated results - const data = result.map((r: Law.Case) => ({...targets[0], ...r})) + if(done){ + if(results.length === 0){ + return port.postMessage(noResultMessage) + } + + if(citation === await Storage.get(`CURRENT_HIGHLIGHTED_CITATION`)){ // ignore outdated results + const data = results.map((r: Law.Case) => ({...targets[0], ...r})) - const message = { - action: Messenger.ACTION_TYPES.viewCitation, - data, - source: Messenger.TARGETS.background, - target: source, + const message = { + action: Messenger.ACTION_TYPES.viewCitation, + data, + source: Messenger.TARGETS.background, + target: source, + } + port.postMessage(message) + } } - Logger.log(`sending viewCitation`, message) - port.postMessage(message) - } + }) } // Used by Popup @@ -68,33 +61,30 @@ const search = async (port: Runtime.Port, otherProperties: Messenger.OtherProper const { citation, source, jurisdiction } = otherProperties await Storage.set(`CURRENT_HIGHLIGHTED_CITATION`, citation) const targets = Finder.findCase(citation) + const { type } = targets[0] - const noResultMessage: Messenger.Message = { - action: Messenger.ACTION_TYPES.search, - data: [], - source: Messenger.TARGETS.background, - target: source, - } - - const result = await getScraperResult(targets, jurisdiction) - Logger.log(`BackgroundPage scraper result`, jurisdiction, result) + const eventTarget: EventTarget = type === `case-citation` + ? Scraper.getCaseByCitation(targets[0] as Finder.CaseCitationFinderResult, jurisdiction) + : Scraper.getCaseByName(targets[0] as Finder.CaseNameFinderResult, jurisdiction) - if(result.length === 0){ - return port.postMessage(noResultMessage) - } + const query = type === `case-citation` + ? targets[0].citation + : (targets[0] as Finder.CaseNameFinderResult).name - if(citation === await Storage.get(`CURRENT_HIGHLIGHTED_CITATION`)){ // ignore outdated results - const data = result.map((r: Law.Legislation | Law.Case) => ({...targets[0], ...r})) + eventTarget.addEventListener(`${Constants.EVENTS.CASE_RESULTS}-${query}`, async (event: CustomEvent) => { + const { detail: { done, results } }: { detail: { done: boolean, results: Law.Case[] } } = event + if(citation === await Storage.get(`CURRENT_HIGHLIGHTED_CITATION`)){ // ignore outdated results + const data = { done, results: results.map((r: Law.Case) => ({...targets[0], ...r})) } - const message = { - action: Messenger.ACTION_TYPES.search, - data, - source: Messenger.TARGETS.background, - target: source, + const message = { + action: Messenger.ACTION_TYPES.search, + data, + source: Messenger.TARGETS.background, + target: source, + } + port.postMessage(message) } - Logger.log(`sending search`, message) - port.postMessage(message) - } + }) } const downloadFile = async (url: string, fileName: string) => { @@ -127,8 +117,6 @@ const handleAction = (port: Runtime.Port) => async ({ action, ...otherProperties const pdfResult = await Scraper.getPDF(law as Law.Case, doctype) if(typeof pdfResult === `string`){ const fileName = Helpers.getFileName(law, doctype) - Logger.log(`downloadPDF fileName: `, fileName) - Logger.log(`downloadPDF url: ${pdfResult}`) await downloadFile(pdfResult, fileName) } else { // downloadOptions await browser.downloads.download(pdfResult) diff --git a/src/ContentScript/Searcher/Searcher.ts b/src/ContentScript/Searcher/Searcher.ts index e5a746e..e31b147 100644 --- a/src/ContentScript/Searcher/Searcher.ts +++ b/src/ContentScript/Searcher/Searcher.ts @@ -1,7 +1,6 @@ import LawNet from './LawNet' import LexisUK from './LexisUK' import WestlawUK from './WestlawUK' -import { Logger } from '../../utils' import SearcherStorage from './SearcherStorage' const getClerkentQuery = (): string | null => { @@ -26,13 +25,6 @@ const isQueryValid = (query: string) => (query && query.length > 0) // eslint-disable-next-line sonarjs/cognitive-complexity const init = async () => { - Logger.log(`Searcher debug data`, { - host: window.location.host, - path: window.location.pathname, - query: getClerkentQuery(), - type: getClerkentType(), - }) - switch(window.location.hostname){ case `www.lawnet.sg`: case `www-lawnet-sg.lawproxy1.nus.edu.sg`: @@ -93,7 +85,6 @@ const init = async () => { } const query = getClerkentQuery() || (await SearcherStorage.getLexisUKQuery()) - Logger.log(`Get query`, query) return LexisUK.init(query) } diff --git a/src/Popup/__tests__/QueryResult.test.tsx b/src/Popup/__tests__/QueryResult.test.tsx index 5c455ed..a1ae67b 100644 --- a/src/Popup/__tests__/QueryResult.test.tsx +++ b/src/Popup/__tests__/QueryResult.test.tsx @@ -7,6 +7,7 @@ jest.mock(`Popup/hooks/useClipboard`) const useClipboardMock = useClipboard as jest.Mock const mockDownloadPDF = () => () => null +const mockUpdateResults = () => null const mockCases: Law.Case[] = [ { citation: `[1884] EWHC 2 (QB)`, @@ -39,9 +40,11 @@ describe(`QueryResult`, () => { it(`renders no cases found`, () => { const tree = render( , ) expect(tree).toMatchSnapshot() @@ -50,9 +53,11 @@ describe(`QueryResult`, () => { it(`renders loading`, () => { const treeCase = render( , ) expect(treeCase).toMatchSnapshot() @@ -61,9 +66,11 @@ describe(`QueryResult`, () => { it(`renders list of UK cases`, () => { const tree = render( , ) expect(tree).toMatchSnapshot() diff --git a/src/Popup/__tests__/__snapshots__/QueryResult.test.tsx.snap b/src/Popup/__tests__/__snapshots__/QueryResult.test.tsx.snap index 6242337..aa4813a 100644 --- a/src/Popup/__tests__/__snapshots__/QueryResult.test.tsx.snap +++ b/src/Popup/__tests__/__snapshots__/QueryResult.test.tsx.snap @@ -188,6 +188,33 @@ exports[`QueryResult renders loading 1`] = ` "asFragment": [Function], "baseElement":
+
+
+
+ Loading... +
+
+
+
+
+
+
+
+
+
+ , + "container":
+
@@ -206,25 +233,6 @@ exports[`QueryResult renders loading 1`] = `
- , - "container":
-
-
- Loading... -
-
-
-
-
-
-
-
, "debug": [Function], "findAllByAltText": [Function], diff --git a/src/Popup/components/QueryResult.tsx b/src/Popup/components/QueryResult.tsx index 71067b3..b60b2b5 100644 --- a/src/Popup/components/QueryResult.tsx +++ b/src/Popup/components/QueryResult.tsx @@ -1,37 +1,40 @@ import { useCallback, useState } from 'preact/hooks' import CaseResult from './CaseResult' -import LegislationResult from './LegislationResult' import ShowMore from './ShowMore' import AnimatedLoading from '../../components/AnimatedLoading' import type { FunctionComponent } from 'preact' +import ShowNewResultsButton from './ShowNewResultsButton' interface Props { - searchResult: (Law.Case | Law.Legislation)[], + searchResults: Law.Case[], downloadPDF: downloadPDFType, isSearching: boolean, + updatePending: boolean, + updateResults: () => void } const maxResults = 3 -// eslint-disable-next-line sonarjs/cognitive-complexity -const QueryResult: FunctionComponent = ({ searchResult, downloadPDF, isSearching }) => { +const QueryResult: FunctionComponent = ({ + searchResults, + downloadPDF, + isSearching, + updatePending, + updateResults, +}) => { const [morePressed, setMorePressed] = useState(false) const onShowMore = useCallback(() => setMorePressed(true), []) - if (isSearching){ - return - } - - if(searchResult.length === 0){ + if(!isSearching && searchResults.length === 0){ return
No cases found
} - const showMore = morePressed || searchResult.length <= maxResults + const showMore = morePressed || searchResults.length <= maxResults return (
{ - (searchResult as Law.Case[]) + (searchResults as Law.Case[]) .slice(0, showMore ? undefined : maxResults) .map((result) => ( = ({ searchResult, downloadPDF, isSe )) } { showMore ? null : } + + { + updatePending ? ( + + ) : null + } + + { + isSearching ? ( + + ) : null + }
) } diff --git a/src/Popup/components/ShowNewResultsButton.tsx b/src/Popup/components/ShowNewResultsButton.tsx new file mode 100644 index 0000000..b3d55e6 --- /dev/null +++ b/src/Popup/components/ShowNewResultsButton.tsx @@ -0,0 +1,11 @@ +const ShowNewResultsButton = ({ onClick }) => { + return ( + + ) +} + +export default ShowNewResultsButton \ No newline at end of file diff --git a/src/Popup/hooks/__tests__/useSearch.test.ts b/src/Popup/hooks/__tests__/useSearch.test.ts index 3828bd4..f4f8299 100644 --- a/src/Popup/hooks/__tests__/useSearch.test.ts +++ b/src/Popup/hooks/__tests__/useSearch.test.ts @@ -2,41 +2,44 @@ import { renderHook, act } from "@testing-library/preact" import { Constants } from "utils" import useSearch from "../useSearch" -const SEARCH_RESULTS: Law.Case[] = [ - { - citation: `[2022] EWHC 160`, - database: Constants.DATABASES.UK_bailii, - jurisdiction: Constants.JURISDICTIONS.UK.id, - links: [], - name: `Stadler v Currys Group`, - type: `case-citation`, - }, - { - citation: `[2022] EWHC 1379 (IPEC)`, - database: Constants.DATABASES.UK_bailii, - jurisdiction: Constants.JURISDICTIONS.UK.id, - links: [], - name: `Shazam Productions v Only Fools the Dining Experience`, - type: `case-citation`, - }, -] +const SEARCH_RESULTS = { + done: true, + results: [ + { + citation: `[2022] EWHC 160`, + database: Constants.DATABASES.UK_bailii, + jurisdiction: Constants.JURISDICTIONS.UK.id, + links: [], + name: `Stadler v Currys Group`, + type: `case-citation`, + }, + { + citation: `[2022] EWHC 1379 (IPEC)`, + database: Constants.DATABASES.UK_bailii, + jurisdiction: Constants.JURISDICTIONS.UK.id, + links: [], + name: `Shazam Productions v Only Fools the Dining Experience`, + type: `case-citation`, + }, + ] as Law.Case[], +} describe(`useSearch`, () => { it(`has correct initial state`, () => { const { result } = renderHook(() => useSearch()) - const { current: { isSearching, searchResult } } = result + const { current: { isSearching, searchResults } } = result expect(isSearching).toBe(false) - expect(searchResult.length).toBe(0) + expect(searchResults.length).toBe(0) }) it(`correctly sets search results`, () => { const { result } = renderHook(() => useSearch()) - const { current: { onSearchDone } } = result + const { current: { onReceiveSearchResults } } = result act(() => { - onSearchDone(SEARCH_RESULTS) + onReceiveSearchResults(SEARCH_RESULTS) }) - const { current: { searchResult } } = result - expect(searchResult).toMatchSnapshot() + const { current: { searchResults } } = result + expect(searchResults).toMatchSnapshot() }) }) \ No newline at end of file diff --git a/src/Popup/hooks/useMessenger.ts b/src/Popup/hooks/useMessenger.ts index df534a5..0dbd283 100644 --- a/src/Popup/hooks/useMessenger.ts +++ b/src/Popup/hooks/useMessenger.ts @@ -3,7 +3,7 @@ import type { Runtime } from 'webextension-polyfill-ts' import { browser } from 'webextension-polyfill-ts' import { Logger, Messenger } from 'utils' -const useMessenger = ({ onSearchDone }) => { +const useMessenger = ({ onReceiveSearchResults }) => { const port = useRef({} as Runtime.Port) const sendMessage = useCallback((message) => port.current.postMessage(message), [port]) const onMessage = useCallback((message: Messenger.Message) => { @@ -13,9 +13,9 @@ const useMessenger = ({ onSearchDone }) => { } if(message.action === Messenger.ACTION_TYPES.search){ const { data } = message - onSearchDone(data) + onReceiveSearchResults(data) } - }, [onSearchDone]) + }, [onReceiveSearchResults]) const search = useCallback((citation, inputJurisdiction) => sendMessage({ action: Messenger.ACTION_TYPES.search, diff --git a/src/Popup/hooks/usePopup.ts b/src/Popup/hooks/usePopup.ts index fe33da9..8b12354 100644 --- a/src/Popup/hooks/usePopup.ts +++ b/src/Popup/hooks/usePopup.ts @@ -14,7 +14,7 @@ const keys = { type SearchResult = Law.Case | Law.Legislation -const usePopup = ({ search, setIsSearching, setSearchResult }) => { +const usePopup = ({ search, setIsSearching, setSearchResults }) => { const [query, setQuery] = useState(``) const [lastSearchQuery, setLastSearchQuery] = useState(query) const [selectedJurisdiction, setSelectedJurisdiction] = useState(Constants.JURISDICTIONS.UK.id) @@ -29,8 +29,8 @@ const usePopup = ({ search, setIsSearching, setSearchResult }) => { Storage.set(keys.SELECTED_JURISDICTION, value) } setLastSearchQuery(``) - setSearchResult([] as SearchResult[]) - }, [setSearchResult]) + setSearchResults([] as SearchResult[]) + }, [setSearchResults]) const autosetJurisdiction = useCallback((value: string) => { const citations = Finder.findCaseCitation(value) @@ -60,7 +60,7 @@ const usePopup = ({ search, setIsSearching, setSearchResult }) => { ) => { setQuery(value) setIsSearching(false) - setSearchResult([] as SearchResult[]) + setSearchResults([] as SearchResult[]) if(debounceAutosetJurisdiction){ debouncedAutosetJurisdiction(value) } else { @@ -69,7 +69,7 @@ const usePopup = ({ search, setIsSearching, setSearchResult }) => { if(!doNotStore){ debouncedStoreQuery(value) } - }, [autosetJurisdiction, debouncedAutosetJurisdiction, debouncedStoreQuery, setIsSearching, setSearchResult]) + }, [autosetJurisdiction, debouncedAutosetJurisdiction, debouncedStoreQuery, setIsSearching, setSearchResults]) const onSearchQueryInput = useCallback((event: Event) => { const { target } = event diff --git a/src/Popup/hooks/useSearch.ts b/src/Popup/hooks/useSearch.ts index 80fdd37..7cb8595 100644 --- a/src/Popup/hooks/useSearch.ts +++ b/src/Popup/hooks/useSearch.ts @@ -1,19 +1,62 @@ -import { useState } from "preact/hooks" +import { useCallback, useMemo, useRef, useState } from "preact/hooks" const useSearch = () => { - const [isSearching, setIsSearching] = useState(false) - const [searchResult, setSearchResult] = useState([] as Law.Case[]) - const onSearchDone = (data) => { - setIsSearching(false) - setSearchResult(Array.isArray(data) ? data : [data]) - } + const [isSearching, setIsSearchingRaw] = useState(false) + const [newSearchResults, setNewSearchResults] = useState([] as Law.Case[]) + const [searchResults, setSearchResults] = useState([] as Law.Case[]) + const [initialTimerDone, setInitialTimerDone] = useState(false) + const timer = useRef(null) + + const updateResults = useCallback(() => { + if(newSearchResults.length > 0){ + setSearchResults(newSearchResults) + setNewSearchResults([]) + } + }, [newSearchResults]) + + const setIsSearching = useCallback((value: boolean) => { + setIsSearchingRaw(value) + + setInitialTimerDone(false) + if(timer?.current){ + clearTimeout(timer.current) + } + + if(value === true){ + timer.current = setTimeout(() => { + setInitialTimerDone(true) + updateResults() + }, 1000) + } + }, [updateResults]) + + const onReceiveSearchResults = useCallback((data: { done: boolean, results: Law.Case[] }) => { + const { done, results } = data + + if(done){ + setIsSearchingRaw(false) + setInitialTimerDone(true) + } + + // avoid sudden shifts in the layout + if(searchResults.length === 0 && !initialTimerDone){ + setSearchResults(results) + setNewSearchResults([]) + } else { + setNewSearchResults(results) + } + }, [searchResults.length, setIsSearchingRaw, initialTimerDone, setInitialTimerDone]) + + const updatePending = useMemo(() => (newSearchResults.length > 0), [newSearchResults]) return { isSearching, - onSearchDone, - searchResult, + onReceiveSearchResults, + searchResults, setIsSearching, - setSearchResult, + setSearchResults, + updatePending, + updateResults, } } diff --git a/src/Popup/views/DefaultSearch.tsx b/src/Popup/views/DefaultSearch.tsx index 9137885..c0d8bf3 100644 --- a/src/Popup/views/DefaultSearch.tsx +++ b/src/Popup/views/DefaultSearch.tsx @@ -16,15 +16,17 @@ import JurisdictionSelect from 'Popup/components/JurisdictionSelect' const DefaultSearch: FunctionComponent = () => { const { isSearching, - onSearchDone, - searchResult, + onReceiveSearchResults, + searchResults, setIsSearching, - setSearchResult, + setSearchResults, + updatePending, + updateResults, } = useSearch() const { search, downloadPDF, - } = useMessenger( { onSearchDone }) + } = useMessenger( { onReceiveSearchResults }) const { applyClipboardText, lastSearchQuery, @@ -37,7 +39,7 @@ const DefaultSearch: FunctionComponent = () => { } = usePopup({ search, setIsSearching, - setSearchResult, + setSearchResults, }) const inputReference = useFocusInput() @@ -68,13 +70,15 @@ const DefaultSearch: FunctionComponent = () => { ) : null } { - (!isSearching && query.length > 0 && searchResult.length === 0 && lastSearchQuery !== query) ? ( + (!isSearching && query.length > 0 && searchResults.length === 0 && lastSearchQuery !== query) ? (
Press enter to search
) : ( ) } @@ -82,7 +86,7 @@ const DefaultSearch: FunctionComponent = () => { (query.length > 0 && !isSearching) ? ( ) : null diff --git a/src/utils/Constants.ts b/src/utils/Constants.ts index 9e9ebfd..2752c3c 100644 --- a/src/utils/Constants.ts +++ b/src/utils/Constants.ts @@ -373,10 +373,16 @@ const DEFAULT_DATABASES_STATUS= { }, } +const EVENTS = { + CASE_RESULTS: `case-results`, + RAW_CASE_RESULT: `raw-case-result`, +} as const + const Constants = { COURTS, DATABASES, DEFAULT_DATABASES_STATUS, + EVENTS, INSTITUTIONAL_LOGINS, JURISDICTIONS, } diff --git a/src/utils/Finder/CaseCitationFinder/AU.ts b/src/utils/Finder/CaseCitationFinder/AU.ts index e0ce5ae..8080b42 100644 --- a/src/utils/Finder/CaseCitationFinder/AU.ts +++ b/src/utils/Finder/CaseCitationFinder/AU.ts @@ -1,6 +1,5 @@ -import Logger from 'utils/Logger' import Constants from '../../Constants' -import { formatAbbrs, sortCitationsByVolume } from './utils' +import { formatAbbrs, sortCasesByVolume } from './utils' export const AUAbbrs = [ // approximate order only @@ -141,7 +140,10 @@ export const AUAbbrs = [ { abbr: `ACLR` }, ] -export const sortAUCitations = (citationsArray: any[], attribute = null) => sortCitationsByVolume(AUAbbrs, citationsArray, attribute) +export const sortAUCases = ( + citationsArray: Law.Case[], + attribute: string, +): Law.Case[] => sortCasesByVolume(AUAbbrs, citationsArray, attribute) export const findAUCaseCitationMatches = (query: string) => { // eslint-disable-next-line unicorn/better-regex diff --git a/src/utils/Finder/CaseCitationFinder/CA.ts b/src/utils/Finder/CaseCitationFinder/CA.ts index ceb8979..de1ebdf 100644 --- a/src/utils/Finder/CaseCitationFinder/CA.ts +++ b/src/utils/Finder/CaseCitationFinder/CA.ts @@ -1,5 +1,5 @@ import Constants from '../../Constants' -import { formatAbbrs, sortCitationsByVolume } from './utils' +import { formatAbbrs, sortCasesByVolume } from './utils' export const CAAbbrs = [ { abbr: `SCR` }, @@ -51,7 +51,10 @@ export const CAAbbrs = [ { abbr: `CanLII` }, ] -export const sortCACitations = (citationsArray: any[], attribute = null) => sortCitationsByVolume(CAAbbrs, citationsArray, attribute) +export const sortCACases = ( + casesArray: Law.Case[], + attribute: string, +): Law.Case[] => sortCasesByVolume(CAAbbrs, casesArray, attribute) export const findCACaseCitationMatches = (query: string) => { // eslint-disable-next-line unicorn/better-regex diff --git a/src/utils/Finder/CaseCitationFinder/CaseCitationFinder.ts b/src/utils/Finder/CaseCitationFinder/CaseCitationFinder.ts index a455af7..888d3bd 100644 --- a/src/utils/Finder/CaseCitationFinder/CaseCitationFinder.ts +++ b/src/utils/Finder/CaseCitationFinder/CaseCitationFinder.ts @@ -1,13 +1,13 @@ -import { findUKCaseCitation, sortUKCitations } from './UK' -import { findSGCaseCitation , sortSGCitations } from './SG' -import { findNZCaseCitation, sortNZCitations } from './NZ' -import { findHKCaseCitation, sortHKCitations } from './HK' -import { findCACaseCitation, sortCACitations } from './CA' -import { findAUCaseCitation, sortAUCitations } from './AU' -import { findEUCaseCitation, sortEUCitations } from './EU' -import { findMYCaseCitation, sortMYCitations } from './MY' -import { findECHRCaseCitation, sortECHRCitations } from './ECHR' -import { findUNCaseCitation, sortUNCitations } from './UN' +import { findUKCaseCitation, sortUKCases } from './UK' +import { findSGCaseCitation , sortSGCases } from './SG' +import { findNZCaseCitation, sortNZCases } from './NZ' +import { findHKCaseCitation, sortHKCases } from './HK' +import { findCACaseCitation, sortCACases } from './CA' +import { findAUCaseCitation, sortAUCases } from './AU' +import { findEUCaseCitation, sortEUCases } from './EU' +import { findMYCaseCitation, sortMYCases } from './MY' +import { findECHRCaseCitation, sortECHRCases } from './ECHR' +import { findUNCaseCitation, sortUNCases } from './UN' const findCaseCitation = (query: string): Finder.CaseCitationFinderResult[] => { return [ @@ -35,16 +35,16 @@ const CaseCitationFinder = { findSGCaseCitation, findUKCaseCitation, findUNCaseCitation, - sortAUCitations, - sortCACitations, - sortECHRCitations, - sortEUCitations, - sortHKCitations, - sortMYCitations, - sortNZCitations, - sortSGCitations, - sortUKCitations, - sortUNCitations, + sortAUCases, + sortCACases, + sortECHRCases, + sortEUCases, + sortHKCases, + sortMYCases, + sortNZCases, + sortSGCases, + sortUKCases, + sortUNCases, } export default CaseCitationFinder \ No newline at end of file diff --git a/src/utils/Finder/CaseCitationFinder/ECHR.ts b/src/utils/Finder/CaseCitationFinder/ECHR.ts index 33a7fea..6407f95 100644 --- a/src/utils/Finder/CaseCitationFinder/ECHR.ts +++ b/src/utils/Finder/CaseCitationFinder/ECHR.ts @@ -9,10 +9,10 @@ const ECtHRRegex = new RegExp(`${ }`, `gi`) // TODO: parse ECLI -export const sortECHRCitations = ( - citationsArray: any[], - attribute = null, -) => citationsArray +export const sortECHRCases = ( + citationsArray: Law.Case[], + attribute: string, +): Law.Case[] => citationsArray export const findECHRCaseCitation = ( query: string, diff --git a/src/utils/Finder/CaseCitationFinder/EU.ts b/src/utils/Finder/CaseCitationFinder/EU.ts index 2fe8b46..8107d60 100644 --- a/src/utils/Finder/CaseCitationFinder/EU.ts +++ b/src/utils/Finder/CaseCitationFinder/EU.ts @@ -4,10 +4,10 @@ export const epoRegex = new RegExp(/\b[GJT][ _]?\d{1,4}\/\d{1,2}/) export const cjeuRegex = new RegExp(/\b[CT]-\d{1,3}\/\d{1,2}/) // TODO: parse ECLI -export const sortEUCitations = ( - citationsArray: any[], - attribute = null, -) => citationsArray +export const sortEUCases = ( + citationsArray: Law.Case[], + attribute: string, +): Law.Case[] => citationsArray export const findEUCaseCitation = ( query: string, diff --git a/src/utils/Finder/CaseCitationFinder/HK.ts b/src/utils/Finder/CaseCitationFinder/HK.ts index c0b78d0..80b7b5c 100644 --- a/src/utils/Finder/CaseCitationFinder/HK.ts +++ b/src/utils/Finder/CaseCitationFinder/HK.ts @@ -1,5 +1,5 @@ import Constants from '../../Constants' -import { formatAbbrs, sortCitationsByVolume } from './utils' +import { formatAbbrs, sortCasesByVolume } from './utils' export const HKAbbrs =[ { abbr: `HKCFA` }, @@ -18,7 +18,10 @@ export const HKAbbrs =[ { abbr: `HKMagC` }, ] -export const sortHKCitations = (citationsArray: any[], attribute = null) => sortCitationsByVolume(HKAbbrs, citationsArray, attribute) +export const sortHKCases = ( + citationsArray: Law.Case[], + attribute: string, +): Law.Case[] => sortCasesByVolume(HKAbbrs, citationsArray, attribute) export const findHKCaseCitationMatches = (query: string) => { // eslint-disable-next-line unicorn/better-regex diff --git a/src/utils/Finder/CaseCitationFinder/MY.ts b/src/utils/Finder/CaseCitationFinder/MY.ts index 5cf634b..c5d3c72 100644 --- a/src/utils/Finder/CaseCitationFinder/MY.ts +++ b/src/utils/Finder/CaseCitationFinder/MY.ts @@ -1,5 +1,5 @@ import Constants from '../../Constants' -import { formatAbbrs, sortCitationsByVolume } from './utils' +import { formatAbbrs, sortCasesByVolume } from './utils' export const MYAbbrs = [ { abbr: `MYFC` }, @@ -12,7 +12,10 @@ export const MYAbbrs = [ { abbr: `CLJ` }, ] -export const sortMYCitations = (citationsArray: any[], attribute = null) => sortCitationsByVolume( +export const sortMYCases = ( + citationsArray: Law.Case[], + attribute: string, +): Law.Case[] => sortCasesByVolume( MYAbbrs, citationsArray, attribute, diff --git a/src/utils/Finder/CaseCitationFinder/NZ.ts b/src/utils/Finder/CaseCitationFinder/NZ.ts index 6d70839..3bc0a57 100644 --- a/src/utils/Finder/CaseCitationFinder/NZ.ts +++ b/src/utils/Finder/CaseCitationFinder/NZ.ts @@ -1,5 +1,5 @@ import Constants from '../../Constants' -import { formatAbbrs, sortCitationsByVolume } from './utils' +import { formatAbbrs, sortCasesByVolume } from './utils' export const NZAbbrs = [ { abbr: `NZSC` }, @@ -15,7 +15,10 @@ export const NZAbbrs = [ { abbr: `NZDC` }, ] -export const sortNZCitations = (citationsArray: any[], attribute = null) => sortCitationsByVolume( +export const sortNZCases = ( + citationsArray: Law.Case[], + attribute: string, +): Law.Case[] => sortCasesByVolume( NZAbbrs, citationsArray, attribute, diff --git a/src/utils/Finder/CaseCitationFinder/SG.ts b/src/utils/Finder/CaseCitationFinder/SG.ts index 0c2e5cd..9ebc067 100644 --- a/src/utils/Finder/CaseCitationFinder/SG.ts +++ b/src/utils/Finder/CaseCitationFinder/SG.ts @@ -1,5 +1,5 @@ import Constants from '../../Constants' -import { formatAbbrs, sortCitationsByVolume } from './utils' +import { formatAbbrs, sortCasesByVolume, sortCitationsByVolume } from './utils' import { SGSTBlongFormatRegex } from 'utils/scraper/SG/STB' export const SGSCAbbrs = [ @@ -15,6 +15,8 @@ export const neutralSGAbbrs = [ { abbr: `SGCCS` }, { abbr: `SGCRT` }, { abbr: `SGDC` }, + { abbr: `SGFC` }, + { abbr: `SGYC` }, { abbr: `SGDSC` }, { abbr: `SGIAC` }, { abbr: `SGIPOS` }, @@ -36,9 +38,12 @@ export const SGAbbrs = [ { abbr: `MLJ` }, ] -export const sortSGCitations = (citationsArray: string[], attribute = null) => sortCitationsByVolume( +export const sortSGCases = ( + citationsArray: Law.Case[], + attribute: string, +): Law.Case[] => sortCasesByVolume( SGAbbrs, - citationsArray, + citationsArray, attribute, ) diff --git a/src/utils/Finder/CaseCitationFinder/UK.ts b/src/utils/Finder/CaseCitationFinder/UK.ts index 92a9fb8..bed4d8f 100644 --- a/src/utils/Finder/CaseCitationFinder/UK.ts +++ b/src/utils/Finder/CaseCitationFinder/UK.ts @@ -1,5 +1,5 @@ import Constants from '../../Constants' -import { formatAbbrs, sortCitationsByVolume } from './utils' +import { formatAbbrs, sortCasesByVolume } from './utils' const UKAbbrs = [ { abbr: `UKSC` }, @@ -52,7 +52,10 @@ const UKAbbrs = [ { abbr: `CLC` }, ] -export const sortUKCitations = (citationsArray: any[], attribute = null) => sortCitationsByVolume( +export const sortUKCases = ( + citationsArray: Law.Case[], + attribute: string, +): Law.Case[] => sortCasesByVolume( UKAbbrs, citationsArray, attribute, @@ -82,14 +85,14 @@ export const findUKCaseCitationMatches = (query: string) => { } const formatUKIPOYear = (shortYear: string) => { - const shortYearNumber = Number.parseInt(shortYear) + const shortYearNumber = Number.parseInt(shortYear, 10) return shortYearNumber > 90 ? `19${shortYear}` : `20${shortYear}` } export const findUKCaseCitation = (query:string): Finder.CaseCitationFinderResult[] => { const matches = findUKCaseCitationMatches(query) if (matches.length > 0) { - return sortUKCitations( + return sortUKCases( matches.map((match) => { const abbr = match.groups.ukipo ? `UKIPO` @@ -102,14 +105,15 @@ export const findUKCaseCitation = (query:string): Finder.CaseCitationFinderResul return { abbr, citation: match[0], + court: abbr, index: match.index, jurisdiction: Constants.JURISDICTIONS.UK.id, type: `case-citation`, year, - } + } as unknown as Law.Case }), `abbr`, - ) + ) as unknown as Finder.CaseCitationFinderResult[] } return [] } \ No newline at end of file diff --git a/src/utils/Finder/CaseCitationFinder/UN.ts b/src/utils/Finder/CaseCitationFinder/UN.ts index b3ad322..007aee5 100644 --- a/src/utils/Finder/CaseCitationFinder/UN.ts +++ b/src/utils/Finder/CaseCitationFinder/UN.ts @@ -1,9 +1,9 @@ import Constants from '../../Constants' -export const sortUNCitations = ( - citationsArray: any[], - attribute = null, -) => citationsArray +export const sortUNCases = ( + citationsArray: Law.Case[], + attribute: string, +): Law.Case[] => citationsArray export const findUNCaseCitation = ( query: string, diff --git a/src/utils/Finder/CaseCitationFinder/utils.ts b/src/utils/Finder/CaseCitationFinder/utils.ts index 32773a6..bfb133d 100644 --- a/src/utils/Finder/CaseCitationFinder/utils.ts +++ b/src/utils/Finder/CaseCitationFinder/utils.ts @@ -1,4 +1,9 @@ -export const formatAbbr = ({ abbr, appendum = null }) => { +import Logger from "utils/Logger" + +export const formatAbbr = ( + { abbr, appendum = null }: + { abbr: string, appendum?: string }, +) => { const end = appendum || `` return `${abbr .split(``) @@ -10,25 +15,46 @@ export const formatAbbr = ({ abbr, appendum = null }) => { }${end}` } -export const formatAbbrs = (abbrArray) => abbrArray.map(({ abbr, appendum }) => formatAbbr({ abbr, appendum})).join(`|`) +export const formatAbbrs = ( + abbrArray: { abbr: string, appendum?: string }[], +) => abbrArray.map( + ({ abbr, appendum }) => formatAbbr({ abbr, appendum}), +).join(`|`) export const cleanVolume = (volumeString: string) => volumeString.replace(/\./g, ``).toLowerCase().trim() -export const sortCitationsByVolume = (abbrsList, citationsArray: string[], attribute = null) => { - const lastIfNotFound = (index: number) => index === -1 ? citationsArray.length + 1 : index - if(attribute === null){ - return citationsArray.sort((a, b) => { - const indexA = lastIfNotFound( - abbrsList.findIndex(currentAbbr => new RegExp(formatAbbr(currentAbbr), `i`).test(a)), - ) - const indexB = lastIfNotFound( - abbrsList.findIndex(currentAbbr => new RegExp(formatAbbr(currentAbbr), `i`).test(b)), - ) - return indexA - indexB - }) - } - return sortCitationsByVolume( +export const sortCitationsByVolume = ( + abbrsList: { abbr: string, appendum?: string }[], + citationsArray: string[], +): string[] => { + const lastIfNotFound = (index: number) => ( + index === -1 + ? citationsArray.length + 1 + : index + ) + return citationsArray.sort((a, b) => { + const indexA = lastIfNotFound( + abbrsList.findIndex( + currentAbbr => new RegExp( + formatAbbr(currentAbbr), + `i`, + ).test(a), + ), + ) + const indexB = lastIfNotFound( + abbrsList.findIndex(currentAbbr => + new RegExp(formatAbbr(currentAbbr), `i`).test(b), + ), + ) + return indexA - indexB + }) +} + +export const sortCasesByVolume = ( + abbrsList: { abbr: string, appendum?: string }[], + citationsArray: Law.Case[], + attribute = `citation`, +): Law.Case[] => sortCitationsByVolume( abbrsList, - citationsArray.map(c => c[attribute]), - ).map(c => citationsArray.find(v => v[attribute] === c)) -} \ No newline at end of file + (citationsArray).map(c => c[attribute]), + ).map(c => (citationsArray).find(v => v[attribute] === c)) \ No newline at end of file diff --git a/src/utils/Finder/Finder.ts b/src/utils/Finder/Finder.ts index af4191f..a6c6b1d 100644 --- a/src/utils/Finder/Finder.ts +++ b/src/utils/Finder/Finder.ts @@ -20,7 +20,6 @@ const findCase = Memoize((citation: string): Finder.FinderResult[] => { const Finder = { findCase, findCaseCitation: CaseCitationFinder.findCaseCitation, - // findLegislation: LegislationFinder.findLegislation, } export default Finder \ No newline at end of file diff --git a/src/utils/Finder/__tests__/__snapshots__/CaseCitationFinder.test.ts.snap b/src/utils/Finder/__tests__/__snapshots__/CaseCitationFinder.test.ts.snap index c44dc11..1879c2a 100644 --- a/src/utils/Finder/__tests__/__snapshots__/CaseCitationFinder.test.ts.snap +++ b/src/utils/Finder/__tests__/__snapshots__/CaseCitationFinder.test.ts.snap @@ -187,6 +187,7 @@ exports[` 15`] = ` { "abbr": "Ves Sen", "citation": "(1754) 2 Ves Sen 547", + "court": "Ves Sen", "index": 0, "jurisdiction": "UK", "type": "case-citation", @@ -200,6 +201,7 @@ exports[` 16`] = ` { "abbr": "All ER", "citation": "[1843-60] All ER 249", + "court": "All ER", "index": 0, "jurisdiction": "UK", "type": "case-citation", @@ -213,6 +215,7 @@ exports[` 17`] = ` { "abbr": "KB", "citation": "[1948] 1 KB 223", + "court": "KB", "index": 0, "jurisdiction": "UK", "type": "case-citation", @@ -226,6 +229,7 @@ exports[` 18`] = ` { "abbr": "QB", "citation": "[1965] 1 QB 456", + "court": "QB", "index": 0, "jurisdiction": "UK", "type": "case-citation", @@ -239,6 +243,7 @@ exports[` 19`] = ` { "abbr": "Cr App R", "citation": "(1951) 35 Cr App R 164", + "court": "Cr App R", "index": 0, "jurisdiction": "UK", "type": "case-citation", @@ -252,6 +257,7 @@ exports[` 20`] = ` { "abbr": "UKHL", "citation": "[2007] UKHL 17", + "court": "UKHL", "index": 0, "jurisdiction": "UK", "type": "case-citation", @@ -265,6 +271,7 @@ exports[` 21`] = ` { "abbr": "UKIPO", "citation": "O/328/22", + "court": "UKIPO", "index": 0, "jurisdiction": "UK", "type": "case-citation", @@ -278,6 +285,7 @@ exports[` 22`] = ` { "abbr": "UKIPO", "citation": "O/002/22", + "court": "UKIPO", "index": 0, "jurisdiction": "UK", "type": "case-citation", @@ -291,6 +299,7 @@ exports[` 23`] = ` { "abbr": "UKIPO", "citation": "O01422", + "court": "UKIPO", "index": 0, "jurisdiction": "UK", "type": "case-citation", @@ -304,6 +313,7 @@ exports[` 24`] = ` { "abbr": "UKIPO", "citation": "BLO/555/22", + "court": "UKIPO", "index": 0, "jurisdiction": "UK", "type": "case-citation", @@ -317,6 +327,7 @@ exports[` 25`] = ` { "abbr": "EWHC", "citation": "[2021] EWHC 2168", + "court": "EWHC", "index": 0, "jurisdiction": "UK", "type": "case-citation", @@ -330,6 +341,7 @@ exports[` 26`] = ` { "abbr": "EWHC", "citation": "[2016] EWHC 3151", + "court": "EWHC", "index": 0, "jurisdiction": "UK", "type": "case-citation", @@ -343,6 +355,7 @@ exports[` 27`] = ` { "abbr": "ECDR", "citation": "[2001] ECDR 5", + "court": "ECDR", "index": 0, "jurisdiction": "UK", "type": "case-citation", diff --git a/src/utils/Helpers.ts b/src/utils/Helpers.ts index 08102de..e49aad0 100644 --- a/src/utils/Helpers.ts +++ b/src/utils/Helpers.ts @@ -22,7 +22,7 @@ const isCitationValid = (citation: string) => ( typeof citation === `string` && citation.length > 0 ) -const uniqueBy = (array: any[], attribute: string) => [ +const uniqueBy = (array: T[], attribute: string): T[] => [ ...new Set(array.map(r => r[attribute])), ].map(((attribute_) => array.find((c) => c[attribute] === attribute_))) diff --git a/src/utils/Request.ts b/src/utils/Request.ts index 88f6002..d3dc2db 100644 --- a/src/utils/Request.ts +++ b/src/utils/Request.ts @@ -8,7 +8,6 @@ const request = setupCache( timeout: 10_000, }), { - interpretHeader: false, methods: [`get`, `post`], storage, ttl: 1000 * 60 * 60, // an hour diff --git a/src/utils/scraper/AU/AU.ts b/src/utils/scraper/AU/AU.ts index 7577dfd..9053094 100644 --- a/src/utils/scraper/AU/AU.ts +++ b/src/utils/scraper/AU/AU.ts @@ -1,10 +1,8 @@ import austlii from './austlii' import Common from '../common' -import Logger from '../../Logger' import Constants from '../../Constants' -import { findAUCaseCitation, sortAUCitations } from '../../Finder/CaseCitationFinder/AU' -import Helpers from '../../Helpers' -import { sortByName, databaseUseJurisdiction, databaseUseDatabase } from '../utils' +import { findAUCaseCitation, sortAUCases } from '../../Finder/CaseCitationFinder/AU' +import { databaseUseJurisdiction, databaseUseDatabase, makeEventTarget } from '../utils' import CommonLII from '../common/CommonLII' import QueenslandJudgments from './QueenslandJudgments' import QueenslandSCL from './QueenslandSCL' @@ -19,32 +17,20 @@ const databaseUseQueenslandSCL = databaseUseDatabase(`queensland_scl`, databaseU const databaseUseNSWCaseLaw = databaseUseDatabase(`nsw_caselaw`, databaseUseAU) const databaseUseVictoriaLawLibrary = databaseUseDatabase(`victoria_lawlibrary`, databaseUseAU) -const getCaseByName = async (caseName: string): Promise => { - try { - const results = (await Promise.allSettled([ - databaseUseQueenslandJudgments(() => QueenslandJudgments.getCaseByName(caseName)), - databaseUseQueenslandSCL(() => QueenslandSCL.getCaseByName(caseName)), - databaseUseNSWCaseLaw(() => NSWCaseLaw.getCaseByName(caseName)), - databaseUseVictoriaLawLibrary(() => VictoriaLawLibrary.getCaseByName(caseName)), - databaseUseAustLII(() => austlii.getCaseByName(caseName)), - databaseUseCommonLII(() => CommonLII.getCaseByName(caseName)), - ])) - .filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.AU.id) - - return sortByName( - caseName, - sortAUCitations( - Helpers.uniqueBy(results, `citation`), - `citation`, - ), - ) - } catch (error) { - Logger.error(error) - } - return [] -} +const getCaseByName = (caseName: string): EventTarget => makeEventTarget( + caseName, + [ + databaseUseQueenslandJudgments(() => QueenslandJudgments.getCaseByName(caseName)), + databaseUseQueenslandSCL(() => QueenslandSCL.getCaseByName(caseName)), + databaseUseNSWCaseLaw(() => NSWCaseLaw.getCaseByName(caseName)), + databaseUseVictoriaLawLibrary(() => VictoriaLawLibrary.getCaseByName(caseName)), + databaseUseAustLII(() => austlii.getCaseByName(caseName)), + databaseUseCommonLII(() => CommonLII.getCaseByName(caseName)), + ], + `AU`, + sortAUCases, + true, +) const getApplicableDatabases = (citation: string) => { const [{ abbr }] = findAUCaseCitation(citation) @@ -129,23 +115,13 @@ const getApplicableDatabases = (citation: string) => { } } -const getCaseByCitation = async (citation: string, court: string): Promise => { - try { - const results = (await Promise.allSettled( - getApplicableDatabases(citation), - )).filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.AU.id) - - return sortAUCitations( - Helpers.uniqueBy(results, `citation`), - `citation`, - ) - } catch (error){ - Logger.error(error) - } - return [] -} +const getCaseByCitation = (citation: string): EventTarget => makeEventTarget( + citation, + getApplicableDatabases(citation), + `AU`, + sortAUCases, + false, +) const databaseMap = { [Constants.DATABASES.AU_austlii.id]: austlii, diff --git a/src/utils/scraper/AU/NSWCaseLaw.ts b/src/utils/scraper/AU/NSWCaseLaw.ts index 1f0ed3e..df7d26b 100644 --- a/src/utils/scraper/AU/NSWCaseLaw.ts +++ b/src/utils/scraper/AU/NSWCaseLaw.ts @@ -5,6 +5,7 @@ import Constants from 'utils/Constants' import Helpers from 'utils/Helpers' import { findCitation } from '../utils' import { findAUCaseCitation } from 'utils/Finder/CaseCitationFinder/AU' +import { CacheRequestConfig } from 'axios-cache-interceptor' const DOMAIN = `https://www.caselaw.nsw.gov.au` @@ -89,7 +90,7 @@ const getCaseByCitation = async (citation: string): Promise => { }, ), }, - }, + } as CacheRequestConfig, ) return parseCaseResults(data) } @@ -112,7 +113,7 @@ const getCaseByName = async (caseName: string): Promise => { }, ), }, - }, + } as CacheRequestConfig, ) return parseCaseResults(data) } diff --git a/src/utils/scraper/AU/QueenslandJudgments.ts b/src/utils/scraper/AU/QueenslandJudgments.ts index 3eb3eb3..da457b1 100644 --- a/src/utils/scraper/AU/QueenslandJudgments.ts +++ b/src/utils/scraper/AU/QueenslandJudgments.ts @@ -4,6 +4,7 @@ import Constants from 'utils/Constants' import Helpers from 'utils/Helpers' import { findCitation } from '../utils' import { findAUCaseCitation } from 'utils/Finder/CaseCitationFinder/AU' +import { CacheRequestConfig } from 'axios-cache-interceptor' const DOMAIN = `https://www.queenslandjudgments.com.au` @@ -46,7 +47,7 @@ const getCaseByCitation = async (citation: string): Promise => { requestSource: `quickCitationSearch`, tab: `citation`, }, - }, + } as CacheRequestConfig, ) return parseCaseResults(data) } @@ -60,7 +61,7 @@ const getCaseByName = async (caseName: string): Promise => { requestSource: `quickCaseNameSearch`, tab: `case-name`, }, - }, + } as CacheRequestConfig, ) return parseCaseResults(data) } diff --git a/src/utils/scraper/AU/QueenslandSCL.ts b/src/utils/scraper/AU/QueenslandSCL.ts index b7f6ea5..a23e373 100644 --- a/src/utils/scraper/AU/QueenslandSCL.ts +++ b/src/utils/scraper/AU/QueenslandSCL.ts @@ -2,6 +2,7 @@ import * as cheerio from 'cheerio' import Request from 'utils/Request' import Constants from 'utils/Constants' import Helpers from 'utils/Helpers' +import { CacheRequestConfig } from 'axios-cache-interceptor' const API_DOMAIN = `https://api.sclqld.org.au` const DOMAIN = `https://www.sclqld.org.au` @@ -63,7 +64,7 @@ const getCaseByCitation = async (citation: string): Promise => { ...defaultParameters, c: citation, }, - }, + } as CacheRequestConfig, ) return parseCaseResults(data) } @@ -76,7 +77,7 @@ const getCaseByName = async (caseName: string): Promise => { ...defaultParameters, pt: caseName, }, - }, + } as CacheRequestConfig, ) return parseCaseResults(data) } diff --git a/src/utils/scraper/AU/VictoriaLawLibrary.ts b/src/utils/scraper/AU/VictoriaLawLibrary.ts index 6264ed6..2805991 100644 --- a/src/utils/scraper/AU/VictoriaLawLibrary.ts +++ b/src/utils/scraper/AU/VictoriaLawLibrary.ts @@ -1,3 +1,4 @@ +import { CacheRequestConfig } from 'axios-cache-interceptor' import * as cheerio from 'cheerio' import Constants from 'utils/Constants' import { findAUCaseCitation } from 'utils/Finder/CaseCitationFinder/AU' @@ -40,7 +41,7 @@ const getCaseByCitation = async (citation: string): Promise => { params: { keywords: citation, }, - }, + } as CacheRequestConfig, ) return parseCaseResults(data) } @@ -52,7 +53,7 @@ const getCaseByName = async (caseName: string): Promise => { params: { keywords: caseName, }, - }, + } as CacheRequestConfig, ) return parseCaseResults(data) } diff --git a/src/utils/scraper/AU/austlii.ts b/src/utils/scraper/AU/austlii.ts index 0ae45ed..d0be99d 100644 --- a/src/utils/scraper/AU/austlii.ts +++ b/src/utils/scraper/AU/austlii.ts @@ -6,6 +6,7 @@ import { findAUCaseCitation } from '../../Finder/CaseCitationFinder/AU' import type { AxiosResponse } from 'axios' import Logger from '../../Logger' import { findCitation } from '../utils' +import { CacheRequestConfig } from 'axios-cache-interceptor' const DOMAIN = `http://www8.austlii.edu.au` @@ -42,7 +43,7 @@ const getCaseByCitation = async (citation: string): Promise => { method: `auto`, query: citation, }, - }, + } as CacheRequestConfig, ) return parseCaseData(data) @@ -57,7 +58,7 @@ const getCaseByName = async (caseName: string): Promise => { method: `auto`, query: caseName, }, - }, + } as CacheRequestConfig, ) return parseCaseData(data) diff --git a/src/utils/scraper/CA/CA.ts b/src/utils/scraper/CA/CA.ts index b8cfc23..68024e6 100644 --- a/src/utils/scraper/CA/CA.ts +++ b/src/utils/scraper/CA/CA.ts @@ -1,56 +1,34 @@ import canlii from './canlii' import Common from '../common' -import Logger from '../../Logger' import Constants from '../../Constants' -import { sortCACitations } from '../../Finder/CaseCitationFinder/CA' -import Helpers from '../../Helpers' -import { databaseUseDatabase, databaseUseJurisdiction, sortByName } from '../utils' +import { sortCACases } from '../../Finder/CaseCitationFinder/CA' +import { databaseUseDatabase, databaseUseJurisdiction, makeEventTarget } from '../utils' const databaseUseCA = databaseUseJurisdiction(`CA`) const databaseUseCanlii = databaseUseDatabase(`canlii`, databaseUseCA) const databaseUseCommonLII = databaseUseDatabase(`commonlii`, databaseUseCA) -const getCaseByName = async (caseName: string): Promise => { - try { - const results = (await Promise.allSettled([ - databaseUseCanlii(() => canlii.getCaseByName(caseName)), - databaseUseCommonLII(() => Common.CommonLII.getCaseByName(caseName, Constants.JURISDICTIONS.CA.name)), - ])) - .filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.CA.id) - - return sortByName( - caseName, - sortCACitations( - Helpers.uniqueBy(results, `citation`), - `citation`, - ), - ) - } catch (error) { - Logger.error(error) - } - return [] -} - -const getCaseByCitation = async (citation: string, court: string): Promise => { - try { - const results = (await Promise.allSettled([ - databaseUseCanlii(() => canlii.getCaseByCitation(citation)), - databaseUseCommonLII(() => Common.CommonLII.getCaseByCitation(citation)), - ])).filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.CA.id) - - return sortCACitations( - Helpers.uniqueBy(results, `citation`), - `citation`, - ) - } catch (error){ - Logger.error(error) - } - return [] -} +const getCaseByName = (caseName: string): EventTarget => makeEventTarget( + caseName, + [ + databaseUseCanlii(() => canlii.getCaseByName(caseName)), + databaseUseCommonLII(() => Common.CommonLII.getCaseByName(caseName, Constants.JURISDICTIONS.CA.name)), + ], + `CA`, + sortCACases, + true, +) + +const getCaseByCitation = (citation: string ): EventTarget => makeEventTarget( + citation, + [ + databaseUseCanlii(() => canlii.getCaseByCitation(citation)), + databaseUseCommonLII(() => Common.CommonLII.getCaseByCitation(citation)), + ], + `CA`, + sortCACases, + false, +) const databaseMap = { [Constants.DATABASES.CA_canlii.id]: canlii, diff --git a/src/utils/scraper/CA/canlii.ts b/src/utils/scraper/CA/canlii.ts index c8619e5..b20d9f7 100644 --- a/src/utils/scraper/CA/canlii.ts +++ b/src/utils/scraper/CA/canlii.ts @@ -8,6 +8,7 @@ import type { AxiosResponse } from 'axios' import Logger from '../../Logger' import PDF from '../../PDF' import { findCitation } from '../utils' +import { CacheRequestConfig } from 'axios-cache-interceptor' const DOMAIN = `https://www.canlii.org` @@ -47,7 +48,7 @@ const getCaseByCitation = async (citation: string): Promise => { headers: { 'X-Requested-With': `XMLHttpRequest`, }, - }, + } as unknown as CacheRequestConfig, ) return parseCase(data) @@ -60,7 +61,7 @@ const getCaseByName = async (caseName: string): Promise => { headers: { 'X-Requested-With': `XMLHttpRequest`, }, - }, + } as unknown as CacheRequestConfig, ) return parseCase(data) diff --git a/src/utils/scraper/ECHR/ECHR.ts b/src/utils/scraper/ECHR/ECHR.ts index 69aaa28..192fd07 100644 --- a/src/utils/scraper/ECHR/ECHR.ts +++ b/src/utils/scraper/ECHR/ECHR.ts @@ -1,62 +1,33 @@ import HUDOC from './HUDOC' import Constants from '../../Constants' -import Helpers from '../../Helpers' -import Logger from '../../Logger' -import { databaseUseDatabase, databaseUseJurisdiction, sortByName } from '../utils' -import { sortECHRCitations } from 'utils/Finder/CaseCitationFinder/ECHR' +import { databaseUseDatabase, databaseUseJurisdiction, makeEventTarget } from '../utils' +import { sortECHRCases } from 'utils/Finder/CaseCitationFinder/ECHR' const databaseUseECHR = databaseUseJurisdiction(`ECHR`) const databaseUseHUDOC = databaseUseDatabase(`hudoc`, databaseUseECHR) -const getLegislation = () => null - -const getCaseByName = async (caseName: string): Promise => { - try { - const results = (await Promise.allSettled([ - databaseUseHUDOC(() => HUDOC.getCaseByName(caseName)), - ])) - .filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ - jurisdiction, - }) => ( - jurisdiction === Constants.JURISDICTIONS.ECHR.id - )) - - return sortByName( - caseName, - Helpers.uniqueBy(results, `citation`), - ) - } catch (error) { - Logger.error(error) - } - return [] -} - -const getCaseByCitation = async ( +const getCaseByName = (caseName: string): EventTarget => makeEventTarget( + caseName, + [ + databaseUseHUDOC(() => HUDOC.getCaseByName(caseName)), + ], + `ECHR`, + sortECHRCases, + true, +) + +const getCaseByCitation = ( citation: string, - court: string, -): Promise => { - const applicableDatabases = [ +): EventTarget => makeEventTarget( + citation, + [ databaseUseHUDOC(() => HUDOC.getCaseByCitation(citation)), - ] - - try { - const results = (await Promise.allSettled(applicableDatabases)) - .filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.SG.id) - - return sortECHRCitations( - Helpers.uniqueBy(results, `citation`), - `citation`, - ) - } catch (error) { - Logger.error(error) - } - return [] -} + ], + `ECHR`, + sortECHRCases, + false, +) const databaseMap = { [Constants.DATABASES.ECHR_hudoc.id]: HUDOC, @@ -73,7 +44,6 @@ const getPDF = async ( const ECHR = { getCaseByCitation, getCaseByName, - getLegislation, getPDF, } diff --git a/src/utils/scraper/ECHR/HUDOC.ts b/src/utils/scraper/ECHR/HUDOC.ts index c660b75..32263d3 100644 --- a/src/utils/scraper/ECHR/HUDOC.ts +++ b/src/utils/scraper/ECHR/HUDOC.ts @@ -1,4 +1,5 @@ import { AxiosRequestConfig } from 'axios' +import { CacheRequestConfig } from 'axios-cache-interceptor' import Constants from '../../Constants' import Request from '../../Request' @@ -78,7 +79,7 @@ const getCaseByCitation = async (citation: string): Promise => { `${DOMAIN}/app/query/results`, { params: craftHUDOCParameters(citation), - }, + } as CacheRequestConfig, ) return await parseCaseData(data) } @@ -88,7 +89,7 @@ const getCaseByName = async (caseName: string): Promise => { `${DOMAIN}/app/query/results`, { params: craftHUDOCParameters(caseName), - }, + } as CacheRequestConfig, ) return await parseCaseData(data) } diff --git a/src/utils/scraper/EU/CURIA.ts b/src/utils/scraper/EU/CURIA.ts index a89d940..88d0a60 100644 --- a/src/utils/scraper/EU/CURIA.ts +++ b/src/utils/scraper/EU/CURIA.ts @@ -6,6 +6,7 @@ import { findEUCaseCitation } from '../../Finder/CaseCitationFinder/EU' import Helpers from '../../Helpers' import Logger from '../../Logger' import { findCitation } from '../utils' +import { CacheRequestConfig } from 'axios-cache-interceptor' const DOMAIN = `https://curia.europa.eu` @@ -134,13 +135,11 @@ const parseCaseData = async (data: AxiosResponse[`data`]): Promise = if(caseResult.links.length === 1){ // only summary try { const additionalLinks = await scrapeDocumentsPage(caseResult) - console.log(`additionalLinks`, additionalLinks) if(additionalLinks.length > 0){ results[index].links = [ ...results[index].links, ...additionalLinks, ] - console.log(`added`, results[index].links) } } catch (error) { Logger.error(error) @@ -158,7 +157,7 @@ const getCaseByCitation = async (citation: string): Promise => { params: { num: citation, }, - }) + } as CacheRequestConfig) return await parseCaseData(data) } @@ -170,7 +169,7 @@ const getCaseByName = async (caseName: string): Promise => { params: { parties: caseName, }, - }) + } as CacheRequestConfig) return await parseCaseData(data) } diff --git a/src/utils/scraper/EU/EPO.ts b/src/utils/scraper/EU/EPO.ts index 1eda933..bdf47f8 100644 --- a/src/utils/scraper/EU/EPO.ts +++ b/src/utils/scraper/EU/EPO.ts @@ -2,6 +2,8 @@ import Request from '../../Request' import Constants from '../../Constants' import Helpers from '../../Helpers' import Logger from '../../Logger' +import { AxiosRequestHeaders } from 'axios' +import { CacheRequestConfig } from 'axios-cache-interceptor' const DOMAIN = `https://www.epo.org` @@ -96,7 +98,7 @@ const getCaseByCitation = async (citation: string): Promise => { headers: { 'X-Requested-With': `XMLHttpRequest`, }, - }, + } as unknown as CacheRequestConfig, ) const { diff --git a/src/utils/scraper/EU/EU.ts b/src/utils/scraper/EU/EU.ts index d997cac..ab46f08 100644 --- a/src/utils/scraper/EU/EU.ts +++ b/src/utils/scraper/EU/EU.ts @@ -1,61 +1,34 @@ import CURIA from './CURIA' import EPO from './EPO' -import EURLex from './EURLex' import Constants from '../../Constants' -import Helpers from '../../Helpers' -import Logger from '../../Logger' -import { databaseUseDatabase, databaseUseJurisdiction, sortByName } from '../utils' -import { sortEUCitations } from 'utils/Finder/CaseCitationFinder/EU' +import { databaseUseDatabase, databaseUseJurisdiction, makeEventTarget } from '../utils' +import { sortEUCases } from 'utils/Finder/CaseCitationFinder/EU' const databaseUseEU = databaseUseJurisdiction(`EU`) const databaseUseCURIA = databaseUseDatabase(`curia`, databaseUseEU) const databaseUseEPO = databaseUseDatabase(`epo`, databaseUseEU) -const getLegislation = EURLex.getLegislation - -const getCaseByName = async (caseName: string): Promise => { - try { - const results = (await Promise.allSettled([ - databaseUseCURIA(() => CURIA.getCaseByName(caseName)), - ])) - .filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.EU.id) - - return sortByName( - caseName, - Helpers.uniqueBy(results, `citation`), - ) - } catch (error) { - Logger.error(error) - } - return [] -} - -const getCaseByCitation = async (citation: string, court: string): Promise => { - let applicableDatabases = [] - Logger.log(`EU getCaseByCitation`, citation, court) - applicableDatabases = court === `EPO` ? [ - databaseUseEPO(() => EPO.getCaseByCitation(citation)), - ] : [ - databaseUseCURIA(() => CURIA.getCaseByCitation(citation)), - ] - - try { - const results = (await Promise.allSettled(applicableDatabases)) - .filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.EU.id) - - return sortEUCitations( - Helpers.uniqueBy(results, `citation`), - `citation`, - ) - } catch (error) { - Logger.error(error) - } - return [] -} +const getCaseByName = (caseName: string): EventTarget => makeEventTarget( + caseName, + [ + databaseUseCURIA(() => CURIA.getCaseByName(caseName)), + ], + `EU`, + sortEUCases, + true, +) + +const getCaseByCitation = (citation: string, court: string): EventTarget => makeEventTarget( + citation, + court === `EPO` ? [ + databaseUseEPO(() => EPO.getCaseByCitation(citation)), + ] : [ + databaseUseCURIA(() => CURIA.getCaseByCitation(citation)), + ], + `EU`, + sortEUCases, + false, +) const databaseMap = { [Constants.DATABASES.EU_curia.id]: CURIA, @@ -70,7 +43,6 @@ const getPDF = async (inputCase: Law.Case, inputDocumentType: Law.Link[`doctype` const EU = { getCaseByCitation, getCaseByName, - getLegislation, getPDF, } diff --git a/src/utils/scraper/EU/EURLex.ts b/src/utils/scraper/EU/EURLex.ts deleted file mode 100644 index e32cc84..0000000 --- a/src/utils/scraper/EU/EURLex.ts +++ /dev/null @@ -1,78 +0,0 @@ -import Request from '../../Request' -import * as cheerio from 'cheerio' -import Logger from '../../Logger' -import Constants from '../../Constants' - -const DOMAIN = `https://eur-lex.europa.eu` - -interface StatuteResult { - name: string, - links: Law.Legislation[`links`] -} - -const getStatute = async (statuteName: string): Promise => { - const { data } = await Request.get(`${DOMAIN}/search.html`, { - params: { - lang: `en`, - scope: `EURLEX`, - text: statuteName, - type: `quick`, - }, - }) - const $ = cheerio.load(data) - return $(`.EurlexContent .SearchResult`).map((_, element): StatuteResult => { - const name = $(`h2`, element).text().trim() - const link = $(`h2 > a`, element).attr(`name`) // full URL is in name for some reason - const pdf = $(`ul.SearchResultDoc li a.piwik_download[title*="pdf"]`).attr(`href`) - return { - links: [ - { - doctype: `Legislation`, - filetype: `HTML`, - url: link, - }, - { - doctype: `Legislation`, - filetype: `PDF`, - url: `${DOMAIN}/${pdf}`, - }, - ], - name, - } - }).get() -} - -const getLegislation = async (legislation: Finder.LegislationFinderResult): Promise => { - const { - // provisionType, - provisionNumber, - statute, - } = legislation - - let statuteResults = [] - - try { - const result = await getStatute(statute) - statuteResults = result.map(({ links, name }): Law.Legislation => ({ - ...legislation, - database: Constants.DATABASES.EU_eurlex, - jurisdiction: Constants.JURISDICTIONS.EU.id, - links, - statute: name, - })) - } catch (error){ - Logger.error(error) - return [] - } - - if(!provisionNumber){ - return statuteResults - } -} - -const EURLex = { - getLegislation, - getStatute, -} - -export default EURLex \ No newline at end of file diff --git a/src/utils/scraper/HK/HK.ts b/src/utils/scraper/HK/HK.ts index 0c2bf1e..5dec620 100644 --- a/src/utils/scraper/HK/HK.ts +++ b/src/utils/scraper/HK/HK.ts @@ -1,62 +1,38 @@ -// import HKLIIHK from './HKLIIHK' import HKLIIORG from './HKLIIORG' import LRS from './LRS' import Common from '../common' -import Logger from '../../Logger' import Constants from '../../Constants' -import { sortHKCitations } from '../../Finder/CaseCitationFinder/HK' -import Helpers from '../../Helpers' -import { databaseUseDatabase, databaseUseJurisdiction, sortByName } from '../utils' +import { sortHKCases } from '../../Finder/CaseCitationFinder/HK' +import { databaseUseDatabase, databaseUseJurisdiction, makeEventTarget } from '../utils' const databaseUseHK = databaseUseJurisdiction(`HK`) const databaseUseLRS = databaseUseDatabase(`lrs`, databaseUseHK) const databaseUseHKLIIIORG = databaseUseDatabase(`hkliiorg`, databaseUseHK) const databaseUseCommonLII = databaseUseDatabase(`commonlii`, databaseUseHK) -const getCaseByName = async (caseName: string): Promise => { - try { - const results = (await Promise.allSettled([ - databaseUseLRS(() => LRS.getCaseByName(caseName)), - databaseUseHKLIIIORG(() => HKLIIORG.getCaseByName(caseName)), - databaseUseCommonLII(() => Common.CommonLII.getCaseByName(caseName, Constants.JURISDICTIONS.HK.name)), - ])) - .filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.HK.id) - - return sortByName( - caseName, - sortHKCitations( - Helpers.uniqueBy(results, `citation`), - `citation`, - ), - ) - } catch (error) { - Logger.error(error) - } - return [] -} - -const getCaseByCitation = async (citation: string, court: string): Promise => { - try { - const results = (await Promise.allSettled([ - databaseUseLRS(() => LRS.getCaseByCitation(citation)), - databaseUseHKLIIIORG(() => HKLIIORG.getCaseByCitation(citation)), - databaseUseCommonLII(() => Common.CommonLII.getCaseByCitation(citation)), - ])).filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.HK.id) - - return sortHKCitations( - Helpers.uniqueBy(results, `citation`), - `citation`, - ) - } catch (error){ - Logger.error(error) - } - return [] -} - +const getCaseByName = (caseName: string): EventTarget => makeEventTarget( + caseName, + [ + databaseUseLRS(() => LRS.getCaseByName(caseName)), + databaseUseHKLIIIORG(() => HKLIIORG.getCaseByName(caseName)), + databaseUseCommonLII(() => Common.CommonLII.getCaseByName(caseName, Constants.JURISDICTIONS.HK.name)), + ], + `HK`, + sortHKCases, + true, +) + +const getCaseByCitation = (citation: string): EventTarget => makeEventTarget( + citation, + [ + databaseUseLRS(() => LRS.getCaseByCitation(citation)), + databaseUseHKLIIIORG(() => HKLIIORG.getCaseByCitation(citation)), + databaseUseCommonLII(() => Common.CommonLII.getCaseByCitation(citation)), + ], + `HK`, + sortHKCases, + false, +) const databaseMap = { [Constants.DATABASES.HK_lrs.id]: LRS, diff --git a/src/utils/scraper/HK/HKLIIORG.ts b/src/utils/scraper/HK/HKLIIORG.ts index daa294a..eede49a 100644 --- a/src/utils/scraper/HK/HKLIIORG.ts +++ b/src/utils/scraper/HK/HKLIIORG.ts @@ -6,6 +6,7 @@ import { findHKCaseCitation } from '../../Finder/CaseCitationFinder/HK' import type { AxiosResponse } from 'axios' import PDF from '../../PDF' import { findCitation } from '../utils' +import { CacheRequestConfig } from 'axios-cache-interceptor' const DOMAIN = `https://www.hklii.org` @@ -48,7 +49,7 @@ const getCaseByCitation = async (citation: string): Promise => { mode: `advanced`, results: 20, }, - }, + } as CacheRequestConfig, ) return parseCaseData(data) @@ -65,7 +66,7 @@ const getCaseByName = async (caseName: string): Promise => { results: 20, titleall: caseName, }, - }, + } as CacheRequestConfig, ) return parseCaseData(data) diff --git a/src/utils/scraper/HK/LRS.ts b/src/utils/scraper/HK/LRS.ts index b209f0f..06454ee 100644 --- a/src/utils/scraper/HK/LRS.ts +++ b/src/utils/scraper/HK/LRS.ts @@ -7,6 +7,7 @@ import Helpers from '../../Helpers' import { findHKCaseCitation } from '../../Finder/CaseCitationFinder/HK' import PDF from '../../PDF' import { findCitation } from '../utils' +import { CacheRequestConfig } from 'axios-cache-interceptor' const DOMAIN = `https://legalref.judiciary.hk` @@ -54,7 +55,7 @@ export const getCaseByCitation = async (citation: string): Promise = txtSearch: citation, txtselectopt: `4`, }, - }) + } as CacheRequestConfig) const urlRegex = new RegExp(/window\.location\.href="(.+)"/gi) const caseURL = [...data.matchAll(urlRegex)][0][1] @@ -158,7 +159,7 @@ const getCaseByName = async (caseName: string): Promise => { { arrayFormat: `repeat`, format : `RFC1738` }, ), }, - }, + } as CacheRequestConfig, ) const $ = cheerio.load(data) diff --git a/src/utils/scraper/MY/Kehakiman.ts b/src/utils/scraper/MY/Kehakiman.ts index 3acf6d3..a9b0000 100644 --- a/src/utils/scraper/MY/Kehakiman.ts +++ b/src/utils/scraper/MY/Kehakiman.ts @@ -2,6 +2,7 @@ import * as cheerio from 'cheerio' import Request from '../../Request' import Constants from '../../Constants' import { AxiosResponse } from 'axios' +import { CacheRequestConfig } from 'axios-cache-interceptor' const DOMAIN = `https://ejudgment.kehakiman.gov.my` @@ -41,7 +42,7 @@ const getCaseByName = async (caseName: string): Promise => { aph_court_category: ``, nama_hakim: ``, }, - }, + } as CacheRequestConfig, ) return parseCases(data) } @@ -57,7 +58,7 @@ const getCaseByCitation = async (citation: string): Promise => { aph_court_category: ``, nama_hakim: ``, }, - }, + } as CacheRequestConfig, ) return parseCases(data) } diff --git a/src/utils/scraper/MY/MY.ts b/src/utils/scraper/MY/MY.ts index 02bcec3..6fd0e4c 100644 --- a/src/utils/scraper/MY/MY.ts +++ b/src/utils/scraper/MY/MY.ts @@ -1,56 +1,34 @@ import Kehakiman from './Kehakiman' import Common from '../common' import Constants from '../../Constants' -import { sortMYCitations } from '../../Finder/CaseCitationFinder/MY' -import Helpers from '../../Helpers' -import { databaseUseDatabase, databaseUseJurisdiction, sortByName } from '../utils' -import Logger from '../../Logger' +import { sortMYCases } from '../../Finder/CaseCitationFinder/MY' +import { databaseUseDatabase, databaseUseJurisdiction, makeEventTarget } from '../utils' const databaseUseMY = databaseUseJurisdiction(`MY`) const databaseUseCommonLII = databaseUseDatabase(`commonlii`, databaseUseMY) const databaseUseKehakiman = databaseUseDatabase(`kehakiman`, databaseUseMY) -const getCaseByName = async (caseName: string): Promise => { - try { - const results = (await Promise.allSettled([ - databaseUseCommonLII(() => Common.CommonLII.getCaseByName(caseName, Constants.JURISDICTIONS.MY.name)), - databaseUseKehakiman(() => Kehakiman.getCaseByName(caseName)), - ])) - .filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.MY.id) - - return sortByName( - caseName, - sortMYCitations( - Helpers.uniqueBy(results, `citation`), - `citation`, - ), - ) - } catch (error) { - Logger.error(error) - } - return [] -} - -const getCaseByCitation = async (citation: string, court: string): Promise => { - try { - const results = (await Promise.allSettled([ - databaseUseCommonLII(() => Common.CommonLII.getCaseByCitation(citation)), - databaseUseKehakiman(() => Kehakiman.getCaseByCitation(citation)), - ])).filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.MY.id) - - return sortMYCitations( - Helpers.uniqueBy(results, `citation`), - `citation`, - ) - } catch (error){ - Logger.error(error) - } - return [] -} +const getCaseByName = (caseName: string): EventTarget => makeEventTarget( + caseName, + [ + databaseUseCommonLII(() => Common.CommonLII.getCaseByName(caseName, Constants.JURISDICTIONS.MY.name)), + databaseUseKehakiman(() => Kehakiman.getCaseByName(caseName)), + ], + `MY`, + sortMYCases, + true, +) + +const getCaseByCitation = (citation: string): EventTarget => makeEventTarget( + citation, + [ + databaseUseCommonLII(() => Common.CommonLII.getCaseByCitation(citation)), + databaseUseKehakiman(() => Kehakiman.getCaseByCitation(citation)), + ], + `MY`, + sortMYCases, + false, +) const databaseMap = { [Constants.DATABASES.commonlii.id]: Common.CommonLII, diff --git a/src/utils/scraper/NZ/NZ.ts b/src/utils/scraper/NZ/NZ.ts index ad1fc70..a05b2da 100644 --- a/src/utils/scraper/NZ/NZ.ts +++ b/src/utils/scraper/NZ/NZ.ts @@ -1,56 +1,34 @@ import nzlii from './nzlii' import Common from '../common' -import Logger from '../../Logger' -import Helpers from '../../Helpers' import Constants from '../../Constants' -import { sortNZCitations } from '../../Finder/CaseCitationFinder/NZ' -import { databaseUse, databaseUseDatabase, databaseUseJurisdiction, sortByName } from '../utils' +import { sortNZCases } from '../../Finder/CaseCitationFinder/NZ' +import { databaseUseDatabase, databaseUseJurisdiction, makeEventTarget } from '../utils' const databaseUseNZ = databaseUseJurisdiction(`NZ`) const databaseUseNZLII = databaseUseDatabase(`nzlii`, databaseUseNZ) const databaseUseCommonLII = databaseUseDatabase(`commonlii`, databaseUseNZ) -const getCaseByName = async (caseName: string): Promise => { - try { - const results = (await Promise.allSettled([ - databaseUseNZLII(() => nzlii.getCaseByName(caseName)), - databaseUseCommonLII(() => Common.CommonLII.getCaseByName(caseName, Constants.JURISDICTIONS.NZ.name)), - ])) - .filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.NZ.id) - - return sortByName( - caseName, - sortNZCitations( - Helpers.uniqueBy(results, `citation`), - `citation`, - ), - ) - } catch (error) { - Logger.error(error) - } - return [] -} - -const getCaseByCitation = async (citation: string, court: string): Promise => { - try { - const results = (await Promise.allSettled([ - databaseUseNZLII(() => nzlii.getCaseByCitation(citation)), - databaseUseCommonLII(() => Common.CommonLII.getCaseByCitation(citation)), - ])).filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.HK.id) - - return sortNZCitations( - Helpers.uniqueBy(results, `citation`), - `citation`, - ) - } catch (error){ - Logger.error(error) - } - return [] -} +const getCaseByName = (caseName: string): EventTarget => makeEventTarget( + caseName, + [ + databaseUseNZLII(() => nzlii.getCaseByName(caseName)), + databaseUseCommonLII(() => Common.CommonLII.getCaseByName(caseName, Constants.JURISDICTIONS.NZ.name)), + ], + `NZ`, + sortNZCases, + true, +) + +const getCaseByCitation = (citation: string): EventTarget => makeEventTarget( + citation, + [ + databaseUseNZLII(() => nzlii.getCaseByCitation(citation)), + databaseUseCommonLII(() => Common.CommonLII.getCaseByCitation(citation)), + ], + `NZ`, + sortNZCases, + false, +) const databaseMap = { [Constants.DATABASES.NZ_nzlii.id]: nzlii, diff --git a/src/utils/scraper/NZ/nzlii.ts b/src/utils/scraper/NZ/nzlii.ts index 69f9cec..182dd39 100644 --- a/src/utils/scraper/NZ/nzlii.ts +++ b/src/utils/scraper/NZ/nzlii.ts @@ -7,6 +7,7 @@ import { findNZCaseCitation } from '../../Finder/CaseCitationFinder/NZ' import type { AxiosResponse } from 'axios' import PDF from '../../PDF' import { findCitation } from '../utils' +import { CacheRequestConfig } from 'axios-cache-interceptor' const DOMAIN = `http://www.nzlii.org` @@ -46,7 +47,7 @@ const getCaseByCitation = async (citation: string): Promise => { method: `auto`, query: citation, }, - }, + } as CacheRequestConfig, ) return parseCaseData(data) @@ -69,7 +70,7 @@ const getCaseByName = async (caseName: string): Promise => { query: caseName, rank: `on`, }, - }, + } as CacheRequestConfig, ) return parseCaseData(data) diff --git a/src/utils/scraper/SG/OpenLaw.ts b/src/utils/scraper/SG/OpenLaw.ts index 91e9270..944bf9a 100644 --- a/src/utils/scraper/SG/OpenLaw.ts +++ b/src/utils/scraper/SG/OpenLaw.ts @@ -3,6 +3,7 @@ import Logger from 'utils/Logger' import Constants from 'utils/Constants' import { Downloads } from 'webextension-polyfill-ts' import Helpers from 'utils/Helpers' +import { CacheRequestConfig } from 'axios-cache-interceptor' const SEARCH_API_URL = `https://api.lawnet.sg/lawnet/search-service/api/lawnetcore/search/supreme-court` const CITATION_API_URL = `https://api.lawnet.sg/lawnet/search-service/api/lawnetcore/document/citation` @@ -64,7 +65,7 @@ const getCaseByCitation = async (citation: string): Promise => { const { data } = await Request.post( CITATION_API_URL, requestBody, - defaultRequestOptions, + defaultRequestOptions as unknown as CacheRequestConfig, ) const encodedCitation = citation.replaceAll(` `, `+`) const judgmentLink: Law.Link = { @@ -107,7 +108,7 @@ const getSearchResults = async (query: string): Promise=> { const { data } = await Request.post( SEARCH_API_URL, requestBody, - defaultRequestOptions, + defaultRequestOptions as unknown as CacheRequestConfig, ) const results: Law.Case[] = data.data.results.map((result): Law.Case => { const encodedCitation = result.ncitation.replaceAll(` `, `+`) diff --git a/src/utils/scraper/SG/SG.ts b/src/utils/scraper/SG/SG.ts index 547b247..bb4e0bf 100644 --- a/src/utils/scraper/SG/SG.ts +++ b/src/utils/scraper/SG/SG.ts @@ -1,21 +1,17 @@ -import { databaseUseDatabase, databaseUseJurisdiction, sortByName } from '../utils' -import { sortSGCitations } from 'utils/Finder/CaseCitationFinder/SG' +import { databaseUseDatabase, databaseUseJurisdiction, makeEventTarget } from '../utils' +import { sortSGCases } from 'utils/Finder/CaseCitationFinder/SG' import Common from '../common' import Constants from 'utils/Constants' import eLitigation from './eLitigation' import Finder from 'utils/Finder' -import Helpers from 'utils/Helpers' import IPOS from './IPOS' import Logger from 'utils/Logger' import OpenLaw from './OpenLaw' import SLW from './SLW' -import SSO from './SSO' import STB from './STB' import { Downloads } from 'webextension-polyfill-ts' import LawNet from './LawNet' -const getLegislation = SSO.getLegislation - const databaseUseSG = databaseUseJurisdiction(`SG`) const databaseUseeLitigation = databaseUseDatabase(`elitigation`, databaseUseSG) const databaseUseOpenLaw = databaseUseDatabase(`openlaw`, databaseUseSG) @@ -25,32 +21,20 @@ const databaseUseSTB = databaseUseDatabase(`stb`, databaseUseSG) const databaseUseSLW = databaseUseDatabase(`slw`, databaseUseSG) const databaseUseLawNet = databaseUseDatabase(`lawnetsg`, databaseUseSG) -const getCaseByName = async (caseName: string): Promise => { - try { - const results = (await Promise.allSettled([ - databaseUseeLitigation(() => eLitigation.getCaseByName(caseName)), - databaseUseOpenLaw(() => OpenLaw.getCaseByName(caseName)), - databaseUseCommonLII(() => Common.CommonLII.getCaseByName(caseName, Constants.JURISDICTIONS.SG.name)), - databaseUseLawNet(() => LawNet.getCaseByName(caseName)), - databaseUseIPOS(() => IPOS.getCaseByName(caseName)), - databaseUseSTB(() => STB.getCaseByName(caseName)), - ])) - .filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.SG.id) - - return sortByName( - caseName, - sortSGCitations( - Helpers.uniqueBy(results, `citation`), - `citation`, - ), - ) - } catch (error) { - Logger.error(error) - } - return [] -} +const getCaseByName = (caseName: string): EventTarget => makeEventTarget( + caseName, + [ + databaseUseeLitigation(() => eLitigation.getCaseByName(caseName)), + databaseUseOpenLaw(() => OpenLaw.getCaseByName(caseName)), + databaseUseCommonLII(() => Common.CommonLII.getCaseByName(caseName, Constants.JURISDICTIONS.SG.name)), + databaseUseLawNet(() => LawNet.getCaseByName(caseName)), + databaseUseIPOS(() => IPOS.getCaseByName(caseName)), + databaseUseSTB(() => STB.getCaseByName(caseName)), + ], + `SG`, + sortSGCases, + true, +) const getApplicableDatabases = (citation: string) => { const [{ year, abbr }] = Finder.findCaseCitation(citation) @@ -80,23 +64,13 @@ const getApplicableDatabases = (citation: string) => { } } -const getCaseByCitation = async (citation: string): Promise => { - try { - const results = (await Promise.allSettled( - getApplicableDatabases(citation), - )).filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.SG.id) - - return sortSGCitations( - Helpers.uniqueBy(results, `citation`), - `citation`, - ) - } catch (error) { - Logger.error(error) - } - return [] -} +const getCaseByCitation = (citation: string): EventTarget => makeEventTarget( + citation, + getApplicableDatabases(citation), + `SG`, + sortSGCases, + false, +) const databaseMap = { [Constants.DATABASES.commonlii.id]: Common.CommonLII, @@ -119,7 +93,6 @@ const SG = { eLitigation, getCaseByCitation, getCaseByName, - getLegislation, getPDF, } diff --git a/src/utils/scraper/SG/SSO.ts b/src/utils/scraper/SG/SSO.ts deleted file mode 100644 index 6b11830..0000000 --- a/src/utils/scraper/SG/SSO.ts +++ /dev/null @@ -1,107 +0,0 @@ -import Request from '../../Request' -import * as cheerio from 'cheerio' -import Logger from '../../Logger' -import Constants from '../../Constants' - -const DOMAIN = `https://sso.agc.gov.sg` - -interface StatuteResult { - name: string, - link: string -} - -const getStatute = async (statuteName: string): Promise => { - const { data } = await Request.get(`${DOMAIN}/Search/Content`, { - params: { - In: `InForce_Act_SL`, - Phrase: statuteName, - PhraseType: `AllTheseWords`, - Within: `title`, - }, - }) - const $ = cheerio.load(data) - return $(`#searchTable > tbody > tr`).map((_, row) => { - const name = $(`a.title`, row).text().trim() - const link = $(`a.title`, row).attr(`href`) - return { - link, - name, - } - }).get() -} - -const getLegislation = async (legislation: Finder.LegislationFinderResult): Promise => { - const { - provisionNumber, - statute, - } = legislation - - let statuteResults = [] as StatuteResult[] - try { - const result = await getStatute(statute) - if(result.length === 0){ - return [] - } - statuteResults = result - } catch (error) { - Logger.error(error) - return [] - } - - if(!provisionNumber){ // getting the statute is enough - return statuteResults.map(({ name, link }) => ({ - ...legislation, - database: Constants.DATABASES.SG_sso, - jurisdiction: Constants.JURISDICTIONS.SG.id, - links: [ - { - doctype: `Legislation`, - filetype: `HTML`, - url: link, - }, - { - doctype: `Legislation`, - filetype: `PDF`, - url: `${link}?ViewType=Pdf`, - }, - ], - statute: name, - })) - } - - try { - const statuteResult = statuteResults[0] - const { data, request } = await Request.get(statuteResult.link, { - params: { - ProvIds: `pr${provisionNumber}-`, - }, - }) - - const $ = cheerio.load(data) - const legisContent = $(`#legisContent`).html() - return [{ - ...legislation, - content: legisContent, - database: Constants.DATABASES.SG_sso, - jurisdiction: Constants.JURISDICTIONS.SG.id, - links: [ - { - doctype: `Legislation`, - filetype: `HTML`, - url: request.responseURL, - }, - ], - statute: statuteResult.name, - }] - - } catch (error) { - Logger.error(error) - return [] - } -} - -const SSO = { - getLegislation, -} - -export default SSO \ No newline at end of file diff --git a/src/utils/scraper/SG/eLitigation.ts b/src/utils/scraper/SG/eLitigation.ts index d137714..7675b81 100644 --- a/src/utils/scraper/SG/eLitigation.ts +++ b/src/utils/scraper/SG/eLitigation.ts @@ -2,6 +2,7 @@ import { load } from 'cheerio' import Request from '../../Request' import Constants from '../../Constants' import Logger from '../../Logger' +import { CacheRequestConfig } from 'axios-cache-interceptor' const DOMAIN = `https://www.elitigation.sg` @@ -53,7 +54,7 @@ const getCaseByCitation = async (citation: string): Promise => { verbose: `False`, yearOfDecision: `All`, }, - }) + } as CacheRequestConfig) return parseCaseResults(data).filter(({ citation: scrapedCitation }) => ( trimLeadingPageZeros(scrapedCitation).toLowerCase() === citation.toLowerCase() @@ -72,7 +73,7 @@ const getCaseByName = async (caseName: string): Promise => { verbose: `False`, yearOfDecision: `All`, }, - }) + } as CacheRequestConfig) return parseCaseResults(data) } catch (error){ Logger.error(error) diff --git a/src/utils/scraper/Scraper.ts b/src/utils/scraper/Scraper.ts index 457a1d8..6dc90b8 100644 --- a/src/utils/scraper/Scraper.ts +++ b/src/utils/scraper/Scraper.ts @@ -12,9 +12,6 @@ import Constants from '../Constants' import Logger from '../Logger' import UN from './UN' -// type JurisdictionType = typeof SG | typeof UK | typeof EU | typeof HK | typeof CA | typeof AU | typeof NZ -type JurisdictionWithLegislationSearch = typeof SG | typeof UK | typeof EU - const jurisdictionMap = { [Constants.JURISDICTIONS.AU.id]: AU, [Constants.JURISDICTIONS.EU.id]: EU, @@ -31,7 +28,7 @@ const jurisdictionMap = { const getCaseByCitation = ( targetCase: Finder.CaseCitationFinderResult, inputJurisdiction: Law.JurisdictionCode = null, -): Promise => { +): EventTarget => { const { jurisdiction, citation, court } = targetCase const targetJurisdiction = inputJurisdiction === null @@ -40,46 +37,26 @@ const getCaseByCitation = ( Logger.log(`Scraper: getByCaseCitation`, citation, targetJurisdiction) - return targetJurisdiction.getCaseByCitation(citation, court) + return targetJurisdiction.getCaseByCitation( + citation, + court, + ) } const getCaseByName = ( targetCaseName: Finder.CaseNameFinderResult, inputJurisdiction: Law.JurisdictionCode, -) : Promise => { +) : EventTarget => { const { name } = targetCaseName const targetJurisdiction = jurisdictionMap[inputJurisdiction] if(!targetJurisdiction || !targetJurisdiction?.getCaseByName){ - return Promise.resolve([]) + Logger.error(`targetJurisdiction or getCaseByName missing`) } return targetJurisdiction.getCaseByName(name) } -const getLegislation = Memoize(( - targetLegislation: Finder.LegislationFinderResult, - inputJurisdiction: Law.JurisdictionCode, -): Promise => { - const targetJurisdiction = jurisdictionMap[inputJurisdiction] - - if(!targetJurisdiction || !(`getLegislation` in targetJurisdiction)){ - return Promise.resolve([]) - } - - Logger.log(`Scraper: getLegislation`, targetLegislation, inputJurisdiction) - - return ( - targetJurisdiction as JurisdictionWithLegislationSearch - ).getLegislation(targetLegislation) -}, { - normalizer: ([{ - provisionType, - provisionNumber, - statute, - }, inputJurisdiction]) => `${provisionType}-${provisionNumber}-${statute}-${inputJurisdiction}`, -}) - const getPDF = Memoize(( inputCase: Law.Case, inputDocumentType: Law.Link[`doctype`], @@ -117,7 +94,6 @@ const scraper = { UK, getCaseByCitation, getCaseByName, - getLegislation, getPDF, } diff --git a/src/utils/scraper/UK/BAILII.ts b/src/utils/scraper/UK/BAILII.ts index 4aeb29e..83782fd 100644 --- a/src/utils/scraper/UK/BAILII.ts +++ b/src/utils/scraper/UK/BAILII.ts @@ -8,10 +8,11 @@ import Helpers from '../../Helpers' import type { AxiosResponse } from 'axios' import PDF from '../../PDF' import { findCitation } from '../utils' +import { CacheRequestConfig } from 'axios-cache-interceptor' const DOMAIN = `https://www.bailii.org` -const parseSingleCase = (data: AxiosResponse[`data`], request: AxiosResponse[`request`]): Law.Case => { +const parseSingleCase = (data: AxiosResponse[`data`], url: string): Law.Case => { const $ = cheerio.load(data) @@ -28,7 +29,7 @@ const parseSingleCase = (data: AxiosResponse[`data`], request: AxiosResponse[`re { doctype: `Judgment`, filetype: `HTML`, - url: request.responseURL, + url, }, ...(pdfPath ? [{ doctype: `Judgment`, filetype: `PDF`, url: `${DOMAIN}${pdfPath}` } as Law.Link] @@ -40,19 +41,30 @@ const parseSingleCase = (data: AxiosResponse[`data`], request: AxiosResponse[`re } const getCaseByCitation = async (citation: string): Promise => { - const { data, request } = await Request.post( + const response = await Request.post( `${DOMAIN}/cgi-bin/find_by_citation.cgi`, qs.stringify({ citation }, { format : `RFC1738` }), { validateStatus: status => (status >= 200 && status < 300) || status === 302, - }, + } as CacheRequestConfig, ) - if(request.responseURL === `${DOMAIN}/cgi-bin/find_by_citation.cgi`) { + // there is a bug in axios-cache-interceptor such that + // the original request is not returned, so we have to + // work around that + // if(request.responseURL === `${DOMAIN}/cgi-bin/find_by_citation.cgi`) { + // return [] + // } + const { data } = response + const $ = cheerio.load(data) + if($(`body > p:nth-child(6)`).text().includes(`No matching citations found.`)){ return [] } - const result = parseSingleCase(data, request) + const { config } = response + const url = `${config.url}?${config.data}` + + const result = parseSingleCase(data, url) return [result] } @@ -68,7 +80,7 @@ const getCaseByName = async (caseName: string): Promise => { show: 20, // because BAILII sometimes doesn't do the best job of sorting sort: `rank`, }, - }, + } as CacheRequestConfig, ) const $ = cheerio.load(data) diff --git a/src/utils/scraper/UK/LegislationGovUk.ts b/src/utils/scraper/UK/LegislationGovUk.ts deleted file mode 100644 index a73d648..0000000 --- a/src/utils/scraper/UK/LegislationGovUk.ts +++ /dev/null @@ -1,109 +0,0 @@ -import Request from '../../Request' -import * as cheerio from 'cheerio' -import Logger from '../../Logger' -import Constants from '../../Constants' - -const DOMAIN = `https://www.legislation.gov.uk` - -interface StatuteResult { - name: string, - links: Law.Legislation[`links`] -} - -const getStatute = async (statuteName: string): Promise => { - const { data } = await Request.get(`${DOMAIN}/primary+secondary`, { - params: { title: statuteName }, - }) - const $ = cheerio.load(data) - return $(`#content tbody > tr`).map((_, row) => { - const element = $(`td:first-of-type > a`, row) - const name = element.text().trim() - const link = `${DOMAIN}${element.attr(`href`)}` - return { - links: [ - { - doctype: `Legislation`, - filetype: `HTML`, - url: link, - } as Law.Link, - { - doctype: `Legislation`, - filetype: `PDF`, - url: link.replace(/\/contents$/i, `/data.pdf`), - } as Law.Link, - ], - name, - } - }).get() -} - -const getLegislation = async (legislation: Finder.LegislationFinderResult): Promise => { - const { - provisionType, - provisionNumber, - statute, - } = legislation - - let statuteResult = {} as StatuteResult - - try { - const result = await getStatute(statute) - if(result.length === 0){ - return [] - } - - if(!provisionNumber){ - return result.map((statute) => { - return { - ...legislation, - database: Constants.DATABASES.UK_legislation, - jurisdiction: Constants.JURISDICTIONS.UK.id, - links: statute.links, - statute: statute.name, - } - }) - } - - const { links, name } = result[0] - statuteResult = { links, name } - } catch (error){ - Logger.error(error) - return [] - } - - const provisionLink = [ - ...statuteResult.links[0].url.split(`/`).slice(0, -1), - provisionType.toLowerCase(), provisionNumber, - ].join(`/`) - - try { - const { data, request } = await Request.get(provisionLink) - - const $ = cheerio.load(data) - const legisContent = $(`#viewLegSnippet`).html() - - return [{ - ...legislation, - content: legisContent, - database: Constants.DATABASES.UK_legislation, - jurisdiction: Constants.JURISDICTIONS.UK.id, - links: [ - { - doctype: `Legislation`, - filetype: `PDF`, - url: request.responseURL, - }, - ], - statute: statuteResult.name, - }] - } catch (error) { - Logger.error(error) - return [] - } -} - -const LegislationGovUk = { - getLegislation, -} - -export default LegislationGovUk \ No newline at end of file diff --git a/src/utils/scraper/UK/UK.ts b/src/utils/scraper/UK/UK.ts index fd5abfb..0954024 100644 --- a/src/utils/scraper/UK/UK.ts +++ b/src/utils/scraper/UK/UK.ts @@ -1,13 +1,9 @@ import BAILII from './BAILII' import Common from '../common' -import LegislationGovUk from './LegislationGovUk' import Custom from '../custom' -import Logger from '../../Logger' -import Helpers from '../../Helpers' -import { sortUKCitations } from '../../Finder/CaseCitationFinder/UK' +import { sortUKCases } from '../../Finder/CaseCitationFinder/UK' import Constants from '../../Constants' -import { databaseUseDatabase, databaseUseJurisdiction, sortByName } from '../utils' -import Finder from 'utils/Finder' +import { databaseUseDatabase, databaseUseJurisdiction, makeEventTarget } from '../utils' import UKIPO from './UKIPO' const databaseUseUK = databaseUseJurisdiction(`UK`) @@ -15,58 +11,32 @@ const databaseUseBailii = databaseUseDatabase(`bailii`, databaseUseUK) const databaseUseCommonLII = databaseUseDatabase(`commonlii`, databaseUseUK) const databaseUseIPO = databaseUseDatabase(`ipo`, databaseUseUK) -const getLegislation = LegislationGovUk.getLegislation -const getCaseByName = async (caseName: string): Promise => { - try { - const results = (await Promise.allSettled([ - databaseUseBailii(() => BAILII.getCaseByName(caseName)), - databaseUseCommonLII(() => Common.CommonLII.getCaseByName(caseName, Constants.JURISDICTIONS.UK.name)), - databaseUseIPO(() => UKIPO.getCaseByName(caseName)), - Custom.getCaseByName(caseName), - ])) - .filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.UK.id) - - const uniqueResults = sortUKCitations( - Helpers.uniqueBy(results, `citation`), - `citation`, - ) - - return sortByName( - caseName, - uniqueResults, - ) - } catch (error) { - Logger.error(error) - } - return [] -} - -const getCaseByCitation = async (citation: string, court: string): Promise => { - try { - const [finderResult] = Finder.findCaseCitation(citation) - const results = (await Promise.allSettled( - finderResult.abbr === `UKIPO` ? [ - databaseUseIPO(() => UKIPO.getCaseByCitation(citation)), - ] : [ - Custom.getCaseByCitation(citation, court), - databaseUseBailii(() => BAILII.getCaseByCitation(citation)), - databaseUseCommonLII(() => Common.CommonLII.getCaseByCitation(citation)), - ], - )).filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ jurisdiction }) => jurisdiction === Constants.JURISDICTIONS.UK.id) - - return sortUKCitations( - Helpers.uniqueBy(results, `citation`), - `citation`, - ) - } catch (error){ - Logger.error(error) - } - return [] -} +const getCaseByName = (caseName: string): EventTarget => makeEventTarget( + caseName, + [ + databaseUseBailii(() => BAILII.getCaseByName(caseName)), + databaseUseCommonLII(() => Common.CommonLII.getCaseByName(caseName, Constants.JURISDICTIONS.UK.name)), + databaseUseIPO(() => UKIPO.getCaseByName(caseName)), + Custom.getCaseByName(caseName), + ], + `UK`, + sortUKCases, + true, +) + +const getCaseByCitation = (citation: string, court: string): EventTarget => makeEventTarget( + citation, + court === `UKIPO` ? [ + databaseUseIPO(() => UKIPO.getCaseByCitation(citation)), + ] : [ + Custom.getCaseByCitation(citation, court), + databaseUseBailii(() => BAILII.getCaseByCitation(citation)), + databaseUseCommonLII(() => Common.CommonLII.getCaseByCitation(citation)), + ], + `UK`, + sortUKCases, + false, +) const databaseMap = { [Constants.DATABASES.UK_bailii.id]: BAILII, @@ -82,7 +52,6 @@ const getPDF = async (inputCase: Law.Case, inputDocumentType: Law.Link[`doctype` const UK = { getCaseByCitation, getCaseByName, - getLegislation, getPDF, } diff --git a/src/utils/scraper/UK/UKIPO.ts b/src/utils/scraper/UK/UKIPO.ts index 270339b..b4ad0d6 100644 --- a/src/utils/scraper/UK/UKIPO.ts +++ b/src/utils/scraper/UK/UKIPO.ts @@ -1,4 +1,5 @@ import type { AxiosResponse } from 'axios' +import { CacheRequestConfig } from 'axios-cache-interceptor' import * as cheerio from 'cheerio' import Constants from 'utils/Constants' import Helpers from 'utils/Helpers' @@ -90,7 +91,7 @@ const getCaseByCitation = async (citation: string): Promise => { params: { BL_Number: citation, }, - }, + } as CacheRequestConfig, ) const tmSearch = await Request.get( TM_DETAIL_URL, @@ -98,7 +99,7 @@ const getCaseByCitation = async (citation: string): Promise => { params: { BL_Number: citation, }, - }, + } as CacheRequestConfig, ) const result = (await Promise.allSettled([patentSearch, tmSearch])) .find(({ status, value: { request } }: any) => @@ -114,31 +115,39 @@ const getCaseByCitation = async (citation: string): Promise => { const getCaseByName = async (caseName: string): Promise => { const patentSearchParty = await Request.get( PATENT_SEARCH_URL, - { params: { - ...defaultPatentSearchParameters, - party: caseName, - } }, + { + params: { + ...defaultPatentSearchParameters, + party: caseName, + }, + } as CacheRequestConfig, ) const patentSearchNumber = await Request.get( PATENT_SEARCH_URL, - { params: { - ...defaultPatentSearchParameters, - number: caseName, - } }, + { + params: { + ...defaultPatentSearchParameters, + number: caseName, + }, + } as CacheRequestConfig, ) const tmSearchParty = await Request.get( TM_SEARCH_URL, - { params: { - ...defaultTmSearchParameters, - party: caseName, - } }, + { + params: { + ...defaultTmSearchParameters, + party: caseName, + }, + } as CacheRequestConfig, ) const tmSearchMark = await Request.get( TM_SEARCH_URL, - { params: { - ...defaultTmSearchParameters, - mark: caseName, - } }, + { + params: { + ...defaultTmSearchParameters, + mark: caseName, + }, + } as CacheRequestConfig, ) const result = (await Promise.allSettled([ patentSearchParty, diff --git a/src/utils/scraper/UK/index.ts b/src/utils/scraper/UK/index.ts index 3ad043b..884b708 100644 --- a/src/utils/scraper/UK/index.ts +++ b/src/utils/scraper/UK/index.ts @@ -1,3 +1 @@ - - export {default} from './UK' \ No newline at end of file diff --git a/src/utils/scraper/UN/UN.ts b/src/utils/scraper/UN/UN.ts index cd4064b..4b650be 100644 --- a/src/utils/scraper/UN/UN.ts +++ b/src/utils/scraper/UN/UN.ts @@ -1,38 +1,31 @@ import ICJCIJ from './ICJCIJ' import Constants from '../../Constants' -import Logger from '../../Logger' -import { databaseUseDatabase, databaseUseJurisdiction } from '../utils' +import { databaseUseDatabase, databaseUseJurisdiction, makeEventTarget } from '../utils' +import { sortUNCases } from 'utils/Finder/CaseCitationFinder/UN' const databaseUseUN = databaseUseJurisdiction(`UN`) const databaseUseICJCIJ = databaseUseDatabase(`icjcij`, databaseUseUN) -const getLegislation = () => null - -const getCaseByName = async (caseName: string): Promise => { - try { - return (await Promise.allSettled([ - databaseUseICJCIJ(() => ICJCIJ.getCaseByName(caseName)), - ])) - .filter(({ status }) => status === `fulfilled`) - .flatMap(({ value }: PromiseFulfilledResult) => value) - .filter(({ - jurisdiction, - }) => ( - jurisdiction === Constants.JURISDICTIONS.UN.id - )) - } catch (error) { - Logger.error(error) - return [] - } -} - -const getCaseByCitation = async ( +const getCaseByName = (caseName: string): EventTarget => makeEventTarget( + caseName, + [ + databaseUseICJCIJ(() => ICJCIJ.getCaseByName(caseName)), + ], + `UN`, + sortUNCases, + true, +) + +const getCaseByCitation = ( citation: string, - court: string, -): Promise => { - return [] -} +): EventTarget => makeEventTarget( + citation, + [], + `UN`, + sortUNCases, + false, +) const databaseMap = { [Constants.DATABASES.UN_icjcij.id]: ICJCIJ, @@ -49,7 +42,6 @@ const getPDF = async ( const UN = { getCaseByCitation, getCaseByName, - getLegislation, getPDF, } diff --git a/src/utils/scraper/common/CommonLII.ts b/src/utils/scraper/common/CommonLII.ts index db58bd7..d433418 100644 --- a/src/utils/scraper/common/CommonLII.ts +++ b/src/utils/scraper/common/CommonLII.ts @@ -14,6 +14,7 @@ import scclexum from '../CA/scclexum' import austlii from '../AU/austlii' import PDF from '../../PDF' import { findCitation } from '../utils' +import { CacheRequestConfig } from 'axios-cache-interceptor' // Available judgments // Singapore @@ -39,7 +40,7 @@ const matchJurisdiction = (jurisdictionString: string): Law.JurisdictionCode => const fixURL = (url: string) => url.replace(/scc\.lexum\.umontreal\.ca/, `scc-csc.lexum.com`) const parseMultipleCase = ($: cheerio.CheerioAPI): Law.Case[] => { - const results = $(`a[name="cases"] table.search-results > tbody > tr`).map((_, element): Law.Case => { + return $(`a[name="cases"] table.search-results > tbody > tr`).map((_, element): Law.Case => { const name = $(`td.case-cited > a`, element).text().trim() const relativeLawCiteURL = $(`td.case-cited > a`, element).attr(`href`) const lawCiteURL = `${LAWCITE_DOMAIN}${relativeLawCiteURL}` @@ -68,8 +69,6 @@ const parseMultipleCase = ($: cheerio.CheerioAPI): Law.Case[] => { } }).get() .filter(({ citation }) => Helpers.isCitationValid(citation)) - Logger.log(`CommonLII scraper result`, results) - return results } const parseCase = async (result: AxiosResponse): Promise => { @@ -135,8 +134,7 @@ const parseCase = async (result: AxiosResponse): Promise => { ...(pdfLink ? [pdfLink] : []), ], name, - }] - Logger.log(`CommonLII scraper result`, results) + }].filter(Boolean) return results } catch (error){ @@ -152,7 +150,7 @@ const getCaseByCitation = async (citation: string): Promise => { cit: citation, filter: `on`, }, - }) + } as CacheRequestConfig) return parseCase(result) @@ -170,7 +168,7 @@ const getCaseByName = async (citation: string, jurisdiction: string = null): Pro ...(jurisdiction ? { juris: jurisdiction } : {}), party1: citation, }, - }) + } as CacheRequestConfig) return parseCase(result) } catch (error){ Logger.error(error) diff --git a/src/utils/scraper/utils.ts b/src/utils/scraper/utils.ts index 01c9a70..a061869 100644 --- a/src/utils/scraper/utils.ts +++ b/src/utils/scraper/utils.ts @@ -1,8 +1,10 @@ import Fuse from 'fuse.js' +import { Mutex } from 'async-mutex' import Helpers from '../Helpers' import Constants from 'utils/Constants' import Storage from 'utils/Storage' import Finder from "../Finder" +import Logger from 'utils/Logger' export const findCitation = (function_ = Finder.findCaseCitation, inputText: string) => { const results = function_(inputText) @@ -68,5 +70,95 @@ export const databaseUse = async (jurisdictionId: Law.JurisdictionCode, database return [] } -export const databaseUseJurisdiction = (jurisdictionId: Law.JurisdictionCode) => (...arguments_: [string, DatabaseUseFunction]) => databaseUse(jurisdictionId, ...arguments_) -export const databaseUseDatabase = (databaseId: string, databaseUseJurisdictionFunction) => (_function: DatabaseUseFunction) => databaseUseJurisdictionFunction(databaseId, _function) \ No newline at end of file +export const databaseUseJurisdiction = (jurisdictionId: Law.JurisdictionCode) => + (...arguments_: [string, DatabaseUseFunction]): Promise => + databaseUse(jurisdictionId, ...arguments_) +export const databaseUseDatabase = (databaseId: string, databaseUseJurisdictionFunction) => + (_function: DatabaseUseFunction): Promise => + databaseUseJurisdictionFunction(databaseId, _function) + +export const makeEventTarget = ( + query: string, + requests: Promise[], + jurisdictionId: Law.JurisdictionCode, + sortCitations: (citationsArray: Law.Case[], attribute: string) => Law.Case[], + sortByQuery: boolean, +): EventTarget => { + const eventTarget = new EventTarget() + let count = 0 + + if(requests.length === 0){ + const newEvent = new CustomEvent( + Constants.EVENTS.CASE_RESULTS, + { + detail: { + done: true, + results: [], + }, + }, + ) + eventTarget.dispatchEvent(newEvent) + return eventTarget + } + + const promises = requests.map((request) => new Promise((resolve, reject) => { + request + .then(result => { + count += 1 + const filteredResult = result.filter( + ({ jurisdiction }) => jurisdiction === jurisdictionId, + ) + const event = new CustomEvent( + `${Constants.EVENTS.RAW_CASE_RESULT}-${query}`, + { detail: { count, result: filteredResult } }, + ) + eventTarget.dispatchEvent(event) + resolve(event) + }) + .catch(error => reject(error)) + })) + + const mutex = new Mutex() + let aggregateResults: Law.Case[] = [] + + eventTarget.addEventListener(`${Constants.EVENTS.RAW_CASE_RESULT}-${query}`, async (event: CustomEvent) => { + event.stopImmediatePropagation() + + if(mutex.isLocked()){ + await mutex.waitForUnlock() + } + + await mutex.acquire() + + try { + const { detail: { count, result } }: { detail: { count: number, result: Law.Case[] } } = event + aggregateResults = sortByQuery ? sortByName( + query, + sortCitations( + Helpers.uniqueBy([...aggregateResults, ...result], `citation`), + `citation`, + ), + ) : sortCitations( + Helpers.uniqueBy([...aggregateResults, ...result], `citation`), + `citation`, + ) + + const newEvent = new CustomEvent(`${Constants.EVENTS.CASE_RESULTS}-${query}`, { + detail: { + done: promises.length === count, + results: aggregateResults, + }, + }) + eventTarget.dispatchEvent(newEvent) + } catch (error){ + Logger.error(error) + } finally { + await mutex.release() + } + }) + + Promise.allSettled(promises) + .catch(error => Logger.error(error)) + + return eventTarget +} \ No newline at end of file