From 59aa94399b7a0fc712c8c06b27aa0f0513194881 Mon Sep 17 00:00:00 2001 From: AzizbekFayziyev Date: Wed, 27 Nov 2024 20:30:07 +0500 Subject: [PATCH 01/10] converted to ts --- package-lock.json | 2020 +++++++++++------ package.json | 26 +- src/app/App.js | 199 +- src/app/api/{coingecko.js => coingecko.ts} | 0 ...iasCreatePage.jsx => AliasCreatePaget.jsx} | 0 .../AppPlug/{AppPlug.jsx => AppPlug.tsx} | 8 +- .../{AppLoader.jsx => AppLoader.tsx} | 11 +- .../UI/Loader/{Loader.jsx => Loader.tsx} | 0 .../UI/Modal/{Modal.jsx => Modal.tsx} | 18 +- .../{MyCheckbox.jsx => MyCheckbox.tsx} | 8 +- .../UI/MyInput/{MyInput.jsx => MyInput.tsx} | 30 +- src/app/config/{config.js => config.ts} | 0 .../{useAwayClick.js => useAwayClick.ts} | 12 +- ...{useCensorDigits.js => useCensorDigits.ts} | 5 +- .../hooks/{useCheckbox.js => useCheckbox.ts} | 2 +- src/app/hooks/{useCopy.js => useCopy.ts} | 2 +- src/app/hooks/useGetAsset.js | 13 - src/app/hooks/useGetAsset.ts | 16 + src/app/hooks/useInput.js | 24 - src/app/hooks/useInput.ts | 34 + src/app/hooks/useValidation.js | 48 - src/app/hooks/useValidation.ts | 60 + src/app/store/actions.js | 83 - src/app/store/actions.ts | 102 + .../{store-reducer.js => store-reducer.tsx} | 124 +- src/app/utils/ConnectKeyUtils.js | 19 - src/app/utils/ConnectKeyUtils.ts | 34 + src/app/utils/classNames.js | 8 - src/app/utils/classNames.ts | 15 + .../utils/{formatters.js => formatters.ts} | 4 +- src/app/utils/{utils.js => utils.ts} | 47 +- src/background/background.js | 67 +- src/background/{wallet.js => wallet.ts} | 86 +- src/content/{content.js => content.ts} | 28 +- src/content/{inject.js => inject.ts} | 21 +- src/global.d.ts | 15 + src/{index.js => index.tsx} | 2 +- tsconfig.json | 16 + webpack.common.js | 7 +- webpack.config.js | 6 +- 40 files changed, 2116 insertions(+), 1104 deletions(-) rename src/app/api/{coingecko.js => coingecko.ts} (100%) rename src/app/components/AliasCreatePage/{AliasCreatePage.jsx => AliasCreatePaget.jsx} (100%) rename src/app/components/AppPlug/{AppPlug.jsx => AppPlug.tsx} (89%) rename src/app/components/UI/AppLoader/{AppLoader.jsx => AppLoader.tsx} (78%) rename src/app/components/UI/Loader/{Loader.jsx => Loader.tsx} (100%) rename src/app/components/UI/Modal/{Modal.jsx => Modal.tsx} (73%) rename src/app/components/UI/MyCheckbox/{MyCheckbox.jsx => MyCheckbox.tsx} (62%) rename src/app/components/UI/MyInput/{MyInput.jsx => MyInput.tsx} (64%) rename src/app/config/{config.js => config.ts} (100%) rename src/app/hooks/{useAwayClick.js => useAwayClick.ts} (52%) rename src/app/hooks/{useCensorDigits.js => useCensorDigits.ts} (75%) rename src/app/hooks/{useCheckbox.js => useCheckbox.ts} (77%) rename src/app/hooks/{useCopy.js => useCopy.ts} (87%) delete mode 100644 src/app/hooks/useGetAsset.js create mode 100644 src/app/hooks/useGetAsset.ts delete mode 100644 src/app/hooks/useInput.js create mode 100644 src/app/hooks/useInput.ts delete mode 100644 src/app/hooks/useValidation.js create mode 100644 src/app/hooks/useValidation.ts delete mode 100644 src/app/store/actions.js create mode 100644 src/app/store/actions.ts rename src/app/store/{store-reducer.js => store-reducer.tsx} (50%) delete mode 100644 src/app/utils/ConnectKeyUtils.js create mode 100644 src/app/utils/ConnectKeyUtils.ts delete mode 100644 src/app/utils/classNames.js create mode 100644 src/app/utils/classNames.ts rename src/app/utils/{formatters.js => formatters.ts} (86%) rename src/app/utils/{utils.js => utils.ts} (72%) rename src/background/{wallet.js => wallet.ts} (86%) rename src/content/{content.js => content.ts} (54%) rename src/content/{inject.js => inject.ts} (65%) create mode 100644 src/global.d.ts rename src/{index.js => index.tsx} (94%) create mode 100644 tsconfig.json diff --git a/package-lock.json b/package-lock.json index e0508f9..d634c8d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,17 +31,29 @@ "@babel/core": "^7.21.4", "@babel/preset-env": "^7.21.4", "@babel/preset-react": "^7.18.6", + "@types/big.js": "^6.2.2", "@types/chrome": "^0.0.251", - "babel-loader": "^9.1.2", + "@types/crypto-js": "^4.2.2", + "@types/json-bigint": "^1.0.4", + "@types/node": "^22.10.0", + "@types/node-forge": "^1.3.11", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@types/sha256": "^0.2.2", + "babel-loader": "^9.2.1", + "clean-webpack-plugin": "^4.0.0", "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.7.3", - "html-webpack-plugin": "^5.5.0", + "css-loader": "^6.11.0", + "file-loader": "^6.2.0", + "html-webpack-plugin": "^5.6.3", "sass": "^1.62.0", - "sass-loader": "^13.2.2", - "style-loader": "^3.3.2", + "sass-loader": "^13.3.3", + "style-loader": "^3.3.4", + "ts-loader": "^9.5.1", + "typescript": "^5.7.2", "url-loader": "^4.1.1", - "webpack": "^5.79.0", - "webpack-cli": "^5.0.1", + "webpack": "^5.96.1", + "webpack-cli": "^5.1.4", "webpack-merge": "^5.8.0" } }, @@ -3218,19 +3230,15 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", @@ -3463,25 +3471,6 @@ "string.prototype.matchall": "^4.0.6" } }, - "node_modules/@testing-library/dom": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.2.0.tgz", - "integrity": "sha512-xTEnpUKiV/bMyEsE5bT4oYA0x0Z/colMtxzUY8bKyPXBNLn/e0V4ZjBZkEhms0xE4pv9QsPfSRu9AWS4y5wGvA==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "^5.0.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/@testing-library/jest-dom": { "version": "5.16.5", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz", @@ -3623,6 +3612,13 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/big.js": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.2.2.tgz", + "integrity": "sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -3667,6 +3663,13 @@ "@types/node": "*" } }, + "node_modules/@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/eslint": { "version": "8.37.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", @@ -3677,18 +3680,20 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.17", @@ -3726,6 +3731,17 @@ "integrity": "sha512-Kpi2GXQyYJdjL8mFclL1eDgihn1SIzorMZjD94kdPZh9E4VxGOeyjPxi5LpsM4Zku7P0reqegZTt2GxhmA9VBg==", "dev": true }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "node_modules/@types/graceful-fs": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", @@ -3812,6 +3828,13 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, + "node_modules/@types/json-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/json-bigint/-/json-bigint-1.0.4.tgz", + "integrity": "sha512-ydHooXLbOmxBbubnA7Eh+RpBzuaIiQjh8WGJYQB50JFGFrdxW7JzVlyEV7fAXw0T2sqJ1ysTneJbiyNLqZRAag==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -3827,10 +3850,30 @@ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" + "version": "22.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.0.tgz", + "integrity": "sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -3863,19 +3906,18 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { - "version": "18.0.33", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.33.tgz", - "integrity": "sha512-sHxzVxeanvQyQ1lr8NSHaj0kDzcNiGpILEVt69g9S31/7PfMvNCKLKcsHw4lYKjs3cGNJjXSP4mYzX43QlnjNA==", + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.0.11", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", - "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", "dependencies": { "@types/react": "*" } @@ -3893,11 +3935,6 @@ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" - }, "node_modules/@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", @@ -3920,6 +3957,16 @@ "@types/node": "*" } }, + "node_modules/@types/sha256": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@types/sha256/-/sha256-0.2.2.tgz", + "integrity": "sha512-uKMaDzyzfcDYGEwTgLh+hmgDMxXWyIVodY8T+qt7A+NYvikW0lmGLMGbQ7BipCB8dzXHa55C9g+Ii/3Lgt1KmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/sockjs": { "version": "0.3.33", "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", @@ -4186,141 +4233,157 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "node_modules/@webpack-cli/configtest": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", - "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -4330,10 +4393,11 @@ } }, "node_modules/@webpack-cli/info": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", - "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -4343,10 +4407,11 @@ } }, "node_modules/@webpack-cli/serve": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", - "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -4363,12 +4428,14 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" }, "node_modules/abab": { "version": "2.0.6", @@ -4388,9 +4455,10 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -4418,14 +4486,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -4610,11 +4670,12 @@ } }, "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "license": "Apache-2.0", "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "node_modules/array-buffer-byte-length": { @@ -4660,6 +4721,16 @@ "node": ">=8" } }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", @@ -4856,12 +4927,13 @@ } }, "node_modules/babel-loader": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", - "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, + "license": "MIT", "dependencies": { - "find-cache-dir": "^3.3.2", + "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" }, "engines": { @@ -4900,12 +4972,120 @@ "ajv": "^8.8.2" } }, + "node_modules/babel-loader/node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/babel-loader/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/babel-loader/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/babel-loader/node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/babel-loader/node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -4925,6 +5105,19 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/babel-loader/node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -5258,9 +5451,9 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "funding": [ { "type": "opencollective", @@ -5269,13 +5462,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -5399,9 +5597,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001474", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001474.tgz", - "integrity": "sha512-iaIZ8gVrWfemh5DG3T9/YqarVZoYf0r188IjaGwx68j4Pf0SGY6CQkmJUIE+NZHkkecQGohzXmBGEwWDr9aM3Q==", + "version": "1.0.30001684", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz", + "integrity": "sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==", "funding": [ { "type": "opencollective", @@ -5415,7 +5613,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -5536,6 +5735,22 @@ "node": ">=0.10.0" } }, + "node_modules/clean-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "del": "^4.1.1" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": ">=4.0.0 <6.0.0" + } + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -6065,18 +6280,19 @@ } }, "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", - "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", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">= 12.13.0" @@ -6086,7 +6302,16 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/css-minimizer-webpack-plugin": { @@ -6506,6 +6731,89 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -6522,6 +6830,15 @@ "node": ">= 0.8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -6759,9 +7076,10 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.356", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.356.tgz", - "integrity": "sha512-nEftV1dRX3omlxAj42FwqRZT0i4xd2dIg39sog/CnCJeCcL1TRd2Uh0i9Oebgv8Ou0vzTPw++xc+Z20jzS2B6A==" + "version": "1.5.65", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.65.tgz", + "integrity": "sha512-PWVzBjghx7/wop6n22vS2MLU8tKGd4Q91aCEGhG/TYmW6PP5OcSXcdnxTe1NNt0T66N8D6jxh4kC8UsdzOGaIw==", + "license": "ISC" }, "node_modules/emittery": { "version": "0.8.1", @@ -6796,9 +7114,10 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -6957,9 +7276,10 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -7854,6 +8174,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -8326,7 +8647,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" }, "node_modules/global-modules": { "version": "2.0.0", @@ -8624,9 +8946,10 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", + "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", + "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -8642,7 +8965,16 @@ "url": "https://opencollective.com/html-webpack-plugin" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/htmlparser2": { @@ -8835,7 +9167,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", - "devOptional": true + "dev": true }, "node_modules/import-fresh": { "version": "3.3.0", @@ -9152,6 +9484,42 @@ "node": ">=0.10.0" } }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -11913,15 +12281,16 @@ } }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -11975,9 +12344,10 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -12277,6 +12647,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/p-retry": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", @@ -12372,6 +12752,13 @@ "node": ">=0.10.0" } }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -12404,9 +12791,10 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -12427,6 +12815,29 @@ "node": ">=0.10.0" } }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -12562,9 +12973,9 @@ } }, "node_modules/postcss": { - "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==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "funding": [ { "type": "opencollective", @@ -12573,12 +12984,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -13177,9 +13593,10 @@ } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -13188,12 +13605,13 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", + "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", + "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "engines": { @@ -13203,12 +13621,26 @@ "postcss": "^8.1.0" } }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.4" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" }, "engines": { "node": "^10 || ^12 || >= 14" @@ -13217,6 +13649,19 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-modules-values": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", @@ -15044,7 +15489,7 @@ "version": "1.62.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.0.tgz", "integrity": "sha512-Q4USplo4pLYgCi+XlipZCWUQz5pkg/ruSSgJ0WRDSb/+3z9tXUOkQ7QPYn4XrhZKYAK4HlpaQecRwKLJX6+DBg==", - "devOptional": true, + "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -15058,12 +15503,12 @@ } }, "node_modules/sass-loader": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.2.tgz", - "integrity": "sha512-nrIdVAAte3B9icfBiGWvmMhT/D+eCDwnk+yA7VE/76dp/WkHX+i44Q/pfo71NYbwj0Ap+PGsn0ekOuU1WFJ2AA==", + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.3.tgz", + "integrity": "sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==", "dev": true, + "license": "MIT", "dependencies": { - "klona": "^2.0.6", "neo-async": "^2.6.2" }, "engines": { @@ -15075,7 +15520,7 @@ }, "peerDependencies": { "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" @@ -15120,9 +15565,10 @@ } }, "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -15153,12 +15599,10 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -15166,22 +15610,6 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -15423,9 +15851,10 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -15729,9 +16158,10 @@ } }, "node_modules/style-loader": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.2.tgz", - "integrity": "sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "license": "MIT", "engines": { "node": ">= 12.13.0" }, @@ -15950,12 +16380,13 @@ } }, "node_modules/terser": { - "version": "5.16.8", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz", - "integrity": "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==", + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "license": "BSD-2-Clause", "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -15967,15 +16398,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", - "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -16131,6 +16563,27 @@ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, + "node_modules/ts-loader": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -16249,16 +16702,17 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "peer": true, + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/unbox-primitive": { @@ -16275,6 +16729,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -16353,9 +16812,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "funding": [ { "type": "opencollective", @@ -16364,14 +16823,19 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -16390,6 +16854,7 @@ "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", "dev": true, + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "mime-types": "^2.1.27", @@ -16511,9 +16976,10 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -16544,33 +17010,33 @@ } }, "node_modules/webpack": { - "version": "5.79.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.79.0.tgz", - "integrity": "sha512-3mN4rR2Xq+INd6NnYuL9RC9GAmc1ROPKJoHhrZ4pAjdMFEkJJWrsPw8o2JjCIyQyTu7rTXYn4VG6OpyB3CobZg==", + "version": "5.96.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", + "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", + "license": "MIT", "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -16590,17 +17056,18 @@ } }, "node_modules/webpack-cli": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", - "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.0.1", - "@webpack-cli/info": "^2.0.1", - "@webpack-cli/serve": "^2.0.1", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", "colorette": "^2.0.14", - "commander": "^9.4.1", + "commander": "^10.0.1", "cross-spawn": "^7.0.3", "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", @@ -16635,12 +17102,13 @@ } }, "node_modules/webpack-cli/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.20.0 || >=14" + "node": ">=14" } }, "node_modules/webpack-dev-middleware": { @@ -18925,14 +19393,12 @@ "@csstools/postcss-unset-value": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "requires": {} + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==" }, "@csstools/selector-specificity": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", - "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", - "requires": {} + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==" }, "@discoveryjs/json-ext": { "version": "0.5.7", @@ -19676,19 +20142,12 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - } + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@leichtgewicht/ip-codec": { @@ -19851,22 +20310,6 @@ "string.prototype.matchall": "^4.0.6" } }, - "@testing-library/dom": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.2.0.tgz", - "integrity": "sha512-xTEnpUKiV/bMyEsE5bT4oYA0x0Z/colMtxzUY8bKyPXBNLn/e0V4ZjBZkEhms0xE4pv9QsPfSRu9AWS4y5wGvA==", - "peer": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "^5.0.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - } - }, "@testing-library/jest-dom": { "version": "5.16.5", "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz", @@ -19981,6 +20424,12 @@ "@babel/types": "^7.3.0" } }, + "@types/big.js": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.2.2.tgz", + "integrity": "sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA==", + "dev": true + }, "@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -20025,6 +20474,12 @@ "@types/node": "*" } }, + "@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "dev": true + }, "@types/eslint": { "version": "8.37.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", @@ -20035,18 +20490,18 @@ } }, "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "requires": { "@types/eslint": "*", "@types/estree": "*" } }, "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, "@types/express": { "version": "4.17.17", @@ -20084,6 +20539,16 @@ "integrity": "sha512-Kpi2GXQyYJdjL8mFclL1eDgihn1SIzorMZjD94kdPZh9E4VxGOeyjPxi5LpsM4Zku7P0reqegZTt2GxhmA9VBg==", "dev": true }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "@types/graceful-fs": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", @@ -20163,6 +20628,12 @@ } } }, + "@types/json-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/json-bigint/-/json-bigint-1.0.4.tgz", + "integrity": "sha512-ydHooXLbOmxBbubnA7Eh+RpBzuaIiQjh8WGJYQB50JFGFrdxW7JzVlyEV7fAXw0T2sqJ1ysTneJbiyNLqZRAag==", + "dev": true + }, "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -20178,10 +20649,28 @@ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, "@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" + "version": "22.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.0.tgz", + "integrity": "sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==", + "requires": { + "undici-types": "~6.20.0" + } + }, + "@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "requires": { + "@types/node": "*" + } }, "@types/parse-json": { "version": "4.0.0", @@ -20214,19 +20703,18 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { - "version": "18.0.33", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.33.tgz", - "integrity": "sha512-sHxzVxeanvQyQ1lr8NSHaj0kDzcNiGpILEVt69g9S31/7PfMvNCKLKcsHw4lYKjs3cGNJjXSP4mYzX43QlnjNA==", + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", "requires": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "@types/react-dom": { - "version": "18.0.11", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", - "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", "requires": { "@types/react": "*" } @@ -20244,11 +20732,6 @@ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, - "@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" - }, "@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", @@ -20271,6 +20754,15 @@ "@types/node": "*" } }, + "@types/sha256": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@types/sha256/-/sha256-0.2.2.tgz", + "integrity": "sha512-uKMaDzyzfcDYGEwTgLh+hmgDMxXWyIVodY8T+qt7A+NYvikW0lmGLMGbQ7BipCB8dzXHa55C9g+Ii/3Lgt1KmA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/sockjs": { "version": "0.3.33", "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", @@ -20434,156 +20926,153 @@ } }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==" }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==" }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==" }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==" }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==" }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "@webpack-cli/configtest": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", - "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", - "dev": true, - "requires": {} + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true }, "@webpack-cli/info": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", - "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", - "dev": true, - "requires": {} + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true }, "@webpack-cli/serve": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", - "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", - "dev": true, - "requires": {} + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true }, "@xtuc/ieee754": { "version": "1.2.0", @@ -20610,9 +21099,9 @@ } }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" }, "acorn-globals": { "version": "6.0.0", @@ -20630,17 +21119,10 @@ } } }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "requires": {} - }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": {} + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" }, "acorn-walk": { "version": "7.2.0", @@ -20709,8 +21191,7 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "ansi-escapes": { "version": "4.3.2", @@ -20766,11 +21247,11 @@ } }, "aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "requires": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "array-buffer-byte-length": { @@ -20804,6 +21285,12 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true + }, "array.prototype.flat": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", @@ -20944,12 +21431,12 @@ } }, "babel-loader": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", - "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, "requires": { - "find-cache-dir": "^3.3.2", + "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" }, "dependencies": { @@ -20974,12 +21461,74 @@ "fast-deep-equal": "^3.1.3" } }, + "find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "requires": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + } + }, + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "requires": { + "find-up": "^6.3.0" + } + }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -20991,6 +21540,12 @@ "ajv-formats": "^2.1.1", "ajv-keywords": "^5.0.0" } + }, + "yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true } } }, @@ -21030,8 +21585,7 @@ "babel-plugin-named-asset-import": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "requires": {} + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==" }, "babel-plugin-polyfill-corejs2": { "version": "0.3.3", @@ -21255,14 +21809,14 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" } }, "bser": { @@ -21342,9 +21896,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001474", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001474.tgz", - "integrity": "sha512-iaIZ8gVrWfemh5DG3T9/YqarVZoYf0r188IjaGwx68j4Pf0SGY6CQkmJUIE+NZHkkecQGohzXmBGEwWDr9aM3Q==" + "version": "1.0.30001684", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz", + "integrity": "sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==" }, "case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -21425,6 +21979,15 @@ } } }, + "clean-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", + "dev": true, + "requires": { + "del": "^4.1.1" + } + }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -21811,8 +22374,7 @@ "css-declaration-sorter": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", - "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", - "requires": {} + "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==" }, "css-has-pseudo": { "version": "3.0.4", @@ -21823,18 +22385,18 @@ } }, "css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "requires": { "icss-utils": "^5.1.0", - "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", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "semver": "^7.5.4" } }, "css-minimizer-webpack-plugin": { @@ -21895,8 +22457,7 @@ "css-prefers-color-scheme": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "requires": {} + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==" }, "css-select": { "version": "4.3.0", @@ -21984,8 +22545,7 @@ "cssnano-utils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "requires": {} + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==" }, "csso": { "version": "4.2.0", @@ -22130,6 +22690,68 @@ "object-keys": "^1.1.1" } }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -22140,6 +22762,11 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" + }, "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -22322,9 +22949,9 @@ } }, "electron-to-chromium": { - "version": "1.4.356", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.356.tgz", - "integrity": "sha512-nEftV1dRX3omlxAj42FwqRZT0i4xd2dIg39sog/CnCJeCcL1TRd2Uh0i9Oebgv8Ou0vzTPw++xc+Z20jzS2B6A==" + "version": "1.5.65", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.65.tgz", + "integrity": "sha512-PWVzBjghx7/wop6n22vS2MLU8tKGd4Q91aCEGhG/TYmW6PP5OcSXcdnxTe1NNt0T66N8D6jxh4kC8UsdzOGaIw==" }, "emittery": { "version": "0.8.1", @@ -22347,9 +22974,9 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -22478,9 +23105,9 @@ } }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" }, "escape-html": { "version": "1.0.3", @@ -22823,8 +23450,7 @@ "eslint-plugin-react-hooks": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "requires": {} + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==" }, "eslint-plugin-testing-library": { "version": "5.10.2", @@ -23695,9 +24321,9 @@ } }, "html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", + "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", "requires": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -23796,8 +24422,7 @@ "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "requires": {} + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" }, "idb": { "version": "7.1.1", @@ -23831,7 +24456,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", - "devOptional": true + "dev": true }, "import-fresh": { "version": "3.3.0", @@ -24039,6 +24664,32 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + }, + "dependencies": { + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + } + } + }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -25026,8 +25677,7 @@ "jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "requires": {} + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==" }, "jest-regex-util": { "version": "27.5.1", @@ -26207,9 +26857,9 @@ } }, "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==" }, "natural-compare": { "version": "1.4.0", @@ -26251,9 +26901,9 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "normalize-path": { "version": "3.0.0", @@ -26454,6 +27104,12 @@ "p-limit": "^3.0.2" } }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, "p-retry": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", @@ -26525,6 +27181,12 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -26551,9 +27213,9 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "picomatch": { "version": "2.3.1", @@ -26565,6 +27227,21 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, "pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -26662,13 +27339,13 @@ } }, "postcss": { - "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==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" } }, "postcss-attribute-case-insensitive": { @@ -26682,8 +27359,7 @@ "postcss-browser-comments": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", - "requires": {} + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==" }, "postcss-calc": { "version": "8.2.4", @@ -26781,26 +27457,22 @@ "postcss-discard-comments": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "requires": {} + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==" }, "postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "requires": {} + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==" }, "postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "requires": {} + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==" }, "postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "requires": {} + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==" }, "postcss-double-position-gradients": { "version": "3.1.2", @@ -26822,8 +27494,7 @@ "postcss-flexbugs-fixes": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "requires": {} + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==" }, "postcss-focus-visible": { "version": "6.0.4", @@ -26844,14 +27515,12 @@ "postcss-font-variant": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "requires": {} + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==" }, "postcss-gap-properties": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "requires": {} + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==" }, "postcss-image-set-function": { "version": "4.0.7", @@ -26874,8 +27543,7 @@ "postcss-initial": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "requires": {} + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==" }, "postcss-js": { "version": "4.0.1", @@ -26916,14 +27584,12 @@ "postcss-logical": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "requires": {} + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==" }, "postcss-media-minmax": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "requires": {} + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==" }, "postcss-merge-longhand": { "version": "5.1.7", @@ -26982,27 +27648,48 @@ } }, "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "requires": {} + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==" }, "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", + "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", "requires": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "requires": { - "postcss-selector-parser": "^6.0.4" + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-modules-values": { @@ -27043,8 +27730,7 @@ "postcss-normalize-charset": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "requires": {} + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==" }, "postcss-normalize-display-values": { "version": "5.1.0", @@ -27115,8 +27801,7 @@ "postcss-opacity-percentage": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", - "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", - "requires": {} + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==" }, "postcss-ordered-values": { "version": "5.1.3", @@ -27138,8 +27823,7 @@ "postcss-page-break": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "requires": {} + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==" }, "postcss-place": { "version": "7.0.5", @@ -27233,8 +27917,7 @@ "postcss-replace-overflow-wrap": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "requires": {} + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==" }, "postcss-selector-not": { "version": "6.0.1", @@ -27515,8 +28198,7 @@ "react-chrome-extension-router": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/react-chrome-extension-router/-/react-chrome-extension-router-1.4.0.tgz", - "integrity": "sha512-ngf7DMVGIcr0w8Fp3Eo6nufi3L1mQqLz1xLfvzD1YBPI8zLSKAS9PP3pUS+vp7oeE62ZKxcFJiUC6OFKuBQ6Cg==", - "requires": {} + "integrity": "sha512-ngf7DMVGIcr0w8Fp3Eo6nufi3L1mQqLz1xLfvzD1YBPI8zLSKAS9PP3pUS+vp7oeE62ZKxcFJiUC6OFKuBQ6Cg==" }, "react-dev-utils": { "version": "12.0.1", @@ -27573,8 +28255,7 @@ "react-id-generator": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/react-id-generator/-/react-id-generator-3.0.2.tgz", - "integrity": "sha512-d0rqWzZ6g0P9agHtA7wX/ErQ4iV/657/0Oz+SX3kid7nR4d0YwaWjjOTIrgYHv2lICZKrxIH4BaKppKrM8fRfw==", - "requires": {} + "integrity": "sha512-d0rqWzZ6g0P9agHtA7wX/ErQ4iV/657/0Oz+SX3kid7nR4d0YwaWjjOTIrgYHv2lICZKrxIH4BaKppKrM8fRfw==" }, "react-is": { "version": "17.0.2", @@ -28227,7 +28908,7 @@ "version": "1.62.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.0.tgz", "integrity": "sha512-Q4USplo4pLYgCi+XlipZCWUQz5pkg/ruSSgJ0WRDSb/+3z9tXUOkQ7QPYn4XrhZKYAK4HlpaQecRwKLJX6+DBg==", - "devOptional": true, + "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -28235,12 +28916,11 @@ } }, "sass-loader": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.2.tgz", - "integrity": "sha512-nrIdVAAte3B9icfBiGWvmMhT/D+eCDwnk+yA7VE/76dp/WkHX+i44Q/pfo71NYbwj0Ap+PGsn0ekOuU1WFJ2AA==", + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.3.tgz", + "integrity": "sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==", "dev": true, "requires": { - "klona": "^2.0.6", "neo-async": "^2.6.2" } }, @@ -28266,9 +28946,9 @@ } }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -28289,27 +28969,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" }, "send": { "version": "0.18.0", @@ -28519,9 +29181,9 @@ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" }, "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" }, "source-map-loader": { "version": "3.0.2", @@ -28753,10 +29415,9 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "style-loader": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.2.tgz", - "integrity": "sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw==", - "requires": {} + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==" }, "stylehacks": { "version": "5.1.1", @@ -28901,12 +29562,12 @@ } }, "terser": { - "version": "5.16.8", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz", - "integrity": "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==", + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -28919,15 +29580,15 @@ } }, "terser-webpack-plugin": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", - "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "requires": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" + "terser": "^5.26.0" } }, "test-exclude": { @@ -29035,6 +29696,19 @@ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, + "ts-loader": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + } + }, "tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -29127,10 +29801,10 @@ } }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "peer": true + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true }, "unbox-primitive": { "version": "1.0.2", @@ -29143,6 +29817,11 @@ "which-boxed-primitive": "^1.0.2" } }, + "undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -29196,12 +29875,12 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" } }, "uri-js": { @@ -29303,9 +29982,9 @@ } }, "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -29330,33 +30009,32 @@ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "webpack": { - "version": "5.79.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.79.0.tgz", - "integrity": "sha512-3mN4rR2Xq+INd6NnYuL9RC9GAmc1ROPKJoHhrZ4pAjdMFEkJJWrsPw8o2JjCIyQyTu7rTXYn4VG6OpyB3CobZg==", + "version": "5.96.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", + "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "dependencies": { @@ -29377,17 +30055,17 @@ } }, "webpack-cli": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", - "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.0.1", - "@webpack-cli/info": "^2.0.1", - "@webpack-cli/serve": "^2.0.1", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", "colorette": "^2.0.14", - "commander": "^9.4.1", + "commander": "^10.0.1", "cross-spawn": "^7.0.3", "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", @@ -29398,9 +30076,9 @@ }, "dependencies": { "commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true } } @@ -29529,8 +30207,7 @@ "ws": { "version": "8.13.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "requires": {} + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==" } } }, @@ -29981,8 +30658,7 @@ "ws": { "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "requires": {} + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==" }, "xml-name-validator": { "version": "3.0.0", diff --git a/package.json b/package.json index d75c592..16bfef0 100644 --- a/package.json +++ b/package.json @@ -51,17 +51,29 @@ "@babel/core": "^7.21.4", "@babel/preset-env": "^7.21.4", "@babel/preset-react": "^7.18.6", + "@types/big.js": "^6.2.2", "@types/chrome": "^0.0.251", - "babel-loader": "^9.1.2", + "@types/crypto-js": "^4.2.2", + "@types/json-bigint": "^1.0.4", + "@types/node": "^22.10.0", + "@types/node-forge": "^1.3.11", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@types/sha256": "^0.2.2", + "babel-loader": "^9.2.1", + "clean-webpack-plugin": "^4.0.0", "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.7.3", - "html-webpack-plugin": "^5.5.0", + "css-loader": "^6.11.0", + "file-loader": "^6.2.0", + "html-webpack-plugin": "^5.6.3", "sass": "^1.62.0", - "sass-loader": "^13.2.2", - "style-loader": "^3.3.2", + "sass-loader": "^13.3.3", + "style-loader": "^3.3.4", + "ts-loader": "^9.5.1", + "typescript": "^5.7.2", "url-loader": "^4.1.1", - "webpack": "^5.79.0", - "webpack-cli": "^5.0.1", + "webpack": "^5.96.1", + "webpack-cli": "^5.1.4", "webpack-merge": "^5.8.0" } } diff --git a/src/app/App.js b/src/app/App.js index 0ff1a0b..b800f6c 100644 --- a/src/app/App.js +++ b/src/app/App.js @@ -25,14 +25,14 @@ import { updateConfirmationModal, updateTransactionStatus, setConnectData, - setWhiteList + setWhiteList, } from "./store/actions"; import { Store } from "./store/store-reducer"; import { getZanoPrice } from "./api/coingecko"; import "./styles/App.scss"; import PasswordPage from "./components/PasswordPage/PasswordPage"; import MessageSignPage from "./components/MessageSignPage/MessageSignPage"; -import AliasCreatePage from "./components/AliasCreatePage/AliasCreatePage"; +import AliasCreatePage from "./components/AliasCreatePage/AliasCreatePaget.jsx"; import ConnectPage from "./components/ConnectPage/ConnectPage"; import ConnectKeyUtils from "./utils/ConnectKeyUtils"; import { defaultPort } from "./config/config"; @@ -45,7 +45,7 @@ import useGetAsset from "./hooks/useGetAsset"; function App() { const { state, dispatch } = useContext(Store); const [confirmationModalOpen, setConfirmationModalOpen] = useState(false); - const {getAssetById} = useGetAsset(); + const { getAssetById } = useGetAsset(); const [incorrectPassword, setIncorrectPassword] = useState(false); const [loggedIn, setLoggedIn] = useState(false); @@ -61,7 +61,7 @@ function App() { useEffect(() => { async function loadLogin() { - const password = (await getSessionPassword()); + const password = await getSessionPassword(); setLoggedIn(!!password); if (password) { const connectData = ConnectKeyUtils.getConnectData(password); @@ -266,18 +266,19 @@ function App() { }); }, [dispatch]); - - const appConnected = !!(state.connectCredentials?.token || ConnectKeyUtils.getConnectKeyEncrypted()); + const appConnected = !!( + state.connectCredentials?.token || ConnectKeyUtils.getConnectKeyEncrypted() + ); useEffect(() => { - async function modalLoad() { - async function getTransferRequests() { - const transferRes = await fetchBackground({ method: "GET_TRANSFER_REQUEST" }); + const transferRes = await fetchBackground({ + method: "GET_TRANSFER_REQUEST", + }); const transferRequests = transferRes.data; const tranfserPageReqs = transferRequests.map((e) => { - const {transfer} = e; + const { transfer } = e; return { id: e.id, method: "FINALIZE_TRANSFER_REQUEST", @@ -285,24 +286,27 @@ function App() { params: [ { key: "From", - value: transfer.sender ? Formatters.walletAddress(transfer.sender) : "???" + value: transfer.sender + ? Formatters.walletAddress(transfer.sender) + : "???", }, { key: "To", - value: transfer.destination ? Formatters.walletAddress(transfer.destination) : "???" + value: transfer.destination + ? Formatters.walletAddress(transfer.destination) + : "???", }, { key: "Amount", - value: transfer.amount || "???" + value: transfer.amount || "???", }, { key: "Asset", - value: transfer?.asset?.ticker || "???" + value: transfer?.asset?.ticker || "???", }, - - ] - } - }) + ], + }; + }); if (tranfserPageReqs && tranfserPageReqs.length > 0) { goTo(OuterConfirmation, { reqs: tranfserPageReqs }); } @@ -311,20 +315,21 @@ function App() { async function getSignRequests() { const response = await fetchBackground({ method: "GET_SIGN_REQUESTS" }); const signRequests = response.data; - + if (signRequests && signRequests.length > 0) { goTo(MessageSignPage, { signRequests }); } } async function getAliasCreationRequests() { - const response = await fetchBackground({ method: "GET_ALIAS_CREATE_REQUESTS" }); - console.log('alias creation requests', response); + const response = await fetchBackground({ + method: "GET_ALIAS_CREATE_REQUESTS", + }); + console.log("alias creation requests", response); const createRequests = response.data; - - if (createRequests && createRequests.length > 0) { - console.log('open alias create page'); + if (createRequests && createRequests.length > 0) { + console.log("open alias create page"); goTo(AliasCreatePage, { createRequests }); } } @@ -335,19 +340,21 @@ function App() { <> {amount.toFixed()} - - {" "}{asset.ticker} + {" "} + {asset.ticker} ); return result; } - const ionicSwapRes = await fetchBackground({ method: "GET_IONIC_SWAP_REQUESTS" }); + const ionicSwapRes = await fetchBackground({ + method: "GET_IONIC_SWAP_REQUESTS", + }); const swapRequests = ionicSwapRes.data; - const swapPageReqs = swapRequests.map(e => { - const {swap} = e; + const swapPageReqs = swapRequests.map((e) => { + const { swap } = e; const swapParams = {}; @@ -356,13 +363,16 @@ function App() { const receivingAsset = swap.destinationAsset; const receivingAmount = new Big(swap.destinationAssetAmount); - swapParams.receiving = getSwapAmountText(receivingAmount, receivingAsset); + swapParams.receiving = getSwapAmountText( + receivingAmount, + receivingAsset + ); const sendingAsset = swap.currentAsset; const sendingAmount = new Big(swap.currentAssetAmount); swapParams.sending = getSwapAmountText(sendingAmount, sendingAsset); - + return { id: e.id, method: "FINALIZE_IONIC_SWAP_REQUEST", @@ -370,78 +380,95 @@ function App() { params: [ { key: "Address", - value: swapParams.address ? Formatters.walletAddress(swapParams.address) : "???" + value: swapParams.address + ? Formatters.walletAddress(swapParams.address) + : "???", }, { key: "Sending", - value: swapParams.sending || "???" + value: swapParams.sending || "???", }, { key: "Receiving", - value: swapParams.receiving || "???" - } - ] - } - }); + value: swapParams.receiving || "???", + }, + ], + }; + }); - const ionicSwapAcceptRes = await fetchBackground({ method: "GET_ACCEPT_IONIC_SWAP_REQUESTS" }); + const ionicSwapAcceptRes = await fetchBackground({ + method: "GET_ACCEPT_IONIC_SWAP_REQUESTS", + }); const acceptSwapReqs = ionicSwapAcceptRes.data; console.log("ACCEPT SWAP", acceptSwapReqs); - const acceptPageReqs = await Promise.all(acceptSwapReqs.map(async e => { - const hex_raw_proposal = e?.hex_raw_proposal; + const acceptPageReqs = await Promise.all( + acceptSwapReqs.map(async (e) => { + const hex_raw_proposal = e?.hex_raw_proposal; - const swap = e?.swapProposal; + const swap = e?.swapProposal; - const swapParams = {}; + const swapParams = {}; - function toBigWithDecimal(amount, decimalPoint) { - if (amount) { - return new Big(amount).div(new Big(10).pow(decimalPoint)); - } - } - - if (swap) { - const receivingAsset = e?.receivingAsset; - const receivingAmount = toBigWithDecimal(swap.to_finalizer[0]?.amount, receivingAsset.decimal_point); - - if (receivingAmount !== undefined) { - swapParams.receiving = getSwapAmountText(receivingAmount, receivingAsset); + function toBigWithDecimal(amount, decimalPoint) { + if (amount) { + return new Big(amount).div(new Big(10).pow(decimalPoint)); + } } - const sendingAsset = e?.sendingAsset; - const sendingAmount = toBigWithDecimal(swap.to_initiator[0]?.amount, sendingAsset.decimal_point); + if (swap) { + const receivingAsset = e?.receivingAsset; + const receivingAmount = toBigWithDecimal( + swap.to_finalizer[0]?.amount, + receivingAsset.decimal_point + ); - if (sendingAmount !== undefined) { - swapParams.sending = getSwapAmountText(sendingAmount, sendingAsset); + if (receivingAmount !== undefined) { + swapParams.receiving = getSwapAmountText( + receivingAmount, + receivingAsset + ); + } + + const sendingAsset = e?.sendingAsset; + const sendingAmount = toBigWithDecimal( + swap.to_initiator[0]?.amount, + sendingAsset.decimal_point + ); + + if (sendingAmount !== undefined) { + swapParams.sending = getSwapAmountText( + sendingAmount, + sendingAsset + ); + } } - } - - return { - id: e.id, - method: "FINALIZE_ACCEPT_IONIC_SWAP_REQUEST", - name: "Accept Ionic Swap", - params: [ - { - key: "Hex Proposal", - value: Formatters.walletAddress(hex_raw_proposal) - }, - { - key: "Sending", - value: swapParams.sending || "???" - }, - { - key: "Receiving", - value: swapParams.receiving || "???" - }, - ] - } - })); + return { + id: e.id, + method: "FINALIZE_ACCEPT_IONIC_SWAP_REQUEST", + name: "Accept Ionic Swap", + params: [ + { + key: "Hex Proposal", + value: Formatters.walletAddress(hex_raw_proposal), + }, + { + key: "Sending", + value: swapParams.sending || "???", + }, + { + key: "Receiving", + value: swapParams.receiving || "???", + }, + ], + }; + }) + ); const pageReqs = [...swapPageReqs, ...acceptPageReqs]; - + if (pageReqs && pageReqs.length > 0) { goTo(OuterConfirmation, { reqs: pageReqs }); } @@ -456,7 +483,13 @@ function App() { if (appConnected && !connectOpened && loggedIn && state.isConnected) { modalLoad(); } - }, [appConnected, connectOpened, loggedIn, state.isConnected, state.wallet?.assets]); + }, [ + appConnected, + connectOpened, + loggedIn, + state.isConnected, + state.wallet?.assets, + ]); useEffect(() => { console.log("connectCredentials", state.connectCredentials); diff --git a/src/app/api/coingecko.js b/src/app/api/coingecko.ts similarity index 100% rename from src/app/api/coingecko.js rename to src/app/api/coingecko.ts diff --git a/src/app/components/AliasCreatePage/AliasCreatePage.jsx b/src/app/components/AliasCreatePage/AliasCreatePaget.jsx similarity index 100% rename from src/app/components/AliasCreatePage/AliasCreatePage.jsx rename to src/app/components/AliasCreatePage/AliasCreatePaget.jsx diff --git a/src/app/components/AppPlug/AppPlug.jsx b/src/app/components/AppPlug/AppPlug.tsx similarity index 89% rename from src/app/components/AppPlug/AppPlug.jsx rename to src/app/components/AppPlug/AppPlug.tsx index 05b0ab9..2608355 100644 --- a/src/app/components/AppPlug/AppPlug.jsx +++ b/src/app/components/AppPlug/AppPlug.tsx @@ -5,11 +5,17 @@ import questionIcon from "../../assets/svg/question.svg"; import { Store } from "../../store/store-reducer"; import s from "./AppPlug.module.scss"; -const AppPlug = (props) => { +// Define the type for props +interface AppPlugProps { + setConnectOpened: (isOpened: boolean) => void; +} + +const AppPlug: React.FC = (props) => { const { state } = useContext(Store); const { setConnectOpened } = props; + // Type of btnClasses is inferred as string const btnClasses = state.isLoading ? [s.plugButton, s.hidden].join(" ") : s.plugButton; diff --git a/src/app/components/UI/AppLoader/AppLoader.jsx b/src/app/components/UI/AppLoader/AppLoader.tsx similarity index 78% rename from src/app/components/UI/AppLoader/AppLoader.jsx rename to src/app/components/UI/AppLoader/AppLoader.tsx index 0ca3d9e..8c0c018 100644 --- a/src/app/components/UI/AppLoader/AppLoader.jsx +++ b/src/app/components/UI/AppLoader/AppLoader.tsx @@ -4,8 +4,15 @@ import logo from "../../../assets/svg/logo.svg"; import { Store } from "../../../store/store-reducer"; import s from "./AppLoader.module.scss"; -const AppLoader = ({ isSmall, firstWalletLoaded, loggedIn }) => { +interface AppLoaderProps { + isSmall?: boolean; + firstWalletLoaded: boolean; + loggedIn: boolean; +} + +const AppLoader: React.FC = ({ isSmall, firstWalletLoaded, loggedIn }) => { const { state } = useContext(Store); + const loaderClasses = isSmall ? [s.loader, s.small].join(" ") : s.loader; return ( @@ -26,4 +33,4 @@ const AppLoader = ({ isSmall, firstWalletLoaded, loggedIn }) => { ); }; -export default AppLoader; \ No newline at end of file +export default AppLoader; diff --git a/src/app/components/UI/Loader/Loader.jsx b/src/app/components/UI/Loader/Loader.tsx similarity index 100% rename from src/app/components/UI/Loader/Loader.jsx rename to src/app/components/UI/Loader/Loader.tsx diff --git a/src/app/components/UI/Modal/Modal.jsx b/src/app/components/UI/Modal/Modal.tsx similarity index 73% rename from src/app/components/UI/Modal/Modal.jsx rename to src/app/components/UI/Modal/Modal.tsx index f5e618d..5583c1e 100644 --- a/src/app/components/UI/Modal/Modal.jsx +++ b/src/app/components/UI/Modal/Modal.tsx @@ -1,9 +1,17 @@ -import React, { useCallback, useEffect, useState } from "react"; +import React, { MouseEvent, ReactNode, useCallback, useEffect, useState } from "react"; import cls from "./Modal.module.scss"; import { createPortal } from "react-dom"; import { classNames } from '../../../utils/classNames'; -const Modal = (props) => { +interface ModalProps { + className?: string; + children: ReactNode; + isOpen: boolean; + onClose: () => void; + width?: string | number; +} + +const Modal = (props: ModalProps) => { const { className, children, isOpen, onClose, width } = props; const [isMounted, setIsMounted] = useState(false); @@ -21,7 +29,7 @@ const Modal = (props) => { }, [onClose]); const onKeyDown = useCallback( - (e) => { + (e: KeyboardEvent) => { if (e.key === "Escape") { closeHandler(); } @@ -39,7 +47,7 @@ const Modal = (props) => { }; }, [isOpen, onKeyDown]); - const onContentClick = (e) => { + const onContentClick = (e: MouseEvent) => { e.stopPropagation(); }; @@ -54,7 +62,7 @@ const Modal = (props) => { return createPortal(
-
+
{children}
diff --git a/src/app/components/UI/MyCheckbox/MyCheckbox.jsx b/src/app/components/UI/MyCheckbox/MyCheckbox.tsx similarity index 62% rename from src/app/components/UI/MyCheckbox/MyCheckbox.jsx rename to src/app/components/UI/MyCheckbox/MyCheckbox.tsx index ba6e5c0..ed8b561 100644 --- a/src/app/components/UI/MyCheckbox/MyCheckbox.jsx +++ b/src/app/components/UI/MyCheckbox/MyCheckbox.tsx @@ -1,8 +1,12 @@ -import React from "react"; +import React, { InputHTMLAttributes } from "react"; import nextId from "react-id-generator"; import s from "./MyCheckbox.module.scss"; -const MyCheckbox = ({ label, ...props }) => { +interface MyCheckboxProps extends InputHTMLAttributes { + label: string; +} + +const MyCheckbox: React.FC = ({ label, ...props }) => { const id = nextId(); return ( diff --git a/src/app/components/UI/MyInput/MyInput.jsx b/src/app/components/UI/MyInput/MyInput.tsx similarity index 64% rename from src/app/components/UI/MyInput/MyInput.jsx rename to src/app/components/UI/MyInput/MyInput.tsx index bd1453d..3671eda 100644 --- a/src/app/components/UI/MyInput/MyInput.jsx +++ b/src/app/components/UI/MyInput/MyInput.tsx @@ -1,9 +1,27 @@ -import React, { memo } from "react"; +import React, { memo, ChangeEvent, InputHTMLAttributes } from "react"; import nextId from "react-id-generator"; import cls from "./MyInput.module.scss"; import { classNames } from "../../../utils/classNames"; -const MyInput = memo((props) => { +interface MyInputProps extends InputHTMLAttributes { + label?: string; + inputData: { + value: string; + onChange: (e: ChangeEvent) => void; + onInput: (value: string) => void; + inputValid: boolean; + onBlur: () => void; + isDirty: boolean; + isFilled: boolean; + }; + isValid?: boolean; + noActiveBorder?: boolean; + isError?: boolean; + noValidation?: boolean; + type: string; +} + +const MyInput: React.FC = memo((props) => { const id = nextId(); const { label, @@ -15,10 +33,10 @@ const MyInput = memo((props) => { noValidation, ...otherProps } = props; - const { value, onChange, onInput, inputValid, onBlur, isDirty, isFilled } = - inputData; - const onInputHandler = (e) => { + const { value, onChange, onInput, inputValid, onBlur, isDirty, isFilled } = inputData; + + const onInputHandler = (e: ChangeEvent) => { if (type === "number" && !noValidation) { const newValue = e.target.value .replace(/[^0-9.]/g, "") @@ -40,7 +58,7 @@ const MyInput = memo((props) => {
onInputHandler(e)} + onChange={onInputHandler} type={type} id={id} value={value} diff --git a/src/app/config/config.js b/src/app/config/config.ts similarity index 100% rename from src/app/config/config.js rename to src/app/config/config.ts diff --git a/src/app/hooks/useAwayClick.js b/src/app/hooks/useAwayClick.ts similarity index 52% rename from src/app/hooks/useAwayClick.js rename to src/app/hooks/useAwayClick.ts index d325b37..c7ba867 100644 --- a/src/app/hooks/useAwayClick.js +++ b/src/app/hooks/useAwayClick.ts @@ -1,16 +1,18 @@ import { useEffect, useRef } from "react"; -const useAwayClick = (ref, callback) => { - const savedCallback = useRef(); +type Callback = () => void; + +const useAwayClick = (ref: React.RefObject, callback: Callback) => { + const savedCallback = useRef(); useEffect(() => { savedCallback.current = callback; }, [callback]); useEffect(() => { - const handleClick = (event) => { - if (ref.current && !ref.current.contains(event.target)) { - savedCallback.current(); + const handleClick = (event: MouseEvent) => { + if (ref.current && !ref.current.contains(event.target as Node)) { + savedCallback.current?.(); } }; diff --git a/src/app/hooks/useCensorDigits.js b/src/app/hooks/useCensorDigits.ts similarity index 75% rename from src/app/hooks/useCensorDigits.js rename to src/app/hooks/useCensorDigits.ts index 426c103..203ebf3 100644 --- a/src/app/hooks/useCensorDigits.js +++ b/src/app/hooks/useCensorDigits.ts @@ -6,10 +6,10 @@ export function useCensorDigits() { const { state, dispatch } = useContext(Store); const changeCensor = () => { - updateBalancesHidden(dispatch, (prevState) => !prevState); + updateBalancesHidden(dispatch, (prevState: boolean) => !prevState); }; - const censorValue = (number) => { + const censorValue = (number: number | string): string | number => { if (state.isBalancesHidden) { return number.toString().replace(/\d/g, "*"); } else { @@ -19,3 +19,4 @@ export function useCensorDigits() { return { changeCensor, censorValue }; } + diff --git a/src/app/hooks/useCheckbox.js b/src/app/hooks/useCheckbox.ts similarity index 77% rename from src/app/hooks/useCheckbox.js rename to src/app/hooks/useCheckbox.ts index f04d1fb..c74bb35 100644 --- a/src/app/hooks/useCheckbox.js +++ b/src/app/hooks/useCheckbox.ts @@ -1,6 +1,6 @@ import { useState } from "react"; -export const useCheckbox = (initialState) => { +export const useCheckbox = (initialState: boolean) => { const [isChecked, setIsChecked] = useState(initialState); const onChange = () => { diff --git a/src/app/hooks/useCopy.js b/src/app/hooks/useCopy.ts similarity index 87% rename from src/app/hooks/useCopy.js rename to src/app/hooks/useCopy.ts index aab2ebc..a91a5ad 100644 --- a/src/app/hooks/useCopy.js +++ b/src/app/hooks/useCopy.ts @@ -4,7 +4,7 @@ import { useState } from "react"; export const useCopy = () => { const [copied, setCopied] = useState(false); - const copyToClipboard = (text) => { + const copyToClipboard = (text: string) => { copy(text); if (!copied) { setCopied(true); diff --git a/src/app/hooks/useGetAsset.js b/src/app/hooks/useGetAsset.js deleted file mode 100644 index 57a8e20..0000000 --- a/src/app/hooks/useGetAsset.js +++ /dev/null @@ -1,13 +0,0 @@ -import { useContext } from "react"; -import { Store } from "../store/store-reducer"; - - -export default function useGetAsset() { - const {state} = useContext(Store); - - function getAssetById(id) { - return state.wallet.assets.find(asset => asset.assetId === id); - } - - return { getAssetById }; -} \ No newline at end of file diff --git a/src/app/hooks/useGetAsset.ts b/src/app/hooks/useGetAsset.ts new file mode 100644 index 0000000..f877cb7 --- /dev/null +++ b/src/app/hooks/useGetAsset.ts @@ -0,0 +1,16 @@ +import { useContext } from "react"; +import { Store } from "../store/store-reducer"; + +interface Asset { + assetId: string; +} + +export default function useGetAsset() { + const { state } = useContext(Store); + + function getAssetById(id: string) { + return state.wallet.assets.find((asset: Asset | any) => asset.assetId === id); + } + + return { getAssetById }; +} diff --git a/src/app/hooks/useInput.js b/src/app/hooks/useInput.js deleted file mode 100644 index f09b8db..0000000 --- a/src/app/hooks/useInput.js +++ /dev/null @@ -1,24 +0,0 @@ -import { useState } from "react"; -import { useValidation } from "./useValidation"; - -export const useInput = (initialState, validations) => { - const [value, setValue] = useState(initialState); - const [isDirty, setIsDirty] = useState(false); - const valid = useValidation(value, validations); - - const onChange = (e) => { - setValue(e.target.value); - }; - - const onInput = (value) => { - setValue(value); - }; - - const onBlur = () => { - setIsDirty(true); - }; - - const isFilled = value.length > 0; - - return { value, onChange, onInput, onBlur, isFilled, isDirty, ...valid }; -}; diff --git a/src/app/hooks/useInput.ts b/src/app/hooks/useInput.ts new file mode 100644 index 0000000..ea5460f --- /dev/null +++ b/src/app/hooks/useInput.ts @@ -0,0 +1,34 @@ +import { useState } from "react"; +import { useValidation } from "./useValidation"; + +type Validations = { + minLength?: number; + isEmpty?: boolean; + isAmountCorrect?: boolean; + customValidation?: boolean; +}; + +export const useInput = ( + initialState: string | number, + validations: Validations +) => { + const [value, setValue] = useState(initialState); + const [isDirty, setIsDirty] = useState(false); + const valid = useValidation(value, validations); + + const onChange = (e: React.ChangeEvent) => { + setValue(e.target.value); + }; + + const onInput = (newValue: string | number) => { + setValue(newValue); + }; + + const onBlur = () => { + setIsDirty(true); + }; + + const isFilled = typeof value === "string" && value.length > 0; + + return { value, onChange, onInput, onBlur, isFilled, isDirty, ...valid }; +}; diff --git a/src/app/hooks/useValidation.js b/src/app/hooks/useValidation.js deleted file mode 100644 index 4cfcf8e..0000000 --- a/src/app/hooks/useValidation.js +++ /dev/null @@ -1,48 +0,0 @@ -import { useEffect, useState } from "react"; - -export const useValidation = (value, validations) => { - const [isEmpty, setIsEmpty] = useState(true); - const [minLengthError, setMinLengthError] = useState(false); - const [amountCorrectError, setAmountCorrectError] = useState(false); - const [inputValid, setInputValid] = useState(false); - - useEffect(() => { - for (const validation in validations) { - switch (validation) { - case "minLength": - value.length < validations[validation] - ? setMinLengthError(true) - : setMinLengthError(false); - break; - case "isEmpty": - value ? setIsEmpty(false) : setIsEmpty(true); - break; - case "isAmountCorrect": - const amountCheckResult = - !isNaN(value) && value >= 0.000000000001 && value <= 1000000000; - setAmountCorrectError(!amountCheckResult); - break; - case "customValidation": - setInputValid(true); - break; - default: - break; - } - } - }, [validations, value]); - - useEffect(() => { - if (isEmpty || minLengthError || amountCorrectError) { - setInputValid(false); - } else { - setInputValid(true); - } - }, [isEmpty, minLengthError, amountCorrectError]); - - return { - isEmpty, - minLengthError, - amountCorrectError, - inputValid, - }; -}; diff --git a/src/app/hooks/useValidation.ts b/src/app/hooks/useValidation.ts new file mode 100644 index 0000000..fa42471 --- /dev/null +++ b/src/app/hooks/useValidation.ts @@ -0,0 +1,60 @@ +import { useEffect, useState } from "react"; + +type Validations = { + minLength?: number; + isEmpty?: boolean; + isAmountCorrect?: boolean; + customValidation?: boolean; +}; + +export const useValidation = (value: string | number, validations: Validations) => { + const [isEmpty, setIsEmpty] = useState(true); + const [minLengthError, setMinLengthError] = useState(false); + const [amountCorrectError, setAmountCorrectError] = useState(false); + const [inputValid, setInputValid] = useState(false); + + useEffect(() => { + for (const validation in validations) { + switch (validation) { + case "minLength": + if (typeof value === "string" && value.length < validations[validation]!) { + setMinLengthError(true); + } else { + setMinLengthError(false); + } + break; + case "isEmpty": + setIsEmpty(!value); + break; + case "isAmountCorrect": + const amountCheckResult = + typeof value === "number" && + !isNaN(value) && + value >= 0.000000000001 && + value <= 1000000000; + setAmountCorrectError(!amountCheckResult); + break; + case "customValidation": + setInputValid(true); + break; + default: + break; + } + } + }, [validations, value]); + + useEffect(() => { + if (isEmpty || minLengthError || amountCorrectError) { + setInputValid(false); + } else { + setInputValid(true); + } + }, [isEmpty, minLengthError, amountCorrectError]); + + return { + isEmpty, + minLengthError, + amountCorrectError, + inputValid, + }; +}; diff --git a/src/app/store/actions.js b/src/app/store/actions.js deleted file mode 100644 index a70d9be..0000000 --- a/src/app/store/actions.js +++ /dev/null @@ -1,83 +0,0 @@ -export const updateWalletsList = (dispatch, state) => { - return dispatch({ - type: "WALLETS_LIST_UPDATED", - payload: state, - }); -}; - -export const updateWalletData = (dispatch, state) => { - return dispatch({ - type: "WALLET_DATA_UPDATED", - payload: state, - }); -}; - -export const updateWalletConnected = (dispatch, state) => { - return dispatch({ - type: "WALLET_CONNECTED_UPDATED", - payload: state, - }); -}; - -export const updateActiveWalletId = (dispatch, state) => { - return dispatch({ - type: "ACTIVE_WALLET_ID_UPDATED", - payload: state, - }); -}; - -export const updatePriceData = (dispatch, state) => { - return dispatch({ - type: "PRICE_DATA_UPDATED", - payload: state, - }); -}; - -export const updateDisplay = (dispatch, state) => { - return dispatch({ - type: "DISPLAY_CURRENCY_UPDATED", - payload: state, - }); -}; - -export const updateLoading = (dispatch, state) => { - return dispatch({ - type: "LOADING_UPDATED", - payload: state, - }); -}; - -export const updateBalancesHidden = (dispatch, state) => { - return dispatch({ - type: "BALANCES_HIDDEN_UPDATED", - payload: state, - }); -}; - -export const updateConfirmationModal = (dispatch, state) => { - return dispatch({ - type: "CONFIRMATION_MODAL_UPDATED", - payload: state, - }); -}; - -export const updateTransactionStatus = (dispatch, state) => { - return dispatch({ - type: "TRANSACTION_STATUS_UPDATED", - payload: state, - }); -}; - -export const setConnectData = (dispatch, state) => { - return dispatch({ - type: "SET_CONNECT_DATA", - payload: state - }); -}; - -export const setWhiteList = (dispatch, state) => { - return dispatch({ - type: "SET_WHITE_LIST", - payload: state - }); -} \ No newline at end of file diff --git a/src/app/store/actions.ts b/src/app/store/actions.ts new file mode 100644 index 0000000..0561e02 --- /dev/null +++ b/src/app/store/actions.ts @@ -0,0 +1,102 @@ +// Define types for the structure of your state +interface WalletState { + wallets: string[]; + walletData: object; + isConnected: boolean; + activeWalletId: string; + priceData: object; + displayCurrency: string; + isLoading: boolean; + balancesHidden: boolean; + confirmationModalOpen: boolean; + transactionStatus: string; + connectData: object; + whiteList: string[]; +} + +type DispatchFunction = (action: { type: string; payload: WalletState[keyof WalletState] }) => void; +type DispatchBalance = { type: string; payload: string | boolean | object | string[]; }; + +export const updateWalletsList = (dispatch: DispatchFunction, state: WalletState['wallets']): void => { + return dispatch({ + type: "WALLETS_LIST_UPDATED", + payload: state, + }); +}; + +export const updateWalletData = (dispatch: DispatchFunction, state: WalletState['walletData']): void => { + return dispatch({ + type: "WALLET_DATA_UPDATED", + payload: state, + }); +}; + +export const updateWalletConnected = (dispatch: DispatchFunction, state: WalletState['isConnected']): void => { + return dispatch({ + type: "WALLET_CONNECTED_UPDATED", + payload: state, + }); +}; + +export const updateActiveWalletId = (dispatch: DispatchFunction, state: WalletState['activeWalletId']): void => { + return dispatch({ + type: "ACTIVE_WALLET_ID_UPDATED", + payload: state, + }); +}; + +export const updatePriceData = (dispatch: DispatchFunction, state: WalletState['priceData']): void => { + return dispatch({ + type: "PRICE_DATA_UPDATED", + payload: state, + }); +}; + +export const updateDisplay = (dispatch: DispatchFunction, state: WalletState['displayCurrency']): void => { + return dispatch({ + type: "DISPLAY_CURRENCY_UPDATED", + payload: state, + }); +}; + +export const updateLoading = (dispatch: DispatchFunction, state: WalletState['isLoading']): void => { + return dispatch({ + type: "LOADING_UPDATED", + payload: state, + }); +}; + +export const updateBalancesHidden = (dispatch: any, state: any): void => { + return dispatch({ + type: "BALANCES_HIDDEN_UPDATED", + payload: state, + }); +}; + +export const updateConfirmationModal = (dispatch: DispatchFunction, state: WalletState['confirmationModalOpen']): void => { + return dispatch({ + type: "CONFIRMATION_MODAL_UPDATED", + payload: state, + }); +}; + +export const updateTransactionStatus = (dispatch: DispatchFunction, state: WalletState['transactionStatus']): void => { + return dispatch({ + type: "TRANSACTION_STATUS_UPDATED", + payload: state, + }); +}; + +export const setConnectData = (dispatch: DispatchFunction, state: WalletState['connectData']): void => { + return dispatch({ + type: "SET_CONNECT_DATA", + payload: state + }); +}; + +export const setWhiteList = (dispatch: DispatchFunction, state: WalletState['whiteList']): void => { + return dispatch({ + type: "SET_WHITE_LIST", + payload: state + }); +}; diff --git a/src/app/store/store-reducer.js b/src/app/store/store-reducer.tsx similarity index 50% rename from src/app/store/store-reducer.js rename to src/app/store/store-reducer.tsx index 6582242..e0d74c4 100644 --- a/src/app/store/store-reducer.js +++ b/src/app/store/store-reducer.tsx @@ -1,6 +1,68 @@ -import { createContext, useReducer } from "react"; +import React, { createContext, useReducer, ReactNode, useContext } from "react"; -const initialState = { +// Define the types for the state +interface Asset { + name: string; + ticker: string; + balance: number; + lockedBalance?: number; + value: number; +} + +interface Transaction { + isConfirmed: boolean; + incoming: boolean; + amount?: number; + value?: number; + ticker: string; + address: string; +} + +interface Wallet { + address: string; + alias: string; + balance: number; + lockedBalance?: number; + assets: Asset[]; + transactions: Transaction[]; +} + +interface TransactionStatus { + visible: boolean; + type: string; + code: number; + message: string; +} + +interface ConnectCredentials { + token: string | null; + port: string | null; +} + +interface PriceData { + price: number; + change: number; +} + +interface State { + walletsList: { address: string; alias: string; balance: number }[]; + activeWalletId: number; + wallet: Wallet; + displayUsd: boolean; + isLoading: boolean; + isConnected: boolean | undefined; + isBalancesHidden: boolean; + priceData: PriceData; + confirmationModal: string | null; + transactionStatus: TransactionStatus; + connectCredentials: ConnectCredentials; + whitelistedAssets: string[]; + walletAddress?: string; + walletBalance?: number; +} + +// Initial state +const initialState: State = { walletsList: [ { address: @@ -87,7 +149,24 @@ const initialState = { whitelistedAssets: [], }; -const reducer = (state, action) => { +type Action = + | { type: "WALLET_ADDRESS_UPDATED"; payload: string } + | { type: "WALLET_BALANCE_UPDATED"; payload: number } + | { type: "WALLET_CONNECTED_UPDATED"; payload: boolean | undefined } + | { type: "WALLETS_LIST_UPDATED"; payload: { address: string; alias: string; balance: number }[] } + | { type: "ACTIVE_WALLET_ID_UPDATED"; payload: number } + | { type: "WALLET_DATA_UPDATED"; payload: Wallet } + | { type: "PRICE_DATA_UPDATED"; payload: PriceData } + | { type: "DISPLAY_CURRENCY_UPDATED"; payload: boolean } + | { type: "LOADING_UPDATED"; payload: boolean } + | { type: "BALANCES_HIDDEN_UPDATED"; payload: boolean } + | { type: "CONFIRMATION_MODAL_UPDATED"; payload: string | null } + | { type: "TRANSACTION_STATUS_UPDATED"; payload: TransactionStatus } + | { type: "SET_CONNECT_DATA"; payload: ConnectCredentials } + | { type: "SET_WHITE_LIST"; payload: string[] } + | { type: "SET_BALANCES_HIDDEN"; payload: boolean }; + +const reducer = (state: State, action: Action): State => { switch (action.type) { case "WALLET_ADDRESS_UPDATED": return { ...state, walletAddress: action.payload }; @@ -114,19 +193,48 @@ const reducer = (state, action) => { case "TRANSACTION_STATUS_UPDATED": return { ...state, transactionStatus: action.payload }; case "SET_CONNECT_DATA": - return { ...state, connectCredentials: action.payload } + return { ...state, connectCredentials: action.payload }; case "SET_WHITE_LIST": - return { ...state, whitelistedAssets: action.payload } + return { ...state, whitelistedAssets: action.payload }; default: return state; } }; -export const Store = createContext(initialState); +export const Store = createContext<{ state: State; dispatch: React.Dispatch }>({ + state: initialState, + dispatch: () => { }, +}); -export const StoreProvider = ({ children }) => { +interface StoreProviderProps { + children: ReactNode; +} + +export const StoreProvider = ({ children }: StoreProviderProps) => { const [state, dispatch] = useReducer(reducer, initialState); + return {children}; +}; + +export const useStore = () => useContext(Store); + +const updateWhiteList = (dispatch: React.Dispatch, whiteList: string[]) => { + dispatch({ + type: "SET_WHITE_LIST", + payload: whiteList, + }); +}; + +// Usage in a component: +const ExampleComponent = () => { + const { state, dispatch } = useStore(); + + const handleUpdateWhiteList = () => { + updateWhiteList(dispatch, ["asset1", "asset2"]); + }; + return ( - {children} +
+ +
); }; diff --git a/src/app/utils/ConnectKeyUtils.js b/src/app/utils/ConnectKeyUtils.js deleted file mode 100644 index 0a18d25..0000000 --- a/src/app/utils/ConnectKeyUtils.js +++ /dev/null @@ -1,19 +0,0 @@ -import CryptoJS from "crypto-js"; - -export default class ConnectKeyUtils { - static setConnectData(key, walletPort, extPass) { - const data = JSON.stringify({ token: key, port: walletPort }); - localStorage.setItem("connectKey", CryptoJS.AES.encrypt(data, extPass).toString()); - } - - static getConnectKeyEncrypted() { - return localStorage.getItem("connectKey"); - } - - static getConnectData(password) { - const encrypted = localStorage.getItem("connectKey"); - const decrypted = CryptoJS.AES.decrypt(encrypted, password).toString(CryptoJS.enc.Utf8); - const data = JSON.parse(decrypted); - return data; - } -} \ No newline at end of file diff --git a/src/app/utils/ConnectKeyUtils.ts b/src/app/utils/ConnectKeyUtils.ts new file mode 100644 index 0000000..990c5a0 --- /dev/null +++ b/src/app/utils/ConnectKeyUtils.ts @@ -0,0 +1,34 @@ +import CryptoJS from "crypto-js"; + +interface ConnectData { + token: string; + port: string; +} + +export default class ConnectKeyUtils { + static setConnectData(key: string, walletPort: string, extPass: string): void { + const data: ConnectData = { token: key, port: walletPort }; + const encrypted = CryptoJS.AES.encrypt(JSON.stringify(data), extPass).toString(); + localStorage.setItem("connectKey", encrypted); + } + + static getConnectKeyEncrypted(): string | null { + return localStorage.getItem("connectKey"); + } + + static getConnectData(password: string): ConnectData | null { + const encrypted = localStorage.getItem("connectKey"); + if (!encrypted) return null; + + const decrypted = CryptoJS.AES.decrypt(encrypted, password).toString(CryptoJS.enc.Utf8); + + if (!decrypted) return null; + + try { + const data: ConnectData = JSON.parse(decrypted); + return data; + } catch (error) { + return null; + } + } +} diff --git a/src/app/utils/classNames.js b/src/app/utils/classNames.js deleted file mode 100644 index e89cf22..0000000 --- a/src/app/utils/classNames.js +++ /dev/null @@ -1,8 +0,0 @@ -export const classNames = (cls, mods, additional = []) => - [ - cls, - ...additional.filter(Boolean), - ...Object.entries(mods) - .filter(([className, value]) => Boolean(value)) - .map(([classNames]) => classNames), - ].join(" "); diff --git a/src/app/utils/classNames.ts b/src/app/utils/classNames.ts new file mode 100644 index 0000000..a200fcc --- /dev/null +++ b/src/app/utils/classNames.ts @@ -0,0 +1,15 @@ +type Mods = Record; + +export const classNames = ( + cls: string, + mods: Mods, + additional: (string | undefined)[] = [] +): string => { + return [ + cls, + ...additional.filter(Boolean), + ...Object.entries(mods) + .filter(([className, value]) => Boolean(value)) + .map(([classNames]) => classNames), + ].join(" "); +}; diff --git a/src/app/utils/formatters.js b/src/app/utils/formatters.ts similarity index 86% rename from src/app/utils/formatters.js rename to src/app/utils/formatters.ts index 394c142..378c519 100644 --- a/src/app/utils/formatters.js +++ b/src/app/utils/formatters.ts @@ -1,5 +1,5 @@ export default class Formatters { - static walletAddress(str) { + static walletAddress(str: string): string { if (str.length > 20) { if (window.innerWidth > 768) { return ( @@ -18,7 +18,7 @@ export default class Formatters { return str; } - static historyAmount(amount) { + static historyAmount(amount: number): string { let str = amount.toString(); if (str.length > 10) { return ( diff --git a/src/app/utils/utils.js b/src/app/utils/utils.ts similarity index 72% rename from src/app/utils/utils.js rename to src/app/utils/utils.ts index 6aa47b2..008bd64 100644 --- a/src/app/utils/utils.js +++ b/src/app/utils/utils.ts @@ -3,7 +3,16 @@ import Big from "big.js"; import Decimal from "decimal.js"; import sha256 from "sha256"; -export async function fetchBackground(data) { +interface BackgroundResponse { + password: string; +} + +interface ValidationResult { + valid: boolean; + error?: string; +} + +export async function fetchBackground(data: { method: string; password?: string, id?: number, success?:boolean; }): Promise { return new Promise((resolve, reject) => { try { chrome.runtime.sendMessage(data, function (response) { @@ -16,45 +25,43 @@ export async function fetchBackground(data) { }); } - -export const removeZeros = (amount, decimal_point = 12) => { +export const removeZeros = (amount: string | number, decimal_point: number = 12): string => { const multiplier = new Big(10).pow(decimal_point); const bigAmount = new Big(amount); const fixedAmount = bigAmount.div(multiplier).toString(); return fixedAmount; }; -export const addZeros = (amount, decimal_point = 12) => { +export const addZeros = (amount: string | number, decimal_point: number = 12): Big => { const multiplier = new Big(10).pow(decimal_point); const bigAmount = new Big(amount); const fixedAmount = bigAmount.times(multiplier); return fixedAmount; }; -export const setPassword = (password) => { +export const setPassword = (password: string): void => { localStorage.setItem("hash", sha256(password)); -} +}; -export const comparePasswords = (password) => { +export const comparePasswords = (password: string): boolean => { const hash = localStorage.getItem("hash"); return hash === sha256(password); -} +}; -export const passwordExists = () => { +export const passwordExists = (): boolean => { return !!localStorage.getItem("hash"); -} +}; -export const getSessionPassword = async () => { - const sessionPass = (await fetchBackground({ method: "GET_PASSWORD" })).password; - return sessionPass; -} +export const getSessionPassword = async (): Promise => { + const sessionPass = (await fetchBackground({ method: "GET_PASSWORD" })) as BackgroundResponse; + return sessionPass.password; +}; -export const setSessionPassword = async (password) => { - await fetchBackground({ method: "SET_PASSWORD", password }) -} - -export function validateTokensInput(input, decimal_point) { +export const setSessionPassword = async (password: string): Promise => { + await fetchBackground({ method: "SET_PASSWORD", password }); +}; +export function validateTokensInput(input: string | number, decimal_point: number): ValidationResult { if (typeof input === 'number') { input = input.toString(); } @@ -129,4 +136,4 @@ export function validateTokensInput(input, decimal_point) { return { valid: true }; -} \ No newline at end of file +} diff --git a/src/background/background.js b/src/background/background.js index e83c86a..129e959 100644 --- a/src/background/background.js +++ b/src/background/background.js @@ -20,7 +20,8 @@ import JSONbig from "json-bigint"; const POPUP_HEIGHT = 630; const POPUP_WIDTH = 370; -const ZANO_ID = "d6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a"; +const ZANO_ID = + "d6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a"; async function getAsset(assetId) { if (assetId === ZANO_ID) { @@ -45,7 +46,7 @@ async function getAsset(assetId) { class PopupRequestsMethods { static onRequestCreate(requestType, request, sendResponse, reqParams) { console.log("Creating request", reqParams); - + openWindow().then((requestWindow) => { const reqId = crypto.randomUUID(); const req = { @@ -178,7 +179,7 @@ const savedRequests = { IONIC_SWAP: {}, ACCEPT_IONIC_SWAP: {}, CREATE_ALIAS: {}, - TRANSFER: {} + TRANSFER: {}, }; const allPopupIds = []; @@ -218,7 +219,7 @@ const SELF_ONLY_REQUESTS = [ "PING_WALLET", "SET_ACTIVE_WALLET", "GET_WALLETS", - "FINALIZE_TRANSFER_REQUEST" + "FINALIZE_TRANSFER_REQUEST", ]; chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { @@ -378,7 +379,7 @@ async function processRequest(request, sender, sendResponse) { case "GET_TRANSFER_REQUEST": { PopupRequestsMethods.getRequestsList("TRANSFER", sendResponse); - break + break; } case "TRANSFER": { @@ -386,39 +387,41 @@ async function processRequest(request, sender, sendResponse) { const asset = await getAsset(request.assetId); const walletData = await getWalletData(); const { address } = walletData; - request.asset = asset || await getAsset(ZANO_ID); - request.sender = address || ''; - + request.asset = asset || (await getAsset(ZANO_ID)); + request.sender = address || ""; } catch (e) { - return sendResponse({error: e.message}) + return sendResponse({ error: e.message }); } - PopupRequestsMethods.onRequestCreate( - "TRANSFER", - request, - sendResponse, - { transfer: request } - ); - break + PopupRequestsMethods.onRequestCreate("TRANSFER", request, sendResponse, { + transfer: request, + }); + break; } case "FINALIZE_TRANSFER_REQUEST": { - PopupRequestsMethods - .onRequestFinalize("TRANSFER", - request, - sendResponse, - (req) => { - const transferData = req.transfer; - const {assetId, destination, amount, asset } = transferData; - - return transfer(assetId, destination, amount, asset?.decimal_point || 12); - }, - { - console: "Error transfer:", - response: "An error occurred while sending transfer", - reqNotFound: "transfer request not found", - }) - break + PopupRequestsMethods.onRequestFinalize( + "TRANSFER", + request, + sendResponse, + (req) => { + const transferData = req.transfer; + const { assetId, destination, amount, asset } = transferData; + + return transfer( + assetId, + destination, + amount, + asset?.decimal_point || 12 + ); + }, + { + console: "Error transfer:", + response: "An error occurred while sending transfer", + reqNotFound: "transfer request not found", + } + ); + break; } case "GET_ACCEPT_IONIC_SWAP_REQUESTS": diff --git a/src/background/wallet.js b/src/background/wallet.ts similarity index 86% rename from src/background/wallet.js rename to src/background/wallet.ts index b14b6d4..34510c5 100644 --- a/src/background/wallet.js +++ b/src/background/wallet.ts @@ -5,7 +5,14 @@ import { Buffer } from "buffer"; import JSONbig from "json-bigint"; // window.Buffer = Buffer; -function createJWSToken(payload, secrete_str) { +interface JWTPayload { + body_hash: string, + user: string, + salt: string, + exp: number +} + +function createJWSToken(payload: JWTPayload, secretStr: string): string { const header = { alg: "HS256", typ: "JWT" }; const encodedHeader = Buffer.from(JSON.stringify(header)) .toString("base64") @@ -15,7 +22,7 @@ function createJWSToken(payload, secrete_str) { .replace(/=/g, ""); const signature = forge.hmac.create(); - signature.start("sha256", secrete_str); + signature.start("sha256", secretStr); signature.update(`${encodedHeader}.${encodedPayload}`); const encodedSignature = forge.util .encode64(signature.digest().getBytes()) @@ -24,13 +31,13 @@ function createJWSToken(payload, secrete_str) { return `${encodedHeader}.${encodedPayload}.${encodedSignature}`; } -function generateRandomString(length) { +function generateRandomString(length: number) { const bytes = forge.random.getBytesSync(Math.ceil(length / 2)); const hexString = forge.util.bytesToHex(bytes); return hexString.substring(0, length); } -function generateAccessToken(httpBody) { +function generateAccessToken(httpBody: string) { if (!apiCredentials?.token) { throw new Error("No API credentials found, extension is not connected"); } @@ -51,16 +58,23 @@ function generateAccessToken(httpBody) { return createJWSToken(payload, apiCredentials?.token); } -export const fetchData = async (method, params = {}) => { - const httpBody = JSON.stringify({ +interface fetchDataProps { + offset: number, + update_provision_info: boolean, + exclude_mining_txs: boolean, + count: number, + order: string, + exclude_unconfirmed: boolean, +} + +export const fetchData = async (method: string, params: fetchDataProps | {} = {}): Promise => { + const httpBody: string = JSON.stringify({ jsonrpc: "2.0", id: "0", method, params, }); - - // console.log("fetchData:", httpBody); - + return fetch(`http://localhost:${apiCredentials.port}/json_rpc`, { method: "POST", headers: { @@ -93,7 +107,7 @@ const fetchTxData = async () => { } }; -export const getAlias = async (address) => { +export const getAlias = async (address:string) => { const response = await fetchData("get_alias_by_address", address); const data = await response.json(); if (data.result?.status === "OK") { @@ -103,7 +117,7 @@ export const getAlias = async (address) => { } }; -export const getAliasDetails = async (alias) => { +export const getAliasDetails = async (alias: string) => { const response = await fetchData("get_alias_details", { alias }); const data = await response.json(); if (data.result.status === "OK") { @@ -125,10 +139,10 @@ export const getWallets = async () => { // console.log("wallets:", data.result.wallets); const wallets = await Promise.all( - data.result.wallets.map(async (wallet) => { + data.result.wallets.map(async (wallet: any) => { const alias = await getAlias(wallet.wi.address); const balance = wallet.wi.balances.find( - (asset) => + (asset: any) => asset.asset_info.asset_id === "d6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a" ).total; @@ -163,7 +177,7 @@ export const getWalletData = async () => { const balanceParsed = JSONbig.parse(await balanceResponse.text()); const assets = balanceParsed.result.balances - .map((asset) => ({ + .map((asset: any) => ({ name: asset.asset_info.full_name, ticker: asset.asset_info.ticker, assetId: asset.asset_info.asset_id, @@ -174,7 +188,7 @@ export const getWalletData = async () => { asset.asset_info.decimal_point ), })) - .sort((a, b) => { + .sort((a: any, b:any) => { if ( a.assetId === "d6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a" @@ -189,13 +203,13 @@ export const getWalletData = async () => { return 0; }); - function getAssetDecimalPoint(assetId) { - return assets.find((asset) => asset.assetId === assetId)?.decimalPoint; + function getAssetDecimalPoint(assetId: any) { + return assets.find((asset:any) => asset.assetId === assetId)?.decimalPoint; } const balance = removeZeros( balanceParsed.result.balances.find( - (asset) => + (asset: any) => asset.asset_info.asset_id === "d6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a" ).total @@ -206,8 +220,8 @@ export const getWalletData = async () => { if (txData) { transactions = txData - .filter((tx) => !tx.is_service) - .map((tx) => ({ + .filter((tx:any) => !tx.is_service) + .map((tx:any) => ({ isConfirmed: tx.height === 0 ? false : true, txHash: tx.tx_hash, blobSize: tx.tx_blob_size, @@ -218,9 +232,9 @@ export const getWalletData = async () => { fee: removeZeros(tx.fee), addresses: tx.remote_addresses, isInitiator: !!tx.employed_entries?.spent?.some?.( - (e) => e?.index === 0 + (e:any) => e?.index === 0 ), - transfers: tx.subtransfers.map((transfer) => ({ + transfers: tx.subtransfers.map((transfer:any) => ({ amount: removeZeros( transfer.amount, getAssetDecimalPoint(transfer.asset_id) || 12 @@ -237,7 +251,7 @@ export const getWalletData = async () => { return { address, alias, balance, transactions, assets }; }; -export const ionicSwap = async (swapParams) => { +export const ionicSwap = async (swapParams:any) => { const response = await fetchData("ionic_swap_generate_proposal", { proposal: { to_initiator: [ @@ -273,7 +287,7 @@ export const ionicSwap = async (swapParams) => { return data; }; -export const ionicSwapAccept = async (swapParams) => { +export const ionicSwapAccept = async (swapParams:any) => { console.log(swapParams.hex_raw_proposal); const response = await fetchData("ionic_swap_accept_proposal", { @@ -288,7 +302,7 @@ export const ionicSwapAccept = async (swapParams) => { return data; }; -export const createAlias = async ({ alias, address }) => { +export const createAlias = async ({ alias, address }: any) => { const response = await fetchData("register_alias", { al: { address: address, @@ -301,9 +315,9 @@ export const createAlias = async ({ alias, address }) => { export const transfer = async ( assetId = "d6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a", - destination, - amount, - decimalPoint + destination: any, + amount: any, + decimalPoint: any ) => { const destinations = [ { @@ -333,9 +347,9 @@ export const transfer = async ( // TODO: move bridge address to the config export const burnBridge = async ( assetId = "d6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a", - amount, - destinationAddress, - destinationChainId + amount: any, + destinationAddress: any, + destinationChainId: any ) => { const bodyData = { service_id: "B", @@ -381,7 +395,7 @@ export const burnBridge = async ( return data; }; -export const signMessage = async (message) => { +export const signMessage = async (message: any) => { const base64 = Buffer.from(message).toString("base64"); const signRequest = { @@ -409,7 +423,7 @@ export const createConnectKey = async () => { ).then((r) => r.json()); }; -export const validateConnectKey = async (key) => { +export const validateConnectKey = async (key: any) => { return await fetch( `http://localhost:${apiCredentials.port}/validate-connection-key`, { @@ -422,7 +436,7 @@ export const validateConnectKey = async (key) => { ).then((r) => r.json()); }; -export const getSwapProposalInfo = async (hex) => { +export const getSwapProposalInfo = async (hex: any) => { const response = await fetchData("ionic_swap_get_proposal_info", { hex_raw_proposal: hex, }); @@ -445,7 +459,7 @@ export async function getWhiteList() { if ( fetchedWhiteList.every( - (e) => + (e:any) => e.asset_id !== "d6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a" ) @@ -462,7 +476,7 @@ export async function getWhiteList() { return fetchedWhiteList; } -export async function getAssetInfo(assetId) { +export async function getAssetInfo(assetId: any) { const response = await fetchData("get_asset_info", { asset_id: assetId }); if (!response.ok) { diff --git a/src/content/content.js b/src/content/content.ts similarity index 54% rename from src/content/content.js rename to src/content/content.ts index d9c2e30..3ceff2e 100644 --- a/src/content/content.js +++ b/src/content/content.ts @@ -1,11 +1,24 @@ -async function fetchData(data) { +interface DocumentEventMap { + "zano_request": CustomEvent; +} + +interface ZanoRequestData { + method: string; + listenerID: string; + timeout?: number | null; + [key: string]: string | number | boolean | null | undefined; +} + +interface ZanoResponse { + error?: string; + [key: string]: string | number | boolean | null | undefined; +} + +async function fetchData(data: ZanoRequestData): Promise { return new Promise((resolve, reject) => { try { - // eslint-disable-next-line no-undef - chrome.runtime.sendMessage(data, (response) => { - // eslint-disable-next-line no-undef + chrome.runtime.sendMessage(data, (response: ZanoResponse) => { if (chrome.runtime.lastError) { - // eslint-disable-next-line no-undef reject(chrome.runtime.lastError); } else { resolve(response); @@ -18,7 +31,7 @@ async function fetchData(data) { }); } -document.addEventListener("zano_request", async (e) => { +document.addEventListener("zano_request", async (e: CustomEvent) => { const data = e.detail; try { @@ -31,10 +44,9 @@ document.addEventListener("zano_request", async (e) => { ); } catch (error) { console.error(`Error while processing zano_request:`, error); - // Dispatch an event with the error document.dispatchEvent( new CustomEvent(`zano_response_${data.listenerID}`, { - detail: { error: error.message }, + detail: { error: error instanceof Error ? error.message : String(error) }, }) ); } diff --git a/src/content/inject.js b/src/content/inject.ts similarity index 65% rename from src/content/inject.js rename to src/content/inject.ts index 0ca03fa..2289684 100644 --- a/src/content/inject.js +++ b/src/content/inject.ts @@ -1,9 +1,9 @@ class Zano { - async request(method, params, timeoutParam) { + async request(method: string, params: Record, timeoutParam?: number): Promise { - function getRandonString(length) { - let chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; - let charLength = chars.length; + function getRandonString(length: number): string { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; + const charLength = chars.length; let result = ''; for (let i = 0; i < length; i++) { @@ -13,28 +13,27 @@ class Zano { return result; } - const listenerID = getRandonString(16); - const timeoutMs = typeof timeoutParam === "number" ? timeoutParam : null; + const timeoutMs: number | null = typeof timeoutParam === "number" ? timeoutParam : null; return new Promise((resolve, reject) => { const timeout = timeoutMs !== null ? ( setTimeout(() => { reject('Request timeout exceeded'); - document.removeEventListener(`zano_response_${listenerID}`, handleResponse); + document.removeEventListener(`zano_response_${listenerID}`, handleResponse as EventListener); }, timeoutMs) ) : undefined; - function handleResponse(e) { - document.removeEventListener(`zano_response_${listenerID}`, handleResponse); + function handleResponse(e: CustomEvent) { + document.removeEventListener(`zano_response_${listenerID}`, handleResponse as EventListener); if (timeout) { clearTimeout(timeout); } resolve(e.detail); } - document.addEventListener(`zano_response_${listenerID}`, handleResponse); + document.addEventListener(`zano_response_${listenerID}`, handleResponse as EventListener); document.dispatchEvent(new CustomEvent('zano_request', { detail: { @@ -49,4 +48,4 @@ class Zano { } } -window.zano = new Zano(); \ No newline at end of file +window.zano = new Zano(); diff --git a/src/global.d.ts b/src/global.d.ts new file mode 100644 index 0000000..dfff3c6 --- /dev/null +++ b/src/global.d.ts @@ -0,0 +1,15 @@ +interface Window { + zano: Zano; +} + +declare module "*.scss" { + const content: { [className: string]: string }; + export default content; +} + +declare module "*.svg" { + import React from "react"; + const content: React.FunctionComponent>; + export default content; +} + \ No newline at end of file diff --git a/src/index.js b/src/index.tsx similarity index 94% rename from src/index.js rename to src/index.tsx index 9383f29..355dbbe 100644 --- a/src/index.js +++ b/src/index.tsx @@ -3,7 +3,7 @@ import ReactDOM from "react-dom/client"; import App from "./app/App"; import { StoreProvider } from "./app/store/store-reducer"; -const root = ReactDOM.createRoot(document.getElementById("root")); +const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement); root.render( diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c0acac3 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "es6", + "moduleResolution": "node", + "jsx": "react", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "outDir": "./dist", + "allowJs": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules"] +} diff --git a/webpack.common.js b/webpack.common.js index aad0093..0fe0e52 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -54,9 +54,14 @@ module.exports = { }, ], }, + { + test: /\.(ts|tsx)$/, + exclude: /node_modules/, + use: "ts-loader", + }, ], }, resolve: { - extensions: ["*", ".js", ".jsx"], + extensions: ["*", ".js", ".jsx", ".ts", ".tsx"], }, }; diff --git a/webpack.config.js b/webpack.config.js index a4cad82..8c5e3da 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -5,7 +5,7 @@ const HtmlWebpackPlugin = require("html-webpack-plugin"); const common = require("./webpack.common.js"); const appConfig = { - entry: "./src/index.js", + entry: "./src/index.tsx", output: { path: path.resolve(__dirname, "build"), filename: "static/js/app.bundle.js", @@ -28,7 +28,7 @@ const backgroundConfig = { }; const contentConfig = { - entry: "./src/content/content.js", + entry: "./src/content/content.ts", output: { path: path.resolve(__dirname, "build/static/js"), filename: "content.bundle.js", @@ -36,7 +36,7 @@ const contentConfig = { }; const injectConfig = { - entry: "./src/content/inject.js", + entry: "./src/content/inject.ts", output: { path: path.resolve(__dirname, "build/static/js"), filename: "inject.bundle.js", From 994c7007c83eae62fc2bc8a577b3bb50a55dceeb Mon Sep 17 00:00:00 2001 From: AzizbekFayziyev Date: Thu, 28 Nov 2024 14:42:20 +0500 Subject: [PATCH 02/10] ui: converted --- .../UI/Button/{Button.jsx => Button.tsx} | 22 +++++++++++++++---- .../UI/NavLink/{NavLink.jsx => NavLink.tsx} | 8 ++++++- .../{RoutersNav.jsx => RoutersNav.tsx} | 9 ++++++-- 3 files changed, 32 insertions(+), 7 deletions(-) rename src/app/components/UI/Button/{Button.jsx => Button.tsx} (66%) rename src/app/components/UI/NavLink/{NavLink.jsx => NavLink.tsx} (67%) rename src/app/components/UI/RoutersNav/{RoutersNav.jsx => RoutersNav.tsx} (75%) diff --git a/src/app/components/UI/Button/Button.jsx b/src/app/components/UI/Button/Button.tsx similarity index 66% rename from src/app/components/UI/Button/Button.jsx rename to src/app/components/UI/Button/Button.tsx index 70620b9..665e963 100644 --- a/src/app/components/UI/Button/Button.jsx +++ b/src/app/components/UI/Button/Button.tsx @@ -2,13 +2,27 @@ import React, { memo } from "react"; import cls from "./Button.module.scss"; import { classNames } from "../../../utils/classNames"; -export const ButtonThemes = { +interface ButtonProps { + className?: string; + children: React.ReactNode; + theme?: ThemeProps; + href?: string; + fullWidth?: boolean; +} + +interface ThemeProps { + Primary: "primary"; + Outline: "outline"; + Clear: "clear"; +} + +export const ButtonThemes: ThemeProps = { Primary: "primary", Outline: "outline", Clear: "clear", }; -export const Button = memo((props) => { +export const Button = memo((props: ButtonProps) => { const { className, children, @@ -22,7 +36,7 @@ export const Button = memo((props) => { return ( {children} @@ -32,7 +46,7 @@ export const Button = memo((props) => { return ( ); }); -export default Button; \ No newline at end of file +export default Button; diff --git a/src/app/components/UI/MyInput/MyInput.tsx b/src/app/components/UI/MyInput/MyInput.tsx index 3671eda..262e1a1 100644 --- a/src/app/components/UI/MyInput/MyInput.tsx +++ b/src/app/components/UI/MyInput/MyInput.tsx @@ -6,19 +6,19 @@ import { classNames } from "../../../utils/classNames"; interface MyInputProps extends InputHTMLAttributes { label?: string; inputData: { - value: string; - onChange: (e: ChangeEvent) => void; - onInput: (value: string) => void; - inputValid: boolean; - onBlur: () => void; - isDirty: boolean; - isFilled: boolean; - }; + value?: string; + onChange?: (e: ChangeEvent) => void; + onInput?: (value: string) => void; + inputValid?: boolean; + onBlur?: () => void; + isDirty?: boolean; + isFilled?: boolean; + } isValid?: boolean; noActiveBorder?: boolean; isError?: boolean; noValidation?: boolean; - type: string; + type?: string; } const MyInput: React.FC = memo((props) => { @@ -42,9 +42,9 @@ const MyInput: React.FC = memo((props) => { .replace(/[^0-9.]/g, "") .replace(/(\..*?)\..*/g, "$1") .replace(/^0[^.]/, "0"); - onInput(newValue); + if (onInput) onInput(newValue); } else { - onChange(e); + if (onChange) onChange(e); } }; diff --git a/src/app/store/actions.ts b/src/app/store/actions.ts index 0561e02..13d93ff 100644 --- a/src/app/store/actions.ts +++ b/src/app/store/actions.ts @@ -15,7 +15,6 @@ interface WalletState { } type DispatchFunction = (action: { type: string; payload: WalletState[keyof WalletState] }) => void; -type DispatchBalance = { type: string; payload: string | boolean | object | string[]; }; export const updateWalletsList = (dispatch: DispatchFunction, state: WalletState['wallets']): void => { return dispatch({ @@ -80,14 +79,20 @@ export const updateConfirmationModal = (dispatch: DispatchFunction, state: Walle }); }; -export const updateTransactionStatus = (dispatch: DispatchFunction, state: WalletState['transactionStatus']): void => { +export const updateTransactionStatus = (dispatch: DispatchFunction, state: WalletState['transactionStatus'] | any): void => { return dispatch({ type: "TRANSACTION_STATUS_UPDATED", payload: state, }); }; -export const setConnectData = (dispatch: DispatchFunction, state: WalletState['connectData']): void => { +interface ConnectCredentials { + token: string; + port: string; +} + + +export const setConnectData = (dispatch: DispatchFunction, state: ConnectCredentials): void => { return dispatch({ type: "SET_CONNECT_DATA", payload: state diff --git a/src/app/store/store-reducer.tsx b/src/app/store/store-reducer.tsx index e0d74c4..f7e663e 100644 --- a/src/app/store/store-reducer.tsx +++ b/src/app/store/store-reducer.tsx @@ -9,13 +9,22 @@ interface Asset { value: number; } +interface Transfer { + assetId?: string; + amount?: number; +} + interface Transaction { + txHash?: string; isConfirmed: boolean; incoming: boolean; amount?: number; value?: number; ticker: string; address: string; + transfers?: Transfer[]; + isInitiator?: boolean; + fee?: number | string; } interface Wallet { @@ -45,7 +54,7 @@ interface PriceData { } interface State { - walletsList: { address: string; alias: string; balance: number }[]; + walletsList: { address: string; alias: string; balance: number, wallet_id?: number; }[]; activeWalletId: number; wallet: Wallet; displayUsd: boolean; @@ -53,7 +62,7 @@ interface State { isConnected: boolean | undefined; isBalancesHidden: boolean; priceData: PriceData; - confirmationModal: string | null; + confirmationModal: string | null | any; transactionStatus: TransactionStatus; connectCredentials: ConnectCredentials; whitelistedAssets: string[]; diff --git a/src/app/utils/utils.ts b/src/app/utils/utils.ts index 008bd64..4ddad01 100644 --- a/src/app/utils/utils.ts +++ b/src/app/utils/utils.ts @@ -12,7 +12,13 @@ interface ValidationResult { error?: string; } -export async function fetchBackground(data: { method: string; password?: string, id?: number, success?:boolean; }): Promise { +export async function fetchBackground(data: { + method: string; + password?: string; + id?: number; + success?: boolean; + credentials?: { port: string }; +}): Promise { return new Promise((resolve, reject) => { try { chrome.runtime.sendMessage(data, function (response) { From d2eb037d445817dbf1c4319f503ddef9e75ed097 Mon Sep 17 00:00:00 2001 From: AzizbekFayziyev Date: Thu, 28 Nov 2024 16:52:47 +0500 Subject: [PATCH 04/10] converted to ts --- src/app/components/UI/MyInput/MyInput.tsx | 22 +++++++------- ...ionalDetails.jsx => AdditionalDetails.tsx} | 12 ++++++-- .../{AssetsSelect.jsx => AssetsSelect.tsx} | 30 +++++++++++++------ ...{WalletSettings.jsx => WalletSettings.tsx} | 2 +- 4 files changed, 43 insertions(+), 23 deletions(-) rename src/app/components/WalletSend/ui/AdditionalDetails/{AdditionalDetails.jsx => AdditionalDetails.tsx} (79%) rename src/app/components/WalletSend/ui/AssetsSelect/{AssetsSelect.jsx => AssetsSelect.tsx} (78%) rename src/app/components/WalletSettings/{WalletSettings.jsx => WalletSettings.tsx} (94%) diff --git a/src/app/components/UI/MyInput/MyInput.tsx b/src/app/components/UI/MyInput/MyInput.tsx index 262e1a1..339ebc8 100644 --- a/src/app/components/UI/MyInput/MyInput.tsx +++ b/src/app/components/UI/MyInput/MyInput.tsx @@ -3,17 +3,19 @@ import nextId from "react-id-generator"; import cls from "./MyInput.module.scss"; import { classNames } from "../../../utils/classNames"; +interface inputDataProps { + value?: string; + onChange?: (e: ChangeEvent) => void; + onInput?: (value: string) => void; + inputValid?: boolean; + onBlur?: () => void; + isDirty?: boolean; + isFilled?: boolean; +} + interface MyInputProps extends InputHTMLAttributes { label?: string; - inputData: { - value?: string; - onChange?: (e: ChangeEvent) => void; - onInput?: (value: string) => void; - inputValid?: boolean; - onBlur?: () => void; - isDirty?: boolean; - isFilled?: boolean; - } + inputData?: inputDataProps; isValid?: boolean; noActiveBorder?: boolean; isError?: boolean; @@ -34,7 +36,7 @@ const MyInput: React.FC = memo((props) => { ...otherProps } = props; - const { value, onChange, onInput, inputValid, onBlur, isDirty, isFilled } = inputData; + const { value, onChange, onInput, inputValid, onBlur, isDirty, isFilled } = inputData || {}; const onInputHandler = (e: ChangeEvent) => { if (type === "number" && !noValidation) { diff --git a/src/app/components/WalletSend/ui/AdditionalDetails/AdditionalDetails.jsx b/src/app/components/WalletSend/ui/AdditionalDetails/AdditionalDetails.tsx similarity index 79% rename from src/app/components/WalletSend/ui/AdditionalDetails/AdditionalDetails.jsx rename to src/app/components/WalletSend/ui/AdditionalDetails/AdditionalDetails.tsx index a896813..8841998 100644 --- a/src/app/components/WalletSend/ui/AdditionalDetails/AdditionalDetails.jsx +++ b/src/app/components/WalletSend/ui/AdditionalDetails/AdditionalDetails.tsx @@ -5,7 +5,13 @@ import s from "./AdditionalDetails.module.scss"; import { classNames } from "../../../../utils/classNames"; import arrowIcon from "../../../../assets/svg/arrow-select.svg"; -const AdditionalDetails = ({ fee, mixin, isSenderInfo, isReceiverInfo }) => { +interface AdditionalDetailsProps { + fee: string | number; + mixin: string | number; + isSenderInfo: { isChecked: boolean; onChange: () => void }; + isReceiverInfo: { isChecked: boolean; onChange: () => void }; +} +const AdditionalDetails = ({ fee, mixin, isSenderInfo, isReceiverInfo }: AdditionalDetailsProps) => { const [detailsVisible, setDetailsVisible] = useState(false); const toggleDetails = () => { @@ -27,8 +33,8 @@ const AdditionalDetails = ({ fee, mixin, isSenderInfo, isReceiverInfo }) => { {detailsVisible && (
- - + +
{ +interface Asset { + name: string; +} + +interface AssetsSelectProps { + value: Asset; + setValue: (asset: Asset) => void; +} + +const AssetsSelect = ({ value, setValue }: AssetsSelectProps) => { const { state } = useContext(Store); const [isOpen, setIsOpen] = useState(false); - const [focusedIndex, setFocusedIndex] = React.useState(null); - const selectRef = useRef(null); + const [focusedIndex, setFocusedIndex] = React.useState(null); + const selectRef = useRef(null); - const handleKeyDown = (e) => { + const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "ArrowDown") { e.preventDefault(); if ( @@ -24,21 +33,24 @@ const AssetsSelect = ({ value, setValue }) => { ) { setFocusedIndex(0); } else { - setFocusedIndex((prevIndex) => prevIndex + 1); + setFocusedIndex((prevIndex) => Number(prevIndex) + 1); } } else if (e.key === "ArrowUp") { e.preventDefault(); if (focusedIndex === null || focusedIndex === 0) { setFocusedIndex(state.wallet.assets.length - 1); } else { - setFocusedIndex((prevIndex) => prevIndex - 1); + setFocusedIndex((prevIndex) => Number(prevIndex) - 1); } } }; useEffect(() => { if (focusedIndex !== null && selectRef.current) { - selectRef.current.childNodes[focusedIndex].focus(); + const childNodes = selectRef.current.childNodes; + if (childNodes && childNodes[focusedIndex as number]) { + (childNodes[focusedIndex as number] as HTMLElement).focus(); + } } }, [focusedIndex]); @@ -46,12 +58,12 @@ const AssetsSelect = ({ value, setValue }) => { setIsOpen(!isOpen); } - function setValueHandler(asset) { + function setValueHandler(asset: Asset) { setValue(asset); setIsOpen(false); } - const getAssetImage = (name) => { + const getAssetImage = (name: string) => { switch (name) { case "Zano": return zanoIcon; diff --git a/src/app/components/WalletSettings/WalletSettings.jsx b/src/app/components/WalletSettings/WalletSettings.tsx similarity index 94% rename from src/app/components/WalletSettings/WalletSettings.jsx rename to src/app/components/WalletSettings/WalletSettings.tsx index 35b831c..66fecd2 100644 --- a/src/app/components/WalletSettings/WalletSettings.jsx +++ b/src/app/components/WalletSettings/WalletSettings.tsx @@ -7,7 +7,7 @@ import s from "./WalletSettings.module.scss"; const WalletSettings = () => { const [isBtnDisabled, setIsBtnDisabled] = useState(true); - const localNodePort = useInput("11112"); + const localNodePort = useInput("11112", {}); return (
From 97d684503c765ebd18e335c6cec444439e82e5e7 Mon Sep 17 00:00:00 2001 From: AzizbekFayziyev Date: Thu, 28 Nov 2024 17:25:24 +0500 Subject: [PATCH 05/10] converted to ts --- .../{WalletSend.jsx => WalletSend.tsx} | 89 +++++++++++++------ src/app/store/store-reducer.tsx | 2 + src/app/utils/utils.ts | 1 + src/global.d.ts | 16 +++- 4 files changed, 78 insertions(+), 30 deletions(-) rename src/app/components/WalletSend/{WalletSend.jsx => WalletSend.tsx} (77%) diff --git a/src/app/components/WalletSend/WalletSend.jsx b/src/app/components/WalletSend/WalletSend.tsx similarity index 77% rename from src/app/components/WalletSend/WalletSend.jsx rename to src/app/components/WalletSend/WalletSend.tsx index 623d018..b904344 100644 --- a/src/app/components/WalletSend/WalletSend.jsx +++ b/src/app/components/WalletSend/WalletSend.tsx @@ -14,6 +14,31 @@ import { fetchBackground, validateTokensInput } from "../../utils/utils"; import AssetsSelect from "./ui/AssetsSelect/AssetsSelect"; import AdditionalDetails from "./ui/AdditionalDetails/AdditionalDetails"; +interface ResponseData { + data?: any; + error?: string; +} + +interface FetchBackgroundParams { + method: string; + assetId: string; + destination: string; + amount: string | number; + comment: string; + decimalPoint: number; + password?: string; + id?: number; + success?: boolean; + credentials?: { + port: string; + }; +} + +interface AssetProps { + unlockedBalance: number; + balance: number; +} + const WalletSend = () => { const { state } = useContext(Store); const [activeStep, setActiveStep] = useState(0); @@ -36,19 +61,25 @@ const WalletSend = () => { const isSenderInfo = useCheckbox(false); const isReceiverInfo = useCheckbox(false); - const sendTransfer = (destination, amount, comment, assetId, decimalPoint) => { + const sendTransfer = ( + destination: string, + amount: string | number, + comment: string, + assetId: string, + decimalPoint: number + ): Promise => { return new Promise(async (resolve, reject) => { // eslint-disable-next-line no-undef - if (chrome.runtime.sendMessage) { + if (chrome.runtime.sendMessage as any) { // eslint-disable-next-line no-undef - const response = await fetchBackground({ + const response: ResponseData = await fetchBackground({ method: "SEND_TRANSFER", assetId, destination, amount, comment, decimalPoint, - }); + } as FetchBackgroundParams); if (response.data) { resolve(response.data); @@ -63,7 +94,7 @@ const WalletSend = () => { }); }; - const openExplorer = (txId) => { + const openExplorer = (txId: string) => { // eslint-disable-next-line no-undef chrome.tabs.create({ url: `https://testnet-explorer.zano.org/block/${txId}`, @@ -72,8 +103,8 @@ const WalletSend = () => { useEffect(() => { (async () => { - if (address.value.startsWith("@")) { - const alias = address.value.slice(1); + if (String(address.value).startsWith("@")) { + const alias = String(address.value).slice(1); const resolvedAddress = await fetchAddress(alias); if (resolvedAddress) { setSubmitAddress(resolvedAddress); @@ -81,8 +112,8 @@ const WalletSend = () => { setSubmitAddress(""); } } else { - if (address.value.length === 97) { - setSubmitAddress(address.value); + if (String(address.value).length === 97) { + setSubmitAddress(String(address.value)); } else { setSubmitAddress(""); } @@ -91,20 +122,20 @@ const WalletSend = () => { }, [address.value]); useEffect(() => { - const isValid = validateTokensInput(amount.value, asset.decimalPoint); + const isValid = !!validateTokensInput(amount.value, Number(asset.decimalPoint)); setAmountValid(isValid); }, [amount.value, asset]); - const fetchAddress = async (alias) => await fetchBackground({ method: "GET_ALIAS_DETAILS", alias }); + const fetchAddress = async (alias: string) => await fetchBackground({ method: "GET_ALIAS_DETAILS", alias }); - const checkAvailableBalance = (amount, asset) => + const checkAvailableBalance = (amount: string | number, asset: AssetProps) => asset.unlockedBalance !== asset.balance - ? +amount <= asset.unlockedBalance - fee.value + ? +amount <= asset.unlockedBalance - Number(fee.value) : true; //------------------------------------------------------------------------------------------------------------------- // Subcomponents - const TableRow = ({ label, value }) => { + const TableRow = ({ label, value }: { label: string; value: string }) => { return (
{label}:
@@ -113,7 +144,7 @@ const WalletSend = () => { ); }; - + return ( <> {(() => { @@ -131,25 +162,25 @@ const WalletSend = () => { - + >} /> @@ -159,7 +190,7 @@ const WalletSend = () => { !submitAddress || !amount.value || !amountValid || - !checkAvailableBalance(amount.value, asset) + !checkAvailableBalance(amount.value, asset as any) } > Send @@ -179,9 +210,9 @@ const WalletSend = () => { value={amount?.value + " " + asset?.ticker} /> - - - + + +
)} - {tx.transfers.map((transfer) => ( - + {tx.transfers?.map((transfer) => ( + ))} {tx.txHash} @@ -72,4 +82,4 @@ const History = () => { ); }; -export default History; +export default History; \ No newline at end of file diff --git a/src/app/components/TransactionDetails/TransactionDetails.jsx b/src/app/components/TransactionDetails/TransactionDetails.jsx index bd50502..018b8ea 100644 --- a/src/app/components/TransactionDetails/TransactionDetails.jsx +++ b/src/app/components/TransactionDetails/TransactionDetails.jsx @@ -45,7 +45,7 @@ const TransactionDetails = (props) => {
- {props.transfers.map((transfer) => { + {props?.transfers?.map((transfer) => { if (transfer.amount === props.fee) return null; const amount = new Big(transfer.amount); const fixedFee = new Big(props.fee); diff --git a/src/app/components/UI/NavLink/NavLink.tsx b/src/app/components/UI/NavLink/NavLink.tsx index 896c5f8..6ccbb1f 100644 --- a/src/app/components/UI/NavLink/NavLink.tsx +++ b/src/app/components/UI/NavLink/NavLink.tsx @@ -6,6 +6,7 @@ interface NavLinkProps { component: React.ComponentType; children: React.ReactNode; className?: string; + props?: any; } const NavLink = ({ component, children, className, ...props }: NavLinkProps) => { diff --git a/src/app/components/WalletSend/WalletSend.tsx b/src/app/components/WalletSend/WalletSend.tsx index b904344..2f73b3b 100644 --- a/src/app/components/WalletSend/WalletSend.tsx +++ b/src/app/components/WalletSend/WalletSend.tsx @@ -179,8 +179,8 @@ const WalletSend = () => { inputData={comment as any} /> diff --git a/src/app/components/WalletSend/ui/AdditionalDetails/AdditionalDetails.tsx b/src/app/components/WalletSend/ui/AdditionalDetails/AdditionalDetails.tsx index 8841998..e2dde6f 100644 --- a/src/app/components/WalletSend/ui/AdditionalDetails/AdditionalDetails.tsx +++ b/src/app/components/WalletSend/ui/AdditionalDetails/AdditionalDetails.tsx @@ -5,9 +5,35 @@ import s from "./AdditionalDetails.module.scss"; import { classNames } from "../../../../utils/classNames"; import arrowIcon from "../../../../assets/svg/arrow-select.svg"; +interface mixinType { + isEmpty: boolean; + minLengthError: boolean; + amountCorrectError: boolean; + inputValid: boolean; + value: string | number; + onChange: (e: React.ChangeEvent) => void; + onInput: (newValue: string | number) => void; + onBlur: () => void; + isFilled: boolean; + isDirty: boolean; +} + +interface feeType { + isEmpty: boolean; + minLengthError: boolean; + amountCorrectError: boolean; + inputValid: boolean; + value: string | number; + onChange: (e: React.ChangeEvent) => void; + onInput: (newValue: string | number) => void; + onBlur: () => void; + isFilled: boolean; + isDirty: boolean; +} + interface AdditionalDetailsProps { - fee: string | number; - mixin: string | number; + fee: string | number | feeType; + mixin: string | number | mixinType; isSenderInfo: { isChecked: boolean; onChange: () => void }; isReceiverInfo: { isChecked: boolean; onChange: () => void }; } diff --git a/src/app/store/store-reducer.tsx b/src/app/store/store-reducer.tsx index 73a6964..4c0161f 100644 --- a/src/app/store/store-reducer.tsx +++ b/src/app/store/store-reducer.tsx @@ -15,6 +15,7 @@ interface Asset { interface Transfer { assetId?: string; amount?: number; + incoming?: boolean; } interface Transaction { From dc7862bd0476b97c5bf248cb6599e22c1a9c7660 Mon Sep 17 00:00:00 2001 From: AzizbekFayziyev Date: Thu, 28 Nov 2024 22:22:57 +0500 Subject: [PATCH 08/10] converted --- ...tionDetails.jsx => TransactionDetails.tsx} | 57 ++++++++++++++----- 1 file changed, 43 insertions(+), 14 deletions(-) rename src/app/components/TransactionDetails/{TransactionDetails.jsx => TransactionDetails.tsx} (68%) diff --git a/src/app/components/TransactionDetails/TransactionDetails.jsx b/src/app/components/TransactionDetails/TransactionDetails.tsx similarity index 68% rename from src/app/components/TransactionDetails/TransactionDetails.jsx rename to src/app/components/TransactionDetails/TransactionDetails.tsx index 018b8ea..254a854 100644 --- a/src/app/components/TransactionDetails/TransactionDetails.jsx +++ b/src/app/components/TransactionDetails/TransactionDetails.tsx @@ -8,23 +8,54 @@ import RoutersNav from "../UI/RoutersNav/RoutersNav"; import { Store } from "../../store/store-reducer"; import styles from "./TransactionDetails.module.scss"; -const TransactionDetails = (props) => { +type Transfer = { + amount: string; + assetId: string; + incoming: boolean; +}; + +type TransactionDetailsProps = { + transfers?: Transfer[]; + fee: string; + addresses?: string[]; + txHash: string; + blobSize: number; + timestamp: string; + height: number; + paymentId?: string | null; + comment: string; + isInitiator?: boolean; +}; + +type TableRowProps = { + label: string; + value?: string | number; + copyButton?: boolean; + children?: React.ReactNode; +}; + +type WhitelistedAssetType = { + asset_id: string; + ticker: string; +}; + +const TransactionDetails: React.FC = (props) => { const { state } = useContext(Store); - const { copyToClipboard, SuccessCopyModal } = useCopy(); + const { copyToClipboard } = useCopy(); // removed: SuccessCopyModal useEffect(() => { document.body.scrollTo(0, 0); }, []); - const TableRow = ({ label, value, copyButton, children }) => { + const TableRow: React.FC = ({ label, value, copyButton, children }) => { return (
{label}: - {copyButton && ( + {copyButton && value && ( @@ -38,30 +69,29 @@ const TransactionDetails = (props) => { return (
- {SuccessCopyModal} + {/* {SuccessCopyModal} */}
- {props?.transfers?.map((transfer) => { + {props?.transfers?.map((transfer, index) => { if (transfer.amount === props.fee) return null; const amount = new Big(transfer.amount); const fixedFee = new Big(props.fee); return ( -
+

{transfer.assetId === "d6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a" ? !props.isInitiator ? amount.toFixed() : amount.minus(fixedFee).toFixed() - : amount.toFixed() - }{" "} + : amount.toFixed()}{" "} { - state.whitelistedAssets.find( - (asset) => asset.asset_id === transfer.assetId + (state.whitelistedAssets as any).find( + (asset: WhitelistedAssetType) => asset.asset_id === transfer.assetId )?.ticker ?? "***" }

@@ -75,7 +105,6 @@ const TransactionDetails = (props) => { ); })}
- {props.addresses && ( @@ -92,7 +121,7 @@ const TransactionDetails = (props) => { {props.paymentId ? ( ) : ( - + )}
From 1f5f71cc00b8fa03a80678c338f4cbd7153a2a4f Mon Sep 17 00:00:00 2001 From: AzizbekFayziyev Date: Fri, 29 Nov 2024 14:38:04 +0500 Subject: [PATCH 09/10] converted to ts --- src/app/{App.js => App.tsx} | 95 ++++++++++++++++++++++++------------- src/app/store/actions.ts | 4 +- 2 files changed, 65 insertions(+), 34 deletions(-) rename src/app/{App.js => App.tsx} (85%) diff --git a/src/app/App.js b/src/app/App.tsx similarity index 85% rename from src/app/App.js rename to src/app/App.tsx index 19721b2..0475afd 100644 --- a/src/app/App.js +++ b/src/app/App.tsx @@ -1,4 +1,5 @@ /*global chrome*/ +import React from "react"; import { useContext, useEffect, useState, useCallback } from "react"; import { Router, goTo } from "react-chrome-extension-router"; import AppPlug from "./components/AppPlug/AppPlug"; @@ -42,6 +43,36 @@ import Big from "big.js"; import swapModalStyles from "./styles/SwapModal.module.scss"; import useGetAsset from "./hooks/useGetAsset"; +// Types +type dispatchType = () => void; +type transferType = { transfer: { sender: string, destination: string, amount: string, asset: { ticker: string } }, id: number }; +type RequestType = { method: string; assetId: string, amount: string, destinationAddress: string, destinationChainId: string }; +type SwapRequest = { + id: string; + swap: { + destinationAddress: string; + destinationAsset: string; + destinationAssetAmount: string; + currentAsset: string; + currentAssetAmount: string; + }; +}; +type SwapProposal = { + to_finalizer: { amount: Big }[]; + to_initiator: { amount: Big }[]; +}; +type Asset = { + decimal_point: number; + [key: string]: any; +}; +type AcceptSwapReq = { + id: string; + hex_raw_proposal: string; + swapProposal: SwapProposal; + receivingAsset: Asset; + sendingAsset: Asset; +}; + function App() { const { state, dispatch } = useContext(Store); const [confirmationModalOpen, setConfirmationModalOpen] = useState(false); @@ -66,9 +97,9 @@ function App() { if (password) { const connectData = ConnectKeyUtils.getConnectData(password); - setConnectData(dispatch, { - token: connectData.token, - port: connectData.port, + setConnectData(dispatch as dispatchType, { + token: String(connectData?.token), + port: String(connectData?.port), }); } } @@ -92,7 +123,7 @@ function App() { const closeModal = () => { setConfirmationModalOpen(false); - updateConfirmationModal(dispatch, null); + updateConfirmationModal(dispatch as dispatchType, null); chrome.storage?.local?.remove?.(["pendingTx"]); chrome.action.setBadgeText({ text: "" }); }; @@ -105,7 +136,7 @@ function App() { } else { closeModal(); console.log(response.status); - updateTransactionStatus(dispatch, { + updateTransactionStatus(dispatch as dispatchType, { visible: true, type: "error", code: response.status.code || 0, @@ -128,8 +159,8 @@ function App() { const walletActive = await fetchBackground({ method: "GET_WALLET_DATA", }); - updateWalletConnected(dispatch, !walletActive.error); - updateLoading(dispatch, false); + updateWalletConnected(dispatch as dispatchType, !walletActive.error); + updateLoading(dispatch as dispatchType, false); }; const getWalletData = async () => { @@ -137,7 +168,7 @@ function App() { const walletsList = await fetchBackground({ method: "GET_WALLETS" }); if (!walletsList.data) return; - updateWalletsList(dispatch, walletsList.data); + updateWalletsList(dispatch as dispatchType, walletsList.data); const walletData = await fetchBackground({ method: "GET_WALLET_DATA", @@ -148,7 +179,7 @@ function App() { // console.log("WALLET DATA:"); // console.log(walletData.data); - updateWalletData(dispatch, { + updateWalletData(dispatch as dispatchType, { address, alias, balance, @@ -157,7 +188,7 @@ function App() { }); console.log("wallet data updated"); - updateLoading(dispatch, false); + updateLoading(dispatch as dispatchType, false); setFirstWalletLoaded(true); }; @@ -176,7 +207,7 @@ function App() { async function updateWhiteList() { const whiteList = await fetchBackground({ method: "GET_WHITELIST" }); if (whiteList.data) { - setWhiteList(dispatch, whiteList.data); + setWhiteList(dispatch as dispatchType, whiteList.data); } } updateWhiteList(); @@ -185,12 +216,12 @@ function App() { useEffect(() => { getZanoPrice().then((priceData) => { console.log("price data", priceData); - updatePriceData(dispatch, priceData); + updatePriceData(dispatch as dispatchType, priceData); }); }, [dispatch]); useEffect(() => { - const listener = (request, sender, sendResponse) => { + const listener = (request: RequestType, sender: chrome.runtime.MessageSender, sendResponse: (response: { status: string }) => void) => { if ( !( "assetId" in request && @@ -204,7 +235,7 @@ function App() { } if (request.method === "BRIDGING_TRANSFER") { - updateConfirmationModal(dispatch, { + updateConfirmationModal(dispatch as dispatchType, { method: "SEND_TRANSFER", params: [ request.assetId, @@ -234,7 +265,7 @@ function App() { useEffect(() => { chrome.storage?.local?.get?.(["pendingTx"], function (result) { if (result.pendingTx) { - updateConfirmationModal(dispatch, { + updateConfirmationModal(dispatch as dispatchType, { method: "SEND_TRANSFER", params: [ result.pendingTx.assetId, @@ -262,7 +293,7 @@ function App() { method: "SET_ACTIVE_WALLET", id: walletId, }); - updateActiveWalletId(dispatch, walletId); + updateActiveWalletId(dispatch as dispatchType, walletId); }); }, [dispatch]); @@ -277,7 +308,7 @@ function App() { method: "GET_TRANSFER_REQUEST", }); const transferRequests = transferRes.data; - const tranfserPageReqs = transferRequests.map((e) => { + const tranfserPageReqs = transferRequests.map((e: transferType) => { const { transfer } = e; return { id: e.id, @@ -335,7 +366,7 @@ function App() { } async function getIonicSwapRequests() { - function getSwapAmountText(amount, asset) { + function getSwapAmountText(amount: number | Big, asset: { ticker: string }) { const result = ( <> @@ -353,10 +384,10 @@ function App() { }); const swapRequests = ionicSwapRes.data; - const swapPageReqs = swapRequests.map((e) => { + const swapPageReqs = swapRequests.map((e: SwapRequest) => { const { swap } = e; - const swapParams = {}; + const swapParams: ({ address: string } | any) = {}; swapParams.address = swap.destinationAddress; @@ -365,13 +396,13 @@ function App() { swapParams.receiving = getSwapAmountText( receivingAmount, - receivingAsset + receivingAsset as any ); const sendingAsset = swap.currentAsset; const sendingAmount = new Big(swap.currentAssetAmount); - swapParams.sending = getSwapAmountText(sendingAmount, sendingAsset); + swapParams.sending = getSwapAmountText(sendingAmount, sendingAsset as any); return { id: e.id, @@ -404,14 +435,14 @@ function App() { console.log("ACCEPT SWAP", acceptSwapReqs); const acceptPageReqs = await Promise.all( - acceptSwapReqs.map(async (e) => { + acceptSwapReqs.map(async (e: AcceptSwapReq) => { const hex_raw_proposal = e?.hex_raw_proposal; const swap = e?.swapProposal; - const swapParams = {}; + const swapParams: ({ receiving: string } | any) = {}; - function toBigWithDecimal(amount, decimalPoint) { + function toBigWithDecimal(amount: Big, decimalPoint: number) { if (amount) { return new Big(amount).div(new Big(10).pow(decimalPoint)); } @@ -427,7 +458,7 @@ function App() { if (receivingAmount !== undefined) { swapParams.receiving = getSwapAmountText( receivingAmount, - receivingAsset + receivingAsset as any ); } @@ -440,7 +471,7 @@ function App() { if (sendingAmount !== undefined) { swapParams.sending = getSwapAmountText( sendingAmount, - sendingAsset + sendingAsset as any ); } } @@ -499,7 +530,7 @@ function App() { credentials: { token: state.connectCredentials.token, port: state?.connectCredentials?.port || defaultPort, - }, + } as any, }); } }, [state.connectCredentials]); @@ -512,10 +543,10 @@ function App() { onConfirm={(password) => { console.log(password, comparePasswords(password)); if (comparePasswords(password)) { - updateLoading(dispatch, true); + updateLoading(dispatch as dispatchType, true); setTimeout(() => { - updateLoading(dispatch, false); + updateLoading(dispatch as dispatchType, false); }, 2000); setLoggedIn(true); @@ -523,7 +554,7 @@ function App() { const connectData = ConnectKeyUtils.getConnectData(password); console.log("connectData", connectData); if (connectData?.token) { - setConnectData(dispatch, { + setConnectData(dispatch as dispatchType, { token: connectData.token, port: connectData.port, }); @@ -577,7 +608,7 @@ function App() { if (connectKey) ConnectKeyUtils.setConnectData( connectKey, - walletPort, + String(walletPort), password ); setLoggedIn(true); diff --git a/src/app/store/actions.ts b/src/app/store/actions.ts index 13d93ff..28bd725 100644 --- a/src/app/store/actions.ts +++ b/src/app/store/actions.ts @@ -3,12 +3,12 @@ interface WalletState { wallets: string[]; walletData: object; isConnected: boolean; - activeWalletId: string; + activeWalletId: string | number; priceData: object; displayCurrency: string; isLoading: boolean; balancesHidden: boolean; - confirmationModalOpen: boolean; + confirmationModalOpen: boolean | null | {method: string; params: string[]}; transactionStatus: string; connectData: object; whiteList: string[]; From 792971b95405b66b5208eae0ce58c2afcd2d8a56 Mon Sep 17 00:00:00 2001 From: AzizbekFayziyev Date: Fri, 29 Nov 2024 17:01:32 +0500 Subject: [PATCH 10/10] finished: converted to ts --- .../{background.js => background.ts} | 203 +++++++++++++----- tsconfig.json | 2 +- webpack.config.js | 2 +- 3 files changed, 156 insertions(+), 51 deletions(-) rename src/background/{background.js => background.ts} (80%) diff --git a/src/background/background.js b/src/background/background.ts similarity index 80% rename from src/background/background.js rename to src/background/background.ts index 129e959..461ac62 100644 --- a/src/background/background.js +++ b/src/background/background.ts @@ -23,7 +23,14 @@ const POPUP_WIDTH = 370; const ZANO_ID = "d6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a"; -async function getAsset(assetId) { +interface Asset { + asset_id: string; + ticker: string; + full_name: string; + decimal_point: number; +} + +async function getAsset(assetId: string): Promise { if (assetId === ZANO_ID) { return { asset_id: ZANO_ID, @@ -43,19 +50,42 @@ async function getAsset(assetId) { } } +interface PopupRequest { + windowId: number; + finalizer: (data: unknown) => void; + [key: string]: unknown; +} + +interface RequestResponse { + error?: string; + data?: unknown; +} + +interface ErrorMessages { + console: string; + response: string; + reqNotFound: string; +} + class PopupRequestsMethods { - static onRequestCreate(requestType, request, sendResponse, reqParams) { + static onRequestCreate( + requestType: keyof typeof savedRequests, + request: { timeout?: number }, + sendResponse: (response: RequestResponse) => void, + reqParams: PopupRequest + ): void { console.log("Creating request", reqParams); openWindow().then((requestWindow) => { const reqId = crypto.randomUUID(); const req = { - windowId: requestWindow.id, - finalizer: (data) => sendResponse(data), ...reqParams, + windowId: requestWindow.id, + finalizer: (data: unknown) => sendResponse(data as any), }; - allPopupIds.push(requestWindow.id); - savedRequests[requestType][reqId] = req; + + allPopupIds.push(requestWindow.id as number); + (savedRequests[requestType][reqId] as any) = req; if (typeof request.timeout === "number") { setTimeout(() => { @@ -66,7 +96,10 @@ class PopupRequestsMethods { }); } - static getRequestsList(requestType, sendResponse) { + static getRequestsList( + requestType: keyof typeof savedRequests, + sendResponse: (response: { data: PopupRequest[] }) => void + ): void { sendResponse({ data: Object.entries(savedRequests[requestType]).map(([id, req]) => ({ ...req, @@ -77,18 +110,18 @@ class PopupRequestsMethods { } static onRequestFinalize( - requestType, - request, - sendResponse, - apiCallFunc, - errorMessages - ) { + requestType: keyof typeof savedRequests, + request: { id: string; success: boolean }, + sendResponse: (response: RequestResponse) => void, + apiCallFunc: (req: PopupRequest) => Promise, + errorMessages: ErrorMessages + ): void { const reqId = request.id; const success = request.success; const req = savedRequests[requestType][reqId]; if (req) { - function finalize(data) { + function finalize(data: unknown) { req.finalizer(data); delete savedRequests[requestType][reqId]; chrome.windows.remove(req.windowId); @@ -110,18 +143,18 @@ class PopupRequestsMethods { }); } } else { - return sendResponse({ error: errorMessages.reqNotFound }); + sendResponse({ error: errorMessages.reqNotFound }); } } } chrome.windows.onBoundsChanged.addListener((window) => { if ( - allPopupIds.includes(window.id) && + allPopupIds.includes(window.id as number) && window.width !== POPUP_WIDTH && window.height !== POPUP_HEIGHT ) { - chrome.windows.update(window.id, { + chrome.windows.update(window.id as number, { width: POPUP_WIDTH, height: POPUP_HEIGHT, }); @@ -133,23 +166,40 @@ chrome.runtime.onStartup.addListener(() => { console.log("Background script loaded on startup"); }); -const defaultCredentials = { +interface Credentials { + port: number; + token?: string; +} + +const defaultCredentials: Credentials = { port: 11211, }; -export let apiCredentials = JSON.parse(JSON.stringify(defaultCredentials)); +export let apiCredentials: Credentials = { ...defaultCredentials }; -let pendingTx = null; +interface pendingTxTypes { + assetId: string, + amount: string, + destinationAddress: string | undefined, + destinationChainId: string | undefined, +} -const defaultUserData = { password: undefined }; +let pendingTx: pendingTxTypes | null = null; -async function setUserData(state) { +interface UserData { + password?: string; + apiCredentials?: Credentials; +} + +const defaultUserData: UserData = { password: undefined }; + +async function setUserData(state: UserData): Promise { await new Promise((resolve) => { - chrome.storage.local.set({ userData: state }, resolve); + chrome.storage.local.set({ userData: state }, resolve as (() => void)); }); } -async function getUserData() { +async function getUserData(): Promise { return new Promise((resolve) => { chrome.storage.local.get("userData", (result) => { resolve(result.userData || defaultUserData); @@ -157,41 +207,47 @@ async function getUserData() { }); } -async function updateUserData(newData) { +async function updateUserData(newData: Partial): Promise { const currentData = await getUserData(); return setUserData({ ...currentData, ...newData }); } -async function recoverApiCredentials() { +async function recoverApiCredentials(): Promise { apiCredentials = (await getUserData()).apiCredentials || defaultCredentials; } chrome.runtime.onStartup.addListener(() => { - chrome.storage.local.remove("userData", function () { + chrome.storage.local.remove("userData", () => { console.log("State cleared on browser startup"); }); }); -const signReqFinalizers = {}; -const signReqs = []; +interface SignReqFinalizer { + [key: string]: (data: unknown) => void; +} -const savedRequests = { +const signReqFinalizers: SignReqFinalizer = {}; +const signReqs: unknown[] = []; + +const savedRequests: Record< + "IONIC_SWAP" | "ACCEPT_IONIC_SWAP" | "CREATE_ALIAS" | "TRANSFER", + Record +> = { IONIC_SWAP: {}, ACCEPT_IONIC_SWAP: {}, CREATE_ALIAS: {}, TRANSFER: {}, }; -const allPopupIds = []; +const allPopupIds: number[] = []; -// eslint-disable-next-line no-undef chrome.storage.local.get("pendingTx", (result) => { if (result.pendingTx) { pendingTx = result.pendingTx; } }); -function openWindow() { +function openWindow(): Promise { return chrome.windows.create({ url: chrome.runtime.getURL("index.html"), type: "popup", @@ -223,11 +279,56 @@ const SELF_ONLY_REQUESTS = [ ]; chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { - processRequest(request, sender, sendResponse); + processRequest(request, sender as any, sendResponse); return true; }); -async function processRequest(request, sender, sendResponse) { +interface RequestType { + method: string; + credentials: Object; + id: string; + assetId: string; + destination: string; + amount: string; + decimalPoint: string; + success: boolean; + destinationAssetID: string; + currentAssetID: string; + currentAsset: Asset; + destinationAsset: Asset; + hex_raw_proposal?: string; + alias?: string; + sender?: string; + transfer?: any; + swapProposal?: any; + password?: string; + key?: string; + aliasDetails?: any; + signReqs?: any[]; + windowId?: number; + message?: string; + timeout?: number; + destinationChainId?: string; + destinationAddress?: string; + receivingAsset?: any; + sendingAsset?: any; + asset?: Asset; +} + +interface Sender { + id: string; + name?: string; + email?: string; + phoneNumber?: string; + address?: string; + [key: string]: any; +} + +interface SendResponse { + (response: any): void; +} + +async function processRequest(request: RequestType, sender: Sender, sendResponse: SendResponse) { const isFromExtensionFrontend = sender.url && sender.url.includes(chrome.runtime.getURL("/")); @@ -301,7 +402,7 @@ async function processRequest(request, sender, sendResponse) { break; case "GET_WALLET_DATA": - getWalletData(request.id) + getWalletData() // removed request.id .then((data) => { sendResponse({ data }); }) @@ -372,7 +473,7 @@ async function processRequest(request, sender, sendResponse) { "IONIC_SWAP", request, sendResponse, - { swap: request } + { swap: request } as any ); break; } @@ -389,13 +490,17 @@ async function processRequest(request, sender, sendResponse) { const { address } = walletData; request.asset = asset || (await getAsset(ZANO_ID)); request.sender = address || ""; - } catch (e) { - return sendResponse({ error: e.message }); + } catch (e: unknown) { + if (e instanceof Error) { + return sendResponse({ error: e.message }); + } else { + return sendResponse({ error: 'Unknown error occurred' }); + } } PopupRequestsMethods.onRequestCreate("TRANSFER", request, sendResponse, { transfer: request, - }); + } as any); break; } @@ -405,7 +510,7 @@ async function processRequest(request, sender, sendResponse) { request, sendResponse, (req) => { - const transferData = req.transfer; + const transferData: any = req.transfer; const { assetId, destination, amount, asset } = transferData; return transfer( @@ -502,7 +607,7 @@ async function processRequest(request, sender, sendResponse) { "ACCEPT_IONIC_SWAP", request, sendResponse, - request + request as any ); break; } @@ -571,7 +676,7 @@ async function processRequest(request, sender, sendResponse) { } case "GET_ALIAS_DETAILS": { - getAliasDetails(request.alias) + getAliasDetails(String(request.alias)) .then((res) => sendResponse(res)) .catch(() => sendResponse({ error: "Internal error" })); break; @@ -585,10 +690,10 @@ async function processRequest(request, sender, sendResponse) { case "FINALIZE_MESSAGE_SIGN": { const reqId = request.id; const success = request.success; - const signReq = signReqs.find((req) => req.id === reqId); + const signReq: any = signReqs.find((req: any) => req.id === reqId); if (signReq && signReqFinalizers[reqId]) { - function finalize(data) { + function finalize(data: any) { signReqFinalizers[reqId](data); signReqs.splice(signReqs.indexOf(signReq), 1); delete signReqFinalizers[reqId]; @@ -633,7 +738,7 @@ async function processRequest(request, sender, sendResponse) { sendResponse(result); }; - allPopupIds.push(requestWindow.id); + allPopupIds.push(Number(requestWindow.id)); signReqs.push({ id: signReqId, @@ -644,7 +749,7 @@ async function processRequest(request, sender, sendResponse) { if (typeof request.timeout === "number") { setTimeout(() => { const signReqIndex = signReqs.findIndex( - (req) => req.id === signReqId + (req: any) => req.id === signReqId ); if (signReqIndex === -1) { @@ -715,7 +820,7 @@ async function processRequest(request, sender, sendResponse) { "CREATE_ALIAS", request, sendResponse, - { alias: request.alias } + ({ alias: request.alias } as any) ); break; } @@ -724,4 +829,4 @@ async function processRequest(request, sender, sendResponse) { console.error("Unknown message method:", request.method); sendResponse({ error: `Unknown method: ${request.method}` }); } -} +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index c0acac3..e18aa42 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es5", + "target": "es6", "module": "es6", "moduleResolution": "node", "jsx": "react", diff --git a/webpack.config.js b/webpack.config.js index 8c5e3da..4a5b5df 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -20,7 +20,7 @@ const appConfig = { }; const backgroundConfig = { - entry: "./src/background/background.js", + entry: "./src/background/background.ts", output: { path: path.resolve(__dirname, "build/static/js"), filename: "background.bundle.js",