From 5cfb2c2cfdd3465bd2e50540951162d995f067be Mon Sep 17 00:00:00 2001 From: Luka Jeran Date: Mon, 8 Apr 2024 00:48:36 +0000 Subject: [PATCH 1/9] parcel --- .gitignore | 2 + package.json | 5 +- public/static/popup.html | 3 +- yarn.lock | 1312 +++++++++++++++++++++++++++++++++++++- 4 files changed, 1310 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 5fa9984..cc0768a 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,5 @@ __pycache__/ # Ignore build releases. rose-wallet-*.zip + +.parcel-cache \ No newline at end of file diff --git a/package.json b/package.json index 908d4fd..93dc06f 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "build": "env NODE_OPTIONS=--openssl-legacy-provider webpack --mode production", "buildProd": "env NODE_OPTIONS=--openssl-legacy-provider webpack --mode production", - "dev": "env NODE_OPTIONS=--openssl-legacy-provider webpack --mode development --progress --watch", + "dev": "yarn parcel ./public/static/popup.html", "lint": "yarn run eslint src", "test": "jest" }, @@ -71,6 +71,7 @@ "@babel/preset-env": "7.12.7", "@babel/preset-react": "7.12.7", "@babel/runtime": "7.12.5", + "@parcel/transformer-sass": "2.12.0", "@types/chrome": "^0.0.193", "@types/lodash": "^4.14.195", "@types/prop-types": "^15.7.4", @@ -91,10 +92,12 @@ "jest-chrome": "^0.7.2", "jsdom": "^20.0.0", "jsdom-global": "^3.0.2", + "parcel": "^2.12.0", "polyfill-crypto.getrandomvalues": "1.0.0", "react-scripts": "4.0.1", "sass": "^1.45.1", "sinon": "^11.1.1", + "stream-browserify": "^3.0.0", "url-loader": "4.1.1", "webpack": "4.44.2", "webpack-cli": "4.2.0" diff --git a/public/static/popup.html b/public/static/popup.html index 9d2475c..1548f12 100755 --- a/public/static/popup.html +++ b/public/static/popup.html @@ -7,8 +7,7 @@
- - + diff --git a/yarn.lock b/yarn.lock index c1e6638..2c325ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3160,6 +3160,48 @@ resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.10.0.tgz#c012c1ecc1a0e53d50e6af381618dca5268461c1" integrity sha512-lLseUPEhSFUXYTKj6q7s2O3s2vW2ebgA11vMAlKodXGf5AFw4zUoEbTz9CoFOC9jS6xY4Qr8BmRnxP/odT4Uuw== +"@lezer/common@^1.0.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.2.1.tgz#198b278b7869668e1bebbe687586e12a42731049" + integrity sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ== + +"@lezer/lr@^1.0.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.0.tgz#ed52a75dbbfbb0d1eb63710ea84c35ee647cb67e" + integrity sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg== + dependencies: + "@lezer/common" "^1.0.0" + +"@lmdb/lmdb-darwin-arm64@2.8.5": + version "2.8.5" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.8.5.tgz#895d8cb16a9d709ce5fedd8b60022903b875e08e" + integrity sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw== + +"@lmdb/lmdb-darwin-x64@2.8.5": + version "2.8.5" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.8.5.tgz#ca243534c8b37d5516c557e4624256d18dd63184" + integrity sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug== + +"@lmdb/lmdb-linux-arm64@2.8.5": + version "2.8.5" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.8.5.tgz#b44a8023057e21512eefb9f6120096843b531c1e" + integrity sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww== + +"@lmdb/lmdb-linux-arm@2.8.5": + version "2.8.5" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.8.5.tgz#17bd54740779c3e4324e78e8f747c21416a84b3d" + integrity sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg== + +"@lmdb/lmdb-linux-x64@2.8.5": + version "2.8.5" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.8.5.tgz#6c61835b6cc58efdf79dbd5e8c72a38300a90302" + integrity sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ== + +"@lmdb/lmdb-win32-x64@2.8.5": + version "2.8.5" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.8.5.tgz#8233e8762440b0f4632c47a09b1b6f23de8b934c" + integrity sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ== + "@metamask/browser-passworder@3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@metamask/browser-passworder/-/browser-passworder-3.0.0.tgz#c06744e66a968ffa13f70cc71a7d3b15d86b0ee7" @@ -3186,6 +3228,45 @@ resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== +"@mischnic/json-sourcemap@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@mischnic/json-sourcemap/-/json-sourcemap-0.1.1.tgz#0ef9b015a8f575dd9a8720d9a6b4dbc988425906" + integrity sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w== + dependencies: + "@lezer/common" "^1.0.0" + "@lezer/lr" "^1.0.0" + json5 "^2.2.1" + +"@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz#44d752c1a2dc113f15f781b7cc4f53a307e3fa38" + integrity sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ== + +"@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz#f954f34355712212a8e06c465bc06c40852c6bb3" + integrity sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw== + +"@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz#45c63037f045c2b15c44f80f0393fa24f9655367" + integrity sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg== + +"@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz#35707efeafe6d22b3f373caf9e8775e8920d1399" + integrity sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA== + +"@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz#091b1218b66c341f532611477ef89e83f25fae4f" + integrity sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA== + +"@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz#0f164b726869f71da3c594171df5ebc1c4b0a407" + integrity sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ== + "@nodelib/fs.scandir@2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" @@ -3274,6 +3355,678 @@ "@ledgerhq/hw-transport" "^6.1.0" bech32 "^2.0.0" +"@parcel/bundler-default@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/bundler-default/-/bundler-default-2.12.0.tgz#b8f6f3fc3f497714bd54e19882aaa116e97df4a4" + integrity sha512-3ybN74oYNMKyjD6V20c9Gerdbh7teeNvVMwIoHIQMzuIFT6IGX53PyOLlOKRLbjxMc0TMimQQxIt2eQqxR5LsA== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/graph" "3.2.0" + "@parcel/plugin" "2.12.0" + "@parcel/rust" "2.12.0" + "@parcel/utils" "2.12.0" + nullthrows "^1.1.1" + +"@parcel/cache@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/cache/-/cache-2.12.0.tgz#b8fd2ea2bc7a2353a9b20344cc191bfb4f8284f3" + integrity sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw== + dependencies: + "@parcel/fs" "2.12.0" + "@parcel/logger" "2.12.0" + "@parcel/utils" "2.12.0" + lmdb "2.8.5" + +"@parcel/codeframe@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/codeframe/-/codeframe-2.12.0.tgz#9ea75bd7ae6c5f7fadf42a5e64657cf88fdcb29e" + integrity sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg== + dependencies: + chalk "^4.1.0" + +"@parcel/compressor-raw@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/compressor-raw/-/compressor-raw-2.12.0.tgz#71012b695c870f1d26bfd8d56983c14bf13fd996" + integrity sha512-h41Q3X7ZAQ9wbQ2csP8QGrwepasLZdXiuEdpUryDce6rF9ZiHoJ97MRpdLxOhOPyASTw/xDgE1xyaPQr0Q3f5A== + dependencies: + "@parcel/plugin" "2.12.0" + +"@parcel/config-default@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/config-default/-/config-default-2.12.0.tgz#7b213348db349c6042a80dfd4a7eab707a1dfbfa" + integrity sha512-dPNe2n9eEsKRc1soWIY0yToMUPirPIa2QhxcCB3Z5RjpDGIXm0pds+BaiqY6uGLEEzsjhRO0ujd4v2Rmm0vuFg== + dependencies: + "@parcel/bundler-default" "2.12.0" + "@parcel/compressor-raw" "2.12.0" + "@parcel/namer-default" "2.12.0" + "@parcel/optimizer-css" "2.12.0" + "@parcel/optimizer-htmlnano" "2.12.0" + "@parcel/optimizer-image" "2.12.0" + "@parcel/optimizer-svgo" "2.12.0" + "@parcel/optimizer-swc" "2.12.0" + "@parcel/packager-css" "2.12.0" + "@parcel/packager-html" "2.12.0" + "@parcel/packager-js" "2.12.0" + "@parcel/packager-raw" "2.12.0" + "@parcel/packager-svg" "2.12.0" + "@parcel/packager-wasm" "2.12.0" + "@parcel/reporter-dev-server" "2.12.0" + "@parcel/resolver-default" "2.12.0" + "@parcel/runtime-browser-hmr" "2.12.0" + "@parcel/runtime-js" "2.12.0" + "@parcel/runtime-react-refresh" "2.12.0" + "@parcel/runtime-service-worker" "2.12.0" + "@parcel/transformer-babel" "2.12.0" + "@parcel/transformer-css" "2.12.0" + "@parcel/transformer-html" "2.12.0" + "@parcel/transformer-image" "2.12.0" + "@parcel/transformer-js" "2.12.0" + "@parcel/transformer-json" "2.12.0" + "@parcel/transformer-postcss" "2.12.0" + "@parcel/transformer-posthtml" "2.12.0" + "@parcel/transformer-raw" "2.12.0" + "@parcel/transformer-react-refresh-wrap" "2.12.0" + "@parcel/transformer-svg" "2.12.0" + +"@parcel/core@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/core/-/core-2.12.0.tgz#ea5734f008300bc57aaff2ba0f7949724c93b56d" + integrity sha512-s+6pwEj+GfKf7vqGUzN9iSEPueUssCCQrCBUlcAfKrJe0a22hTUCjewpB0I7lNrCIULt8dkndD+sMdOrXsRl6Q== + dependencies: + "@mischnic/json-sourcemap" "^0.1.0" + "@parcel/cache" "2.12.0" + "@parcel/diagnostic" "2.12.0" + "@parcel/events" "2.12.0" + "@parcel/fs" "2.12.0" + "@parcel/graph" "3.2.0" + "@parcel/logger" "2.12.0" + "@parcel/package-manager" "2.12.0" + "@parcel/plugin" "2.12.0" + "@parcel/profiler" "2.12.0" + "@parcel/rust" "2.12.0" + "@parcel/source-map" "^2.1.1" + "@parcel/types" "2.12.0" + "@parcel/utils" "2.12.0" + "@parcel/workers" "2.12.0" + abortcontroller-polyfill "^1.1.9" + base-x "^3.0.8" + browserslist "^4.6.6" + clone "^2.1.1" + dotenv "^7.0.0" + dotenv-expand "^5.1.0" + json5 "^2.2.0" + msgpackr "^1.9.9" + nullthrows "^1.1.1" + semver "^7.5.2" + +"@parcel/diagnostic@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/diagnostic/-/diagnostic-2.12.0.tgz#b38057d819ea2edc32018a1d51df434f07840be9" + integrity sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA== + dependencies: + "@mischnic/json-sourcemap" "^0.1.0" + nullthrows "^1.1.1" + +"@parcel/events@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/events/-/events-2.12.0.tgz#ef67e3fbb96806b3531a37bcf95e8fbb3818ffa2" + integrity sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA== + +"@parcel/fs@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/fs/-/fs-2.12.0.tgz#8c9029353888311ba2e9e2198dbe6c7c1da635c0" + integrity sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q== + dependencies: + "@parcel/rust" "2.12.0" + "@parcel/types" "2.12.0" + "@parcel/utils" "2.12.0" + "@parcel/watcher" "^2.0.7" + "@parcel/workers" "2.12.0" + +"@parcel/graph@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@parcel/graph/-/graph-3.2.0.tgz#309e6e3f19ef4ea7f71b2341ec1bcc08e7c43523" + integrity sha512-xlrmCPqy58D4Fg5umV7bpwDx5Vyt7MlnQPxW68vae5+BA4GSWetfZt+Cs5dtotMG2oCHzZxhIPt7YZ7NRyQzLA== + dependencies: + nullthrows "^1.1.1" + +"@parcel/logger@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/logger/-/logger-2.12.0.tgz#0b866b7aee8a0a462596a80cd46bd8b29c318758" + integrity sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/events" "2.12.0" + +"@parcel/markdown-ansi@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz#a4301321fa784a28ba817e65e41432fe8b3b3192" + integrity sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w== + dependencies: + chalk "^4.1.0" + +"@parcel/namer-default@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/namer-default/-/namer-default-2.12.0.tgz#f9903da8e4c5c3e33fc8ab70b222be520a46da5d" + integrity sha512-9DNKPDHWgMnMtqqZIMiEj/R9PNWW16lpnlHjwK3ciRlMPgjPJ8+UNc255teZODhX0T17GOzPdGbU/O/xbxVPzA== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/plugin" "2.12.0" + nullthrows "^1.1.1" + +"@parcel/node-resolver-core@3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz#f40d80de800baa7cf230406b7122c8711ac4cdc8" + integrity sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA== + dependencies: + "@mischnic/json-sourcemap" "^0.1.0" + "@parcel/diagnostic" "2.12.0" + "@parcel/fs" "2.12.0" + "@parcel/rust" "2.12.0" + "@parcel/utils" "2.12.0" + nullthrows "^1.1.1" + semver "^7.5.2" + +"@parcel/optimizer-css@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/optimizer-css/-/optimizer-css-2.12.0.tgz#f44f38dc7136b511a849343eea04714a42e1ba5f" + integrity sha512-ifbcC97fRzpruTjaa8axIFeX4MjjSIlQfem3EJug3L2AVqQUXnM1XO8L0NaXGNLTW2qnh1ZjIJ7vXT/QhsphsA== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/plugin" "2.12.0" + "@parcel/source-map" "^2.1.1" + "@parcel/utils" "2.12.0" + browserslist "^4.6.6" + lightningcss "^1.22.1" + nullthrows "^1.1.1" + +"@parcel/optimizer-htmlnano@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.12.0.tgz#e389d56d3f5cd2f6dd464a756a0704a65e527a9b" + integrity sha512-MfPMeCrT8FYiOrpFHVR+NcZQlXAptK2r4nGJjfT+ndPBhEEZp4yyL7n1y7HfX9geg5altc4WTb4Gug7rCoW8VQ== + dependencies: + "@parcel/plugin" "2.12.0" + htmlnano "^2.0.0" + nullthrows "^1.1.1" + posthtml "^0.16.5" + svgo "^2.4.0" + +"@parcel/optimizer-image@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/optimizer-image/-/optimizer-image-2.12.0.tgz#46dd3c2a871700076c17376d27f6d46d030a0717" + integrity sha512-bo1O7raeAIbRU5nmNVtx8divLW9Xqn0c57GVNGeAK4mygnQoqHqRZ0mR9uboh64pxv6ijXZHPhKvU9HEpjPjBQ== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/plugin" "2.12.0" + "@parcel/rust" "2.12.0" + "@parcel/utils" "2.12.0" + "@parcel/workers" "2.12.0" + +"@parcel/optimizer-svgo@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/optimizer-svgo/-/optimizer-svgo-2.12.0.tgz#f1e411cbc3a3c56e05aa5fb2e1edd1ecc7016378" + integrity sha512-Kyli+ZZXnoonnbeRQdoWwee9Bk2jm/49xvnfb+2OO8NN0d41lblBoRhOyFiScRnJrw7eVl1Xrz7NTkXCIO7XFQ== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/plugin" "2.12.0" + "@parcel/utils" "2.12.0" + svgo "^2.4.0" + +"@parcel/optimizer-swc@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/optimizer-swc/-/optimizer-swc-2.12.0.tgz#bacbdb4f6f4a7e0b7086f30b683e3f3f2f980c96" + integrity sha512-iBi6LZB3lm6WmbXfzi8J3DCVPmn4FN2lw7DGXxUXu7MouDPVWfTsM6U/5TkSHJRNRogZ2gqy5q9g34NPxHbJcw== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/plugin" "2.12.0" + "@parcel/source-map" "^2.1.1" + "@parcel/utils" "2.12.0" + "@swc/core" "^1.3.36" + nullthrows "^1.1.1" + +"@parcel/package-manager@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/package-manager/-/package-manager-2.12.0.tgz#7e1eb5f652544e045f7240fa6cf92e5ff1627624" + integrity sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/fs" "2.12.0" + "@parcel/logger" "2.12.0" + "@parcel/node-resolver-core" "3.3.0" + "@parcel/types" "2.12.0" + "@parcel/utils" "2.12.0" + "@parcel/workers" "2.12.0" + "@swc/core" "^1.3.36" + semver "^7.5.2" + +"@parcel/packager-css@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/packager-css/-/packager-css-2.12.0.tgz#bee2908608f306186695c6505c3303548751a7b8" + integrity sha512-j3a/ODciaNKD19IYdWJT+TP+tnhhn5koBGBWWtrKSu0UxWpnezIGZetit3eE+Y9+NTePalMkvpIlit2eDhvfJA== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/plugin" "2.12.0" + "@parcel/source-map" "^2.1.1" + "@parcel/utils" "2.12.0" + lightningcss "^1.22.1" + nullthrows "^1.1.1" + +"@parcel/packager-html@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/packager-html/-/packager-html-2.12.0.tgz#dd62a483043982880a63e68ce8d8132f60becd3d" + integrity sha512-PpvGB9hFFe+19NXGz2ApvPrkA9GwEqaDAninT+3pJD57OVBaxB8U+HN4a5LICKxjUppPPqmrLb6YPbD65IX4RA== + dependencies: + "@parcel/plugin" "2.12.0" + "@parcel/types" "2.12.0" + "@parcel/utils" "2.12.0" + nullthrows "^1.1.1" + posthtml "^0.16.5" + +"@parcel/packager-js@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/packager-js/-/packager-js-2.12.0.tgz#f81f64d16560b97e70bbb4cf568555f990afa2f6" + integrity sha512-viMF+FszITRRr8+2iJyk+4ruGiL27Y6AF7hQ3xbJfzqnmbOhGFtLTQwuwhOLqN/mWR2VKdgbLpZSarWaO3yAMg== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/plugin" "2.12.0" + "@parcel/rust" "2.12.0" + "@parcel/source-map" "^2.1.1" + "@parcel/types" "2.12.0" + "@parcel/utils" "2.12.0" + globals "^13.2.0" + nullthrows "^1.1.1" + +"@parcel/packager-raw@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/packager-raw/-/packager-raw-2.12.0.tgz#043b704814ff2bcc884cf33e6542f72e246367e0" + integrity sha512-tJZqFbHqP24aq1F+OojFbQIc09P/u8HAW5xfndCrFnXpW4wTgM3p03P0xfw3gnNq+TtxHJ8c3UFE5LnXNNKhYA== + dependencies: + "@parcel/plugin" "2.12.0" + +"@parcel/packager-svg@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/packager-svg/-/packager-svg-2.12.0.tgz#2c392243373d60fc834a08d15003f239c34f39a7" + integrity sha512-ldaGiacGb2lLqcXas97k8JiZRbAnNREmcvoY2W2dvW4loVuDT9B9fU777mbV6zODpcgcHWsLL3lYbJ5Lt3y9cg== + dependencies: + "@parcel/plugin" "2.12.0" + "@parcel/types" "2.12.0" + "@parcel/utils" "2.12.0" + posthtml "^0.16.4" + +"@parcel/packager-wasm@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/packager-wasm/-/packager-wasm-2.12.0.tgz#39dbd91e7bf68456dbc9d19a412017e2b513736f" + integrity sha512-fYqZzIqO9fGYveeImzF8ll6KRo2LrOXfD+2Y5U3BiX/wp9wv17dz50QLDQm9hmTcKGWxK4yWqKQh+Evp/fae7A== + dependencies: + "@parcel/plugin" "2.12.0" + +"@parcel/plugin@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/plugin/-/plugin-2.12.0.tgz#3db4237e8977ef5b5378b65eaffb809d2026431a" + integrity sha512-nc/uRA8DiMoe4neBbzV6kDndh/58a4wQuGKw5oEoIwBCHUvE2W8ZFSu7ollSXUGRzfacTt4NdY8TwS73ScWZ+g== + dependencies: + "@parcel/types" "2.12.0" + +"@parcel/profiler@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/profiler/-/profiler-2.12.0.tgz#8541ca5d27500aebc843b1de081734442e5ee054" + integrity sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/events" "2.12.0" + chrome-trace-event "^1.0.2" + +"@parcel/reporter-cli@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/reporter-cli/-/reporter-cli-2.12.0.tgz#e067b4eeca49c7120d3455d99810bed5bc825920" + integrity sha512-TqKsH4GVOLPSCanZ6tcTPj+rdVHERnt5y4bwTM82cajM21bCX1Ruwp8xOKU+03091oV2pv5ieB18pJyRF7IpIw== + dependencies: + "@parcel/plugin" "2.12.0" + "@parcel/types" "2.12.0" + "@parcel/utils" "2.12.0" + chalk "^4.1.0" + term-size "^2.2.1" + +"@parcel/reporter-dev-server@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/reporter-dev-server/-/reporter-dev-server-2.12.0.tgz#bd4c9e3d6dc8d8b178564a336f46b4f70acf3e79" + integrity sha512-tIcDqRvAPAttRlTV28dHcbWT5K2r/MBFks7nM4nrEDHWtnrCwimkDmZTc1kD8QOCCjGVwRHcQybpHvxfwol6GA== + dependencies: + "@parcel/plugin" "2.12.0" + "@parcel/utils" "2.12.0" + +"@parcel/reporter-tracer@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/reporter-tracer/-/reporter-tracer-2.12.0.tgz#680e8be677277318c656c1825dbe98a8bfb64e16" + integrity sha512-g8rlu9GxB8Ut/F8WGx4zidIPQ4pcYFjU9bZO+fyRIPrSUFH2bKijCnbZcr4ntqzDGx74hwD6cCG4DBoleq2UlQ== + dependencies: + "@parcel/plugin" "2.12.0" + "@parcel/utils" "2.12.0" + chrome-trace-event "^1.0.3" + nullthrows "^1.1.1" + +"@parcel/resolver-default@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/resolver-default/-/resolver-default-2.12.0.tgz#005b6bc01de9d166a97d7ef30daf339973c4898a" + integrity sha512-uuhbajTax37TwCxu7V98JtRLiT6hzE4VYSu5B7Qkauy14/WFt2dz6GOUXPgVsED569/hkxebPx3KCMtZW6cHHA== + dependencies: + "@parcel/node-resolver-core" "3.3.0" + "@parcel/plugin" "2.12.0" + +"@parcel/runtime-browser-hmr@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.12.0.tgz#9d045785b83760e305c9efd3d6300a9ff73bcfaf" + integrity sha512-4ZLp2FWyD32r0GlTulO3+jxgsA3oO1P1b5oO2IWuWilfhcJH5LTiazpL5YdusUjtNn9PGN6QLAWfxmzRIfM+Ow== + dependencies: + "@parcel/plugin" "2.12.0" + "@parcel/utils" "2.12.0" + +"@parcel/runtime-js@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/runtime-js/-/runtime-js-2.12.0.tgz#da6f7da041cb157556822ad60fefcdbc790dda9c" + integrity sha512-sBerP32Z1crX5PfLNGDSXSdqzlllM++GVnVQVeM7DgMKS8JIFG3VLi28YkX+dYYGtPypm01JoIHCkvwiZEcQJg== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/plugin" "2.12.0" + "@parcel/utils" "2.12.0" + nullthrows "^1.1.1" + +"@parcel/runtime-react-refresh@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.12.0.tgz#58c17552766492ec2005ffedfa04ecb29386dd8b" + integrity sha512-SCHkcczJIDFTFdLTzrHTkQ0aTrX3xH6jrA4UsCBL6ji61+w+ohy4jEEe9qCgJVXhnJfGLE43HNXek+0MStX+Mw== + dependencies: + "@parcel/plugin" "2.12.0" + "@parcel/utils" "2.12.0" + react-error-overlay "6.0.9" + react-refresh "^0.9.0" + +"@parcel/runtime-service-worker@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/runtime-service-worker/-/runtime-service-worker-2.12.0.tgz#67ee1e6dbc5441651fed04ecb2bd7ebe1e362679" + integrity sha512-BXuMBsfiwpIEnssn+jqfC3jkgbS8oxeo3C7xhSQsuSv+AF2FwY3O3AO1c1RBskEW3XrBLNINOJujroNw80VTKA== + dependencies: + "@parcel/plugin" "2.12.0" + "@parcel/utils" "2.12.0" + nullthrows "^1.1.1" + +"@parcel/rust@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/rust/-/rust-2.12.0.tgz#135df4dd8c63d97720379777c5bb4a2680a201cd" + integrity sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw== + +"@parcel/source-map@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@parcel/source-map/-/source-map-2.1.1.tgz#fb193b82dba6dd62cc7a76b326f57bb35000a782" + integrity sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew== + dependencies: + detect-libc "^1.0.3" + +"@parcel/transformer-babel@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-babel/-/transformer-babel-2.12.0.tgz#29be68f2fad4688b33ef3f03ef2b8c3e9928b87f" + integrity sha512-zQaBfOnf/l8rPxYGnsk/ufh/0EuqvmnxafjBIpKZ//j6rGylw5JCqXSb1QvvAqRYruKeccxGv7+HrxpqKU6V4A== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/plugin" "2.12.0" + "@parcel/source-map" "^2.1.1" + "@parcel/utils" "2.12.0" + browserslist "^4.6.6" + json5 "^2.2.0" + nullthrows "^1.1.1" + semver "^7.5.2" + +"@parcel/transformer-css@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-css/-/transformer-css-2.12.0.tgz#218a98948c9410c17287183d80ca9bd9943cc9e9" + integrity sha512-vXhOqoAlQGATYyQ433Z1DXKmiKmzOAUmKysbYH3FD+LKEKLMEl/pA14goqp00TW+A/EjtSKKyeMyHlMIIUqj4Q== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/plugin" "2.12.0" + "@parcel/source-map" "^2.1.1" + "@parcel/utils" "2.12.0" + browserslist "^4.6.6" + lightningcss "^1.22.1" + nullthrows "^1.1.1" + +"@parcel/transformer-html@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-html/-/transformer-html-2.12.0.tgz#8681b089e2b20c5fda1c966cefb8de4d8fb2ce80" + integrity sha512-5jW4dFFBlYBvIQk4nrH62rfA/G/KzVzEDa6S+Nne0xXhglLjkm64Ci9b/d4tKZfuGWUbpm2ASAq8skti/nfpXw== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/plugin" "2.12.0" + "@parcel/rust" "2.12.0" + nullthrows "^1.1.1" + posthtml "^0.16.5" + posthtml-parser "^0.10.1" + posthtml-render "^3.0.0" + semver "^7.5.2" + srcset "4" + +"@parcel/transformer-image@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-image/-/transformer-image-2.12.0.tgz#8ba2ca3b5d88287bf38c8244b2714158c9d34b2e" + integrity sha512-8hXrGm2IRII49R7lZ0RpmNk27EhcsH+uNKsvxuMpXPuEnWgC/ha/IrjaI29xCng1uGur74bJF43NUSQhR4aTdw== + dependencies: + "@parcel/plugin" "2.12.0" + "@parcel/utils" "2.12.0" + "@parcel/workers" "2.12.0" + nullthrows "^1.1.1" + +"@parcel/transformer-js@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-js/-/transformer-js-2.12.0.tgz#e6bf0c312f78603faf98ce546086898506e3811f" + integrity sha512-OSZpOu+FGDbC/xivu24v092D9w6EGytB3vidwbdiJ2FaPgfV7rxS0WIUjH4I0OcvHAcitArRXL0a3+HrNTdQQw== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/plugin" "2.12.0" + "@parcel/rust" "2.12.0" + "@parcel/source-map" "^2.1.1" + "@parcel/utils" "2.12.0" + "@parcel/workers" "2.12.0" + "@swc/helpers" "^0.5.0" + browserslist "^4.6.6" + nullthrows "^1.1.1" + regenerator-runtime "^0.13.7" + semver "^7.5.2" + +"@parcel/transformer-json@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-json/-/transformer-json-2.12.0.tgz#16cc0454e4862350b605a5e2009d050c676c6ea5" + integrity sha512-Utv64GLRCQILK5r0KFs4o7I41ixMPllwOLOhkdjJKvf1hZmN6WqfOmB1YLbWS/y5Zb/iB52DU2pWZm96vLFQZQ== + dependencies: + "@parcel/plugin" "2.12.0" + json5 "^2.2.0" + +"@parcel/transformer-postcss@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-postcss/-/transformer-postcss-2.12.0.tgz#195f4fb86f36f42b5de82076ea36b9d850f4832e" + integrity sha512-FZqn+oUtiLfPOn67EZxPpBkfdFiTnF4iwiXPqvst3XI8H+iC+yNgzmtJkunOOuylpYY6NOU5jT8d7saqWSDv2Q== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/plugin" "2.12.0" + "@parcel/rust" "2.12.0" + "@parcel/utils" "2.12.0" + clone "^2.1.1" + nullthrows "^1.1.1" + postcss-value-parser "^4.2.0" + semver "^7.5.2" + +"@parcel/transformer-posthtml@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-posthtml/-/transformer-posthtml-2.12.0.tgz#a906c26278e03455f6186b7dbd9f5b63eaa26948" + integrity sha512-z6Z7rav/pcaWdeD+2sDUcd0mmNZRUvtHaUGa50Y2mr+poxrKilpsnFMSiWBT+oOqPt7j71jzDvrdnAF4XkCljg== + dependencies: + "@parcel/plugin" "2.12.0" + "@parcel/utils" "2.12.0" + nullthrows "^1.1.1" + posthtml "^0.16.5" + posthtml-parser "^0.10.1" + posthtml-render "^3.0.0" + semver "^7.5.2" + +"@parcel/transformer-raw@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-raw/-/transformer-raw-2.12.0.tgz#1ee7e02214f777cf3a5bf53580ee4dadfaf8a44c" + integrity sha512-Ht1fQvXxix0NncdnmnXZsa6hra20RXYh1VqhBYZLsDfkvGGFnXIgO03Jqn4Z8MkKoa0tiNbDhpKIeTjyclbBxQ== + dependencies: + "@parcel/plugin" "2.12.0" + +"@parcel/transformer-react-refresh-wrap@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.12.0.tgz#cf079353126f2bb820209736a75f868d0df58d92" + integrity sha512-GE8gmP2AZtkpBIV5vSCVhewgOFRhqwdM5Q9jNPOY5PKcM3/Ff0qCqDiTzzGLhk0/VMBrdjssrfZkVx6S/lHdJw== + dependencies: + "@parcel/plugin" "2.12.0" + "@parcel/utils" "2.12.0" + react-refresh "^0.9.0" + +"@parcel/transformer-sass@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-sass/-/transformer-sass-2.12.0.tgz#9132ee78197db04baf51d3024a1bf3c35f1df5ef" + integrity sha512-xLLoSLPST+2AHJwFRLl4foArDjjy6P1RChP3TxMU2MVS1sbKGJnfFhFpHAacH8ASjuGtu5rbpfpHRZePlvoZxw== + dependencies: + "@parcel/plugin" "2.12.0" + "@parcel/source-map" "^2.1.1" + sass "^1.38.0" + +"@parcel/transformer-svg@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-svg/-/transformer-svg-2.12.0.tgz#0281e89bf0f438ec161c19b59a8a8978434a3621" + integrity sha512-cZJqGRJ4JNdYcb+vj94J7PdOuTnwyy45dM9xqbIMH+HSiiIkfrMsdEwYft0GTyFTdsnf+hdHn3tau7Qa5hhX+A== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/plugin" "2.12.0" + "@parcel/rust" "2.12.0" + nullthrows "^1.1.1" + posthtml "^0.16.5" + posthtml-parser "^0.10.1" + posthtml-render "^3.0.0" + semver "^7.5.2" + +"@parcel/types@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/types/-/types-2.12.0.tgz#caf0af00ee0c7228b350eca5f4d3a5b85ce457ad" + integrity sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ== + dependencies: + "@parcel/cache" "2.12.0" + "@parcel/diagnostic" "2.12.0" + "@parcel/fs" "2.12.0" + "@parcel/package-manager" "2.12.0" + "@parcel/source-map" "^2.1.1" + "@parcel/workers" "2.12.0" + utility-types "^3.10.0" + +"@parcel/utils@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/utils/-/utils-2.12.0.tgz#ac900726e7cb12a9e6392081fa05b756183f65fd" + integrity sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g== + dependencies: + "@parcel/codeframe" "2.12.0" + "@parcel/diagnostic" "2.12.0" + "@parcel/logger" "2.12.0" + "@parcel/markdown-ansi" "2.12.0" + "@parcel/rust" "2.12.0" + "@parcel/source-map" "^2.1.1" + chalk "^4.1.0" + nullthrows "^1.1.1" + +"@parcel/watcher-android-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz#c2c19a3c442313ff007d2d7a9c2c1dd3e1c9ca84" + integrity sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg== + +"@parcel/watcher-darwin-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz#c817c7a3b4f3a79c1535bfe54a1c2818d9ffdc34" + integrity sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA== + +"@parcel/watcher-darwin-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz#1a3f69d9323eae4f1c61a5f480a59c478d2cb020" + integrity sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg== + +"@parcel/watcher-freebsd-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz#0d67fef1609f90ba6a8a662bc76a55fc93706fc8" + integrity sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w== + +"@parcel/watcher-linux-arm-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz#ce5b340da5829b8e546bd00f752ae5292e1c702d" + integrity sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA== + +"@parcel/watcher-linux-arm64-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz#6d7c00dde6d40608f9554e73998db11b2b1ff7c7" + integrity sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA== + +"@parcel/watcher-linux-arm64-musl@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz#bd39bc71015f08a4a31a47cd89c236b9d6a7f635" + integrity sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA== + +"@parcel/watcher-linux-x64-glibc@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz#0ce29966b082fb6cdd3de44f2f74057eef2c9e39" + integrity sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg== + +"@parcel/watcher-linux-x64-musl@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz#d2ebbf60e407170bb647cd6e447f4f2bab19ad16" + integrity sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ== + +"@parcel/watcher-win32-arm64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz#eb4deef37e80f0b5e2f215dd6d7a6d40a85f8adc" + integrity sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg== + +"@parcel/watcher-win32-ia32@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz#94fbd4b497be39fd5c8c71ba05436927842c9df7" + integrity sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw== + +"@parcel/watcher-win32-x64@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz#4bf920912f67cae5f2d264f58df81abfea68dadf" + integrity sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A== + +"@parcel/watcher@^2.0.7": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.4.1.tgz#a50275151a1bb110879c6123589dba90c19f1bf8" + integrity sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA== + dependencies: + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.4.1" + "@parcel/watcher-darwin-arm64" "2.4.1" + "@parcel/watcher-darwin-x64" "2.4.1" + "@parcel/watcher-freebsd-x64" "2.4.1" + "@parcel/watcher-linux-arm-glibc" "2.4.1" + "@parcel/watcher-linux-arm64-glibc" "2.4.1" + "@parcel/watcher-linux-arm64-musl" "2.4.1" + "@parcel/watcher-linux-x64-glibc" "2.4.1" + "@parcel/watcher-linux-x64-musl" "2.4.1" + "@parcel/watcher-win32-arm64" "2.4.1" + "@parcel/watcher-win32-ia32" "2.4.1" + "@parcel/watcher-win32-x64" "2.4.1" + +"@parcel/workers@2.12.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@parcel/workers/-/workers-2.12.0.tgz#773182b5006741102de8ae36d18a5a9e3320ebd1" + integrity sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw== + dependencies: + "@parcel/diagnostic" "2.12.0" + "@parcel/logger" "2.12.0" + "@parcel/profiler" "2.12.0" + "@parcel/types" "2.12.0" + "@parcel/utils" "2.12.0" + nullthrows "^1.1.1" + "@pmmmwh/react-refresh-webpack-plugin@0.4.2": version "0.4.2" resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.2.tgz#1f9741e0bde9790a0e13272082ed7272a083620d" @@ -3540,6 +4293,94 @@ "@svgr/plugin-svgo" "^5.4.0" loader-utils "^2.0.0" +"@swc/core-darwin-arm64@1.4.12": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.12.tgz#4aa5080adaeea415dcdb6139415dabe1680933f3" + integrity sha512-BZUUq91LGJsLI2BQrhYL3yARkcdN4TS3YGNS6aRYUtyeWrGCTKHL90erF2BMU2rEwZLLkOC/U899R4o4oiSHfA== + +"@swc/core-darwin-x64@1.4.12": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.4.12.tgz#77a2125679948f320e6038b6d62a477a3fa0e37b" + integrity sha512-Wkk8rq1RwCOgg5ybTlfVtOYXLZATZ+QjgiBNM7pIn03A5/zZicokNTYd8L26/mifly2e74Dz34tlIZBT4aTGDA== + +"@swc/core-linux-arm-gnueabihf@1.4.12": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.12.tgz#f753e321ce75f18d7355f8d96398af2ae45a7528" + integrity sha512-8jb/SN67oTQ5KSThWlKLchhU6xnlAlnmnLCCOKK1xGtFS6vD+By9uL+qeEY2krV98UCRTf68WSmC0SLZhVoz5A== + +"@swc/core-linux-arm64-gnu@1.4.12": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.12.tgz#1c90b90a84036155459752d51291571b06d2d79c" + integrity sha512-DhW47DQEZKCdSq92v5F03rqdpjRXdDMqxfu4uAlZ9Uo1wJEGvY23e1SNmhji2sVHsZbBjSvoXoBLk0v00nSG8w== + +"@swc/core-linux-arm64-musl@1.4.12": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.12.tgz#847cf769ab3ac8fe6cf04d8562f0bfa8f08f7016" + integrity sha512-PR57pT3TssnCRvdsaKNsxZy9N8rFg9AKA1U7W+LxbZ/7Z7PHc5PjxF0GgZpE/aLmU6xOn5VyQTlzjoamVkt05g== + +"@swc/core-linux-x64-gnu@1.4.12": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.12.tgz#cf2f4bd510063829752b61ab718453027f66c0e9" + integrity sha512-HLZIWNHWuFIlH+LEmXr1lBiwGQeCshKOGcqbJyz7xpqTh7m2IPAxPWEhr/qmMTMsjluGxeIsLrcsgreTyXtgNA== + +"@swc/core-linux-x64-musl@1.4.12": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.12.tgz#88ac9534879d4a2dd9daf3c2381dd38f456628b0" + integrity sha512-M5fBAtoOcpz2YQAFtNemrPod5BqmzAJc8pYtT3dVTn1MJllhmLHlphU8BQytvoGr1PHgJL8ZJBlBGdt70LQ7Mw== + +"@swc/core-win32-arm64-msvc@1.4.12": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.12.tgz#6cb733748eaf6e3a11c38c43fa54ee316c779648" + integrity sha512-K8LjjgZ7VQFtM+eXqjfAJ0z+TKVDng3r59QYn7CL6cyxZI2brLU3lNknZcUFSouZD+gsghZI/Zb8tQjVk7aKDQ== + +"@swc/core-win32-ia32-msvc@1.4.12": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.12.tgz#85c86fd2c22e3868a07c7eac165be10abb7ef999" + integrity sha512-hflO5LCxozngoOmiQbDPyvt6ODc5Cu9AwTJP9uH/BSMPdEQ6PCnefuUOJLAKew2q9o+NmDORuJk+vgqQz9Uzpg== + +"@swc/core-win32-x64-msvc@1.4.12": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.12.tgz#50e313d906b8c3d107a7639ea6fbf8156e82c894" + integrity sha512-3A4qMtddBDbtprV5edTB/SgJn9L+X5TL7RGgS3eWtEgn/NG8gA80X/scjf1v2MMeOsrcxiYhnemI2gXCKuQN2g== + +"@swc/core@^1.3.36": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.4.12.tgz#72350b3d44187b33980c159d9481f7e47816386b" + integrity sha512-QljRxTaUajSLB9ui93cZ38/lmThwIw/BPxjn+TphrYN6LPU3vu9/ykjgHtlpmaXDDcngL4K5i396E7iwwEUxYg== + dependencies: + "@swc/counter" "^0.1.2" + "@swc/types" "^0.1.5" + optionalDependencies: + "@swc/core-darwin-arm64" "1.4.12" + "@swc/core-darwin-x64" "1.4.12" + "@swc/core-linux-arm-gnueabihf" "1.4.12" + "@swc/core-linux-arm64-gnu" "1.4.12" + "@swc/core-linux-arm64-musl" "1.4.12" + "@swc/core-linux-x64-gnu" "1.4.12" + "@swc/core-linux-x64-musl" "1.4.12" + "@swc/core-win32-arm64-msvc" "1.4.12" + "@swc/core-win32-ia32-msvc" "1.4.12" + "@swc/core-win32-x64-msvc" "1.4.12" + +"@swc/counter@^0.1.2", "@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/helpers@^0.5.0": + version "0.5.8" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.8.tgz#65d56b1961487fd99795ffd8c68edb7a591571fb" + integrity sha512-lruDGw3pnfM3wmZHeW7JuhkGQaJjPyiKjxeGhdmfoOT53Ic9qb5JLDNaK2HUdl1zLDeX28H221UvKjfdvSLVMg== + dependencies: + tslib "^2.4.0" + +"@swc/types@^0.1.5": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.6.tgz#2f13f748995b247d146de2784d3eb7195410faba" + integrity sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg== + dependencies: + "@swc/counter" "^0.1.3" + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" @@ -3550,6 +4391,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": version "7.1.14" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" @@ -4252,6 +5098,11 @@ abab@^2.0.6: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== +abortcontroller-polyfill@^1.1.9: + version "1.7.5" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" + integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -5009,7 +5860,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base-x@^3.0.2: +base-x@^3.0.2, base-x@^3.0.8: version "3.0.9" resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== @@ -5190,7 +6041,7 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -5310,6 +6161,16 @@ browserslist@^4.20.2: node-releases "^2.0.5" update-browserslist-db "^1.0.0" +browserslist@^4.6.6: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + dependencies: + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" @@ -5519,6 +6380,11 @@ caniuse-lite@^1.0.30001358: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001359.tgz#a1c1cbe1c2da9e689638813618b4219acbd4925e" integrity sha512-Xln/BAsPzEuiVLgJ2/45IaqD9jShtk3Y33anKb4+yLwQzws3+v6odKfpgES/cDEaZMLzSChpIGdbOYtH9MyuHw== +caniuse-lite@^1.0.30001587: + version "1.0.30001606" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e" + integrity sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -5553,7 +6419,7 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.1.2: +chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -5630,7 +6496,7 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -chrome-trace-event@^1.0.2: +chrome-trace-event@^1.0.2, chrome-trace-event@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== @@ -5739,6 +6605,11 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -5859,6 +6730,11 @@ commander@^6.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== +commander@^7.0.0, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.1.0.tgz#db36e3e66edf24ff591d639862c6ab2c52664362" @@ -6121,6 +6997,16 @@ cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" +cosmiconfig@^8.0.0: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -6333,6 +7219,17 @@ css-select@^2.0.0, css-select@^2.0.2: domutils "^1.7.0" nth-check "^1.0.2" +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + css-tree@1.0.0-alpha.37: version "1.0.0-alpha.37" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" @@ -6341,7 +7238,7 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" -css-tree@^1.1.2: +css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== @@ -6354,6 +7251,11 @@ css-what@^3.2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + css@^2.0.0: version "2.2.4" resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" @@ -6447,7 +7349,7 @@ cssnano@^4.1.10: is-resolvable "^1.0.0" postcss "^7.0.0" -csso@^4.0.2: +csso@^4.0.2, csso@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== @@ -6680,6 +7582,16 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + +detect-libc@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -6778,6 +7690,15 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -6793,6 +7714,11 @@ domelementtype@^2.0.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== +domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + domexception@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" @@ -6814,6 +7740,13 @@ domhandler@^2.3.0: dependencies: domelementtype "1" +domhandler@^4.2.0, domhandler@^4.2.2, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + domutils@^1.5.1, domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" @@ -6822,6 +7755,15 @@ domutils@^1.5.1, domutils@^1.7.0: dom-serializer "0" domelementtype "1" +domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + dot-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" @@ -6837,7 +7779,7 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" -dotenv-expand@5.1.0: +dotenv-expand@5.1.0, dotenv-expand@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== @@ -6847,6 +7789,11 @@ dotenv@8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +dotenv@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-7.0.0.tgz#a2be3cd52736673206e8a85fb5210eea29628e7c" + integrity sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g== + duplexer@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -6887,6 +7834,11 @@ electron-to-chromium@^1.4.17: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.44.tgz#8a41923afdd6ef5ddabe001626036ba5d1d64ae6" integrity sha512-tHGWiUUmY7GABK8+DNcr474cnZDTzD8x1736SlDosVH8+/vRJeqfaIBAEHFtMjddz/0T4rKKYsxEc8BwQRdBpw== +electron-to-chromium@^1.4.668: + version "1.4.729" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz#8477d21e2a50993781950885b2731d92ad532c00" + integrity sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA== + elliptic@^6.5.2, elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -6973,6 +7925,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== + entities@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.3.0.tgz#62915f08d67353bb4eb67e3d62641a4059aec656" @@ -8216,6 +9173,11 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-port@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" + integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== + get-stdin@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" @@ -8322,6 +9284,13 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" +globals@^13.2.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + globals@^13.6.0: version "13.9.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.9.0.tgz#4bf2bf635b334a173fb1daf7c5e6b218ecdc06cb" @@ -8640,6 +9609,15 @@ html-webpack-plugin@4.5.0: tapable "^1.1.3" util.promisify "1.0.0" +htmlnano@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-2.1.0.tgz#67b31b3cd3fad23f0b610ca628fdb48382209c3c" + integrity sha512-jVGRE0Ep9byMBKEu0Vxgl8dhXYOUk0iNQ2pjsG+BcRB0u0oDF5A9p/iBGMg/PGKYUyMD0OAGu8dVT5Lzj8S58g== + dependencies: + cosmiconfig "^8.0.0" + posthtml "^0.16.5" + timsort "^0.3.0" + htmlparser2@^3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" @@ -8652,6 +9630,16 @@ htmlparser2@^3.10.1: inherits "^2.0.1" readable-stream "^3.1.1" +htmlparser2@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" + integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.2" + domutils "^2.8.0" + entities "^3.0.1" + http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" @@ -8900,7 +9888,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -9182,6 +10170,11 @@ is-hex-prefixed@1.0.0: resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= +is-json@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-json/-/is-json-2.0.1.tgz#6be166d144828a131d686891b983df62c39491ff" + integrity sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -10413,6 +11406,11 @@ json5@^2.1.2, json5@^2.2.1: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@^2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -10534,11 +11532,91 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lightningcss-darwin-arm64@1.24.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.24.1.tgz#551735defa1e092ecf91244ca081f65f10ebd5f0" + integrity sha512-1jQ12jBy+AE/73uGQWGSafK5GoWgmSiIQOGhSEXiFJSZxzV+OXIx+a9h2EYHxdJfX864M+2TAxWPWb0Vv+8y4w== + +lightningcss-darwin-x64@1.24.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.24.1.tgz#5acb1338ac0aae38e405efd854ed97ba11509eea" + integrity sha512-R4R1d7VVdq2mG4igMU+Di8GPf0b64ZLnYVkubYnGG0Qxq1KaXQtAzcLI43EkpnoWvB/kUg8JKCWH4S13NfiLcQ== + +lightningcss-freebsd-x64@1.24.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.24.1.tgz#ff692c41ed0bbf37ab5a239db4c2fc04c11195e6" + integrity sha512-z6NberUUw5ALES6Ixn2shmjRRrM1cmEn1ZQPiM5IrZ6xHHL5a1lPin9pRv+w6eWfcrEo+qGG6R9XfJrpuY3e4g== + +lightningcss-linux-arm-gnueabihf@1.24.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.24.1.tgz#ba41556f4422a6a889553ad897898a314386153e" + integrity sha512-NLQLnBQW/0sSg74qLNI8F8QKQXkNg4/ukSTa+XhtkO7v3BnK19TS1MfCbDHt+TTdSgNEBv0tubRuapcKho2EWw== + +lightningcss-linux-arm64-gnu@1.24.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.24.1.tgz#6b569b6078634233bc470c4179dd67e535f22d73" + integrity sha512-AQxWU8c9E9JAjAi4Qw9CvX2tDIPjgzCTrZCSXKELfs4mCwzxRkHh2RCxX8sFK19RyJoJAjA/Kw8+LMNRHS5qEg== + +lightningcss-linux-arm64-musl@1.24.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.24.1.tgz#644abd32c09c87228bfb5dda21e8d3f75da6f731" + integrity sha512-JCgH/SrNrhqsguUA0uJUM1PvN5+dVuzPIlXcoWDHSv2OU/BWlj2dUYr3XNzEw748SmNZPfl2NjQrAdzaPOn1lA== + +lightningcss-linux-x64-gnu@1.24.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.24.1.tgz#0633f2daa2b6a2806abd497337346c2941865eec" + integrity sha512-TYdEsC63bHV0h47aNRGN3RiK7aIeco3/keN4NkoSQ5T8xk09KHuBdySltWAvKLgT8JvR+ayzq8ZHnL1wKWY0rw== + +lightningcss-linux-x64-musl@1.24.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.24.1.tgz#6ed1714737e4af2249ed10f431bc8137bd6cc4c7" + integrity sha512-HLfzVik3RToot6pQ2Rgc3JhfZkGi01hFetHt40HrUMoeKitLoqUUT5owM6yTZPTytTUW9ukLBJ1pc3XNMSvlLw== + +lightningcss-win32-x64-msvc@1.24.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.24.1.tgz#bd6b562d902e0f92904ac3754c722d9e63e00480" + integrity sha512-joEupPjYJ7PjZtDsS5lzALtlAudAbgIBMGJPNeFe5HfdmJXFd13ECmEM+5rXNxYVMRHua2w8132R6ab5Z6K9Ow== + +lightningcss@^1.22.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.24.1.tgz#8b86a5ee6e6ae9e035ff92892bd047b8d687581e" + integrity sha512-kUpHOLiH5GB0ERSv4pxqlL0RYKnOXtgGtVe7shDGfhS0AZ4D1ouKFYAcLcZhql8aMspDNzaUCumGHZ78tb2fTg== + dependencies: + detect-libc "^1.0.3" + optionalDependencies: + lightningcss-darwin-arm64 "1.24.1" + lightningcss-darwin-x64 "1.24.1" + lightningcss-freebsd-x64 "1.24.1" + lightningcss-linux-arm-gnueabihf "1.24.1" + lightningcss-linux-arm64-gnu "1.24.1" + lightningcss-linux-arm64-musl "1.24.1" + lightningcss-linux-x64-gnu "1.24.1" + lightningcss-linux-x64-musl "1.24.1" + lightningcss-win32-x64-msvc "1.24.1" + lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= +lmdb@2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/lmdb/-/lmdb-2.8.5.tgz#ce191110c755c0951caa062722e300c703973837" + integrity sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ== + dependencies: + msgpackr "^1.9.5" + node-addon-api "^6.1.0" + node-gyp-build-optional-packages "5.1.1" + ordered-binary "^1.4.1" + weak-lru-cache "^1.2.2" + optionalDependencies: + "@lmdb/lmdb-darwin-arm64" "2.8.5" + "@lmdb/lmdb-darwin-x64" "2.8.5" + "@lmdb/lmdb-linux-arm" "2.8.5" + "@lmdb/lmdb-linux-arm64" "2.8.5" + "@lmdb/lmdb-linux-x64" "2.8.5" + "@lmdb/lmdb-win32-x64" "2.8.5" + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -10854,6 +11932,14 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" +micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -11040,6 +12126,27 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +msgpackr-extract@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz#e05ec1bb4453ddf020551bcd5daaf0092a2c279d" + integrity sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A== + dependencies: + node-gyp-build-optional-packages "5.0.7" + optionalDependencies: + "@msgpackr-extract/msgpackr-extract-darwin-arm64" "3.0.2" + "@msgpackr-extract/msgpackr-extract-darwin-x64" "3.0.2" + "@msgpackr-extract/msgpackr-extract-linux-arm" "3.0.2" + "@msgpackr-extract/msgpackr-extract-linux-arm64" "3.0.2" + "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.2" + "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.2" + +msgpackr@^1.9.5, msgpackr@^1.9.9: + version "1.10.1" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.10.1.tgz#51953bb4ce4f3494f0c4af3f484f01cfbb306555" + integrity sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ== + optionalDependencies: + msgpackr-extract "^3.0.2" + multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" @@ -11136,11 +12243,33 @@ node-addon-api@^2.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== +node-addon-api@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== + +node-addon-api@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.0.tgz#71f609369379c08e251c558527a107107b5e0fdb" + integrity sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g== + node-forge@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== +node-gyp-build-optional-packages@5.0.7: + version "5.0.7" + resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz#5d2632bbde0ab2f6e22f1bbac2199b07244ae0b3" + integrity sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w== + +node-gyp-build-optional-packages@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz#52b143b9dd77b7669073cbfe39e3f4118bfc603c" + integrity sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw== + dependencies: + detect-libc "^2.0.1" + node-gyp-build@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" @@ -11207,6 +12336,11 @@ node-releases@^2.0.1: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + node-releases@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" @@ -11275,6 +12409,18 @@ nth-check@^1.0.2: dependencies: boolbase "~1.0.0" +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" @@ -11509,6 +12655,11 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +ordered-binary@^1.4.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ordered-binary/-/ordered-binary-1.5.1.tgz#94ccbf14181711081ee23931db0dc3f58aaa0df6" + integrity sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A== + original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -11631,6 +12782,26 @@ param-case@^3.0.3: dot-case "^3.0.4" tslib "^2.0.3" +parcel@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/parcel/-/parcel-2.12.0.tgz#60529c268c2ce0754b225af835f1519da1364298" + integrity sha512-W+gxAq7aQ9dJIg/XLKGcRT0cvnStFAQHPaI0pvD0U2l6IVLueUAm3nwN7lkY62zZNmlvNx6jNtE4wlbS+CyqSg== + dependencies: + "@parcel/config-default" "2.12.0" + "@parcel/core" "2.12.0" + "@parcel/diagnostic" "2.12.0" + "@parcel/events" "2.12.0" + "@parcel/fs" "2.12.0" + "@parcel/logger" "2.12.0" + "@parcel/package-manager" "2.12.0" + "@parcel/reporter-cli" "2.12.0" + "@parcel/reporter-dev-server" "2.12.0" + "@parcel/reporter-tracer" "2.12.0" + "@parcel/utils" "2.12.0" + chalk "^4.1.0" + commander "^7.0.0" + get-port "^4.2.0" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -11799,6 +12970,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -12532,6 +13708,11 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== +postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" @@ -12568,6 +13749,35 @@ postcss@^8.1.0: nanoid "^3.1.23" source-map-js "^0.6.2" +posthtml-parser@^0.10.1: + version "0.10.2" + resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.10.2.tgz#df364d7b179f2a6bf0466b56be7b98fd4e97c573" + integrity sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg== + dependencies: + htmlparser2 "^7.1.1" + +posthtml-parser@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.11.0.tgz#25d1c7bf811ea83559bc4c21c189a29747a24b7a" + integrity sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw== + dependencies: + htmlparser2 "^7.1.1" + +posthtml-render@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-3.0.0.tgz#97be44931496f495b4f07b99e903cc70ad6a3205" + integrity sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA== + dependencies: + is-json "^2.0.1" + +posthtml@^0.16.4, posthtml@^0.16.5: + version "0.16.6" + resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.16.6.tgz#e2fc407f67a64d2fa3567afe770409ffdadafe59" + integrity sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ== + dependencies: + posthtml-parser "^0.11.0" + posthtml-render "^3.0.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -12900,7 +14110,7 @@ react-dom@17.0.1: object-assign "^4.1.1" scheduler "^0.20.1" -react-error-overlay@^6.0.9: +react-error-overlay@6.0.9, react-error-overlay@^6.0.9: version "6.0.9" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== @@ -12964,6 +14174,11 @@ react-refresh@^0.8.3: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== +react-refresh@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.9.0.tgz#71863337adc3e5c2f8a6bfddd12ae3bfe32aafbf" + integrity sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ== + react-router-dom@5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.1.2.tgz#06701b834352f44d37fbb6311f870f84c76b9c18" @@ -13130,6 +14345,15 @@ readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^3.5.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -13618,6 +14842,15 @@ sass-loader@8.0.2: schema-utils "^2.6.1" semver "^6.3.0" +sass@^1.38.0: + version "1.74.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.74.1.tgz#686fc227d3707dd25cb2925e1db8e4562be29319" + integrity sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + sass@^1.45.1: version "1.45.1" resolved "https://registry.yarnpkg.com/sass/-/sass-1.45.1.tgz#fa03951f924d1ba5762949567eaf660e608a1ab0" @@ -13734,6 +14967,13 @@ semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: dependencies: lru-cache "^6.0.0" +semver@^7.5.2: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -14119,6 +15359,11 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +srcset@4: + version "4.0.0" + resolved "https://registry.yarnpkg.com/srcset/-/srcset-4.0.0.tgz#336816b665b14cd013ba545b6fe62357f86e65f4" + integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw== + ssri@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" @@ -14183,6 +15428,14 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" +stream-browserify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" @@ -14469,6 +15722,19 @@ svgo@^1.0.0, svgo@^1.2.2: unquote "~1.1.1" util.promisify "~1.0.0" +svgo@^2.4.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -14532,6 +15798,11 @@ tempy@^0.3.0: type-fest "^0.3.1" unique-string "^1.0.0" +term-size@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" + integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== + terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -14763,6 +16034,11 @@ tslib@^2.0.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== +tslib@^2.4.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + tsutils@^3.17.1, tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -14986,6 +16262,14 @@ update-browserslist-db@^1.0.0: escalade "^3.1.1" picocolors "^1.0.0" +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -15087,6 +16371,11 @@ utila@~0.4: resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= +utility-types@^3.10.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.11.0.tgz#607c40edb4f258915e901ea7995607fdf319424c" + integrity sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw== + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -15228,6 +16517,11 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" +weak-lru-cache@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz#fdbb6741f36bae9540d12f480ce8254060dccd19" + integrity sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw== + web3-utils@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.6.0.tgz#1975c5ee5b7db8a0836eb7004848a7cd962d1ddc" From 0e945b450209f3a1541724ac82a0510324ea6d52 Mon Sep 17 00:00:00 2001 From: Luka Jeran Date: Mon, 8 Apr 2024 00:48:48 +0000 Subject: [PATCH 2/9] migrating --- .babelrc | 14 - public/oasis-xu-frame.html | 3 - src/background/messageListener.js | 73 +-- src/background/service/APIService.js | 22 +- src/background/service/ExtDappService.js | 559 ------------------ src/background/service/ExtUtils.js | 224 ------- src/background/storage/storageService.js | 2 +- src/index.js | 20 +- src/mockWebextension.js | 33 ++ src/popup/pages/AboutUs/index.js | 4 - src/popup/pages/AccountInfo/index.js | 7 - src/popup/pages/AccountManage/index.js | 6 - .../pages/ApprovePage/ApproveAccountItem.js | 101 ---- src/popup/pages/ApprovePage/index.js | 264 --------- src/popup/pages/ApprovePage/index.scss | 127 ---- src/popup/pages/Record/index.js | 2 +- src/popup/pages/SignTransaction/index.js | 433 -------------- src/popup/pages/SignTransaction/index.scss | 92 --- src/popup/pages/Wallet/index.js | 123 +--- src/popup/pages/Welcome/index.js | 2 - src/popup/pages/index.js | 20 +- src/popup/router/index.js | 5 - src/reducers/entryRouteReducer.js | 4 - src/utils/commonMsg.js | 50 +- src/utils/extensionizer.d.ts | 3 - src/utils/ledger.js | 2 +- src/utils/popup.js | 189 ------ tsconfig.json | 2 +- 28 files changed, 61 insertions(+), 2325 deletions(-) delete mode 100644 .babelrc delete mode 100644 public/oasis-xu-frame.html delete mode 100644 src/background/service/ExtDappService.js delete mode 100644 src/background/service/ExtUtils.js create mode 100644 src/mockWebextension.js delete mode 100644 src/popup/pages/ApprovePage/ApproveAccountItem.js delete mode 100644 src/popup/pages/ApprovePage/index.js delete mode 100644 src/popup/pages/ApprovePage/index.scss delete mode 100644 src/popup/pages/SignTransaction/index.js delete mode 100644 src/popup/pages/SignTransaction/index.scss delete mode 100644 src/utils/extensionizer.d.ts delete mode 100644 src/utils/popup.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index bb19eca..0000000 --- a/.babelrc +++ /dev/null @@ -1,14 +0,0 @@ -{ - "presets": [ - "@babel/preset-env", - "@babel/preset-react" - ], - "plugins": [ - "@babel/plugin-proposal-class-properties", - ["@babel/plugin-transform-runtime", - { - "regenerator": true - } - ] - ] - } \ No newline at end of file diff --git a/public/oasis-xu-frame.html b/public/oasis-xu-frame.html deleted file mode 100644 index f8641d5..0000000 --- a/public/oasis-xu-frame.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/background/messageListener.js b/src/background/messageListener.js index ac6fa9a..5e9cd98 100644 --- a/src/background/messageListener.js +++ b/src/background/messageListener.js @@ -33,10 +33,8 @@ import { DAPP_CHANGE_CONNECTING_ADDRESS, DAPP_GET_CURRENT_OPEN_WINDOW, GET_APP_LOCK_STATUS, FRAME_GET_APPROVE_ACCOUNT, FRAME_GET_ACCOUNT_PUBLIC_KEY, FRAME_GET_ACCOUNT_SIGNER, FRAME_SEND_TRANSFER, RESET_WALLET, WALLET_SEND_RUNTIME_WITHDRAW, WALLET_SEND_RUNTIME_DEPOSIT, WALLET_SEND_RUNTIME_EVM_WITHDRAW } from "../constant/types"; -import extension from 'extensionizer' +import extension from './../mockWebextension' import apiService from "./service/APIService"; -import extDappService from "./service/ExtDappService"; -import { openPopupWindow } from '../utils/popup'; function internalMessageListener(message, sender, sendResponseSerializable) { const sendResponse = (response) => { @@ -56,10 +54,7 @@ function internalMessageListener(message, sender, sendResponseSerializable) { return sendResponseSerializable(response) } - const { messageSource, action, payload } = message; - if (messageSource) { - return false - } + const { action, payload } = message; switch (action) { case WALLET_CREATE_PWD: sendResponse(apiService.createPwd(payload.pwd)); @@ -189,73 +184,9 @@ function internalMessageListener(message, sender, sendResponseSerializable) { case WALLET_RESET_LAST_ACTIVE_TIME: sendResponse(apiService.setLastActiveTime()) break - case WALLET_OPEN_ROUTE_IN_PERSISTENT_POPUP: - openPopupWindow(extension.extension.getURL(payload.route), 'persistentPopup', undefined, { - left: payload.left, - top: payload.top, - }).then((result) => { - sendResponse(result); - }); - break case GET_APP_LOCK_STATUS: sendResponse(apiService.getLockStatus()) break - case FRAME_GET_APPROVE_ACCOUNT: - extDappService.requestAccounts(payload.origin).then((account) => { - sendResponse(account); - }).catch((err)=>{ - sendResponse(err) - }) - break - - case FRAME_GET_ACCOUNT_PUBLIC_KEY: - extDappService.getApproveAccountPublicKey(payload.origin).then((account) => { - sendResponse(account); - }).catch((err)=>{ - sendResponse(err) - }) - break - - case FRAME_GET_ACCOUNT_SIGNER: - extDappService.getApproveAccountSigner(payload).then((account) => { - sendResponse(account); - }).catch((err)=>sendResponse(err)) - break - case FRAME_SEND_TRANSFER: - extDappService.signTransaction(payload.params,payload.origin).then((account) => { - sendResponse(account); - }).catch((err)=>sendResponse(err)) - break - case GET_SIGN_PARAMS: - sendResponse(extDappService.getSignParams()) - break - case DAPP_GET_APPROVE_ACCOUNT: - extDappService.getCurrentApproveAccount(payload.siteUrl,payload.address).then((account)=>{ - sendResponse(account) - }) - break - case DAPP_GET_ALL_APPROVE_ACCOUNT: - sendResponse(extDappService.getAllApproveAccount(payload.siteUrl)) - break - case DAPP_GET_CONNECT_STATUS: - sendResponse(extDappService.getConnectedStatus(payload.siteUrl,payload.address)) - break - case DAPP_DISCONNECT_SITE: - sendResponse(extDappService.disconnectDapp(payload.siteUrl,payload.address,payload.currentAddress)) - break - - case DAPP_ACCOUNT_CONNECT_SITE: - sendResponse(extDappService.setDAppCurrentConnect(payload.siteUrl,payload.account)) - break - case DAPP_DELETE_ACCOUNT_CONNECT_HIS: - sendResponse(extDappService.deleteDAppConnect(payload.address,payload.currentAddress)) - break - case DAPP_CHANGE_CONNECTING_ADDRESS: - sendResponse(extDappService.changeCurrentConnecting(payload.address)) - break - case DAPP_GET_CURRENT_OPEN_WINDOW: - sendResponse(extDappService.getCurrentOpenWindow()) - break case RESET_WALLET: sendResponse(apiService.resetWallet()) break diff --git a/src/background/service/APIService.js b/src/background/service/APIService.js index bacc205..59e767c 100644 --- a/src/background/service/APIService.js +++ b/src/background/service/APIService.js @@ -3,7 +3,7 @@ import * as oasisRT from '@oasisprotocol/client-rt'; import { decode } from 'base64-arraybuffer'; import BigNumber from 'bignumber.js'; import * as bip39 from 'bip39'; -import extension from 'extensionizer'; +import extension from './../../mockWebextension'; import { Buffer } from 'safe-buffer'; import nacl from 'tweetnacl'; import { cointypes, LOCK_TIME } from '../../../config'; @@ -142,8 +142,8 @@ class APIService { if (!status) { this.memStore.putState(this.initLockedState()) extension.runtime.sendMessage({ - type: FROM_BACK_TO_RECORD, action: SET_LOCK, + type: FROM_BACK_TO_RECORD, }); }else{ this.memStore.updateState({ isUnlocked: status }) @@ -933,18 +933,14 @@ class APIService { ? getExplorerUrl() + "paratimes/transactions/" + encodeURIComponent(hash) + "?runtime=" + encodeURIComponent(runtimeId) : getExplorerUrl() + "transactions/" + encodeURIComponent(hash) - const notificationListener = (clickedNotificationId) => { - if(notificationLinkAsId !== clickedNotificationId) return - extension.notifications.onClicked.removeListener(notificationListener) - openTab(notificationLinkAsId) - } - extension.notifications.onClicked.addListener(notificationListener) - extension.notifications.create(notificationLinkAsId, { - title: getLanguage('notificationTitle'), - message: getLanguage('notificationContent'), - iconUrl: '/img/oasis.png', - type: 'basic' + + Notification.requestPermission().then((permission) => { + if (permission === 'granted') { + const notification = new Notification(getLanguage('notificationTitle'), { body: getLanguage('notificationContent'), icon: '/img/oasis.png' }); + notification.addEventListener('click', () => openTab(notificationLinkAsId)) + } }); + return } checkTxStatus = (hash,hideNotify,callback) => { diff --git a/src/background/service/ExtDappService.js b/src/background/service/ExtDappService.js deleted file mode 100644 index 389b796..0000000 --- a/src/background/service/ExtDappService.js +++ /dev/null @@ -1,559 +0,0 @@ -import extension from 'extensionizer'; -import { ObservableStore } from '@metamask/obs-store'; -import { QUERY_TAB_TYPE } from '../../constant/specifyType'; -import { BACKGROUND_KEYS_CHANGED, DAPP_ACTION_CLOSE_WINDOW, DAPP_ACTION_GET_ACCOUNT, DAPP_ACTION_SEND_TRANSACTION, DAPP_CLOSE_POPUP_WINDOW, FROM_BACK_TO_RECORD } from '../../constant/types'; -import { getActiveTab, sendMsg } from '../../utils/commonMsg'; -import { closePopupWindow, openPopupWindow } from '../../utils/popup'; -import { connectAccountDataFilter, hex2uint, isNumber, methodNeedsAccount, methodNeedsAmount, methodNeedsTo, uint2hex } from '../../utils/utils'; -import { addressValid } from '../../utils/validator'; -import apiService from './APIService'; -let signRequests = []; - -export const windowId = { - approve_page: "approve_page", - request_sign: "request_sign", -} -let badgeList = [] - -const BADGE_ADD = "BADGE_ADD" -const BADGE_MINUS = "BADGE_MINUS" -class ExtDappService { - constructor() { - this.dappStore = new ObservableStore({ - approveList: {}, - currentOpenWindow: /** @type {{url: string, channel: string} | {}} */ ({}) - }) - } - checkWalletStatus() { - return new Promise(async (resolve, reject) => { - let currentAccount = await apiService.getCurrentAccount() - if (currentAccount && currentAccount.localAccount && currentAccount.localAccount.keyringData) { - resolve(true) - } else { - reject({ error: "Please create a wallet first" }) - } - }) - } - - async getFormatPublicKey(key) { - return [key] - } - - async requestAccounts(origin) { - let that = this - return new Promise(async (resolve, reject) => { - try { - let walletStatus = await this.checkWalletStatus().catch(error => error) - if (walletStatus.error) { - reject(walletStatus) - return - } - let account = await this.getCurrentApproveAccount(origin) - if (account) { - resolve(account) - return - } - async function onMessage(message, sender, sendResponse) { - const { action, payload } = message; - switch (action) { - case DAPP_ACTION_GET_ACCOUNT: - if (payload.resultOrigin !== origin) break; - extension.runtime.onMessage.removeListener(onMessage) - await closePopupWindow(windowId.approve_page) - that.setBadgeContent("approve_page", BADGE_MINUS) - if (payload.selectAccount && payload.selectAccount.length > 0) { - let approveList = that.dappStore.getState().approveList - approveList[origin] = [] - let currentAddress = payload.currentAddress - let result = that.setTargetConnect(payload.selectAccount, currentAddress) - if (result.connectStatus) { - approveList[origin] = result.newList - } else { - let newList = result.newList - newList[0].isConnecting = true - approveList[origin] = newList - } - that.dappStore.updateState({ - approveList - }) - let siteApproveAccount = approveList[origin] - siteApproveAccount = siteApproveAccount.filter((item, index) => { - return item.isConnecting - }) - let resultAccount = siteApproveAccount[0] - let res = await that.getFormatPublicKey(resultAccount.publicKey) - resolve(res) - } else { - reject({ error: "User Reject" }) - } - sendResponse() - break; - case DAPP_ACTION_CLOSE_WINDOW: - if (payload.resultOrigin !== origin) break; - extension.runtime.onMessage.removeListener(onMessage) - resolve(payload.account) - await closePopupWindow(payload.page) - that.setBadgeContent("approve_page", BADGE_MINUS) - sendResponse() - break - default: - break; - } - } - extension.runtime.onMessage.addListener(onMessage) - let isUnlocked = await this.getAppLockStatus() - isUnlocked = isUnlocked ? 1 : 0 - let siteUrl = origin - let icon = await this.getWebIcon(origin) - this.popupId = await this.dappOpenPopWindow('./popup.html#/approve_page?isUnlocked=' + encodeURIComponent(isUnlocked) - + "&siteUrl=" + encodeURIComponent(siteUrl) - + "&siteIcon=" + encodeURIComponent(icon), - windowId.approve_page, "dapp") - this.setBadgeContent("approve_page", BADGE_ADD) - } catch (error) { - reject(error) - } - }) - - } - async getWebIcon(origin) { - let tabs = await getActiveTab(QUERY_TAB_TYPE.GET_ACTIVE_TAB_BY_URL, { origin }) - if (tabs.length > 0) { - let tab = tabs[0] - let webIcon = tab?.favIconUrl || "" - return webIcon - } - return "" - - } - async getApproveAccountPublicKey(origin) { - return new Promise(async (resolve, reject) => { - - let account = await this.getCurrentApprovePublicKey(origin) - if (account.error) { - reject(account) - } else { - if (account) { - resolve(account) - return - } else { - reject({ error: "Please connect the account first" }) - } - } - }) - } - - async signTransaction(params, site) { - return new Promise(async (resolve, reject) => { - - let walletStatus = await this.checkWalletStatus().catch(error => error) - if (walletStatus.error) { - reject(walletStatus) - return - } - - let that = this - try { - if (!params.from || !addressValid(params.from)) { - reject({ error: "must have from address" }) - return - } - let approveAccount = await this.getCurrentApproveAccount(site, params.from) - if (!approveAccount) { - reject({ error: "Please connect first" }) - return - } - if (params.recognizedConsensusTransactionMethod) { - /** @param {string} param */ - let presentAndValid = (param) => param.length > 0 && addressValid(param) - if (methodNeedsTo(params.method) && !presentAndValid(params.to)) { - reject({ error: "Please enter a valid wallet address" }) - return - } - if (methodNeedsAccount(params.method) && !presentAndValid(params.account)) { - reject({ error: "Please enter a valid wallet address" }) - return - } - if (methodNeedsAmount(params.method) && !isNumber(params.amount)) { - reject({ error: "Amount error" }) - return - } - } - signRequests.push({ params, site }) - async function onMessage(message, sender, sendResponse) { - const { action, payload } = message; - if (action === DAPP_ACTION_SEND_TRANSACTION) { - if (payload.resultOrigin !== site) return; - extension.runtime.onMessage.removeListener(onMessage) - that.setBadgeContent("request_sign", BADGE_MINUS) - await closePopupWindow(windowId.request_sign) - if (payload.ledgerWallet) { - resolve({ - isConfirmed: payload.isConfirmed, - ...payload - }) - } else { - resolve({ - isConfirmed: payload.isConfirmed - }) - } - sendResponse() - } - } - extension.runtime.onMessage.addListener(onMessage) - let isUnlocked = this.getAppLockStatus() - isUnlocked = isUnlocked ? 1 : 0 - let siteUrl = site - let icon = await this.getWebIcon(site) - - let context = params.context - let message = params.message - let address = params.address - - await this.dappOpenPopWindow('./popup.html#/request_sign?isUnlocked=' + encodeURIComponent(isUnlocked) - + "&siteUrl=" + encodeURIComponent(siteUrl) - + "&context=" + encodeURIComponent(context) + "&message=" + encodeURIComponent(message) + "&address=" + encodeURIComponent(address) - + "&siteIcon=" + encodeURIComponent(icon), - windowId.request_sign, "dapp") - this.setBadgeContent("request_sign", BADGE_ADD) - } catch (error) { - reject(error) - } - }) - } - getSignParams() { - if (signRequests.length > 0) { - return signRequests[signRequests.length - 1]; - } - return null - } - getAllApproveAccount(siteUrl) { - let isUnlocked = this.getAppLockStatus() - if (isUnlocked) { - let approveList = this.getDappStore().approveList - let accountList = approveList[siteUrl] || [] - return accountList - } - return [] - } - getConnectedStatus(siteUrl, address) { - let approveList = this.getDappStore().approveList - let accountList = approveList[siteUrl] || [] - let accountIndex = this.getAccountIndex(accountList, address) - if (accountIndex !== -1) { - return true - } - return false - } - async getApproveAccountSigner(req) { - return new Promise(async (resolve, reject) => { - try { - let signer = await apiService.getCurrentSigner(req.address) - let context = req.context - let message = hex2uint(req.message) - const signature = await signer.sign(context, message); - let signatureHex = uint2hex(signature) - resolve({ signatureHex }) - } catch (error) { - reject(error) - } - }) - - } - async dappOpenPopWindow(url, - channel = "default", - windowType = "") { - let that = this - let popupWindowId = await openPopupWindow(url, channel, windowType, {})//获取到windowId - this.setCurrentOpenWindow(url, channel) - let listener = extension.tabs.onRemoved.addListener(function (tabInfo, changeInfo) { - if (popupWindowId === changeInfo.windowId) { - extension.tabs.onRemoved.removeListener(listener) - extension.runtime.sendMessage({ - type: FROM_BACK_TO_RECORD, - action: DAPP_CLOSE_POPUP_WINDOW, - }); - if (channel === windowId.request_sign) { - signRequests = [] - } - that.setBadgeContent(channel, BADGE_MINUS) - that.clearCurrentOpenWindow() - } - }); - - } - setCurrentOpenWindow(url, channel) { - this.dappStore.updateState({ - currentOpenWindow: { - url, channel - } - }) - } - clearCurrentOpenWindow() { - this.dappStore.updateState({ - currentOpenWindow: {} - }) - } - getCurrentOpenWindow() { - return this.getDappStore().currentOpenWindow - } - setBadgeContent(content, type) { - let contentIndex = badgeList.indexOf(content) - if (type === BADGE_ADD) { - if (contentIndex === -1) { - badgeList.push(content) - } - } else { - if (contentIndex !== -1) { - badgeList.splice(contentIndex, 1) - } - } - if (badgeList.length > 0) { - extension.browserAction.setBadgeText({ text: badgeList.length.toString() }); - extension.browserAction.setBadgeBackgroundColor({ color: [76, 148, 255, 255] }); - } else { - extension.browserAction.setBadgeText({ text: "" }); - extension.browserAction.setBadgeBackgroundColor({ color: [0, 0, 0, 0] }); - } - } - async getCurrentApprovePublicKey(siteUrl) { - let isUnlocked = await this.getAppLockStatus() - if (isUnlocked) { - let approveList = this.getDappStore().approveList - let accountList = approveList[siteUrl] || [] - if (accountList.length === 0) { - return "" - } - accountList = accountList.filter((item) => { - return item.isConnecting - }) - return [accountList[0].publicKey] - } else { - return { error: "Please unlock the wallet first" } - } - } - /** - * get dapp account address - * @param {*} siteUrl - * @returns - */ - async getCurrentApproveAccount(siteUrl, address = "") { - let isUnlocked = await this.getAppLockStatus() - if (isUnlocked) { - let approveList = this.getDappStore().approveList - let accountList = approveList[siteUrl] || [] - if (accountList.length === 0) { - return "" - } - - if (address) { - let addressIndex = this.getAccountIndex(accountList, address) - if (addressIndex !== -1) { - return accountList[addressIndex] - } else { - return "" - } - } else { - accountList = accountList.filter((item) => { - return item.isConnecting - }) - let res = await this.getFormatPublicKey(accountList[0].publicKey) - return res - } - } - return "" - } - getDappStore() { - return this.dappStore.getState() - } - getAppLockStatus() { - return apiService.getLockStatus() - } - /** - * get the account exist in web approve list - * @param {*} address - * @param {*} accountList - * @returns - */ - getAccountIndex(accountList, address) { - let keysList = accountList.map((item, index) => { - return item.address - }) - return keysList.indexOf(address) - } - /** -* set target account to connect -* @param {*} list -* @param {*} address -*/ - setTargetConnect(list, address) { - let newList = [] - let connectStatus = false - let currentAccount = {} - if (list.length > 0 && !!address) { - for (let index = 0; index < list.length; index++) { - let account = list[index]; - if (account.address === address) { - account.isConnecting = true - currentAccount = account - connectStatus = true - } else { - account.isConnecting = false - } - newList.push(connectAccountDataFilter(account)) - } - } - return { newList, connectStatus, currentAccount } - } - /** - * get current web url and disconnect - * @param {*} siteUrl - * @param {*} address - * @returns - */ - disconnectDapp(siteUrl, address, currentAddress) { - let approveList = this.getDappStore().approveList - let accountList = approveList[siteUrl] || [] - let accountIndex = this.getAccountIndex(accountList, address) - if (accountIndex === -1) { - return accountList - } - let activePublicKey = "" - let newList = accountList.filter((item) => { - return item.address !== address - }) - if (newList.length > 0) { - let connectingList = newList.filter((item, index) => { - return item.isConnecting - }) - if (connectingList.length > 0) { - approveList[siteUrl] = newList - } else { - let result = this.setTargetConnect(newList, currentAddress) - if (result.connectStatus) { - activePublicKey = result.currentAccount.publicKey - approveList[siteUrl] = result.newList - } else { - newList[0].isConnecting = true - activePublicKey = newList[0].publicKey - approveList[siteUrl] = newList - } - } - } else { - approveList[siteUrl] = newList - } - this.dappStore.updateState({ - approveList: approveList - }) - this.notifyAccountChange(activePublicKey, "disconnectDapp") - return newList - } - setDAppCurrentConnect(siteUrl, account) { - let approveList = this.getDappStore().approveList - let accountList = approveList[siteUrl] || [] - let connectIndex = this.getAccountIndex(accountList, account.address) - let newAccountList = [] - let activePublicKey = "" - activePublicKey = account.publicKey - for (let index = 0; index < accountList.length; index++) { - let account = accountList[index]; - if (connectIndex !== -1 && connectIndex === index) { - account.isConnecting = true - newAccountList.push(account) - } else { - account.isConnecting = false - newAccountList.push(account) - } - } - if (connectIndex === -1) { - account.isConnected = true - account.isConnecting = true - let newData = connectAccountDataFilter(account) - newAccountList.push(newData) - } - - approveList[siteUrl] = newAccountList - this.dappStore.updateState({ - approveList: approveList - }) - this.notifyAccountChange(activePublicKey, "setDAppCurrentConnect") - return accountList - } - /** - * delete all connect of target address . when delete account - * @param {*} address - */ - deleteDAppConnect(address, currentAddress) { - let approveList = this.getDappStore().approveList - let keysList = Object.keys(approveList) - let activePublicKey = "" - if (keysList.length > 0) { - let newApproveList = {} - for (let index = 0; index < keysList.length; index++) { - const siteUrl = keysList[index]; - let accountList = approveList[siteUrl] - let accountIndex = this.getAccountIndex(accountList, address) - if (accountIndex !== -1) { - let isConnecting = accountList[accountIndex] - accountList.splice(accountIndex, 1) - if (isConnecting && accountList.length > 0) { - let result = this.setTargetConnect(accountList, currentAddress) - if (result.connectStatus) { - accountList = result.newList - activePublicKey = result.currentAccount.publicKey - } else { - accountList = result.newList - accountList[0].isConnecting = true - activePublicKey = accountList[0].publicKey - } - } - } - newApproveList[siteUrl] = accountList - } - this.dappStore.updateState({ - approveList: newApproveList - }) - this.notifyAccountChange(activePublicKey, "deleteDAppConnect") - return newApproveList - } - return null - } - /** - * change current connecting - * @param {*} address - */ - changeCurrentConnecting(address) { - let approveList = this.getDappStore().approveList - let keysList = Object.keys(approveList) - let activePublicKey = "" - for (let index = 0; index < keysList.length; index++) { - const siteUrl = keysList[index]; - let accountList = approveList[siteUrl] - let accountIndex = this.getAccountIndex(accountList, address) - if (accountIndex !== -1) { - if (!accountList[accountIndex].isConnecting) { - accountList = accountList.map((item, index) => { - item.isConnecting = false - return item - }) - accountList[accountIndex].isConnecting = true - activePublicKey = accountList[accountIndex].publicKey - } - approveList[siteUrl] = accountList - } - } - this.dappStore.updateState({ - approveList: approveList - }) - this.notifyAccountChange(activePublicKey, "changeCurrentConnecting") - } - async notifyAccountChange(publicKey) { - sendMsg({ - action: BACKGROUND_KEYS_CHANGED, - payload: { publicKey } - }) - } -} - -const extDappService = new ExtDappService() -export default extDappService diff --git a/src/background/service/ExtUtils.js b/src/background/service/ExtUtils.js deleted file mode 100644 index 73f838b..0000000 --- a/src/background/service/ExtUtils.js +++ /dev/null @@ -1,224 +0,0 @@ -import * as oasis from '@oasisprotocol/client'; -import * as oasisExt from '@oasisprotocol/client-ext-utils'; -import extension from 'extensionizer'; -import { BACKGROUND_KEYS_CHANGED, FRAME_GET_ACCOUNT_SIGNER, FRAME_GET_APPROVE_ACCOUNT, FRAME_SEND_TRANSFER } from '../../constant/types'; -import { sendMsg } from '../../utils/commonMsg'; -import { hex2uint, uint2hex } from '../../utils/utils'; -import { dump } from '../../utils/dump'; - -async function getSigner(req) { - return new Promise((resolve, reject) => { - sendMsg({ - action: FRAME_GET_ACCOUNT_SIGNER, - payload: { - context: req.context, - message: uint2hex(req.message), - address: req.which - } - }, - async (signer) => { - if (signer.signatureHex) { - resolve(hex2uint(signer.signatureHex)) - } else { - reject(signer) - } - }) - }) -} - -async function getFormatPublicKey(publicKey) { - return [ - { - which: oasis.staking.addressToBech32(await oasis.staking.addressFromPublicKey(publicKey)), - metadata: { - public_key: publicKey, - }, - }, - ]; -} -oasisExt.ext.ready({ - async keysList(origin, req) { - return new Promise(async (resolve, reject) => { - sendMsg({ - action: FRAME_GET_APPROVE_ACCOUNT, - payload: { origin } - }, - async (account) => { - if (Array.isArray(account)) { - if (account.length > 0) { - let public_key = account[0] - public_key = hex2uint(public_key) - resolve({ keys: await getFormatPublicKey(public_key) }) - } else { - resolve({ keys: [] }) - } - } else { - // TODO: we should do this elsewhere too, leaving a reason is a lot easier - // to debug than a `null` in the console without any stack trace - reject(new Error('FRAME_GET_APPROVE_ACCOUNT result ' + account + ' not an array')) - } - }) - }) - }, - async contextSignerPublic(origin, req) { - return new Promise(async (resolve, reject) => { - sendMsg({ - action: FRAME_GET_APPROVE_ACCOUNT, - payload: { origin } - }, - (account) => { - if (Array.isArray(account)) { - if (account.length > 0) { - let public_key = account[0] - public_key = hex2uint(public_key) - resolve({ public_key }) - } else { - reject({ error: "invalid account" }) - } - } else { - reject(account) - } - }) - }) - }, - async contextSignerSign(origin, req) { - return new Promise(async (resolve, reject) => { - let signParams = { - chainContext: "", - from: "", - to: "", - amount: "", - nonce: "", - feeAmount: "", - feeGas: "", - method: "", - bodyDump: "", - recognizedContext: false, - recognizedConsensusTransactionMethod: false - } - - try { - signParams.from = req.which - const handled = oasis.signature.visitMessage( - { - withChainContext: - /** @type {oasis.consensus.SignatureMessageHandlersWithChainContext} */ ({ - [oasis.consensus.TRANSACTION_SIGNATURE_CONTEXT]: (chainContext, tx) => { - - signParams.chainContext = chainContext - signParams.nonce = tx.nonce - signParams.feeAmount = oasis.quantity.toBigInt(tx.fee.amount).toString() - signParams.feeGas = tx.fee.gas - signParams.method = tx.method - signParams.bodyDump = dump(tx.body) - - const handled = oasis.consensus.visitTransaction(/** @type {oasis.staking.ConsensusTransactionHandlers} */ ({ - [oasis.staking.METHOD_TRANSFER]: (body) => { - signParams.to = oasis.staking.addressToBech32(body.to) - signParams.amount = oasis.quantity.toBigInt(body.amount).toString() - }, - [oasis.staking.METHOD_ADD_ESCROW]: (body) => { - signParams.to = oasis.staking.addressToBech32(body.account) - signParams.amount = oasis.quantity.toBigInt(body.amount).toString() - }, - [oasis.staking.METHOD_BURN]: (body) => { - signParams.amount = oasis.quantity.toBigInt(body.amount).toString() - }, - [oasis.staking.METHOD_RECLAIM_ESCROW]: (body) => { - signParams.account = oasis.staking.addressToBech32(body.account) - signParams.shares = oasis.quantity.toBigInt(body.shares).toString() - }, - - [oasis.staking.METHOD_AMEND_COMMISSION_SCHEDULE]: (body) => { - signParams.amendment = JSON.stringify(body.amendment) - }, - [oasis.staking.METHOD_ALLOW]: (body) => { - signParams.beneficiary = oasis.staking.addressToBech32(body.beneficiary) - signParams.amountChange = `${body.negative ? '-' : '+'}${oasis.quantity.toBigInt(body.amount_change)} base units` - }, - [oasis.staking.METHOD_WITHDRAW]: (body) => { - signParams.from = oasis.staking.addressToBech32(body.from) - signParams.amount = oasis.quantity.toBigInt(body.amount) - }, - - - }), - tx, - ); - - // 把消息传递到页面 - // 需要的数据有 from to nonce amount - signParams.recognizedConsensusTransactionMethod = handled - }, - }), - }, - req.context, - req.message, - ) - signParams.recognizedContext = handled - } catch (e) { - console.error('parsing signature request:', e) - reject(new Error("couldn't parse")) - } - - sendMsg({ - action: FRAME_SEND_TRANSFER, - payload: { - origin, - params: { - ...signParams, - context: req.context, - message: uint2hex(req.message), - address: req.which - }, - } - }, - async (result) => { - if (result.isConfirmed) { - let signature - if (result.ledgerWallet) { - if (result.ledgerSignatureHex) { - signature = hex2uint(result.ledgerSignatureHex) - resolve({ approved: true, signature }); - } else { - resolve({ approved: false }); - } - } else { - signature = await getSigner(req); - resolve({ approved: true, signature }); - } - } else { - console.error('FRAME_SEND_TRANSFER not confirmed', result); - resolve({ approved: false }); - } - }) - }) - } -}); - -function keyChange(type) { - extension.runtime.onMessage.addListener(async function (message, sender, sendResponse) { - const { action, payload } = message; - switch (action) { - case BACKGROUND_KEYS_CHANGED: - let keys = [] - if (payload.publicKey) { - let public_key = hex2uint(payload.publicKey) - keys = [ - { - which: oasis.staking.addressToBech32(await oasis.staking.addressFromPublicKey(public_key)), - metadata: { - public_key: public_key, - }, - }, - ]; - oasisExt.ext.keysChanged(keys) - } else { - oasisExt.ext.keysChanged(keys) - } - sendResponse() - break; - } - }); -} -keyChange() diff --git a/src/background/storage/storageService.js b/src/background/storage/storageService.js index 2ed4153..ab59f39 100644 --- a/src/background/storage/storageService.js +++ b/src/background/storage/storageService.js @@ -1,4 +1,4 @@ -import extension from 'extensionizer'; +import extension from '../../mockWebextension'; const extensionStorage = extension.storage && extension.storage.local /** diff --git a/src/index.js b/src/index.js index 51f2fbc..686634a 100644 --- a/src/index.js +++ b/src/index.js @@ -1,10 +1,10 @@ +import './background/index' import { configureStore, getDefaultMiddleware } from "@reduxjs/toolkit"; -import extension from 'extensionizer'; +import extension from './mockWebextension'; import React from "react"; import ReactDOM from "react-dom"; import { Provider } from "react-redux"; import { network_config } from "../config"; -import { windowId } from "./background/service/ExtDappService"; import { getLocal, saveLocal } from "./background/storage/localStorage"; import { QUERY_TAB_TYPE } from "./constant/specifyType"; import { NETWORK_CONFIG } from "./constant/storageKey"; @@ -67,21 +67,7 @@ async function getLocalStatus(store) { if (currentAccount && currentAccount.localAccount && currentAccount.localAccount.keyringData) { if (currentAccount.isUnlocked) { store.dispatch(updateCurrentAccount(currentAccount)) - sendMsg({ - action: DAPP_GET_CURRENT_OPEN_WINDOW, - }, - async (window) => { - if(window && window.channel){ - store.dispatch(updateDAppOpenWindow(window)) - if(window.channel === windowId.request_sign){ - store.dispatch(updateEntryWhichRoute(ENTRY_WHICH_ROUTE.DAPP_SIGN_PAGE)) - }else if(window.channel === windowId.approve_page){ - store.dispatch(updateEntryWhichRoute(ENTRY_WHICH_ROUTE.DAPP_APPROVE_PAGE)) - } - }else{ - store.dispatch(updateEntryWhichRoute(ENTRY_WHICH_ROUTE.HOME_PAGE)) - } - }) + store.dispatch(updateEntryWhichRoute(ENTRY_WHICH_ROUTE.HOME_PAGE)) } else { store.dispatch(updateEntryWhichRoute(ENTRY_WHICH_ROUTE.LOCK_PAGE)) } diff --git a/src/mockWebextension.js b/src/mockWebextension.js new file mode 100644 index 0000000..31a529e --- /dev/null +++ b/src/mockWebextension.js @@ -0,0 +1,33 @@ +const extension = { + runtime: { + /** + * @param {{ action: string, payload?: any, type?: any }} message + * @param {(response: any) => void} [callback] + */ + sendMessage(message, callback = () => {}) { + const event = new CustomEvent('extensionMessage', { detail: {message, sendResponse: callback} }); + document.body.dispatchEvent(event); + }, + onMessage: { + /** + * @param {(message: {action: string, payload?: any, type?: any}, sender: undefined, sendResponse: (response?: any) => void) => void} callback + */ + addListener(callback) { + document.body.addEventListener("extensionMessage", (e) => { + callback(e.detail.message, undefined, e.detail.sendResponse) + }, false); + } + } + }, +} + +extension.runtime.onMessage.addListener(function (message, sender, sendResponse) { + if (message.action === 'getAA') { + sendResponse('response ' + message.payload) + } +}) +extension.runtime.sendMessage({ action: 'getAA', payload: 'body' }, (response) => { + console.log(response) // expect 'response body' +}) + +export default extension \ No newline at end of file diff --git a/src/popup/pages/AboutUs/index.js b/src/popup/pages/AboutUs/index.js index 89c272f..77fb02f 100644 --- a/src/popup/pages/AboutUs/index.js +++ b/src/popup/pages/AboutUs/index.js @@ -40,10 +40,6 @@ class AboutUs extends React.Component { ) } - onClick = (url) => { - openTab(url) - } - renderWalletItem = (title, callback) => { return (
{ diff --git a/src/popup/pages/AccountInfo/index.js b/src/popup/pages/AccountInfo/index.js index dfa007e..3bcd948 100644 --- a/src/popup/pages/AccountInfo/index.js +++ b/src/popup/pages/AccountInfo/index.js @@ -222,13 +222,6 @@ class AccountInfo extends React.Component { Toast.info(currentAccount.error) } } else { - sendMsg({ - action: DAPP_DELETE_ACCOUNT_CONNECT_HIS, - payload: { - address: this.state.account.address, - currentAddress: currentAccount.address - } - }, (status) => { }) Toast.info(getLanguage("deleteSuccess")) this.props.updateCurrentAccount(currentAccount) this.props.history.goBack() diff --git a/src/popup/pages/AccountManage/index.js b/src/popup/pages/AccountManage/index.js index 15d9303..5418400 100644 --- a/src/popup/pages/AccountManage/index.js +++ b/src/popup/pages/AccountManage/index.js @@ -102,12 +102,6 @@ class AccountManagePage extends React.Component { evmAccountList:list.evmList, currentAddress: item.address }) - sendMsg({ - action: DAPP_CHANGE_CONNECTING_ADDRESS, - payload: { - address: account.currentAccount.address - } - }, (status) => {}) } }) } diff --git a/src/popup/pages/ApprovePage/ApproveAccountItem.js b/src/popup/pages/ApprovePage/ApproveAccountItem.js deleted file mode 100644 index c5a2b99..0000000 --- a/src/popup/pages/ApprovePage/ApproveAccountItem.js +++ /dev/null @@ -1,101 +0,0 @@ -import React, { Component } from "react"; -import { connect } from "react-redux"; -import select_no from "../../../assets/images/select_no.svg"; -import select_on from "../../../assets/images/select_on.svg"; -import { getBalance } from "../../../background/api"; -import { updateLedgerBalanceList } from "../../../reducers/cache"; -import { addressSlice } from "../../../utils/utils"; -import AccountIcon from "../../component/AccountIcon"; -import "./index.scss"; - -class ApproveAccountItem extends Component { - constructor(props) { - super(props); - this.state = { - balance: "0" - }; - this.isUnMounted = false; - } - componentDidMount() { - const { account } = this.props - this.fetchBalance(account.address) - } - componentWillUnmount() { - this.isUnMounted = true; - } - callSetState = (data, callback) => { - if (!this.isUnMounted) { - this.setState({ - ...data - }, () => { - callback && callback() - }) - } - } - componentWillReceiveProps(nextProps) { - if (nextProps.account.address !== this.props.account.address) { - this.fetchBalance(nextProps.account.address) - } - } - fetchBalance = (address) => { - getBalance(address).then((account) => { - if (account && account.address) { - this.callSetState({ - balance: account.total - }) - this.props.updateLedgerBalanceList({ - address: account.address, - ...account - }) - } - }) - } - - renderMyIcon = (account) => { - let address = account.evmAddress ||account.address - if (!address) { - return (
) - } - return ; - }; - render() { - const { account, onClickAccount, symbol, listLength, index } = this.props - let imgUrl = account.isConnected ? select_on : select_no - let showDivided = listLength - 1 !== index - return ( -
-
{ - onClickAccount && onClickAccount(account) - }} - className={"approve-item-container click-cursor"}> -
- {this.renderMyIcon(account)} -
-
-

{account.accountName}

-

{" ( " + addressSlice(account.address, 5) + " )"}

-
-

{this.state.balance} {symbol}

-
-
- -
- {showDivided &&
} -
- ) - } -} - -const mapStateToProps = (state) => ({ -}); - -function mapDispatchToProps(dispatch) { - return { - updateLedgerBalanceList: (account) => { - dispatch(updateLedgerBalanceList(account)) - } - }; -} - -export default connect(mapStateToProps, mapDispatchToProps)(ApproveAccountItem); diff --git a/src/popup/pages/ApprovePage/index.js b/src/popup/pages/ApprovePage/index.js deleted file mode 100644 index 5af1cd1..0000000 --- a/src/popup/pages/ApprovePage/index.js +++ /dev/null @@ -1,264 +0,0 @@ -import React from "react"; -import { connect } from "react-redux"; -import dapp_default_icon from "../../../assets/images/dapp_default_icon.svg"; -import { getBalance } from "../../../background/api"; -import { DAPP_ACTION_CLOSE_WINDOW, DAPP_ACTION_GET_ACCOUNT, DAPP_GET_APPROVE_ACCOUNT, WALLET_GET_ALL_ACCOUNT } from "../../../constant/types"; -import { getLanguage } from "../../../i18n"; -import { updateAccountList, updateNetAccount } from "../../../reducers/accountReducer"; -import { updateDAppOpenWindow, updateDappSelectList } from "../../../reducers/cache"; -import { ENTRY_WHICH_ROUTE, updateEntryWhichRoute } from "../../../reducers/entryRouteReducer"; -import { sendMsg } from "../../../utils/commonMsg"; -import { getQueryStringArgs } from "../../../utils/utils"; -import Button from "../../component/Button"; -import Toast from "../../component/Toast"; -import LockPage from '../Lock'; -import ApproveAccountItem from "./ApproveAccountItem"; -import "./index.scss"; - -class ApprovePage extends React.Component { - constructor(props) { - super(props); - this.state = { - lockStatus: false, - }; - this.firstRequest = true - this.isUnMounted = false; - this.webIconRef = React.createRef(); - } - componentWillUnmount() { - this.isUnMounted = true; - } - componentDidMount() { - let params = this.getParams() - if (params.isUnlocked == '1' ) { - this.getAccountData() - } - } - - getAccountData=()=>{ - sendMsg({ - action: WALLET_GET_ALL_ACCOUNT, - payload:true - }, (account) => { - let dappAccountLis = account.accounts.commonList - let list = dappAccountLis.map((item)=>{ - if(item.address === account.currentAddress){ - item.isConnected = true - } - return item - }) - this.props.updateDappSelectList(list) - }) - } - callSetState = (data, callback) => { - if (!this.isUnMounted) { - this.setState({ - ...data - }, () => { - callback && callback() - }) - } - } - fetchData = (address) => { - getBalance(address).then((account) => { - if (account.error) { - Toast.info(getLanguage('nodeError')) - } else if (account && account.address) { - this.firstRequest = false - this.props.updateNetAccount(account) - } - }) - } - componentWillReceiveProps(nextProps) { - if (nextProps.currentAccount.address && this.firstRequest) { - this.fetchData(nextProps.currentAccount.address) - } - } - renderTip = () => { - return

{this.state.content}

; - }; - getSelectDAppAccount = () => { - const { dappAccountList } = this.props - let selectList = [] - for (let index = 0; index < dappAccountList.length; index++) { - const dappAccount = dappAccountList[index]; - if (dappAccount.isConnected) { - selectList.push(dappAccount) - } - } - return selectList - } - - renderActionBtn = () => { - let { currentAccount } = this.props; - return ( -
-
- ); - }; - goToHome=()=>{ - let url = this.props.dappWindow?.url - if(url){ - this.props.updateEntryWhichRoute(ENTRY_WHICH_ROUTE.HOME_PAGE) - } - this.props.updateDAppOpenWindow({}) - } - onClickUnLock = async () => { - let params = this.getParams() - let siteUrl = params.siteUrl || "" - sendMsg({ - action: DAPP_GET_APPROVE_ACCOUNT, - payload: { siteUrl: siteUrl } - }, async (approveAccount) => { - if (approveAccount && approveAccount.length>0) { - sendMsg({ - action: DAPP_ACTION_CLOSE_WINDOW, - payload: { - page: "approve_page", - account: approveAccount, - resultOrigin: this.getParams().siteUrl, - }, - }, (params) => { }) - } else { - this.getAccountData() - this.callSetState({ - lockStatus: true - }) - } - }) - } - onClickRow = (account) => { - const { dappAccountList } = this.props - let newList = [] - for (let index = 0; index < dappAccountList.length; index++) { - let dappAccount = { ...dappAccountList[index] }; - if (account.address === dappAccount.address) { - dappAccount.isConnected = !account.isConnected - } - newList.push(dappAccount) - } - this.props.updateDappSelectList(newList) - } - renderAccountView = () => { - let currentSymbol = this.props.netConfig.currentSymbol; - const { ledgerBalanceList, dappAccountList } = this.props - let listLength = dappAccountList.length - return ( -
- {dappAccountList.map((item, index) => { - return ( - - ) - })} -
) - } - getParams=()=>{ - let url = this.props.dappWindow?.url || window.location?.href || "" - return getQueryStringArgs(url) - } - render() { - let params = this.getParams() - if (params.isUnlocked == '0' && !this.state.lockStatus) { - return ; - } - let webIcon = params.siteIcon - return ( -
-
- { - if (this.webIconRef.current) { - this.webIconRef.current.src = dapp_default_icon - } - }} - /> -

{params.siteUrl}

-

{getLanguage('walletConnect')}

-
- {this.renderAccountView()} - - {this.renderActionBtn()} -
- ); - } -} - -const mapStateToProps = (state) => ({ - currentAccount: state.accountInfo.currentAccount, - liquid_balance: state.accountInfo.liquid_balance, - netConfig: state.network, - accountBalanceList: state.cache.accountBalanceList, - ledgerBalanceList: state.cache.ledgerBalanceList, - dappAccountList: state.cache.dappAccountList, - dappWindow: state.cache.dappWindow, -}); - -function mapDispatchToProps(dispatch) { - return { - updateNetAccount: (netAccount) => { - dispatch(updateNetAccount(netAccount)) - }, - updateAccountList: (list) => { - dispatch(updateAccountList(list)) - }, - updateDappSelectList: (list) => { - dispatch(updateDappSelectList(list)) - }, - updateDAppOpenWindow: (window) => { - dispatch(updateDAppOpenWindow(window)) - }, - updateEntryWhichRoute: (route) => { - dispatch(updateEntryWhichRoute(route)) - }, - - }; -} - -export default connect(mapStateToProps, mapDispatchToProps)(ApprovePage); diff --git a/src/popup/pages/ApprovePage/index.scss b/src/popup/pages/ApprovePage/index.scss deleted file mode 100644 index dcfe752..0000000 --- a/src/popup/pages/ApprovePage/index.scss +++ /dev/null @@ -1,127 +0,0 @@ -@import "../../common.scss"; - -.approve-page-container { - width: 100%; - min-height: 100vh; - padding: 60px 13px 0px; - position: relative; - flex-direction: column; - background: #F3F6FF; - - .approve-page-icon-con { - width: 100%; - display: flex; - align-items: center; - justify-content: center; - - flex-direction: column; - } - .approve-page-icon { - width: 70px; - height: 70px; - } - .approve-page-url { - font-size: $font-size-title-small; - font-weight: 500; - color: #243f5f; - line-height: 24px; - margin-top: 20px; - word-break: break-all; - padding: 0px 20px; - } - .approve-page-title { - font-size: $font-size-title-big; - font-weight: 500; - color: #243f5f; - line-height: 34px; - margin-top: 10px; - } - .approve-row-con { - display: flex; - flex-direction: row; - align-items: center; - width: 100%; - margin-top: 20px; - } - .approve-row-right-con { - margin-left: 10px; - width: 100%; - padding: 2px 0px; - } - .approve-row-right-top { - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; - } - .option-img { - width: 16px; - } - .account-row-margin { - margin-bottom: 4px; - } - .approve-button-container { - display: flex; - flex-direction: row; - justify-content: space-between; - - position: absolute; - bottom: 30px; - margin: auto; - padding: 13px 40px; - width: 100%; - left: 0; - right: 0; - text-align: center; - } - .approve-page-item-container{ - background-color: white; - border-radius: 7px; - display: flex; - flex-direction: column; - margin-top: 17px; - height: 260px; - overflow-y: scroll; - padding-bottom: 0px; - } -} - -.approve-item-container{ - display: flex; - align-items: center; - justify-content: space-between; - padding: 8px 10px; - - .approve-item-left{ - display: flex; - align-items: center; - } - .approve-item-left-con{ - margin-left: 10px; - } - .approve-item-left-top-con{ - display: flex; - align-items: center; - } - .approve-item-account-name{ - font-size: $font-size-content; - font-weight: 500; - color: #333333; - line-height: 20px; - } - .approve-item-account-address{ - font-size: $font-size-content; - color: #999999; - line-height: 20px; - white-space: pre-wrap - } - .approve-item-account-balance{ - font-size: $font-size-desc; - color: #666666; - line-height: 16px; - white-space: pre-wrap - } - .option-img { - width: 16px; - } -} diff --git a/src/popup/pages/Record/index.js b/src/popup/pages/Record/index.js index f798eec..9a0a903 100644 --- a/src/popup/pages/Record/index.js +++ b/src/popup/pages/Record/index.js @@ -1,6 +1,5 @@ import BigNumber from "bignumber.js"; import cx from "classnames"; -import extension from 'extensionizer'; import React from "react"; import { connect } from "react-redux"; import { cointypes } from '../../../../config'; @@ -18,6 +17,7 @@ import CustomView from "../../component/CustomView"; import Toast from "../../component/Toast"; import "./index.scss"; import Loading from "../../component/Loading"; +import extension from "src/mockWebextension"; const DECIMALS = cointypes.decimals class Record extends React.Component { diff --git a/src/popup/pages/SignTransaction/index.js b/src/popup/pages/SignTransaction/index.js deleted file mode 100644 index 680d075..0000000 --- a/src/popup/pages/SignTransaction/index.js +++ /dev/null @@ -1,433 +0,0 @@ -import * as oasis from '@oasisprotocol/client'; -import BigNumber from "bignumber.js"; -import React from "react"; -import { connect } from "react-redux"; -import { KNOWN_NETWORK_CONTEXTS } from '../../../../config'; -import dapp_default_icon from "../../../assets/images/dapp_default_icon.svg"; -import { getLedgerSigner } from "../../../background/api/txHelper"; -import { DAPP_ACTION_SEND_TRANSACTION, DAPP_GET_APPROVE_ACCOUNT, GET_SIGN_PARAMS } from "../../../constant/types"; -import { ACCOUNT_TYPE } from "../../../constant/walletType"; -import { getLanguage } from "../../../i18n"; -import { updateNetAccount, updateRpcNonce } from "../../../reducers/accountReducer"; -import { updateDAppOpenWindow } from "../../../reducers/cache"; -import { ENTRY_WHICH_ROUTE, updateEntryWhichRoute } from "../../../reducers/entryRouteReducer"; -import { sendMsg } from "../../../utils/commonMsg"; -import { checkLedgerConnect } from "../../../utils/ledger"; -import { dump } from "../../../utils/dump"; -import { addressSlice, amountDecimals, getQueryStringArgs, hex2uint, isNumber, methodNeedsAmount, methodNeedsTo, trimSpace, uint2hex } from "../../../utils/utils"; -import { addressValid } from "../../../utils/validator"; -import AccountIcon from "../../component/AccountIcon"; -import Button from "../../component/Button"; -import Loading from "../../component/Loading"; -import Toast from "../../component/Toast"; -import LockPage from '../Lock'; -import "./index.scss"; - -const STAKE_MIN_AMOUNT = 100 -class SignTransaction extends React.Component { - constructor(props) { - super(props); - this.state = { - loading: false, - site: {}, - params: {}, - currentAccount: {}, - lockStatus: false, - sendAction: "" - } - this.isUnMounted = false; - this.webIconRef = React.createRef(); - } - componentWillUnmount() { - this.isUnMounted = true; - } - callSetState = (data, callback) => { - if (!this.isUnMounted) { - this.setState({ - ...data - }, () => { - callback && callback() - }) - } - } - - componentDidMount() { - sendMsg({ - action: GET_SIGN_PARAMS - }, (res) => { - this.callSetState({ - sendAction: res.params.method - }) - sendMsg({ - action: DAPP_GET_APPROVE_ACCOUNT, - payload: { - siteUrl: res.site, - address: res.params.from - } - }, (account) => { - this.callSetState({ - site: res.site, - params: res.params, - currentAccount: account - }) - }) - }) - } - - - onConfirm = async () => { - let { params, currentAccount } = this.state - if (currentAccount.type === ACCOUNT_TYPE.WALLET_OBSERVE) { - Toast.info(getLanguage('observeAccountTip')) - return - } - if (params.recognizedConsensusTransactionMethod) { - if (methodNeedsTo(params.method)) { - let toAddress = trimSpace(params.to) - if (!addressValid(toAddress)) { - Toast.info(getLanguage('sendAddressError')) - return - } - } - if (methodNeedsAmount(params.method)) { - let amount = trimSpace(params.amount) - if (!isNumber(amount) || !new BigNumber(amount).gt(0)) { - Toast.info(getLanguage('amountError')) - return - } - - if (this.state.sendAction === oasis.staking.METHOD_ADD_ESCROW) { - if (!isNumber(amount) || (parseInt(amount) < STAKE_MIN_AMOUNT)) { - Toast.info(getLanguage('minStakeAmount') + " " + STAKE_MIN_AMOUNT) - return - } - } - } - } - this.clickNextStep() - - } - - clickNextStep = async () => { - let { currentAccount } = this.state - Loading.show() - if (currentAccount.type === ACCOUNT_TYPE.WALLET_LEDGER) { - try { - let app = await checkLedgerConnect() - let signer = await getLedgerSigner(currentAccount.ledgerHdIndex) - let winParams = this.getParams() - - let context = winParams.context - let message = hex2uint(winParams.message) - let address = winParams.address - const signature = await signer.sign(context, message); - let signatureHex = uint2hex(signature) - Loading.hide() - - sendMsg({ - action: DAPP_ACTION_SEND_TRANSACTION, - payload: { - isConfirmed: true, - ledgerSignatureHex: signatureHex, - ledgerWallet: true, - resultOrigin: winParams.siteUrl, - }, - }, async (params) => { - this.goToHome() - }) - } catch (error) { - Loading.hide() - sendMsg({ - action: DAPP_ACTION_SEND_TRANSACTION, - payload: { - isConfirmed: true, - ledgerWallet: true, - ledgerError: error, - resultOrigin: this.getParams().siteUrl, - }, - }, async (params) => { - this.goToHome() - }) - } - } else { - sendMsg({ - action: DAPP_ACTION_SEND_TRANSACTION, - payload: { - isConfirmed: true, - resultOrigin: this.getParams().siteUrl, - }, - }, async (params) => { - Loading.hide() - this.goToHome() - }) - } - } - goToHome = () => { - let url = this.props.dappWindow?.url - if (url) { - this.props.updateEntryWhichRoute(ENTRY_WHICH_ROUTE.HOME_PAGE) - } - this.props.updateDAppOpenWindow({}) - } - renderActionBtn = () => { - return ( -
-
- ); - }; - - onClickUnLock = () => { - this.callSetState({ - lockStatus: true - }) - } - renderMyIcon = () => { - let { currentAccount } = this.state; - let address = currentAccount.evmAddress ||currentAccount.address - if (!address) { - return (
) - } - return ; - }; - renderAccountInfo = () => { - let showAddress = addressSlice(this.state.currentAccount.address, 6) - return ( -
-
- {this.renderMyIcon()} -

{showAddress}

-
-
- ) - } - renderWebInfo = (winParams) => { - let webIcon = winParams.siteIcon - return ( -
- { - if (this.webIconRef.current) { - this.webIconRef.current.src = dapp_default_icon - } - }} - /> -

{winParams.siteUrl}

-
- ) - } - renderSendItem = (item, index) => { - return ( -
-

{item.title}

-

{item.content}

-
- ) - } - chainLabel = (chainContext) => { - if (KNOWN_NETWORK_CONTEXTS.hasOwnProperty(chainContext)) { - return KNOWN_NETWORK_CONTEXTS[chainContext] - } - return getLanguage('unknownChain') - } - renderSendContent = () => { - let { params } = this.state - let txNonce = params.nonce - let currentSymbol = this.props.netConfig.currentSymbol; - let toTitle = this.state.sendAction === oasis.staking.METHOD_ADD_ESCROW ? getLanguage('stakeNodeName') : getLanguage('toAddress') - let itemList = [] - if (params.recognizedContext) { - itemList.push( - { - title: getLanguage('chainLabel'), - content: this.chainLabel(params.chainContext), - }, - { - title: getLanguage('chainContext'), - content: params.chainContext, - } - ) - } else { - itemList.push( - { - title: getLanguage('txType'), - content: getLanguage('unknownType') - }, - { - title: getLanguage('unknownSignatureContext'), - content: params.context - } - ) - if (params.message) { - const messageU8 = oasis.misc.fromHex(params.message) - let parseOk = false - let messageParsed = null - try { - messageParsed = oasis.misc.fromCBOR(messageU8) - parseOk = true - } catch (e) { - console.error('parsing message as CBOR', e) - } - if (parseOk) { - itemList.push( - { - title: getLanguage('unknownSignatureMessageDump'), - content: dump(messageParsed) - } - ) - } else { - itemList.push( - { - title: getLanguage('unknownSignatureMessageHex'), - content: params.message - } - ) - } - } else { - itemList.push( - { - title: getLanguage('unknownSignatureMessageDump'), - content: '' - } - ) - } - } - if (params.recognizedConsensusTransactionMethod) { - itemList.push( - { - title: getLanguage('txType'), - content: params.method - }, - { - title: toTitle, - content: params.to - } - ) - } - if (params.recognizedContext) { - itemList.push({ - title: "Nonce", - content: txNonce - }) - } - if (params.recognizedConsensusTransactionMethod) { - if (isNumber(params.amount)) { - let amountShow = amountDecimals(params.amount) - itemList.push({ - title: getLanguage('amount'), - content: amountShow + " " + currentSymbol - }) - } else { - itemList.push({ - title: "Shares", - content: params.shares - }) - } - } else if (params.recognizedContext) { - itemList.push( - { - title: getLanguage('unknownConsensusTransactionMethod'), - content: params.method - }, - { - title: getLanguage('unknownConsensusTransactionBodyDump'), - content: params.bodyDump - } - ) - } - if (params.amendment) { - itemList.push({ - title: getLanguage('amendment'), - content: params.amendment - }) - } - if (params.beneficiary) { - itemList.push({ - title: getLanguage("beneficiary"), - content: params.beneficiary - }) - } - if (params.amountChange) { - let amountChange = amountDecimals(params.amountChange) - itemList.push({ - title: getLanguage("amountChange"), - content: amountChange - }) - } - return ( -
- {itemList.map((item, index) => { - return this.renderSendItem(item, index) - })} -
) - } - getParams = () => { - let url = this.props.dappWindow?.url || window.location?.href || "" - return getQueryStringArgs(url) - } - render() { - let winParams = this.getParams() - if (winParams.isUnlocked == '0' && !this.state.lockStatus) { - return ; - } - if (this.state.loading) { - return null - } - return ( -
- {this.renderAccountInfo()} - {this.renderWebInfo(winParams)} - {this.renderSendContent()} - {this.renderActionBtn()} -
) - - } -} - -const mapStateToProps = (state) => ({ - accountInfo: state.accountInfo, - netConfig: state.network, - dappWindow: state.cache.dappWindow, -}); - -function mapDispatchToProps(dispatch) { - return { - updateRpcNonce: (nonce) => { - dispatch(updateRpcNonce(nonce)) - }, - updateNetAccount: (netAccount) => { - dispatch(updateNetAccount(netAccount)) - }, - updateDAppOpenWindow: (window) => { - dispatch(updateDAppOpenWindow(window)) - }, - updateEntryWhichRoute: (route) => { - dispatch(updateEntryWhichRoute(route)) - }, - }; -} - -export default connect(mapStateToProps, mapDispatchToProps)(SignTransaction); diff --git a/src/popup/pages/SignTransaction/index.scss b/src/popup/pages/SignTransaction/index.scss deleted file mode 100644 index daee0d2..0000000 --- a/src/popup/pages/SignTransaction/index.scss +++ /dev/null @@ -1,92 +0,0 @@ -@import "../../common.scss"; - -.sign-page-container { - width: 100%; - height: 100%; - position: relative; - flex-direction: column; - - .sign-page-top-con { - background: #f3f6ff; - display: flex; - flex-direction: row; - align-items: center; - padding: 10px; - justify-content: space-between; - } - .sign-page-top-left { - display: flex; - flex-direction: row; - align-items: center; - } - .sign-page-icon-top{ - text-align: center; - } - .sign-page-top-address { - font-size: $font-size-content; - color: #7080b5; - line-height: 21px; - margin-left: 4px; - margin-bottom: 4px; - } - .sign-button-container { - display: flex; - flex-direction: row; - justify-content: space-between; - - position: absolute; - bottom: 30px; - margin: auto; - padding: 13px 40px; - width: 100%; - left: 0; - right: 0; - text-align: center; - } - .sign-page-icon-con { - width: 100%; - margin-top: 30px; - display: flex; - align-items: center; - justify-content: center; - - flex-direction: column; - } - .sign-page-icon { - width: 70px; - height: 70px; - } - .sign-page-url { - font-size: $font-size-title-small; - font-weight: 500; - color: #243f5f; - line-height: 24px; - margin-top: 20px; - word-break: break-all; - padding: 0px 20px; - } - .sign-detail-item { - display: flex; - justify-content: space-between; - margin: 10px 20px; - } - .sign-detail-title { - margin: 0; - width: 80px; - - font-size: $font-size-content; - color: #7080b5; - line-height: 20px; - text-align: left; - } - .sign-detail-content { - margin: 0; - word-break: break-all; - text-align: right; - margin-left: 20px; - - font-size: $font-size-content; - color: #2c3451; - line-height: 20px; - } -} diff --git a/src/popup/pages/Wallet/index.js b/src/popup/pages/Wallet/index.js index 8a17a84..0a6e0f2 100644 --- a/src/popup/pages/Wallet/index.js +++ b/src/popup/pages/Wallet/index.js @@ -65,45 +65,6 @@ class Wallet extends React.Component { if(!currentAccount.evmAddress){ this.fetchData(address, true) } - this.getDappConnect() - } - getDappConnect() { - let { currentAccount, currentActiveTabUrl } = this.props - let address = currentAccount.address - sendMsg({ - action: DAPP_GET_ALL_APPROVE_ACCOUNT, - payload: { - siteUrl: currentActiveTabUrl, - } - }, (accountList) => { - this.dappConnectCount = accountList.length - if (accountList.length === 0) { - this.props.updateDappConnectList([]) - } else { - let newAccountList = this.dappAccountSort(accountList, address) - let keysList = newAccountList.map((item, index) => { - return item.address - }) - if (keysList.indexOf(address) !== -1) { - this.props.updateDappConnectList(newAccountList) - } else { - let current = connectAccountDataFilter(currentAccount) - this.props.updateDappConnectList([ - current, - ...newAccountList - ]) - } - } - }) - } - - dappAccountSort = (list, address) => { - list.map((item, index) => { - if (item.address === address) { - list.unshift(list.splice(index, 1)[0]); - } - }) - return list } fetchData = async (address, firstRequest = false) => { @@ -177,41 +138,6 @@ class Wallet extends React.Component {

) } - renderAccountConnectStatus = (account) => { - let { currentAccount } = this.props - let address = currentAccount.address - let currentDappConnect = getLanguage('changeToAccount') - if (account.type === ACCOUNT_TYPE.WALLET_OBSERVE) { - currentDappConnect = getLanguage('observeAccount') - return ( -
-

{currentDappConnect}

-
- ) - } - if (account.address === address) { - if (account.isConnected) { - currentDappConnect = getLanguage("currentAccount") - return ( -

{currentDappConnect}

- ) - } else { - currentDappConnect = getLanguage('dappDisconnect') - return ( -
-

{currentDappConnect}

-
- ) - } - } else { - return ( -
this.onClickChangeAccount(account)}> -

{currentDappConnect}

-
- ) - } - - } /** * change current account * @param {*} account @@ -223,50 +149,10 @@ class Wallet extends React.Component { }, (account) => { if (account.accountList && account.accountList.length > 0) { this.props.updateCurrentAccount(account.currentAccount) - sendMsg({ - action: DAPP_CHANGE_CONNECTING_ADDRESS, - payload: { - address: account.currentAccount.address - } - }, (status) => { - this.getDappConnect() - }) - } }) } - /** - * change account connect status - * @param {*} account - */ - onClickConnect = (account) => { - let { currentAccount, currentActiveTabUrl } = this.props - if (account.isConnected) { - let address = account.address - sendMsg({ - action: DAPP_DISCONNECT_SITE, - payload: { - siteUrl: currentActiveTabUrl, - address, - currentAddress: currentAccount.address - } - }, (status) => { - this.getDappConnect() - Toast.info(getLanguage('disconnectSuccess')) - }) - } else { - sendMsg({ - action: DAPP_ACCOUNT_CONNECT_SITE, - payload: { - siteUrl: currentActiveTabUrl, - account - } - }, (status) => { - this.getDappConnect() - Toast.info(getLanguage('connectSuccess')) - }) - } - } + renderDAppAccount = (account, index) => { let accountName = account.accountName let address = addressSlice(account.address, 6) @@ -280,15 +166,8 @@ class Wallet extends React.Component {

{accountName}

{showAddress}

- {showDApp &&
-

DApp

-
}
- {!isWatchAccount &&
this.onClickConnect(account)}> -

{statusText}

-
}
- {this.renderAccountConnectStatus(account)}
) } diff --git a/src/popup/pages/Welcome/index.js b/src/popup/pages/Welcome/index.js index 4475801..e76b5ef 100644 --- a/src/popup/pages/Welcome/index.js +++ b/src/popup/pages/Welcome/index.js @@ -12,7 +12,6 @@ import { } from "../../../i18n"; import { setLanguage, hideNewExtensionWarning } from "../../../reducers/appReducer"; import { setWelcomeNextRoute } from "../../../reducers/cache"; -import { openCurrentRouteInPersistentPopup } from '../../../utils/popup'; import Button from "../../component/Button"; import Select from "../../component/Select"; import { NewExtensionWarning } from "../../component/NewExtensionWarning" @@ -28,7 +27,6 @@ class Welcome extends React.Component { } componentDidMount() { - openCurrentRouteInPersistentPopup(); this.initLocal() } componentWillUnmount() { diff --git a/src/popup/pages/index.js b/src/popup/pages/index.js index 724a6d5..c7b283a 100644 --- a/src/popup/pages/index.js +++ b/src/popup/pages/index.js @@ -1,7 +1,6 @@ -import extension from 'extensionizer'; import React from 'react'; import { connect } from 'react-redux'; -import { DAPP_CLOSE_POPUP_WINDOW, FROM_BACK_TO_RECORD, SET_LOCK } from '../../constant/types'; +import { FROM_BACK_TO_RECORD, SET_LOCK } from '../../constant/types'; import { languageInit } from '../../i18n'; import { setLanguage } from '../../reducers/appReducer'; import { ENTRY_WHICH_ROUTE, updateEntryWhichRoute } from '../../reducers/entryRouteReducer'; @@ -9,8 +8,7 @@ import { updateNetConfigList } from '../../reducers/network'; import LockPage from './Lock'; import HomePage from './Main'; import Welcome from './Welcome'; -import ApprovePage from './ApprovePage'; -import SignTransaction from './SignTransaction'; +import extension from 'src/mockWebextension'; class MainRouter extends React.Component { @@ -31,16 +29,6 @@ class MainRouter extends React.Component { }); sendResponse(); break; - case DAPP_CLOSE_POPUP_WINDOW: - if(this.props.entryWhichRoute === ENTRY_WHICH_ROUTE.DAPP_APPROVE_PAGE - || this.props.entryWhichRoute === ENTRY_WHICH_ROUTE.DAPP_SIGN_PAGE){ - this.props.updateEntryWhichRoute(ENTRY_WHICH_ROUTE.HOME_PAGE) - this.props.history.push({ - pathname: "/", - }); - sendResponse(); - } - break; default: break; } @@ -56,10 +44,6 @@ class MainRouter extends React.Component { return ; case ENTRY_WHICH_ROUTE.LOCK_PAGE: return ; - case ENTRY_WHICH_ROUTE.DAPP_APPROVE_PAGE: - return ; - case ENTRY_WHICH_ROUTE.DAPP_SIGN_PAGE: - return ; default: return <> } diff --git a/src/popup/router/index.js b/src/popup/router/index.js index e8b5b1e..f4337f7 100644 --- a/src/popup/router/index.js +++ b/src/popup/router/index.js @@ -34,11 +34,9 @@ import AddressBook from "../pages/AddressBook" import LedgerConnect from '../pages/LedgerConnect'; import LedgerImport from '../pages/LedgerImport'; import NetInfoPage from '../pages/NetInfoPage'; -import SignTransaction from "../pages/SignTransaction"; import LedgerAddresses from '../pages/LedgerAddresses'; -import ApprovePage from '../pages/ApprovePage'; export function getAllRouter() { return ( @@ -84,9 +82,6 @@ export function getAllRouter() { - - - diff --git a/src/reducers/entryRouteReducer.js b/src/reducers/entryRouteReducer.js index 6630453..d71000f 100644 --- a/src/reducers/entryRouteReducer.js +++ b/src/reducers/entryRouteReducer.js @@ -6,10 +6,6 @@ export const ENTRY_WHICH_ROUTE = { WELCOME: 'ENTRY_WHICH_ROUTE_WELCOME', LOCK_PAGE: 'ENTRY_WHICH_LOCK_PAGE', UPDATE_ENTRY_WHICH_ROUTE: "UPDATE_ENTRY_WHICH_ROUTE", - - - DAPP_APPROVE_PAGE: 'DAPP_APPROVE_PAGE', - DAPP_SIGN_PAGE: 'DAPP_SIGN_PAGE', }; diff --git a/src/utils/commonMsg.js b/src/utils/commonMsg.js index c765182..1853b4a 100644 --- a/src/utils/commonMsg.js +++ b/src/utils/commonMsg.js @@ -1,4 +1,4 @@ -import extension from 'extensionizer' +import extension from 'src/mockWebextension'; import { QUERY_TAB_TYPE } from '../constant/specifyType'; /** * Encapsulation class for sending messages @@ -6,15 +6,10 @@ import { QUERY_TAB_TYPE } from '../constant/specifyType'; * @param {*} sendResponse */ export function sendMsg(message, sendResponse) { - const { messageSource, action, payload } = message - extension.runtime.sendMessage( - { - messageSource, action, payload - }, - async (params) => { - sendResponse && sendResponse(params) - } - ); + const { action, payload } = message + extension.runtime.sendMessage({ action, payload }, async (params) => { + sendResponse && sendResponse(params) + }); } @@ -23,9 +18,7 @@ export function sendMsg(message, sendResponse) { * @param {*} url */ export function openTab(url) { - extension.tabs.create({ - url: url, - }); + open(url, '_blank') } @@ -37,35 +30,6 @@ export function openTab(url) { export function getActiveTab(type, params) { return new Promise((resolve, reject) => { - // 1. 获取当前活跃tab URL 直接调用 - // 2. 获取所以tab - // 3,根据windowId 查询tab - let queryParams - switch (type) { - case QUERY_TAB_TYPE.GET_CURRENT_ACTIVE_TAB: - queryParams = { - active: true, - currentWindow: true - } - break; - case QUERY_TAB_TYPE.GET_ACTIVE_TAB_BY_URL: - queryParams = { - active: true, - url: params?.origin ? params.origin + "/*" : undefined, - } - break - case QUERY_TAB_TYPE.GET_TAB_BY_WINDOW_ID: - queryParams = { - windowId: params.windowId - } - break - default: - break; - } - extension.tabs.query({ - ...queryParams - }, function (tabs) { - resolve(tabs) - }) + resolve([]) }) } diff --git a/src/utils/extensionizer.d.ts b/src/utils/extensionizer.d.ts deleted file mode 100644 index fe5b289..0000000 --- a/src/utils/extensionizer.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare module 'extensionizer' { - export default chrome -} diff --git a/src/utils/ledger.js b/src/utils/ledger.js index 160235f..4e94cbb 100644 --- a/src/utils/ledger.js +++ b/src/utils/ledger.js @@ -1,6 +1,5 @@ import Transport from "@ledgerhq/hw-transport-webusb"; import OasisApp from '@oasisprotocol/ledger'; -import extension from 'extensionizer'; import { LEDGER_CONNECTED_SUCCESSFULLY } from "../constant/types"; import { getLanguage } from "../i18n"; @@ -8,6 +7,7 @@ import Loading from "../popup/component/Loading"; import Toast from "../popup/component/Toast"; import { publicKeyToAddress, uint2hex } from "./utils"; import { openTab } from './commonMsg'; +import extension from "src/mockWebextension"; function initLedgerWindowListener() { return new Promise((resolve) => { diff --git a/src/utils/popup.js b/src/utils/popup.js deleted file mode 100644 index e879006..0000000 --- a/src/utils/popup.js +++ /dev/null @@ -1,189 +0,0 @@ -import extension from 'extensionizer' -import { QUERY_TAB_TYPE } from '../constant/specifyType'; -import { sendMsg, getActiveTab } from './commonMsg'; -import { WALLET_OPEN_ROUTE_IN_PERSISTENT_POPUP } from "../constant/types"; - -const PopupSize = { - width: 450, - height: 600, -}; - -const lastWindowIds = {}; - -function checkForError() { - const { lastError } = extension.runtime; - if (!lastError) { - return undefined; - } - // if it quacks like an Error, its an Error - if (lastError.stack && lastError.message) { - return lastError; - } - // repair incomplete error object (eg chromium v77) - return new Error(lastError.message); -} - - -function getLastFocusedWindow() { - return new Promise((resolve, reject) => { - extension.windows.getLastFocused((windowObject) => { - const error = checkForError(); - if (error) { - return reject(error); - } - return resolve(windowObject); - }); - }); -} -export async function getDappWindowPosition(){ - let left = 0; - let top = 0; - try { - const lastFocused = await getLastFocusedWindow(); - // Position window in top right corner of lastFocused window. - top = lastFocused.top; - left = lastFocused.left + (lastFocused.width - PopupSize.width); - } catch (_) { - // The following properties are more than likely 0, due to being - // opened from the background chrome process for the extension that - // has no physical dimensions - const { screenX, screenY, outerWidth } = window; - top = Math.max(screenY, 0); - left = Math.max(screenX + (outerWidth - PopupSize.width), 0); - } - return { - top,left - } -} - -async function getCurrentTab(windowId){ - return new Promise(async (resolve)=>{ - let tabs = await getActiveTab(QUERY_TAB_TYPE.GET_TAB_BY_WINDOW_ID,{windowId}) - resolve(tabs) - }) -} -/** - * Try open window if no previous window exists. - * If, previous window exists, try to change the location of this window. - * Finally, try to recover focusing for opened window. - * @param url - */ -export async function openPopupWindow( - url, - channel = "default", - windowType= "", - options = {} -) { - if(windowType === "dapp"){ - let dappOption = await getDappWindowPosition() - options = { - ...options, - ...dappOption - } - } - let option = Object.assign({ - width: PopupSize.width, - height: PopupSize.height, - url: url, - type: /** @type {const} */ ("popup"), - }, options); - - if (option.left && option.width && option.left + option.width > screen.width) { - option.left = screen.width - option.width - } - if (option.top && option.height && option.top + option.height > screen.height) { - option.top = screen.height - option.height - } - - if (lastWindowIds[channel] !== undefined) { - try { - const window = await getCurrentTab(lastWindowIds[channel]) - if (window?.length) { - const tab = window[0]; - if (tab?.id) { - await extension.tabs.update(tab.id, { active: true, url }); - } else { - throw new Error("Null window or tabs"); - } - } else { - throw new Error("Null window or tabs"); - } - } catch { - const createdWindow = await new Promise(resolve => { - extension.windows.create(option, function (windowData) { - resolve(windowData) - }) - }) - lastWindowIds[channel] = createdWindow?.id; - } - } else { - const createdWindow = await new Promise(resolve => { - extension.windows.create(option, function (windowData) { - resolve(windowData) - }) - }) - lastWindowIds[channel] = createdWindow?.id; - } - - if (lastWindowIds[channel]) { - try { - await extension.windows.update(lastWindowIds[channel], { - focused: true, - }); - } catch (e) { - } - } - return lastWindowIds[channel]; -} - -export function closePopupWindow(channel) { - (async () => { - const windowId = lastWindowIds[channel]; - if (windowId) { - await extension.windows.remove(windowId); - } - })(); -} - -/** - * window.open() has many options for sizing, but they require different ways to do this per web . - * So, to avoid this problem, just manually set sizing if new window popup is opened. - */ -export function fitPopupWindow() { - const gap = { - width: window.outerWidth - window.innerWidth, - height: window.outerHeight - window.innerHeight, - }; - - window.resizeTo(PopupSize.width + gap.width, PopupSize.height + gap.height); -} - -// Opens current page in a popup window, so that it doesn't close when switching -// to other windows (e.g. password manager). -export function openCurrentRouteInPersistentPopup() { - const url = new URL(window.location.href); - if (!url.searchParams.has('persistentPopup')) { - url.searchParams.set('persistentPopup', '1'); - - // Added random number because images were disappearing after - // opening Welcome page popup twice, after window.close(). - url.searchParams.set('fixImagesDisappearing', '' + Math.random()); - - // Add slight delay so `window.screenLeft` returns popup's position, not extension's icon position - setTimeout(() => { - // Call openPopupWindow through background script, so lastWindowIds isn't - // lost, and popup is reused if called multiple times. - sendMsg({ - action: WALLET_OPEN_ROUTE_IN_PERSISTENT_POPUP, - payload: { - left: window.screenLeft, - top: window.screenTop, - route: url.pathname + url.search + url.hash, - }, - }, () => {}); - window.close(); - }, 100) - } else { - fitPopupWindow(); - } -} diff --git a/tsconfig.json b/tsconfig.json index 9aacfa4..38f4c83 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,7 +13,7 @@ "moduleResolution": "node", "sourceMap": false, "strict": true, - "noImplicitAny": false, + "noImplicitAny": true, "module": "es2020", "target": "es2020" } From e91171d803ab47dc5197f51efd8f9a26e084f71a Mon Sep 17 00:00:00 2001 From: Luka Jeran Date: Mon, 8 Apr 2024 01:53:41 +0000 Subject: [PATCH 3/9] storage --- src/background/storage/storageService.js | 34 +++++------------------- src/popup/pages/Lock/index.js | 2 -- 2 files changed, 7 insertions(+), 29 deletions(-) diff --git a/src/background/storage/storageService.js b/src/background/storage/storageService.js index ab59f39..2accae5 100644 --- a/src/background/storage/storageService.js +++ b/src/background/storage/storageService.js @@ -1,17 +1,13 @@ import extension from '../../mockWebextension'; -const extensionStorage = extension.storage && extension.storage.local /** * Stored in local storage * @param {{keyringData: EncryptedData}} value */ export function save(value) { - return extensionStorage.set(value, () => { - let error = extension.runtime.lastError - if (error) { - throw error; - } - }); + Object.entries(value).forEach(([k, v]) => { + localStorage.setItem(k, JSON.stringify(v)) + }) } @@ -22,14 +18,10 @@ export function save(value) { */ export function get(key) { return new Promise((resolve, reject) => { - extensionStorage.get(key, items => { - let error = extension.runtime.lastError - if (error) { - reject(error); - } + resolve({ // @ts-expect-error Forcefully extending encrypted string type - resolve(items); - }); + [key]: JSON.parse(localStorage.getItem(key)) + }) }); } @@ -38,17 +30,5 @@ export function get(key) { * @param {'keyringData'} key */ export function removeValue(key) { - return extensionStorage.remove(key, () => { - let error = extension.runtime.lastError - if (error) { - throw error; - } - }); -} - -/** - * Remove all storage - */ -export function clearStorage() { - extensionStorage.clear(); + return window.localStorage.removeItem(key); } diff --git a/src/popup/pages/Lock/index.js b/src/popup/pages/Lock/index.js index 06e50f3..5591257 100644 --- a/src/popup/pages/Lock/index.js +++ b/src/popup/pages/Lock/index.js @@ -4,7 +4,6 @@ import { connect } from "react-redux"; import logo from "../../../assets/images/Rose Wallet Logo Blue cropped.svg"; import txFailed from "../../../assets/images/txFailed.png"; import { clearLocalExcept, getLocal } from "../../../background/storage/localStorage"; -import { clearStorage } from "../../../background/storage/storageService"; import { NETWORK_CONFIG } from "../../../constant/storageKey"; import { RESET_WALLET, WALLET_APP_SUBMIT_PWD } from "../../../constant/types"; import { getLanguage } from "../../../i18n"; @@ -186,7 +185,6 @@ class LockPage extends React.Component { action: RESET_WALLET, }, () => { //1, delete extension storage - clearStorage() //2, delete local storage except net-config clearLocalExcept(NETWORK_CONFIG) //3, clear all redux From 368be6cf0081c23509d6b547aab60dd908d64c84 Mon Sep 17 00:00:00 2001 From: Luka Jeran Date: Mon, 8 Apr 2024 01:53:46 +0000 Subject: [PATCH 4/9] width --- src/popup/App.scss | 5 +++++ src/popup/component/Tabs/index.scss | 1 + src/popup/pages/AccountManage/index.scss | 1 + 3 files changed, 7 insertions(+) diff --git a/src/popup/App.scss b/src/popup/App.scss index 966dace..ddce6f5 100644 --- a/src/popup/App.scss +++ b/src/popup/App.scss @@ -15,9 +15,14 @@ flex-direction: column; min-width: $app-width; min-height: $app-height; + max-width: $app-width; + max-height: $app-height; } body { margin: 0; + font-family: Ubuntu, Arial, sans-serif; + max-width: $app-width; + max-height: $app-height; } p { margin: 0; diff --git a/src/popup/component/Tabs/index.scss b/src/popup/component/Tabs/index.scss index a73c333..1b9c25b 100644 --- a/src/popup/component/Tabs/index.scss +++ b/src/popup/component/Tabs/index.scss @@ -1,6 +1,7 @@ @import "../../common.scss"; .tab_title_wrap { width: 100%; + max-width: $app-width; display: flex; position: fixed; bottom: 0%; diff --git a/src/popup/pages/AccountManage/index.scss b/src/popup/pages/AccountManage/index.scss index 0194b98..e9a2aa3 100644 --- a/src/popup/pages/AccountManage/index.scss +++ b/src/popup/pages/AccountManage/index.scss @@ -79,6 +79,7 @@ position: fixed; bottom: 0px; width: 100%; + max-width: $app-width; justify-content: space-between; padding: 15px 15px; background-color: #f3f6ff; From 22e4d712a203ac1b936b6fb0208991e69577e0d8 Mon Sep 17 00:00:00 2001 From: Luka Jeran Date: Mon, 8 Apr 2024 02:07:14 +0000 Subject: [PATCH 5/9] todo --- src/background/service/APIService.js | 1 + src/index.js | 1 + src/utils/ledger.js | 1 + 3 files changed, 3 insertions(+) diff --git a/src/background/service/APIService.js b/src/background/service/APIService.js index 59e767c..3cca18b 100644 --- a/src/background/service/APIService.js +++ b/src/background/service/APIService.js @@ -938,6 +938,7 @@ class APIService { if (permission === 'granted') { const notification = new Notification(getLanguage('notificationTitle'), { body: getLanguage('notificationContent'), icon: '/img/oasis.png' }); notification.addEventListener('click', () => openTab(notificationLinkAsId)) + //test } }); diff --git a/src/index.js b/src/index.js index 686634a..a345849 100644 --- a/src/index.js +++ b/src/index.js @@ -91,6 +91,7 @@ async function appOpenListener(store){ export const applicationEntry = { async run() { + // window.history.pushState(null, '', '#/') this.createReduxStore(); this.appInit(this.reduxStore) this.render(); diff --git a/src/utils/ledger.js b/src/utils/ledger.js index 4e94cbb..f9805e9 100644 --- a/src/utils/ledger.js +++ b/src/utils/ledger.js @@ -29,6 +29,7 @@ async function openLedgerWindow() { // Mentioned in https://bugs.chromium.org/p/chromium/issues/detail?id=1415183#c14 // Maybe related to https://bugs.chromium.org/p/chromium/issues/detail?id=1360960 openTab('./popup.html#/ledger_connect') + // test await initLedgerWindowListener() Toast.info(getLanguage('ledgerConnectSuccess')) return { connected: true } From 0c26759d55f067aee16d8ad96234e64df8fd2e2e Mon Sep 17 00:00:00 2001 From: Luka Jeran Date: Mon, 8 Apr 2024 02:14:10 +0000 Subject: [PATCH 6/9] redirect home unless ledger --- src/index.js | 4 +++- src/utils/ledger.js | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/index.js b/src/index.js index a345849..c607a88 100644 --- a/src/index.js +++ b/src/index.js @@ -91,7 +91,9 @@ async function appOpenListener(store){ export const applicationEntry = { async run() { - // window.history.pushState(null, '', '#/') + if (window.location.hash !== '#/ledger_connect') { + window.history.pushState(null, '', '#/') + } this.createReduxStore(); this.appInit(this.reduxStore) this.render(); diff --git a/src/utils/ledger.js b/src/utils/ledger.js index f9805e9..4e94cbb 100644 --- a/src/utils/ledger.js +++ b/src/utils/ledger.js @@ -29,7 +29,6 @@ async function openLedgerWindow() { // Mentioned in https://bugs.chromium.org/p/chromium/issues/detail?id=1415183#c14 // Maybe related to https://bugs.chromium.org/p/chromium/issues/detail?id=1360960 openTab('./popup.html#/ledger_connect') - // test await initLedgerWindowListener() Toast.info(getLanguage('ledgerConnectSuccess')) return { connected: true } From ff89d2d069baff7e45fcd3a33f5b002f78ae1bf6 Mon Sep 17 00:00:00 2001 From: Luka Jeran Date: Mon, 8 Apr 2024 02:38:23 +0000 Subject: [PATCH 7/9] Fix notifications --- src/background/service/APIService.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/background/service/APIService.js b/src/background/service/APIService.js index 3cca18b..3987f7e 100644 --- a/src/background/service/APIService.js +++ b/src/background/service/APIService.js @@ -938,13 +938,13 @@ class APIService { if (permission === 'granted') { const notification = new Notification(getLanguage('notificationTitle'), { body: getLanguage('notificationContent'), icon: '/img/oasis.png' }); notification.addEventListener('click', () => openTab(notificationLinkAsId)) - //test } }); return } checkTxStatus = (hash,hideNotify,callback) => { + Notification.requestPermission().then((permission) => {}) this.fetchTransactionStatus(hash,hideNotify,callback) } onSuccess=(data,hash,hideNotify,callback)=>{ @@ -985,6 +985,7 @@ class APIService { }) } createNotificationAfterRuntimeTxSucceeds = (hash,runtimeId) => { + Notification.requestPermission().then((permission) => {}) this.fetchRuntimeTxStatus(hash,runtimeId) } fetchRuntimeTxStatus = (hash,runtimeId) => { From f24245581a8ab83e986c86f20a4a71bf5b286b70 Mon Sep 17 00:00:00 2001 From: Luka Jeran Date: Mon, 8 Apr 2024 02:38:39 +0000 Subject: [PATCH 8/9] hide new extension warning --- src/reducers/appReducer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reducers/appReducer.js b/src/reducers/appReducer.js index ea21aaf..0b23063 100644 --- a/src/reducers/appReducer.js +++ b/src/reducers/appReducer.js @@ -21,7 +21,7 @@ export function hideNewExtensionWarning() { } function shouldShowNewExtensionWarning() { - const dismissed = getLocal(DISMISSED_NEW_EXTENSION_WARNING); + const dismissed = true; if (!dismissed || !NEW_EXTENSION_RELEASE_DATE) { return !dismissed; } From c22ffb2f3344cbcf69b4740be1db70e559168f1c Mon Sep 17 00:00:00 2001 From: Luka Jeran Date: Mon, 8 Apr 2024 02:48:04 +0000 Subject: [PATCH 9/9] build --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 93dc06f..f9e37b0 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "version": "1.15.0", "private": true, "scripts": { - "build": "env NODE_OPTIONS=--openssl-legacy-provider webpack --mode production", - "buildProd": "env NODE_OPTIONS=--openssl-legacy-provider webpack --mode production", + "build": "yarn parcel build ./public/static/popup.html", + "buildProd": "yarn build", "dev": "yarn parcel ./public/static/popup.html", "lint": "yarn run eslint src", "test": "jest"