From e951fe6a64b2180c4d14815854b3c25761cfdf70 Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Mon, 25 Oct 2021 13:56:26 -0600 Subject: [PATCH 01/97] Improve autorebuilding in dev to reduce CPU load (#11886) On an M1 Mac, when running `yarn start`, CPU can spike to 100% CPU, and sometimes a bunch of `mdworker` instances will get spawned. This seems to be caused by the file-watching mechanism used in dev to automatically regenerate the build when something is changed. More specifically, we are using an older version of `watchify`, which uses an older version of `chokidar`, which is the package that actually does the watching. v4.0.0 of `watchify` upgrades `chokidar` to v3.x ([1]), which comes with "massive CPU & RAM consumption improvements" ([2]). After the upgrade, CPU usage decreases to 20-40%. [1]: https://github.com/browserify/watchify/blob/master/CHANGELOG.md#400 [2]: https://github.com/paulmillr/chokidar/releases/tag/3.0.0 --- lavamoat/browserify/policy.json | 34 ++- lavamoat/node/policy.json | 205 +++++++++++++++++- package.json | 2 +- ...hify+3.11.1.patch => watchify+4.0.0.patch} | 4 +- yarn.lock | 170 +++++++++++++-- 5 files changed, 394 insertions(+), 21 deletions(-) rename patches/{watchify+3.11.1.patch => watchify+4.0.0.patch} (96%) diff --git a/lavamoat/browserify/policy.json b/lavamoat/browserify/policy.json index 766fae5a4..b920f9059 100644 --- a/lavamoat/browserify/policy.json +++ b/lavamoat/browserify/policy.json @@ -626,6 +626,7 @@ "globals": { "AbortController": true, "__REDUX_DEVTOOLS_EXTENSION_COMPOSE__": true, + "__REDUX_DEVTOOLS_EXTENSION__": true, "console.error": true, "console.info": true, "console.warn": true @@ -865,9 +866,11 @@ "URLSearchParams": true, "XMLHttpRequest": true, "btoa": true, + "console.warn": true, "document": true, "location.href": true, - "navigator": true + "navigator": true, + "setTimeout": true }, "packages": { "process": true @@ -3796,6 +3799,18 @@ "scheduler": true } }, + "react-easy-swipe": { + "globals": { + "addEventListener": true, + "define": true, + "document.addEventListener": true, + "document.removeEventListener": true + }, + "packages": { + "prop-types": true, + "react": true + } + }, "react-fast-compare": { "globals": { "Element": true, @@ -3862,6 +3877,22 @@ "redux": true } }, + "react-responsive-carousel": { + "globals": { + "HTMLElement": true, + "clearTimeout": true, + "console.warn": true, + "document": true, + "getComputedStyle": true, + "setTimeout": true + }, + "packages": { + "classnames": true, + "react": true, + "react-dom": true, + "react-easy-swipe": true + } + }, "react-router": { "packages": { "history": true, @@ -3980,6 +4011,7 @@ "console": true }, "packages": { + "@babel/runtime": true, "symbol-observable": true } }, diff --git a/lavamoat/node/policy.json b/lavamoat/node/policy.json index 8399643d6..601d1e488 100644 --- a/lavamoat/node/policy.json +++ b/lavamoat/node/policy.json @@ -1012,6 +1012,16 @@ "buffer-equal": true } }, + "are-we-there-yet": { + "builtin": { + "events.EventEmitter": true, + "util.inherits": true + }, + "packages": { + "delegates": true, + "readable-stream": true + } + }, "arr-diff": { "packages": { "arr-flatten": true, @@ -1345,6 +1355,7 @@ "builtin": { "events.EventEmitter": true, "fs": true, + "os.type": true, "path.basename": true, "path.dirname": true, "path.extname": true, @@ -1371,6 +1382,7 @@ "anymatch": true, "async-each": true, "braces": true, + "fsevents": true, "glob-parent": true, "inherits": true, "is-binary-path": true, @@ -1632,6 +1644,16 @@ "through2": true } }, + "detect-libc": { + "builtin": { + "child_process.spawnSync": true, + "fs.readdirSync": true, + "os.platform": true + }, + "globals": { + "process.env": true + } + }, "detective": { "packages": { "acorn-node": true, @@ -2168,6 +2190,45 @@ "process.version": true } }, + "fsevents": { + "builtin": { + "events.EventEmitter": true, + "fs.stat": true, + "path.join": true, + "util.inherits": true + }, + "globals": { + "__dirname": true, + "process.nextTick": true, + "process.platform": true, + "setImmediate": true + }, + "native": true, + "packages": { + "node-pre-gyp": true + } + }, + "gauge": { + "builtin": { + "util.format": true + }, + "globals": { + "clearInterval": true, + "process": true, + "setImmediate": true, + "setInterval": true + }, + "packages": { + "aproba": true, + "console-control-strings": true, + "has-unicode": true, + "object-assign": true, + "signal-exit": true, + "string-width": true, + "strip-ansi": true, + "wide-align": true + } + }, "get-assigned-identifiers": { "builtin": { "assert.equal": true @@ -2529,6 +2590,16 @@ "process.argv": true } }, + "has-unicode": { + "builtin": { + "os.type": true + }, + "globals": { + "process.env.LANG": true, + "process.env.LC_ALL": true, + "process.env.LC_CTYPE": true + } + }, "has-value": { "packages": { "get-value": true, @@ -2682,6 +2753,11 @@ "is-plain-object": true } }, + "is-fullwidth-code-point": { + "packages": { + "number-is-nan": true + } + }, "is-glob": { "packages": { "is-extglob": true @@ -3159,6 +3235,56 @@ "setTimeout": true } }, + "node-pre-gyp": { + "builtin": { + "events.EventEmitter": true, + "fs.existsSync": true, + "fs.readFileSync": true, + "fs.renameSync": true, + "path.dirname": true, + "path.existsSync": true, + "path.join": true, + "path.resolve": true, + "url.parse": true, + "url.resolve": true, + "util.inherits": true + }, + "globals": { + "__dirname": true, + "console.log": true, + "process.arch": true, + "process.cwd": true, + "process.env": true, + "process.platform": true, + "process.version.substr": true, + "process.versions": true + }, + "packages": { + "detect-libc": true, + "nopt": true, + "npmlog": true, + "rimraf": true, + "semver": true + } + }, + "nopt": { + "builtin": { + "path": true, + "stream.Stream": true, + "url": true + }, + "globals": { + "console": true, + "process.argv": true, + "process.env.DEBUG_NOPT": true, + "process.env.NOPT_DEBUG": true, + "process.platform": true + }, + "packages": { + "abbrev": true, + "osenv": true + } + }, "normalize-path": { "packages": { "remove-trailing-separator": true @@ -3174,6 +3300,22 @@ "once": true } }, + "npmlog": { + "builtin": { + "events.EventEmitter": true, + "util": true + }, + "globals": { + "process.nextTick": true, + "process.stderr": true + }, + "packages": { + "are-we-there-yet": true, + "console-control-strings": true, + "gauge": true, + "set-blocking": true + } + }, "object-copy": { "packages": { "copy-descriptor": true, @@ -3240,6 +3382,54 @@ "readable-stream": true } }, + "os-homedir": { + "builtin": { + "os.homedir": true + }, + "globals": { + "process.env": true, + "process.getuid": true, + "process.platform": true + } + }, + "os-tmpdir": { + "globals": { + "process.env.SystemRoot": true, + "process.env.TEMP": true, + "process.env.TMP": true, + "process.env.TMPDIR": true, + "process.env.windir": true, + "process.platform": true + } + }, + "osenv": { + "builtin": { + "child_process.exec": true, + "path": true + }, + "globals": { + "process.env.COMPUTERNAME": true, + "process.env.ComSpec": true, + "process.env.EDITOR": true, + "process.env.HOSTNAME": true, + "process.env.PATH": true, + "process.env.PROMPT": true, + "process.env.PS1": true, + "process.env.Path": true, + "process.env.SHELL": true, + "process.env.USER": true, + "process.env.USERDOMAIN": true, + "process.env.USERNAME": true, + "process.env.VISUAL": true, + "process.env.path": true, + "process.nextTick": true, + "process.platform": true + }, + "packages": { + "os-homedir": true, + "os-tmpdir": true + } + }, "parent-module": { "packages": { "callsites": true @@ -3563,6 +3753,7 @@ }, "globals": { "process.platform": true, + "process.versions.node.split": true, "setImmediate": true }, "packages": { @@ -3825,6 +4016,12 @@ "lru-cache": true } }, + "set-blocking": { + "globals": { + "process.stderr": true, + "process.stdout": true + } + }, "set-value": { "packages": { "extend-shallow": true, @@ -4034,6 +4231,7 @@ }, "string-width": { "packages": { + "code-point-at": true, "emoji-regex": true, "is-fullwidth-code-point": true, "strip-ansi": true @@ -4610,6 +4808,11 @@ "isexe": true } }, + "wide-align": { + "packages": { + "string-width": true + } + }, "write": { "builtin": { "fs.createWriteStream": true, @@ -4692,4 +4895,4 @@ } } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index fd5aeaf58..f82a0a1c3 100644 --- a/package.json +++ b/package.json @@ -332,7 +332,7 @@ "vinyl-buffer": "^1.0.1", "vinyl-source-stream": "^2.0.0", "vinyl-sourcemaps-apply": "^0.2.1", - "watchify": "^3.11.1", + "watchify": "^4.0.0", "webpack": "^4.41.6", "yargs": "^17.0.1", "yarn-deduplicate": "^3.1.0" diff --git a/patches/watchify+3.11.1.patch b/patches/watchify+4.0.0.patch similarity index 96% rename from patches/watchify+3.11.1.patch rename to patches/watchify+4.0.0.patch index cf3e489ad..a5eb2b322 100644 --- a/patches/watchify+3.11.1.patch +++ b/patches/watchify+4.0.0.patch @@ -1,11 +1,11 @@ diff --git a/node_modules/watchify/index.js b/node_modules/watchify/index.js -index 0753b9f..4fea9e1 100644 +index 0753b9f..05efb1b 100644 --- a/node_modules/watchify/index.js +++ b/node_modules/watchify/index.js @@ -58,33 +58,6 @@ function watchify (b, opts) { if (pkgcache) pkgcache[file] = pkg; }); - + - b.on('reset', reset); - reset(); - diff --git a/yarn.lock b/yarn.lock index 9e1b5695b..4f8e244cc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4796,12 +4796,21 @@ acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2: acorn-walk "^6.1.0" xtend "^4.0.1" +acorn-node@^1.6.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + acorn-walk@^6.0.1, acorn-walk@^6.1.0: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== -acorn-walk@^7.1.1: +acorn-walk@^7.0.0, acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== @@ -5212,7 +5221,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.3, anymatch@~3.1.2: +anymatch@^3.0.3, anymatch@^3.1.0, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -7212,6 +7221,13 @@ browser-resolve@^1.11.0, browser-resolve@^1.7.0: dependencies: resolve "1.1.7" +browser-resolve@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" + integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== + dependencies: + resolve "^1.17.0" + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -7288,7 +7304,7 @@ browserify-zlib@^0.2.0, browserify-zlib@~0.2.0: dependencies: pako "~1.0.5" -browserify@^16.1.0, browserify@^16.5.1: +browserify@^16.5.1: version "16.5.1" resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.5.1.tgz#3c13c97436802930d5c3ae28658ddc33bfd37dc2" integrity sha512-EQX0h59Pp+0GtSRb5rL6OTfrttlzv+uyaUVlK6GX3w11SQ0jKPKyjC/54RhPR2ib2KmfcELM06e8FxcI5XNU2A== @@ -7342,6 +7358,60 @@ browserify@^16.1.0, browserify@^16.5.1: vm-browserify "^1.0.0" xtend "^4.0.0" +browserify@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-17.0.0.tgz#4c48fed6c02bfa2b51fd3b670fddb805723cdc22" + integrity sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w== + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^2.0.0" + browserify-zlib "~0.2.0" + buffer "~5.2.1" + cached-path-relative "^1.0.0" + concat-stream "^1.6.0" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.1" + domain-browser "^1.2.0" + duplexer2 "~0.1.2" + events "^3.0.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "^1.0.0" + inherits "~2.0.1" + insert-module-globals "^7.2.1" + labeled-stream-splicer "^2.0.0" + mkdirp-classic "^0.5.2" + module-deps "^6.2.3" + os-browserify "~0.3.0" + parents "^1.0.1" + path-browserify "^1.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum-object "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^3.0.0" + stream-http "^3.0.0" + string_decoder "^1.1.1" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "0.0.1" + url "~0.11.0" + util "~0.12.0" + vm-browserify "^1.0.0" + xtend "^4.0.0" + browserslist@4.10.0: version "4.10.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" @@ -7651,7 +7721,7 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" -cached-path-relative@^1.0.0: +cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== @@ -7953,7 +8023,7 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.3.1" -"chokidar@>=3.0.0 <4.0.0": +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.0: version "3.5.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== @@ -7968,7 +8038,7 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.3.2" -chokidar@^2.0.0, chokidar@^2.1.1, chokidar@^2.1.8: +chokidar@^2.0.0, chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -9635,6 +9705,16 @@ deps-sort@^2.0.0: subarg "^1.0.0" through2 "^2.0.0" +deps-sort@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d" + integrity sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw== + dependencies: + JSONStream "^1.0.3" + shasum-object "^1.0.0" + subarg "^1.0.0" + through2 "^2.0.0" + des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" @@ -9787,6 +9867,15 @@ detective@^5.0.2: defined "^1.0.0" minimist "^1.1.1" +detective@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" + integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== + dependencies: + acorn-node "^1.6.1" + defined "^1.0.0" + minimist "^1.1.1" + dezalgo@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" @@ -14767,6 +14856,22 @@ insert-module-globals@^7.0.0: undeclared-identifiers "^1.1.2" xtend "^4.0.0" +insert-module-globals@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.1.tgz#d5e33185181a4e1f33b15f7bf100ee91890d5cb3" + integrity sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg== + dependencies: + JSONStream "^1.0.3" + acorn-node "^1.5.2" + combine-source-map "^0.8.0" + concat-stream "^1.6.1" + is-buffer "^1.1.0" + path-is-absolute "^1.0.1" + process "~0.11.0" + through2 "^2.0.0" + undeclared-identifiers "^1.1.2" + xtend "^4.0.0" + int64-buffer@0.99.1007: version "0.99.1007" resolved "https://registry.yarnpkg.com/int64-buffer/-/int64-buffer-0.99.1007.tgz#211ea089a2fdb960070a2e77cd6d17dc456a5220" @@ -19334,6 +19439,27 @@ module-deps@^6.0.0: through2 "^2.0.0" xtend "^4.0.0" +module-deps@^6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.3.tgz#15490bc02af4b56cf62299c7c17cba32d71a96ee" + integrity sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA== + dependencies: + JSONStream "^1.0.3" + browser-resolve "^2.0.0" + cached-path-relative "^1.0.2" + concat-stream "~1.6.0" + defined "^1.0.0" + detective "^5.2.0" + duplexer2 "^0.1.2" + inherits "^2.0.1" + parents "^1.0.0" + readable-stream "^2.0.2" + resolve "^1.4.0" + stream-combiner2 "^1.1.1" + subarg "^1.0.0" + through2 "^2.0.0" + xtend "^4.0.0" + module-lookup-amd@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/module-lookup-amd/-/module-lookup-amd-7.0.1.tgz#d67c1a93f2ff8e38b8774b99a638e9a4395774b2" @@ -21280,6 +21406,11 @@ path-browserify@0.0.1, path-browserify@~0.0.0: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== +path-browserify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -24901,6 +25032,13 @@ shallowequal@1.1.0, shallowequal@^1.0.2, shallowequal@^1.1.0: resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== +shasum-object@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shasum-object/-/shasum-object-1.0.0.tgz#0b7b74ff5b66ecf9035475522fa05090ac47e29e" + integrity sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg== + dependencies: + fast-safe-stringify "^2.0.7" + shasum@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" @@ -27561,7 +27699,7 @@ util@^0.11.0: dependencies: inherits "2.0.3" -util@^0.12.3: +util@^0.12.3, util@~0.12.0: version "0.12.4" resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== @@ -27868,18 +28006,18 @@ warning@^4.0.2, warning@^4.0.3: dependencies: loose-envify "^1.0.0" -watchify@^3.11.1: - version "3.11.1" - resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.11.1.tgz#8e4665871fff1ef64c0430d1a2c9d084d9721881" - integrity sha512-WwnUClyFNRMB2NIiHgJU9RQPQNqVeFk7OmZaWf5dC5EnNa0Mgr7imBydbaJ7tGTuPM2hz1Cb4uiBvK9NVxMfog== +watchify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/watchify/-/watchify-4.0.0.tgz#53b002d51e7b0eb640b851bb4de517a689973392" + integrity sha512-2Z04dxwoOeNxa11qzWumBTgSAohTC0+ScuY7XMenPnH+W2lhTcpEOJP4g2EIG/SWeLadPk47x++Yh+8BqPM/lA== dependencies: - anymatch "^2.0.0" - browserify "^16.1.0" - chokidar "^2.1.1" + anymatch "^3.1.0" + browserify "^17.0.0" + chokidar "^3.4.0" defined "^1.0.0" outpipe "^1.1.0" - through2 "^2.0.0" - xtend "^4.0.0" + through2 "^4.0.2" + xtend "^4.0.2" watchpack-chokidar2@^2.0.1: version "2.0.1" From 532927368d7bc59499419bd7787f4475469bad91 Mon Sep 17 00:00:00 2001 From: Niranjana Binoy <43930900+NiranjanaBinoy@users.noreply.github.com> Date: Mon, 25 Oct 2021 16:38:43 -0400 Subject: [PATCH 02/97] Network Form Design and switch to full screen enhancements (#12302) --- .storybook/test-data.js | 1 - app/_locales/am/messages.json | 3 - app/_locales/ar/messages.json | 3 - app/_locales/bg/messages.json | 3 - app/_locales/bn/messages.json | 3 - app/_locales/ca/messages.json | 3 - app/_locales/da/messages.json | 3 - app/_locales/de/messages.json | 3 - app/_locales/el/messages.json | 3 - app/_locales/en/messages.json | 7 +- app/_locales/es/messages.json | 3 - app/_locales/es_419/messages.json | 3 - app/_locales/et/messages.json | 3 - app/_locales/fa/messages.json | 3 - app/_locales/fi/messages.json | 3 - app/_locales/fil/messages.json | 3 - app/_locales/fr/messages.json | 3 - app/_locales/he/messages.json | 3 - app/_locales/hi/messages.json | 3 - app/_locales/hr/messages.json | 3 - app/_locales/hu/messages.json | 3 - app/_locales/id/messages.json | 3 - app/_locales/it/messages.json | 3 - app/_locales/ja/messages.json | 3 - app/_locales/kn/messages.json | 3 - app/_locales/ko/messages.json | 3 - app/_locales/lt/messages.json | 3 - app/_locales/lv/messages.json | 3 - app/_locales/ms/messages.json | 3 - app/_locales/no/messages.json | 3 - app/_locales/ph/messages.json | 3 - app/_locales/pl/messages.json | 3 - app/_locales/pt_BR/messages.json | 3 - app/_locales/ro/messages.json | 3 - app/_locales/ru/messages.json | 3 - app/_locales/sk/messages.json | 3 - app/_locales/sl/messages.json | 3 - app/_locales/sr/messages.json | 3 - app/_locales/sv/messages.json | 3 - app/_locales/sw/messages.json | 3 - app/_locales/tl/messages.json | 3 - app/_locales/uk/messages.json | 3 - app/_locales/vi/messages.json | 3 - app/_locales/zh_CN/messages.json | 3 - app/_locales/zh_TW/messages.json | 3 - app/images/check_circle.svg | 3 + test/e2e/tests/custom-rpc-history.spec.js | 12 +- .../app/dropdowns/network-dropdown.js | 22 +-- .../actionable-message/actionable-message.js | 2 + .../ui/actionable-message/index.scss | 9 + ui/ducks/app/app.js | 6 +- ui/helpers/constants/routes.js | 3 + ui/pages/home/home.component.js | 33 +++- ui/pages/home/home.container.js | 6 + ui/pages/home/index.scss | 19 +++ ui/pages/settings/networks-tab/index.scss | 3 + .../networks-tab/network-form/index.scss | 76 +++++++++ .../network-form/network-form.component.js | 158 +++++++++++++++--- .../network-form.component.test.js | 98 +++++++++++ .../networks-tab/networks-tab.component.js | 73 ++++---- .../networks-tab/networks-tab.container.js | 20 ++- ui/pages/settings/settings.component.js | 12 +- ui/pages/settings/settings.container.js | 8 +- ui/selectors/selectors.js | 9 + ui/store/actionConstants.js | 2 +- ui/store/actions.js | 6 +- 66 files changed, 481 insertions(+), 236 deletions(-) create mode 100644 app/images/check_circle.svg create mode 100644 ui/pages/settings/networks-tab/network-form/index.scss create mode 100644 ui/pages/settings/networks-tab/network-form/network-form.component.test.js diff --git a/.storybook/test-data.js b/.storybook/test-data.js index 28c5c15c8..398ef19b1 100644 --- a/.storybook/test-data.js +++ b/.storybook/test-data.js @@ -1258,7 +1258,6 @@ const state = { ledger: "m/44'/60'/0'/0/0", }, networksTabSelectedRpcUrl: '', - networksTabIsInAddMode: false, loadingMethodData: false, show3BoxModalAfterImport: false, threeBoxLastUpdated: null, diff --git a/app/_locales/am/messages.json b/app/_locales/am/messages.json index cd4ff6d0d..e45655ca1 100644 --- a/app/_locales/am/messages.json +++ b/app/_locales/am/messages.json @@ -620,9 +620,6 @@ "newContract": { "message": "አዲስ ኮንትራት" }, - "newNetwork": { - "message": "አዲስ አውታረ መረብ" - }, "newPassword": { "message": "አዲስ የይለፍ ቃል (ቢያንስ 8 ቁምፊዎች)" }, diff --git a/app/_locales/ar/messages.json b/app/_locales/ar/messages.json index 46f05e1ef..9c99dda68 100644 --- a/app/_locales/ar/messages.json +++ b/app/_locales/ar/messages.json @@ -616,9 +616,6 @@ "newContract": { "message": "عقد جديد" }, - "newNetwork": { - "message": "شبكة جديدة" - }, "newPassword": { "message": "كلمة مرور جديدة (8 أحرف كحد أدنى)" }, diff --git a/app/_locales/bg/messages.json b/app/_locales/bg/messages.json index 85db5cf66..2b3d88f6a 100644 --- a/app/_locales/bg/messages.json +++ b/app/_locales/bg/messages.json @@ -619,9 +619,6 @@ "newContract": { "message": "Нов договор" }, - "newNetwork": { - "message": "Нова мрежа" - }, "newPassword": { "message": "Нова парола (мин. 8 символа)" }, diff --git a/app/_locales/bn/messages.json b/app/_locales/bn/messages.json index 92f31381d..0cc36e43d 100644 --- a/app/_locales/bn/messages.json +++ b/app/_locales/bn/messages.json @@ -623,9 +623,6 @@ "newContract": { "message": "নতুন কন্ট্র্যাক্ট" }, - "newNetwork": { - "message": "নতুন নেটওয়ার্ক" - }, "newPassword": { "message": "নতুন পাসওয়ার্ড (অন্তত 8 অক্ষরের)" }, diff --git a/app/_locales/ca/messages.json b/app/_locales/ca/messages.json index f0c688d8d..2770e8e0a 100644 --- a/app/_locales/ca/messages.json +++ b/app/_locales/ca/messages.json @@ -607,9 +607,6 @@ "newContract": { "message": "Nou Contracte" }, - "newNetwork": { - "message": "Nova Xarxa" - }, "newPassword": { "message": "Nova contrasenya (mínim 8 caràcters)" }, diff --git a/app/_locales/da/messages.json b/app/_locales/da/messages.json index 11b79bc9a..45e4a1dc7 100644 --- a/app/_locales/da/messages.json +++ b/app/_locales/da/messages.json @@ -607,9 +607,6 @@ "newContract": { "message": "Ny Kontrakt" }, - "newNetwork": { - "message": "Nyt Netværk" - }, "newPassword": { "message": "Ny adgangskode (min. 8 tegn)" }, diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json index f5dd97621..708ca317e 100644 --- a/app/_locales/de/messages.json +++ b/app/_locales/de/messages.json @@ -602,9 +602,6 @@ "newContract": { "message": "Neuer Smart Contract" }, - "newNetwork": { - "message": "Neues Netzwerk" - }, "newPassword": { "message": "Neues Passwort (min. 8 Zeichen)" }, diff --git a/app/_locales/el/messages.json b/app/_locales/el/messages.json index 15071eab3..9bdedf733 100644 --- a/app/_locales/el/messages.json +++ b/app/_locales/el/messages.json @@ -620,9 +620,6 @@ "newContract": { "message": "Νέα Σύμβαση" }, - "newNetwork": { - "message": "Νέο Δίκτυο" - }, "newPassword": { "message": "Νέος Κωδικός Πρόσβασης (ελάχιστο 8 χαρακτήρες)" }, diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index cbc845506..9ab00d821 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -43,6 +43,9 @@ "activityLog": { "message": "activity log" }, + "addANetwork": { + "message": "Add a network" + }, "addAcquiredTokens": { "message": "Add the tokens you've acquired using MetaMask" }, @@ -1517,8 +1520,8 @@ "newContract": { "message": "New Contract" }, - "newNetwork": { - "message": "New Network" + "newNetworkAdded": { + "message": "“$1” was successfully added!" }, "newPassword": { "message": "New password (min 8 chars)" diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index 63d07557d..fe7d84f99 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -1193,9 +1193,6 @@ "newContract": { "message": "Contrato nuevo" }, - "newNetwork": { - "message": "Red nueva" - }, "newPassword": { "message": "Contraseña nueva (mín. de 8 caracteres)" }, diff --git a/app/_locales/es_419/messages.json b/app/_locales/es_419/messages.json index 63d07557d..fe7d84f99 100644 --- a/app/_locales/es_419/messages.json +++ b/app/_locales/es_419/messages.json @@ -1193,9 +1193,6 @@ "newContract": { "message": "Contrato nuevo" }, - "newNetwork": { - "message": "Red nueva" - }, "newPassword": { "message": "Contraseña nueva (mín. de 8 caracteres)" }, diff --git a/app/_locales/et/messages.json b/app/_locales/et/messages.json index de6d85299..776ca4870 100644 --- a/app/_locales/et/messages.json +++ b/app/_locales/et/messages.json @@ -613,9 +613,6 @@ "newContract": { "message": "Uus kontakt" }, - "newNetwork": { - "message": "Uus võrk" - }, "newPassword": { "message": "Uus parool (vähemalt 8 tähemärki)" }, diff --git a/app/_locales/fa/messages.json b/app/_locales/fa/messages.json index b22b198c5..aa50426af 100644 --- a/app/_locales/fa/messages.json +++ b/app/_locales/fa/messages.json @@ -623,9 +623,6 @@ "newContract": { "message": "قرارداد جدید" }, - "newNetwork": { - "message": "شبکه جدید" - }, "newPassword": { "message": "رمز عبور جدید (حداقل 8 حرف)" }, diff --git a/app/_locales/fi/messages.json b/app/_locales/fi/messages.json index 857e496e2..c2218c576 100644 --- a/app/_locales/fi/messages.json +++ b/app/_locales/fi/messages.json @@ -623,9 +623,6 @@ "newContract": { "message": "Uusi sopimus" }, - "newNetwork": { - "message": "Uusi verkko" - }, "newPassword": { "message": "Uusi salasana (väh. 8 merkkiä)" }, diff --git a/app/_locales/fil/messages.json b/app/_locales/fil/messages.json index 235694a2f..6e08c5314 100644 --- a/app/_locales/fil/messages.json +++ b/app/_locales/fil/messages.json @@ -557,9 +557,6 @@ "newContract": { "message": "Bagong Contract" }, - "newNetwork": { - "message": "Bagong Network" - }, "newPassword": { "message": "Bagong Password (min 8 char)" }, diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json index 709ecbd83..5deda0758 100644 --- a/app/_locales/fr/messages.json +++ b/app/_locales/fr/messages.json @@ -608,9 +608,6 @@ "newContract": { "message": "Nouveau contrat" }, - "newNetwork": { - "message": "Nouveau réseau" - }, "newPassword": { "message": "Nouveau mot de passe (min 8 caractères)" }, diff --git a/app/_locales/he/messages.json b/app/_locales/he/messages.json index f080f1e66..d1be4f4b6 100644 --- a/app/_locales/he/messages.json +++ b/app/_locales/he/messages.json @@ -620,9 +620,6 @@ "newContract": { "message": "חוזה חדש" }, - "newNetwork": { - "message": "רשת חדשה" - }, "newPassword": { "message": "ססמה חדשה (לפחות 8 תווים)" }, diff --git a/app/_locales/hi/messages.json b/app/_locales/hi/messages.json index 217bdeca4..10b13b7df 100644 --- a/app/_locales/hi/messages.json +++ b/app/_locales/hi/messages.json @@ -1193,9 +1193,6 @@ "newContract": { "message": "नया अनुबंध" }, - "newNetwork": { - "message": "नया नेटवर्क" - }, "newPassword": { "message": "नया पासवर्ड (न्यूनतम 8 वर्ण)" }, diff --git a/app/_locales/hr/messages.json b/app/_locales/hr/messages.json index 5a629159f..4c85110f8 100644 --- a/app/_locales/hr/messages.json +++ b/app/_locales/hr/messages.json @@ -616,9 +616,6 @@ "newContract": { "message": "Novi ugovor" }, - "newNetwork": { - "message": "Nova mreža" - }, "newPassword": { "message": "Nova lozinka (najmanje osam znakova)" }, diff --git a/app/_locales/hu/messages.json b/app/_locales/hu/messages.json index 4f99006d6..b7e994c21 100644 --- a/app/_locales/hu/messages.json +++ b/app/_locales/hu/messages.json @@ -616,9 +616,6 @@ "newContract": { "message": "Új szerződés" }, - "newNetwork": { - "message": "Új hálózat" - }, "newPassword": { "message": "Új jelszó (minimum 8 karakter)" }, diff --git a/app/_locales/id/messages.json b/app/_locales/id/messages.json index 915ebf125..be60e06e5 100644 --- a/app/_locales/id/messages.json +++ b/app/_locales/id/messages.json @@ -1193,9 +1193,6 @@ "newContract": { "message": "Kontrak Baru" }, - "newNetwork": { - "message": "Jaringan Baru" - }, "newPassword": { "message": "Kata sandi baru (min. 8 karakter)" }, diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json index 0cd8bf51c..3add07dea 100644 --- a/app/_locales/it/messages.json +++ b/app/_locales/it/messages.json @@ -1007,9 +1007,6 @@ "newContract": { "message": "Nuovo Contratto" }, - "newNetwork": { - "message": "Nuova Rete" - }, "newPassword": { "message": "Nuova Password (minimo 8 caratteri)" }, diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json index a3af48c46..4d7c053e3 100644 --- a/app/_locales/ja/messages.json +++ b/app/_locales/ja/messages.json @@ -1193,9 +1193,6 @@ "newContract": { "message": "新しいコントラクト" }, - "newNetwork": { - "message": "新しいネットワーク" - }, "newPassword": { "message": "新しいパスワード (最低 8 文字)" }, diff --git a/app/_locales/kn/messages.json b/app/_locales/kn/messages.json index 0cdbcab35..67eea5804 100644 --- a/app/_locales/kn/messages.json +++ b/app/_locales/kn/messages.json @@ -623,9 +623,6 @@ "newContract": { "message": "ಹೊಸ ಒಪ್ಪಂದ" }, - "newNetwork": { - "message": "ಹೊಸ ನೆಟ್‌ವರ್ಕ್" - }, "newPassword": { "message": "ಹೊಸ ಪಾಸ್‌ವರ್ಡ್ (ಕನಿಷ್ಟ 8 ಅಕ್ಷರಗಳು)" }, diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index 9ba61d76e..034787b39 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -1193,9 +1193,6 @@ "newContract": { "message": "새 계약" }, - "newNetwork": { - "message": "새 네트워크" - }, "newPassword": { "message": "새 암호(8자 이상)" }, diff --git a/app/_locales/lt/messages.json b/app/_locales/lt/messages.json index 01670c783..dc4286cc2 100644 --- a/app/_locales/lt/messages.json +++ b/app/_locales/lt/messages.json @@ -623,9 +623,6 @@ "newContract": { "message": "Nauja sutartis" }, - "newNetwork": { - "message": "Naujas tinklas" - }, "newPassword": { "message": "Naujas slaptažodis (bent 8 ženklai)" }, diff --git a/app/_locales/lv/messages.json b/app/_locales/lv/messages.json index ad541d917..8d4f192ab 100644 --- a/app/_locales/lv/messages.json +++ b/app/_locales/lv/messages.json @@ -619,9 +619,6 @@ "newContract": { "message": "Jauns līgums" }, - "newNetwork": { - "message": "Jauns tīkls" - }, "newPassword": { "message": "Jauna parole (vism. 8 rakstzīmes)" }, diff --git a/app/_locales/ms/messages.json b/app/_locales/ms/messages.json index f58cb95ba..c52249eaa 100644 --- a/app/_locales/ms/messages.json +++ b/app/_locales/ms/messages.json @@ -603,9 +603,6 @@ "newContract": { "message": "Kontrak Baru" }, - "newNetwork": { - "message": "Rangkaian Baru" - }, "newPassword": { "message": "Kata Laluan Baru (min 8 aks)" }, diff --git a/app/_locales/no/messages.json b/app/_locales/no/messages.json index e04e6a42c..c65775240 100644 --- a/app/_locales/no/messages.json +++ b/app/_locales/no/messages.json @@ -610,9 +610,6 @@ "newContract": { "message": "Ny kontaktperson" }, - "newNetwork": { - "message": "Nytt nettverk " - }, "newPassword": { "message": "Nytt passord (minimum 8 tegn)" }, diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json index c7d40dd55..ad8d87989 100644 --- a/app/_locales/ph/messages.json +++ b/app/_locales/ph/messages.json @@ -1193,9 +1193,6 @@ "newContract": { "message": "Bagong Kontrata" }, - "newNetwork": { - "message": "Bagong Network" - }, "newPassword": { "message": "Bagong password (min na 8 char)" }, diff --git a/app/_locales/pl/messages.json b/app/_locales/pl/messages.json index 1d415a675..23c4017ab 100644 --- a/app/_locales/pl/messages.json +++ b/app/_locales/pl/messages.json @@ -620,9 +620,6 @@ "newContract": { "message": "Nowy kontrakt" }, - "newNetwork": { - "message": "Nowa sieć" - }, "newPassword": { "message": "Nowe hasło (min. 8 znaków)" }, diff --git a/app/_locales/pt_BR/messages.json b/app/_locales/pt_BR/messages.json index 40bde73d3..fe8563b78 100644 --- a/app/_locales/pt_BR/messages.json +++ b/app/_locales/pt_BR/messages.json @@ -1193,9 +1193,6 @@ "newContract": { "message": "Novo contrato" }, - "newNetwork": { - "message": "Nova rede" - }, "newPassword": { "message": "Nova senha (mín. 8 caract.)" }, diff --git a/app/_locales/ro/messages.json b/app/_locales/ro/messages.json index 97f49a7a5..18f79a2ed 100644 --- a/app/_locales/ro/messages.json +++ b/app/_locales/ro/messages.json @@ -610,9 +610,6 @@ "newContract": { "message": "Contract nou" }, - "newNetwork": { - "message": "Rețea nouă" - }, "newPassword": { "message": "Parola Nouă (minimum 8 caractere)" }, diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json index 881ee1042..15d6eee5e 100644 --- a/app/_locales/ru/messages.json +++ b/app/_locales/ru/messages.json @@ -1193,9 +1193,6 @@ "newContract": { "message": "Новый контракт" }, - "newNetwork": { - "message": "Новая сеть" - }, "newPassword": { "message": "Новый пароль (мин.8 знаков)" }, diff --git a/app/_locales/sk/messages.json b/app/_locales/sk/messages.json index aefb96bd1..bbedd7cf7 100644 --- a/app/_locales/sk/messages.json +++ b/app/_locales/sk/messages.json @@ -595,9 +595,6 @@ "newContract": { "message": "Nový kontrakt" }, - "newNetwork": { - "message": "Nová sieť" - }, "newPassword": { "message": "Nové heslo (min 8 znaků)" }, diff --git a/app/_locales/sl/messages.json b/app/_locales/sl/messages.json index d9173c49a..560ca435c 100644 --- a/app/_locales/sl/messages.json +++ b/app/_locales/sl/messages.json @@ -611,9 +611,6 @@ "newContract": { "message": "Nova pogodba" }, - "newNetwork": { - "message": "Novo omrežje" - }, "newPassword": { "message": "Novo geslo (min 8 znakov)" }, diff --git a/app/_locales/sr/messages.json b/app/_locales/sr/messages.json index 1bcfee19a..431169969 100644 --- a/app/_locales/sr/messages.json +++ b/app/_locales/sr/messages.json @@ -614,9 +614,6 @@ "newContract": { "message": "Novi ugovor" }, - "newNetwork": { - "message": "Nova mreža" - }, "newPassword": { "message": "Nova lozinka (minimalno 8 karaktera)" }, diff --git a/app/_locales/sv/messages.json b/app/_locales/sv/messages.json index a49e35d41..db321b783 100644 --- a/app/_locales/sv/messages.json +++ b/app/_locales/sv/messages.json @@ -607,9 +607,6 @@ "newContract": { "message": "Nytt kontrakt" }, - "newNetwork": { - "message": "Nytt nätverk" - }, "newPassword": { "message": "Nytt lösenord (minst 8 tecken)" }, diff --git a/app/_locales/sw/messages.json b/app/_locales/sw/messages.json index e9eed3a4b..dc24573fe 100644 --- a/app/_locales/sw/messages.json +++ b/app/_locales/sw/messages.json @@ -601,9 +601,6 @@ "newContract": { "message": "Mkataba Mpya" }, - "newNetwork": { - "message": "Mtandao Mpya" - }, "newPassword": { "message": "Nenosiri Jipya (kiwango cha chini herufi 8)" }, diff --git a/app/_locales/tl/messages.json b/app/_locales/tl/messages.json index 55e6587b5..7142e80d5 100644 --- a/app/_locales/tl/messages.json +++ b/app/_locales/tl/messages.json @@ -1001,9 +1001,6 @@ "newContract": { "message": "Bagong Kontrata" }, - "newNetwork": { - "message": "Bagong Network" - }, "newPassword": { "message": "Bagong password (min na 8 char)" }, diff --git a/app/_locales/uk/messages.json b/app/_locales/uk/messages.json index fe88a0e32..51321e3f9 100644 --- a/app/_locales/uk/messages.json +++ b/app/_locales/uk/messages.json @@ -623,9 +623,6 @@ "newContract": { "message": "Новий контракт" }, - "newNetwork": { - "message": "Нова мережа" - }, "newPassword": { "message": "Новий пароль (мінімум 8 символів)" }, diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json index a1f78fa6d..93a1fbae5 100644 --- a/app/_locales/vi/messages.json +++ b/app/_locales/vi/messages.json @@ -1193,9 +1193,6 @@ "newContract": { "message": "Hợp đồng mới" }, - "newNetwork": { - "message": "Mạng mới" - }, "newPassword": { "message": "Mật khẩu mới (tối thiểu 8 ký tự)" }, diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index bbd980f1d..31e56dfef 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -1004,9 +1004,6 @@ "newContract": { "message": "新合约" }, - "newNetwork": { - "message": "新增网络" - }, "newPassword": { "message": "新密码(至少 8 个字符)" }, diff --git a/app/_locales/zh_TW/messages.json b/app/_locales/zh_TW/messages.json index 82035e758..4ffa228b6 100644 --- a/app/_locales/zh_TW/messages.json +++ b/app/_locales/zh_TW/messages.json @@ -629,9 +629,6 @@ "newContract": { "message": "建立新合約" }, - "newNetwork": { - "message": "新增網路" - }, "newPassword": { "message": "新密碼(至少8個字元)" }, diff --git a/app/images/check_circle.svg b/app/images/check_circle.svg new file mode 100644 index 000000000..514183743 --- /dev/null +++ b/app/images/check_circle.svg @@ -0,0 +1,3 @@ + + + diff --git a/test/e2e/tests/custom-rpc-history.spec.js b/test/e2e/tests/custom-rpc-history.spec.js index 078cb124f..3e9f79e3f 100644 --- a/test/e2e/tests/custom-rpc-history.spec.js +++ b/test/e2e/tests/custom-rpc-history.spec.js @@ -32,7 +32,7 @@ describe('Stores custom RPC history', function () { await driver.clickElement({ text: 'Custom RPC', tag: 'span' }); - await driver.findElement('.settings-page__sub-header-text'); + await driver.findElement('.add-network-form__sub-header-text'); const customRpcInputs = await driver.findElements('input[type="text"]'); const networkNameInput = customRpcInputs[0]; @@ -48,7 +48,7 @@ describe('Stores custom RPC history', function () { await chainIdInput.clear(); await chainIdInput.sendKeys(chainId.toString()); - await driver.clickElement('.network-form__footer .btn-primary'); + await driver.clickElement('.add-network-form__footer .btn-primary'); await driver.findElement({ text: networkName, tag: 'span' }); }, ); @@ -73,7 +73,7 @@ describe('Stores custom RPC history', function () { await driver.clickElement({ text: 'Custom RPC', tag: 'span' }); - await driver.findElement('.settings-page__sub-header-text'); + await driver.findElement('.add-network-form__sub-header-text'); const customRpcInputs = await driver.findElements('input[type="text"]'); const rpcUrlInput = customRpcInputs[1]; @@ -108,7 +108,7 @@ describe('Stores custom RPC history', function () { await driver.clickElement({ text: 'Custom RPC', tag: 'span' }); - await driver.findElement('.settings-page__sub-header-text'); + await driver.findElement('.add-network-form__sub-header-text'); const customRpcInputs = await driver.findElements('input[type="text"]'); const rpcUrlInput = customRpcInputs[1]; @@ -192,7 +192,9 @@ describe('Stores custom RPC history', function () { await driver.clickElement({ text: 'Custom RPC', tag: 'span' }); // cancel new custom rpc - await driver.clickElement('.network-form__footer button.btn-secondary'); + await driver.clickElement( + '.add-network-form__footer button.btn-secondary', + ); const networkListItems = await driver.findClickableElements( '.networks-tab__networks-list-name', diff --git a/ui/components/app/dropdowns/network-dropdown.js b/ui/components/app/dropdowns/network-dropdown.js index 66e44bd49..01c1b3fc1 100644 --- a/ui/components/app/dropdowns/network-dropdown.js +++ b/ui/components/app/dropdowns/network-dropdown.js @@ -5,10 +5,7 @@ import { withRouter } from 'react-router-dom'; import { compose } from 'redux'; import * as actions from '../../../store/actions'; import { openAlert as displayInvalidCustomNetworkAlert } from '../../../ducks/alerts/invalid-custom-network'; -import { - NETWORKS_ROUTE, - NETWORKS_FORM_ROUTE, -} from '../../../helpers/constants/routes'; +import { ADD_NETWORK_ROUTE } from '../../../helpers/constants/routes'; import { ENVIRONMENT_TYPE_FULLSCREEN } from '../../../../shared/constants/app'; import { NETWORK_TYPE_RPC } from '../../../../shared/constants/network'; import { isPrefixedFormattedHexString } from '../../../../shared/modules/network.utils'; @@ -51,9 +48,6 @@ function mapDispatchToProps(dispatch) { dispatch(actions.setRpcTarget(target, chainId, ticker, nickname)); }, hideNetworkDropdown: () => dispatch(actions.hideNetworkDropdown()), - setNetworksTabAddMode: (isInAddMode) => { - dispatch(actions.setNetworksTabAddMode(isInAddMode)); - }, setSelectedSettingsRpcUrl: (url) => { dispatch(actions.setSelectedSettingsRpcUrl(url)); }, @@ -88,7 +82,6 @@ class NetworkDropdown extends Component { setProviderType: PropTypes.func.isRequired, setRpcTarget: PropTypes.func.isRequired, hideNetworkDropdown: PropTypes.func.isRequired, - setNetworksTabAddMode: PropTypes.func.isRequired, setSelectedSettingsRpcUrl: PropTypes.func.isRequired, frequentRpcListDetail: PropTypes.array.isRequired, networkDropdownOpen: PropTypes.bool.isRequired, @@ -239,8 +232,8 @@ class NetworkDropdown extends Component { render() { const { provider: { rpcUrl: activeNetwork }, - setNetworksTabAddMode, setSelectedSettingsRpcUrl, + history, } = this.props; const rpcListDetail = this.props.frequentRpcListDetail; const isOpen = this.props.networkDropdownOpen; @@ -291,13 +284,12 @@ class NetworkDropdown extends Component { this.props.hideNetworkDropdown()} onClick={() => { - this.props.history.push( - getEnvironmentType() === ENVIRONMENT_TYPE_FULLSCREEN - ? NETWORKS_ROUTE - : NETWORKS_FORM_ROUTE, - ); + if (getEnvironmentType() === ENVIRONMENT_TYPE_FULLSCREEN) { + history.push(ADD_NETWORK_ROUTE); + } else { + global.platform.openExtensionInBrowser(ADD_NETWORK_ROUTE); + } setSelectedSettingsRpcUrl(''); - setNetworksTabAddMode(true); }} style={DROP_DOWN_MENU_ITEM_STYLE} > diff --git a/ui/components/ui/actionable-message/actionable-message.js b/ui/components/ui/actionable-message/actionable-message.js index 746a9d2a4..8af6646c7 100644 --- a/ui/components/ui/actionable-message/actionable-message.js +++ b/ui/components/ui/actionable-message/actionable-message.js @@ -6,11 +6,13 @@ import InfoTooltipIcon from '../info-tooltip/info-tooltip-icon'; const CLASSNAME_WARNING = 'actionable-message--warning'; const CLASSNAME_DANGER = 'actionable-message--danger'; +const CLASSNAME_INFO = 'actionable-message--info'; const CLASSNAME_WITH_RIGHT_BUTTON = 'actionable-message--with-right-button'; const typeHash = { warning: CLASSNAME_WARNING, danger: CLASSNAME_DANGER, + info: CLASSNAME_INFO, default: '', }; diff --git a/ui/components/ui/actionable-message/index.scss b/ui/components/ui/actionable-message/index.scss index cbb1f8ba6..942123b4e 100644 --- a/ui/components/ui/actionable-message/index.scss +++ b/ui/components/ui/actionable-message/index.scss @@ -85,6 +85,15 @@ } } + &--info { + background: $Green-000; + border: 1px solid $Green-200; + + .actionable-message__message { + color: $Black-100; + } + } + &--left-aligned { .actionable-message__message, .actionable-message__actions { diff --git a/ui/ducks/app/app.js b/ui/ducks/app/app.js index 517b72471..d1b197d00 100644 --- a/ui/ducks/app/app.js +++ b/ui/ducks/app/app.js @@ -37,7 +37,6 @@ export default function reduceApp(state = {}, action) { ledger: `m/44'/60'/0'/0/0`, }, networksTabSelectedRpcUrl: '', - networksTabIsInAddMode: false, loadingMethodData: false, show3BoxModalAfterImport: false, threeBoxLastUpdated: null, @@ -50,6 +49,7 @@ export default function reduceApp(state = {}, action) { }, gasLoadingAnimationIsShowing: false, ledgerWebHidConnectedStatus: WEBHID_CONNECTED_STATUSES.UNKNOWN, + newNetworkAdded: '', ...state, }; @@ -279,10 +279,10 @@ export default function reduceApp(state = {}, action) { networksTabSelectedRpcUrl: action.value, }; - case actionConstants.SET_NETWORKS_TAB_ADD_MODE: + case actionConstants.SET_NEW_NETWORK_ADDED: return { ...appState, - networksTabIsInAddMode: action.value, + newNetworkAdded: action.value, }; case actionConstants.LOADING_METHOD_DATA_STARTED: diff --git a/ui/helpers/constants/routes.js b/ui/helpers/constants/routes.js index 8b10ea77a..7883647de 100644 --- a/ui/helpers/constants/routes.js +++ b/ui/helpers/constants/routes.js @@ -11,6 +11,7 @@ const ABOUT_US_ROUTE = '/settings/about-us'; const ALERTS_ROUTE = '/settings/alerts'; const NETWORKS_ROUTE = '/settings/networks'; const NETWORKS_FORM_ROUTE = '/settings/networks/form'; +const ADD_NETWORK_ROUTE = '/settings/networks/add-network'; const CONTACT_LIST_ROUTE = '/settings/contact-list'; const CONTACT_EDIT_ROUTE = '/settings/contact-list/edit-contact'; const CONTACT_ADD_ROUTE = '/settings/contact-list/add-contact'; @@ -96,6 +97,7 @@ const PATH_NAME_MAP = { [ALERTS_ROUTE]: 'Alerts Settings Page', [NETWORKS_ROUTE]: 'Network Settings Page', [NETWORKS_FORM_ROUTE]: 'Network Settings Page Form', + [ADD_NETWORK_ROUTE]: 'Add Network From Settings Page Form', [CONTACT_LIST_ROUTE]: 'Contact List Settings Page', [`${CONTACT_EDIT_ROUTE}/:address`]: 'Edit Contact Settings Page', [CONTACT_ADD_ROUTE]: 'Add Contact Settings Page', @@ -200,6 +202,7 @@ export { CONTACT_VIEW_ROUTE, NETWORKS_ROUTE, NETWORKS_FORM_ROUTE, + ADD_NETWORK_ROUTE, INITIALIZE_BACKUP_SEED_PHRASE_ROUTE, INITIALIZE_SEED_PHRASE_INTRO_ROUTE, CONNECT_ROUTE, diff --git a/ui/pages/home/home.component.js b/ui/pages/home/home.component.js index d7d42b9c7..a6e91ba88 100644 --- a/ui/pages/home/home.component.js +++ b/ui/pages/home/home.component.js @@ -15,6 +15,9 @@ import { Tabs, Tab } from '../../components/ui/tabs'; import { EthOverview } from '../../components/app/wallet-overview'; import WhatsNewPopup from '../../components/app/whats-new-popup'; import RecoveryPhraseReminder from '../../components/app/recovery-phrase-reminder'; +import ActionableMessage from '../../components/ui/actionable-message/actionable-message'; +import Typography from '../../components/ui/typography/typography'; +import { TYPOGRAPHY, FONT_WEIGHT } from '../../helpers/constants/design-system'; import { isBeta } from '../../helpers/utils/build-types'; @@ -84,6 +87,8 @@ export default class Home extends PureComponent { setRecoveryPhraseReminderHasBeenShown: PropTypes.func.isRequired, setRecoveryPhraseReminderLastShown: PropTypes.func.isRequired, seedPhraseBackedUp: PropTypes.bool.isRequired, + newNetworkAdded: PropTypes.string, + setNewNetworkAdded: PropTypes.func.isRequired, }; state = { @@ -199,10 +204,36 @@ export default class Home extends PureComponent { originOfCurrentTab, disableWeb3ShimUsageAlert, infuraBlocked, + newNetworkAdded, + setNewNetworkAdded, } = this.props; - return ( + {newNetworkAdded ? ( + + + + {this.context.t('newNetworkAdded', [newNetworkAdded])} + + + + + ); } - render() { + renderNetworkForm() { const { t } = this.context; - const { viewOnly, isCurrentRpcTarget, networksTabIsInAddMode } = this.props; + const { viewOnly, isCurrentRpcTarget } = this.props; const { networkName, rpcUrl, @@ -568,8 +668,8 @@ export default class NetworkForm extends PureComponent { blockExplorerUrl, } = this.state; - const deletable = - !networksTabIsInAddMode && !isCurrentRpcTarget && !viewOnly; + const deletable = !isCurrentRpcTarget && !viewOnly; + const isSubmitDisabled = this.hasErrors() || this.isSubmitting() || @@ -579,21 +679,22 @@ export default class NetworkForm extends PureComponent { return (
- {viewOnly ? null : this.renderWarning()} {this.renderFormTextField({ + className: 'networks-tab__network-form-row', fieldKey: 'networkName', textFieldId: 'network-name', onChange: this.setStateWithValue('networkName'), value: networkName, - autoFocus: networksTabIsInAddMode, })} {this.renderFormTextField({ + className: 'networks-tab__network-form-row', fieldKey: 'rpcUrl', textFieldId: 'rpc-url', onChange: this.setStateWithValue('rpcUrl', this.validateUrlRpcUrl), value: rpcUrl, })} {this.renderFormTextField({ + className: 'networks-tab__network-form-row', fieldKey: 'chainId', textFieldId: 'chainId', onChange: this.setStateWithValue( @@ -604,6 +705,7 @@ export default class NetworkForm extends PureComponent { tooltipText: viewOnly ? null : t('networkSettingsChainIdDescription'), })} {this.renderFormTextField({ + className: 'networks-tab__network-form-row', fieldKey: 'symbol', textFieldId: 'network-ticker', onChange: this.setStateWithValue('ticker'), @@ -611,6 +713,7 @@ export default class NetworkForm extends PureComponent { optionalTextFieldKey: 'optionalCurrencySymbol', })} {this.renderFormTextField({ + className: 'networks-tab__network-form-row', fieldKey: 'blockExplorerUrl', textFieldId: 'block-explorer-url', onChange: this.setStateWithValue( @@ -648,4 +751,11 @@ export default class NetworkForm extends PureComponent {
); } + + render() { + const { addNewNetwork } = this.props; + return addNewNetwork + ? this.renderAddNetworkForm() + : this.renderNetworkForm(); + } } diff --git a/ui/pages/settings/networks-tab/network-form/network-form.component.test.js b/ui/pages/settings/networks-tab/network-form/network-form.component.test.js new file mode 100644 index 000000000..cbe5fc225 --- /dev/null +++ b/ui/pages/settings/networks-tab/network-form/network-form.component.test.js @@ -0,0 +1,98 @@ +import React from 'react'; +import configureMockStore from 'redux-mock-store'; +import { fireEvent } from '@testing-library/react'; +import { renderWithProvider } from '../../../../../test/jest/rendering'; +import { defaultNetworksData } from '../networks-tab.constants'; +import NetworkForm from '.'; + +const renderComponent = (props) => { + const store = configureMockStore([])({ metamask: {} }); + return renderWithProvider(, store); +}; + +const defaultNetworks = defaultNetworksData.map((network) => ({ + ...network, + viewOnly: true, +})); + +const propNewNetwork = { + onClear: () => undefined, + setRpcTarget: () => undefined, + networksToRender: defaultNetworks, + onAddNetwork: () => undefined, + setNewNetworkAdded: () => undefined, + addNewNetwork: true, +}; + +const propNetworkDisplay = { + editRpc: () => undefined, + showConfirmDeleteNetworkModal: () => undefined, + rpcUrl: 'http://localhost:8545', + chainId: '1337', + ticker: 'ETH', + viewOnly: false, + networkName: 'LocalHost', + onClear: () => undefined, + setRpcTarget: () => undefined, + isCurrentRpcTarget: false, + blockExplorerUrl: '', + rpcPrefs: {}, + networksToRender: defaultNetworks, + onAddNetwork: () => undefined, + setNewNetworkAdded: () => undefined, + addNewNetwork: false, +}; + +describe('NetworkForm Component', () => { + it('should render Add new network form correctly', () => { + const { queryByText } = renderComponent(propNewNetwork); + expect(queryByText('Network Name')).toBeInTheDocument(); + expect(queryByText('New RPC URL')).toBeInTheDocument(); + expect(queryByText('Chain ID')).toBeInTheDocument(); + expect(queryByText('Currency Symbol (optional)')).toBeInTheDocument(); + expect(queryByText('Block Explorer URL (optional)')).toBeInTheDocument(); + expect(queryByText('Cancel')).toBeInTheDocument(); + expect(queryByText('Save')).toBeInTheDocument(); + }); + + it('should render network form correctly', () => { + const { queryByText, getByDisplayValue } = renderComponent( + propNetworkDisplay, + ); + expect(queryByText('Network Name')).toBeInTheDocument(); + expect(queryByText('New RPC URL')).toBeInTheDocument(); + expect(queryByText('Chain ID')).toBeInTheDocument(); + expect(queryByText('Currency Symbol (optional)')).toBeInTheDocument(); + expect(queryByText('Block Explorer URL (optional)')).toBeInTheDocument(); + expect(queryByText('Delete')).toBeInTheDocument(); + expect(queryByText('Cancel')).toBeInTheDocument(); + expect(queryByText('Save')).toBeInTheDocument(); + + expect( + getByDisplayValue(propNetworkDisplay.networkName), + ).toBeInTheDocument(); + expect(getByDisplayValue(propNetworkDisplay.rpcUrl)).toBeInTheDocument(); + expect(getByDisplayValue(propNetworkDisplay.chainId)).toBeInTheDocument(); + expect(getByDisplayValue(propNetworkDisplay.ticker)).toBeInTheDocument(); + expect( + getByDisplayValue(propNetworkDisplay.blockExplorerUrl), + ).toBeInTheDocument(); + fireEvent.change(getByDisplayValue(propNetworkDisplay.networkName), { + target: { value: 'LocalHost 8545' }, + }); + expect(getByDisplayValue('LocalHost 8545')).toBeInTheDocument(); + fireEvent.change(getByDisplayValue(propNetworkDisplay.chainId), { + target: { value: '1' }, + }); + expect( + queryByText('This Chain ID is currently used by the mainnet network.'), + ).toBeInTheDocument(); + + fireEvent.change(getByDisplayValue(propNetworkDisplay.rpcUrl), { + target: { value: 'test' }, + }); + expect( + queryByText('URLs require the appropriate HTTP/HTTPS prefix.'), + ).toBeInTheDocument(); + }); +}); diff --git a/ui/pages/settings/networks-tab/networks-tab.component.js b/ui/pages/settings/networks-tab/networks-tab.component.js index 4a943f0e3..e786d3fc6 100644 --- a/ui/pages/settings/networks-tab/networks-tab.component.js +++ b/ui/pages/settings/networks-tab/networks-tab.component.js @@ -8,9 +8,10 @@ import { NETWORKS_ROUTE, NETWORKS_FORM_ROUTE, DEFAULT_ROUTE, + ADD_NETWORK_ROUTE, } from '../../../helpers/constants/routes'; import ColorIndicator from '../../../components/ui/color-indicator'; -import { COLORS, SIZES } from '../../../helpers/constants/design-system'; +import { SIZES } from '../../../helpers/constants/design-system'; import NetworkForm from './network-form'; export default class NetworksTab extends PureComponent { @@ -23,10 +24,8 @@ export default class NetworksTab extends PureComponent { editRpc: PropTypes.func.isRequired, location: PropTypes.object.isRequired, networkIsSelected: PropTypes.bool, - networksTabIsInAddMode: PropTypes.bool, networksToRender: PropTypes.arrayOf(PropTypes.object).isRequired, selectedNetwork: PropTypes.object, - setNetworksTabAddMode: PropTypes.func.isRequired, setRpcTarget: PropTypes.func.isRequired, setSelectedSettingsRpcUrl: PropTypes.func.isRequired, showConfirmDeleteNetworkModal: PropTypes.func.isRequired, @@ -36,6 +35,8 @@ export default class NetworksTab extends PureComponent { history: PropTypes.object.isRequired, shouldRenderNetworkForm: PropTypes.bool.isRequired, isFullScreen: PropTypes.bool.isRequired, + setNewNetworkAdded: PropTypes.func.isRequired, + addNewNetwork: PropTypes.bool, }; componentWillUnmount() { @@ -47,7 +48,7 @@ export default class NetworksTab extends PureComponent { } renderSubHeader() { - const { setSelectedSettingsRpcUrl, setNetworksTabAddMode } = this.props; + const { history } = this.props; return (
@@ -59,11 +60,10 @@ export default class NetworksTab extends PureComponent { type="primary" onClick={(event) => { event.preventDefault(); - setSelectedSettingsRpcUrl(''); - setNetworksTabAddMode(true); + history.push(ADD_NETWORK_ROUTE); }} > - {this.context.t('addNetwork')} + {this.context.t('addANetwork')}
@@ -73,11 +73,9 @@ export default class NetworksTab extends PureComponent { renderNetworkListItem(network, selectRpcUrl) { const { setSelectedSettingsRpcUrl, - setNetworksTabAddMode, networkIsSelected, providerUrl, providerType, - networksTabIsInAddMode, history, isFullScreen, } = this.props; @@ -94,7 +92,6 @@ export default class NetworksTab extends PureComponent { providerType !== NETWORK_TYPE_RPC && currentProviderType === providerType; const listItemNetworkIsCurrentProvider = !networkIsSelected && - !networksTabIsInAddMode && (listItemUrlIsProviderUrl || listItemTypeIsProviderNonRpcType); const displayNetworkListItemAsSelected = listItemNetworkIsSelected || listItemNetworkIsCurrentProvider; @@ -104,7 +101,6 @@ export default class NetworksTab extends PureComponent { key={`settings-network-list-item:${rpcUrl}`} className="networks-tab__networks-list-item" onClick={() => { - setNetworksTabAddMode(false); setSelectedSettingsRpcUrl(rpcUrl); if (!isFullScreen) { history.push(NETWORKS_FORM_ROUTE); @@ -139,7 +135,6 @@ export default class NetworksTab extends PureComponent { networksToRender, selectedNetwork, networkIsSelected, - networksTabIsInAddMode, networkDefaultedToProvider, } = this.props; @@ -147,27 +142,12 @@ export default class NetworksTab extends PureComponent {
{networksToRender.map((network) => this.renderNetworkListItem(network, selectedNetwork.rpcUrl), )} - {networksTabIsInAddMode && ( -
- -
- {this.context.t('newNetwork')} -
-
-
- )}
); } @@ -178,7 +158,6 @@ export default class NetworksTab extends PureComponent { setRpcTarget, showConfirmDeleteNetworkModal, setSelectedSettingsRpcUrl, - setNetworksTabAddMode, selectedNetwork: { labelKey, label, @@ -189,7 +168,6 @@ export default class NetworksTab extends PureComponent { rpcPrefs, blockExplorerUrl, }, - networksTabIsInAddMode, editRpc, providerUrl, networksToRender, @@ -211,19 +189,14 @@ export default class NetworksTab extends PureComponent { networksToRender={networksToRender} ticker={ticker} onClear={(shouldUpdateHistory = true) => { - setNetworksTabAddMode(false); setSelectedSettingsRpcUrl(''); if (shouldUpdateHistory) { history.push(NETWORKS_ROUTE); } }} - onAddNetwork={() => { - history.push(DEFAULT_ROUTE); - }} showConfirmDeleteNetworkModal={showConfirmDeleteNetworkModal} viewOnly={viewOnly} isCurrentRpcTarget={providerUrl === rpcUrl} - networksTabIsInAddMode={networksTabIsInAddMode} rpcPrefs={rpcPrefs} blockExplorerUrl={blockExplorerUrl} isFullScreen={isFullScreen} @@ -235,14 +208,32 @@ export default class NetworksTab extends PureComponent { render() { const { - setNetworksTabAddMode, - setSelectedSettingsRpcUrl, history, isFullScreen, shouldRenderNetworkForm, + setRpcTarget, + networksToRender, + setNewNetworkAdded, + selectedNetwork: { rpcPrefs }, + addNewNetwork, } = this.props; - - return ( + return addNewNetwork ? ( + { + if (shouldUpdateHistory) { + history.push(NETWORKS_ROUTE); + } + }} + onAddNetwork={() => { + history.push(DEFAULT_ROUTE); + }} + rpcPrefs={rpcPrefs} + networksToRender={networksToRender} + setNewNetworkAdded={setNewNetworkAdded} + addNewNetwork={addNewNetwork} + /> + ) : (
{isFullScreen ? this.renderSubHeader() : null}
@@ -253,9 +244,7 @@ export default class NetworksTab extends PureComponent { type="primary" onClick={(event) => { event.preventDefault(); - setSelectedSettingsRpcUrl(''); - setNetworksTabAddMode(true); - history.push(NETWORKS_FORM_ROUTE); + global.platform.openExtensionInBrowser(ADD_NETWORK_ROUTE); }} > {this.context.t('addNetwork')} diff --git a/ui/pages/settings/networks-tab/networks-tab.container.js b/ui/pages/settings/networks-tab/networks-tab.container.js index 2878cbf11..7aaf5b55f 100644 --- a/ui/pages/settings/networks-tab/networks-tab.container.js +++ b/ui/pages/settings/networks-tab/networks-tab.container.js @@ -5,11 +5,14 @@ import { setSelectedSettingsRpcUrl, updateAndSetCustomRpc, displayWarning, - setNetworksTabAddMode, editRpc, showModal, + setNewNetworkAdded, } from '../../../store/actions'; -import { NETWORKS_FORM_ROUTE } from '../../../helpers/constants/routes'; +import { + ADD_NETWORK_ROUTE, + NETWORKS_FORM_ROUTE, +} from '../../../helpers/constants/routes'; import { ENVIRONMENT_TYPE_FULLSCREEN } from '../../../../shared/constants/app'; import { NETWORK_TYPE_RPC } from '../../../../shared/constants/network'; import { getEnvironmentType } from '../../../../app/scripts/lib/util'; @@ -30,10 +33,10 @@ const mapStateToProps = (state, ownProps) => { const isFullScreen = environmentType === ENVIRONMENT_TYPE_FULLSCREEN; const shouldRenderNetworkForm = isFullScreen || Boolean(pathname.match(NETWORKS_FORM_ROUTE)); + const addNewNetwork = Boolean(pathname.match(ADD_NETWORK_ROUTE)); const { frequentRpcListDetail, provider } = state.metamask; - const { networksTabSelectedRpcUrl, networksTabIsInAddMode } = state.appState; - + const { networksTabSelectedRpcUrl } = state.appState; const frequentRpcNetworkListDetails = frequentRpcListDetail.map((rpc) => { return { label: rpc.nickname, @@ -57,7 +60,7 @@ const mapStateToProps = (state, ownProps) => { const networkIsSelected = Boolean(selectedNetwork.rpcUrl); let networkDefaultedToProvider = false; - if (!networkIsSelected && !networksTabIsInAddMode) { + if (!networkIsSelected) { selectedNetwork = networksToRender.find((network) => { return ( @@ -73,12 +76,12 @@ const mapStateToProps = (state, ownProps) => { selectedNetwork, networksToRender, networkIsSelected, - networksTabIsInAddMode, providerType: provider.type, providerUrl: provider.rpcUrl, networkDefaultedToProvider, isFullScreen, shouldRenderNetworkForm, + addNewNetwork, }; }; @@ -97,13 +100,14 @@ const mapDispatchToProps = (dispatch) => { ); }, displayWarning: (warning) => dispatch(displayWarning(warning)), - setNetworksTabAddMode: (isInAddMode) => - dispatch(setNetworksTabAddMode(isInAddMode)), editRpc: (oldRpc, newRpc, chainId, ticker, nickname, rpcPrefs) => { return dispatch( editRpc(oldRpc, newRpc, chainId, ticker, nickname, rpcPrefs), ); }, + setNewNetworkAdded: (newNetwork) => { + dispatch(setNewNetworkAdded(newNetwork)); + }, }; }; diff --git a/ui/pages/settings/settings.component.js b/ui/pages/settings/settings.component.js index c9f694c1c..3c94b67da 100644 --- a/ui/pages/settings/settings.component.js +++ b/ui/pages/settings/settings.component.js @@ -16,6 +16,7 @@ import { CONTACT_EDIT_ROUTE, CONTACT_VIEW_ROUTE, EXPERIMENTAL_ROUTE, + ADD_NETWORK_ROUTE, } from '../../helpers/constants/routes'; import SettingsTab from './settings-tab'; import AlertsTab from './alerts-tab'; @@ -39,6 +40,7 @@ class SettingsPage extends PureComponent { breadCrumbTextKey: PropTypes.string, initialBreadCrumbKey: PropTypes.string, mostRecentOverviewPage: PropTypes.string.isRequired, + addNewNetwork: PropTypes.bool, }; static contextTypes = { @@ -51,6 +53,7 @@ class SettingsPage extends PureComponent { backRoute, currentPath, mostRecentOverviewPage, + addNewNetwork, } = this.props; return ( @@ -69,7 +72,13 @@ class SettingsPage extends PureComponent { {this.renderTitle()}
history.push(mostRecentOverviewPage)} + onClick={() => { + if (addNewNetwork) { + history.push(NETWORKS_ROUTE); + } else { + history.push(mostRecentOverviewPage); + } + }} />
@@ -222,6 +231,7 @@ class SettingsPage extends PureComponent { + diff --git a/ui/pages/settings/settings.container.js b/ui/pages/settings/settings.container.js index 4ac2f456c..ce81cb769 100644 --- a/ui/pages/settings/settings.container.js +++ b/ui/pages/settings/settings.container.js @@ -24,6 +24,7 @@ import { SECURITY_ROUTE, SETTINGS_ROUTE, EXPERIMENTAL_ROUTE, + ADD_NETWORK_ROUTE, } from '../../helpers/constants/routes'; import Settings from './settings.component'; @@ -38,6 +39,7 @@ const ROUTES_TO_I18N_KEYS = { [CONTACT_VIEW_ROUTE]: 'viewContact', [NETWORKS_ROUTE]: 'networks', [NETWORKS_FORM_ROUTE]: 'networks', + [ADD_NETWORK_ROUTE]: 'networks', [SECURITY_ROUTE]: 'securityAndPrivacy', [EXPERIMENTAL_ROUTE]: 'experimental', }; @@ -50,7 +52,10 @@ const mapStateToProps = (state, ownProps) => { const isAddressEntryPage = pathNameTail.includes('0x'); const isAddContactPage = Boolean(pathname.match(CONTACT_ADD_ROUTE)); const isEditContactPage = Boolean(pathname.match(CONTACT_EDIT_ROUTE)); - const isNetworksFormPage = Boolean(pathname.match(NETWORKS_FORM_ROUTE)); + const isNetworksFormPage = + Boolean(pathname.match(NETWORKS_FORM_ROUTE)) || + Boolean(pathname.match(ADD_NETWORK_ROUTE)); + const addNewNetwork = Boolean(pathname.match(ADD_NETWORK_ROUTE)); const isPopup = getEnvironmentType() === ENVIRONMENT_TYPE_POPUP; const pathnameI18nKey = ROUTES_TO_I18N_KEYS[pathname]; @@ -85,6 +90,7 @@ const mapStateToProps = (state, ownProps) => { initialBreadCrumbRoute, initialBreadCrumbKey, mostRecentOverviewPage: getMostRecentOverviewPage(state), + addNewNetwork, }; }; diff --git a/ui/selectors/selectors.js b/ui/selectors/selectors.js index 688d72f00..f506ec20c 100644 --- a/ui/selectors/selectors.js +++ b/ui/selectors/selectors.js @@ -659,3 +659,12 @@ export function doesAddressRequireLedgerHidConnection(state, address) { addressIsLedger && transportTypePreferenceIsWebHID && webHidIsNotConnected ); } + +/** + * To retrieve the name of the new Network added using add network form + * @param {*} state + * @returns string + */ +export function getNewNetworkAdded(state) { + return state.appState.newNetworkAdded; +} diff --git a/ui/store/actionConstants.js b/ui/store/actionConstants.js index 5f70a4304..96e32a190 100644 --- a/ui/store/actionConstants.js +++ b/ui/store/actionConstants.js @@ -88,7 +88,7 @@ export const CLEAR_PENDING_TOKENS = 'CLEAR_PENDING_TOKENS'; export const SET_FIRST_TIME_FLOW_TYPE = 'SET_FIRST_TIME_FLOW_TYPE'; export const SET_SELECTED_SETTINGS_RPC_URL = 'SET_SELECTED_SETTINGS_RPC_URL'; -export const SET_NETWORKS_TAB_ADD_MODE = 'SET_NETWORKS_TAB_ADD_MODE'; +export const SET_NEW_NETWORK_ADDED = 'SET_NEW_NETWORK_ADDED'; export const LOADING_METHOD_DATA_STARTED = 'LOADING_METHOD_DATA_STARTED'; export const LOADING_METHOD_DATA_FINISHED = 'LOADING_METHOD_DATA_FINISHED'; diff --git a/ui/store/actions.js b/ui/store/actions.js index e94779498..03c23a317 100644 --- a/ui/store/actions.js +++ b/ui/store/actions.js @@ -2446,10 +2446,10 @@ export function setSelectedSettingsRpcUrl(newRpcUrl) { }; } -export function setNetworksTabAddMode(isInAddMode) { +export function setNewNetworkAdded(newNetworkAdded) { return { - type: actionConstants.SET_NETWORKS_TAB_ADD_MODE, - value: isInAddMode, + type: actionConstants.SET_NEW_NETWORK_ADDED, + value: newNetworkAdded, }; } From 4338454e1d2001a08e715a213eee629a96d78188 Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Tue, 26 Oct 2021 10:41:39 -0230 Subject: [PATCH 03/97] Fix builds from forks (#12485) Recently validation was added for our build configuration as part of the PR #12438. This had the unintended consequence of making all builds from forks fail because they don't get secrets injected. Specifically it was the missing `INFURA_PROJECT_ID` that made the builds fail. The Infura project ID is no longer required for building. In practice it's still required for doing anything with a build but running e2e tests, but that's all we need to do in CI anyway. --- development/build/scripts.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/development/build/scripts.js b/development/build/scripts.js index 295590f1a..aa6e8b6ee 100644 --- a/development/build/scripts.js +++ b/development/build/scripts.js @@ -93,7 +93,8 @@ function getInfuraProjectId({ environment, testing }) { } else if (environment === ENVIRONMENT.PRODUCTION) { return getConfigValue('INFURA_PROD_PROJECT_ID'); } - return getConfigValue('INFURA_PROJECT_ID'); + // Skip validation because this is unset on PRs from forks + return metamaskrc.INFURA_PROJECT_ID; } module.exports = createScriptTasks; From 17e3ed943703b69f41ef262383e9c073abc8b919 Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Tue, 26 Oct 2021 15:02:20 -0230 Subject: [PATCH 04/97] Add secrets for beta and Flask builds (#12440) The build script has been updated to embed the correct Infura project ID and Segment write key for beta and Flask builds. These are set via environment variable or config file. They have already been added in CI as environment variables. The Segment production write key has also been moved into the set of environment variables that can be set in the configuration file. This was to make the way we reference it more consistent. The new project IDs and keys are only used in the "production" environment, which right now is the merge step into the `master` branch. This is appropriate for Flask, but it doesn't match our plan for how the beta release would get created. In a future PR, when the beta release automation work is completed, the conditions for when the beta secrets are used should be updated to ensure they're used only for the beta builds. Closes #11896 --- development/build/scripts.js | 55 +++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/development/build/scripts.js b/development/build/scripts.js index aa6e8b6ee..917fd0a88 100644 --- a/development/build/scripts.js +++ b/development/build/scripts.js @@ -29,10 +29,15 @@ const bifyModuleGroups = require('bify-module-groups'); const metamaskrc = require('rc')('metamask', { INFURA_PROJECT_ID: process.env.INFURA_PROJECT_ID, + INFURA_BETA_PROJECT_ID: process.env.INFURA_BETA_PROJECT_ID, + INFURA_FLASK_PROJECT_ID: process.env.INFURA_FLASK_PROJECT_ID, INFURA_PROD_PROJECT_ID: process.env.INFURA_PROD_PROJECT_ID, ONBOARDING_V2: process.env.ONBOARDING_V2, SEGMENT_HOST: process.env.SEGMENT_HOST, SEGMENT_WRITE_KEY: process.env.SEGMENT_WRITE_KEY, + SEGMENT_BETA_WRITE_KEY: process.env.SEGMENT_BETA_WRITE_KEY, + SEGMENT_FLASK_WRITE_KEY: process.env.SEGMENT_FLASK_WRITE_KEY, + SEGMENT_PROD_WRITE_KEY: process.env.SEGMENT_PROD_WRITE_KEY, SENTRY_DSN_DEV: process.env.SENTRY_DSN_DEV || 'https://f59f3dd640d2429d9d0e2445a87ea8e1@sentry.io/273496', @@ -50,6 +55,7 @@ const { const { createRemoveFencedCodeTransform, } = require('./transforms/remove-fenced-code'); +const { BuildTypes } = require('./utils'); /** * The build environment. This describes the environment this build was produced in. @@ -83,18 +89,47 @@ function getConfigValue(key) { * Get the appropriate Infura project ID. * * @param {object} options - The Infura project ID options. + * @param {BuildTypes} options.buildType - The current build type. * @param {ENVIRONMENT[keyof ENVIRONMENT]} options.environment - The build environment. * @param {boolean} options.testing - Whether the current build is a test build or not. * @returns {string} The Infura project ID. */ -function getInfuraProjectId({ environment, testing }) { +function getInfuraProjectId({ buildType, environment, testing }) { if (testing) { return '00000000000000000000000000000000'; - } else if (environment === ENVIRONMENT.PRODUCTION) { + } else if (environment !== ENVIRONMENT.PRODUCTION) { + // Skip validation because this is unset on PRs from forks. + return metamaskrc.INFURA_PROJECT_ID; + } else if (buildType === BuildTypes.main) { return getConfigValue('INFURA_PROD_PROJECT_ID'); + } else if (buildType === BuildTypes.beta) { + return getConfigValue('INFURA_BETA_PROJECT_ID'); + } else if (buildType === BuildTypes.flask) { + return getConfigValue('INFURA_FLASK_PROJECT_ID'); } - // Skip validation because this is unset on PRs from forks - return metamaskrc.INFURA_PROJECT_ID; + throw new Error(`Invalid build type: '${buildType}'`); +} + +/** + * Get the appropriate Segment write key. + * + * @param {object} options - The Segment write key options. + * @param {BuildTypes} options.buildType - The current build type. + * @param {keyof ENVIRONMENT} options.enviroment - The current build environment. + * @returns {string} The Segment write key. + */ +function getSegmentWriteKey({ buildType, environment }) { + if (environment !== ENVIRONMENT.PRODUCTION) { + // Skip validation because this is unset on PRs from forks, and isn't necessary for development builds. + return metamaskrc.SEGMENT_WRITE_KEY; + } else if (buildType === BuildTypes.main) { + return getConfigValue('SEGMENT_PROD_WRITE_KEY'); + } else if (buildType === BuildTypes.beta) { + return getConfigValue('SEGMENT_BETA_WRITE_KEY'); + } else if (buildType === BuildTypes.flask) { + return getConfigValue('SEGMENT_FLASK_WRITE_KEY'); + } + throw new Error(`Invalid build type: '${buildType}'`); } module.exports = createScriptTasks; @@ -686,17 +721,9 @@ function getEnvironmentVariables({ buildType, devMode, testing }) { CONF: devMode ? metamaskrc : {}, SENTRY_DSN: process.env.SENTRY_DSN, SENTRY_DSN_DEV: metamaskrc.SENTRY_DSN_DEV, - INFURA_PROJECT_ID: getInfuraProjectId({ environment, testing }), + INFURA_PROJECT_ID: getInfuraProjectId({ buildType, environment, testing }), SEGMENT_HOST: metamaskrc.SEGMENT_HOST, - // When we're in the 'production' environment we will use a specific key only set in CI - // Otherwise we'll use the key from .metamaskrc or from the environment variable. If - // the value of SEGMENT_WRITE_KEY that we envify is undefined then no events will be tracked - // in the build. This is intentional so that developers can contribute to MetaMask without - // inflating event volume. - SEGMENT_WRITE_KEY: - environment === ENVIRONMENT.PRODUCTION - ? process.env.SEGMENT_PROD_WRITE_KEY - : metamaskrc.SEGMENT_WRITE_KEY, + SEGMENT_WRITE_KEY: getSegmentWriteKey({ buildType, environment }), SWAPS_USE_DEV_APIS: process.env.SWAPS_USE_DEV_APIS === '1', ONBOARDING_V2: metamaskrc.ONBOARDING_V2 === '1', }; From 681ab33537921401d47f45e85c912fce0be773e4 Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Wed, 27 Oct 2021 11:15:02 -0230 Subject: [PATCH 05/97] Update `@metamask/logo` from v3.0.1 to v3.1.0 (#12490) The new logo update includes the gradient feature. The version of `jsdom` we're using via Jest has also been updated in the lockfile. This was necessary to get unit tests to pass because the version we were using previously didn't support `replaceChildren`, which was added in `jsdom@6.6.0` [1]. [1]: https://github.com/jsdom/jsdom/commit/04f6c13f4a4d387c7fc979b8f62c6f68d8a0c639 Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 53 +++++++++++++++++++---------------------------------- 1 file changed, 19 insertions(+), 34 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4f8e244cc..3143017b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2863,9 +2863,9 @@ mersenne-twister "^1.1.0" "@metamask/logo@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@metamask/logo/-/logo-3.0.1.tgz#9c0758d9abc56345c5e4ed01cac22a6d2d452793" - integrity sha512-EV1BqyUI/GX1X9pTIydBRZ94c7Zx4Vlsl6V/zIOqk8Zw9mhlLG46lRQSBCq8syCvuGeKVMj/1LYsf/sNVf/SsA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/@metamask/logo/-/logo-3.1.0.tgz#6b7b9b90b6d846583558de855511d34796735855" + integrity sha512-W0FBwIaG1pC4Vk/ZdUJYv7PDjnAbQJro3yhEXN7WXEdz8kyVcxFb6dj0Dpe6ytaveYiqIL6+iDDWMevzU2MpVw== dependencies: gl-mat4 "1.1.4" gl-vec3 "1.0.3" @@ -4835,10 +4835,10 @@ acorn@^7.0.0, acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.0.tgz#52311fd7037ae119cbb134309e901aa46295b3fe" - integrity sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA== +acorn@^8.2.4: + version "8.5.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" + integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== addons-linter@1.14.0: version "1.14.0" @@ -16019,7 +16019,7 @@ is-posix-bracket@^0.1.0: resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= -is-potential-custom-element-name@^1.0.0: +is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== @@ -16898,12 +16898,12 @@ jsdom@^11.2.0: xml-name-validator "^2.0.1" jsdom@^16.4.0: - version "16.5.2" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.2.tgz#583fac89a0aea31dbf6237e7e4bedccd9beab472" - integrity sha512-JxNtPt9C1ut85boCbJmffaQ06NBnzkQY/MWO3YxPW8IWS38A26z+B1oBvA9LwKrytewdfymnhi4UNH3/RAgZrg== + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== dependencies: abab "^2.0.5" - acorn "^8.1.0" + acorn "^8.2.4" acorn-globals "^6.0.0" cssom "^0.4.4" cssstyle "^2.3.0" @@ -16911,12 +16911,13 @@ jsdom@^16.4.0: decimal.js "^10.2.1" domexception "^2.0.1" escodegen "^2.0.0" + form-data "^3.0.0" html-encoding-sniffer "^2.0.1" - is-potential-custom-element-name "^1.0.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" nwsapi "^2.2.0" parse5 "6.0.1" - request "^2.88.2" - request-promise-native "^1.0.9" saxes "^5.0.1" symbol-tree "^3.2.4" tough-cookie "^4.0.0" @@ -16926,7 +16927,7 @@ jsdom@^16.4.0: whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" whatwg-url "^8.5.0" - ws "^7.4.4" + ws "^7.4.6" xml-name-validator "^3.0.0" jsesc@^1.3.0: @@ -24037,13 +24038,6 @@ request-promise-core@1.1.1: dependencies: lodash "^4.13.1" -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - request-promise-native@^1.0.3: version "1.0.5" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" @@ -24053,15 +24047,6 @@ request-promise-native@^1.0.3: stealthy-require "^1.1.0" tough-cookie ">=2.3.3" -request-promise-native@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - request@^2.79.0, request@^2.83.0, request@^2.85.0, request@^2.88.2, request@~2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -25676,7 +25661,7 @@ static-module@^3.0.2: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -stealthy-require@^1.1.0, stealthy-require@^1.1.1: +stealthy-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= @@ -28753,7 +28738,7 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" -ws@7.1.0, ws@7.4.6, ws@^1.1.0, ws@^3.0.0, ws@^5.1.1, ws@^7, ws@^7.2.0, ws@^7.4.0, ws@^7.4.4, ws@^7.4.6, ws@~7.4.2: +ws@7.1.0, ws@7.4.6, ws@^1.1.0, ws@^3.0.0, ws@^5.1.1, ws@^7, ws@^7.2.0, ws@^7.4.0, ws@^7.4.6, ws@~7.4.2: version "7.4.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== From 8e5acee42199aeabd46cf2cfb7a9dfe680fe540f Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Wed, 27 Oct 2021 13:20:55 -0230 Subject: [PATCH 06/97] Fix production builds (#12488) The production build was accidentally broken in #12440 because of a merge conflict with a #12441 that wasn't initially noticed. The conflict was the renaming of the `BuildTypes` variable to `BuildType`. This variable is used to check the current build type, but only for production builds. `BuildTypes` is `undefined`, so this would result in a crash when that enum was used. --- development/build/scripts.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/development/build/scripts.js b/development/build/scripts.js index 917fd0a88..6d0128639 100644 --- a/development/build/scripts.js +++ b/development/build/scripts.js @@ -55,7 +55,7 @@ const { const { createRemoveFencedCodeTransform, } = require('./transforms/remove-fenced-code'); -const { BuildTypes } = require('./utils'); +const { BuildType } = require('./utils'); /** * The build environment. This describes the environment this build was produced in. @@ -89,7 +89,7 @@ function getConfigValue(key) { * Get the appropriate Infura project ID. * * @param {object} options - The Infura project ID options. - * @param {BuildTypes} options.buildType - The current build type. + * @param {BuildType} options.buildType - The current build type. * @param {ENVIRONMENT[keyof ENVIRONMENT]} options.environment - The build environment. * @param {boolean} options.testing - Whether the current build is a test build or not. * @returns {string} The Infura project ID. @@ -100,11 +100,11 @@ function getInfuraProjectId({ buildType, environment, testing }) { } else if (environment !== ENVIRONMENT.PRODUCTION) { // Skip validation because this is unset on PRs from forks. return metamaskrc.INFURA_PROJECT_ID; - } else if (buildType === BuildTypes.main) { + } else if (buildType === BuildType.main) { return getConfigValue('INFURA_PROD_PROJECT_ID'); - } else if (buildType === BuildTypes.beta) { + } else if (buildType === BuildType.beta) { return getConfigValue('INFURA_BETA_PROJECT_ID'); - } else if (buildType === BuildTypes.flask) { + } else if (buildType === BuildType.flask) { return getConfigValue('INFURA_FLASK_PROJECT_ID'); } throw new Error(`Invalid build type: '${buildType}'`); @@ -114,7 +114,7 @@ function getInfuraProjectId({ buildType, environment, testing }) { * Get the appropriate Segment write key. * * @param {object} options - The Segment write key options. - * @param {BuildTypes} options.buildType - The current build type. + * @param {BuildType} options.buildType - The current build type. * @param {keyof ENVIRONMENT} options.enviroment - The current build environment. * @returns {string} The Segment write key. */ @@ -122,11 +122,11 @@ function getSegmentWriteKey({ buildType, environment }) { if (environment !== ENVIRONMENT.PRODUCTION) { // Skip validation because this is unset on PRs from forks, and isn't necessary for development builds. return metamaskrc.SEGMENT_WRITE_KEY; - } else if (buildType === BuildTypes.main) { + } else if (buildType === BuildType.main) { return getConfigValue('SEGMENT_PROD_WRITE_KEY'); - } else if (buildType === BuildTypes.beta) { + } else if (buildType === BuildType.beta) { return getConfigValue('SEGMENT_BETA_WRITE_KEY'); - } else if (buildType === BuildTypes.flask) { + } else if (buildType === BuildType.flask) { return getConfigValue('SEGMENT_FLASK_WRITE_KEY'); } throw new Error(`Invalid build type: '${buildType}'`); From 05a80ebeba892d54d4cf3e0ff2bcc2cc8b801981 Mon Sep 17 00:00:00 2001 From: ryanml Date: Wed, 27 Oct 2021 09:55:14 -0700 Subject: [PATCH 07/97] Adding collectibles feature flag, default NFT tab (#12463) * Adding COLLECTIBLES_V1 feature flag * Adding NFT's tab to home screen, default CollectiblesList view * Handling null children in Tabs component --- app/_locales/en/messages.json | 12 +++ app/images/diamond.png | Bin 0 -> 2725 bytes development/build/scripts.js | 2 + .../collectibles-list.component.js | 84 ++++++++++++++++++ ui/components/app/collectibles-list/index.js | 1 + ui/components/ui/tabs/tabs.component.js | 16 ++-- ui/pages/home/home.component.js | 15 ++++ 7 files changed, 124 insertions(+), 6 deletions(-) create mode 100644 app/images/diamond.png create mode 100644 ui/components/app/collectibles-list/collectibles-list.component.js create mode 100644 ui/components/app/collectibles-list/index.js diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 9ab00d821..6bc15f393 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -82,6 +82,9 @@ "addFriendsAndAddresses": { "message": "Add friends and addresses you trust" }, + "addNFT": { + "message": "Add NFT" + }, "addNetwork": { "message": "Add Network" }, @@ -1542,6 +1545,9 @@ "message": "Nonce is higher than suggested nonce of $1", "description": "The next nonce according to MetaMask's internal logic" }, + "nfts": { + "message": "NFTs" + }, "noAccountsFound": { "message": "No accounts found for the given search query" }, @@ -1554,6 +1560,12 @@ "noConversionRateAvailable": { "message": "No Conversion Rate Available" }, + "noNFTs": { + "message": "No NFTs to show" + }, + "noNFTsDetails": { + "message": "Your NFTs will show up here. If you don't see your NFT, try importing manually." + }, "noThanks": { "message": "No Thanks" }, diff --git a/app/images/diamond.png b/app/images/diamond.png new file mode 100644 index 0000000000000000000000000000000000000000..5c04fae081c412500550f65890f589520b66609e GIT binary patch literal 2725 zcma);`9Bkm1ID*pIVU#_g{Hj(}JHziU$Ay@WU-(4u9zJM^>jf|M=YP z^tnIa4zWap0|30j{}m8WTq^OW1cp0Um;oAx!E1j4`#n<|Qvjejm-on%0|4OBhr>*r zqJit~{*H18v96~DgE@=c=$aSf*KKLA2+Glkt=6cc^9K0|xiU%ZRMLr(Ec$?rqj=cNCU3T=h9J!);MVNK} z{$tGi9lD6VR21Y@@Y>F7JcTXA3_o$@!K&Uuhv;-O;pCv`Il3gyN%e6+C%v+J-qwa@ zA9`lF{KunjQRKBzB~W>T=AA*5YM0+6kjEXeTw^z48(4P(L;OCu{d)B@qhnT!^&6YD zHI5h`UslA>fBdLp5~tU=iwR(KG;#am#hI%H7h(pGNaR=WR_KEVR~pp*ajZ9X*goJn ziNiLG?9HE_o1H)7oc6MgoHh8Oh1qy)Srm^zh^%M{SEZE|7K+cz>e*#*RS}lPX`zuM zAhmiWA~ez*(q8wS*5{omU^^U1A^W3Z9x5tbuNApPshycOd~OY~(B1tUeiwD5+w=T0 zIWC_P*M;5rJj26rbSG56AeS~Xf3Ax?ONlae-3)Xd}9w|{Z)*rAuIR_ zU?%ORq}R^(J)=2e1$aDa$hSEx+PvT*3WLFMg}@A=$Yj6x;9|~aEV^FHv;o#_LGvec zU`%*@LpG~PzFYTI(!o)7`tL;A%Ck1;$NE?Uy5>sZWJE;JJfO(TNLl}$GuzfhXQ{Zj zSeL+!m_$4-p#Bo&jb(>(Ba^%0qcs;g}@BFv>hZL~O z1f?rZSEz1+vH~1|vhNE+!eUJ=l#VXc1>KFLFwMcKGGkDgMTOPPp2p0-NMcqOaHVXT zAwqb&L^#w@vBa_5e5$X067*CicR<7zAX6`{=K?7vc$sQw-`X$gNg~xr549w)9w56y z&J8xlXh`{o6x@&m5K%M+#^z-@)X-3`|6)xuJH^^qk1R-NJu^u86>VVsRX4I@ZhR#` z{$0sNS@6lb6{@(epI1cDObRJK*O66{VQYw5JvoEzJb$vizfgnp3ml?y7RHfs?~Mkx zUZuA`#!%MqUmoheI^Mm3wk^2N+D1AZY8l5EjNNS2P7!97L_Q#X+fzpu2;oEWx&GBC*GGWga!`Ny8HjcT z?1`AK3Psg?xSYBqEbWw$*d4sgrP2*keI$AaucN-1n==cAA7HU^RKMMWAD`oHc}V?^ z7Kln-Sa}iED^dn>q;G!(S8vQ%lizeK|JmRGpJ}ug`Jv|4hwkmtt(P{ zAC%kLH=o;S1y1{U1uWn|_AKsN+>VU_h&erI>K)uHxUjgqd;bQN>*zQj8>N*EieKVu zbADTb*W>(cW0Kk)V*%xB^ls zUEeu8Y3VpRy5Qg^7BcMq8k_w%sV!;We7eZSV5C_J;uVbvPUVbnt|C*CfBpJF4GVfw zyaby~*qrtgWGfi4)>bZv?ckW_W$=D>IW@QcZpD-eFXs;yo}jJM}w!05DE zp#sQR9U92)EpP6_p|(C=+ABUOs$`eQATa` zdy)-4rdW3oTOzjv)mNE8lrgoMI_b3kAYR4z{Xp%`2hNuI+{v zdm9F{3*qxx@<(>q)e{Ow0-BY3U#Y1_JeO{g3>qy5^+>ZN-sH+i{^t0`6D=LyX$&4| zD=gsGV(3()fOD%$PMMZRW0>FaArSN!AZ1Tf1m+5@E#h^X1E2BjNJG5bNEn)#fKUVG z@3M@_&jVvEt0-t3_`Go)*XfLb*HR5>%#F*_RLRv4P`v!q#<0lW8R4Uk=-zo*5RwqN z;>)?-j2lBs3e@OMMKilQQvUT}Q#mHovr=Wxp`aUQ36Ze&=FdP3UbvoV>qP0Y7}n6T(r2<+V^_CaB9q`K$dHUU7%rHw_cd#Gk(pl& z;_`Xpzqh-5;TdD?;XvVls7{bi{m71=V+47&_3dNjh#JI;<+JZdOKcxvdm7PMdxjiV zlLU55rB}1bZuh&LCFMYdiklE0z{rdY!xR@ S{rK}L0q|=#VU1>Yll}v31UVc4 literal 0 HcmV?d00001 diff --git a/development/build/scripts.js b/development/build/scripts.js index 6d0128639..bfdac3840 100644 --- a/development/build/scripts.js +++ b/development/build/scripts.js @@ -33,6 +33,7 @@ const metamaskrc = require('rc')('metamask', { INFURA_FLASK_PROJECT_ID: process.env.INFURA_FLASK_PROJECT_ID, INFURA_PROD_PROJECT_ID: process.env.INFURA_PROD_PROJECT_ID, ONBOARDING_V2: process.env.ONBOARDING_V2, + COLLECTIBLES_V1: process.env.COLLECTIBLES_V1, SEGMENT_HOST: process.env.SEGMENT_HOST, SEGMENT_WRITE_KEY: process.env.SEGMENT_WRITE_KEY, SEGMENT_BETA_WRITE_KEY: process.env.SEGMENT_BETA_WRITE_KEY, @@ -726,6 +727,7 @@ function getEnvironmentVariables({ buildType, devMode, testing }) { SEGMENT_WRITE_KEY: getSegmentWriteKey({ buildType, environment }), SWAPS_USE_DEV_APIS: process.env.SWAPS_USE_DEV_APIS === '1', ONBOARDING_V2: metamaskrc.ONBOARDING_V2 === '1', + COLLECTIBLES_V1: metamaskrc.COLLECTIBLES_V1 === '1', }; } diff --git a/ui/components/app/collectibles-list/collectibles-list.component.js b/ui/components/app/collectibles-list/collectibles-list.component.js new file mode 100644 index 000000000..b0c0161c7 --- /dev/null +++ b/ui/components/app/collectibles-list/collectibles-list.component.js @@ -0,0 +1,84 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import Box from '../../ui/box'; +import Button from '../../ui/button'; +import Typography from '../../ui/typography/typography'; +import { + COLORS, + TYPOGRAPHY, + TEXT_ALIGN, + BLOCK_SIZES, + JUSTIFY_CONTENT, + FLEX_DIRECTION, +} from '../../../helpers/constants/design-system'; +import { useI18nContext } from '../../../hooks/useI18nContext'; +import { getEnvironmentType } from '../../../../app/scripts/lib/util'; +import { ENVIRONMENT_TYPE_POPUP } from '../../../../shared/constants/app'; + +export default function CollectiblesList({ onAddNFT }) { + const collectibles = []; + const t = useI18nContext(); + const blockSizes = { + copy: + getEnvironmentType() === ENVIRONMENT_TYPE_POPUP + ? BLOCK_SIZES.TWO_THIRDS + : BLOCK_SIZES.ONE_THIRD, + button: + getEnvironmentType() === ENVIRONMENT_TYPE_POPUP + ? BLOCK_SIZES.HALF + : BLOCK_SIZES.ONE_FIFTH, + }; + + return ( +
+ {collectibles.length > 0 ? ( + {JSON.stringify(collectibles)} + ) : ( + + + + + + {t('noNFTs')} + + + + + {t('noNFTsDetails')} + + + + + + + + + + + + + )} +
+ ); +} + +CollectiblesList.propTypes = { + onAddNFT: PropTypes.func.isRequired, +}; diff --git a/ui/components/app/collectibles-list/index.js b/ui/components/app/collectibles-list/index.js new file mode 100644 index 000000000..ab3fb9b56 --- /dev/null +++ b/ui/components/app/collectibles-list/index.js @@ -0,0 +1 @@ +export { default } from './collectibles-list.component'; diff --git a/ui/components/ui/tabs/tabs.component.js b/ui/components/ui/tabs/tabs.component.js index 6c091e5a2..c0f9dc923 100644 --- a/ui/components/ui/tabs/tabs.component.js +++ b/ui/components/ui/tabs/tabs.component.js @@ -42,9 +42,9 @@ export default class Tabs extends Component { } renderTabs() { - const numberOfTabs = React.Children.count(this.props.children); + const numberOfTabs = React.Children.count(this._getValidChildren()); - return React.Children.map(this.props.children, (child, index) => { + return React.Children.map(this._getValidChildren(), (child, index) => { const tabName = child?.props.name; return ( child && @@ -58,7 +58,7 @@ export default class Tabs extends Component { } renderActiveTabContent() { - const { children } = this.props; + const children = this._getValidChildren(); const { activeTabIndex } = this.state; if ( @@ -92,8 +92,12 @@ export default class Tabs extends Component { * @private */ _findChildByName(name) { - return React.Children.toArray(this.props.children).findIndex( - (c) => c?.props.name === name, - ); + return this._getValidChildren().findIndex((c) => c?.props.name === name); + } + + // This ignores any 'null' child elements that are a result of a conditional + // based on a feature flag setting. + _getValidChildren() { + return React.Children.toArray(this.props.children).filter(Boolean); } } diff --git a/ui/pages/home/home.component.js b/ui/pages/home/home.component.js index a6e91ba88..c46449cfd 100644 --- a/ui/pages/home/home.component.js +++ b/ui/pages/home/home.component.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { Redirect, Route } from 'react-router-dom'; import { formatDate } from '../../helpers/utils/util'; import AssetList from '../../components/app/asset-list'; +import CollectiblesList from '../../components/app/collectibles-list'; import HomeNotification from '../../components/app/home-notification'; import MultipleNotifications from '../../components/app/multiple-notifications'; import TransactionList from '../../components/app/transaction-list'; @@ -428,6 +429,20 @@ export default class Home extends PureComponent { } /> + {process.env.COLLECTIBLES_V1 ? ( + + { + console.log('Added NFT'); + }} + /> + + ) : null} Date: Wed, 27 Oct 2021 18:09:23 +0000 Subject: [PATCH 08/97] Improve token detection wording (#12498) Previous wording implies that we don't have token detection without this feature enabled. --- app/_locales/en/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 6bc15f393..961b60bbf 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -2845,7 +2845,7 @@ "message": "Try again" }, "turnOnTokenDetection": { - "message": "Turn on Token Detection" + "message": "Turn on enhanced token detection" }, "typePassword": { "message": "Type your MetaMask password" From 6e928c661e09ef3f206de0fda627fe9b546cd3dc Mon Sep 17 00:00:00 2001 From: David Walsh Date: Wed, 27 Oct 2021 18:54:18 -0500 Subject: [PATCH 09/97] Create function for hardware keyring checking (#12457) --- .../account-details-modal/account-details-modal.component.js | 3 ++- ui/components/app/wallet-overview/eth-overview.js | 3 ++- ui/components/app/wallet-overview/token-overview.js | 3 ++- ui/helpers/utils/hardware.js | 3 +++ 4 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 ui/helpers/utils/hardware.js diff --git a/ui/components/app/modals/account-details-modal/account-details-modal.component.js b/ui/components/app/modals/account-details-modal/account-details-modal.component.js index 72767f310..858fc5999 100644 --- a/ui/components/app/modals/account-details-modal/account-details-modal.component.js +++ b/ui/components/app/modals/account-details-modal/account-details-modal.component.js @@ -7,6 +7,7 @@ import QrView from '../../../ui/qr-code'; import EditableLabel from '../../../ui/editable-label'; import Button from '../../../ui/button'; import { getURLHostName } from '../../../../helpers/utils/util'; +import { isHardwareKeyring } from '../../../../helpers/utils/hardware'; export default class AccountDetailsModal extends Component { static propTypes = { @@ -40,7 +41,7 @@ export default class AccountDetailsModal extends Component { let exportPrivateKeyFeatureEnabled = true; // This feature is disabled for hardware wallets - if (keyring?.type?.search('Hardware') !== -1) { + if (isHardwareKeyring(keyring?.type)) { exportPrivateKeyFeatureEnabled = false; } diff --git a/ui/components/app/wallet-overview/eth-overview.js b/ui/components/app/wallet-overview/eth-overview.js index ef822ca05..1579c5830 100644 --- a/ui/components/app/wallet-overview/eth-overview.js +++ b/ui/components/app/wallet-overview/eth-overview.js @@ -34,6 +34,7 @@ import BuyIcon from '../../ui/icon/overview-buy-icon.component'; import SendIcon from '../../ui/icon/overview-send-icon.component'; import { setSwapsFromToken } from '../../../ducks/swaps/swaps'; import IconButton from '../../ui/icon-button'; +import { isHardwareKeyring } from '../../../helpers/utils/hardware'; import WalletOverview from './wallet-overview'; const EthOverview = ({ className }) => { @@ -55,7 +56,7 @@ const EthOverview = ({ className }) => { }); const history = useHistory(); const keyring = useSelector(getCurrentKeyring); - const usingHardwareWallet = keyring.type.search('Hardware') !== -1; + const usingHardwareWallet = isHardwareKeyring(keyring.type); const balanceIsCached = useSelector(isBalanceCached); const showFiat = useSelector(getShouldShowFiat); const selectedAccount = useSelector(getSelectedAccount); diff --git a/ui/components/app/wallet-overview/token-overview.js b/ui/components/app/wallet-overview/token-overview.js index 0b5476261..1db872854 100644 --- a/ui/components/app/wallet-overview/token-overview.js +++ b/ui/components/app/wallet-overview/token-overview.js @@ -7,6 +7,7 @@ import Identicon from '../../ui/identicon'; import Tooltip from '../../ui/tooltip'; import CurrencyDisplay from '../../ui/currency-display'; import { I18nContext } from '../../../contexts/i18n'; +import { isHardwareKeyring } from '../../../helpers/utils/hardware'; import { SEND_ROUTE, BUILD_QUOTE_ROUTE, @@ -42,7 +43,7 @@ const TokenOverview = ({ className, token }) => { }); const history = useHistory(); const keyring = useSelector(getCurrentKeyring); - const usingHardwareWallet = keyring.type.search('Hardware') !== -1; + const usingHardwareWallet = isHardwareKeyring(keyring.type); const { tokensWithBalances } = useTokenTracker([token]); const balanceToRender = tokensWithBalances[0]?.string; const balance = tokensWithBalances[0]?.balance; diff --git a/ui/helpers/utils/hardware.js b/ui/helpers/utils/hardware.js new file mode 100644 index 000000000..b011f7879 --- /dev/null +++ b/ui/helpers/utils/hardware.js @@ -0,0 +1,3 @@ +export function isHardwareKeyring(keyringType = '') { + return keyringType.includes('Hardware'); +} From b5e601bc872d88358dab159d735ea9b32cb140b8 Mon Sep 17 00:00:00 2001 From: David Walsh Date: Wed, 27 Oct 2021 18:55:02 -0500 Subject: [PATCH 10/97] Use TRANSACTION_ENVELOPE_TYPES for legacy transaction type testing (#12455) --- app/scripts/controllers/network/pending-middleware.test.js | 3 ++- app/scripts/controllers/network/util.test.js | 4 +++- app/scripts/controllers/transactions/index.test.js | 6 ++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/scripts/controllers/network/pending-middleware.test.js b/app/scripts/controllers/network/pending-middleware.test.js index ca97063b7..0c8d9bc04 100644 --- a/app/scripts/controllers/network/pending-middleware.test.js +++ b/app/scripts/controllers/network/pending-middleware.test.js @@ -1,5 +1,6 @@ import { strict as assert } from 'assert'; import { GAS_LIMITS } from '../../../../shared/constants/gas'; +import { TRANSACTION_ENVELOPE_TYPES } from '../../../../shared/constants/transaction'; import { txMetaStub } from '../../../../test/stub/tx-meta-stub'; import { createPendingNonceMiddleware, @@ -63,7 +64,7 @@ describe('PendingNonceMiddleware', function () { '0x2cc5a25744486f7383edebbf32003e5a66e18135799593d6b5cdd2bb43674f09', input: '0x', nonce: '0x4', - type: '0x0', + type: TRANSACTION_ENVELOPE_TYPES.LEGACY, to: '0xf231d46dd78806e1dd93442cf33c7671f8538748', transactionIndex: null, value: '0x0', diff --git a/app/scripts/controllers/network/util.test.js b/app/scripts/controllers/network/util.test.js index f8e03ff0f..a1b7097b8 100644 --- a/app/scripts/controllers/network/util.test.js +++ b/app/scripts/controllers/network/util.test.js @@ -2,7 +2,9 @@ import { strict as assert } from 'assert'; import { TRANSACTION_STATUSES, TRANSACTION_TYPES, + TRANSACTION_ENVELOPE_TYPES, } from '../../../../shared/constants/transaction'; + import { formatTxMetaForRpcResult } from './util'; describe('network utils', function () { @@ -92,7 +94,7 @@ describe('network utils', function () { s: '0x18bfc4eeb7ebcfacc3bd59ea100a6834ea3265e65945dbec69aa2a06564fafff', to: '0x1678a085c290ebd122dc42cba69373b5953b831d', transactionIndex: null, - type: '0x0', + type: TRANSACTION_ENVELOPE_TYPES.LEGACY, v: '0x29', value: '0x0', }; diff --git a/app/scripts/controllers/transactions/index.test.js b/app/scripts/controllers/transactions/index.test.js index 3416d47ae..a343fe1ed 100644 --- a/app/scripts/controllers/transactions/index.test.js +++ b/app/scripts/controllers/transactions/index.test.js @@ -12,7 +12,9 @@ import { import { TRANSACTION_STATUSES, TRANSACTION_TYPES, + TRANSACTION_ENVELOPE_TYPES, } from '../../../../shared/constants/transaction'; + import { SECOND } from '../../../../shared/constants/time'; import { GAS_ESTIMATE_TYPES } from '../../../../shared/constants/gas'; import { METAMASK_CONTROLLER_EVENTS } from '../../metamask-controller'; @@ -544,7 +546,7 @@ describe('Transaction Controller', function () { txParams: { to: VALID_ADDRESS, from: VALID_ADDRESS_TWO, - type: '0x0', + type: TRANSACTION_ENVELOPE_TYPES.LEGACY, }, history: [{}], }, @@ -554,7 +556,7 @@ describe('Transaction Controller', function () { txParams: { from: '0xc684832530fcbddae4b4230a47e991ddcec2831d', to: '0xc684832530fcbddae4b4230a47e991ddcec2831d', - type: '0x0', + type: TRANSACTION_ENVELOPE_TYPES.LEGACY, }, history: [{}], }; From e85248aaf5074a0cb6de40c33e57e6458dc12099 Mon Sep 17 00:00:00 2001 From: Daniel <80175477+dan437@users.noreply.github.com> Date: Thu, 28 Oct 2021 08:53:26 +0200 Subject: [PATCH 11/97] Fix parallel calls for quotes in swaps (#12484) --- app/scripts/controllers/swaps.js | 23 ++++++++++++++--------- app/scripts/controllers/swaps.test.js | 2 +- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/app/scripts/controllers/swaps.js b/app/scripts/controllers/swaps.js index d48eea028..0d69dd77c 100644 --- a/app/scripts/controllers/swaps.js +++ b/app/scripts/controllers/swaps.js @@ -79,7 +79,7 @@ const initialState = { routeState: '', swapsFeatureIsLive: true, useNewSwapsApi: false, - isFetchingQuotes: false, + saveFetchedQuotes: false, swapsQuoteRefreshTime: FALLBACK_QUOTE_REFRESH_TIME, swapsQuotePrefetchingRefreshTime: FALLBACK_QUOTE_REFRESH_TIME, }, @@ -209,7 +209,11 @@ export default class SwapsController { ) { const { chainId } = fetchParamsMetaData; const { - swapsState: { useNewSwapsApi, quotesPollingLimitEnabled }, + swapsState: { + useNewSwapsApi, + quotesPollingLimitEnabled, + saveFetchedQuotes, + }, } = this.store.getState(); if (!fetchParams) { @@ -230,7 +234,9 @@ export default class SwapsController { const indexOfCurrentCall = this.indexOfNewestCallInFlight + 1; this.indexOfNewestCallInFlight = indexOfCurrentCall; - this.setIsFetchingQuotes(true); + if (!saveFetchedQuotes) { + this.setSaveFetchedQuotes(true); + } let [newQuotes] = await Promise.all([ this._fetchTradesInfo(fetchParams, { @@ -241,18 +247,17 @@ export default class SwapsController { ]); const { - swapsState: { isFetchingQuotes }, + swapsState: { saveFetchedQuotes: saveFetchedQuotesAfterResponse }, } = this.store.getState(); - // If isFetchingQuotes is false, it means a user left Swaps (we cleaned the state) + // If saveFetchedQuotesAfterResponse is false, it means a user left Swaps (we cleaned the state) // and we don't want to set any API response with quotes into state. - if (!isFetchingQuotes) { + if (!saveFetchedQuotesAfterResponse) { return [ {}, // quotes null, // selectedAggId ]; } - this.setIsFetchingQuotes(false); newQuotes = mapValues(newQuotes, (quote) => ({ ...quote, @@ -559,10 +564,10 @@ export default class SwapsController { this.store.updateState({ swapsState: { ...swapsState, routeState } }); } - setIsFetchingQuotes(status) { + setSaveFetchedQuotes(status) { const { swapsState } = this.store.getState(); this.store.updateState({ - swapsState: { ...swapsState, isFetchingQuotes: status }, + swapsState: { ...swapsState, saveFetchedQuotes: status }, }); } diff --git a/app/scripts/controllers/swaps.test.js b/app/scripts/controllers/swaps.test.js index 978c705a8..7bc26a5aa 100644 --- a/app/scripts/controllers/swaps.test.js +++ b/app/scripts/controllers/swaps.test.js @@ -135,7 +135,7 @@ const EMPTY_INIT_STATE = { swapsQuoteRefreshTime: 60000, swapsQuotePrefetchingRefreshTime: 60000, swapsUserFeeLevel: '', - isFetchingQuotes: false, + saveFetchedQuotes: false, }, }; From 75b032590b1df15627ec3249b5733fb1a01ba84b Mon Sep 17 00:00:00 2001 From: ryanml Date: Thu, 28 Oct 2021 10:06:16 -0700 Subject: [PATCH 12/97] Adding metrics event for Advanced Options (EditGasDisplay) (#12507) --- .../edit-gas-display.component.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/ui/components/app/edit-gas-display/edit-gas-display.component.js b/ui/components/app/edit-gas-display/edit-gas-display.component.js index f95f6ebc7..e7b7da25e 100644 --- a/ui/components/app/edit-gas-display/edit-gas-display.component.js +++ b/ui/components/app/edit-gas-display/edit-gas-display.component.js @@ -34,6 +34,8 @@ import ActionableMessage from '../../ui/actionable-message/actionable-message'; import { I18nContext } from '../../../contexts/i18n'; import GasTiming from '../gas-timing'; +import { useMetricEvent } from '../../../hooks/useMetricEvent'; + export default function EditGasDisplay({ mode = EDIT_GAS_MODES.MODIFY_IN_PLACE, showEducationButton = false, @@ -119,6 +121,14 @@ export default function EditGasDisplay({ errorKey = 'gasEstimatesUnavailableWarning'; } + const clickedAdvancedOptionsMetricsEvent = useMetricEvent({ + eventOpts: { + category: 'Transactions', + action: 'Edit Screen', + name: 'Clicked "Advanced Options"', + }, + }); + return (
@@ -250,7 +260,10 @@ export default function EditGasDisplay({ !showAdvancedInlineGasIfPossible && (
)} -
- -
+ + + + + + + + {getURLHostName(origin)} + + +
- {t('allowOriginSpendToken', [origin, tokenSymbol])} + {t('allowSpendToken', [tokenSymbol])}
- {t('trustSiteApprovePermission', [origin, tokenSymbol])} + {t('trustSiteApprovePermission', [ + isContract + ? t('contract').toLowerCase() + : t('account').toLowerCase(), + ])}
+ + + + + {ellipsify(toAddress)} + + + + +
{ + const store = configureMockStore([])({ metamask: {} }); + return renderWithProvider(, store); +}; + +const props = { + decimals: 16, + siteImage: 'https://metamask.github.io/test-dapp/metamask-fox.svg', + customTokenAmount: '10', + tokenAmount: '10', + origin: 'https://metamask.github.io/test-dapp/', + tokenSymbol: 'TST', + tokenImage: 'https://metamask.github.io/test-dapp/metamask-fox.svg', + tokenBalance: '15', + showCustomizeGasModal: jest.fn(), + showEditApprovalPermissionModal: jest.fn(), + data: + '0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170', + toAddress: '0x9bc5baf874d2da8d216ae9f137804184ee5afef4', + currentCurrency: 'TST', + nativeCurrency: 'ETH', + ethTransactionTotal: '20', + fiatTransactionTotal: '10', + useNonceField: true, + nextNonce: 1, + customNonceValue: '2', + showCustomizeNonceModal: jest.fn(), + chainId: '1337', + rpcPrefs: {}, + isContract: true, +}; + +describe('ConfirmApproveContent Component', () => { + it('should render Confirm approve page correctly', () => { + const { queryByText, getByText, getAllByText } = renderComponent(props); + expect(queryByText('metamask.github.io')).toBeInTheDocument(); + expect( + queryByText('Give permission to access your TST?'), + ).toBeInTheDocument(); + expect( + queryByText( + 'By granting permission, you are allowing the following contract to access your funds', + ), + ).toBeInTheDocument(); + expect(queryByText('0x9bc5...fef4')).toBeInTheDocument(); + expect(queryByText('View full transaction details')).toBeInTheDocument(); + + expect(queryByText('Edit Permission')).toBeInTheDocument(); + const editPermission = getByText('Edit Permission'); + fireEvent.click(editPermission); + expect(props.showEditApprovalPermissionModal).toHaveBeenCalledTimes(1); + + const editButtons = getAllByText('Edit'); + + expect(queryByText('Transaction Fee')).toBeInTheDocument(); + expect( + queryByText('A fee is associated with this request.'), + ).toBeInTheDocument(); + expect(queryByText(`${props.ethTransactionTotal} ETH`)).toBeInTheDocument(); + fireEvent.click(editButtons[0]); + expect(props.showCustomizeGasModal).toHaveBeenCalledTimes(1); + + expect(queryByText('Nonce')).toBeInTheDocument(); + expect(queryByText('2')).toBeInTheDocument(); + fireEvent.click(editButtons[1]); + expect(props.showCustomizeNonceModal).toHaveBeenCalledTimes(1); + }); +}); diff --git a/ui/pages/confirm-approve/confirm-approve-content/index.scss b/ui/pages/confirm-approve/confirm-approve-content/index.scss index b74a1350d..ec9f8f359 100644 --- a/ui/pages/confirm-approve/confirm-approve-content/index.scss +++ b/ui/pages/confirm-approve/confirm-approve-content/index.scss @@ -5,18 +5,67 @@ width: 100%; font-style: normal; - &__identicon-wrapper { + &__icon-display-content { display: flex; - width: 100%; - justify-content: center; - margin-top: 22px; - padding-left: 24px; - padding-right: 24px; + height: 51px; + width: 65%; + margin-top: 16px; + padding: 12px 12px 14px 12px; + border: 1px solid $ui-1; + box-sizing: border-box; + border-radius: 100px; + align-items: center; + position: relative; + } + + &__metafoxlogo, + &__siteinfo { + position: absolute; + } + + &__siteinfo { + left: 39px; + } + + &__address-display-content { + display: flex; + height: 27px; + width: 50%; + padding: 12px 12px 14px 12px; + background-color: $ui-1; + border-radius: 100px; + align-items: center; + } + + &__siteimage-identicon { + width: 33px; + height: 33px; + border: solid #fff; + } + + &__address-identicon { + margin: 4px 8px 0 4px; + } + + &__copy-address, + &__etherscan-link { + padding: 0 0 0 8px; + } + + &__etherscan-link { + img { + width: 9px; + height: 9px; + } + } + + .app-header__logo-container { + margin-right: 0; } - &__identicon { - width: 48px; - height: 48px; + .app-header__metafox-logo--icon { + height: 33px; + width: 33px; } &__full-tx-content { diff --git a/ui/pages/confirm-approve/confirm-approve.js b/ui/pages/confirm-approve/confirm-approve.js index 32792e8ed..dba7c95e2 100644 --- a/ui/pages/confirm-approve/confirm-approve.js +++ b/ui/pages/confirm-approve/confirm-approve.js @@ -1,4 +1,4 @@ -import React, { useEffect, useRef, useState } from 'react'; +import React, { useEffect, useRef, useState, useCallback } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { useParams } from 'react-router-dom'; import ConfirmTransactionBase from '../confirm-transaction-base'; @@ -14,6 +14,7 @@ import { getTokenAddressParam, getTokenValueParam, } from '../../helpers/utils/token-util'; +import { readAddressAsContract } from '../../../shared/modules/contract-utils'; import { useTokenTracker } from '../../hooks/useTokenTracker'; import { getTokens, getNativeCurrency } from '../../ducks/metamask/metamask'; import { @@ -25,6 +26,8 @@ import { getCustomNonceValue, getNextSuggestedNonce, doesAddressRequireLedgerHidConnection, + getCurrentChainId, + getRpcPrefsForCurrentProvider, } from '../../selectors'; import { useApproveTransaction } from '../../hooks/useApproveTransaction'; @@ -58,6 +61,8 @@ export default function ConfirmApprove() { const useNonceField = useSelector(getUseNonceField); const nextNonce = useSelector(getNextSuggestedNonce); const customNonceValue = useSelector(getCustomNonceValue); + const chainId = useSelector(getCurrentChainId); + const rpcPrefs = useSelector(getRpcPrefsForCurrentProvider); const ledgerWalletRequiredHidConnection = useSelector( doesAddressRequireLedgerHidConnectionByFromAddress(from), @@ -83,6 +88,7 @@ export default function ConfirmApprove() { const tokenSymbol = currentToken?.symbol; const decimals = Number(currentToken?.decimals); + const tokenImage = currentToken?.image; const tokenData = getTokenData(data); const tokenValue = getTokenValueParam(tokenData); const toAddress = getTokenAddressParam(tokenData); @@ -125,6 +131,19 @@ export default function ConfirmApprove() { prevCustomNonce.current = customNonceValue; prevNonce.current = nextNonce; }, [customNonceValue, nextNonce]); + + const [isContract, setIsContract] = useState(false); + const checkIfContract = useCallback(async () => { + const { isContractAddress } = await readAddressAsContract( + global.eth, + toAddress, + ); + setIsContract(isContractAddress); + }, [setIsContract, toAddress]); + useEffect(() => { + checkIfContract(); + }, [checkIfContract]); + const { origin } = transaction; const formattedOrigin = origin ? origin[0].toUpperCase() + origin.slice(1) @@ -158,6 +177,7 @@ export default function ConfirmApprove() { tokenAmount={tokenAmount} origin={formattedOrigin} tokenSymbol={tokenSymbol} + tokenImage={tokenImage} tokenBalance={tokenBalance} showCustomizeGasModal={approveTransaction} showEditApprovalPermissionModal={({ @@ -222,6 +242,9 @@ export default function ConfirmApprove() { ledgerWalletRequiredHidConnection={ ledgerWalletRequiredHidConnection } + chainId={chainId} + rpcPrefs={rpcPrefs} + isContract={isContract} /> {showCustomizeGasPopover && ( Date: Thu, 28 Oct 2021 12:18:48 -0700 Subject: [PATCH 15/97] Updating dapp learn more link (#12515) --- .../permissions-connect-footer.component.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/components/app/permissions-connect-footer/permissions-connect-footer.component.js b/ui/components/app/permissions-connect-footer/permissions-connect-footer.component.js index 52713aeb1..635ebbb96 100644 --- a/ui/components/app/permissions-connect-footer/permissions-connect-footer.component.js +++ b/ui/components/app/permissions-connect-footer/permissions-connect-footer.component.js @@ -17,7 +17,7 @@ export default class PermissionsConnectFooter extends Component { onClick={() => { global.platform.openTab({ url: - 'https://medium.com/metamask/privacy-mode-is-now-enabled-by-default-1c1c957f4d57', + 'https://metamask.zendesk.com/hc/en-us/articles/4405506066331-User-guide-Dapps', }); }} > From b6673731e2367e119a5fee9a454dd40bd4968948 Mon Sep 17 00:00:00 2001 From: Olusegun Akintayo Date: Thu, 28 Oct 2021 23:31:05 +0400 Subject: [PATCH 16/97] Implement Network Switcher designs (#12260) * Show test networks toggle button in settings/advanced tab. Signed-off-by: Akintayo A. Olusegun * Apply toggle testnet settings and show/hide testnets when on/off Add localhost to testnet. Signed-off-by: Akintayo A. Olusegun * Lint fixes. Signed-off-by: Akintayo A. Olusegun * Show add network button Signed-off-by: Akintayo A. Olusegun * Open full screen when add network is called. Signed-off-by: Akintayo A. Olusegun * Show custonm rpc before testnet rpcs lint fixes. Signed-off-by: Akintayo A. Olusegun * Test cases for network dropdown. Signed-off-by: Akintayo A. Olusegun * Test cases for toggle test networks in advanced tab component. Signed-off-by: Akintayo A. Olusegun * Lint fixes. Signed-off-by: Akintayo A. Olusegun * Fix Locales. Signed-off-by: Akintayo A. Olusegun * E2E Tests: Custom RPC is now called Add Network Signed-off-by: Akintayo A. Olusegun * Lint fix Signed-off-by: Akintayo A. Olusegun * E2E: When Add Network button is clicked, wait for the full screen window to be visible Signed-off-by: Akintayo A. Olusegun * findVisibleElement should use a class. i.e start with a dot Signed-off-by: Akintayo A. Olusegun * Hide Dropdown when Add Netwok is clicked. Only show full screen if it's not already showing. E2E tests passing. Signed-off-by: Akintayo A. Olusegun * Lint fixes Signed-off-by: Akintayo A. Olusegun * Fix tests for jest Signed-off-by: Akintayo A. Olusegun * Testnets are not being shown by default anymore, tests should use Mainnet instead. Signed-off-by: Akintayo A. Olusegun * Import Button from ui Change selector name to getShowTestnetworks Fix button to show full width Signed-off-by: Akintayo A. Olusegun * Fix e2e tests Signed-off-by: Akintayo A. Olusegun * Remove localhost from INFURA provider types. Signed-off-by: Akintayo A. Olusegun * Fix errors in Advanced Tab Component tests Signed-off-by: Akintayo A. Olusegun * Lint fixes Signed-off-by: Akintayo A. Olusegun * Fix unit tests for advanced tab component. Signed-off-by: Akintayo A. Olusegun * Remove deleted elements from e2e tests Signed-off-by: Akintayo A. Olusegun * Make sure all tests passed. Signed-off-by: Akintayo A. Olusegun * Lint fixes Signed-off-by: Akintayo A. Olusegun --- app/_locales/am/messages.json | 3 - app/_locales/ar/messages.json | 3 - app/_locales/bg/messages.json | 3 - app/_locales/bn/messages.json | 3 - app/_locales/ca/messages.json | 3 - app/_locales/cs/messages.json | 3 - app/_locales/da/messages.json | 3 - app/_locales/de/messages.json | 3 - app/_locales/el/messages.json | 3 - app/_locales/en/messages.json | 9 +- app/_locales/es/messages.json | 3 - app/_locales/es_419/messages.json | 3 - app/_locales/et/messages.json | 3 - app/_locales/fa/messages.json | 3 - app/_locales/fi/messages.json | 3 - app/_locales/fr/messages.json | 3 - app/_locales/he/messages.json | 3 - app/_locales/hi/messages.json | 3 - app/_locales/hn/messages.json | 3 - app/_locales/hr/messages.json | 3 - app/_locales/ht/messages.json | 3 - app/_locales/hu/messages.json | 3 - app/_locales/id/messages.json | 3 - app/_locales/it/messages.json | 3 - app/_locales/ja/messages.json | 3 - app/_locales/kn/messages.json | 3 - app/_locales/ko/messages.json | 3 - app/_locales/lt/messages.json | 3 - app/_locales/lv/messages.json | 3 - app/_locales/ms/messages.json | 3 - app/_locales/nl/messages.json | 3 - app/_locales/no/messages.json | 3 - app/_locales/ph/messages.json | 3 - app/_locales/pl/messages.json | 3 - app/_locales/pt/messages.json | 3 - app/_locales/pt_BR/messages.json | 3 - app/_locales/ro/messages.json | 3 - app/_locales/ru/messages.json | 3 - app/_locales/sk/messages.json | 3 - app/_locales/sl/messages.json | 3 - app/_locales/sr/messages.json | 3 - app/_locales/sv/messages.json | 3 - app/_locales/sw/messages.json | 3 - app/_locales/ta/messages.json | 3 - app/_locales/th/messages.json | 3 - app/_locales/tl/messages.json | 3 - app/_locales/tr/messages.json | 3 - app/_locales/uk/messages.json | 3 - app/_locales/vi/messages.json | 3 - app/_locales/zh_CN/messages.json | 3 - app/_locales/zh_TW/messages.json | 3 - app/scripts/controllers/preferences.js | 1 + app/scripts/first-time-state.js | 10 +- shared/constants/network.js | 9 ++ test/e2e/tests/custom-rpc-history.spec.js | 46 ++++--- test/e2e/tests/provider-events.spec.js | 10 +- .../app/dropdowns/network-dropdown.js | 102 +++++++-------- .../app/dropdowns/network-dropdown.test.js | 119 +++++++++++++++--- ui/components/app/network-display/index.scss | 4 + ui/css/design-system/colors.scss | 2 + ui/css/itcss/components/network.scss | 4 + ui/ducks/metamask/metamask.js | 1 + ui/helpers/constants/design-system.js | 1 + .../advanced-tab/advanced-tab.component.js | 32 +++++ .../advanced-tab.component.test.js | 31 +++-- .../advanced-tab/advanced-tab.container.js | 11 +- .../advanced-tab/advanced-tab.stories.js | 1 + .../networks-tab/networks-tab.component.js | 1 + .../networks-tab/networks-tab.constants.js | 12 ++ ui/selectors/selectors.js | 5 + ui/store/actions.js | 4 + 71 files changed, 308 insertions(+), 257 deletions(-) diff --git a/app/_locales/am/messages.json b/app/_locales/am/messages.json index e45655ca1..5967d2d37 100644 --- a/app/_locales/am/messages.json +++ b/app/_locales/am/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "ክፍያ መጨመር የመከወኛ ጊዜን ሊቀንስ ቢችልም ይህ ግን ዋስትና የለውም።" }, - "customRPC": { - "message": "ብጁ RPC" - }, "customToken": { "message": "ብጁ ተለዋጭ ስም" }, diff --git a/app/_locales/ar/messages.json b/app/_locales/ar/messages.json index 9c99dda68..8aed734e3 100644 --- a/app/_locales/ar/messages.json +++ b/app/_locales/ar/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "قد تؤدي زيادة الرسوم إلى تقليل أزمنة المعالجة، ولكن ذلك غير مضمون." }, - "customRPC": { - "message": "آر بي سي مخصص" - }, "customToken": { "message": "عملة رمزية مخصصة" }, diff --git a/app/_locales/bg/messages.json b/app/_locales/bg/messages.json index 2b3d88f6a..c4e096272 100644 --- a/app/_locales/bg/messages.json +++ b/app/_locales/bg/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "Увеличаването на таксата може да намали времето за обработка, но това не е гарантирано." }, - "customRPC": { - "message": "RPC по избор" - }, "customToken": { "message": "Персонализиран маркер" }, diff --git a/app/_locales/bn/messages.json b/app/_locales/bn/messages.json index 0cc36e43d..a6f8d1bbf 100644 --- a/app/_locales/bn/messages.json +++ b/app/_locales/bn/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "ফী বৃদ্ধি করা প্রক্রিয়াকরণের সময় কমাতে পারে, কিন্তু সেটির নিশ্চয়তা দেওয়া হয় না।" }, - "customRPC": { - "message": "কাস্টম RPC" - }, "customToken": { "message": "কাস্টম টোকেন" }, diff --git a/app/_locales/ca/messages.json b/app/_locales/ca/messages.json index 2770e8e0a..e27d823f6 100644 --- a/app/_locales/ca/messages.json +++ b/app/_locales/ca/messages.json @@ -254,9 +254,6 @@ "customGasSubTitle": { "message": "Augmentar la tarifa pot disminuir els temps de processament, però això no està garantit." }, - "customRPC": { - "message": "RPC a mida" - }, "customToken": { "message": "Fitxa a Mida" }, diff --git a/app/_locales/cs/messages.json b/app/_locales/cs/messages.json index 8a9be7f3a..910a151e6 100644 --- a/app/_locales/cs/messages.json +++ b/app/_locales/cs/messages.json @@ -88,9 +88,6 @@ "customGas": { "message": "Nastavit palivo" }, - "customRPC": { - "message": "Vlastní RPC" - }, "customToken": { "message": "Vlastní token" }, diff --git a/app/_locales/da/messages.json b/app/_locales/da/messages.json index 45e4a1dc7..ab0aa0bdf 100644 --- a/app/_locales/da/messages.json +++ b/app/_locales/da/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "Forøgelse af gebyr kan mindske bearbejdningstiden, men det er ikke en garanti." }, - "customRPC": { - "message": "Tilpasset RPC" - }, "customToken": { "message": "Brugerdefineret Token" }, diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json index 708ca317e..556d416ee 100644 --- a/app/_locales/de/messages.json +++ b/app/_locales/de/messages.json @@ -248,9 +248,6 @@ "customGasSubTitle": { "message": "Höhere Gebühren können Bearbeitungszeiten verkürzen, wofür es allerdings keine Garantie gibt." }, - "customRPC": { - "message": "Spezieller RPC" - }, "customToken": { "message": "Custom-Token" }, diff --git a/app/_locales/el/messages.json b/app/_locales/el/messages.json index 9bdedf733..5cd664263 100644 --- a/app/_locales/el/messages.json +++ b/app/_locales/el/messages.json @@ -254,9 +254,6 @@ "customGasSubTitle": { "message": "Η αύξηση των τελών μπορεί να μειώσει τους χρόνους επεξεργασίας, αλλά αυτό δεν είναι εγγυημένο." }, - "customRPC": { - "message": "Προσαρμοσμένο RPC" - }, "customToken": { "message": "Προσαρμοσμένο Token" }, diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 420fcfd34..84121790f 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -555,9 +555,6 @@ "customGasSubTitle": { "message": "Increasing fee may decrease processing times, but it is not guaranteed." }, - "customRPC": { - "message": "Custom RPC" - }, "customSpendLimit": { "message": "Custom Spend Limit" }, @@ -2188,6 +2185,12 @@ "showSeedPhrase": { "message": "Show Secret Recovery Phrase" }, + "showTestnetNetworks": { + "message": "Test networks" + }, + "showTestnetNetworksDescription": { + "message": "Select this to show test networks in network list" + }, "sigRequest": { "message": "Signature Request" }, diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index 1755531c6..8f1f68bb8 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -470,9 +470,6 @@ "customGasSubTitle": { "message": "Aumentar la cuota puede disminuir los tiempos de procesamiento, pero no está garantizado." }, - "customRPC": { - "message": "RPC personalizada" - }, "customSpendLimit": { "message": "Límite de gastos personalizado" }, diff --git a/app/_locales/es_419/messages.json b/app/_locales/es_419/messages.json index 1755531c6..8f1f68bb8 100644 --- a/app/_locales/es_419/messages.json +++ b/app/_locales/es_419/messages.json @@ -470,9 +470,6 @@ "customGasSubTitle": { "message": "Aumentar la cuota puede disminuir los tiempos de procesamiento, pero no está garantizado." }, - "customRPC": { - "message": "RPC personalizada" - }, "customSpendLimit": { "message": "Límite de gastos personalizado" }, diff --git a/app/_locales/et/messages.json b/app/_locales/et/messages.json index 776ca4870..ae780ebf4 100644 --- a/app/_locales/et/messages.json +++ b/app/_locales/et/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "Tasu suurendamine võib töötlemisaegu vähendada, kuid see ei ole tagatud." }, - "customRPC": { - "message": "Kohandatud RPC" - }, "customToken": { "message": "Kohandatud luba" }, diff --git a/app/_locales/fa/messages.json b/app/_locales/fa/messages.json index aa50426af..d9674bb3f 100644 --- a/app/_locales/fa/messages.json +++ b/app/_locales/fa/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "اضافه نمودن فیس ممکن زمان پروسس را کاهش دهد، اما تضمین نمیشود." }, - "customRPC": { - "message": "RPC رایج" - }, "customToken": { "message": "رمزیاب دلخواه" }, diff --git a/app/_locales/fi/messages.json b/app/_locales/fi/messages.json index c2218c576..bec35fea5 100644 --- a/app/_locales/fi/messages.json +++ b/app/_locales/fi/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "Taksan korottaminen saattaa vähentää käsittelyaikaa, mutta siitä ei anneta takeita." }, - "customRPC": { - "message": "Mukautettu RPC" - }, "customToken": { "message": "Mukautettu tietue" }, diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json index 5deda0758..b6f80f696 100644 --- a/app/_locales/fr/messages.json +++ b/app/_locales/fr/messages.json @@ -248,9 +248,6 @@ "customGasSubTitle": { "message": "Augmenter le tarif peut faire baisser le temps de traitement, mais cela n'est pas garanti." }, - "customRPC": { - "message": "RPC personnalisé" - }, "customToken": { "message": "Jeton personnalisé" }, diff --git a/app/_locales/he/messages.json b/app/_locales/he/messages.json index d1be4f4b6..f03de7c0a 100644 --- a/app/_locales/he/messages.json +++ b/app/_locales/he/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "הגדלת התשלום עשויה לצמצם את זמני העיבוד, אבל אין ערובה לכך." }, - "customRPC": { - "message": "RPC מותאם אישית" - }, "customToken": { "message": "אסימון מותאם אישית" }, diff --git a/app/_locales/hi/messages.json b/app/_locales/hi/messages.json index 9f2105f99..ab50c5328 100644 --- a/app/_locales/hi/messages.json +++ b/app/_locales/hi/messages.json @@ -470,9 +470,6 @@ "customGasSubTitle": { "message": "शुल्क बढ़ाने से प्रसंस्करण समय में कमी हो सकती है, लेकिन इसकी गारंटी नहीं होती है।" }, - "customRPC": { - "message": "कस्टम RPC" - }, "customSpendLimit": { "message": "कस्टम खर्च सीमा" }, diff --git a/app/_locales/hn/messages.json b/app/_locales/hn/messages.json index 73056bb06..3a8f7c19b 100644 --- a/app/_locales/hn/messages.json +++ b/app/_locales/hn/messages.json @@ -70,9 +70,6 @@ "customGas": { "message": "अनुकूलित करें गैस" }, - "customRPC": { - "message": "कस्टम RPC" - }, "decimal": { "message": "दशमलव परिशुद्धता" }, diff --git a/app/_locales/hr/messages.json b/app/_locales/hr/messages.json index 4c85110f8..b41300166 100644 --- a/app/_locales/hr/messages.json +++ b/app/_locales/hr/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "Povećavanjem se naknade može smanjiti vrijeme obrade, ali se ne jamči." }, - "customRPC": { - "message": "Prilagođeni RPC" - }, "customToken": { "message": "Prilagođeni token" }, diff --git a/app/_locales/ht/messages.json b/app/_locales/ht/messages.json index dc3b8b90c..d37b2913a 100644 --- a/app/_locales/ht/messages.json +++ b/app/_locales/ht/messages.json @@ -136,9 +136,6 @@ "customGas": { "message": "Koutim Gaz" }, - "customRPC": { - "message": "Koutim RPC" - }, "customToken": { "message": "Koutim Token" }, diff --git a/app/_locales/hu/messages.json b/app/_locales/hu/messages.json index b7e994c21..b9c06f8c9 100644 --- a/app/_locales/hu/messages.json +++ b/app/_locales/hu/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "A díj növelése csökkentheti a feldolgozási időt, de ez nem garantált." }, - "customRPC": { - "message": "Egyedi RPC" - }, "customToken": { "message": "Egyéni token" }, diff --git a/app/_locales/id/messages.json b/app/_locales/id/messages.json index b20bcacc4..8bca3cece 100644 --- a/app/_locales/id/messages.json +++ b/app/_locales/id/messages.json @@ -470,9 +470,6 @@ "customGasSubTitle": { "message": "Menaikkan biaya dapat mengurangi waktu pemrosesan, namun tidak dijamin." }, - "customRPC": { - "message": "RPC Kustom" - }, "customSpendLimit": { "message": "Batas Penggunaan Kustom" }, diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json index af85d3b27..e04653899 100644 --- a/app/_locales/it/messages.json +++ b/app/_locales/it/messages.json @@ -404,9 +404,6 @@ "customGasSubTitle": { "message": "Incrementare il costo potrebbe diminuire il tempo di elaborazione, ma non è garantito." }, - "customRPC": { - "message": "RPC Personalizzata" - }, "customSpendLimit": { "message": "Limite Spesa Personalizzato" }, diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json index b78dbb3a7..8d9c10434 100644 --- a/app/_locales/ja/messages.json +++ b/app/_locales/ja/messages.json @@ -470,9 +470,6 @@ "customGasSubTitle": { "message": "手数料を増やすと処理時間は減少する可能性がありますが、減少しない場合もあります。" }, - "customRPC": { - "message": "カスタム RPC" - }, "customSpendLimit": { "message": "カスタム使用限度額" }, diff --git a/app/_locales/kn/messages.json b/app/_locales/kn/messages.json index 67eea5804..967e026c4 100644 --- a/app/_locales/kn/messages.json +++ b/app/_locales/kn/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "ಹೆಚ್ಚುತ್ತಿರುವ ಶುಲ್ಕವು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವ ಸಮಯದಲ್ಲಿ ಕಡಿಮೆಯಾಗುತ್ತದೆ ಆದರೆ ಇದು ಖಚಿತವಾಗಿಲ್ಲ." }, - "customRPC": { - "message": "ಕಸ್ಟಮ್ RPC" - }, "customToken": { "message": "ಕಸ್ಟಮ್ ಟೋಕನ್" }, diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index c6b881117..ac4b5c7ab 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -470,9 +470,6 @@ "customGasSubTitle": { "message": "수수료를 올리면 처리 시간이 단축되기도 하지만 항상 그렇지는 않습니다." }, - "customRPC": { - "message": "맞춤형 RPC" - }, "customSpendLimit": { "message": "맞춤형 지출 한도" }, diff --git a/app/_locales/lt/messages.json b/app/_locales/lt/messages.json index dc4286cc2..15eb4ec68 100644 --- a/app/_locales/lt/messages.json +++ b/app/_locales/lt/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "Didinant mokestį gali mažėti apdorojimo trukmė, bet tai negarantuojama." }, - "customRPC": { - "message": "Pritaikytas RPC" - }, "customToken": { "message": "Pritaikytas žetonas" }, diff --git a/app/_locales/lv/messages.json b/app/_locales/lv/messages.json index 8d4f192ab..d82d3b5c0 100644 --- a/app/_locales/lv/messages.json +++ b/app/_locales/lv/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "Nodevas palielināšana var saīsināt apstrādes laiku, bet ne garantēti." }, - "customRPC": { - "message": "Pielāgots RPC izsaukums" - }, "customToken": { "message": "Pielāgots marķieris" }, diff --git a/app/_locales/ms/messages.json b/app/_locales/ms/messages.json index c52249eaa..489d64467 100644 --- a/app/_locales/ms/messages.json +++ b/app/_locales/ms/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "Meningkatkan fi mungkin akan mengurangkan masa pemprosesan, tetapi ia tidak dijamin." }, - "customRPC": { - "message": "RPC Tersuai" - }, "customToken": { "message": "Token Tersuai" }, diff --git a/app/_locales/nl/messages.json b/app/_locales/nl/messages.json index f5daf1b8b..c48b9c041 100644 --- a/app/_locales/nl/messages.json +++ b/app/_locales/nl/messages.json @@ -67,9 +67,6 @@ "customGas": { "message": "Pas Gas aan" }, - "customRPC": { - "message": "Aangepaste RPC" - }, "decimal": { "message": "Decimalen van precisie" }, diff --git a/app/_locales/no/messages.json b/app/_locales/no/messages.json index c65775240..799615239 100644 --- a/app/_locales/no/messages.json +++ b/app/_locales/no/messages.json @@ -254,9 +254,6 @@ "customGasSubTitle": { "message": "Økt gebyr kan redusere behandlingstiden, men det er ikke garantert." }, - "customRPC": { - "message": "Tilpasset RPC" - }, "customToken": { "message": "Egendefinert token " }, diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json index cedb35598..2b5843d0a 100644 --- a/app/_locales/ph/messages.json +++ b/app/_locales/ph/messages.json @@ -470,9 +470,6 @@ "customGasSubTitle": { "message": "Kapag dinagdagan ang bayarin, mababawasan ang mga oras ng pagproseso, pero hindi ito garantisado." }, - "customRPC": { - "message": "Custom na RPC" - }, "customSpendLimit": { "message": "Custom na Limitasyon sa Paggastos" }, diff --git a/app/_locales/pl/messages.json b/app/_locales/pl/messages.json index 23c4017ab..f6f26dcb6 100644 --- a/app/_locales/pl/messages.json +++ b/app/_locales/pl/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "Zwiększenie opłaty może skrócić czas przetwarzania transakcji, ale nie jest to gwarantowane." }, - "customRPC": { - "message": "Własne RPC" - }, "customToken": { "message": "Własny token" }, diff --git a/app/_locales/pt/messages.json b/app/_locales/pt/messages.json index 283ebdfb2..5e52a844a 100644 --- a/app/_locales/pt/messages.json +++ b/app/_locales/pt/messages.json @@ -70,9 +70,6 @@ "customGas": { "message": "Customizar Gas" }, - "customRPC": { - "message": "Customizar RPC" - }, "decimal": { "message": "Precisão em Decimais" }, diff --git a/app/_locales/pt_BR/messages.json b/app/_locales/pt_BR/messages.json index cfb0592ac..a2a193242 100644 --- a/app/_locales/pt_BR/messages.json +++ b/app/_locales/pt_BR/messages.json @@ -470,9 +470,6 @@ "customGasSubTitle": { "message": "Aumentar a taxa pode diminuir o tempo de processamento, mas não é garantia." }, - "customRPC": { - "message": "RPC personalizada" - }, "customSpendLimit": { "message": "Limite de gastos personalizado" }, diff --git a/app/_locales/ro/messages.json b/app/_locales/ro/messages.json index 18f79a2ed..746a06bcb 100644 --- a/app/_locales/ro/messages.json +++ b/app/_locales/ro/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "Creșterea taxei poate reduce timpii de procesare, dar acest lucru nu este garantat." }, - "customRPC": { - "message": "RPC particularizat" - }, "customToken": { "message": "Token personalizat" }, diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json index e838d57e2..92aa6dcf9 100644 --- a/app/_locales/ru/messages.json +++ b/app/_locales/ru/messages.json @@ -470,9 +470,6 @@ "customGasSubTitle": { "message": "Увеличение комиссии может сократить время обработки, но это не гарантируется." }, - "customRPC": { - "message": "Пользовательский RPC" - }, "customSpendLimit": { "message": "Пользовательский предел расходов" }, diff --git a/app/_locales/sk/messages.json b/app/_locales/sk/messages.json index bbedd7cf7..af11a83bb 100644 --- a/app/_locales/sk/messages.json +++ b/app/_locales/sk/messages.json @@ -251,9 +251,6 @@ "customGasSubTitle": { "message": "Zvýšenie poplatku môže skrátiť dobu spracovania, nie je to však zaručené." }, - "customRPC": { - "message": "Vlastní RPC" - }, "customToken": { "message": "Vlastní token" }, diff --git a/app/_locales/sl/messages.json b/app/_locales/sl/messages.json index 560ca435c..cf444ae95 100644 --- a/app/_locales/sl/messages.json +++ b/app/_locales/sl/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "Povečanje lahko skrajša čas obdelave, vendar ni zagotovljeno." }, - "customRPC": { - "message": "RPC po meri" - }, "customToken": { "message": "Žeton po meri" }, diff --git a/app/_locales/sr/messages.json b/app/_locales/sr/messages.json index 431169969..a6d99e3ad 100644 --- a/app/_locales/sr/messages.json +++ b/app/_locales/sr/messages.json @@ -254,9 +254,6 @@ "customGasSubTitle": { "message": "Povećanje naknade može smanjiti vreme obrade, ali to nije zagarantovano." }, - "customRPC": { - "message": "Korisnički definisan RPC" - }, "customToken": { "message": "Prilagođeni token" }, diff --git a/app/_locales/sv/messages.json b/app/_locales/sv/messages.json index db321b783..1d600425a 100644 --- a/app/_locales/sv/messages.json +++ b/app/_locales/sv/messages.json @@ -251,9 +251,6 @@ "customGasSubTitle": { "message": "Att öka avgiften kan minska behandlingstiden, men det är inte garanterat att göra det." }, - "customRPC": { - "message": "Anpassad RPC" - }, "customToken": { "message": "Anpassad token" }, diff --git a/app/_locales/sw/messages.json b/app/_locales/sw/messages.json index dc24573fe..6c5a43386 100644 --- a/app/_locales/sw/messages.json +++ b/app/_locales/sw/messages.json @@ -251,9 +251,6 @@ "customGasSubTitle": { "message": "Ada iliyoongezeka inaweza kupunguza muda wa uchakataji, lakini haihakikishwi." }, - "customRPC": { - "message": "RPC Maalumu" - }, "customToken": { "message": "Kianzio Maalumu" }, diff --git a/app/_locales/ta/messages.json b/app/_locales/ta/messages.json index f754b0532..6b94d6bd5 100644 --- a/app/_locales/ta/messages.json +++ b/app/_locales/ta/messages.json @@ -103,9 +103,6 @@ "customGas": { "message": "எரிவாயுவைத் தனிப்பயனாக்குங்கள்" }, - "customRPC": { - "message": "விருப்ப RPC ஐ" - }, "customToken": { "message": "தனிப்பயன் டோக்கன்" }, diff --git a/app/_locales/th/messages.json b/app/_locales/th/messages.json index 43e90d04c..166b36fed 100644 --- a/app/_locales/th/messages.json +++ b/app/_locales/th/messages.json @@ -109,9 +109,6 @@ "customGasSubTitle": { "message": "การเพิ่มค่าธรรมเนียมอาจลดเวลาดำเนินการ แต่ก็ไม่แน่เสมอไป" }, - "customRPC": { - "message": "กำหนดค่า RPC เอง" - }, "decimal": { "message": "ตำแหน่งของทศนิยม" }, diff --git a/app/_locales/tl/messages.json b/app/_locales/tl/messages.json index a92b420e1..24f8fbf84 100644 --- a/app/_locales/tl/messages.json +++ b/app/_locales/tl/messages.json @@ -392,9 +392,6 @@ "customGasSubTitle": { "message": "Kapag dinagdagan ang bayarin, mababawasan ang mga oras ng pagproseso, pero hindi ito garantisado." }, - "customRPC": { - "message": "Custom na RPC" - }, "customSpendLimit": { "message": "Custom na Limitasyon sa Paggastos" }, diff --git a/app/_locales/tr/messages.json b/app/_locales/tr/messages.json index 977162984..5a4bb29be 100644 --- a/app/_locales/tr/messages.json +++ b/app/_locales/tr/messages.json @@ -88,9 +88,6 @@ "customGas": { "message": "Gas'i özelleştir" }, - "customRPC": { - "message": "Özel RPC" - }, "customToken": { "message": "Özel Jeton" }, diff --git a/app/_locales/uk/messages.json b/app/_locales/uk/messages.json index 51321e3f9..583776398 100644 --- a/app/_locales/uk/messages.json +++ b/app/_locales/uk/messages.json @@ -257,9 +257,6 @@ "customGasSubTitle": { "message": "Збільшення комісії може призвести до зменшення часу обробки, але це не гарантується." }, - "customRPC": { - "message": "Налаштувати RPC" - }, "customToken": { "message": "Користувацький токен" }, diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json index a572f30fc..685072a32 100644 --- a/app/_locales/vi/messages.json +++ b/app/_locales/vi/messages.json @@ -470,9 +470,6 @@ "customGasSubTitle": { "message": "Việc tăng phí có thể giúp giảm thời gian xử lý, nhưng điều này không được đảm bảo." }, - "customRPC": { - "message": "RPC tùy chỉnh" - }, "customSpendLimit": { "message": "Giới hạn chi tiêu tùy chỉnh" }, diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index 6ea8d3ad6..e75d509ab 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -401,9 +401,6 @@ "customGasSubTitle": { "message": "提升费用可能会缩短处理时间,但不保证绝对有效。" }, - "customRPC": { - "message": "自定义 RPC" - }, "customSpendLimit": { "message": "自定义消费限额" }, diff --git a/app/_locales/zh_TW/messages.json b/app/_locales/zh_TW/messages.json index 4ffa228b6..95561c0b5 100644 --- a/app/_locales/zh_TW/messages.json +++ b/app/_locales/zh_TW/messages.json @@ -266,9 +266,6 @@ "customGasSubTitle": { "message": "提升費用可能會加快處理時間,但不保證" }, - "customRPC": { - "message": "自訂 RPC" - }, "customToken": { "message": "自訂代幣" }, diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index 41630cce3..d67d4efe5 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -53,6 +53,7 @@ export default class PreferencesController { preferences: { autoLockTimeLimit: undefined, showFiatInTestnets: false, + showTestNetworks: false, useNativeCurrencyAsPrimaryCurrency: true, hideZeroBalanceTokens: false, }, diff --git a/app/scripts/first-time-state.js b/app/scripts/first-time-state.js index 857921889..34969b58f 100644 --- a/app/scripts/first-time-state.js +++ b/app/scripts/first-time-state.js @@ -10,15 +10,7 @@ const initialState = { config: {}, PreferencesController: { - frequentRpcListDetail: [ - { - rpcUrl: 'http://localhost:8545', - chainId: '0x539', - ticker: 'ETH', - nickname: 'Localhost 8545', - rpcPrefs: {}, - }, - ], + frequentRpcListDetail: [], }, }; diff --git a/shared/constants/network.js b/shared/constants/network.js index 3087a68e0..a85f544a7 100644 --- a/shared/constants/network.js +++ b/shared/constants/network.js @@ -3,6 +3,7 @@ export const RINKEBY = 'rinkeby'; export const KOVAN = 'kovan'; export const MAINNET = 'mainnet'; export const GOERLI = 'goerli'; +export const LOCALHOST = 'localhost'; export const NETWORK_TYPE_RPC = 'rpc'; export const MAINNET_NETWORK_ID = '1'; @@ -34,6 +35,7 @@ export const RINKEBY_DISPLAY_NAME = 'Rinkeby'; export const KOVAN_DISPLAY_NAME = 'Kovan'; export const MAINNET_DISPLAY_NAME = 'Ethereum Mainnet'; export const GOERLI_DISPLAY_NAME = 'Goerli'; +export const LOCALHOST_DISPLAY_NAME = 'Localhost 8545'; const infuraProjectId = process.env.INFURA_PROJECT_ID; const getRpcUrl = (network) => @@ -44,6 +46,7 @@ export const RINKEBY_RPC_URL = getRpcUrl('rinkeby'); export const KOVAN_RPC_URL = getRpcUrl('kovan'); export const MAINNET_RPC_URL = getRpcUrl('mainnet'); export const GOERLI_RPC_URL = getRpcUrl('goerli'); +export const LOCALHOST_RPC_URL = 'http://localhost:8545'; export const ETH_SYMBOL = 'ETH'; export const WETH_SYMBOL = 'WETH'; @@ -63,6 +66,7 @@ export const TEST_CHAINS = [ RINKEBY_CHAIN_ID, GOERLI_CHAIN_ID, KOVAN_CHAIN_ID, + LOCALHOST_CHAIN_ID, ]; /** @@ -74,6 +78,7 @@ export const NETWORK_TYPE_TO_ID_MAP = { [KOVAN]: { networkId: KOVAN_NETWORK_ID, chainId: KOVAN_CHAIN_ID }, [GOERLI]: { networkId: GOERLI_NETWORK_ID, chainId: GOERLI_CHAIN_ID }, [MAINNET]: { networkId: MAINNET_NETWORK_ID, chainId: MAINNET_CHAIN_ID }, + [LOCALHOST]: { networkId: LOCALHOST_NETWORK_ID, chainId: LOCALHOST_CHAIN_ID }, }; export const NETWORK_TO_NAME_MAP = { @@ -82,18 +87,21 @@ export const NETWORK_TO_NAME_MAP = { [KOVAN]: KOVAN_DISPLAY_NAME, [MAINNET]: MAINNET_DISPLAY_NAME, [GOERLI]: GOERLI_DISPLAY_NAME, + [LOCALHOST]: LOCALHOST_DISPLAY_NAME, [ROPSTEN_NETWORK_ID]: ROPSTEN_DISPLAY_NAME, [RINKEBY_NETWORK_ID]: RINKEBY_DISPLAY_NAME, [KOVAN_NETWORK_ID]: KOVAN_DISPLAY_NAME, [GOERLI_NETWORK_ID]: GOERLI_DISPLAY_NAME, [MAINNET_NETWORK_ID]: MAINNET_DISPLAY_NAME, + [LOCALHOST_NETWORK_ID]: LOCALHOST_DISPLAY_NAME, [ROPSTEN_CHAIN_ID]: ROPSTEN_DISPLAY_NAME, [RINKEBY_CHAIN_ID]: RINKEBY_DISPLAY_NAME, [KOVAN_CHAIN_ID]: KOVAN_DISPLAY_NAME, [GOERLI_CHAIN_ID]: GOERLI_DISPLAY_NAME, [MAINNET_CHAIN_ID]: MAINNET_DISPLAY_NAME, + [LOCALHOST_CHAIN_ID]: LOCALHOST_DISPLAY_NAME, }; export const CHAIN_ID_TO_TYPE_MAP = Object.entries( @@ -109,6 +117,7 @@ export const CHAIN_ID_TO_RPC_URL_MAP = { [KOVAN_CHAIN_ID]: KOVAN_RPC_URL, [GOERLI_CHAIN_ID]: GOERLI_RPC_URL, [MAINNET_CHAIN_ID]: MAINNET_RPC_URL, + [LOCALHOST_CHAIN_ID]: LOCALHOST_RPC_URL, }; export const CHAIN_ID_TO_NETWORK_ID_MAP = Object.values( diff --git a/test/e2e/tests/custom-rpc-history.spec.js b/test/e2e/tests/custom-rpc-history.spec.js index 3e9f79e3f..71db787a9 100644 --- a/test/e2e/tests/custom-rpc-history.spec.js +++ b/test/e2e/tests/custom-rpc-history.spec.js @@ -30,9 +30,15 @@ describe('Stores custom RPC history', function () { await driver.clickElement('.network-display'); - await driver.clickElement({ text: 'Custom RPC', tag: 'span' }); + await driver.clickElement({ text: 'Add Network', tag: 'button' }); - await driver.findElement('.add-network-form__sub-header-text'); + await driver.findVisibleElement('.settings-page__content'); + + await driver.findElement('.settings-page__sub-header-text'); + + await driver.clickElement( + '.add-network-form__header-add-network-button', + ); const customRpcInputs = await driver.findElements('input[type="text"]'); const networkNameInput = customRpcInputs[0]; @@ -48,7 +54,7 @@ describe('Stores custom RPC history', function () { await chainIdInput.clear(); await chainIdInput.sendKeys(chainId.toString()); - await driver.clickElement('.add-network-form__footer .btn-primary'); + await driver.clickElement('.add-network-form__footer-submit-button'); await driver.findElement({ text: networkName, tag: 'span' }); }, ); @@ -71,9 +77,15 @@ describe('Stores custom RPC history', function () { await driver.clickElement('.network-display'); - await driver.clickElement({ text: 'Custom RPC', tag: 'span' }); + await driver.clickElement({ text: 'Add Network', tag: 'button' }); - await driver.findElement('.add-network-form__sub-header-text'); + await driver.findVisibleElement('.settings-page__content'); + + await driver.findElement('.settings-page__sub-header-text'); + + await driver.clickElement( + '.add-network-form__header-add-network-button', + ); const customRpcInputs = await driver.findElements('input[type="text"]'); const rpcUrlInput = customRpcInputs[1]; @@ -81,7 +93,7 @@ describe('Stores custom RPC history', function () { await rpcUrlInput.clear(); await rpcUrlInput.sendKeys(duplicateRpcUrl); await driver.findElement({ - text: 'This URL is currently used by the Localhost 8545 network.', + text: 'This URL is currently used by the localhost network.', tag: 'p', }); }, @@ -106,9 +118,17 @@ describe('Stores custom RPC history', function () { await driver.clickElement('.network-display'); - await driver.clickElement({ text: 'Custom RPC', tag: 'span' }); + await driver.clickElement({ text: 'Add Network', tag: 'button' }); + + // await driver.findElement('.add-network-form__sub-header-text'); + // wait for the full screen to be visible + await driver.findVisibleElement('.settings-page__content'); - await driver.findElement('.add-network-form__sub-header-text'); + await driver.findElement('.settings-page__sub-header-text'); + + await driver.clickElement( + '.add-network-form__header-add-network-button', + ); const customRpcInputs = await driver.findElements('input[type="text"]'); const rpcUrlInput = customRpcInputs[1]; @@ -120,8 +140,7 @@ describe('Stores custom RPC history', function () { await chainIdInput.clear(); await chainIdInput.sendKeys(duplicateChainId); await driver.findElement({ - text: - 'This Chain ID is currently used by the Localhost 8545 network.', + text: 'This Chain ID is currently used by the localhost network.', tag: 'p', }); }, @@ -189,12 +208,9 @@ describe('Stores custom RPC history', function () { await driver.clickElement('.network-display'); - await driver.clickElement({ text: 'Custom RPC', tag: 'span' }); + await driver.clickElement({ text: 'Add Network', tag: 'button' }); - // cancel new custom rpc - await driver.clickElement( - '.add-network-form__footer button.btn-secondary', - ); + await driver.findVisibleElement('.settings-page__content'); const networkListItems = await driver.findClickableElements( '.networks-tab__networks-list-name', diff --git a/test/e2e/tests/provider-events.spec.js b/test/e2e/tests/provider-events.spec.js index effe3e717..2f5f03b31 100644 --- a/test/e2e/tests/provider-events.spec.js +++ b/test/e2e/tests/provider-events.spec.js @@ -40,21 +40,21 @@ describe('MetaMask', function () { await driver.switchToWindow(windowHandles[0]); await driver.clickElement('.network-display'); - await driver.clickElement({ text: 'Ropsten', tag: 'span' }); + await driver.clickElement({ text: 'Ethereum Mainnet', tag: 'span' }); await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles); const switchedNetworkDiv = await driver.waitForSelector({ css: '#network', - text: '3', + text: '1', }); const switchedChainIdDiv = await driver.waitForSelector({ css: '#chainId', - text: '0x3', + text: '0x1', }); const accountsDiv = await driver.findElement('#accounts'); - assert.equal(await switchedNetworkDiv.getText(), '3'); - assert.equal(await switchedChainIdDiv.getText(), '0x3'); + assert.equal(await switchedNetworkDiv.getText(), '1'); + assert.equal(await switchedChainIdDiv.getText(), '0x1'); assert.equal( await accountsDiv.getText(), '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', diff --git a/ui/components/app/dropdowns/network-dropdown.js b/ui/components/app/dropdowns/network-dropdown.js index 01c1b3fc1..87512fd6c 100644 --- a/ui/components/app/dropdowns/network-dropdown.js +++ b/ui/components/app/dropdowns/network-dropdown.js @@ -3,16 +3,18 @@ import React, { Component } from 'react'; import { connect } from 'react-redux'; import { withRouter } from 'react-router-dom'; import { compose } from 'redux'; +import Button from '../../ui/button'; import * as actions from '../../../store/actions'; import { openAlert as displayInvalidCustomNetworkAlert } from '../../../ducks/alerts/invalid-custom-network'; -import { ADD_NETWORK_ROUTE } from '../../../helpers/constants/routes'; -import { ENVIRONMENT_TYPE_FULLSCREEN } from '../../../../shared/constants/app'; import { NETWORK_TYPE_RPC } from '../../../../shared/constants/network'; import { isPrefixedFormattedHexString } from '../../../../shared/modules/network.utils'; -import { getEnvironmentType } from '../../../../app/scripts/lib/util'; import ColorIndicator from '../../ui/color-indicator'; import { COLORS, SIZES } from '../../../helpers/constants/design-system'; +import { getShowTestNetworks } from '../../../selectors'; +import { getEnvironmentType } from '../../../../app/scripts/lib/util'; +import { ENVIRONMENT_TYPE_POPUP } from '../../../../shared/constants/app'; +import { NETWORKS_ROUTE } from '../../../helpers/constants/routes'; import { Dropdown, DropdownMenuItem } from './dropdown'; // classes from nodes of the toggle element. @@ -34,6 +36,7 @@ const DROP_DOWN_MENU_ITEM_STYLE = { function mapStateToProps(state) { return { provider: state.metamask.provider, + shouldShowTestNetworks: getShowTestNetworks(state), frequentRpcListDetail: state.metamask.frequentRpcListDetail || [], networkDropdownOpen: state.appState.networkDropdownOpen, }; @@ -48,9 +51,6 @@ function mapDispatchToProps(dispatch) { dispatch(actions.setRpcTarget(target, chainId, ticker, nickname)); }, hideNetworkDropdown: () => dispatch(actions.hideNetworkDropdown()), - setSelectedSettingsRpcUrl: (url) => { - dispatch(actions.setSelectedSettingsRpcUrl(url)); - }, displayInvalidCustomNetworkAlert: (networkName) => { dispatch(displayInvalidCustomNetworkAlert(networkName)); }, @@ -82,12 +82,12 @@ class NetworkDropdown extends Component { setProviderType: PropTypes.func.isRequired, setRpcTarget: PropTypes.func.isRequired, hideNetworkDropdown: PropTypes.func.isRequired, - setSelectedSettingsRpcUrl: PropTypes.func.isRequired, frequentRpcListDetail: PropTypes.array.isRequired, + shouldShowTestNetworks: PropTypes.bool, networkDropdownOpen: PropTypes.bool.isRequired, - history: PropTypes.object.isRequired, displayInvalidCustomNetworkAlert: PropTypes.func.isRequired, showConfirmDeleteNetworkModal: PropTypes.func.isRequired, + history: PropTypes.object, }; handleClick(newProviderType) { @@ -111,6 +111,36 @@ class NetworkDropdown extends Component { setProviderType(newProviderType); } + renderAddCustomButton() { + const style = { + width: '100%', + left: '40px', + color: 'white', + background: 'rgba(0, 0, 0, 0.75)', + borderRadius: '20px', + textTransform: 'none', + }; + + return ( + + ); + } + renderCustomRpcList(rpcListDetail, provider) { const reversedRpcListDetail = rpcListDetail.slice().reverse(); @@ -188,6 +218,8 @@ class NetworkDropdown extends Component { name = this.context.t('rinkeby'); } else if (providerName === 'goerli') { name = this.context.t('goerli'); + } else if (providerName === 'localhost') { + name = this.context.t('localhost'); } else { name = provider.nickname || this.context.t('unknownNetwork'); } @@ -230,11 +262,7 @@ class NetworkDropdown extends Component { } render() { - const { - provider: { rpcUrl: activeNetwork }, - setSelectedSettingsRpcUrl, - history, - } = this.props; + const { shouldShowTestNetworks } = this.props; const rpcListDetail = this.props.frequentRpcListDetail; const isOpen = this.props.networkDropdownOpen; @@ -275,44 +303,20 @@ class NetworkDropdown extends Component {
{this.renderNetworkEntry('mainnet')} - {this.renderNetworkEntry('ropsten')} - {this.renderNetworkEntry('kovan')} - {this.renderNetworkEntry('rinkeby')} - {this.renderNetworkEntry('goerli')} {this.renderCustomRpcList(rpcListDetail, this.props.provider)} - this.props.hideNetworkDropdown()} - onClick={() => { - if (getEnvironmentType() === ENVIRONMENT_TYPE_FULLSCREEN) { - history.push(ADD_NETWORK_ROUTE); - } else { - global.platform.openExtensionInBrowser(ADD_NETWORK_ROUTE); - } - setSelectedSettingsRpcUrl(''); - }} - style={DROP_DOWN_MENU_ITEM_STYLE} - > - {activeNetwork === 'custom' ? ( - - ) : ( -
- )} - - - {this.context.t('customRPC')} - -
+ + {shouldShowTestNetworks && ( + <> + {this.renderNetworkEntry('ropsten')} + {this.renderNetworkEntry('kovan')} + {this.renderNetworkEntry('rinkeby')} + {this.renderNetworkEntry('goerli')} + {this.renderNetworkEntry('localhost')} + + )} + + {this.renderAddCustomButton()} ); } diff --git a/ui/components/app/dropdowns/network-dropdown.test.js b/ui/components/app/dropdowns/network-dropdown.test.js index f68fddd93..263460b85 100644 --- a/ui/components/app/dropdowns/network-dropdown.test.js +++ b/ui/components/app/dropdowns/network-dropdown.test.js @@ -1,6 +1,7 @@ import React from 'react'; import configureMockStore from 'redux-mock-store'; import thunk from 'redux-thunk'; +import Button from '../../ui/button'; import { mountWithRouter } from '../../../../test/lib/render-helpers'; import ColorIndicator from '../../ui/color-indicator'; import NetworkDropdown from './network-dropdown'; @@ -17,6 +18,9 @@ describe('Network Dropdown', () => { provider: { type: 'test', }, + preferences: { + showTestNetworks: true, + }, }, appState: { networkDropdownOpen: false, @@ -38,13 +42,16 @@ describe('Network Dropdown', () => { }); }); - describe('NetworkDropdown in appState is true', () => { + describe('NetworkDropdown in appState is true and show test networks is true', () => { const mockState = { metamask: { network: '1', provider: { type: 'test', }, + preferences: { + showTestNetworks: true, + }, frequentRpcListDetail: [ { chainId: '0x1a', rpcUrl: 'http://localhost:7545' }, { rpcUrl: 'http://localhost:7546' }, @@ -54,14 +61,32 @@ describe('Network Dropdown', () => { networkDropdownOpen: true, }, }; + + global.platform = { + openExtensionInBrowser: jest.fn(), + }; + const store = createMockStore(mockState); - beforeEach(() => { - wrapper = mountWithRouter(); - }); + let testNetworkIndex = 1; + + const findTestNetworkFirstIndex = (_wrapper) => { + let i = 1; + let found = false; + while (!found) { + if (_wrapper.find(ColorIndicator).at(i).prop('color') === 'ui-2') { + i += 1; + } else { + found = true; + } + } - it('renders 8 DropDownMenuItems', () => { - expect(wrapper.find(DropdownMenuItem)).toHaveLength(8); + testNetworkIndex = i; + }; + + beforeAll(() => { + wrapper = mountWithRouter(); + findTestNetworkFirstIndex(wrapper); }); it('checks background color for first ColorIndicator', () => { @@ -71,41 +96,99 @@ describe('Network Dropdown', () => { }); it('checks background color for second ColorIndicator', () => { - const colorIndicator = wrapper.find(ColorIndicator).at(1); + // find where test networks start in case there are custom RPCs + const colorIndicator = wrapper.find(ColorIndicator).at(testNetworkIndex); expect(colorIndicator.prop('color')).toStrictEqual('ropsten'); expect(colorIndicator.prop('borderColor')).toStrictEqual('ropsten'); }); it('checks background color for third ColorIndicator', () => { - const colorIndicator = wrapper.find(ColorIndicator).at(2); + const colorIndicator = wrapper + .find(ColorIndicator) + .at(testNetworkIndex + 1); expect(colorIndicator.prop('color')).toStrictEqual('kovan'); expect(colorIndicator.prop('borderColor')).toStrictEqual('kovan'); }); it('checks background color for fourth ColorIndicator', () => { - const colorIndicator = wrapper.find(ColorIndicator).at(3); + const colorIndicator = wrapper + .find(ColorIndicator) + .at(testNetworkIndex + 2); expect(colorIndicator.prop('color')).toStrictEqual('rinkeby'); expect(colorIndicator.prop('borderColor')).toStrictEqual('rinkeby'); }); it('checks background color for fifth ColorIndicator', () => { - const colorIndicator = wrapper.find(ColorIndicator).at(4); + const colorIndicator = wrapper + .find(ColorIndicator) + .at(testNetworkIndex + 3); expect(colorIndicator.prop('color')).toStrictEqual('goerli'); expect(colorIndicator.prop('borderColor')).toStrictEqual('goerli'); }); it('checks background color for sixth ColorIndicator', () => { - const colorIndicator = wrapper.find(ColorIndicator).at(5); - const customNetworkGray = 'ui-2'; - expect(colorIndicator.prop('color')).toStrictEqual(customNetworkGray); - expect(colorIndicator.prop('borderColor')).toStrictEqual( - customNetworkGray, + const colorIndicator = wrapper + .find(ColorIndicator) + .at(testNetworkIndex + 4); + expect(colorIndicator.prop('color')).toStrictEqual('localhost'); + expect(colorIndicator.prop('borderColor')).toStrictEqual('localhost'); + expect( + wrapper + .find(DropdownMenuItem) + .at(testNetworkIndex + 4) + .text(), + ).toStrictEqual('✓localhost'); + }); + + it('checks that Add Network button is rendered', () => { + expect(wrapper.find(Button).at(0).children().text()).toStrictEqual( + 'addNetwork', + ); + }); + }); + + describe('NetworkDropdown in appState is true and show test networks is false', () => { + const mockState = { + metamask: { + network: '1', + provider: { + type: 'test', + }, + preferences: { + showTestNetworks: false, + }, + frequentRpcListDetail: [ + { chainId: '0x1a', rpcUrl: 'http://localhost:7545' }, + { rpcUrl: 'http://localhost:7546' }, + ], + }, + appState: { + networkDropdownOpen: true, + }, + }; + + global.platform = { + openExtensionInBrowser: jest.fn(), + }; + + const store = createMockStore(mockState); + + beforeAll(() => { + wrapper = mountWithRouter(); + }); + + it('checks background color for first ColorIndicator', () => { + const colorIndicator = wrapper.find(ColorIndicator).at(0); + expect(colorIndicator.prop('color')).toStrictEqual('mainnet'); + expect(colorIndicator.prop('borderColor')).toStrictEqual('mainnet'); + expect(wrapper.find(DropdownMenuItem).at(0).text()).toStrictEqual( + '✓mainnet', ); }); - it('checks dropdown for frequestRPCList from state', () => { - expect(wrapper.find(DropdownMenuItem).at(6).text()).toStrictEqual( - '✓http://localhost:7545', + it('checks that Add Network button is rendered', () => { + expect(wrapper.find(Button).at(0).children().text()).toStrictEqual( + 'addNetwork', ); }); }); diff --git a/ui/components/app/network-display/index.scss b/ui/components/app/network-display/index.scss index 51ce5bcdc..9e0a0df9b 100644 --- a/ui/components/app/network-display/index.scss +++ b/ui/components/app/network-display/index.scss @@ -35,6 +35,10 @@ background-color: lighten($dodger-blue, 35%); } + &--localhost { + background-color: lighten($blue-lagoon, 68%); + } + &.chip { margin: 0; max-width: 100%; diff --git a/ui/css/design-system/colors.scss b/ui/css/design-system/colors.scss index b447315f8..264af073c 100644 --- a/ui/css/design-system/colors.scss +++ b/ui/css/design-system/colors.scss @@ -108,6 +108,7 @@ $ropsten: #ff4a8d; $kovan: #9064ff; $rinkeby: #f6c343; $goerli: #3099f2; +$localhost: #29b6af; $color-map: ( 'ui-1': $ui-1, @@ -136,5 +137,6 @@ $color-map: ( 'kovan': $kovan, 'rinkeby': $rinkeby, 'goerli': $goerli, + 'localhost': $localhost, 'transparent': transparent, ); diff --git a/ui/css/itcss/components/network.scss b/ui/css/itcss/components/network.scss index 31137ac43..8f0130956 100644 --- a/ui/css/itcss/components/network.scss +++ b/ui/css/itcss/components/network.scss @@ -32,6 +32,10 @@ &.goerli-test-network .menu-icon-circle div { background-color: rgba(48, 153, 242, 0.7) !important; } + + &.localhost-network .menu-icon-circle div { + background-color: rgba(3, 135, 137, 0.7) !important; + } } .dropdown-menu-item { diff --git a/ui/ducks/metamask/metamask.js b/ui/ducks/metamask/metamask.js index 452acbd60..9578826e1 100644 --- a/ui/ducks/metamask/metamask.js +++ b/ui/ducks/metamask/metamask.js @@ -34,6 +34,7 @@ export default function reduceMetamask(state = {}, action) { preferences: { autoLockTimeLimit: undefined, showFiatInTestnets: false, + showTestNetworks: false, useNativeCurrencyAsPrimaryCurrency: true, }, firstTimeFlowType: null, diff --git a/ui/helpers/constants/design-system.js b/ui/helpers/constants/design-system.js index 2f3b4bdd9..c82b168be 100644 --- a/ui/helpers/constants/design-system.js +++ b/ui/helpers/constants/design-system.js @@ -33,6 +33,7 @@ export const COLORS = { RINKEBY: 'rinkeby', GOERLI: 'goerli', TRANSPARENT: 'transparent', + LOCALHOST: 'localhost', }; export const TYPOGRAPHY = { diff --git a/ui/pages/settings/advanced-tab/advanced-tab.component.js b/ui/pages/settings/advanced-tab/advanced-tab.component.js index b3b70aa79..b83b6956d 100644 --- a/ui/pages/settings/advanced-tab/advanced-tab.component.js +++ b/ui/pages/settings/advanced-tab/advanced-tab.component.js @@ -31,9 +31,11 @@ export default class AdvancedTab extends PureComponent { setAdvancedInlineGasFeatureFlag: PropTypes.func, advancedInlineGas: PropTypes.bool, showFiatInTestnets: PropTypes.bool, + showTestNetworks: PropTypes.bool, autoLockTimeLimit: PropTypes.number, setAutoLockTimeLimit: PropTypes.func.isRequired, setShowFiatConversionOnTestnetsPreference: PropTypes.func.isRequired, + setShowTestNetworks: PropTypes.func.isRequired, threeBoxSyncingAllowed: PropTypes.bool.isRequired, setThreeBoxSyncingPermission: PropTypes.func.isRequired, threeBoxDisabled: PropTypes.bool.isRequired, @@ -220,6 +222,35 @@ export default class AdvancedTab extends PureComponent { ); } + renderToggleTestNetworks() { + const { t } = this.context; + const { showTestNetworks, setShowTestNetworks } = this.props; + + return ( +
+
+ {t('showTestnetNetworks')} +
+ {t('showTestnetNetworksDescription')} +
+
+
+
+ setShowTestNetworks(!value)} + offLabel={t('off')} + onLabel={t('on')} + /> +
+
+
+ ); + } + renderShowConversionInTestnets() { const { t } = this.context; const { @@ -597,6 +628,7 @@ export default class AdvancedTab extends PureComponent { {this.renderAdvancedGasInputInline()} {this.renderHexDataOptIn()} {this.renderShowConversionInTestnets()} + {this.renderToggleTestNetworks()} {this.renderUseNonceOptIn()} {this.renderAutoLockTimeLimit()} {this.renderThreeBoxControl()} diff --git a/ui/pages/settings/advanced-tab/advanced-tab.component.test.js b/ui/pages/settings/advanced-tab/advanced-tab.component.test.js index e403bf4aa..0a2c254df 100644 --- a/ui/pages/settings/advanced-tab/advanced-tab.component.test.js +++ b/ui/pages/settings/advanced-tab/advanced-tab.component.test.js @@ -3,17 +3,24 @@ import sinon from 'sinon'; import { shallow } from 'enzyme'; import TextField from '../../../components/ui/text-field'; import { LEDGER_TRANSPORT_TYPES } from '../../../../shared/constants/hardware-wallets'; +import ToggleButton from '../../../components/ui/toggle-button'; import AdvancedTab from './advanced-tab.component'; describe('AdvancedTab Component', () => { - it('should render correctly when threeBoxFeatureFlag', () => { - const root = shallow( + let root; + let setAutoLockTimeLimitSpy = sinon.spy(); + const toggleTestnet = sinon.spy(); + + beforeAll(() => { + root = shallow( undefined} + setAutoLockTimeLimit={setAutoLockTimeLimitSpy} setIpfsGateway={() => undefined} setShowFiatConversionOnTestnetsPreference={() => undefined} setThreeBoxSyncingPermission={() => undefined} + setShowTestNetworks={toggleTestnet} + showTestNetworks={false} threeBoxDisabled threeBoxSyncingAllowed={false} ledgerTransportType={LEDGER_TRANSPORT_TYPES.U2F} @@ -27,13 +34,15 @@ describe('AdvancedTab Component', () => { }, }, ); + }); - expect(root.find('.settings-page__content-row')).toHaveLength(12); + it('should render correctly when threeBoxFeatureFlag', () => { + expect(root.find('.settings-page__content-row')).toHaveLength(13); }); it('should update autoLockTimeLimit', () => { - const setAutoLockTimeLimitSpy = sinon.spy(); - const root = shallow( + setAutoLockTimeLimitSpy = sinon.spy(); + root = shallow( { setLedgerLivePreference={() => undefined} setDismissSeedBackUpReminder={() => undefined} dismissSeedBackUpReminder={false} + setShowTestNetworks={toggleTestnet} />, { context: { @@ -54,7 +64,7 @@ describe('AdvancedTab Component', () => { }, ); - const autoTimeout = root.find('.settings-page__content-row').at(7); + const autoTimeout = root.find('.settings-page__content-row').at(8); const textField = autoTimeout.find(TextField); textField.props().onChange({ target: { value: 1440 } }); @@ -63,4 +73,11 @@ describe('AdvancedTab Component', () => { autoTimeout.find('.settings-tab__rpc-save-button').simulate('click'); expect(setAutoLockTimeLimitSpy.args[0][0]).toStrictEqual(1440); }); + + it('should toggle show test networks', () => { + const testNetworks = root.find('.settings-page__content-row').at(6); + const toggleButton = testNetworks.find(ToggleButton); + toggleButton.first().simulate('toggle'); + expect(toggleTestnet.calledOnce).toStrictEqual(true); + }); }); diff --git a/ui/pages/settings/advanced-tab/advanced-tab.container.js b/ui/pages/settings/advanced-tab/advanced-tab.container.js index 434ca2444..a73d93092 100644 --- a/ui/pages/settings/advanced-tab/advanced-tab.container.js +++ b/ui/pages/settings/advanced-tab/advanced-tab.container.js @@ -6,6 +6,7 @@ import { setFeatureFlag, showModal, setShowFiatConversionOnTestnetsPreference, + setShowTestNetworks, setAutoLockTimeLimit, setThreeBoxSyncingPermission, turnThreeBoxSyncingOnAndInitialize, @@ -32,7 +33,11 @@ export const mapStateToProps = (state) => { ledgerTransportType, dismissSeedBackUpReminder, } = metamask; - const { showFiatInTestnets, autoLockTimeLimit } = getPreferences(state); + const { + showFiatInTestnets, + showTestNetworks, + autoLockTimeLimit, + } = getPreferences(state); const userHasALedgerAccount = doesUserHaveALedgerAccount(state); @@ -41,6 +46,7 @@ export const mapStateToProps = (state) => { sendHexData, advancedInlineGas, showFiatInTestnets, + showTestNetworks, autoLockTimeLimit, threeBoxSyncingAllowed, threeBoxDisabled, @@ -65,6 +71,9 @@ export const mapDispatchToProps = (dispatch) => { setShowFiatConversionOnTestnetsPreference: (value) => { return dispatch(setShowFiatConversionOnTestnetsPreference(value)); }, + setShowTestNetworks: (value) => { + return dispatch(setShowTestNetworks(value)); + }, setAutoLockTimeLimit: (value) => { return dispatch(setAutoLockTimeLimit(value)); }, diff --git a/ui/pages/settings/advanced-tab/advanced-tab.stories.js b/ui/pages/settings/advanced-tab/advanced-tab.stories.js index 3ba345ead..804469ce9 100644 --- a/ui/pages/settings/advanced-tab/advanced-tab.stories.js +++ b/ui/pages/settings/advanced-tab/advanced-tab.stories.js @@ -13,6 +13,7 @@ export const AdvancedTabComponent = () => { undefined} setShowFiatConversionOnTestnetsPreference={() => undefined} + setShowTestNetworks={() => undefined} setThreeBoxSyncingPermission={() => undefined} setIpfsGateway={() => undefined} setLedgerLivePreference={() => undefined} diff --git a/ui/pages/settings/networks-tab/networks-tab.component.js b/ui/pages/settings/networks-tab/networks-tab.component.js index e786d3fc6..6a9c9bc17 100644 --- a/ui/pages/settings/networks-tab/networks-tab.component.js +++ b/ui/pages/settings/networks-tab/networks-tab.component.js @@ -62,6 +62,7 @@ export default class NetworksTab extends PureComponent { event.preventDefault(); history.push(ADD_NETWORK_ROUTE); }} + className="add-network-form__header-add-network-button" > {this.context.t('addANetwork')} diff --git a/ui/pages/settings/networks-tab/networks-tab.constants.js b/ui/pages/settings/networks-tab/networks-tab.constants.js index 26a57c7bd..d5ad83541 100644 --- a/ui/pages/settings/networks-tab/networks-tab.constants.js +++ b/ui/pages/settings/networks-tab/networks-tab.constants.js @@ -5,6 +5,9 @@ import { KOVAN, KOVAN_CHAIN_ID, KOVAN_RPC_URL, + LOCALHOST, + LOCALHOST_CHAIN_ID, + LOCALHOST_RPC_URL, MAINNET, MAINNET_CHAIN_ID, MAINNET_RPC_URL, @@ -62,6 +65,15 @@ const defaultNetworksData = [ ticker: 'ETH', blockExplorerUrl: 'https://kovan.etherscan.io', }, + { + labelKey: LOCALHOST, + iconColor: '#29B6AF', + providerType: LOCALHOST, + rpcUrl: LOCALHOST_RPC_URL, + chainId: LOCALHOST_CHAIN_ID, + ticker: 'ETH', + blockExplorerUrl: '', + }, ]; export { defaultNetworksData }; diff --git a/ui/selectors/selectors.js b/ui/selectors/selectors.js index f506ec20c..cfbd8e246 100644 --- a/ui/selectors/selectors.js +++ b/ui/selectors/selectors.js @@ -424,6 +424,11 @@ export function getPreferences({ metamask }) { return metamask.preferences; } +export function getShowTestNetworks(state) { + const { showTestNetworks } = getPreferences(state); + return Boolean(showTestNetworks); +} + export function getShouldShowFiat(state) { const isMainNet = getIsMainnet(state); const conversionRate = getConversionRate(state); diff --git a/ui/store/actions.js b/ui/store/actions.js index 03c23a317..f8a0b7717 100644 --- a/ui/store/actions.js +++ b/ui/store/actions.js @@ -1931,6 +1931,10 @@ export function setShowFiatConversionOnTestnetsPreference(value) { return setPreference('showFiatInTestnets', value); } +export function setShowTestNetworks(value) { + return setPreference('showTestNetworks', value); +} + export function setAutoLockTimeLimit(value) { return setPreference('autoLockTimeLimit', value); } From e067379f48bfb1e0e8ad2f8922c7da8dfa7f1ebc Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Thu, 28 Oct 2021 17:29:20 -0230 Subject: [PATCH 17/97] Remove the partially-applied dark mode styles used for beta (#12489) The beta build currently has a couple of UI elements (the horizontal logo and the app header) set to "dark mode", even though nothing else in our UI supports dark mode yet. These styles have been removed. We should make the entire UI support dark mode all at once at a later date. Also the horizontal logo used for beta was named incorrectly; the dark and non-dark logos were swapped. They have been switched back so that the logo that ends with `-dark` is for dark mode. --- .../beta/logo/metamask-logo-horizontal-dark.svg | 16 ++++++++-------- .../beta/logo/metamask-logo-horizontal.svg | 16 ++++++++-------- ui/components/app/app-header/index.scss | 8 -------- .../ui/metafox-logo/metafox-logo.component.js | 11 ++--------- ui/helpers/utils/build-types.js | 2 -- .../create-password/create-password.component.js | 3 +-- .../end-of-flow/end-of-flow.component.js | 3 +-- .../metametrics-opt-in.component.js | 3 +-- .../seed-phrase/seed-phrase.component.js | 3 +-- .../select-action/select-action.component.js | 3 +-- ui/pages/routes/routes.component.js | 2 -- 11 files changed, 23 insertions(+), 47 deletions(-) diff --git a/app/build-types/beta/logo/metamask-logo-horizontal-dark.svg b/app/build-types/beta/logo/metamask-logo-horizontal-dark.svg index 3155a5149..43a44eb0e 100644 --- a/app/build-types/beta/logo/metamask-logo-horizontal-dark.svg +++ b/app/build-types/beta/logo/metamask-logo-horizontal-dark.svg @@ -1,13 +1,13 @@ - - - - - - - - + + + + + + + + diff --git a/app/build-types/beta/logo/metamask-logo-horizontal.svg b/app/build-types/beta/logo/metamask-logo-horizontal.svg index 43a44eb0e..3155a5149 100644 --- a/app/build-types/beta/logo/metamask-logo-horizontal.svg +++ b/app/build-types/beta/logo/metamask-logo-horizontal.svg @@ -1,13 +1,13 @@ - - - - - - - - + + + + + + + + diff --git a/ui/components/app/app-header/index.scss b/ui/components/app/app-header/index.scss index ab706635e..78fb809e3 100644 --- a/ui/components/app/app-header/index.scss +++ b/ui/components/app/app-header/index.scss @@ -96,10 +96,6 @@ flex: 1 0 auto; width: 0; justify-content: flex-end; - - .beta & span { - color: $ui-3; - } } &__network-down-arrow { @@ -108,8 +104,4 @@ background-size: contain; background-position: center; } - - .beta & { - background: $ui-black; - } } diff --git a/ui/components/ui/metafox-logo/metafox-logo.component.js b/ui/components/ui/metafox-logo/metafox-logo.component.js index 4a3812dd5..04a626fd0 100644 --- a/ui/components/ui/metafox-logo/metafox-logo.component.js +++ b/ui/components/ui/metafox-logo/metafox-logo.component.js @@ -1,23 +1,20 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; -import { getBuildSpecificAsset } from '../../../helpers/utils/build-types'; export default class MetaFoxLogo extends PureComponent { static propTypes = { onClick: PropTypes.func, unsetIconHeight: PropTypes.bool, - useDark: PropTypes.bool, isOnboarding: PropTypes.bool, }; static defaultProps = { onClick: undefined, - useDark: false, }; render() { - const { onClick, unsetIconHeight, useDark, isOnboarding } = this.props; + const { onClick, unsetIconHeight, isOnboarding } = this.props; const iconProps = unsetIconHeight ? {} : { height: 42, width: 42 }; return ( @@ -31,11 +28,7 @@ export default class MetaFoxLogo extends PureComponent { > - + - +
🎉
{t('congratulations')}
diff --git a/ui/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.component.js b/ui/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.component.js index 97ba3cd47..883f086d5 100644 --- a/ui/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.component.js +++ b/ui/pages/first-time-flow/metametrics-opt-in/metametrics-opt-in.component.js @@ -2,7 +2,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import MetaFoxLogo from '../../../components/ui/metafox-logo'; import PageContainerFooter from '../../../components/ui/page-container/page-container-footer'; -import { isBeta } from '../../../helpers/utils/build-types'; export default class MetaMetricsOptIn extends Component { static propTypes = { @@ -31,7 +30,7 @@ export default class MetaMetricsOptIn extends Component { return (
- +
diff --git a/ui/pages/first-time-flow/seed-phrase/seed-phrase.component.js b/ui/pages/first-time-flow/seed-phrase/seed-phrase.component.js index db31f3c39..612e86c77 100644 --- a/ui/pages/first-time-flow/seed-phrase/seed-phrase.component.js +++ b/ui/pages/first-time-flow/seed-phrase/seed-phrase.component.js @@ -11,7 +11,6 @@ import { DEFAULT_ROUTE, } from '../../../helpers/constants/routes'; import MetaFoxLogo from '../../../components/ui/metafox-logo'; -import { isBeta } from '../../../helpers/utils/build-types'; import ConfirmSeedPhrase from './confirm-seed-phrase'; import RevealSeedPhrase from './reveal-seed-phrase'; import SeedPhraseIntro from './seed-phrase-intro'; @@ -51,7 +50,7 @@ export default class SeedPhrase extends PureComponent { return (
- + - +
diff --git a/ui/pages/routes/routes.component.js b/ui/pages/routes/routes.component.js index 620e34cff..91a68e17c 100644 --- a/ui/pages/routes/routes.component.js +++ b/ui/pages/routes/routes.component.js @@ -62,7 +62,6 @@ import { ENVIRONMENT_TYPE_POPUP, } from '../../../shared/constants/app'; import { getEnvironmentType } from '../../../app/scripts/lib/util'; -import { isBeta } from '../../helpers/utils/build-types'; import ConfirmationPage from '../confirmation'; import OnboardingFlow from '../onboarding-flow/onboarding-flow'; @@ -304,7 +303,6 @@ export default class Routes extends Component { [`os-${os}`]: os, [`browser-${browser}`]: browser, 'mouse-user-styles': isMouseUser, - 'beta': isBeta(), })} dir={textDirection} onClick={() => setMouseUserState(true)} From a83d50a4895e3ea1d528d0adb633092f6242e59d Mon Sep 17 00:00:00 2001 From: David Walsh Date: Thu, 28 Oct 2021 18:38:58 -0500 Subject: [PATCH 18/97] Provide instructions for users switching from Ledger Live to WebHID (#12519) --- app/_locales/en/messages.json | 3 +++ .../advanced-tab/advanced-tab.component.js | 15 +++++++++++++++ ui/pages/settings/index.scss | 4 ++++ 3 files changed, 22 insertions(+) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 84121790f..9c658b2bc 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -1290,6 +1290,9 @@ "ledgerTimeout": { "message": "Ledger Live is taking too long to respond or connection timeout. Make sure Ledger Live app is opened and your device is unlocked." }, + "ledgerTransportChangeWarning": { + "message": "If your Ledger Live app is open, please disconnect any open Ledger Live connection and close the Ledger Live app." + }, "ledgerWebHIDNotConnectedErrorMessage": { "message": "The ledger device was not connected. If you wish to connect your Ledger, please click 'Continue' again and approve HID connection", "description": "An error message shown to the user during the hardware connect flow." diff --git a/ui/pages/settings/advanced-tab/advanced-tab.component.js b/ui/pages/settings/advanced-tab/advanced-tab.component.js index b83b6956d..41027859e 100644 --- a/ui/pages/settings/advanced-tab/advanced-tab.component.js +++ b/ui/pages/settings/advanced-tab/advanced-tab.component.js @@ -7,6 +7,7 @@ import TextField from '../../../components/ui/text-field'; import Button from '../../../components/ui/button'; import { MOBILE_SYNC_ROUTE } from '../../../helpers/constants/routes'; import Dropdown from '../../../components/ui/dropdown'; +import Dialog from '../../../components/ui/dialog'; import { LEDGER_TRANSPORT_TYPES, @@ -53,6 +54,7 @@ export default class AdvancedTab extends PureComponent { lockTimeError: '', ipfsGateway: this.props.ipfsGateway, ipfsGatewayError: '', + showLedgerTransportWarning: false, }; renderMobileSync() { @@ -489,6 +491,12 @@ export default class AdvancedTab extends PureComponent { options={transportTypeOptions} selectedOption={ledgerTransportType} onChange={async (transportType) => { + if ( + ledgerTransportType === LEDGER_TRANSPORT_TYPES.LIVE && + transportType === LEDGER_TRANSPORT_TYPES.WEBHID + ) { + this.setState({ showLedgerTransportWarning: true }); + } setLedgerLivePreference(transportType); if ( transportType === LEDGER_TRANSPORT_TYPES.WEBHID && @@ -500,6 +508,13 @@ export default class AdvancedTab extends PureComponent { } }} /> + {this.state.showLedgerTransportWarning ? ( + +
+ {t('ledgerTransportChangeWarning')} +
+
+ ) : null}
diff --git a/ui/pages/settings/index.scss b/ui/pages/settings/index.scss index 2f178e7ef..cfb52a122 100644 --- a/ui/pages/settings/index.scss +++ b/ui/pages/settings/index.scss @@ -190,6 +190,10 @@ cursor: not-allowed; opacity: 0.5; } + + & .dialog { + margin-top: 10px; + } } &__content-label { From 90e55a445efa7c9d096a6f70cf1443d9cbb4e5e0 Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Thu, 28 Oct 2021 23:05:58 -0230 Subject: [PATCH 19/97] Add static files for the Flask build (#12518) Static files have been added for the Flask build. This includes logos of each size and variety that we use, and it includes the 3D model JSON file. Closes #12427 --- app/build-types/flask/flask-mascot.json | 824 ++++++++++++++++++ app/build-types/flask/icon-128.png | Bin 0 -> 19842 bytes app/build-types/flask/icon-16.png | Bin 0 -> 902 bytes app/build-types/flask/icon-19.png | Bin 0 -> 1149 bytes app/build-types/flask/icon-32.png | Bin 0 -> 2417 bytes app/build-types/flask/icon-38.png | Bin 0 -> 3153 bytes app/build-types/flask/icon-48.png | Bin 0 -> 4388 bytes app/build-types/flask/icon-512.png | Bin 0 -> 216245 bytes app/build-types/flask/icon-64.png | Bin 0 -> 6827 bytes app/build-types/flask/logo/metamask-fox.svg | 102 +++ .../logo/metamask-logo-horizontal-dark.svg | 116 +++ .../flask/logo/metamask-logo-horizontal.svg | 116 +++ app/manifest/_flask_modifications.json | 26 + development/build/manifest.js | 3 + development/build/static.js | 6 + package.json | 2 +- ui/helpers/utils/build-types.js | 4 + yarn.lock | 2 +- 18 files changed, 1199 insertions(+), 2 deletions(-) create mode 100644 app/build-types/flask/flask-mascot.json create mode 100644 app/build-types/flask/icon-128.png create mode 100644 app/build-types/flask/icon-16.png create mode 100644 app/build-types/flask/icon-19.png create mode 100644 app/build-types/flask/icon-32.png create mode 100644 app/build-types/flask/icon-38.png create mode 100644 app/build-types/flask/icon-48.png create mode 100644 app/build-types/flask/icon-512.png create mode 100644 app/build-types/flask/icon-64.png create mode 100644 app/build-types/flask/logo/metamask-fox.svg create mode 100644 app/build-types/flask/logo/metamask-logo-horizontal-dark.svg create mode 100644 app/build-types/flask/logo/metamask-logo-horizontal.svg create mode 100644 app/manifest/_flask_modifications.json diff --git a/app/build-types/flask/flask-mascot.json b/app/build-types/flask/flask-mascot.json new file mode 100644 index 000000000..43b200544 --- /dev/null +++ b/app/build-types/flask/flask-mascot.json @@ -0,0 +1,824 @@ +{ + "chunks": [ + { + "faces": [ + [0, 1, 2], + [2, 3, 0], + [4, 5, 2], + [6, 3, 2], + [2, 5, 6], + [7, 8, 9], + [10, 3, 6], + [10, 50, 7], + [7, 3, 10], + [7, 9, 3], + [49, 0, 9], + [3, 9, 0], + [2, 1, 4] + ], + "name": "left ear", + "gradient": "left-ear-gradient" + }, + { + "faces": [ + [53, 54, 55], + [55, 56, 53], + [57, 56, 55], + [58, 59, 55], + [55, 54, 58], + [60, 61, 62], + [63, 58, 54], + [63, 60, 89], + [60, 63, 54], + [60, 54, 61], + [88, 61, 53], + [54, 53, 61], + [55, 59, 57] + ], + "name": "right ear", + "gradient": "right-ear-gradient" + }, + { + "color": [22, 22, 22], + "faces": [[11, 12, 13]], + "name": "left eye" + }, + { + "color": [22, 22, 22], + "faces": [[64, 65, 66]], + "name": "right eye" + }, + { + "faces": [ + [14, 15, 11], + [11, 16, 14] + ], + "name": "left inner eye", + "gradient": "left-inner-eye-gradient" + }, + { + "faces": [[17, 12, 18]], + "name": "left outer eye", + "gradient": "left-outer-eye-gradient" + }, + { + "faces": [[41, 64, 37]], + "name": "right lower inner eye", + "gradient": "right-inner-eye-gradient" + }, + { + "faces": [[67, 68, 66]], + "name": "right outer eye", + "gradient": "right-outer-eye-gradient" + }, + { + "color": [223, 117, 84], + "faces": [ + [19, 20, 21], + [21, 22, 19], + [20, 19, 23], + [23, 24, 20], + [23, 25, 24], + [19, 22, 26], + [26, 27, 19], + [23, 28, 29], + [23, 29, 30], + [25, 23, 30], + [29, 51, 52], + [52, 30, 29], + [27, 26, 69], + [69, 70, 27], + [70, 71, 72], + [72, 27, 70], + [72, 71, 73], + [51, 74, 72], + [52, 51, 72], + [73, 52, 72], + [19, 27, 74], + [74, 28, 19], + [51, 29, 28], + [28, 74, 51], + [74, 27, 72], + [28, 23, 19] + ], + "name": "lower chin" + }, + { + "color": [255, 159, 90], + "faces": [ + [21, 20, 24], + [24, 31, 21] + ], + "name": "left lower snout" + }, + { + "color": [255, 159, 90], + "faces": [ + [69, 71, 70], + [71, 69, 75] + ], + "name": "right lower snout" + }, + { + "color": [147, 131, 250], + "faces": [[31, 24, 18]], + "name": "left upper snout" + }, + { + "faces": [ + [6, 5, 16], + [16, 17, 6] + ], + "name": "left forehead", + "gradient": "left-forehead-gradient" + }, + { + "faces": [ + [24, 32, 33], + [33, 34, 24] + ], + "name": "left lower cheek", + "gradient": "left-lower-cheek-gradient" + }, + { + "faces": [[5, 4, 35]], + "name": "left top ear", + "gradient": "left-top-ear-gradient" + }, + { + "color": [147, 131, 250], + "faces": [[75, 68, 71]], + "name": "right upper snout" + }, + { + "faces": [ + [58, 67, 40], + [40, 59, 58] + ], + "name": "right forhead", + "gradient": "right-forehead-gradient" + }, + { + "faces": [ + [71, 76, 77], + [77, 78, 71] + ], + "name": "right lower cheek", + "gradient": "right-lower-cheek-gradient" + }, + { + "faces": [[24, 34, 18]], + "name": "left middle cheek", + "gradient": "left-middle-cheek-gradient" + }, + { + "color": [156, 90, 221], + "faces": [ + [16, 13, 12], + [12, 17, 16], + [13, 16, 11] + ], + "name": "left above eye" + }, + { + "faces": [[71, 68, 76]], + "name": "right middle cheek", + "gradient": "right-middle-cheek-gradient" + }, + { + "color": [156, 90, 221], + "faces": [ + [40, 67, 66], + [66, 65, 40], + [65, 64, 40] + ], + "name": "right above eye" + }, + { + "color": [22, 22, 22], + "faces": [ + [36, 15, 37], + [37, 38, 36], + [31, 39, 22], + [22, 21, 31], + [31, 15, 36], + [36, 39, 31], + [75, 69, 26], + [26, 80, 75], + [75, 80, 38], + [38, 37, 75], + [38, 80, 39], + [39, 36, 38], + [39, 80, 26], + [26, 22, 39] + ], + "name": "nose" + }, + { + "faces": [ + [17, 33, 10], + [17, 18, 34], + [34, 33, 17], + [10, 6, 17] + ], + "name": "left upper cheek", + "gradient": "left-upper-cheek-gradient" + }, + { + "faces": [ + [11, 15, 31], + [31, 18, 11], + [18, 12, 11] + ], + "name": "left below eye", + "gradient": "left-below-eye-gradient" + }, + { + "faces": [ + [14, 16, 40], + [40, 41, 14], + [59, 5, 35], + [35, 79, 59], + [14, 41, 37], + [37, 15, 14], + [5, 59, 40], + [40, 16, 5] + ], + "name": "forehead", + "gradient": "forehead-gradient" + }, + { + "faces": [ + [67, 63, 77], + [67, 77, 76], + [76, 68, 67], + [63, 67, 58] + ], + "name": "right upper cheek", + "gradient": "right-upper-cheek-gradient" + }, + { + "faces": [ + [64, 68, 75], + [75, 37, 64], + [68, 64, 66] + ], + "name": "right below eye", + "gradient": "right-below-eye-gradient" + }, + { + "faces": [ + [35, 4, 42], + [4, 1, 42], + [42, 43, 44], + [44, 35, 42], + [45, 43, 42], + [42, 10, 45], + [30, 32, 24], + [24, 25, 30], + [30, 33, 32], + [33, 30, 10], + [44, 43, 46], + [43, 45, 47], + [47, 46, 43], + [48, 47, 45], + [45, 30, 48], + [30, 45, 10], + [49, 42, 0], + [8, 7, 42], + [50, 42, 7], + [50, 10, 42], + [1, 0, 42], + [42, 9, 8], + [42, 49, 9], + [79, 81, 57], + [57, 81, 56], + [82, 79, 35], + [35, 44, 82], + [81, 79, 82], + [82, 83, 81], + [84, 63, 81], + [81, 83, 84], + [44, 46, 85], + [85, 82, 44], + [52, 73, 71], + [71, 78, 52], + [52, 78, 77], + [77, 63, 52], + [82, 85, 83], + [83, 85, 86], + [86, 84, 83], + [87, 52, 84], + [84, 86, 87], + [52, 63, 84], + [88, 53, 81], + [62, 81, 60], + [89, 60, 81], + [89, 81, 63], + [56, 81, 53], + [81, 62, 61], + [81, 61, 88], + [48, 87, 86], + [86, 47, 48], + [47, 86, 85], + [85, 46, 47], + [48, 30, 52], + [52, 87, 48] + ], + "name": "back", + "gradient": "back-gradient" + }, + { + "faces": [[57, 59, 79]], + "name": "right top ear", + "gradient": "right-top-ear-gradient" + }, + { + "faces": [[64, 41, 40]], + "name": "right inner upper eye", + "gradient": "right-inner-eye-gradient" + } + ], + "gradients": { + "left-inner-eye-gradient": { + "type": "linear", + "x1": "41.97721822541966%", + "y1": "67.79239690721649%", + "x2": "44.56654676258992%", + "y2": "67.79239690721649%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#BA86F3" + }, + { + "offset": "0.5281", + "stop-color": "#B786F4" + }, + { + "offset": "0.8987", + "stop-color": "#AE86F5" + }, + { + "offset": "1", + "stop-color": "#AA86F6" + } + ] + }, + "right-inner-eye-gradient": { + "type": "linear", + "x1": "56.72805755395684%", + "y1": "81.08904639175258%", + "x2": "56.72805755395684%", + "y2": "54.49574742268041%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#BA86F3" + }, + { + "offset": "0.5281", + "stop-color": "#B786F4" + }, + { + "offset": "0.8987", + "stop-color": "#AE86F5" + }, + { + "offset": "1", + "stop-color": "#AA86F6" + } + ] + }, + "left-middle-cheek-gradient": { + "type": "linear", + "x1": "25.107913669064747%", + "y1": "72.68865979381442%", + "x2": "25.107913669064747%", + "y2": "89.44690721649484%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#6848BA" + }, + { + "offset": "0.3363", + "stop-color": "#6356D5" + } + ] + }, + "right-middle-cheek-gradient": { + "type": "linear", + "x1": "74.89208633093526%", + "y1": "51.32938144329896%", + "x2": "74.89208633093526%", + "y2": "94.76301546391753%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#6848BA" + }, + { + "offset": "0.3363", + "stop-color": "#6356D5" + } + ] + }, + "right-forehead-gradient": { + "type": "linear", + "x1": "67.00671462829736%", + "y1": "30.13930412371134%", + "x2": "67.00671462829736%", + "y2": "54.49561855670103%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#DC69E6" + }, + { + "offset": "1", + "stop-color": "#C289F3" + } + ] + }, + "left-forehead-gradient": { + "type": "linear", + "x1": "32.99340527577938%", + "y1": "30.13930412371134%", + "x2": "32.99340527577938%", + "y2": "54.49561855670103%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#DC69E6" + }, + { + "offset": "1", + "stop-color": "#C289F3" + } + ] + }, + "right-top-ear-gradient": { + "type": "linear", + "x1": "95.056858513189448%", + "y1": "15.06958762886598%", + "x2": "57.31654676258992%", + "y2": "15.06958762886598%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#BB65ED" + }, + { + "offset": "1", + "stop-color": "#E560E3" + } + ] + }, + "left-top-ear-gradient": { + "type": "linear", + "x1": "4.943141486810552%", + "y1": "15.06958762886598%", + "x2": "42.68345323741008%", + "y2": "15.06958762886598%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#BB65ED" + }, + { + "offset": "1", + "stop-color": "#E560E3" + } + ] + }, + "left-lower-cheek-gradient": { + "type": "linear", + "x1": "15.103956834532372%", + "y1": "72.6889175257732%", + "x2": "15.103956834532372%", + "y2": "96.03221649484537%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#906EF7" + }, + { + "offset": "1", + "stop-color": "#575ADE" + } + ] + }, + "right-lower-cheek-gradient": { + "type": "linear", + "x1": "84.91570743405276%", + "y1": "72.6889175257732%", + "x2": "84.91570743405276%", + "y2": "96.03221649484537%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#906EF7" + }, + { + "offset": "1", + "stop-color": "#575ADE" + } + ] + }, + "right-outer-eye-gradient": { + "type": "linear", + "x1": "68.7720623501199%", + "y1": "63.14909793814433%", + "x2": "78.03057553956835%", + "y2": "63.14909793814433%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#BA86F3" + }, + { + "offset": "0.5281", + "stop-color": "#B786F4" + }, + { + "offset": "0.8987", + "stop-color": "#AE86F5" + }, + { + "offset": "1", + "stop-color": "#AA86F6" + } + ] + }, + "left-outer-eye-gradient": { + "type": "linear", + "x1": "21.969424460431654%", + "y1": "63.14909793814433%", + "x2": "31.227937649880094%", + "y2": "63.14909793814433%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#BA86F3" + }, + { + "offset": "0.5281", + "stop-color": "#B786F4" + }, + { + "offset": "0.8987", + "stop-color": "#AE86F5" + }, + { + "offset": "1", + "stop-color": "#AA86F6" + } + ] + }, + "left-ear-gradient": { + "type": "linear", + "x1": "50%", + "y1": "30%", + "x2": "4%", + "y2": "4%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#541758" + }, + { + "offset": "0.4286", + "stop-color": "#4F206C" + }, + { + "offset": "0.62", + "stop-color": "#4D2577" + }, + { + "offset": "1", + "stop-color": "#8B45B6" + } + ] + }, + "right-ear-gradient": { + "type": "linear", + "x1": "50%", + "y1": "30%", + "x2": "96%", + "y2": "4%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#541758" + }, + { + "offset": "0.4286", + "stop-color": "#4F206C" + }, + { + "offset": "0.62", + "stop-color": "#4D2577" + }, + { + "offset": "1", + "stop-color": "#8B45B6" + } + ] + }, + "left-below-eye-gradient": { + "type": "linear", + "x1": "30.914028776978412%", + "y1": "72.83646907216496%", + "x2": "44.56654676258992%", + "y2": "72.83646907216496%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#C8A8F7" + }, + { + "offset": "1", + "stop-color": "#BAAAFB" + } + ] + }, + "right-below-eye-gradient": { + "type": "linear", + "x1": "55.43345323741007%", + "y1": "72.83646907216496%", + "x2": "69.12517985611511%", + "y2": "72.83646907216496%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#C8A8F7" + }, + { + "offset": "1", + "stop-color": "#BAAAFB" + } + ] + }, + "left-upper-cheek-gradient": { + "type": "linear", + "x1": "16.02589928057554%", + "y1": "43.35154639175258%", + "x2": "16.02589928057554%", + "y2": "72.85773195876288%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#B65FE5" + }, + { + "offset": "1", + "stop-color": "#ADA2FC" + } + ] + }, + "right-upper-cheek-gradient": { + "type": "linear", + "x1": "83.99364508393285%", + "y1": "43.35154639175258%", + "x2": "83.99364508393285%", + "y2": "72.85773195876288%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#B65FE5" + }, + { + "offset": "1", + "stop-color": "#ADA2FC" + } + ] + }, + "forehead-gradient": { + "type": "linear", + "x1": "50%", + "y1": "12.790180412371136%", + "x2": "50%", + "y2": "81.08904639175258%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#FB7FE4" + }, + { + "offset": "1", + "stop-color": "#BCABFB" + } + ] + }, + "back-gradient": { + "type": "linear", + "x1": "50%", + "y1": "12.790180412371136%", + "x2": "50%", + "y2": "81.08904639175258%", + "gradientUnits": "userSpaceOnUse", + "stops": [ + { + "stop-color": "#FB7FE4" + }, + { + "offset": "1", + "stop-color": "#5C5CE0" + } + ] + } + }, + "positions": [ + [111.024597, 52.604599, 46.225899], + [114.025002, 87.673302, 58.9818], + [66.192001, 80.898003, 55.394299], + [72.113297, 35.491798, 30.871401], + [97.804497, 116.560997, 73.978798], + [16.7623, 58.010899, 58.078201], + [52.608898, 30.3641, 42.556099], + [106.881401, 31.945499, 46.9133], + [113.484596, 38.6049, 49.121498], + [108.6633, 43.2332, 46.315399], + [101.216599, 15.9822, 46.308201], + [16.6605, -16.2883, 93.618698], + [40.775002, -10.2288, 85.276398], + [23.926901, -2.5103, 86.736504], + [11.1691, -7.0037, 99.377602], + [9.5692, -34.393902, 141.671997], + [12.596, 7.1655, 88.740997], + [61.180901, 8.8142, 76.996803], + [39.719501, -28.927099, 88.963799], + [13.7962, -68.575699, 132.057007], + [15.2674, -62.32, 129.688004], + [14.8446, -52.6096, 140.113007], + [12.8917, -49.771599, 144.740997], + [35.604198, -71.758003, 81.063904], + [47.462502, -68.606102, 63.369701], + [38.2486, -64.730202, 38.909901], + [-12.8917, -49.771599, 144.740997], + [-13.7962, -68.575699, 132.057007], + [17.802099, -71.758003, 81.063904], + [19.1243, -69.0168, 49.420101], + [38.2486, -66.275597, 17.776199], + [12.8928, -36.703499, 141.671997], + [109.283997, -93.589897, 27.824301], + [122.117996, -36.8894, 35.025002], + [67.7668, -30.197001, 78.417801], + [33.180698, 101.851997, 25.3186], + [9.4063, -35.589802, 150.722], + [-9.5692, -34.393902, 141.671997], + [-9.4063, -35.589802, 150.722], + [11.4565, -37.899399, 150.722], + [-12.596, 7.1655, 88.740997], + [-11.1691, -7.0037, 99.377602], + [70.236504, 62.836201, -3.9475], + [47.263401, 54.293999, -27.414801], + [28.7302, 91.731102, -24.972601], + [69.167603, 6.5862, -12.7757], + [28.7302, 49.1003, -48.3596], + [31.903, 5.692, -47.821999], + [35.075802, -34.432899, -16.280899], + [115.284103, 48.681499, 48.684101], + [110.842796, 28.4821, 49.176201], + [-19.1243, -69.0168, 49.420101], + [-38.2486, -66.275597, 17.776199], + [-111.024597, 52.604599, 46.225899], + [-72.113297, 35.491798, 30.871401], + [-66.192001, 80.898003, 55.394299], + [-114.025002, 87.673302, 58.9818], + [-97.804497, 116.560997, 73.978798], + [-52.608898, 30.3641, 42.556099], + [-16.7623, 58.010899, 58.078201], + [-106.881401, 31.945499, 46.9133], + [-108.6633, 43.2332, 46.315399], + [-113.484596, 38.6049, 49.121498], + [-101.216599, 15.9822, 46.308201], + [-16.6605, -16.2883, 93.618698], + [-23.926901, -2.5103, 86.736504], + [-40.775002, -10.2288, 85.276398], + [-61.180901, 8.8142, 76.996803], + [-39.719501, -28.927099, 88.963799], + [-14.8446, -52.6096, 140.113007], + [-15.2674, -62.32, 129.688004], + [-47.462502, -68.606102, 63.369701], + [-35.604198, -71.758003, 81.063904], + [-38.2486, -64.730202, 38.909901], + [-17.802099, -71.758003, 81.063904], + [-12.8928, -36.703499, 141.671997], + [-67.7668, -30.197001, 78.417801], + [-122.117996, -36.8894, 35.025002], + [-109.283997, -93.589897, 27.824301], + [-33.180698, 101.851997, 25.3186], + [-11.4565, -37.899399, 150.722], + [-70.236504, 62.836201, -3.9475], + [-28.7302, 91.731102, -24.972601], + [-47.263401, 54.293999, -27.414801], + [-69.167603, 6.5862, -12.7757], + [-28.7302, 49.1003, -48.3596], + [-31.903, 5.692, -47.821999], + [-35.075802, -34.432899, -16.280899], + [-115.284103, 48.681499, 48.684101], + [-110.842796, 28.4821, 49.176201] + ] +} diff --git a/app/build-types/flask/icon-128.png b/app/build-types/flask/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..4dddd86c3fcbb612b198154b0508363a9674d324 GIT binary patch literal 19842 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 literal 0 HcmV?d00001 diff --git a/app/build-types/flask/icon-16.png b/app/build-types/flask/icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..f67228dbc10c91f9ef608036e5fc4626b9606406 GIT binary patch literal 902 zcmV;119|+3P)iWddh(zW2`)W&vmUYbO|bvsxs>h}HO#rLnz4LSM6 zJk-4BXRFzVpnz_x8u@J|OPd?<)TLV&yoQOvGdm!4qKd|ZSPSo=9#p+I{PF3%y~ERr z0V#b<04%1P3amG4SX%uHQA%~D2b@b^j6ZwoL}Iib>lRvZ1OMH+3~d$mJnaL00vZe| zO!4dgf8eLRbRb|4lScg!ijZlTST3>u2y5J58J15&oh?Mp*NsL%4Y$qCrN5^sGl~ahN=&o`6wRaHM6o22igdQ%C z+$khD zy!-$zEdLA{yYTr)SHa5G4Ir;DHhLT)C%W=QN(hS*`}Q;ayX&MyNd#6!G~Hrocb<$T zBijv~B?7UoAVS%77QjA7WN4R|#M~a6qFvzJ9ohjY@*Vj`l zm6y@eGlJgU-Cc8aY8!Gh4$l#JiCYUNHwc%CRv4lA?*eAN`I6jZ`22%O=@;h+B7jrycetXAV!Z literal 0 HcmV?d00001 diff --git a/app/build-types/flask/icon-19.png b/app/build-types/flask/icon-19.png new file mode 100644 index 0000000000000000000000000000000000000000..40ff28ba7b0c1155f19f60506b38fc4ce4b7261a GIT binary patch literal 1149 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 literal 0 HcmV?d00001 diff --git a/app/build-types/flask/icon-38.png b/app/build-types/flask/icon-38.png new file mode 100644 index 0000000000000000000000000000000000000000..05f0b4b51b3e7b721196b4644abdcc48b722d5df GIT binary patch literal 3153 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 literal 0 HcmV?d00001 diff --git a/app/build-types/flask/icon-48.png b/app/build-types/flask/icon-48.png new file mode 100644 index 0000000000000000000000000000000000000000..5e280b4e07bef72af17aca4be479a3c4b726b154 GIT binary patch literal 4388 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�_VIIO(w;I=QJ9i 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

0}Ln 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%0D0?_a;fe2ryvd?rK2Y4CP9^EY~= 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 I>zopr08bD`i2wiq literal 0 HcmV?d00001 diff --git a/app/build-types/flask/icon-64.png b/app/build-types/flask/icon-64.png new file mode 100644 index 0000000000000000000000000000000000000000..680a96b10f0e05d1c779ed6d896664c64a87cf0a GIT binary patch literal 6827 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/build-types/flask/logo/metamask-logo-horizontal-dark.svg b/app/build-types/flask/logo/metamask-logo-horizontal-dark.svg new file mode 100644 index 000000000..c38ba8c45 --- /dev/null +++ b/app/build-types/flask/logo/metamask-logo-horizontal-dark.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/build-types/flask/logo/metamask-logo-horizontal.svg b/app/build-types/flask/logo/metamask-logo-horizontal.svg new file mode 100644 index 000000000..450ac8434 --- /dev/null +++ b/app/build-types/flask/logo/metamask-logo-horizontal.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/manifest/_flask_modifications.json b/app/manifest/_flask_modifications.json new file mode 100644 index 000000000..d9c8ec220 --- /dev/null +++ b/app/manifest/_flask_modifications.json @@ -0,0 +1,26 @@ +{ + "browser_action": { + "default_icon": { + "16": "images/icon-16.png", + "19": "images/icon-19.png", + "32": "images/icon-32.png", + "38": "images/icon-38.png", + "64": "images/icon-64.png", + "128": "images/icon-128.png", + "512": "images/icon-512.png" + }, + "default_title": "MetaMask Flask" + }, + "icons": { + "16": "images/icon-16.png", + "19": "images/icon-19.png", + "32": "images/icon-32.png", + "38": "images/icon-38.png", + "48": "images/icon-48.png", + "64": "images/icon-64.png", + "128": "images/icon-128.png", + "512": "images/icon-512.png" + }, + "name": "__MSG_appName__ Flask", + "short_name": "__MSG_appName__ Flask" +} diff --git a/development/build/manifest.js b/development/build/manifest.js index ebca66f16..5df1f2511 100644 --- a/development/build/manifest.js +++ b/development/build/manifest.js @@ -4,6 +4,7 @@ const { merge, cloneDeep } = require('lodash'); const baseManifest = require('../../app/manifest/_base.json'); const betaManifestModifications = require('../../app/manifest/_beta_modifications.json'); +const flaskManifestModifications = require('../../app/manifest/_flask_modifications.json'); const { createTask, composeSeries } = require('./task'); const { BuildType } = require('./utils'); @@ -116,6 +117,8 @@ function getBuildModifications(buildType) { const buildModifications = {}; if (buildType === BuildType.beta) { Object.assign(buildModifications, betaManifestModifications); + } else if (buildType === BuildType.flask) { + Object.assign(buildModifications, flaskManifestModifications); } return buildModifications; } diff --git a/development/build/static.js b/development/build/static.js index 8c1961973..568bda910 100644 --- a/development/build/static.js +++ b/development/build/static.js @@ -27,6 +27,12 @@ module.exports = function createStaticAssetTasks({ dest: `images`, }, ], + [BuildType.flask]: [ + { + src: './app/build-types/flask/', + dest: `images`, + }, + ], }; if (Object.keys(additionalBuildTargets).includes(buildType)) { diff --git a/package.json b/package.json index f82a0a1c3..20e273416 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ "@metamask/eth-token-tracker": "^3.0.1", "@metamask/etherscan-link": "^2.1.0", "@metamask/jazzicon": "^2.0.0", - "@metamask/logo": "^3.0.1", + "@metamask/logo": "^3.1.0", "@metamask/obs-store": "^5.0.0", "@metamask/post-message-stream": "^4.0.0", "@metamask/providers": "^8.1.1", diff --git a/ui/helpers/utils/build-types.js b/ui/helpers/utils/build-types.js index 478ef3beb..759466e66 100644 --- a/ui/helpers/utils/build-types.js +++ b/ui/helpers/utils/build-types.js @@ -1,4 +1,5 @@ import betaJson from '../../../app/build-types/beta/beta-mascot.json'; +import flaskJson from '../../../app/build-types/flask/flask-mascot.json'; const assetList = { main: { @@ -8,6 +9,9 @@ const assetList = { beta: { foxMeshJson: betaJson, }, + flask: { + foxMeshJson: flaskJson, + }, }; export function isBeta() { diff --git a/yarn.lock b/yarn.lock index 3143017b7..cb4b12f48 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2862,7 +2862,7 @@ color "^0.11.3" mersenne-twister "^1.1.0" -"@metamask/logo@^3.0.1": +"@metamask/logo@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@metamask/logo/-/logo-3.1.0.tgz#6b7b9b90b6d846583558de855511d34796735855" integrity sha512-W0FBwIaG1pC4Vk/ZdUJYv7PDjnAbQJro3yhEXN7WXEdz8kyVcxFb6dj0Dpe6ytaveYiqIL6+iDDWMevzU2MpVw== From 6221365980cd9062edfe325655ca020cd7b6e252 Mon Sep 17 00:00:00 2001 From: filipsekulic Date: Fri, 29 Oct 2021 13:55:23 +0200 Subject: [PATCH 20/97] Update icons on the settings page (#12359) --- app/images/caret-right.svg | 4 ++-- ui/components/app/tab-bar/index.scss | 5 ++--- ui/pages/settings/index.scss | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/images/caret-right.svg b/app/images/caret-right.svg index b1a990ad1..1308f59ce 100644 --- a/app/images/caret-right.svg +++ b/app/images/caret-right.svg @@ -1,3 +1,3 @@ - - + + diff --git a/ui/components/app/tab-bar/index.scss b/ui/components/app/tab-bar/index.scss index c6bac6edc..6160f64c2 100644 --- a/ui/components/app/tab-bar/index.scss +++ b/ui/components/app/tab-bar/index.scss @@ -61,9 +61,8 @@ @media screen and (max-width: $break-small) { display: block; background-image: url('/images/caret-right.svg'); - width: 36px; - height: 36px; - opacity: 0.5; + width: 8.27px; + height: 13.64px; background-size: contain; background-repeat: no-repeat; background-position: center; diff --git a/ui/pages/settings/index.scss b/ui/pages/settings/index.scss index cfb52a122..0ebb018db 100644 --- a/ui/pages/settings/index.scss +++ b/ui/pages/settings/index.scss @@ -115,7 +115,7 @@ &__close-button::after { content: '\00D7'; font-size: 40px; - color: $dusty-gray; + color: $ui-4; cursor: pointer; } From ab1877ae0e1ffb964fb14c1cdc0b18f3a17bc1af Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Fri, 29 Oct 2021 20:12:31 +0530 Subject: [PATCH 21/97] Deleting old GasFeeInputs hook (#12526) --- ui/hooks/useGasFeeInputs.js | 446 ------------------------------------ 1 file changed, 446 deletions(-) delete mode 100644 ui/hooks/useGasFeeInputs.js diff --git a/ui/hooks/useGasFeeInputs.js b/ui/hooks/useGasFeeInputs.js deleted file mode 100644 index 6f52425bf..000000000 --- a/ui/hooks/useGasFeeInputs.js +++ /dev/null @@ -1,446 +0,0 @@ -import { addHexPrefix } from 'ethereumjs-util'; -import { useCallback, useState } from 'react'; -import { useSelector } from 'react-redux'; -import { isEqual } from 'lodash'; -import { GAS_ESTIMATE_TYPES, EDIT_GAS_MODES } from '../../shared/constants/gas'; -import { multiplyCurrencies } from '../../shared/modules/conversion.utils'; -import { - getMaximumGasTotalInHexWei, - getMinimumGasTotalInHexWei, -} from '../../shared/modules/gas.utils'; -import { PRIMARY, SECONDARY } from '../helpers/constants/common'; -import { - checkNetworkAndAccountSupports1559, - getShouldShowFiat, - getAdvancedInlineGasShown, -} from '../selectors'; - -import { - hexWEIToDecGWEI, - decGWEIToHexWEI, - decimalToHex, - hexToDecimal, -} from '../helpers/utils/conversions.util'; -import { GAS_FORM_ERRORS } from '../helpers/constants/gas'; -import { isLegacyTransaction } from '../helpers/utils/transactions.util'; - -import { useCurrencyDisplay } from './useCurrencyDisplay'; -import { useGasFeeEstimates } from './useGasFeeEstimates'; -import { useUserPreferencedCurrency } from './useUserPreferencedCurrency'; -import { useGasFeeErrors } from './useGasFeeErrors'; - -/** - * Opaque string type representing a decimal (base 10) number in GWEI - * @typedef {`${number}`} DecGweiString - */ - -/** - * String value representing the active estimate level to use - * @typedef {'low' | 'medium' | 'high'} EstimateLevel - */ - -/** - * Pulls out gasPrice estimate from either of the two gasPrice estimation - * sources, based on the gasEstimateType and current estimateToUse. - * @param {{import( - * '@metamask/controllers' - * ).GasFeeState['gasFeeEstimates']}} gasFeeEstimates - estimates returned from - * the controller - * @param {import( - * './useGasFeeEstimates' - * ).GasEstimates} gasEstimateType - type of estimate returned from controller - * @param {EstimateLevel} estimateToUse - current estimate level to use - * @returns {[DecGweiString]} - gasPrice estimate to use or null - */ -function getGasPriceEstimate(gasFeeEstimates, gasEstimateType, estimateToUse) { - if (gasEstimateType === GAS_ESTIMATE_TYPES.LEGACY) { - return gasFeeEstimates?.[estimateToUse] ?? '0'; - } else if (gasEstimateType === GAS_ESTIMATE_TYPES.ETH_GASPRICE) { - return gasFeeEstimates?.gasPrice ?? '0'; - } - return '0'; -} - -/** - * Pulls out gas fee estimate from the estimates returned from controller, - * based on the gasEstimateType and current estimateToUse. - * @param {'maxFeePerGas' | 'maxPriorityFeePerGas'} field - field to select - * @param {{import( - * '@metamask/controllers' - * ).GasFeeState['gasFeeEstimates']}} gasFeeEstimates - estimates returned from - * the controller - * @param {import( - * './useGasFeeEstimates' - * ).GasEstimates} gasEstimateType - type of estimate returned from controller - * @param {EstimateLevel} estimateToUse - current estimate level to use - * @returns {[DecGweiString]} - gas fee estimate to use or null - */ -function getGasFeeEstimate( - field, - gasFeeEstimates, - gasEstimateType, - estimateToUse, - fallback = '0', -) { - if (gasEstimateType === GAS_ESTIMATE_TYPES.FEE_MARKET) { - return gasFeeEstimates?.[estimateToUse]?.[field] ?? String(fallback); - } - return String(fallback); -} - -/** - * @typedef {Object} GasFeeInputReturnType - * @property {DecGweiString} [maxFeePerGas] - the maxFeePerGas input value. - * @property {string} [maxFeePerGasFiat] - the maxFeePerGas converted to the - * user's preferred currency. - * @property {(DecGweiString) => void} setMaxFeePerGas - state setter method to - * update the maxFeePerGas. - * @property {DecGweiString} [maxPriorityFeePerGas] - the maxPriorityFeePerGas - * input value. - * @property {string} [maxPriorityFeePerGasFiat] - the maxPriorityFeePerGas - * converted to the user's preferred currency. - * @property {(DecGweiString) => void} setMaxPriorityFeePerGas - state setter - * method to update the maxPriorityFeePerGas. - * @property {DecGweiString} [gasPrice] - the gasPrice input value. - * @property {(DecGweiString) => void} setGasPrice - state setter method to - * update the gasPrice. - * @property {DecGweiString} gasLimit - the gasLimit input value. - * @property {(DecGweiString) => void} setGasLimit - state setter method to - * update the gasLimit. - * @property {EstimateLevel} [estimateToUse] - the estimate level currently - * selected. This will be null if the user has ejected from using the - * estimates. - * @property {([EstimateLevel]) => void} setEstimateToUse - Setter method for - * choosing which EstimateLevel to use. - * @property {string} [estimatedMinimumFiat] - The amount estimated to be paid - * based on current network conditions. Expressed in user's preferred - * currency. - * @property {string} [estimatedMaximumFiat] - the maximum amount estimated to be - * paid if current network transaction volume increases. Expressed in user's - * preferred currency. - * @property {string} [estimatedMaximumNative] - the maximum amount estimated to - * be paid if the current network transaction volume increases. Expressed in - * the network's native currency. - */ - -/** - * Uses gasFeeEstimates and state to keep track of user gas fee inputs. - * Will update the gas fee state when estimates update if the user has not yet - * modified the fields. - * @param {EstimateLevel} defaultEstimateToUse - which estimate - * level to default the 'estimateToUse' state variable to. - * @returns {GasFeeInputReturnType & import( - * './useGasFeeEstimates' - * ).GasEstimates} - gas fee input state and the GasFeeEstimates object - */ -export function useGasFeeInputs( - defaultEstimateToUse = 'medium', - transaction, - minimumGasLimit = '0x5208', - editGasMode, -) { - const supportsEIP1559 = - useSelector(checkNetworkAndAccountSupports1559) && - !isLegacyTransaction(transaction?.txParams); - // We need to know whether to show fiat conversions or not, so that we can - // default our fiat values to empty strings if showing fiat is not wanted or - // possible. - const showFiat = useSelector(getShouldShowFiat); - - // We need to know the current network's currency and its decimal precision - // to calculate the amount to display to the user. - const { - currency: primaryCurrency, - numberOfDecimals: primaryNumberOfDecimals, - } = useUserPreferencedCurrency(PRIMARY); - - // For calculating the value of gas fees in the user's preferred currency we - // first have to know what that currency is and its decimal precision - const { - currency: fiatCurrency, - numberOfDecimals: fiatNumberOfDecimals, - } = useUserPreferencedCurrency(SECONDARY); - - // We need the gas estimates from the GasFeeController in the background. - // Calling this hooks initiates polling for new gas estimates and returns the - // current estimate. - const { - gasEstimateType, - gasFeeEstimates, - isGasEstimatesLoading, - estimatedGasFeeTimeBounds, - } = useGasFeeEstimates(); - - const [initialMaxFeePerGas] = useState( - supportsEIP1559 && !transaction?.txParams?.maxFeePerGas - ? Number(hexWEIToDecGWEI(transaction?.txParams?.gasPrice)) - : Number(hexWEIToDecGWEI(transaction?.txParams?.maxFeePerGas)), - ); - - const [initialMaxPriorityFeePerGas] = useState( - supportsEIP1559 && !transaction?.txParams?.maxPriorityFeePerGas - ? initialMaxFeePerGas - : Number(hexWEIToDecGWEI(transaction?.txParams?.maxPriorityFeePerGas)), - ); - const [initialGasPrice] = useState( - Number(hexWEIToDecGWEI(transaction?.txParams?.gasPrice)), - ); - - const [initialMatchingEstimateLevel] = useState( - transaction?.userFeeLevel || null, - ); - const initialFeeParamsAreCustom = - initialMatchingEstimateLevel === 'custom' || - initialMatchingEstimateLevel === null; - - // This hook keeps track of a few pieces of transitional state. It is - // transitional because it is only used to modify a transaction in the - // metamask (background) state tree. - const [maxFeePerGas, setMaxFeePerGas] = useState( - initialMaxFeePerGas && initialFeeParamsAreCustom - ? initialMaxFeePerGas - : null, - ); - const [maxPriorityFeePerGas, setMaxPriorityFeePerGas] = useState( - initialMaxPriorityFeePerGas && initialFeeParamsAreCustom - ? initialMaxPriorityFeePerGas - : null, - ); - const [gasPriceHasBeenManuallySet, setGasPriceHasBeenManuallySet] = useState( - initialMatchingEstimateLevel === 'custom', - ); - const [gasPrice, setGasPrice] = useState( - initialGasPrice && initialFeeParamsAreCustom ? initialGasPrice : null, - ); - const [gasLimit, setGasLimit] = useState( - Number(hexToDecimal(transaction?.txParams?.gas ?? '0x0')), - ); - - const userPrefersAdvancedGas = useSelector(getAdvancedInlineGasShown); - const dontDefaultToAnEstimateLevel = - userPrefersAdvancedGas && - transaction?.txParams?.maxPriorityFeePerGas && - transaction?.txParams?.maxFeePerGas; - - const initialEstimateToUse = transaction - ? initialMatchingEstimateLevel - : defaultEstimateToUse; - - const [estimateToUse, setInternalEstimateToUse] = useState( - dontDefaultToAnEstimateLevel ? null : initialEstimateToUse, - ); - - // We specify whether to use the estimate value by checking if the state - // value has been set. The state value is only set by user input and is wiped - // when the user selects an estimate. Default here is '0' to avoid bignumber - // errors in later calculations for nullish values. - const maxFeePerGasToUse = - maxFeePerGas ?? - getGasFeeEstimate( - 'suggestedMaxFeePerGas', - gasFeeEstimates, - gasEstimateType, - estimateToUse, - initialMaxFeePerGas, - ); - - const maxPriorityFeePerGasToUse = - maxPriorityFeePerGas ?? - getGasFeeEstimate( - 'suggestedMaxPriorityFeePerGas', - gasFeeEstimates, - gasEstimateType, - estimateToUse, - initialMaxPriorityFeePerGas, - ); - - const [initialGasPriceEstimates] = useState(gasFeeEstimates); - const gasPriceEstimatesHaveNotChanged = isEqual( - initialGasPriceEstimates, - gasFeeEstimates, - ); - const gasPriceToUse = - gasPrice !== null && - (gasPriceHasBeenManuallySet || - gasPriceEstimatesHaveNotChanged || - isLegacyTransaction(transaction?.txParams)) - ? gasPrice - : getGasPriceEstimate( - gasFeeEstimates, - gasEstimateType, - estimateToUse || defaultEstimateToUse, - ); - - // We have two helper methods that take an object that can have either - // gasPrice OR the EIP-1559 fields on it, plus gasLimit. This object is - // conditionally set to the appropriate fields to compute the minimum - // and maximum cost of a transaction given the current estimates or selected - // gas fees. - - const gasSettings = { - gasLimit: decimalToHex(gasLimit), - }; - if (supportsEIP1559) { - gasSettings.maxFeePerGas = maxFeePerGasToUse - ? decGWEIToHexWEI(maxFeePerGasToUse) - : decGWEIToHexWEI(gasPriceToUse || '0'); - gasSettings.maxPriorityFeePerGas = maxPriorityFeePerGasToUse - ? decGWEIToHexWEI(maxPriorityFeePerGasToUse) - : gasSettings.maxFeePerGas; - gasSettings.baseFeePerGas = decGWEIToHexWEI( - gasFeeEstimates.estimatedBaseFee ?? '0', - ); - } else if (gasEstimateType === GAS_ESTIMATE_TYPES.NONE) { - gasSettings.gasPrice = '0x0'; - } else { - gasSettings.gasPrice = decGWEIToHexWEI(gasPriceToUse); - } - - // The maximum amount this transaction will cost - const maximumCostInHexWei = getMaximumGasTotalInHexWei(gasSettings); - - // If in swaps, we want to calculate the minimum gas fee differently than the max - const minGasSettings = {}; - if (editGasMode === EDIT_GAS_MODES.SWAPS) { - minGasSettings.gasLimit = decimalToHex(minimumGasLimit); - } - - // The minimum amount this transaction will cost's - const minimumCostInHexWei = getMinimumGasTotalInHexWei({ - ...gasSettings, - ...minGasSettings, - }); - - // We need to display the estimated fiat currency impact of the - // maxPriorityFeePerGas field to the user. This hook calculates that amount. - const [, { value: maxPriorityFeePerGasFiat }] = useCurrencyDisplay( - addHexPrefix( - multiplyCurrencies(maxPriorityFeePerGasToUse, gasLimit, { - toNumericBase: 'hex', - fromDenomination: 'GWEI', - toDenomination: 'WEI', - multiplicandBase: 10, - multiplierBase: 10, - }), - ), - { - numberOfDecimals: fiatNumberOfDecimals, - currency: fiatCurrency, - }, - ); - - // We need to display thee estimated fiat currency impact of the maxFeePerGas - // field to the user. This hook calculates that amount. This also works for - // the gasPrice amount because in legacy transactions cost is always gasPrice - // * gasLimit. - const [, { value: maxFeePerGasFiat }] = useCurrencyDisplay( - maximumCostInHexWei, - { - numberOfDecimals: fiatNumberOfDecimals, - currency: fiatCurrency, - }, - ); - - // We need to display the total amount of native currency will be expended - // given the selected gas fees. - const [estimatedMaximumNative] = useCurrencyDisplay(maximumCostInHexWei, { - numberOfDecimals: primaryNumberOfDecimals, - currency: primaryCurrency, - }); - - const [estimatedMinimumNative] = useCurrencyDisplay(minimumCostInHexWei, { - numberOfDecimals: primaryNumberOfDecimals, - currency: primaryCurrency, - }); - - // We also need to display our closest estimate of the low end of estimation - // in fiat. - const [, { value: estimatedMinimumFiat }] = useCurrencyDisplay( - minimumCostInHexWei, - { - numberOfDecimals: fiatNumberOfDecimals, - currency: fiatCurrency, - }, - ); - - const { - gasErrors, - hasGasErrors, - gasWarnings, - balanceError, - estimatesUnavailableWarning, - } = useGasFeeErrors({ - transaction, - gasEstimateType, - gasFeeEstimates, - gasLimit, - gasPriceToUse, - isGasEstimatesLoading, - maxPriorityFeePerGasToUse, - maxFeePerGasToUse, - minimumCostInHexWei, - minimumGasLimit, - }); - - const handleGasLimitOutOfBoundError = useCallback(() => { - if (gasErrors.gasLimit === GAS_FORM_ERRORS.GAS_LIMIT_OUT_OF_BOUNDS) { - const transactionGasLimitDec = hexToDecimal(transaction?.txParams?.gas); - const minimumGasLimitDec = hexToDecimal(minimumGasLimit); - setGasLimit( - transactionGasLimitDec > minimumGasLimitDec - ? transactionGasLimitDec - : minimumGasLimitDec, - ); - } - }, [minimumGasLimit, gasErrors.gasLimit, transaction]); - // When a user selects an estimate level, it will wipe out what they have - // previously put in the inputs. This returns the inputs to the estimated - // values at the level specified. - const setEstimateToUse = (estimateLevel) => { - setInternalEstimateToUse(estimateLevel); - handleGasLimitOutOfBoundError(); - setMaxFeePerGas(null); - setMaxPriorityFeePerGas(null); - setGasPrice(null); - setGasPriceHasBeenManuallySet(false); - }; - - return { - maxFeePerGas: maxFeePerGasToUse, - maxFeePerGasFiat: showFiat ? maxFeePerGasFiat : '', - setMaxFeePerGas, - maxPriorityFeePerGas: maxPriorityFeePerGasToUse, - maxPriorityFeePerGasFiat: showFiat ? maxPriorityFeePerGasFiat : '', - setMaxPriorityFeePerGas, - gasPrice: gasPriceToUse, - setGasPrice, - gasLimit, - setGasLimit, - estimateToUse, - setEstimateToUse, - estimatedMinimumFiat: showFiat ? estimatedMinimumFiat : '', - estimatedMaximumFiat: showFiat ? maxFeePerGasFiat : '', - estimatedMaximumNative, - estimatedMinimumNative, - isGasEstimatesLoading, - gasFeeEstimates, - gasEstimateType, - estimatedGasFeeTimeBounds, - onManualChange: () => { - setInternalEstimateToUse('custom'); - handleGasLimitOutOfBoundError(); - // Restore existing values - setGasPrice(gasPriceToUse); - setGasLimit(gasLimit); - setMaxFeePerGas(maxFeePerGasToUse); - setMaxPriorityFeePerGas(maxPriorityFeePerGasToUse); - setGasPriceHasBeenManuallySet(true); - }, - estimatedBaseFee: gasSettings.baseFeePerGas, - gasErrors, - hasGasErrors, - gasWarnings, - balanceError, - estimatesUnavailableWarning, - }; -} From 7e7d0c13f48db556b1f4ff452d24e027c0fa57df Mon Sep 17 00:00:00 2001 From: Olusegun Akintayo Date: Fri, 29 Oct 2021 19:45:50 +0400 Subject: [PATCH 22/97] Show error if user have insufficient gas. (#12531) --- app/_locales/en/messages.json | 3 +++ ui/helpers/constants/error-keys.js | 1 + .../send/send-content/send-content.component.js | 5 +++++ .../send-content/send-content.component.test.js | 15 +++++++++++++++ .../send/send-content/send-content.container.js | 7 ++++++- 5 files changed, 30 insertions(+), 1 deletion(-) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 9c658b2bc..8fce3223d 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -1171,6 +1171,9 @@ "insufficientFunds": { "message": "Insufficient funds." }, + "insufficientFundsForGas": { + "message": "Insufficient funds for gas" + }, "insufficientTokens": { "message": "Insufficient tokens." }, diff --git a/ui/helpers/constants/error-keys.js b/ui/helpers/constants/error-keys.js index e51b87736..8372a3f1e 100644 --- a/ui/helpers/constants/error-keys.js +++ b/ui/helpers/constants/error-keys.js @@ -6,3 +6,4 @@ export const ETH_GAS_PRICE_FETCH_WARNING_KEY = 'ethGasPriceFetchWarning'; export const GAS_PRICE_FETCH_FAILURE_ERROR_KEY = 'gasPriceFetchFailed'; export const GAS_PRICE_EXCESSIVE_ERROR_KEY = 'gasPriceExcessive'; export const UNSENDABLE_ASSET_ERROR_KEY = 'unsendableAsset'; +export const INSUFFICIENT_FUNDS_FOR_GAS_ERROR_KEY = 'insufficientFundsForGas'; diff --git a/ui/pages/send/send-content/send-content.component.js b/ui/pages/send/send-content/send-content.component.js index 738e85a85..6ed0cb02a 100644 --- a/ui/pages/send/send-content/send-content.component.js +++ b/ui/pages/send/send-content/send-content.component.js @@ -7,6 +7,7 @@ import { GAS_PRICE_FETCH_FAILURE_ERROR_KEY, GAS_PRICE_EXCESSIVE_ERROR_KEY, UNSENDABLE_ASSET_ERROR_KEY, + INSUFFICIENT_FUNDS_FOR_GAS_ERROR_KEY, } from '../../../helpers/constants/error-keys'; import SendAmountRow from './send-amount-row'; import SendHexDataRow from './send-hex-data-row'; @@ -30,6 +31,7 @@ export default class SendContent extends Component { isEthGasPrice: PropTypes.bool, noGasPrice: PropTypes.bool, networkOrAccountNotSupports1559: PropTypes.bool, + getIsBalanceInsufficient: PropTypes.bool, }; render() { @@ -41,11 +43,14 @@ export default class SendContent extends Component { noGasPrice, isAssetSendable, networkOrAccountNotSupports1559, + getIsBalanceInsufficient, } = this.props; let gasError; if (gasIsExcessive) gasError = GAS_PRICE_EXCESSIVE_ERROR_KEY; else if (noGasPrice) gasError = GAS_PRICE_FETCH_FAILURE_ERROR_KEY; + else if (getIsBalanceInsufficient) + gasError = INSUFFICIENT_FUNDS_FOR_GAS_ERROR_KEY; return ( diff --git a/ui/pages/send/send-content/send-content.component.test.js b/ui/pages/send/send-content/send-content.component.test.js index d47c8aa4e..cee97b54b 100644 --- a/ui/pages/send/send-content/send-content.component.test.js +++ b/ui/pages/send/send-content/send-content.component.test.js @@ -106,6 +106,21 @@ describe('SendContent Component', () => { ).toStrictEqual(true); expect(wrapper.find(Dialog)).toHaveLength(0); }); + + it('should render insufficient gas dialog', () => { + wrapper.setProps({ + showHexData: false, + getIsBalanceInsufficient: true, + }); + const PageContainerContentChild = wrapper + .find(PageContainerContent) + .children(); + const errorDialogProps = PageContainerContentChild.childAt(0).props(); + expect(errorDialogProps.className).toStrictEqual('send__error-dialog'); + expect(errorDialogProps.children).toStrictEqual( + 'insufficientFundsForGas_t', + ); + }); }); it('should not render the asset dropdown if token length is 0', () => { diff --git a/ui/pages/send/send-content/send-content.container.js b/ui/pages/send/send-content/send-content.container.js index 83b38dfeb..16824b0d4 100644 --- a/ui/pages/send/send-content/send-content.container.js +++ b/ui/pages/send/send-content/send-content.container.js @@ -6,7 +6,11 @@ import { getNoGasPriceFetched, checkNetworkOrAccountNotSupports1559, } from '../../../selectors'; -import { getIsAssetSendable, getSendTo } from '../../../ducks/send'; +import { + getIsAssetSendable, + getIsBalanceInsufficient, + getSendTo, +} from '../../../ducks/send'; import * as actions from '../../../store/actions'; import SendContent from './send-content.component'; @@ -28,6 +32,7 @@ function mapStateToProps(state) { networkOrAccountNotSupports1559: checkNetworkOrAccountNotSupports1559( state, ), + getIsBalanceInsufficient: getIsBalanceInsufficient(state), }; } From 487080bd167b51c06e53577bd5e333cd875061b4 Mon Sep 17 00:00:00 2001 From: ryanml Date: Fri, 29 Oct 2021 10:02:10 -0700 Subject: [PATCH 23/97] Adding backgroundColor prop to Box (#12524) --- ui/components/ui/box/box.js | 4 ++++ ui/components/ui/box/box.scss | 7 +++++++ ui/components/ui/box/box.stories.js | 6 ++++++ 3 files changed, 17 insertions(+) diff --git a/ui/components/ui/box/box.js b/ui/components/ui/box/box.js index b720ff2fc..9727d09ef 100644 --- a/ui/components/ui/box/box.js +++ b/ui/components/ui/box/box.js @@ -82,6 +82,7 @@ export default function Box({ height, children, className, + backgroundColor, }) { const boxClassName = classnames('box', className, { // ---Borders--- @@ -128,6 +129,8 @@ export default function Box({ // width & height [`box--width-${width}`]: Boolean(width), [`box--height-${height}`]: Boolean(height), + // background + [`box--background-color-${backgroundColor}`]: Boolean(backgroundColor), }); // Apply Box styles to any other component using function pattern if (typeof children === 'function') { @@ -159,5 +162,6 @@ Box.propTypes = { display: PropTypes.oneOf(Object.values(DISPLAY)), width: PropTypes.oneOf(Object.values(BLOCK_SIZES)), height: PropTypes.oneOf(Object.values(BLOCK_SIZES)), + backgroundColor: PropTypes.oneOf(Object.values(COLORS)), className: PropTypes.string, }; diff --git a/ui/components/ui/box/box.scss b/ui/components/ui/box/box.scss index 59865bbf7..3f657ac6d 100644 --- a/ui/components/ui/box/box.scss +++ b/ui/components/ui/box/box.scss @@ -139,4 +139,11 @@ $attributes: padding, margin; text-align: $alignment; } } + + // background + @each $variant, $color in design-system.$color-map { + &--background-color-#{$variant} { + background-color: $color; + } + } } diff --git a/ui/components/ui/box/box.stories.js b/ui/components/ui/box/box.stories.js index 25b17838b..b7168786b 100644 --- a/ui/components/ui/box/box.stories.js +++ b/ui/components/ui/box/box.stories.js @@ -75,6 +75,12 @@ export const box = () => { )} borderWidth={number('borderWidth', 1, sizeKnobOptions, 'border')} borderColor={select('borderColor', COLORS, COLORS.BLACK, 'border')} + backgroundColor={select( + 'backgroundColor', + COLORS, + COLORS.WHITE, + 'background', + )} > {items} From d72f7295a3e5a145b904710d9ff84749a4a25240 Mon Sep 17 00:00:00 2001 From: George Marshall Date: Fri, 29 Oct 2021 10:22:07 -0700 Subject: [PATCH 24/97] Docs/12367 Adding storybook essentials addons (#12393) * Adding storybook essentials and documentation contribution guidelines * Deprecation updates * Update ui/2.DOCUMENTATION.stories.mdx Co-authored-by: Elliot Winkler * Updating spelling and adding label to i18n-party plugin in toolbar Co-authored-by: kumavis Co-authored-by: Elliot Winkler --- .depcheckrc.yml | 67 +- .storybook/i18n-party-addon/register.js | 52 +- .storybook/main.js | 16 +- .storybook/preview.js | 40 +- package.json | 22 +- ui/1.INTRODUCTION.stories.mdx | 15 + ui/2.DOCUMENTATION.stories.mdx | 182 + ui/components/ui/button/README.mdx | 59 + ui/components/ui/button/button.stories.js | 131 +- .../ui/toggle-button/toggle-button.stories.js | 4 +- yarn.lock | 3676 +++++++++++------ 11 files changed, 2917 insertions(+), 1347 deletions(-) create mode 100644 ui/1.INTRODUCTION.stories.mdx create mode 100644 ui/2.DOCUMENTATION.stories.mdx create mode 100644 ui/components/ui/button/README.mdx diff --git a/.depcheckrc.yml b/.depcheckrc.yml index c99ca2f85..15f3c91b9 100644 --- a/.depcheckrc.yml +++ b/.depcheckrc.yml @@ -1,49 +1,48 @@ # things that *are* used, that depcheck is wrong about ignores: - # + # # webapp deps - # + # - - "@babel/runtime" - - "@fortawesome/fontawesome-free" - - "punycode" - - # + - '@babel/runtime' + - '@fortawesome/fontawesome-free' + - 'punycode' + + # # dev deps # # safety fallback for npm lifecycle scripts, not used normally - - "@lavamoat/preinstall-always-fail" + - '@lavamoat/preinstall-always-fail' # used in testing + ci - - "@metamask/auto-changelog" # invoked as `auto-changelog` - - "@metamask/forwarder" - - "@metamask/test-dapp" - - "@sentry/cli" # invoked as `sentry-cli` - - "chromedriver" - - "depcheck" # ooo meta - - "ganache-cli" - - "geckodriver" - - "jest" - - "lavamoat-viz" - - "prettier-plugin-sort-json" # automatically imported by prettier - - "source-map-explorer" + - '@metamask/auto-changelog' # invoked as `auto-changelog` + - '@metamask/forwarder' + - '@metamask/test-dapp' + - '@sentry/cli' # invoked as `sentry-cli` + - 'chromedriver' + - 'depcheck' # ooo meta + - 'ganache-cli' + - 'geckodriver' + - 'jest' + - 'lavamoat-viz' + - 'prettier-plugin-sort-json' # automatically imported by prettier + - 'source-map-explorer' # development tool - - "yarn-deduplicate" - - "improved-yarn-audit" + - 'yarn-deduplicate' + - 'improved-yarn-audit' # storybook - - "@storybook/core" - - "@storybook/addon-backgrounds" - - "@storybook/addon-toolbars" - - "style-loader" - - "css-loader" - - "sass-loader" - - "resolve-url-loader" + - '@storybook/core' + - '@storybook/addon-essentials' + - '@storybook/addon-a11y' + - 'style-loader' + - 'css-loader' + - 'sass-loader' + - 'resolve-url-loader' -# files depcheck should not parse +# files depcheck should not parse ignorePatterns: # seems to incorrectly parse scss @include pragmas? - - "**/*.scss" + - '**/*.scss' # self-contained bundle used for testing - - "**/send-eth-with-private-key-test/web3js.js" - - "**/send-eth-with-private-key-test/ethereumjs-tx.js" - + - '**/send-eth-with-private-key-test/web3js.js' + - '**/send-eth-with-private-key-test/ethereumjs-tx.js' diff --git a/.storybook/i18n-party-addon/register.js b/.storybook/i18n-party-addon/register.js index 20175a80e..bfa482045 100644 --- a/.storybook/i18n-party-addon/register.js +++ b/.storybook/i18n-party-addon/register.js @@ -1,37 +1,41 @@ // import { useGlobals } from '@storybook/api'; -const { useGlobals } = require('@storybook/api') -const React = require("react") -const { addons, types } = require("@storybook/addons") -const { Icons, IconButton } = require('@storybook/components') -const localeList = require('../../app/_locales/index.json') -const { useEffect } = React +const { useGlobals } = require('@storybook/api'); +const React = require('react'); +const { addons, types } = require('@storybook/addons'); +const { Icons, IconButton } = require('@storybook/components'); +const localeList = require('../../app/_locales/index.json'); +const { useEffect } = React; -addons.register("i18n-party", () => { - - addons.add("i18n-party", { - title: "rotates through every i18n locale", +addons.register('i18n-party', () => { + addons.add('i18n-party', { + title: 'rotates through every i18n locale', //👇 Sets the type of UI element in Storybook type: types.TOOL, match: () => true, render: (...args) => { // https://github.com/storybookjs/storybook/blob/6490a0d646dbaa293b76bbde477daca615efe789/addons/toolbars/src/components/MenuToolbar.tsx#L2 - const [globals, updateGlobals] = useGlobals() + const [globals, updateGlobals] = useGlobals(); useEffect(() => { - if (!globals.localeParty) return + if (!globals.localeParty) return; const interval = setInterval((...args) => { - const currentIndex = localeList.findIndex(({ code }) => code === globals.locale) - const nextIndex = (currentIndex + 1) % localeList.length - const nextLocale = localeList[nextIndex].code - updateGlobals({ locale: nextLocale }) - }, 2000) - return () => clearInterval(interval) - }) + const currentIndex = localeList.findIndex( + ({ code }) => code === globals.locale, + ); + const nextIndex = (currentIndex + 1) % localeList.length; + const nextLocale = localeList[nextIndex].code; + updateGlobals({ locale: nextLocale }); + }, 2000); + return () => clearInterval(interval); + }); return ( - updateGlobals({ localeParty: !globals.localeParty })}> - + updateGlobals({ localeParty: !globals.localeParty })} + > + +  Shuffle i18n locale - ) + ); }, - }) -}) + }); +}); diff --git a/.storybook/main.js b/.storybook/main.js index 843c63b77..5255babda 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -3,19 +3,21 @@ const path = require('path'); const CopyWebpackPlugin = require('copy-webpack-plugin'); module.exports = { - stories: ['../ui/**/*.stories.js'], + stories: ['../ui/**/*.stories.js', '../ui/**/*.stories.mdx'], addons: [ - '@storybook/addon-knobs', + '@storybook/addon-essentials', '@storybook/addon-actions', - '@storybook/addon-backgrounds', - '@storybook/addon-toolbars', + '@storybook/addon-a11y', + '@storybook/addon-knobs', './i18n-party-addon/register.js', ], + // Uses babel.config.js settings and prevents "Missing class properties transform" error + babel: async (options) => ({ overrides: options.overrides }), webpackFinal: async (config) => { - config.context = process.cwd() + config.context = process.cwd(); config.node = { - __filename: true - } + __filename: true, + }; config.module.strictExportPresence = true; config.module.rules.push({ test: /\.scss$/, diff --git a/.storybook/preview.js b/.storybook/preview.js index 30f6d69ea..71fa49be3 100644 --- a/.storybook/preview.js +++ b/.storybook/preview.js @@ -8,11 +8,11 @@ import '../ui/css/index.scss'; import localeList from '../app/_locales/index.json'; import * as allLocales from './locales'; import { I18nProvider, LegacyI18nProvider } from './i18n'; -import MetaMetricsProviderStorybook from './metametrics' +import MetaMetricsProviderStorybook from './metametrics'; import testData from './test-data.js'; -import { Router } from "react-router-dom"; -import { createBrowserHistory } from "history"; -import { _setBackgroundConnection } from '../ui/store/actions' +import { Router } from 'react-router-dom'; +import { createBrowserHistory } from 'history'; +import { _setBackgroundConnection } from '../ui/store/actions'; addParameters({ backgrounds: { @@ -38,28 +38,24 @@ export const globalTypes = { }, }; -const styles = { - height: '100vh', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', -}; - export const getNewState = (state, props) => { return Object.assign(state, props); -} +}; export const store = configureStore(testData); const history = createBrowserHistory(); -const proxiedBackground = new Proxy({}, { +const proxiedBackground = new Proxy( + {}, + { get(_, method) { - return function() { - action(`Background call: ${method}`)() - return new Promise(() => {}) - } - } - }) -_setBackgroundConnection(proxiedBackground) + return function () { + action(`Background call: ${method}`)(); + return new Promise(() => {}); + }; + }, + }, +); +_setBackgroundConnection(proxiedBackground); const metamaskDecorator = (story, context) => { const currentLocale = context.globals.locale; @@ -73,9 +69,7 @@ const metamaskDecorator = (story, context) => { current={current} en={allLocales.en} > - -

- + {story()} diff --git a/package.json b/package.json index 20e273416..e53f4c07e 100644 --- a/package.json +++ b/package.json @@ -228,16 +228,18 @@ "@metamask/forwarder": "^1.1.0", "@metamask/test-dapp": "^4.0.1", "@sentry/cli": "^1.58.0", - "@storybook/addon-actions": "^6.1.17", - "@storybook/addon-backgrounds": "^6.1.17", - "@storybook/addon-knobs": "^6.1.17", - "@storybook/addon-toolbars": "^6.1.17", - "@storybook/addons": "^6.1.7", - "@storybook/api": "^6.1.7", - "@storybook/components": "^6.1.7", - "@storybook/core": "^6.1.17", - "@storybook/react": "^6.1.17", - "@storybook/storybook-deployer": "^2.8.7", + "@storybook/addon-a11y": "^6.3.12", + "@storybook/addon-actions": "^6.3.12", + "@storybook/addon-essentials": "^6.3.12", + "@storybook/addon-knobs": "^6.3.1", + "@storybook/addons": "^6.3.12", + "@storybook/api": "^6.3.12", + "@storybook/components": "^6.3.12", + "@storybook/core": "^6.3.12", + "@storybook/core-events": "^6.3.0", + "@storybook/react": "^6.3.12", + "@storybook/storybook-deployer": "^2.8.10", + "@storybook/theming": "^6.3.0", "@testing-library/jest-dom": "^5.11.10", "@testing-library/react": "^10.4.8", "@testing-library/react-hooks": "^3.2.1", diff --git a/ui/1.INTRODUCTION.stories.mdx b/ui/1.INTRODUCTION.stories.mdx new file mode 100644 index 000000000..23ba7e8f7 --- /dev/null +++ b/ui/1.INTRODUCTION.stories.mdx @@ -0,0 +1,15 @@ +import { Meta } from '@storybook/addon-docs'; + + + +# Introduction + +Welcome to the MetaMask Browser Extension Storybook. + +## Building locally and Contributing + +This document is currently only specific to storybook best practices and component documentation guidelines. This may change in future but for now if you are looking to get a local build of Metamask up and running or contribute to the extension codebase please read the Metamask [README.md](https://github.com/MetaMask/metamask-extension) + +## Documentation Guidelines + +If you're here to improve our storybook documentation you're in the right place! Please head over to the [Documentation Guidelines](./?path=/story/getting-started-documentation-guidelines--page) for contributing to component documentation in storybook. diff --git a/ui/2.DOCUMENTATION.stories.mdx b/ui/2.DOCUMENTATION.stories.mdx new file mode 100644 index 000000000..056edb647 --- /dev/null +++ b/ui/2.DOCUMENTATION.stories.mdx @@ -0,0 +1,182 @@ +import { Meta } from '@storybook/addon-docs'; + + + +# Documentation Guidelines + +> 💡 To improve the quality of our component documentation we are currently in the process of updating our storybook to use Storyboook's [controls](https://storybook.js.org/addons/@storybook/addon-controls/), [a11y](https://storybook.js.org/addons/@storybook/addon-a11y/) and [docs](https://storybook.js.org/addons/@storybook/addon-docs/) plugins. You will find most components currently without documentation and use knobs for their primary interactivity. These will eventually be updated. + +## General Guidelines + +Thorough documentation makes it much easier for a component to be found, adapted and reused. It also provides space for explanation and reasoning for a component. This is useful as components become more complex. + +Some general documentation best practices to follow: + +- Put yourself in the shoes of another developer trying to use the component you just created for the first time +- Write a brief description of the component and what it's used for in the `README.mdx` file +- Display the component's api using the `` component from storybook docs +- Use the [controls](https://storybook.js.org/addons/@storybook/addon-controls/) api over knobs +- Use the updated `argType` [actions](https://storybook.js.org/docs/react/essentials/actions) api over importing the actions plugin directly +- Check the accessibility of the component using the **Accessibility** tab + +See the [Button](https://metamask.github.io/metamask-storybook/index.html?path=/story/ui-components-ui-button-button-stories-js--default-story)(`ui/components/ui/button/button.stories.js`) component for reference + +## Creating a Story + +[Component Story Format (CSF)](https://storybook.js.org/docs/react/api/csf) is the recommended way to write stories. It's an open standard based on ES6 modules. The below example is of the Button component and it explains how we should write our stories. + +```jsx +// Button component example story + +import React from 'react'; + +import BuyIcon from '../icon/overview-buy-icon.component'; + +// The mdx file to document component api and usage +import README from './README.mdx'; +import Button from '.'; + +// The default storybook component export should always follow the same template +export default { + title: 'Button', // The `title` effects the components tile and location in storybook + id: __filename, // The file name id is used to track what storybook files have changed in CI + component: Button, // The component you are documenting + parameters: { + docs: { + page: README, // Reference to the mdx file docs page + }, + }, + // the controls plugin argTypes are used for the interactivity of the component + argTypes: { + children: { control: 'text' }, + disabled: { control: 'boolean' }, + // use the updated action api to log actions in the actions tab + onClick: { action: 'clicked' }, + type: { + control: { + type: 'select', + }, + options: [ + 'default', + 'primary', + 'secondary', + 'warning', + 'danger', + 'danger-primary', + 'link', + ], + }, + submit: { control: 'boolean' }, + large: { control: 'boolean' }, + className: { control: 'text' }, + icon: { + control: { + type: 'select', + }, + options: ['BuyIcon'], + mapping: { + BuyIcon: , + }, + }, + }, +}; + +// First story component should always be called "DefaultStory" +// The `DefaultStory` should include argTypes and controls where appropriate +export const DefaultStory = (args) => ( + +); + +// The name of the DefaultStory component can be renamed to simply "Default" +DefaultStory.storyName = 'Default'; + +// More stories should be added for different usage examples +// You can add as many stories as you think appropriate to comprehensively document the component +export const Types = (args) => ( + <> + + + + + + + + +); +``` + +## Writing MDX Documentation + +Now the storybook components are complete, the `README.mdx` documentation should explain the component in detail. [MDX](https://mdxjs.com/) format lets you seamlessly use `JSX` in your markdown documents. You can import react components and stories into your documentation to enhance the developer experience. + +```md + + +import { Story, Canvas, ArgsTable } from '@storybook/addon-docs'; + + + +import Button from '.'; + + + +# Button + + + +Buttons communicate actions that users can take. + + + + + + + +## Component API + + + + + +## Usage + + + +The following describes the props and example usage for this component. + +### Type + +By changing the `type` prop you can use different styles of the button. + +| type | Description | +| ----------------- | ----------------------------------------------------------------------------------------------------- | +| `default` | default style of the button | +| `primary` | the principle call to action on the page | +| `secondary` | secondary actions on each page | +| `warning` | a warning action in the page | +| `danger` | a negative action (such as Delete) on the page | +| `danger--primary` | a negative principle call to action (such as Delete) on the page | +| `link` | an optional action or navigation action out of the app changes root html tag from ` +export const DefaultStory = (args) => ( + ); -export const secondaryType = () => ( - -); +DefaultStory.storyName = 'Default'; -export const defaultType = () => ( - -); +DefaultStory.args = { + children: 'Default', +}; -export const warningType = () => ( - +export const Types = (args) => ( + <> + + + + + + + + ); -export const dangerType = () => ( - -); +export const LinkType = (args) => ); diff --git a/ui/components/ui/toggle-button/toggle-button.stories.js b/ui/components/ui/toggle-button/toggle-button.stories.js index 64f1a7acb..dd1e31c52 100644 --- a/ui/components/ui/toggle-button/toggle-button.stories.js +++ b/ui/components/ui/toggle-button/toggle-button.stories.js @@ -27,6 +27,4 @@ export const DefaultStory = () => { ); }; -DefaultStory.story = { - name: 'Default', -}; +DefaultStory.storyName = 'Default'; diff --git a/yarn.lock b/yarn.lock index cb4b12f48..d2ceaa846 100644 --- a/yarn.lock +++ b/yarn.lock @@ -62,6 +62,13 @@ resolved "https://registry.yarnpkg.com/@agoric/transform-module/-/transform-module-0.4.1.tgz#9fb152364faf372e1bda535cb4ef89717724f57c" integrity sha512-4TJJHXeXAWu1FCA7yXCAZmhBNoGTB/BEAe2pv+J2X8W/mJTr9b395OkDCSRMpzvmSshLfBx6wT0D7dqWIWEC1w== +"@babel/code-frame@7.10.4", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.5.5": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" @@ -69,20 +76,6 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== - dependencies: - "@babel/highlight" "^7.8.3" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.5.5": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/code-frame@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" @@ -90,17 +83,29 @@ dependencies: "@babel/highlight" "^7.12.13" +"@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8", "@babel/code-frame@^7.8.3": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" + integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg== + dependencies: + "@babel/highlight" "^7.14.5" + "@babel/compat-data@^7.12.5", "@babel/compat-data@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41" integrity sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" + integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== + "@babel/compat-data@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.12.tgz#a8a5ccac19c200f9dd49624cac6e19d7be1236a1" integrity sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ== -"@babel/core@>=7.9.0", "@babel/core@^7.12.1", "@babel/core@^7.12.3", "@babel/core@^7.7.5": +"@babel/core@7.12.9", "@babel/core@>=7.9.0", "@babel/core@^7.12.1", "@babel/core@^7.7.5": version "7.12.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== @@ -143,6 +148,27 @@ semver "^6.3.0" source-map "^0.5.0" +"@babel/core@^7.12.10": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.8.tgz#195b9f2bffe995d2c6c159e72fe525b4114e8c10" + integrity sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og== + dependencies: + "@babel/code-frame" "^7.15.8" + "@babel/generator" "^7.15.8" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.8" + "@babel/helpers" "^7.15.4" + "@babel/parser" "^7.15.8" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.6" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + "@babel/eslint-parser@^7.13.14": version "7.13.14" resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.13.14.tgz#f80fd23bdd839537221914cb5d17720a5ea6ba3a" @@ -159,6 +185,15 @@ dependencies: eslint-rule-composer "^0.3.0" +"@babel/generator@^7.12.11", "@babel/generator@^7.15.4", "@babel/generator@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" + integrity sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g== + dependencies: + "@babel/types" "^7.15.6" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/generator@^7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" @@ -184,6 +219,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" + integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" @@ -192,6 +234,14 @@ "@babel/helper-explode-assignable-expression" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz#21ad815f609b84ee0e3058676c33cf6d1670525f" + integrity sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.15.4" + "@babel/types" "^7.15.4" + "@babel/helper-builder-react-jsx-experimental@^7.12.4": version "7.12.4" resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.4.tgz#55fc1ead5242caa0ca2875dcb8eed6d311e50f48" @@ -219,6 +269,16 @@ browserslist "^4.14.5" semver "^5.5.0" +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" + integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + "@babel/helper-compilation-targets@^7.13.13": version "7.13.13" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz#2b2972a0926474853f41e4adbc69338f520600e5" @@ -240,6 +300,18 @@ "@babel/helper-replace-supers" "^7.12.1" "@babel/helper-split-export-declaration" "^7.10.4" +"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" + integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-create-regexp-features-plugin@^7.12.1": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz#2084172e95443fa0a09214ba1bb328f9aea1278f" @@ -248,6 +320,14 @@ "@babel/helper-annotate-as-pure" "^7.10.4" regexpu-core "^4.7.1" +"@babel/helper-create-regexp-features-plugin@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" + integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + regexpu-core "^4.7.1" + "@babel/helper-define-map@^7.10.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" @@ -257,6 +337,34 @@ "@babel/types" "^7.10.5" lodash "^4.17.19" +"@babel/helper-define-polyfill-provider@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e" + integrity sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-define-polyfill-provider@^0.2.2": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" + integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + "@babel/helper-explode-assignable-expression@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz#8006a466695c4ad86a2a5f2fb15b5f2c31ad5633" @@ -264,6 +372,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-explode-assignable-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" + integrity sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-function-name@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" @@ -282,6 +397,15 @@ "@babel/template" "^7.12.13" "@babel/types" "^7.12.13" +"@babel/helper-function-name@^7.14.5", "@babel/helper-function-name@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== + dependencies: + "@babel/helper-get-function-arity" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/types" "^7.15.4" + "@babel/helper-get-function-arity@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" @@ -296,6 +420,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-get-function-arity@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-hoist-variables@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" @@ -303,6 +434,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-hoist-variables@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-member-expression-to-functions@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz#fba0f2fcff3fba00e6ecb664bb5e6e26e2d6165c" @@ -317,6 +455,13 @@ dependencies: "@babel/types" "^7.13.12" +"@babel/helper-member-expression-to-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" + integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" @@ -324,6 +469,13 @@ dependencies: "@babel/types" "^7.12.5" +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" + integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-module-imports@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" @@ -360,6 +512,20 @@ "@babel/traverse" "^7.13.13" "@babel/types" "^7.13.14" +"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4", "@babel/helper-module-transforms@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz#d8c0e75a87a52e374a8f25f855174786a09498b2" + integrity sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg== + dependencies: + "@babel/helper-module-imports" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-simple-access" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.6" + "@babel/helper-optimise-call-expression@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" @@ -374,7 +540,14 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-optimise-call-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" + integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-plugin-utils@7.10.4", "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== @@ -384,6 +557,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== +"@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + "@babel/helper-remap-async-to-generator@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd" @@ -393,6 +571,15 @@ "@babel/helper-wrap-function" "^7.10.4" "@babel/types" "^7.12.1" +"@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" + integrity sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-wrap-function" "^7.15.4" + "@babel/types" "^7.15.4" + "@babel/helper-replace-supers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz#f15c9cc897439281891e11d5ce12562ac0cf3fa9" @@ -413,6 +600,16 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.12" +"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" + integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + "@babel/helper-simple-access@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" @@ -427,6 +624,13 @@ dependencies: "@babel/types" "^7.13.12" +"@babel/helper-simple-access@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" + integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -434,6 +638,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb" + integrity sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" @@ -448,6 +659,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-split-export-declaration@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-validator-identifier@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" @@ -463,6 +681,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== +"@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + "@babel/helper-validator-option@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9" @@ -473,6 +696,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + "@babel/helper-wrap-function@^7.10.4": version "7.12.3" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" @@ -483,6 +711,16 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/helper-wrap-function@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7" + integrity sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw== + dependencies: + "@babel/helper-function-name" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + "@babel/helpers@^7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" @@ -501,7 +739,16 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.8.3": +"@babel/helpers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" + integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== + dependencies: + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/highlight@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== @@ -519,6 +766,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.0.0": version "7.15.6" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.6.tgz#043b9aa3c303c0722e5377fef9197f4cf1796549" @@ -539,11 +795,25 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA== +"@babel/parser@^7.12.11", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" + integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== + "@babel/parser@^7.7.5": version "7.12.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.3.tgz#a305415ebe7a6c7023b40b5122a0662d928334cd" integrity sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e" + integrity sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-async-generator-functions@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz#dc6c1170e27d8aca99ff65f4925bd06b1c90550e" @@ -553,6 +823,15 @@ "@babel/helper-remap-async-to-generator" "^7.12.1" "@babel/plugin-syntax-async-generators" "^7.8.0" +"@babel/plugin-proposal-async-generator-functions@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz#a3100f785fab4357987c4223ab1b02b599048403" + integrity sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.15.4" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.5.5": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" @@ -561,14 +840,31 @@ "@babel/helper-create-class-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-decorators@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz#59271439fed4145456c41067450543aee332d15f" - integrity sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ== +"@babel/plugin-proposal-class-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" + integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-decorators" "^7.12.1" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-class-static-block@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz#3e7ca6128453c089e8b477a99f970c63fc1cb8d7" + integrity sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-decorators@^7.12.12": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.15.8.tgz#eb2969abf8993f15289f09fed762bb1df1521bd5" + integrity sha512-5n8+xGK7YDrXF+WAORg3P7LlCCdiaAyKLZi22eP2BwTy4kJ0kFUMMDCj4nQ8YrKyNZgjhU/9eRVqONnjB3us8g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-decorators" "^7.14.5" "@babel/plugin-proposal-dynamic-import@^7.12.1": version "7.12.1" @@ -578,6 +874,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" +"@babel/plugin-proposal-dynamic-import@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" + integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-export-default-from@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.12.1.tgz#c6e62d668a8abcfe0d28b82f560395fecb611c5a" @@ -594,6 +898,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" +"@babel/plugin-proposal-export-namespace-from@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" + integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-proposal-json-strings@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz#d45423b517714eedd5621a9dfdc03fa9f4eb241c" @@ -602,6 +914,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.0" +"@babel/plugin-proposal-json-strings@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" + integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-proposal-logical-assignment-operators@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz#f2c490d36e1b3c9659241034a5d2cd50263a2751" @@ -610,6 +930,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" +"@babel/plugin-proposal-logical-assignment-operators@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" + integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4", "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" @@ -618,6 +946,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" + integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz#8bf253de8139099fea193b297d23a9d406ef056b" @@ -626,7 +962,15 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.5.5": +"@babel/plugin-proposal-numeric-separator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" + integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.5.5": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== @@ -635,6 +979,17 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-transform-parameters" "^7.12.1" +"@babel/plugin-proposal-object-rest-spread@^7.15.6": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11" + integrity sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.15.4" + "@babel/plugin-proposal-optional-catch-binding@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz#ccc2421af64d3aae50b558a71cede929a5ab2942" @@ -643,7 +998,15 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.12.7", "@babel/plugin-proposal-optional-chaining@^7.8.3": +"@babel/plugin-proposal-optional-catch-binding@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" + integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.12.7", "@babel/plugin-proposal-optional-chaining@^7.8.3": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz#e02f0ea1b5dc59d401ec16fb824679f683d3303c" integrity sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA== @@ -652,6 +1015,15 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-syntax-optional-chaining" "^7.8.0" +"@babel/plugin-proposal-optional-chaining@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" + integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-private-methods@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz#86814f6e7a21374c980c10d38b4493e703f4a389" @@ -660,6 +1032,24 @@ "@babel/helper-create-class-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-proposal-private-methods@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" + integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-private-property-in-object@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz#55c5e3b4d0261fd44fe637e3f624cfb0f484e3e5" + integrity sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz#2a183958d417765b9eae334f47758e5d6a82e072" @@ -668,6 +1058,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-proposal-unicode-property-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" + integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -689,19 +1087,26 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-decorators@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.1.tgz#81a8b535b284476c41be6de06853a8802b98c5dd" - integrity sha512-ir9YW5daRrTYiy9UJ2TzdNIJEZu8KclVzDcfSt4iEmOtwQ4llPtWInNKJyKnVXp1vE4bbVd5S31M/im3mYMO1w== +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz#eafb9c0cbe09c8afeb964ba3a7bbd63945a72f20" + integrity sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -745,13 +1150,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.12.1": +"@babel/plugin-syntax-jsx@7.12.1", "@babel/plugin-syntax-jsx@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-syntax-jsx@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" + integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -773,7 +1185,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -794,6 +1206,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-top-level-await@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" @@ -801,6 +1220,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" @@ -808,12 +1234,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-typescript@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz#460ba9d77077653803c3dd2e673f76d66b4029e5" - integrity sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA== +"@babel/plugin-syntax-typescript@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" + integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-arrow-functions@^7.12.1": version "7.12.1" @@ -822,6 +1248,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-arrow-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" + integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-async-to-generator@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" @@ -831,6 +1264,15 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-remap-async-to-generator" "^7.12.1" +"@babel/plugin-transform-async-to-generator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" + integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" + "@babel/plugin-transform-block-scoped-functions@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9" @@ -838,6 +1280,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-block-scoped-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" + integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-block-scoping@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz#f0ee727874b42a208a48a586b84c3d222c2bbef1" @@ -845,6 +1294,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.15.3": + version "7.15.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf" + integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-classes@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" @@ -859,6 +1315,19 @@ "@babel/helper-split-export-declaration" "^7.10.4" globals "^11.1.0" +"@babel/plugin-transform-classes@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz#50aee17aaf7f332ae44e3bce4c2e10534d5d3bf1" + integrity sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + globals "^11.1.0" + "@babel/plugin-transform-computed-properties@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852" @@ -866,6 +1335,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-computed-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" + integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-destructuring@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847" @@ -873,6 +1349,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-destructuring@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" + integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz#a1d16c14862817b6409c0a678d6f9373ca9cd975" @@ -881,6 +1364,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-dotall-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" + integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-duplicate-keys@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz#745661baba295ac06e686822797a69fbaa2ca228" @@ -888,6 +1379,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-duplicate-keys@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" + integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-exponentiation-operator@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz#b0f2ed356ba1be1428ecaf128ff8a24f02830ae0" @@ -896,6 +1394,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-exponentiation-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" + integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-flow-strip-types@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz#8430decfa7eb2aea5414ed4a3fa6e1652b7d77c4" @@ -911,6 +1417,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-for-of@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz#25c62cce2718cfb29715f416e75d5263fb36a8c2" + integrity sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-function-name@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667" @@ -919,6 +1432,14 @@ "@babel/helper-function-name" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" + integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== + dependencies: + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-literals@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57" @@ -926,6 +1447,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" + integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-member-expression-literals@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad" @@ -933,6 +1461,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-member-expression-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" + integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-modules-amd@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz#3154300b026185666eebb0c0ed7f8415fefcf6f9" @@ -942,6 +1477,15 @@ "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-amd@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" + integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-commonjs@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" @@ -952,6 +1496,16 @@ "@babel/helper-simple-access" "^7.12.1" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-commonjs@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz#8201101240eabb5a76c08ef61b2954f767b6b4c1" + integrity sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA== + dependencies: + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.15.4" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-systemjs@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz#663fea620d593c93f214a464cd399bf6dc683086" @@ -963,6 +1517,17 @@ "@babel/helper-validator-identifier" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-systemjs@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz#b42890c7349a78c827719f1d2d0cd38c7d268132" + integrity sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw== + dependencies: + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.9" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-umd@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz#eb5a218d6b1c68f3d6217b8fa2cc82fec6547902" @@ -971,6 +1536,14 @@ "@babel/helper-module-transforms" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-modules-umd@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" + integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-named-capturing-groups-regex@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz#b407f5c96be0d9f5f88467497fa82b30ac3e8753" @@ -978,6 +1551,13 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.12.1" +"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2" + integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/plugin-transform-new-target@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz#80073f02ee1bb2d365c3416490e085c95759dec0" @@ -985,6 +1565,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-new-target@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" + integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-object-super@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e" @@ -993,6 +1580,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-replace-supers" "^7.12.1" +"@babel/plugin-transform-object-super@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" + integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/plugin-transform-parameters@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" @@ -1000,6 +1595,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-parameters@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62" + integrity sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-property-literals@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd" @@ -1007,6 +1609,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-property-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" + integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-react-display-name@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz#1cbcd0c3b1d6648c55374a22fc9b6b7e5341c00d" @@ -1014,6 +1623,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-react-display-name@^7.14.5": + version "7.15.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz#6aaac6099f1fcf6589d35ae6be1b6e10c8c602b9" + integrity sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-react-jsx-development@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.7.tgz#4c2a647de79c7e2b16bfe4540677ba3121e82a08" @@ -1023,6 +1639,13 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "^7.12.1" +"@babel/plugin-transform-react-jsx-development@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz#1a6c73e2f7ed2c42eebc3d2ad60b0c7494fcb9af" + integrity sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.14.5" + "@babel/plugin-transform-react-jsx-self@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.1.tgz#ef43cbca2a14f1bd17807dbe4376ff89d714cf28" @@ -1037,6 +1660,17 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.14.5": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz#3314b2163033abac5200a869c4de242cd50a914c" + integrity sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-jsx" "^7.14.5" + "@babel/types" "^7.14.9" + "@babel/plugin-transform-react-jsx@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.7.tgz#8b14d45f6eccd41b7f924bcb65c021e9f0a06f7f" @@ -1055,6 +1689,14 @@ "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-react-pure-annotations@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz#18de612b84021e3a9802cbc212c9d9f46d0d11fc" + integrity sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-regenerator@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz#5f0a28d842f6462281f06a964e88ba8d7ab49753" @@ -1062,6 +1704,13 @@ dependencies: regenerator-transform "^0.14.2" +"@babel/plugin-transform-regenerator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" + integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== + dependencies: + regenerator-transform "^0.14.2" + "@babel/plugin-transform-reserved-words@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz#6fdfc8cc7edcc42b36a7c12188c6787c873adcd8" @@ -1069,6 +1718,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-reserved-words@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" + integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-runtime@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.5.tgz#a6331afbfc59189d2135b2e09474457a8e3d28bc" @@ -1086,6 +1742,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-shorthand-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" + integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-spread@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e" @@ -1094,6 +1757,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" +"@babel/plugin-transform-spread@^7.15.8": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz#79d5aa27f68d700449b2da07691dfa32d2f6d468" + integrity sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" + "@babel/plugin-transform-sticky-regex@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz#560224613ab23987453948ed21d0b0b193fa7fad" @@ -1101,6 +1772,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-sticky-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" + integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-template-literals@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz#b43ece6ed9a79c0c71119f576d299ef09d942843" @@ -1108,6 +1786,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-template-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" + integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-typeof-symbol@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz#9ca6be343d42512fbc2e68236a82ae64bc7af78a" @@ -1115,14 +1800,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-typescript@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz#d92cc0af504d510e26a754a7dbc2e5c8cd9c7ab4" - integrity sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw== +"@babel/plugin-transform-typeof-symbol@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" + integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-typescript" "^7.12.1" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typescript@^7.15.0": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.8.tgz#ff0e6a47de9b2d58652123ab5a879b2ff20665d8" + integrity sha512-ZXIkJpbaf6/EsmjeTbiJN/yMxWPFWvlr7sEG1P95Xb4S4IBcrf2n7s/fItIhsAmOf8oSh3VJPDppO6ExfAfKRQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.14.5" "@babel/plugin-transform-unicode-escapes@^7.12.1": version "7.12.1" @@ -1131,6 +1823,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-unicode-escapes@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" + integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-transform-unicode-regex@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz#cc9661f61390db5c65e3febaccefd5c6ac3faecb" @@ -1139,7 +1838,94 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.1" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/preset-env@^7.12.1", "@babel/preset-env@^7.5.5": +"@babel/plugin-transform-unicode-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" + integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/preset-env@^7.12.11": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.8.tgz#f527ce5bcb121cd199f6b502bf23e420b3ff8dba" + integrity sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.15.4" + "@babel/plugin-proposal-async-generator-functions" "^7.15.8" + "@babel/plugin-proposal-class-properties" "^7.14.5" + "@babel/plugin-proposal-class-static-block" "^7.15.4" + "@babel/plugin-proposal-dynamic-import" "^7.14.5" + "@babel/plugin-proposal-export-namespace-from" "^7.14.5" + "@babel/plugin-proposal-json-strings" "^7.14.5" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" + "@babel/plugin-proposal-numeric-separator" "^7.14.5" + "@babel/plugin-proposal-object-rest-spread" "^7.15.6" + "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-private-methods" "^7.14.5" + "@babel/plugin-proposal-private-property-in-object" "^7.15.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.14.5" + "@babel/plugin-transform-async-to-generator" "^7.14.5" + "@babel/plugin-transform-block-scoped-functions" "^7.14.5" + "@babel/plugin-transform-block-scoping" "^7.15.3" + "@babel/plugin-transform-classes" "^7.15.4" + "@babel/plugin-transform-computed-properties" "^7.14.5" + "@babel/plugin-transform-destructuring" "^7.14.7" + "@babel/plugin-transform-dotall-regex" "^7.14.5" + "@babel/plugin-transform-duplicate-keys" "^7.14.5" + "@babel/plugin-transform-exponentiation-operator" "^7.14.5" + "@babel/plugin-transform-for-of" "^7.15.4" + "@babel/plugin-transform-function-name" "^7.14.5" + "@babel/plugin-transform-literals" "^7.14.5" + "@babel/plugin-transform-member-expression-literals" "^7.14.5" + "@babel/plugin-transform-modules-amd" "^7.14.5" + "@babel/plugin-transform-modules-commonjs" "^7.15.4" + "@babel/plugin-transform-modules-systemjs" "^7.15.4" + "@babel/plugin-transform-modules-umd" "^7.14.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9" + "@babel/plugin-transform-new-target" "^7.14.5" + "@babel/plugin-transform-object-super" "^7.14.5" + "@babel/plugin-transform-parameters" "^7.15.4" + "@babel/plugin-transform-property-literals" "^7.14.5" + "@babel/plugin-transform-regenerator" "^7.14.5" + "@babel/plugin-transform-reserved-words" "^7.14.5" + "@babel/plugin-transform-shorthand-properties" "^7.14.5" + "@babel/plugin-transform-spread" "^7.15.8" + "@babel/plugin-transform-sticky-regex" "^7.14.5" + "@babel/plugin-transform-template-literals" "^7.14.5" + "@babel/plugin-transform-typeof-symbol" "^7.14.5" + "@babel/plugin-transform-unicode-escapes" "^7.14.5" + "@babel/plugin-transform-unicode-regex" "^7.14.5" + "@babel/preset-modules" "^0.1.4" + "@babel/types" "^7.15.6" + babel-plugin-polyfill-corejs2 "^0.2.2" + babel-plugin-polyfill-corejs3 "^0.2.5" + babel-plugin-polyfill-regenerator "^0.2.2" + core-js-compat "^3.16.0" + semver "^6.3.0" + +"@babel/preset-env@^7.5.5": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.7.tgz#54ea21dbe92caf6f10cb1a0a576adc4ebf094b55" integrity sha512-OnNdfAr1FUQg7ksb7bmbKoby4qFOHw6DKWWUNB9KqnnCldxhxJlP+21dpyaWFmf2h0rTbOkXJtAGevY3XW1eew== @@ -1219,7 +2005,7 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-flow-strip-types" "^7.12.1" -"@babel/preset-modules@^0.1.3": +"@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.4": version "0.1.4" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== @@ -1230,7 +2016,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.0.0", "@babel/preset-react@^7.12.1": +"@babel/preset-react@^7.0.0": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.7.tgz#36d61d83223b07b6ac4ec55cf016abb0f70be83b" integrity sha512-wKeTdnGUP5AEYCYQIMeXMMwU7j+2opxrG0WzuZfxuuW9nhKvvALBjl67653CWamZJVefuJGI219G591RSldrqQ== @@ -1243,14 +2029,26 @@ "@babel/plugin-transform-react-jsx-source" "^7.12.1" "@babel/plugin-transform-react-pure-annotations" "^7.12.1" -"@babel/preset-typescript@^7.12.1": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.12.7.tgz#fc7df8199d6aae747896f1e6c61fc872056632a3" - integrity sha512-nOoIqIqBmHBSEgBXWR4Dv/XBehtIFcw9PqZw6rFYuKrzsZmOQm3PR5siLBnKZFEsDb03IegG8nSjU/iXXXYRmw== +"@babel/preset-react@^7.12.10": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.14.5.tgz#0fbb769513f899c2c56f3a882fa79673c2d4ab3c" + integrity sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-validator-option" "^7.12.1" - "@babel/plugin-transform-typescript" "^7.12.1" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-react-display-name" "^7.14.5" + "@babel/plugin-transform-react-jsx" "^7.14.5" + "@babel/plugin-transform-react-jsx-development" "^7.14.5" + "@babel/plugin-transform-react-pure-annotations" "^7.14.5" + +"@babel/preset-typescript@^7.12.7": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz#e8fca638a1a0f64f14e1119f7fe4500277840945" + integrity sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-typescript" "^7.15.0" "@babel/register@^7.12.1", "@babel/register@^7.5.5": version "7.12.1" @@ -1271,14 +2069,7 @@ core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" -"@babel/runtime@7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83" - integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g== - dependencies: - regenerator-runtime "^0.12.0" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== @@ -1292,6 +2083,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.14.8": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" + integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.10.4", "@babel/template@^7.12.7", "@babel/template@^7.7.4": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" @@ -1310,6 +2108,15 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" +"@babel/template@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + "@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13": version "7.13.13" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.13.tgz#39aa9c21aab69f74d948a486dd28a2dbdbf5114d" @@ -1354,6 +2161,21 @@ globals "^11.1.0" lodash "^4.17.19" +"@babel/traverse@^7.12.11", "@babel/traverse@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.13", "@babel/types@^7.13.14", "@babel/types@^7.3.0", "@babel/types@^7.3.3": version "7.13.14" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.14.tgz#c35a4abb15c7cd45a2746d78ab328e362cbace0d" @@ -1380,6 +2202,19 @@ "@babel/helper-validator-identifier" "^7.14.5" to-fast-properties "^2.0.0" +"@babel/types@^7.12.11", "@babel/types@^7.14.9", "@babel/types@^7.15.4", "@babel/types@^7.15.6": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" + integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== + dependencies: + "@babel/helper-validator-identifier" "^7.14.9" + to-fast-properties "^2.0.0" + +"@base2/pretty-print-object@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.0.tgz#860ce718b0b73f4009e153541faff2cb6b85d047" + integrity sha512-4Th98KlMHr5+JkxfcoDT//6vY8vM+iSPrLNpHhRyLx2CFYi8e2RfqPLdpbnpo0Q5lQC5hNB79yes07zb02fvCw== + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1400,6 +2235,11 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@discoveryjs/json-ext@^0.5.3": + version "0.5.5" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz#9283c9ce5b289a3c4f61c12757469e59377f81f3" + integrity sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA== + "@download/blockies@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@download/blockies/-/blockies-1.0.3.tgz#9aea770f9de72f3f947f1b3a53ee1e92f8dc4a68" @@ -1508,7 +2348,7 @@ "@emotion/serialize" "^0.11.15" "@emotion/utils" "0.11.3" -"@emotion/styled@^10.0.23", "@emotion/styled@^10.0.27": +"@emotion/styled@^10.0.27": version "10.0.27" resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-10.0.27.tgz#12cb67e91f7ad7431e1875b1d83a94b814133eaf" integrity sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q== @@ -2425,11 +3265,6 @@ "@hapi/bourne" "1.x.x" "@hapi/hoek" "6.x.x" -"@icons/material@^0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8" - integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw== - "@istanbuljs/load-nyc-config@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" @@ -2721,6 +3556,50 @@ prop-types "^15.7.2" react-is "^16.8.0" +"@mdx-js/loader@^1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/loader/-/loader-1.6.22.tgz#d9e8fe7f8185ff13c9c8639c048b123e30d322c4" + integrity sha512-9CjGwy595NaxAYp0hF9B/A0lH6C8Rms97e2JS9d3jVUtILn6pT5i5IV965ra3lIWc7Rs1GG1tBdVF7dCowYe6Q== + dependencies: + "@mdx-js/mdx" "1.6.22" + "@mdx-js/react" "1.6.22" + loader-utils "2.0.0" + +"@mdx-js/mdx@1.6.22", "@mdx-js/mdx@^1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" + integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== + dependencies: + "@babel/core" "7.12.9" + "@babel/plugin-syntax-jsx" "7.12.1" + "@babel/plugin-syntax-object-rest-spread" "7.8.3" + "@mdx-js/util" "1.6.22" + babel-plugin-apply-mdx-type-prop "1.6.22" + babel-plugin-extract-import-names "1.6.22" + camelcase-css "2.0.1" + detab "2.0.4" + hast-util-raw "6.0.1" + lodash.uniq "4.5.0" + mdast-util-to-hast "10.0.1" + remark-footnotes "2.0.0" + remark-mdx "1.6.22" + remark-parse "8.0.3" + remark-squeeze-paragraphs "4.0.0" + style-to-object "0.3.0" + unified "9.2.0" + unist-builder "2.0.3" + unist-util-visit "2.0.3" + +"@mdx-js/react@1.6.22", "@mdx-js/react@^1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" + integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== + +"@mdx-js/util@1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" + integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== + "@metamask/auto-changelog@^2.1.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@metamask/auto-changelog/-/auto-changelog-2.5.0.tgz#078f38142a3086fdb5556c758969a015c71dfdc9" @@ -2993,7 +3872,7 @@ puka "^1.0.1" read-package-json-fast "^1.1.3" -"@pmmmwh/react-refresh-webpack-plugin@^0.4.2": +"@pmmmwh/react-refresh-webpack-plugin@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz#1eec460596d200c0236bf195b078a5d1df89b766" integrity sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ== @@ -3020,7 +3899,7 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= -"@reach/router@^1.3.3", "@reach/router@^1.3.4": +"@reach/router@^1.3.4": version "1.3.4" resolved "https://registry.yarnpkg.com/@reach/router/-/router-1.3.4.tgz#d2574b19370a70c80480ed91f3da840136d10f8c" integrity sha512-+mtn9wjlB9NN2CNnnC/BRYtwdKBfSyyasPYraNAyvaV1occr/5NnB4CVzjEZipNHwYebQwcndGUmpFzxAUoqSA== @@ -3180,270 +4059,385 @@ resolved "https://registry.yarnpkg.com/@stablelib/utf8/-/utf8-0.10.1.tgz#eecf54884da7b2bee235e3c70efb8cd5c07ba5bd" integrity sha512-+uM1YZ4MhBC82vt99prF7DXNGqhYmJ9cQ3p5qNowMNkkzn9OWEkqBvguBW3ChAt7JvqZ3SD5HJOfc6YgnfMTHw== -"@storybook/addon-actions@^6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-6.1.17.tgz#9d32336284738cefa69b99acafa4b132d5533600" - integrity sha512-4hyAvmjnI4C1ZQ7/t21jKKXE0jO1zAk310BkYin0NJf77Qi0tUE1DNOwirJY/xzRih36wWi1V79c/ZOJNsLv9Q== - dependencies: - "@storybook/addons" "6.1.17" - "@storybook/api" "6.1.17" - "@storybook/client-api" "6.1.17" - "@storybook/components" "6.1.17" - "@storybook/core-events" "6.1.17" - "@storybook/theming" "6.1.17" - core-js "^3.0.1" - fast-deep-equal "^3.1.1" - global "^4.3.2" - lodash "^4.17.15" - polished "^3.4.4" +"@storybook/addon-a11y@^6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/addon-a11y/-/addon-a11y-6.3.12.tgz#2f930fc84fc275a4ed43a716fc09cc12caf4e110" + integrity sha512-q1NdRHFJV6sLEEJw0hatCc5ZIthELqM/AWdrEWDyhcJNyiq7Tq4nKqQBMTQSYwHiUAmxVgw7i4oa1vM2M51/3g== + dependencies: + "@storybook/addons" "6.3.12" + "@storybook/api" "6.3.12" + "@storybook/channels" "6.3.12" + "@storybook/client-api" "6.3.12" + "@storybook/client-logger" "6.3.12" + "@storybook/components" "6.3.12" + "@storybook/core-events" "6.3.12" + "@storybook/theming" "6.3.12" + axe-core "^4.2.0" + core-js "^3.8.2" + global "^4.4.0" + lodash "^4.17.20" + react-sizeme "^3.0.1" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/addon-actions@6.3.12", "@storybook/addon-actions@^6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-6.3.12.tgz#69eb5f8f780f1b00456051da6290d4b959ba24a0" + integrity sha512-mzuN4Ano4eyicwycM2PueGzzUCAEzt9/6vyptWEIVJu0sjK0J9KtBRlqFi1xGQxmCfimDR/n/vWBBkc7fp2uJA== + dependencies: + "@storybook/addons" "6.3.12" + "@storybook/api" "6.3.12" + "@storybook/client-api" "6.3.12" + "@storybook/components" "6.3.12" + "@storybook/core-events" "6.3.12" + "@storybook/theming" "6.3.12" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.20" + polished "^4.0.5" prop-types "^15.7.2" - react-inspector "^5.0.1" + react-inspector "^5.1.0" regenerator-runtime "^0.13.7" ts-dedent "^2.0.0" util-deprecate "^1.0.2" - uuid "^8.0.0" - -"@storybook/addon-backgrounds@^6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-6.1.17.tgz#df4eeec1df72d5f835e82bee433493110463f896" - integrity sha512-1a8Vu50eQWdwMek9w2QOehhu10aZYzyR404qwGvPCRGt5uMMsKxoKvv1M6/ETW7d2G4Srl/Ka+k4x6ykoHIepA== - dependencies: - "@storybook/addons" "6.1.17" - "@storybook/api" "6.1.17" - "@storybook/client-logger" "6.1.17" - "@storybook/components" "6.1.17" - "@storybook/core-events" "6.1.17" - "@storybook/theming" "6.1.17" - core-js "^3.0.1" - global "^4.3.2" + uuid-browser "^3.1.0" + +"@storybook/addon-backgrounds@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-6.3.12.tgz#5feecd461f48178aa976ba2694418e9ea1d621b3" + integrity sha512-51cHBx0HV7K/oRofJ/1pE05qti6sciIo8m4iPred1OezXIrJ/ckzP+gApdaUdzgcLAr6/MXQWLk0sJuImClQ6w== + dependencies: + "@storybook/addons" "6.3.12" + "@storybook/api" "6.3.12" + "@storybook/client-logger" "6.3.12" + "@storybook/components" "6.3.12" + "@storybook/core-events" "6.3.12" + "@storybook/theming" "6.3.12" + core-js "^3.8.2" + global "^4.4.0" memoizerific "^1.11.3" regenerator-runtime "^0.13.7" ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/addon-knobs@^6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-6.1.17.tgz#c7cdd5be813c2b80ce7f464eabf8ceb06486e82d" - integrity sha512-WUkoGtHhXIurXFQybsMXZaphAtCNclZjZHvji8O5eg+ahx7pIM/Wldh3uJwOdOkW5LHxT76hLxPvuXvOEysnbw== - dependencies: - "@storybook/addons" "6.1.17" - "@storybook/api" "6.1.17" - "@storybook/channels" "6.1.17" - "@storybook/client-api" "6.1.17" - "@storybook/components" "6.1.17" - "@storybook/core-events" "6.1.17" - "@storybook/theming" "6.1.17" - copy-to-clipboard "^3.0.8" - core-js "^3.0.1" +"@storybook/addon-controls@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-6.3.12.tgz#dbb732c62cf06fb7ccaf87d6ab11c876d14456fc" + integrity sha512-WO/PbygE4sDg3BbstJ49q0uM3Xu5Nw4lnHR5N4hXSvRAulZt1d1nhphRTHjfX+CW+uBcfzkq9bksm6nKuwmOyw== + dependencies: + "@storybook/addons" "6.3.12" + "@storybook/api" "6.3.12" + "@storybook/client-api" "6.3.12" + "@storybook/components" "6.3.12" + "@storybook/node-logger" "6.3.12" + "@storybook/theming" "6.3.12" + core-js "^3.8.2" + ts-dedent "^2.0.0" + +"@storybook/addon-docs@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-6.3.12.tgz#2ec73b4f231d9f190d5c89295bc47bea6a95c6d1" + integrity sha512-iUrqJBMTOn2PgN8AWNQkfxfIPkh8pEg27t8UndMgfOpeGK/VWGw2UEifnA82flvntcilT4McxmVbRHkeBY9K5A== + dependencies: + "@babel/core" "^7.12.10" + "@babel/generator" "^7.12.11" + "@babel/parser" "^7.12.11" + "@babel/plugin-transform-react-jsx" "^7.12.12" + "@babel/preset-env" "^7.12.11" + "@jest/transform" "^26.6.2" + "@mdx-js/loader" "^1.6.22" + "@mdx-js/mdx" "^1.6.22" + "@mdx-js/react" "^1.6.22" + "@storybook/addons" "6.3.12" + "@storybook/api" "6.3.12" + "@storybook/builder-webpack4" "6.3.12" + "@storybook/client-api" "6.3.12" + "@storybook/client-logger" "6.3.12" + "@storybook/components" "6.3.12" + "@storybook/core" "6.3.12" + "@storybook/core-events" "6.3.12" + "@storybook/csf" "0.0.1" + "@storybook/csf-tools" "6.3.12" + "@storybook/node-logger" "6.3.12" + "@storybook/postinstall" "6.3.12" + "@storybook/source-loader" "6.3.12" + "@storybook/theming" "6.3.12" + acorn "^7.4.1" + acorn-jsx "^5.3.1" + acorn-walk "^7.2.0" + core-js "^3.8.2" + doctrine "^3.0.0" + escodegen "^2.0.0" + fast-deep-equal "^3.1.3" + global "^4.4.0" + html-tags "^3.1.0" + js-string-escape "^1.0.1" + loader-utils "^2.0.0" + lodash "^4.17.20" + p-limit "^3.1.0" + prettier "~2.2.1" + prop-types "^15.7.2" + react-element-to-jsx-string "^14.3.2" + regenerator-runtime "^0.13.7" + remark-external-links "^8.0.0" + remark-slug "^6.0.0" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + +"@storybook/addon-essentials@^6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-6.3.12.tgz#445cc4bc2eb9168a9e5de1fdfb5ef3b92974e74b" + integrity sha512-PK0pPE0xkq00kcbBcFwu/5JGHQTu4GvLIHfwwlEGx6GWNQ05l6Q+1Z4nE7xJGv2PSseSx3CKcjn8qykNLe6O6g== + dependencies: + "@storybook/addon-actions" "6.3.12" + "@storybook/addon-backgrounds" "6.3.12" + "@storybook/addon-controls" "6.3.12" + "@storybook/addon-docs" "6.3.12" + "@storybook/addon-measure" "^2.0.0" + "@storybook/addon-toolbars" "6.3.12" + "@storybook/addon-viewport" "6.3.12" + "@storybook/addons" "6.3.12" + "@storybook/api" "6.3.12" + "@storybook/node-logger" "6.3.12" + core-js "^3.8.2" + regenerator-runtime "^0.13.7" + storybook-addon-outline "^1.4.1" + ts-dedent "^2.0.0" + +"@storybook/addon-knobs@^6.3.1": + version "6.3.1" + resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-6.3.1.tgz#2115c6f0d5759e4fe73d5f25710f4a94ebd6f0db" + integrity sha512-2GGGnQSPXXUhHHYv4IW6pkyQlCPYXKYiyGzfhV7Zhs95M2Ban08OA6KLmliMptWCt7U9tqTO8dB5u0C2cWmCTw== + dependencies: + copy-to-clipboard "^3.3.1" + core-js "^3.8.2" escape-html "^1.0.3" - fast-deep-equal "^3.1.1" - global "^4.3.2" - lodash "^4.17.15" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.20" prop-types "^15.7.2" - qs "^6.6.0" - react-color "^2.17.0" + qs "^6.10.0" + react-colorful "^5.1.2" react-lifecycles-compat "^3.0.4" - react-select "^3.0.8" + react-select "^3.2.0" + +"@storybook/addon-measure@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-2.0.0.tgz#c40bbe91bacd3f795963dc1ee6ff86be87deeda9" + integrity sha512-ZhdT++cX+L9LwjhGYggvYUUVQH/MGn2rwbrAwCMzA/f2QTFvkjxzX8nDgMxIhaLCDC+gHIxfJG2wrWN0jkBr3g== + +"@storybook/addon-toolbars@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-6.3.12.tgz#bc0d420b3476c891c42f7b0ab3b457e9e5ef7ca5" + integrity sha512-8GvP6zmAfLPRnYRARSaIwLkQClLIRbflRh4HZoFk6IMjQLXZb4NL3JS5OLFKG+HRMMU2UQzfoSDqjI7k7ptyRw== + dependencies: + "@storybook/addons" "6.3.12" + "@storybook/api" "6.3.12" + "@storybook/client-api" "6.3.12" + "@storybook/components" "6.3.12" + "@storybook/theming" "6.3.12" + core-js "^3.8.2" regenerator-runtime "^0.13.7" -"@storybook/addon-toolbars@^6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-6.1.17.tgz#15a015dc871e26be66340b5641631e649925c5e2" - integrity sha512-hEH4MFNbhCOzHs9yB+V+GH9FHD5MN7dxUfLFYM1tuZPqtotgfrYwCBUTy8m/tSxyOOSM+Y1BSHBozt2h7D23eA== - dependencies: - "@storybook/addons" "6.1.17" - "@storybook/api" "6.1.17" - "@storybook/client-api" "6.1.17" - "@storybook/components" "6.1.17" - core-js "^3.0.1" - -"@storybook/addons@6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.1.17.tgz#ab0666446acb9fc19c94d7204dc9aafdefb6c7c2" - integrity sha512-3upDPJPzUkls2V3Fozzg+JOcv138bF90pbdRe9YSNu37QvRIL+iQODY7oFygMl+kqjG2F1FGw5EvxAV1mnlwCw== - dependencies: - "@storybook/api" "6.1.17" - "@storybook/channels" "6.1.17" - "@storybook/client-logger" "6.1.17" - "@storybook/core-events" "6.1.17" - "@storybook/router" "6.1.17" - "@storybook/theming" "6.1.17" - core-js "^3.0.1" - global "^4.3.2" +"@storybook/addon-viewport@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-6.3.12.tgz#2fd61e60644fb07185a662f75b3e9dad8ad14f01" + integrity sha512-TRjyfm85xouOPmXxeLdEIzXLfJZZ1ePQ7p/5yphDGBHdxMU4m4qiZr8wYpUaxHsRu/UB3dKfaOyGT+ivogbnbw== + dependencies: + "@storybook/addons" "6.3.12" + "@storybook/api" "6.3.12" + "@storybook/client-logger" "6.3.12" + "@storybook/components" "6.3.12" + "@storybook/core-events" "6.3.12" + "@storybook/theming" "6.3.12" + core-js "^3.8.2" + global "^4.4.0" + memoizerific "^1.11.3" + prop-types "^15.7.2" regenerator-runtime "^0.13.7" -"@storybook/addons@^6.1.7": - version "6.3.4" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.3.4.tgz#016c5c3e36c78a320eb8b022cf7fe556d81577c2" - integrity sha512-rf8K8X3JrB43gq5nw5SYgfucQkFg2QgUMWdByf7dQ4MyIl5zet+2MYiSXJ9lfbhGKJZ8orc81rmMtiocW4oBjg== - dependencies: - "@storybook/api" "6.3.4" - "@storybook/channels" "6.3.4" - "@storybook/client-logger" "6.3.4" - "@storybook/core-events" "6.3.4" - "@storybook/router" "6.3.4" - "@storybook/theming" "6.3.4" +"@storybook/addons@6.3.12", "@storybook/addons@^6.3.0", "@storybook/addons@^6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.3.12.tgz#8773dcc113c5086dfff722388b7b65580e43b65b" + integrity sha512-UgoMyr7Qr0FS3ezt8u6hMEcHgyynQS9ucr5mAwZky3wpXRPFyUTmMto9r4BBUdqyUvTUj/LRKIcmLBfj+/l0Fg== + dependencies: + "@storybook/api" "6.3.12" + "@storybook/channels" "6.3.12" + "@storybook/client-logger" "6.3.12" + "@storybook/core-events" "6.3.12" + "@storybook/router" "6.3.12" + "@storybook/theming" "6.3.12" core-js "^3.8.2" global "^4.4.0" regenerator-runtime "^0.13.7" -"@storybook/api@6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.1.17.tgz#50393ce9b718063b67680212df895eceacc0c11d" - integrity sha512-sthcfuk2EQ3F5R620PBqpI4Pno3g7KQm6YPZA0DXB+LD/z61xH9ToE1gTLF4nzlE6HwghwkXOZyRwDowRdG+7A== +"@storybook/api@6.3.12", "@storybook/api@^6.3.0", "@storybook/api@^6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.3.12.tgz#2845c20464d5348d676d09665e8ab527825ed7b5" + integrity sha512-LScRXUeCWEW/OP+jiooNMQICVdusv7azTmULxtm72fhkXFRiQs2CdRNTiqNg46JLLC9z95f1W+pGK66X6HiiQA== dependencies: - "@reach/router" "^1.3.3" - "@storybook/channels" "6.1.17" - "@storybook/client-logger" "6.1.17" - "@storybook/core-events" "6.1.17" + "@reach/router" "^1.3.4" + "@storybook/channels" "6.3.12" + "@storybook/client-logger" "6.3.12" + "@storybook/core-events" "6.3.12" "@storybook/csf" "0.0.1" - "@storybook/router" "6.1.17" + "@storybook/router" "6.3.12" "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.1.17" + "@storybook/theming" "6.3.12" "@types/reach__router" "^1.3.7" - core-js "^3.0.1" - fast-deep-equal "^3.1.1" - global "^4.3.2" - lodash "^4.17.15" + core-js "^3.8.2" + fast-deep-equal "^3.1.3" + global "^4.4.0" + lodash "^4.17.20" memoizerific "^1.11.3" + qs "^6.10.0" regenerator-runtime "^0.13.7" - store2 "^2.7.1" - telejson "^5.0.2" + store2 "^2.12.0" + telejson "^5.3.2" ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/api@6.3.4", "@storybook/api@^6.1.7": - version "6.3.4" - resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.3.4.tgz#25b8b842104693000b018b3f64986e95fa032b45" - integrity sha512-12q6dvSR4AtyuZbKAy3Xt+ZHzZ4ePPRV1q20xtgYBoiFEgB9vbh4XKEeeZD0yIeTamQ2x1Hn87R79Rs1GIdKRQ== +"@storybook/builder-webpack4@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/builder-webpack4/-/builder-webpack4-6.3.12.tgz#288d541e2801892721c975259476022da695dbfe" + integrity sha512-Dlm5Fc1svqpFDnVPZdAaEBiM/IDZHMV3RfEGbUTY/ZC0q8b/Ug1czzp/w0aTIjOFRuBDcG6IcplikaqHL8CJLg== dependencies: - "@reach/router" "^1.3.4" - "@storybook/channels" "6.3.4" - "@storybook/client-logger" "6.3.4" - "@storybook/core-events" "6.3.4" - "@storybook/csf" "0.0.1" - "@storybook/router" "6.3.4" + "@babel/core" "^7.12.10" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-decorators" "^7.12.12" + "@babel/plugin-proposal-export-default-from" "^7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.7" + "@babel/plugin-proposal-private-methods" "^7.12.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.12" + "@babel/plugin-transform-classes" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-for-of" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-shorthand-properties" "^7.12.1" + "@babel/plugin-transform-spread" "^7.12.1" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/preset-env" "^7.12.11" + "@babel/preset-react" "^7.12.10" + "@babel/preset-typescript" "^7.12.7" + "@storybook/addons" "6.3.12" + "@storybook/api" "6.3.12" + "@storybook/channel-postmessage" "6.3.12" + "@storybook/channels" "6.3.12" + "@storybook/client-api" "6.3.12" + "@storybook/client-logger" "6.3.12" + "@storybook/components" "6.3.12" + "@storybook/core-common" "6.3.12" + "@storybook/core-events" "6.3.12" + "@storybook/node-logger" "6.3.12" + "@storybook/router" "6.3.12" "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.3.4" - "@types/reach__router" "^1.3.7" + "@storybook/theming" "6.3.12" + "@storybook/ui" "6.3.12" + "@types/node" "^14.0.10" + "@types/webpack" "^4.41.26" + autoprefixer "^9.8.6" + babel-loader "^8.2.2" + babel-plugin-macros "^2.8.0" + babel-plugin-polyfill-corejs3 "^0.1.0" + case-sensitive-paths-webpack-plugin "^2.3.0" + core-js "^3.8.2" + css-loader "^3.6.0" + dotenv-webpack "^1.8.0" + file-loader "^6.2.0" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^4.1.6" + fs-extra "^9.0.1" + glob "^7.1.6" + glob-promise "^3.4.0" + global "^4.4.0" + html-webpack-plugin "^4.0.0" + pnp-webpack-plugin "1.6.4" + postcss "^7.0.36" + postcss-flexbugs-fixes "^4.2.1" + postcss-loader "^4.2.0" + raw-loader "^4.0.2" + react-dev-utils "^11.0.3" + stable "^0.1.8" + style-loader "^1.3.0" + terser-webpack-plugin "^4.2.3" + ts-dedent "^2.0.0" + url-loader "^4.1.1" + util-deprecate "^1.0.2" + webpack "4" + webpack-dev-middleware "^3.7.3" + webpack-filter-warnings-plugin "^1.2.1" + webpack-hot-middleware "^2.25.0" + webpack-virtual-modules "^0.2.2" + +"@storybook/channel-postmessage@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-6.3.12.tgz#3ff9412ac0f445e3b8b44dd414e783a5a47ff7c1" + integrity sha512-Ou/2Ga3JRTZ/4sSv7ikMgUgLTeZMsXXWLXuscz4oaYhmOqAU9CrJw0G1NitwBgK/+qC83lEFSLujHkWcoQDOKg== + dependencies: + "@storybook/channels" "6.3.12" + "@storybook/client-logger" "6.3.12" + "@storybook/core-events" "6.3.12" core-js "^3.8.2" - fast-deep-equal "^3.1.3" global "^4.4.0" - lodash "^4.17.20" - memoizerific "^1.11.3" qs "^6.10.0" - regenerator-runtime "^0.13.7" - store2 "^2.12.0" telejson "^5.3.2" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" - -"@storybook/channel-postmessage@6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-6.1.17.tgz#309ce67c94637ec13319d4ce360a8f3742ddbaf4" - integrity sha512-2nVqxq4oZdSITqhFOnkh1rmDMjCwHuobnK5Fp3l7ftCkbmiZHMheKK9Tz4Rb803dhXvcGYs0zRS8NjKyxlOLsA== - dependencies: - "@storybook/channels" "6.1.17" - "@storybook/client-logger" "6.1.17" - "@storybook/core-events" "6.1.17" - core-js "^3.0.1" - global "^4.3.2" - qs "^6.6.0" - telejson "^5.0.2" - -"@storybook/channels@6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.1.17.tgz#2cc89a6b9727d19c24b15fa3cb15569b469db864" - integrity sha512-MUdj0eKr/AbxevHTSXX7AsgxAz6e5O4ZxoYX5G8ggoqSXrWzws6zRFmUmmTdjpIvVmP2M1Kh4SYFAKcS/AGw9w== - dependencies: - core-js "^3.0.1" - ts-dedent "^2.0.0" - util-deprecate "^1.0.2" -"@storybook/channels@6.3.4": - version "6.3.4" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.3.4.tgz#425b31a67e42ac66ccb03465e4ba2e2ef9c8344b" - integrity sha512-zdZzBbIu9JHEe+uw8FqKsNUiFY+iqI9QdHH/pM3DTTQpBN/JM1Xwfo3CkqA8c5PkhSGqpW0YjXoPash4lawr1Q== +"@storybook/channels@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.3.12.tgz#aa0d793895a8b211f0ad3459c61c1bcafd0093c7" + integrity sha512-l4sA+g1PdUV8YCbgs47fIKREdEQAKNdQIZw0b7BfTvY9t0x5yfBywgQhYON/lIeiNGz2OlIuD+VUtqYfCtNSyw== dependencies: core-js "^3.8.2" ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/client-api@6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.1.17.tgz#3ced22f08a47af70ccf8929111bc44b79e9e8ec0" - integrity sha512-Loz/wdh0axgq0PS19tx0tGEFEkFWlYc6YauJGHjygYa1xX7mJ54hDoaTolySCXN1HtfZn08D847yjGSN2oIqVg== +"@storybook/client-api@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.3.12.tgz#a0c6d72a871d1cb02b4b98675472839061e39b5b" + integrity sha512-xnW+lKKK2T774z+rOr9Wopt1aYTStfb86PSs9p3Fpnc2Btcftln+C3NtiHZl8Ccqft8Mz/chLGgewRui6tNI8g== dependencies: - "@storybook/addons" "6.1.17" - "@storybook/channel-postmessage" "6.1.17" - "@storybook/channels" "6.1.17" - "@storybook/client-logger" "6.1.17" - "@storybook/core-events" "6.1.17" + "@storybook/addons" "6.3.12" + "@storybook/channel-postmessage" "6.3.12" + "@storybook/channels" "6.3.12" + "@storybook/client-logger" "6.3.12" + "@storybook/core-events" "6.3.12" "@storybook/csf" "0.0.1" - "@types/qs" "^6.9.0" - "@types/webpack-env" "^1.15.3" - core-js "^3.0.1" - global "^4.3.2" - lodash "^4.17.15" + "@types/qs" "^6.9.5" + "@types/webpack-env" "^1.16.0" + core-js "^3.8.2" + global "^4.4.0" + lodash "^4.17.20" memoizerific "^1.11.3" - qs "^6.6.0" + qs "^6.10.0" regenerator-runtime "^0.13.7" stable "^0.1.8" - store2 "^2.7.1" + store2 "^2.12.0" ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/client-logger@6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.1.17.tgz#0d89aaf824457f19bf9aa585bbcada57595e7d01" - integrity sha512-oqExrxhmws0ihB47sjdynZHd3OpUP4KWkx4udG+74lYIvBH+EZmQ9xF+UofeY3j5p1I9k8ugEcVKy0sqh1yR3w== - dependencies: - core-js "^3.0.1" - global "^4.3.2" - -"@storybook/client-logger@6.3.4": - version "6.3.4" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.3.4.tgz#c7ee70463c48bb3af704165d5456351ebb667fc2" - integrity sha512-Gu4M5bBHHQznsdoj8uzYymeojwWq+CRNsUUH41BQIND/RJYSX1IYGIj0yNBP449nv2pjHcTGlN8NJDd+PcELCQ== +"@storybook/client-logger@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.3.12.tgz#6585c98923b49fcb25dbceeeb96ef2a83e28e0f4" + integrity sha512-zNDsamZvHnuqLznDdP9dUeGgQ9TyFh4ray3t1VGO7ZqWVZ2xtVCCXjDvMnOXI2ifMpX5UsrOvshIPeE9fMBmiQ== dependencies: core-js "^3.8.2" global "^4.4.0" -"@storybook/components@6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.1.17.tgz#f92d36e370ec6039d8c7cee9ef13dda866eed3da" - integrity sha512-rIEll0UTxEKmG4IsSS5K+6DjRLVtX8J+9cg79GSAC7N1ZHUR1UQmjjJaehJa5q/NQ5H8C39acxpT4Py/BcsL2g== - dependencies: - "@popperjs/core" "^2.5.4" - "@storybook/client-logger" "6.1.17" - "@storybook/csf" "0.0.1" - "@storybook/theming" "6.1.17" - "@types/overlayscrollbars" "^1.9.0" - "@types/react-color" "^3.0.1" - "@types/react-syntax-highlighter" "11.0.4" - core-js "^3.0.1" - fast-deep-equal "^3.1.1" - global "^4.3.2" - lodash "^4.17.15" - markdown-to-jsx "^6.11.4" - memoizerific "^1.11.3" - overlayscrollbars "^1.10.2" - polished "^3.4.4" - react-color "^2.17.0" - react-popper-tooltip "^3.1.1" - react-syntax-highlighter "^13.5.0" - react-textarea-autosize "^8.1.1" - ts-dedent "^2.0.0" - -"@storybook/components@^6.1.7": - version "6.3.4" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.3.4.tgz#c872ec267edf315eaada505be8595c70eb6db09b" - integrity sha512-0hBKTkkQbW+daaA6nRedkviPr2bEzy1kwq0H5eaLKI1zYeXN3U5Z8fVhO137PPqH5LmLietrmTPkqiljUBk9ug== +"@storybook/components@6.3.12", "@storybook/components@^6.3.0", "@storybook/components@^6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.3.12.tgz#0c7967c60354c84afa20dfab4753105e49b1927d" + integrity sha512-kdQt8toUjynYAxDLrJzuG7YSNL6as1wJoyzNUaCfG06YPhvIAlKo7le9tS2mThVFN5e9nbKrW3N1V1sp6ypZXQ== dependencies: "@popperjs/core" "^2.6.0" - "@storybook/client-logger" "6.3.4" + "@storybook/client-logger" "6.3.12" "@storybook/csf" "0.0.1" - "@storybook/theming" "6.3.4" + "@storybook/theming" "6.3.12" "@types/color-convert" "^2.0.0" "@types/overlayscrollbars" "^1.12.0" "@types/react-syntax-highlighter" "11.0.5" @@ -3465,191 +4459,275 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/core-events@6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.1.17.tgz#697ed916fcb2a411bc9f8bdbfacd0eb9d394eb58" - integrity sha512-xBI7kmyROcqhYNmFv4QBjD77CzV+k/0F051YFS5WicEI4qDWPPvzaShhm96ZrGobUX3+di4pC11gqdsrFeNCEg== - dependencies: - core-js "^3.0.1" - -"@storybook/core-events@6.3.4": - version "6.3.4" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.3.4.tgz#f841b8659a8729d334acd9a6dcfc470c88a2be8f" - integrity sha512-6qI5bU5VcAoRfxkvpdRqO16eYrX5M0P2E3TakqUUDcgDo5Rfcwd1wTTcwiXslMIh7oiVGiisA+msKTlfzyKf9Q== +"@storybook/core-client@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/core-client/-/core-client-6.3.12.tgz#fd01bfbc69c331f4451973a4e7597624dc3737e5" + integrity sha512-8Smd9BgZHJpAdevLKQYinwtjSyCZAuBMoetP4P5hnn53mWl0NFbrHFaAdT+yNchDLZQUbf7Y18VmIqEH+RCR5w== dependencies: + "@storybook/addons" "6.3.12" + "@storybook/channel-postmessage" "6.3.12" + "@storybook/client-api" "6.3.12" + "@storybook/client-logger" "6.3.12" + "@storybook/core-events" "6.3.12" + "@storybook/csf" "0.0.1" + "@storybook/ui" "6.3.12" + airbnb-js-shims "^2.2.1" + ansi-to-html "^0.6.11" core-js "^3.8.2" + global "^4.4.0" + lodash "^4.17.20" + qs "^6.10.0" + regenerator-runtime "^0.13.7" + ts-dedent "^2.0.0" + unfetch "^4.2.0" + util-deprecate "^1.0.2" -"@storybook/core@6.1.17", "@storybook/core@^6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/core/-/core-6.1.17.tgz#21c3d2c23fcaac4b930c9413f396d158aaeb7546" - integrity sha512-9x8ezlKlm8SQ+OW3kKwJwuVcaTDCw2OlA9YZEOo1kdRKsiiy5X14VqjJocl/BqnDt2VgzUUchz3m4neHYMAivQ== +"@storybook/core-common@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-6.3.12.tgz#95ce953d7efda44394b159322d6a2280c202f21c" + integrity sha512-xlHs2QXELq/moB4MuXjYOczaxU64BIseHsnFBLyboJYN6Yso3qihW5RB7cuJlGohkjb4JwY74dvfT4Ww66rkBA== dependencies: - "@babel/core" "^7.12.3" + "@babel/core" "^7.12.10" "@babel/plugin-proposal-class-properties" "^7.12.1" - "@babel/plugin-proposal-decorators" "^7.12.1" + "@babel/plugin-proposal-decorators" "^7.12.12" "@babel/plugin-proposal-export-default-from" "^7.12.1" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" "@babel/plugin-proposal-object-rest-spread" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.7" "@babel/plugin-proposal-private-methods" "^7.12.1" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-transform-arrow-functions" "^7.12.1" - "@babel/plugin-transform-block-scoping" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.12" "@babel/plugin-transform-classes" "^7.12.1" "@babel/plugin-transform-destructuring" "^7.12.1" "@babel/plugin-transform-for-of" "^7.12.1" "@babel/plugin-transform-parameters" "^7.12.1" "@babel/plugin-transform-shorthand-properties" "^7.12.1" "@babel/plugin-transform-spread" "^7.12.1" - "@babel/plugin-transform-template-literals" "^7.12.1" - "@babel/preset-env" "^7.12.1" - "@babel/preset-react" "^7.12.1" - "@babel/preset-typescript" "^7.12.1" + "@babel/preset-env" "^7.12.11" + "@babel/preset-react" "^7.12.10" + "@babel/preset-typescript" "^7.12.7" "@babel/register" "^7.12.1" - "@storybook/addons" "6.1.17" - "@storybook/api" "6.1.17" - "@storybook/channel-postmessage" "6.1.17" - "@storybook/channels" "6.1.17" - "@storybook/client-api" "6.1.17" - "@storybook/client-logger" "6.1.17" - "@storybook/components" "6.1.17" - "@storybook/core-events" "6.1.17" - "@storybook/csf" "0.0.1" - "@storybook/node-logger" "6.1.17" - "@storybook/router" "6.1.17" + "@storybook/node-logger" "6.3.12" "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.1.17" - "@storybook/ui" "6.1.17" "@types/glob-base" "^0.3.0" "@types/micromatch" "^4.0.1" - "@types/node-fetch" "^2.5.4" - airbnb-js-shims "^2.2.1" - ansi-to-html "^0.6.11" - autoprefixer "^9.7.2" - babel-loader "^8.0.6" - babel-plugin-emotion "^10.0.20" - babel-plugin-macros "^2.8.0" - babel-preset-minify "^0.5.0 || 0.6.0-alpha.5" - better-opn "^2.0.0" - boxen "^4.1.0" - case-sensitive-paths-webpack-plugin "^2.2.0" - chalk "^4.0.0" - cli-table3 "0.6.0" - commander "^5.0.0" - core-js "^3.0.1" - cpy "^8.1.1" - css-loader "^3.5.3" - detect-port "^1.3.0" - dotenv-webpack "^1.7.0" - ejs "^3.1.2" - express "^4.17.0" - file-loader "^6.0.0" + "@types/node" "^14.0.10" + "@types/pretty-hrtime" "^1.0.0" + babel-loader "^8.2.2" + babel-plugin-macros "^3.0.1" + babel-plugin-polyfill-corejs3 "^0.1.0" + chalk "^4.1.0" + core-js "^3.8.2" + express "^4.17.1" file-system-cache "^1.0.5" - find-up "^4.1.0" - fork-ts-checker-webpack-plugin "^4.1.4" - fs-extra "^9.0.0" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.0.4" glob "^7.1.6" glob-base "^0.3.0" - glob-promise "^3.4.0" - global "^4.3.2" - html-webpack-plugin "^4.2.1" - inquirer "^7.0.0" - interpret "^2.0.0" - ip "^1.1.5" - json5 "^2.1.1" + interpret "^2.2.0" + json5 "^2.1.3" lazy-universal-dotenv "^3.0.1" micromatch "^4.0.2" - node-fetch "^2.6.0" - pkg-dir "^4.2.0" - pnp-webpack-plugin "1.6.4" - postcss-flexbugs-fixes "^4.1.0" - postcss-loader "^3.0.0" + pkg-dir "^5.0.0" pretty-hrtime "^1.0.3" - qs "^6.6.0" - raw-loader "^4.0.1" - react-dev-utils "^10.0.0" - regenerator-runtime "^0.13.7" resolve-from "^5.0.0" + ts-dedent "^2.0.0" + util-deprecate "^1.0.2" + webpack "4" + +"@storybook/core-events@6.3.12", "@storybook/core-events@^6.3.0": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.3.12.tgz#73f6271d485ef2576234e578bb07705b92805290" + integrity sha512-SXfD7xUUMazaeFkB92qOTUV8Y/RghE4SkEYe5slAdjeocSaH7Nz2WV0rqNEgChg0AQc+JUI66no8L9g0+lw4Gw== + dependencies: + core-js "^3.8.2" + +"@storybook/core-server@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-6.3.12.tgz#d906f823b263d78a4b087be98810b74191d263cd" + integrity sha512-T/Mdyi1FVkUycdyOnhXvoo3d9nYXLQFkmaJkltxBFLzAePAJUSgAsPL9odNC3+p8Nr2/UDsDzvu/Ow0IF0mzLQ== + dependencies: + "@discoveryjs/json-ext" "^0.5.3" + "@storybook/builder-webpack4" "6.3.12" + "@storybook/core-client" "6.3.12" + "@storybook/core-common" "6.3.12" + "@storybook/csf-tools" "6.3.12" + "@storybook/manager-webpack4" "6.3.12" + "@storybook/node-logger" "6.3.12" + "@storybook/semver" "^7.3.2" + "@types/node" "^14.0.10" + "@types/node-fetch" "^2.5.7" + "@types/pretty-hrtime" "^1.0.0" + "@types/webpack" "^4.41.26" + better-opn "^2.1.1" + boxen "^4.2.0" + chalk "^4.1.0" + cli-table3 "0.6.0" + commander "^6.2.1" + compression "^1.7.4" + core-js "^3.8.2" + cpy "^8.1.1" + detect-port "^1.3.0" + express "^4.17.1" + file-system-cache "^1.0.5" + fs-extra "^9.0.1" + globby "^11.0.2" + ip "^1.1.5" + node-fetch "^2.6.1" + pretty-hrtime "^1.0.3" + prompts "^2.4.0" + regenerator-runtime "^0.13.7" serve-favicon "^2.5.0" - shelljs "^0.8.4" - stable "^0.1.8" - style-loader "^1.2.1" - telejson "^5.0.2" - terser-webpack-plugin "^3.0.0" ts-dedent "^2.0.0" - unfetch "^4.1.0" - url-loader "^4.0.0" util-deprecate "^1.0.2" - webpack "^4.44.2" - webpack-dev-middleware "^3.7.0" - webpack-filter-warnings-plugin "^1.2.1" - webpack-hot-middleware "^2.25.0" - webpack-virtual-modules "^0.2.2" + webpack "4" + +"@storybook/core@6.3.12", "@storybook/core@^6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/core/-/core-6.3.12.tgz#eb945f7ed5c9039493318bcd2bb5a3a897b91cfd" + integrity sha512-FJm2ns8wk85hXWKslLWiUWRWwS9KWRq7jlkN6M9p57ghFseSGr4W71Orcoab4P3M7jI97l5yqBfppbscinE74g== + dependencies: + "@storybook/core-client" "6.3.12" + "@storybook/core-server" "6.3.12" + +"@storybook/csf-tools@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/csf-tools/-/csf-tools-6.3.12.tgz#d979c6a79d1e9d6c8b5a5e8834d07fcf5b793844" + integrity sha512-wNrX+99ajAXxLo0iRwrqw65MLvCV6SFC0XoPLYrtBvyKr+hXOOnzIhO2f5BNEii8velpC2gl2gcLKeacpVYLqA== + dependencies: + "@babel/generator" "^7.12.11" + "@babel/parser" "^7.12.11" + "@babel/plugin-transform-react-jsx" "^7.12.12" + "@babel/preset-env" "^7.12.11" + "@babel/traverse" "^7.12.11" + "@babel/types" "^7.12.11" + "@mdx-js/mdx" "^1.6.22" + "@storybook/csf" "^0.0.1" + core-js "^3.8.2" + fs-extra "^9.0.1" + js-string-escape "^1.0.1" + lodash "^4.17.20" + prettier "~2.2.1" + regenerator-runtime "^0.13.7" -"@storybook/csf@0.0.1": +"@storybook/csf@0.0.1", "@storybook/csf@^0.0.1": version "0.0.1" resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.1.tgz#95901507dc02f0bc6f9ac8ee1983e2fc5bb98ce6" integrity sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw== dependencies: lodash "^4.17.15" -"@storybook/node-logger@6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-6.1.17.tgz#468e65c9f0c103d4b0cd7f5da945af81e9aaa3d4" - integrity sha512-Z0xQ4kzvf7GnwFG9UY1HJO2UR66t8IBnC5GxvWrJ/kwXE+DRF3mm/MT41Zz/d9zAY5Vo4mhE5zRwlYSAtrxQIQ== +"@storybook/manager-webpack4@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/manager-webpack4/-/manager-webpack4-6.3.12.tgz#1c10a60b0acec3f9136dd8b7f22a25469d8b91e5" + integrity sha512-OkPYNrHXg2yZfKmEfTokP6iKx4OLTr0gdI5yehi/bLEuQCSHeruxBc70Dxm1GBk1Mrf821wD9WqMXNDjY5Qtug== + dependencies: + "@babel/core" "^7.12.10" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/preset-react" "^7.12.10" + "@storybook/addons" "6.3.12" + "@storybook/core-client" "6.3.12" + "@storybook/core-common" "6.3.12" + "@storybook/node-logger" "6.3.12" + "@storybook/theming" "6.3.12" + "@storybook/ui" "6.3.12" + "@types/node" "^14.0.10" + "@types/webpack" "^4.41.26" + babel-loader "^8.2.2" + case-sensitive-paths-webpack-plugin "^2.3.0" + chalk "^4.1.0" + core-js "^3.8.2" + css-loader "^3.6.0" + dotenv-webpack "^1.8.0" + express "^4.17.1" + file-loader "^6.2.0" + file-system-cache "^1.0.5" + find-up "^5.0.0" + fs-extra "^9.0.1" + html-webpack-plugin "^4.0.0" + node-fetch "^2.6.1" + pnp-webpack-plugin "1.6.4" + read-pkg-up "^7.0.1" + regenerator-runtime "^0.13.7" + resolve-from "^5.0.0" + style-loader "^1.3.0" + telejson "^5.3.2" + terser-webpack-plugin "^4.2.3" + ts-dedent "^2.0.0" + url-loader "^4.1.1" + util-deprecate "^1.0.2" + webpack "4" + webpack-dev-middleware "^3.7.3" + webpack-virtual-modules "^0.2.2" + +"@storybook/node-logger@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-6.3.12.tgz#a67cfbe266d2692f317914ef583721627498df19" + integrity sha512-iktOem/Ls2+dsZY9PhPeC6T1QhX/y7OInP88neLsqEPEbB2UXca3Ydv7OZBhBVbvN25W45b05MRzbtNUxYLNRw== dependencies: "@types/npmlog" "^4.1.2" - chalk "^4.0.0" - core-js "^3.0.1" + chalk "^4.1.0" + core-js "^3.8.2" npmlog "^4.1.2" pretty-hrtime "^1.0.3" -"@storybook/react@^6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-6.1.17.tgz#cb48386d435984d7ca58a24e686a72159367077b" - integrity sha512-gBylKDuwUzWueB6mEhTo72SelWU3vPWHAFsi+NK6zWFIc2a5dJc9QqDfN+2rBhVOdRXqhSHzYwNWurqYpWuqew== +"@storybook/postinstall@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/postinstall/-/postinstall-6.3.12.tgz#ed98caff76d8c1a1733ec630565ef4162b274614" + integrity sha512-HkZ+abtZ3W6JbGPS6K7OSnNXbwaTwNNd5R02kRs4gV9B29XsBPDtFT6vIwzM3tmVQC7ihL5a8ceWp2OvzaNOuw== + dependencies: + core-js "^3.8.2" + +"@storybook/react-docgen-typescript-plugin@1.0.2-canary.253f8c1.0": + version "1.0.2-canary.253f8c1.0" + resolved "https://registry.yarnpkg.com/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.2-canary.253f8c1.0.tgz#f2da40e6aae4aa586c2fb284a4a1744602c3c7fa" + integrity sha512-mmoRG/rNzAiTbh+vGP8d57dfcR2aP+5/Ll03KKFyfy5FqWFm/Gh7u27ikx1I3LmVMI8n6jh5SdWMkMKon7/tDw== + dependencies: + debug "^4.1.1" + endent "^2.0.1" + find-cache-dir "^3.3.1" + flat-cache "^3.0.4" + micromatch "^4.0.2" + react-docgen-typescript "^2.0.0" + tslib "^2.0.0" + +"@storybook/react@^6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-6.3.12.tgz#2e172cbfc06f656d2890743dcf49741a10fa1629" + integrity sha512-c1Y/3/eNzye+ZRwQ3BXJux6pUMVt3lhv1/M9Qagl9JItP3jDSj5Ed3JHCgwEqpprP8mvNNXwEJ8+M7vEQyDuHg== dependencies: "@babel/preset-flow" "^7.12.1" - "@babel/preset-react" "^7.12.1" - "@pmmmwh/react-refresh-webpack-plugin" "^0.4.2" - "@storybook/addons" "6.1.17" - "@storybook/core" "6.1.17" - "@storybook/node-logger" "6.1.17" + "@babel/preset-react" "^7.12.10" + "@pmmmwh/react-refresh-webpack-plugin" "^0.4.3" + "@storybook/addons" "6.3.12" + "@storybook/core" "6.3.12" + "@storybook/core-common" "6.3.12" + "@storybook/node-logger" "6.3.12" + "@storybook/react-docgen-typescript-plugin" "1.0.2-canary.253f8c1.0" "@storybook/semver" "^7.3.2" - "@types/webpack-env" "^1.15.3" + "@types/webpack-env" "^1.16.0" babel-plugin-add-react-displayname "^0.0.5" babel-plugin-named-asset-import "^0.3.1" babel-plugin-react-docgen "^4.2.1" - core-js "^3.0.1" - global "^4.3.2" - lodash "^4.17.15" + core-js "^3.8.2" + global "^4.4.0" + lodash "^4.17.20" prop-types "^15.7.2" - react-dev-utils "^10.0.0" - react-docgen-typescript-plugin "^0.6.2" + react-dev-utils "^11.0.3" react-refresh "^0.8.3" + read-pkg-up "^7.0.1" regenerator-runtime "^0.13.7" ts-dedent "^2.0.0" - webpack "^4.44.2" - -"@storybook/router@6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.1.17.tgz#96746878c50c6c97c7de5a1b23a9503c5d648775" - integrity sha512-wLqSOB5yLXgNyDGy008RUvjVRtVMq7lhmMRicSIxgJpkakPrMRN8n/nK7pxgQc/xDTphnS0u1nT01i97WszhCg== - dependencies: - "@reach/router" "^1.3.3" - "@types/reach__router" "^1.3.7" - core-js "^3.0.1" - global "^4.3.2" - memoizerific "^1.11.3" - qs "^6.6.0" + webpack "4" -"@storybook/router@6.3.4": - version "6.3.4" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.3.4.tgz#f38ec8064a9d1811a68558390727c30220fe7d72" - integrity sha512-cNG2bT0BBfqJyaW6xKUnEB/XXSdMkYeI9ShwJ2gh/2Bnidm7eZ/RKUOZ4q5equMm+SxxyZgpBulqnFN+TqPbOA== +"@storybook/router@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.3.12.tgz#0d572ec795f588ca886f39cb9b27b94ff3683f84" + integrity sha512-G/pNGCnrJRetCwyEZulHPT+YOcqEj/vkPVDTUfii2qgqukup6K0cjwgd7IukAURnAnnzTi1gmgFuEKUi8GE/KA== dependencies: "@reach/router" "^1.3.4" - "@storybook/client-logger" "6.3.4" + "@storybook/client-logger" "6.3.12" "@types/reach__router" "^1.3.7" core-js "^3.8.2" fast-deep-equal "^3.1.3" @@ -3667,10 +4745,26 @@ core-js "^3.6.5" find-up "^4.1.0" -"@storybook/storybook-deployer@^2.8.7": - version "2.8.7" - resolved "https://registry.yarnpkg.com/@storybook/storybook-deployer/-/storybook-deployer-2.8.7.tgz#c1eed33d03bd9267f884c60eea8e03dc3261ec11" - integrity sha512-O0hKHV6hg93fPMvKGC5M/sd7KTL473+SzMKm+WZNVEyLEfXXcVU+Ts9/VL1IhmC1P2A8Bg9oBnkcPqAqjAN46w== +"@storybook/source-loader@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/source-loader/-/source-loader-6.3.12.tgz#86e72824c04ad0eaa89b807857bd845db97e57bd" + integrity sha512-Lfe0LOJGqAJYkZsCL8fhuQOeFSCgv8xwQCt4dkcBd0Rw5zT2xv0IXDOiIOXGaWBMDtrJUZt/qOXPEPlL81Oaqg== + dependencies: + "@storybook/addons" "6.3.12" + "@storybook/client-logger" "6.3.12" + "@storybook/csf" "0.0.1" + core-js "^3.8.2" + estraverse "^5.2.0" + global "^4.4.0" + loader-utils "^2.0.0" + lodash "^4.17.20" + prettier "~2.2.1" + regenerator-runtime "^0.13.7" + +"@storybook/storybook-deployer@^2.8.10": + version "2.8.10" + resolved "https://registry.yarnpkg.com/@storybook/storybook-deployer/-/storybook-deployer-2.8.10.tgz#3cf96aea823d424fbfce98e76fca108d07470ec2" + integrity sha512-2uleH0AFuI98sdTkbyHt1BgPa0kmLxhC3zwfwtacE8FB+2ffdRdqBlp6GYDZ7CZ+R4B4XuPYhsgUKWkB+zngyQ== dependencies: git-url-parse "^11.1.2" glob "^7.1.3" @@ -3678,33 +4772,15 @@ shelljs "^0.8.1" yargs "^15.0.0" -"@storybook/theming@6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.1.17.tgz#99cc120a230c30458d833b40c806b9b4dff7b34a" - integrity sha512-LpRuY2aIh2td+qZi7E8cp2oM88LudNMmTsBT6N2/Id69u/a9qQd2cYCA9k9fAsg7rjor+wR/N695jk3SGtoFTw== - dependencies: - "@emotion/core" "^10.1.1" - "@emotion/is-prop-valid" "^0.8.6" - "@emotion/styled" "^10.0.23" - "@storybook/client-logger" "6.1.17" - core-js "^3.0.1" - deep-object-diff "^1.1.0" - emotion-theming "^10.0.19" - global "^4.3.2" - memoizerific "^1.11.3" - polished "^3.4.4" - resolve-from "^5.0.0" - ts-dedent "^2.0.0" - -"@storybook/theming@6.3.4": - version "6.3.4" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.3.4.tgz#69d3f912c74a7b6ba78c1c95fac3315356468bdd" - integrity sha512-L0lJcwUi7mse+U7EBAv5NVt81mH1MtUzk9paik8hMAc68vDtR/X0Cq4+zPsgykCROOTtEGrQ/JUUrpcEqeprTQ== +"@storybook/theming@6.3.12", "@storybook/theming@^6.3.0": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.3.12.tgz#5bddf9bd90a60709b5ab238ecdb7d9055dd7862e" + integrity sha512-wOJdTEa/VFyFB2UyoqyYGaZdym6EN7RALuQOAMT6zHA282FBmKw8nL5DETHEbctpnHdcrMC/391teK4nNSrdOA== dependencies: "@emotion/core" "^10.1.1" "@emotion/is-prop-valid" "^0.8.6" "@emotion/styled" "^10.0.27" - "@storybook/client-logger" "6.3.4" + "@storybook/client-logger" "6.3.12" core-js "^3.8.2" deep-object-diff "^1.1.0" emotion-theming "^10.0.27" @@ -3714,41 +4790,40 @@ resolve-from "^5.0.0" ts-dedent "^2.0.0" -"@storybook/ui@6.1.17": - version "6.1.17" - resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-6.1.17.tgz#c29e7a03c645dd94793a3cbd587fcb6e0ba0f22e" - integrity sha512-D4Vri1MmqfmNq+g1hSRqZyld5zX2VLUexQHGSPmNj+FhlOzkeNA5RcoMBWMvIUSUENiBx3a5gmr/6cbXo7ljdQ== +"@storybook/ui@6.3.12": + version "6.3.12" + resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-6.3.12.tgz#349e1a4c58c4fd18ea65b2ab56269a7c3a164ee7" + integrity sha512-PC2yEz4JMfarq7rUFbeA3hCA+31p5es7YPEtxLRvRwIZhtL0P4zQUfHpotb3KgWdoAIfZesAuoIQwMPQmEFYrw== dependencies: "@emotion/core" "^10.1.1" - "@storybook/addons" "6.1.17" - "@storybook/api" "6.1.17" - "@storybook/channels" "6.1.17" - "@storybook/client-logger" "6.1.17" - "@storybook/components" "6.1.17" - "@storybook/core-events" "6.1.17" - "@storybook/router" "6.1.17" + "@storybook/addons" "6.3.12" + "@storybook/api" "6.3.12" + "@storybook/channels" "6.3.12" + "@storybook/client-logger" "6.3.12" + "@storybook/components" "6.3.12" + "@storybook/core-events" "6.3.12" + "@storybook/router" "6.3.12" "@storybook/semver" "^7.3.2" - "@storybook/theming" "6.1.17" - "@types/markdown-to-jsx" "^6.11.0" - copy-to-clipboard "^3.0.8" - core-js "^3.0.1" - core-js-pure "^3.0.1" - downshift "^6.0.6" - emotion-theming "^10.0.19" + "@storybook/theming" "6.3.12" + "@types/markdown-to-jsx" "^6.11.3" + copy-to-clipboard "^3.3.1" + core-js "^3.8.2" + core-js-pure "^3.8.2" + downshift "^6.0.15" + emotion-theming "^10.0.27" fuse.js "^3.6.1" - global "^4.3.2" - lodash "^4.17.15" + global "^4.4.0" + lodash "^4.17.20" markdown-to-jsx "^6.11.4" memoizerific "^1.11.3" - polished "^3.4.4" - qs "^6.6.0" - react-draggable "^4.0.3" - react-helmet-async "^1.0.2" - react-hotkeys "2.0.0" - react-sizeme "^2.6.7" + polished "^4.0.5" + qs "^6.10.0" + react-draggable "^4.4.3" + react-helmet-async "^1.0.7" + react-sizeme "^3.0.1" regenerator-runtime "^0.13.7" resolve-from "^5.0.0" - store2 "^2.7.1" + store2 "^2.12.0" "@stylelint/postcss-css-in-js@^0.37.1": version "0.37.2" @@ -4055,6 +5130,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== +"@types/json-schema@^7.0.4": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": version "7.0.6" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" @@ -4070,13 +5150,20 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== -"@types/markdown-to-jsx@^6.11.0": +"@types/markdown-to-jsx@^6.11.3": version "6.11.3" resolved "https://registry.yarnpkg.com/@types/markdown-to-jsx/-/markdown-to-jsx-6.11.3.tgz#cdd1619308fecbc8be7e6a26f3751260249b020e" integrity sha512-30nFYpceM/ZEvhGiqWjm5quLUxNeld0HCzJEXMZZDpq53FPkS85mTwkWtCXzCqq8s5JYLgM5W392a02xn8Bdaw== dependencies: "@types/react" "*" +"@types/mdast@^3.0.0": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" + integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + dependencies: + "@types/unist" "*" + "@types/micromatch@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/micromatch/-/micromatch-4.0.1.tgz#9381449dd659fc3823fd2a4190ceacc985083bc7" @@ -4099,10 +5186,10 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= -"@types/node-fetch@^2.5.4": - version "2.5.7" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c" - integrity sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw== +"@types/node-fetch@^2.5.7": + version "2.5.12" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" + integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== dependencies: "@types/node" "*" form-data "^3.0.0" @@ -4117,6 +5204,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== +"@types/node@^14.0.10": + version "14.17.27" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.27.tgz#5054610d37bb5f6e21342d0e6d24c494231f3b85" + integrity sha512-94+Ahf9IcaDuJTle/2b+wzvjmutxXAEXU6O81JHblYXUg2BDG+dnBy7VxIPHKAyEEDHzCMQydTJuWvrE+Aanzw== + "@types/node@^8.10.11": version "8.10.48" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.48.tgz#e385073561643a9ba6199a1985ffc03530f90781" @@ -4137,16 +5229,16 @@ resolved "https://registry.yarnpkg.com/@types/overlayscrollbars/-/overlayscrollbars-1.12.1.tgz#fb637071b545834fb12aea94ee309a2ff4cdc0a8" integrity sha512-V25YHbSoKQN35UasHf0EKD9U2vcmexRSp78qa8UglxFH8H3D+adEa9zGZwrqpH4TdvqeMrgMqVqsLB4woAryrQ== -"@types/overlayscrollbars@^1.9.0": - version "1.12.0" - resolved "https://registry.yarnpkg.com/@types/overlayscrollbars/-/overlayscrollbars-1.12.0.tgz#98456caceca8ad73bd5bb572632a585074e70764" - integrity sha512-h/pScHNKi4mb+TrJGDon8Yb06ujFG0mSg12wIO0sWMUF3dQIe2ExRRdNRviaNt9IjxIiOfnRr7FsQAdHwK4sMg== - "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + "@types/pbkdf2@^3.0.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" @@ -4164,15 +5256,20 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.1.1.tgz#be148756d5480a84cde100324c03a86ae5739fb5" integrity sha512-2zs+O+UkDsJ1Vcp667pd3f8xearMdopz/z54i99wtRDI5KLmngk7vlrYZD0ZjKHaROR03EznlBbVY9PfAEyJIQ== +"@types/pretty-hrtime@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz#72a26101dc567b0d68fd956cf42314556e42d601" + integrity sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ== + "@types/prop-types@*": version "15.7.3" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== -"@types/qs@^6.9.0": - version "6.9.5" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" - integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== +"@types/qs@^6.9.5": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/reach__router@^1.3.7": version "1.3.7" @@ -4181,20 +5278,6 @@ dependencies: "@types/react" "*" -"@types/react-color@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/react-color/-/react-color-3.0.1.tgz#5433e2f503ea0e0831cbc6fd0c20f8157d93add0" - integrity sha512-J6mYm43Sid9y+OjZ7NDfJ2VVkeeuTPNVImNFITgQNXodHteKfl/t/5pAR5Z9buodZ2tCctsZjgiMlQOpfntakw== - dependencies: - "@types/react" "*" - -"@types/react-syntax-highlighter@11.0.4": - version "11.0.4" - resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.4.tgz#d86d17697db62f98046874f62fdb3e53a0bbc4cd" - integrity sha512-9GfTo3a0PHwQeTVoqs0g5bS28KkSY48pp5659wA+Dp4MqceDEa8EHBqrllJvvtyusszyJhViUEap0FDvlk/9Zg== - dependencies: - "@types/react" "*" - "@types/react-syntax-highlighter@11.0.5": version "11.0.5" resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.5.tgz#0d546261b4021e1f9d85b50401c0a42acb106087" @@ -4253,6 +5336,11 @@ resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== +"@types/tapable@^1": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" + integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== + "@types/testing-library__jest-dom@^5.9.1": version "5.9.5" resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.5.tgz#5bf25c91ad2d7b38f264b12275e5c92a66d849b0" @@ -4280,15 +5368,20 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== +"@types/unist@^2.0.3": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + "@types/uuid@^8.3.0": version "8.3.0" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.0.tgz#215c231dff736d5ba92410e6d602050cce7e273f" integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ== -"@types/webpack-env@^1.15.3": - version "1.16.0" - resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.0.tgz#8c0a9435dfa7b3b1be76562f3070efb3f92637b4" - integrity sha512-Fx+NpfOO0CpeYX2g9bkvX8O5qh9wrU1sOF4g8sft4Mu7z+qfe387YlyY8w8daDyDsKY5vUxM0yxkAYnbkRbZEw== +"@types/webpack-env@^1.16.0": + version "1.16.3" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.3.tgz#b776327a73e561b71e7881d0cd6d34a1424db86a" + integrity sha512-9gtOPPkfyNoEqCQgx4qJKkuNm/x0R2hKR7fdl7zvTJyHnIisuE/LfvXOsYWL0o3qq6uiBnKZNNNzi3l0y/X+xw== "@types/webpack-sources@*": version "2.0.0" @@ -4299,6 +5392,18 @@ "@types/source-list-map" "*" source-map "^0.7.3" +"@types/webpack@^4.41.26": + version "4.41.31" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.31.tgz#c35f252a3559ddf9c85c0d8b0b42019025e581aa" + integrity sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ== + dependencies: + "@types/node" "*" + "@types/tapable" "^1" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + anymatch "^3.0.0" + source-map "^0.6.0" + "@types/webpack@^4.41.8": version "4.41.25" resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.25.tgz#4d3b5aecc4e44117b376280fbfd2dc36697968c4" @@ -4609,18 +5714,6 @@ "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" -"@webpack-contrib/schema-utils@^1.0.0-beta.0": - version "1.0.0-beta.0" - resolved "https://registry.yarnpkg.com/@webpack-contrib/schema-utils/-/schema-utils-1.0.0-beta.0.tgz#bf9638c9464d177b48209e84209e23bee2eb4f65" - integrity sha512-LonryJP+FxQQHsjGBi6W786TQB1Oym+agTpY0c+Kj8alnIw+DLUJb6SI8Y1GHGhLCH1yPRrucjObUmxNICQ1pg== - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chalk "^2.3.2" - strip-ansi "^4.0.0" - text-table "^0.2.0" - webpack-log "^1.1.2" - "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -4735,7 +5828,7 @@ abstract-logging@^1.0.0: resolved "https://registry.yarnpkg.com/abstract-logging/-/abstract-logging-1.0.0.tgz#8b7deafd310559bc28f77724dd1bb30177278c1b" integrity sha1-i33q/TEFWbwo93ck3RuzAXcnjBs= -accepts@^1.3.5, accepts@~1.3.4, accepts@~1.3.7: +accepts@^1.3.5, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== @@ -4810,7 +5903,7 @@ acorn-walk@^6.0.1, acorn-walk@^6.1.0: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== -acorn-walk@^7.0.0, acorn-walk@^7.1.1: +acorn-walk@^7.0.0, acorn-walk@^7.1.1, acorn-walk@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== @@ -4830,7 +5923,7 @@ acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7, acorn@^6.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.0.0, acorn@^7.1.1, acorn@^7.4.0: +acorn@^7.0.0, acorn@^7.1.1, acorn@^7.4.0, acorn@^7.4.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -5025,7 +6118,7 @@ ajv@^4.7.0: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -5221,7 +6314,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.3, anymatch@^3.1.0, anymatch@~3.1.2: +anymatch@^3.0.0, anymatch@^3.0.3, anymatch@^3.1.0, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -5770,7 +6863,7 @@ autoprefixer@^8.0.0: postcss "^6.0.19" postcss-value-parser "^3.2.3" -autoprefixer@^9.7.2, autoprefixer@^9.8.0: +autoprefixer@^9.8.0: version "9.8.5" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.5.tgz#2c225de229ddafe1d1424c02791d0c3e10ccccaa" integrity sha512-C2p5KkumJlsTHoNv9w31NrBRgXhf6eCMteJuHZi2xhkgC+5Vm40MEtCKPhc0qdgAOhox0YPy1SQHTAky05UoKg== @@ -5783,6 +6876,19 @@ autoprefixer@^9.7.2, autoprefixer@^9.8.0: postcss "^7.0.32" postcss-value-parser "^4.1.0" +autoprefixer@^9.8.6: + version "9.8.8" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" + integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + picocolors "^0.2.1" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + available-typed-arrays@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz#9e0ae84ecff20caae6a94a1c3bc39b955649b7a9" @@ -5803,6 +6909,11 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== +axe-core@^4.2.0: + version "4.3.3" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.3.tgz#b55cd8e8ddf659fe89b064680e1c6a4dceab0325" + integrity sha512-/lqqLAmuIPi79WYfRpy2i8z+x+vxU3zX2uAm0gs1q52qTuKwolOj1P8XbufpXcsydrpKx2yGn2wzAnxCMV86QA== + axios-retry@^3.0.2: version "3.1.8" resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-3.1.8.tgz#ffcfed757e1fab8cbf832f8505bb0e0af47c520c" @@ -5817,7 +6928,7 @@ axios@^0.19.2, axios@^0.21.2: dependencies: follow-redirects "^1.14.0" -babel-code-frame@^6.16.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: +babel-code-frame@^6.16.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= @@ -5894,11 +7005,6 @@ babel-helper-define-map@^6.24.1: babel-types "^6.26.0" lodash "^4.17.4" -babel-helper-evaluate-path@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz#a62fa9c4e64ff7ea5cea9353174ef023a900a67c" - integrity sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA== - babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" @@ -5908,11 +7014,6 @@ babel-helper-explode-assignable-expression@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-helper-flip-expressions@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz#3696736a128ac18bc25254b5f40a22ceb3c1d3fd" - integrity sha1-NpZzahKKwYvCUlS19AoizrPB0/0= - babel-helper-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" @@ -5940,21 +7041,6 @@ babel-helper-hoist-variables@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-helper-is-nodes-equiv@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz#34e9b300b1479ddd98ec77ea0bbe9342dfe39684" - integrity sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ= - -babel-helper-is-void-0@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz#7d9c01b4561e7b95dbda0f6eee48f5b60e67313e" - integrity sha1-fZwBtFYee5Xb2g9u7kj1tg5nMT4= - -babel-helper-mark-eval-scopes@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz#d244a3bef9844872603ffb46e22ce8acdf551562" - integrity sha1-0kSjvvmESHJgP/tG4izorN9VFWI= - babel-helper-optimise-call-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" @@ -5983,11 +7069,6 @@ babel-helper-remap-async-to-generator@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-helper-remove-or-void@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz#a4f03b40077a0ffe88e45d07010dee241ff5ae60" - integrity sha1-pPA7QAd6D/6I5F0HAQ3uJB/1rmA= - babel-helper-replace-supers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" @@ -6000,11 +7081,6 @@ babel-helper-replace-supers@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-helper-to-multiple-sequence-expressions@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz#a3f924e3561882d42fcf48907aa98f7979a4588d" - integrity sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA== - babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" @@ -6027,15 +7103,15 @@ babel-jest@^26.6.3: graceful-fs "^4.2.4" slash "^3.0.0" -babel-loader@^8.0.6: - version "8.0.6" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" - integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== +babel-loader@^8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" + integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== dependencies: - find-cache-dir "^2.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" - pify "^4.0.1" + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" babel-messages@^6.23.0: version "6.23.0" @@ -6049,6 +7125,14 @@ babel-plugin-add-react-displayname@^0.0.5: resolved "https://registry.yarnpkg.com/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz#339d4cddb7b65fd62d1df9db9fe04de134122bd5" integrity sha1-M51M3be2X9YtHfnbn+BN4TQSK9U= +babel-plugin-apply-mdx-type-prop@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" + integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + "@mdx-js/util" "1.6.22" + babel-plugin-check-es2015-constants@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" @@ -6063,7 +7147,7 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-plugin-emotion@^10.0.20, babel-plugin-emotion@^10.0.27: +babel-plugin-emotion@^10.0.27: version "10.0.27" resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.27.tgz#59001cf5de847c1d61f2079cd906a90a00d3184f" integrity sha512-SUNYcT4FqhOqvwv0z1oeYhqgheU8qrceLojuHyX17ngo7WtWqN5I9l3IGHzf21Xraj465CVzF4IvOlAF+3ed0A== @@ -6079,6 +7163,13 @@ babel-plugin-emotion@^10.0.20, babel-plugin-emotion@^10.0.27: find-root "^1.1.0" source-map "^0.5.7" +babel-plugin-extract-import-names@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" + integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + babel-plugin-istanbul@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" @@ -6109,84 +7200,51 @@ babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.8.0: cosmiconfig "^6.0.0" resolve "^1.12.0" -babel-plugin-minify-builtins@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz#31eb82ed1a0d0efdc31312f93b6e4741ce82c36b" - integrity sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag== - -babel-plugin-minify-constant-folding@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.5.0.tgz#f84bc8dbf6a561e5e350ff95ae216b0ad5515b6e" - integrity sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ== - dependencies: - babel-helper-evaluate-path "^0.5.0" - -babel-plugin-minify-dead-code-elimination@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.0.tgz#d23ef5445238ad06e8addf5c1cf6aec835bcda87" - integrity sha512-XQteBGXlgEoAKc/BhO6oafUdT4LBa7ARi55mxoyhLHNuA+RlzRmeMAfc31pb/UqU01wBzRc36YqHQzopnkd/6Q== - dependencies: - babel-helper-evaluate-path "^0.5.0" - babel-helper-mark-eval-scopes "^0.4.3" - babel-helper-remove-or-void "^0.4.3" - lodash.some "^4.6.0" - -babel-plugin-minify-flip-comparisons@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz#00ca870cb8f13b45c038b3c1ebc0f227293c965a" - integrity sha1-AMqHDLjxO0XAOLPB68DyJyk8llo= - dependencies: - babel-helper-is-void-0 "^0.4.3" - -babel-plugin-minify-guarded-expressions@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.3.tgz#cc709b4453fd21b1f302877444c89f88427ce397" - integrity sha1-zHCbRFP9IbHzAod0RMifiEJ845c= +babel-plugin-macros@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== dependencies: - babel-helper-flip-expressions "^0.4.3" + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" -babel-plugin-minify-infinity@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz#dfb876a1b08a06576384ef3f92e653ba607b39ca" - integrity sha1-37h2obCKBldjhO8/kuZTumB7Oco= +babel-plugin-named-asset-import@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.2.tgz#20978ed446b8e1bf4a2f42d0a94c0ece85f75f4f" + integrity sha512-CxwvxrZ9OirpXQ201Ec57OmGhmI8/ui/GwTDy0hSp6CmRvgRC0pSair6Z04Ck+JStA0sMPZzSJ3uE4n17EXpPQ== -babel-plugin-minify-mangle-names@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.0.tgz#bcddb507c91d2c99e138bd6b17a19c3c271e3fd3" - integrity sha512-3jdNv6hCAw6fsX1p2wBGPfWuK69sfOjfd3zjUXkbq8McbohWy23tpXfy5RnToYWggvqzuMOwlId1PhyHOfgnGw== +babel-plugin-polyfill-corejs2@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" + integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== dependencies: - babel-helper-mark-eval-scopes "^0.4.3" - -babel-plugin-minify-numeric-literals@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz#8e4fd561c79f7801286ff60e8c5fd9deee93c0bc" - integrity sha1-jk/VYcefeAEob/YOjF/Z3u6TwLw= - -babel-plugin-minify-replace@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.5.0.tgz#d3e2c9946c9096c070efc96761ce288ec5c3f71c" - integrity sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q== + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.2" + semver "^6.1.1" -babel-plugin-minify-simplify@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.0.tgz#1f090018afb90d8b54d3d027fd8a4927f243da6f" - integrity sha512-TM01J/YcKZ8XIQd1Z3nF2AdWHoDsarjtZ5fWPDksYZNsoOjQ2UO2EWm824Ym6sp127m44gPlLFiO5KFxU8pA5Q== +babel-plugin-polyfill-corejs3@^0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0" + integrity sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw== dependencies: - babel-helper-flip-expressions "^0.4.3" - babel-helper-is-nodes-equiv "^0.0.1" - babel-helper-to-multiple-sequence-expressions "^0.5.0" + "@babel/helper-define-polyfill-provider" "^0.1.5" + core-js-compat "^3.8.1" -babel-plugin-minify-type-constructors@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz#1bc6f15b87f7ab1085d42b330b717657a2156500" - integrity sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA= +babel-plugin-polyfill-corejs3@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz#2779846a16a1652244ae268b1e906ada107faf92" + integrity sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw== dependencies: - babel-helper-is-void-0 "^0.4.3" + "@babel/helper-define-polyfill-provider" "^0.2.2" + core-js-compat "^3.16.2" -babel-plugin-named-asset-import@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.2.tgz#20978ed446b8e1bf4a2f42d0a94c0ece85f75f4f" - integrity sha512-CxwvxrZ9OirpXQ201Ec57OmGhmI8/ui/GwTDy0hSp6CmRvgRC0pSair6Z04Ck+JStA0sMPZzSJ3uE4n17EXpPQ== +babel-plugin-polyfill-regenerator@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" + integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.2" babel-plugin-react-docgen@^4.2.1: version "4.2.1" @@ -6425,33 +7483,6 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-syntax-exponentiation-operator "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-inline-consecutive-adds@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz#323d47a3ea63a83a7ac3c811ae8e6941faf2b0d1" - integrity sha1-Mj1Ho+pjqDp6w8gRro5pQfrysNE= - -babel-plugin-transform-member-expression-literals@^6.9.4: - version "6.9.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz#37039c9a0c3313a39495faac2ff3a6b5b9d038bf" - integrity sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8= - -babel-plugin-transform-merge-sibling-variables@^6.9.4: - version "6.9.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz#85b422fc3377b449c9d1cde44087203532401dae" - integrity sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4= - -babel-plugin-transform-minify-booleans@^6.9.4: - version "6.9.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz#acbb3e56a3555dd23928e4b582d285162dd2b198" - integrity sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg= - -babel-plugin-transform-property-literals@^6.9.4: - version "6.9.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz#98c1d21e255736573f93ece54459f6ce24985d39" - integrity sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk= - dependencies: - esutils "^2.0.2" - babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" @@ -6459,33 +7490,6 @@ babel-plugin-transform-regenerator@^6.22.0: dependencies: regenerator-transform "^0.10.0" -babel-plugin-transform-regexp-constructors@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz#58b7775b63afcf33328fae9a5f88fbd4fb0b4965" - integrity sha1-WLd3W2OvzzMyj66aX4j71PsLSWU= - -babel-plugin-transform-remove-console@^6.9.4: - version "6.9.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz#b980360c067384e24b357a588d807d3c83527780" - integrity sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A= - -babel-plugin-transform-remove-debugger@^6.9.4: - version "6.9.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz#42b727631c97978e1eb2d199a7aec84a18339ef2" - integrity sha1-QrcnYxyXl44estGZp67IShgznvI= - -babel-plugin-transform-remove-undefined@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.5.0.tgz#80208b31225766c630c97fa2d288952056ea22dd" - integrity sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ== - dependencies: - babel-helper-evaluate-path "^0.5.0" - -babel-plugin-transform-simplify-comparison-operators@^6.9.4: - version "6.9.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz#f62afe096cab0e1f68a2d753fdf283888471ceb9" - integrity sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk= - babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" @@ -6494,11 +7498,6 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-plugin-transform-undefined-to-void@^6.9.4: - version "6.9.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz#be241ca81404030678b748717322b89d0c8fe280" - integrity sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA= - babel-preset-current-node-syntax@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" @@ -6561,35 +7560,6 @@ babel-preset-jest@^26.6.2: babel-plugin-jest-hoist "^26.6.2" babel-preset-current-node-syntax "^1.0.0" -"babel-preset-minify@^0.5.0 || 0.6.0-alpha.5": - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-preset-minify/-/babel-preset-minify-0.5.0.tgz#e25bb8d3590087af02b650967159a77c19bfb96b" - integrity sha512-xj1s9Mon+RFubH569vrGCayA9Fm2GMsCgDRm1Jb8SgctOB7KFcrVc2o8K3YHUyMz+SWP8aea75BoS8YfsXXuiA== - dependencies: - babel-plugin-minify-builtins "^0.5.0" - babel-plugin-minify-constant-folding "^0.5.0" - babel-plugin-minify-dead-code-elimination "^0.5.0" - babel-plugin-minify-flip-comparisons "^0.4.3" - babel-plugin-minify-guarded-expressions "^0.4.3" - babel-plugin-minify-infinity "^0.4.3" - babel-plugin-minify-mangle-names "^0.5.0" - babel-plugin-minify-numeric-literals "^0.4.3" - babel-plugin-minify-replace "^0.5.0" - babel-plugin-minify-simplify "^0.5.0" - babel-plugin-minify-type-constructors "^0.4.3" - babel-plugin-transform-inline-consecutive-adds "^0.4.3" - babel-plugin-transform-member-expression-literals "^6.9.4" - babel-plugin-transform-merge-sibling-variables "^6.9.4" - babel-plugin-transform-minify-booleans "^6.9.4" - babel-plugin-transform-property-literals "^6.9.4" - babel-plugin-transform-regexp-constructors "^0.4.3" - babel-plugin-transform-remove-console "^6.9.4" - babel-plugin-transform-remove-debugger "^6.9.4" - babel-plugin-transform-remove-undefined "^0.5.0" - babel-plugin-transform-simplify-comparison-operators "^6.9.4" - babel-plugin-transform-undefined-to-void "^6.9.4" - lodash.isplainobject "^4.0.6" - babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" @@ -6803,7 +7773,7 @@ bech32@^1.1.2: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.3.tgz#bd47a8986bbb3eec34a56a097a84b8d3e9a2dfcd" integrity sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg== -better-opn@^2.0.0: +better-opn@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/better-opn/-/better-opn-2.1.1.tgz#94a55b4695dc79288f31d7d0e5f658320759f7c6" integrity sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA== @@ -7116,7 +8086,7 @@ boxen@^3.0.0: type-fest "^0.3.0" widest-line "^2.0.0" -boxen@^4.1.0: +boxen@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== @@ -7412,15 +8382,15 @@ browserify@^17.0.0: vm-browserify "^1.0.0" xtend "^4.0.0" -browserslist@4.10.0: - version "4.10.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" - integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== +browserslist@4.14.2: + version "4.14.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz#1b3cec458a1ba87588cc5e9be62f19b6d48813ce" + integrity sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw== dependencies: - caniuse-lite "^1.0.30001035" - electron-to-chromium "^1.3.378" - node-releases "^1.1.52" - pkg-up "^3.1.0" + caniuse-lite "^1.0.30001125" + electron-to-chromium "^1.3.564" + escalade "^3.0.2" + node-releases "^1.1.61" browserslist@^3.1.1, browserslist@^3.2.6: version "3.2.8" @@ -7441,6 +8411,17 @@ browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.14.7: escalade "^3.1.1" node-releases "^1.1.66" +browserslist@^4.16.6, browserslist@^4.17.3: + version "4.17.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.4.tgz#72e2508af2a403aec0a49847ef31bd823c57ead4" + integrity sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ== + dependencies: + caniuse-lite "^1.0.30001265" + electron-to-chromium "^1.3.867" + escalade "^3.1.1" + node-releases "^2.0.0" + picocolors "^1.0.0" + bs58@4.0.1, bs58@^4.0.0, bs58@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" @@ -7787,6 +8768,11 @@ camel-case@^4.1.1: pascal-case "^3.1.1" tslib "^1.10.0" +camelcase-css@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + camelcase-keys@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" @@ -7826,7 +8812,7 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== -caniuse-lite@1.0.30001265, caniuse-lite@^1.0.30000810, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001097, caniuse-lite@^1.0.30001157: +caniuse-lite@1.0.30001265, caniuse-lite@^1.0.30000810, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001097, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001157, caniuse-lite@^1.0.30001265: version "1.0.30001265" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz#0613c9e6c922e422792e6fcefdf9a3afeee4f8c3" integrity sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw== @@ -7843,10 +8829,10 @@ capture-stack-trace@^1.0.0: resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== -case-sensitive-paths-webpack-plugin@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz#3371ef6365ef9c25fa4b81c16ace0e9c7dc58c3e" - integrity sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g== +case-sensitive-paths-webpack-plugin@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" + integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== caseless@~0.12.0: version "0.12.0" @@ -8008,7 +8994,7 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.1.1" -"chokidar@>=2.0.0 <4.0.0", chokidar@^3.3.0, chokidar@^3.4.1: +"chokidar@>=2.0.0 <4.0.0", chokidar@^3.4.1: version "3.5.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== @@ -8023,7 +9009,7 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.3.1" -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.0: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.0, chokidar@^3.4.2: version "3.5.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== @@ -8212,13 +9198,6 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - cli-table3@0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.0.tgz#b7b1bc65ca8e7b5cef9124e13dc2b21e2ce4faee" @@ -8353,7 +9332,7 @@ cloneable-readable@^1.0.0: process-nextick-args "^1.0.6" through2 "^2.0.1" -clsx@^1.0.4: +clsx@^1.0.4, clsx@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== @@ -8513,12 +9492,7 @@ commander@^4.1.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -commander@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - -commander@^6.1.0: +commander@^6.1.0, commander@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== @@ -8565,10 +9539,30 @@ compose-function@3.0.3: dependencies: arity-n "^1.0.4" -compute-scroll-into-view@^1.0.14: - version "1.0.16" - resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.16.tgz#5b7bf4f7127ea2c19b750353d7ce6776a90ee088" - integrity sha512-a85LHKY81oQnikatZYA90pufpZ6sQx++BoCxOEMsjpZx+ZnaKGQnCyCehTRr/1p9GBIAHTjcU9k71kSYWloLiQ== +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +compute-scroll-into-view@^1.0.17: + version "1.0.17" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab" + integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg== concat-map@0.0.1: version "0.0.1" @@ -8788,6 +9782,13 @@ copy-to-clipboard@^3.0.8: dependencies: toggle-selection "^1.0.3" +copy-to-clipboard@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" + integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== + dependencies: + toggle-selection "^1.0.6" + copy-webpack-plugin@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.0.3.tgz#2b3d2bfc6861b96432a65f0149720adbd902040b" @@ -8805,6 +9806,14 @@ copy-webpack-plugin@^6.0.3: serialize-javascript "^4.0.0" webpack-sources "^1.4.3" +core-js-compat@^3.16.0, core-js-compat@^3.16.2, core-js-compat@^3.8.1: + version "3.18.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.18.3.tgz#e0e7e87abc55efb547e7fa19169e45fa9df27a67" + integrity sha512-4zP6/y0a2RTHN5bRGT7PTq9lVt3WzvffTNjqnTKsXhkAYNDTkdCLOIfAdOLcQ/7TDdyRj3c+NeHe1NmF1eDScw== + dependencies: + browserslist "^4.17.3" + semver "7.0.0" + core-js-compat@^3.7.0: version "3.8.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.0.tgz#3248c6826f4006793bd637db608bca6e4cd688b1" @@ -8818,12 +9827,17 @@ core-js-pure@^3.0.0, core-js-pure@^3.0.1: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== +core-js-pure@^3.8.2: + version "3.18.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.18.3.tgz#7eed77dcce1445ab68fd68715856633e2fb3b90c" + integrity sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw== + core-js@^2.4.0, core-js@^2.5.0: version "2.6.11" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== -core-js@^3.0.1, core-js@^3.0.4, core-js@^3.6.5: +core-js@^3.0.4, core-js@^3.6.5: version "3.8.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.3.tgz#c21906e1f14f3689f93abcc6e26883550dd92dd0" integrity sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q== @@ -8846,16 +9860,6 @@ cors@^2.8.1: object-assign "^4" vary "^1" -cosmiconfig@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" - integrity sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ== - dependencies: - is-directory "^0.3.1" - js-yaml "^3.9.0" - parse-json "^4.0.0" - require-from-string "^2.0.1" - cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" @@ -8985,10 +9989,10 @@ cross-fetch@^3.0.6: dependencies: node-fetch "2.6.1" -cross-spawn@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" - integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== +cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -9014,15 +10018,6 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - crypt@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" @@ -9072,7 +10067,7 @@ css-loader@^2.1.1: postcss-value-parser "^3.3.0" schema-utils "^1.0.0" -css-loader@^3.5.3: +css-loader@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== @@ -9728,6 +10723,13 @@ destroy@^1.0.4, destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +detab@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" + integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== + dependencies: + repeat-string "^1.5.4" + detect-browser@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97" @@ -9955,14 +10957,6 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -dir-glob@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== - dependencies: - arrify "^1.0.1" - path-type "^3.0.0" - dir-glob@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" @@ -10076,7 +11070,7 @@ dom-converter@^0.2: dependencies: utila "~0.4" -dom-helpers@^3.2.0, dom-helpers@^3.4.0: +dom-helpers@^3.2.0: version "3.4.0" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== @@ -10176,10 +11170,10 @@ dotenv-expand@^5.1.0: resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== -dotenv-webpack@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-1.7.0.tgz#4384d8c57ee6f405c296278c14a9f9167856d3a1" - integrity sha512-wwNtOBW/6gLQSkb8p43y0Wts970A3xtNiG/mpwj9MLUhtPCQG6i+/DSXXoNN7fbPCU/vQ7JjwGmgOeGZSSZnsw== +dotenv-webpack@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-1.8.0.tgz#7ca79cef2497dd4079d43e81e0796bc9d0f68a5e" + integrity sha512-o8pq6NLBehtrqA8Jv8jFQNtG9nhRtVqmoD4yWbgUyoU3+9WBlPe+c2EAiaJok9RB28QvrWvdWLZGeTT5aATDMg== dependencies: dotenv-defaults "^1.0.2" @@ -10193,15 +11187,16 @@ dotenv@^8.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== -downshift@^6.0.6: - version "6.0.6" - resolved "https://registry.yarnpkg.com/downshift/-/downshift-6.0.6.tgz#82aee8e2e260d7ad99df8a0969bd002dd523abe8" - integrity sha512-tmLab3cXCn6PtZYl9V8r/nB2m+7/nCNrwo0B3kTHo/2lRBHr+1en1VNOQt2wIt0ajanAnxquZ00WPCyxe6cNFQ== +downshift@^6.0.15: + version "6.1.7" + resolved "https://registry.yarnpkg.com/downshift/-/downshift-6.1.7.tgz#fdb4c4e4f1d11587985cd76e21e8b4b3fa72e44c" + integrity sha512-cVprZg/9Lvj/uhYRxELzlu1aezRcgPWBjTvspiGTVEU64gF5pRdSRKFVLcxqsZC637cLAGMbL40JavEfWnqgNg== dependencies: - "@babel/runtime" "^7.11.2" - compute-scroll-into-view "^1.0.14" + "@babel/runtime" "^7.14.8" + compute-scroll-into-view "^1.0.17" prop-types "^15.7.2" - react-is "^16.13.1" + react-is "^17.0.2" + tslib "^2.3.0" drbg.js@^1.0.1: version "1.0.1" @@ -10278,18 +11273,23 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^3.0.2, ejs@^3.1.2: +ejs@^3.0.2: version "3.1.5" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.5.tgz#aed723844dc20acb4b170cd9ab1017e476a0d93b" integrity sha512-dldq3ZfFtgVTJMLjOe+/3sROTzALlL9E34V4/sDtUd/KlBSS0s6U1/+WPE1B4sj9CXHJpL1M6rhNJnc9Wbal9w== dependencies: jake "^10.6.1" -electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.591: +electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.591: version "1.3.610" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.610.tgz#1254eb394acd220a836ea1f203f8cded4e487052" integrity sha512-eFDC+yVQpEhtlapk4CYDPfV9ajF9cEof5TBcO49L1ETO+aYogrKWDmYpZyxBScMNe8Bo/gJamH4amQ4yyvXg4g== +electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.867: + version "1.3.871" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.871.tgz#6e87365fd72037a6c898fb46050ad4be3ac9ef62" + integrity sha512-qcLvDUPf8DSIMWarHT2ptgcqrYg62n3vPA7vhrOF24d8UNzbUBaHu2CySiENR3nEDzYgaN60071t0F6KLYMQ7Q== + electron@^11.1.0: version "11.4.12" resolved "https://registry.yarnpkg.com/electron/-/electron-11.4.12.tgz#3315ce63a37cea5033125f7abcfdcc2f76864a57" @@ -10299,10 +11299,10 @@ electron@^11.1.0: "@types/node" "^12.0.12" extract-zip "^1.0.3" -element-resize-detector@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.1.tgz#b0305194447a4863155e58f13323a0aef30851d1" - integrity sha512-BdFsPepnQr9fznNPF9nF4vQ457U/ZJXQDSNF1zBe7yaga8v9AdZf3/NElYxFdUh7SitSGt040QygiTo6dtatIw== +element-resize-detector@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.3.tgz#5078d9b99398fe4c589f8c8df94ff99e5d413ff3" + integrity sha512-+dhNzUgLpq9ol5tyhoG7YLoXL3ssjfFW+0gpszXPwRU6NjGr1fVHMEAF8fVzIiRJq57Nre0RFeIjJwI8Nh2NmQ== dependencies: batch-processor "1.0.0" @@ -10344,7 +11344,7 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -emotion-theming@^10.0.19, emotion-theming@^10.0.27: +emotion-theming@^10.0.27: version "10.0.27" resolved "https://registry.yarnpkg.com/emotion-theming/-/emotion-theming-10.0.27.tgz#1887baaec15199862c89b1b984b79806f2b9ab10" integrity sha512-MlF1yu/gYh8u+sLUqA0YuA9JX0P4Hb69WlKc/9OLo+WCXuX6sy/KoIa+qJimgmr2dWqnypYKYPX37esjDBbhdw== @@ -10451,6 +11451,15 @@ enhanced-resolve@^4.3.0: memory-fs "^0.5.0" tapable "^1.0.0" +enhanced-resolve@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + enhanced-resolve@^5.3.2: version "5.8.2" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz#15ddc779345cbb73e97c611cd00c01c1e7bf4d8b" @@ -10734,7 +11743,7 @@ es6-weak-map@^2.0.1, es6-weak-map@^2.0.2: es6-iterator "^2.0.1" es6-symbol "^3.1.1" -escalade@^3.1.1: +escalade@^3.0.2, escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== @@ -12179,7 +13188,7 @@ explain-error@^1.0.4: resolved "https://registry.yarnpkg.com/explain-error/-/explain-error-1.0.4.tgz#a793d3ac0cad4c6ab571e9968fbbab6cb2532929" integrity sha1-p5PTrAytTGq1cemWj7urbLJTKSk= -express@^4.14.0, express@^4.17.0: +express@^4.14.0, express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== @@ -12366,7 +13375,7 @@ fast-future@~1.0.2: resolved "https://registry.yarnpkg.com/fast-future/-/fast-future-1.0.2.tgz#8435a9aaa02d79248d17d704e76259301d99280a" integrity sha1-hDWpqqAteSSNF9cE52JZMB2ZKAo= -fast-glob@^2.0.2, fast-glob@^2.2.6: +fast-glob@^2.2.6: version "2.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== @@ -12503,13 +13512,6 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -figures@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" - integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== - dependencies: - escape-string-regexp "^1.0.5" - file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" @@ -12532,7 +13534,7 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-loader@^6.0.0: +file-loader@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== @@ -12595,10 +13597,10 @@ filenamify@^4.1.0: strip-outer "^1.0.1" trim-repeated "^1.0.0" -filesize@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f" - integrity sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg== +filesize@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" + integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== filesize@^3.6.1: version "3.6.1" @@ -12726,6 +13728,14 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + find-yarn-workspace-root@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" @@ -12925,21 +13935,7 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -fork-ts-checker-webpack-plugin@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" - integrity sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ== - dependencies: - babel-code-frame "^6.22.0" - chalk "^2.4.1" - chokidar "^3.3.0" - micromatch "^3.1.10" - minimatch "^3.0.4" - semver "^5.6.0" - tapable "^1.0.0" - worker-rpc "^0.1.0" - -fork-ts-checker-webpack-plugin@^4.1.4: +fork-ts-checker-webpack-plugin@4.1.6, fork-ts-checker-webpack-plugin@^4.1.6: version "4.1.6" resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw== @@ -12952,6 +13948,25 @@ fork-ts-checker-webpack-plugin@^4.1.4: tapable "^1.0.0" worker-rpc "^0.1.0" +fork-ts-checker-webpack-plugin@^6.0.4: + version "6.3.4" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.3.4.tgz#9af17de0a36caf6f1b4e1d2d081cf586f0a12b14" + integrity sha512-z0dns2NXH9NHH0wpW6iuUmyXYRN9BI2Lqnv+RCdL+9GXSW6tKUqYnwf+h3ZaucJsbsrdobdxuOELGgm1xVZITA== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + form-data@^2.3.1, form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -13068,6 +14083,16 @@ fs-extra@^9.0.0: jsonfile "^6.0.1" universalify "^1.0.0" +fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-minipass@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" @@ -13090,6 +14115,11 @@ fs-mkdirp-stream@^1.0.0: graceful-fs "^4.1.11" through2 "^2.0.3" +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" @@ -13435,6 +14465,11 @@ git-url-parse@^11.1.2: dependencies: git-up "^4.0.0" +github-slugger@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e" + integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== + gl-mat4@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/gl-mat4/-/gl-mat4-1.1.4.tgz#1e895b55892e56a896867abd837d38f37a178086" @@ -13624,7 +14659,7 @@ global-tunnel-ng@^2.7.1: npm-conf "^1.1.3" tunnel "^0.0.6" -global@^4.3.2, global@^4.4.0: +global@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== @@ -13671,20 +14706,7 @@ globalthis@^1.0.0, globalthis@^1.0.1: dependencies: define-properties "^1.1.3" -globby@8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" - integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== - dependencies: - array-union "^1.0.1" - dir-glob "2.0.0" - fast-glob "^2.0.2" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - -globby@^11.0.1: +globby@11.0.1, globby@^11.0.1: version "11.0.1" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== @@ -13696,7 +14718,7 @@ globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" -globby@^11.0.3: +globby@^11.0.2, globby@^11.0.3: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== @@ -14238,11 +15260,63 @@ hashlru@^2.3.0: resolved "https://registry.yarnpkg.com/hashlru/-/hashlru-2.3.0.tgz#5dc15928b3f6961a2056416bb3a4910216fdfb51" integrity sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A== +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + hast-util-parse-selector@^2.0.0: version "2.2.5" resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== +hast-util-raw@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" + integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" + html-void-elements "^1.0.0" + parse5 "^6.0.0" + unist-util-position "^3.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== + dependencies: + hast-to-hyperscript "^9.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + hastscript@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" @@ -14408,17 +15482,22 @@ html-tags@^3.1.0: resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== -html-webpack-plugin@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c" - integrity sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw== +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + +html-webpack-plugin@^4.0.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz#76fc83fa1a0f12dd5f7da0404a54e2699666bc12" + integrity sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A== dependencies: "@types/html-minifier-terser" "^5.0.0" "@types/tapable" "^1.0.5" "@types/webpack" "^4.41.8" html-minifier-terser "^5.0.1" loader-utils "^1.2.3" - lodash "^4.17.15" + lodash "^4.17.20" pretty-error "^2.1.1" tapable "^1.1.3" util.promisify "1.0.0" @@ -14643,7 +15722,7 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.2.0, ignore@^3.3.5: +ignore@^3.2.0: version "3.3.7" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" integrity sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA== @@ -14668,23 +15747,16 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= -immer@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" - integrity sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg== +immer@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" + integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== immer@^9.0.6: version "9.0.6" resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.6.tgz#7a96bf2674d06c8143e327cbf73539388ddf1a73" integrity sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ== -import-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" - integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= - dependencies: - import-from "^2.1.0" - import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" @@ -14693,13 +15765,6 @@ import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -import-from@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" - integrity sha1-M1238qev/VOqpHHUuAId7ja387E= - dependencies: - resolve-from "^3.0.0" - import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" @@ -14783,24 +15848,10 @@ inline-source-map@~0.6.0: dependencies: source-map "~0.5.3" -inquirer@7.0.4, inquirer@^7.0.0: - version "7.0.4" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" - integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^2.4.2" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.2.0" - rxjs "^6.5.3" - string-width "^4.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== inquirer@^0.12.0: version "0.12.0" @@ -14919,10 +15970,10 @@ interpret@^1.0.0, interpret@^1.4.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -interpret@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.0.0.tgz#b783ffac0b8371503e9ab39561df223286aa5433" - integrity sha512-e0/LknJ8wpMMhTiWcjivB+ESwIuvHnBSlBbmP/pSb8CQJldoj1p2qv7xGZ/+BtbTziYRFSz8OsvdbiX45LtYQA== +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== invariant@2.2.4, invariant@^2.0.0, invariant@^2.1.0, invariant@^2.2.2, invariant@^2.2.3, invariant@^2.2.4: version "2.2.4" @@ -15502,6 +16553,11 @@ ipns@~0.5.2: protons "^1.0.1" timestamp-nano "^1.0.0" +is-absolute-url@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + is-absolute@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" @@ -15524,6 +16580,11 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-alphabetical@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + is-alphabetical@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.1.tgz#c77079cc91d4efac775be1034bf2d243f95e6f08" @@ -15692,11 +16753,6 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - is-docker@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" @@ -16007,6 +17063,11 @@ is-plain-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== +is-plain-object@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b" + integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g== + is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -16758,7 +17819,7 @@ jest-watcher@^26.6.2: jest-util "^26.6.2" string-length "^4.0.1" -jest-worker@^26.2.1, jest-worker@^26.6.2: +jest-worker@^26.5.0, jest-worker@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== @@ -16826,6 +17887,11 @@ js-sha3@^0.8.0, js-sha3@~0.8.0: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== +js-string-escape@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" + integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -16836,7 +17902,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@3.13.1, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.5.1, js-yaml@^3.9.0: +js-yaml@3.13.1, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.5.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -17086,7 +18152,7 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.1, json5@^2.1.2: +json5@^2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== @@ -18359,7 +19425,7 @@ loader-runner@^2.4.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@1.2.3, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: +loader-utils@1.2.3, loader-utils@^1.1.0, loader-utils@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== @@ -18368,7 +19434,7 @@ loader-utils@1.2.3, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2. emojis-list "^2.0.0" json5 "^1.0.1" -loader-utils@^2.0.0: +loader-utils@2.0.0, loader-utils@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== @@ -18377,6 +19443,15 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" +loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + locale-currency@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/locale-currency/-/locale-currency-0.0.1.tgz#c9e15a22ff575b4b4bb947a4bf92ac236bd1fe9b" @@ -18437,6 +19512,13 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lockfile-lint-api@^5.0.12: version "5.0.12" resolved "https://registry.yarnpkg.com/lockfile-lint-api/-/lockfile-lint-api-5.0.12.tgz#6ad928126dc2f87762bb520695f58c73a501b7fd" @@ -18470,6 +19552,11 @@ lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + lodash.escape@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" @@ -18540,11 +19627,6 @@ lodash.memoize@~3.0.3: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= -lodash.some@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" - integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -18560,12 +19642,17 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= +lodash.uniq@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + lodash.uniqby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= -lodash@4.17.20, lodash@=3.10.1, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.7.0, lodash@~4.17.2: +lodash@4.17.20, lodash@=3.10.1, lodash@^4.0.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.7.0, lodash@~4.17.2: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -18577,7 +19664,7 @@ log-symbols@3.0.0: dependencies: chalk "^2.4.2" -log-symbols@^2.1.0, log-symbols@^2.2.0: +log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== @@ -18596,14 +19683,6 @@ loglevel@^1.4.1, loglevel@^1.5.0: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.0.tgz#ae0caa561111498c5ba13723d6fb631d24003934" integrity sha1-rgyqVhERSYxboTcj1vtjHSQAOTQ= -loglevelnext@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2" - integrity sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A== - dependencies: - es6-symbol "^3.1.1" - object.assign "^4.1.0" - logplease@^1.2.14, logplease@~1.2.14, logplease@~1.2.15: version "1.2.15" resolved "https://registry.yarnpkg.com/logplease/-/logplease-1.2.15.tgz#3da442e93751a5992cc19010a826b08d0293c48a" @@ -18765,7 +19844,7 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2: +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -18867,11 +19946,6 @@ matcher@^3.0.0: dependencies: escape-string-regexp "^4.0.0" -material-colors@^1.2.1: - version "1.2.5" - resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.5.tgz#5292593e6754cb1bcc2b98030e4e0d6a3afc9ea1" - integrity sha1-UpJZPmdUyxvMK5gDDk4Najr8nqE= - math-random@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" @@ -18900,6 +19974,13 @@ md5@^2.2.1: crypt "0.0.2" is-buffer "~1.1.6" +mdast-squeeze-paragraphs@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" + integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== + dependencies: + unist-util-remove "^2.0.0" + mdast-util-compact@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz#cabc69a2f43103628326f35b1acf735d55c99490" @@ -18907,6 +19988,32 @@ mdast-util-compact@^2.0.0: dependencies: unist-util-visit "^2.0.0" +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-to-hast@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" + integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdast-util-to-string@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz#27055500103f51637bd07d01da01eb1967a43527" + integrity sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A== + mdn-browser-compat-data@0.0.94: version "0.0.94" resolved "https://registry.yarnpkg.com/mdn-browser-compat-data/-/mdn-browser-compat-data-0.0.94.tgz#eaa1653761ce95881ea1858a8c0ce6066d85f94b" @@ -18914,6 +20021,11 @@ mdn-browser-compat-data@0.0.94: dependencies: extend "3.0.2" +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -18961,6 +20073,13 @@ memdown@~3.0.0: ltgt "~2.2.0" safe-buffer "~5.1.1" +memfs@^3.1.2: + version "3.3.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.3.0.tgz#4da2d1fc40a04b170a56622c7164c6be2c4cbef2" + integrity sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg== + dependencies: + fs-monkey "1.0.3" + memoize-one@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0" @@ -19173,6 +20292,11 @@ mime-db@1.45.0, mime-db@1.x.x: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== +"mime-db@>= 1.43.0 < 2": + version "1.50.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" + integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== + mime-db@~1.33.0: version "1.33.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" @@ -19197,10 +20321,10 @@ mime@1.6.0, mime@^1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.2: - version "2.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== +mime@^2.4.4: + version "2.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== mimic-fn@^1.0.0: version "1.1.0" @@ -19781,11 +20905,6 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - nan@2.13.2: version "2.13.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" @@ -20124,11 +21243,21 @@ node-preload@^0.2.0: dependencies: process-on-spawn "^1.0.0" -node-releases@^1.1.52, node-releases@^1.1.66: +node-releases@^1.1.61: + version "1.1.77" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" + integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== + +node-releases@^1.1.66: version "1.1.67" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12" integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg== +node-releases@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.0.tgz#67dc74903100a7deb044037b8a2e5f453bb05400" + integrity sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA== + node-source-walk@^4.0.0, node-source-walk@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-4.2.0.tgz#c2efe731ea8ba9c03c562aa0a9d984e54f27bc2c" @@ -20616,6 +21745,11 @@ on-finished@^2.3.0, on-finished@~2.3.0: dependencies: ee-first "1.1.1" +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.3.3, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -20915,11 +22049,6 @@ outpipe@^1.1.0: dependencies: shell-quote "^1.4.2" -overlayscrollbars@^1.10.2: - version "1.13.0" - resolved "https://registry.yarnpkg.com/overlayscrollbars/-/overlayscrollbars-1.13.0.tgz#1edb436328133b94877b558f77966d5497ca36a7" - integrity sha512-p8oHrMeRAKxXDMPI/EBNITj/zTVHKNnAnM59Im+xnoZUlV07FyTg46wom2286jJlXGGfcPFG/ba5NUiCwWNd4w== - overlayscrollbars@^1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/overlayscrollbars/-/overlayscrollbars-1.13.1.tgz#0b840a88737f43a946b9d87875a2f9e421d0338a" @@ -21002,7 +22131,7 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.1, p-limit@^3.0.2: +p-limit@^3.0.1, p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -21030,6 +22159,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map-series@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca" @@ -21325,7 +22461,7 @@ parse-url@^5.0.0: parse-path "^4.0.0" protocols "^1.4.0" -parse5@6.0.1: +parse5@6.0.1, parse5@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== @@ -21627,6 +22763,16 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" @@ -21724,7 +22870,14 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pkg-up@3.1.0, pkg-up@^3.1.0: +pkg-dir@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" + integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== + dependencies: + find-up "^5.0.0" + +pkg-up@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== @@ -21784,13 +22937,6 @@ po2json@0.4.5: gettext-parser "1.1.0" nomnom "1.8.1" -polished@^3.4.4: - version "3.6.7" - resolved "https://registry.yarnpkg.com/polished/-/polished-3.6.7.tgz#44cbd0047f3187d83db0c479ef0c7d5583af5fb6" - integrity sha512-b4OViUOihwV0icb9PHmWbR+vPqaSzSAEbgLskvb7ANPATVXGiYv/TQFHQo65S53WU9i5EQ1I03YDOJW7K0bmYg== - dependencies: - "@babel/runtime" "^7.9.2" - polished@^4.0.5: version "4.1.3" resolved "https://registry.yarnpkg.com/polished/-/polished-4.1.3.tgz#7a3abf2972364e7d97770b827eec9a9e64002cfc" @@ -21820,12 +22966,12 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postcss-flexbugs-fixes@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz#e094a9df1783e2200b7b19f875dcad3b3aff8b20" - integrity sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA== +postcss-flexbugs-fixes@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" + integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== dependencies: - postcss "^7.0.0" + postcss "^7.0.26" postcss-html@^0.36.0: version "0.36.0" @@ -21841,23 +22987,16 @@ postcss-less@^3.1.4: dependencies: postcss "^7.0.14" -postcss-load-config@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484" - integrity sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ== - dependencies: - cosmiconfig "^4.0.0" - import-cwd "^2.0.0" - -postcss-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" - integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== +postcss-loader@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.3.0.tgz#2c4de9657cd4f07af5ab42bd60a673004da1b8cc" + integrity sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q== dependencies: - loader-utils "^1.1.0" - postcss "^7.0.0" - postcss-load-config "^2.0.0" - schema-utils "^1.0.0" + cosmiconfig "^7.0.0" + klona "^2.0.4" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + semver "^7.3.4" postcss-media-query-parser@^0.2.3: version "0.2.3" @@ -22061,7 +23200,7 @@ postcss@^6.0.1, postcss@^6.0.19, postcss@^6.0.23: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: +postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: version "7.0.32" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== @@ -22070,6 +23209,14 @@ postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.2, postcss@^7.0.2 source-map "^0.6.1" supports-color "^6.1.0" +postcss@^7.0.36: + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + postcss@^8.1.10: version "8.3.5" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.5.tgz#982216b113412bc20a86289e91eb994952a5b709" @@ -22170,7 +23317,7 @@ prettier@^2.1.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.1.tgz#d9485dd5e499daa6cb547023b87a6cf51bee37d6" integrity sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw== -prettier@^2.2.1: +prettier@^2.2.1, prettier@~2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== @@ -22349,6 +23496,14 @@ promisify-es6@^1.0.3: resolved "https://registry.yarnpkg.com/promisify-es6/-/promisify-es6-1.0.3.tgz#b012668c4df3c965ce13daac2b3a4d1726a96346" integrity sha512-N9iVG+CGJsI4b4ZGazjwLnxErD2d9Pe4DPvvXSxYA9tFNu8ymXME4Qs5HIQ0LMJpNM7zj+m0NlNnNeqFpKzqnA== +prompts@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" + integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + prompts@^2.0.1: version "2.4.1" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" @@ -22357,6 +23512,14 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" +prompts@^2.4.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + prop-types-exact@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869" @@ -22366,7 +23529,7 @@ prop-types-exact@^1.2.0: object.assign "^4.1.0" reflect.ownkeys "^0.2.0" -prop-types@15.7.2, prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -22396,6 +23559,13 @@ property-information@^5.0.0: dependencies: xtend "^4.0.1" +property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" @@ -22777,7 +23947,7 @@ qrcode-generator@1.4.1: resolved "https://registry.yarnpkg.com/qrcode-generator/-/qrcode-generator-1.4.1.tgz#bfb6760e05d12c39df8acd60a0d459bdb2fa0756" integrity sha512-KOdSAyFBPf0/5Z3mra4JfSbjrDlUn2J3YH8Rm33tRGbptxP4vhogLWysvkQp8mp5ix9u80Wfr4vxHXTeR9o0Ug== -qs@6.7.0, qs@^6.4.0, qs@^6.5.1, qs@^6.5.2, qs@^6.6.0: +qs@6.7.0, qs@^6.4.0, qs@^6.5.1, qs@^6.5.2: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== @@ -22945,7 +24115,7 @@ raw-body@~1.1.0: bytes "1" string_decoder "0.10" -raw-loader@^4.0.1: +raw-loader@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== @@ -22963,48 +24133,36 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-color@^2.17.0: - version "2.17.3" - resolved "https://registry.yarnpkg.com/react-color/-/react-color-2.17.3.tgz#b8556d744f95193468c7061d2aa19180118d4a48" - integrity sha512-1dtO8LqAVotPIChlmo6kLtFS1FP89ll8/OiA8EcFRDR+ntcK+0ukJgByuIQHRtzvigf26dV5HklnxDIvhON9VQ== - dependencies: - "@icons/material" "^0.2.4" - lodash "^4.17.11" - material-colors "^1.2.1" - prop-types "^15.5.10" - reactcss "^1.2.0" - tinycolor2 "^1.4.1" - react-colorful@^5.1.2: version "5.3.0" resolved "https://registry.yarnpkg.com/react-colorful/-/react-colorful-5.3.0.tgz#bcbae49c1affa9ab9a3c8063398c5948419296bd" integrity sha512-zWE5E88zmjPXFhv6mGnRZqKin9s5vip1O3IIGynY9EhZxN8MATUxZkT3e/9OwTEm4DjQBXc6PFWP6AetY+Px+A== -react-dev-utils@^10.0.0: - version "10.2.1" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" - integrity sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ== +react-dev-utils@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" + integrity sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A== dependencies: - "@babel/code-frame" "7.8.3" + "@babel/code-frame" "7.10.4" address "1.1.2" - browserslist "4.10.0" + browserslist "4.14.2" chalk "2.4.2" - cross-spawn "7.0.1" + cross-spawn "7.0.3" detect-port-alt "1.1.6" escape-string-regexp "2.0.0" - filesize "6.0.1" + filesize "6.1.0" find-up "4.1.0" - fork-ts-checker-webpack-plugin "3.1.1" + fork-ts-checker-webpack-plugin "4.1.6" global-modules "2.0.0" - globby "8.0.2" + globby "11.0.1" gzip-size "5.1.1" - immer "1.10.0" - inquirer "7.0.4" + immer "8.0.1" is-root "2.1.0" - loader-utils "1.2.3" + loader-utils "2.0.0" open "^7.0.2" pkg-up "3.1.0" - react-error-overlay "^6.0.7" + prompts "2.4.0" + react-error-overlay "^6.0.9" recursive-readdir "2.2.2" shell-quote "1.7.2" strip-ansi "6.0.0" @@ -23050,31 +24208,10 @@ react-dnd@^3.0.2: prop-types "^15.5.10" shallowequal "^1.0.2" -react-docgen-typescript-loader@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/react-docgen-typescript-loader/-/react-docgen-typescript-loader-3.7.2.tgz#45cb2305652c0602767242a8700ad1ebd66bbbbd" - integrity sha512-fNzUayyUGzSyoOl7E89VaPKJk9dpvdSgyXg81cUkwy0u+NBvkzQG3FC5WBIlXda0k/iaxS+PWi+OC+tUiGxzPA== - dependencies: - "@webpack-contrib/schema-utils" "^1.0.0-beta.0" - loader-utils "^1.2.3" - react-docgen-typescript "^1.15.0" - -react-docgen-typescript-plugin@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-0.6.2.tgz#c83305206c61d5c7e004eaf2dc4661367ddc105d" - integrity sha512-Orw0WKdJGAg5eMZGbEMw/rKonoxbi8epU6RJWTW3ukWuTarxckFXTltGvm8XADAWlBHak30KD71XThtJruxfTg== - dependencies: - debug "^4.1.1" - endent "^2.0.1" - micromatch "^4.0.2" - react-docgen-typescript "^1.20.1" - react-docgen-typescript-loader "^3.7.2" - tslib "^2.0.0" - -react-docgen-typescript@^1.15.0, react-docgen-typescript@^1.20.1: - version "1.20.5" - resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-1.20.5.tgz#fb8d78a707243498436c2952bd3f6f488a68d4f3" - integrity sha512-AbLGMtn76bn7SYBJSSaKJrZ0lgNRRR3qL60PucM5M4v/AXyC8221cKBXW5Pyt9TfDRfe+LDnPNlg7TibxX0ovA== +react-docgen-typescript@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-2.1.1.tgz#c9f9ccb1fa67e0f4caf3b12f2a07512a201c2dcf" + integrity sha512-XWe8bsYqVjxciKdpNoufaHiB7FgUHIOnVQgxUolRL3Zlof2zkdTzuQH6SU2n3Ek9kfy3O1c63ojMtNfpiuNeZQ== react-docgen@^5.0.0: version "5.1.0" @@ -23100,12 +24237,12 @@ react-dom@^16.12.0: prop-types "^15.6.2" scheduler "^0.18.0" -react-draggable@^4.0.3: - version "4.2.0" - resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.2.0.tgz#40cc5209082ca7d613104bf6daf31372cc0e1114" - integrity sha512-5wFq//gEoeTYprnd4ze8GrFc+Rbnx+9RkOMR3vk4EbWxj02U6L6T3yrlKeiw4X5CtjD2ma2+b3WujghcXNRzkw== +react-draggable@^4.4.3: + version "4.4.4" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.4.tgz#5b26d9996be63d32d285a426f41055de87e59b2f" + integrity sha512-6e0WdcNLwpBx/YIDpoyd2Xb04PB0elrDrulKUgdrIlwuYvxh5Ok9M+F8cljm8kPXXs43PmMzek9RrB1b7mLMqA== dependencies: - classnames "^2.2.5" + clsx "^1.1.1" prop-types "^15.6.0" react-easy-swipe@^0.0.21: @@ -23115,48 +24252,49 @@ react-easy-swipe@^0.0.21: dependencies: prop-types "^15.5.8" -react-error-overlay@^6.0.7: - version "6.0.8" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.8.tgz#474ed11d04fc6bda3af643447d85e9127ed6b5de" - integrity sha512-HvPuUQnLp5H7TouGq3kzBeioJmXms1wHy9EGjz2OURWBp4qZO6AfGEcnxts1D/CbwPLRAgTMPCEgYhA3sEM4vw== +react-element-to-jsx-string@^14.3.2: + version "14.3.2" + resolved "https://registry.yarnpkg.com/react-element-to-jsx-string/-/react-element-to-jsx-string-14.3.2.tgz#c0000ed54d1f8b4371731b669613f2d4e0f63d5c" + integrity sha512-WZbvG72cjLXAxV7VOuSzuHEaI3RHj10DZu8EcKQpkKcAj7+qAkG5XUeSdX5FXrA0vPrlx0QsnAzZEBJwzV0e+w== + dependencies: + "@base2/pretty-print-object" "1.0.0" + is-plain-object "3.0.1" -react-fast-compare@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" - integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== +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== react-fast-compare@^3.0.1: version "3.1.1" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.1.1.tgz#0becf31e3812fa70dc231e259f40d892d4767900" integrity sha512-SCsAORWK59BvauR2L1BTdjQbJcSGJJz03U0awektk2hshLKrITDDFTlgGCqIZpTDlPC/NFlZee6xTMzXPVLiHw== -react-helmet-async@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.0.2.tgz#bb55dd8268f7b15aac69c6b22e2f950abda8cc44" - integrity sha512-qzzchrM/ibHuPS/60ief8jaibPunuRdeta4iBDQV+ri2SFKwOV+X2NlEpvevZOauhmHrH/I6dI4E90EPVfJBBg== - dependencies: - "@babel/runtime" "7.3.4" - invariant "2.2.4" - prop-types "15.7.2" - react-fast-compare "2.0.4" - shallowequal "1.1.0" +react-fast-compare@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== -react-hotkeys@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/react-hotkeys/-/react-hotkeys-2.0.0.tgz#a7719c7340cbba888b0e9184f806a9ec0ac2c53f" - integrity sha512-3n3OU8vLX/pfcJrR3xJ1zlww6KS1kEJt0Whxc4FiGV+MJrQ1mYSYI3qS/11d2MJDFm8IhOXMTFQirfu6AVOF6Q== +react-helmet-async@^1.0.7: + version "1.1.2" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.1.2.tgz#653b7e6bbfdd239c5dcd6b8df2811c7a363b8334" + integrity sha512-LTTzDDkyIleT/JJ6T/uqx7Y8qi1EuPPSiJawQY/nHHz0h7SPDT6HxP1YDDQx/fzcVxCqpWEEMS3QdrSrNkJYhg== dependencies: - prop-types "^15.6.1" + "@babel/runtime" "^7.12.5" + invariant "^2.2.4" + prop-types "^15.7.2" + react-fast-compare "^3.2.0" + shallowequal "^1.1.0" react-idle-timer@^4.2.5: version "4.2.5" resolved "https://registry.yarnpkg.com/react-idle-timer/-/react-idle-timer-4.2.5.tgz#eb7d6e1b318f7755b5e0ee810254a8e95a2271b7" integrity sha512-8B/OwjG8E/DTx1fHYKTpZ4cnCbL9+LOc5I9t8SYe8tbEkP14KChiYg0xPIuyRpO33wUZHcgmQl93CVePaDhmRA== -react-input-autosize@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.2.tgz#fcaa7020568ec206bc04be36f4eb68e647c4d8c2" - integrity sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw== +react-input-autosize@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-3.0.0.tgz#6b5898c790d4478d69420b55441fcc31d5c50a85" + integrity sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg== dependencies: prop-types "^15.5.8" @@ -23168,21 +24306,21 @@ react-inspector@^2.3.0: babel-runtime "^6.26.0" is-dom "^1.0.9" -react-inspector@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-5.1.0.tgz#45a325e15f33e595be5356ca2d3ceffb7d6b8c3a" - integrity sha512-JAwswiengIcxi4X/Ssb8nf6suOuQsyit8Fxo04+iPKTnPNY3XIOuagjMZSzpJDDKkYcc/ARlySOYZZv626WUvA== +react-inspector@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-5.1.1.tgz#58476c78fde05d5055646ed8ec02030af42953c8" + integrity sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg== dependencies: "@babel/runtime" "^7.0.0" is-dom "^1.0.0" prop-types "^15.0.0" -react-is@^16.10.2, react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.6, react-is@^16.9.0: +react-is@^16.10.2, react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.6, react-is@^16.9.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^17.0.1: +react-is@^17.0.1, react-is@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== @@ -23272,10 +24410,10 @@ react-router@5.1.2: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-select@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.0.8.tgz#06ff764e29db843bcec439ef13e196865242e0c1" - integrity sha512-v9LpOhckLlRmXN5A6/mGGEft4FMrfaBFTGAnuPHcUgVId7Je42kTq9y0Z+Ye5z8/j0XDT3zUqza8gaRaI1PZIg== +react-select@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.2.0.tgz#de9284700196f5f9b5277c5d850a9ce85f5c72fe" + integrity sha512-B/q3TnCZXEKItO0fFN/I0tWOX3WJvi/X2wtdffmwSQVRwg5BpValScTO1vdic9AxlUgmeSzib2hAZAwIUQUZGQ== dependencies: "@babel/runtime" "^7.4.4" "@emotion/cache" "^10.0.9" @@ -23283,8 +24421,8 @@ react-select@^3.0.8: "@emotion/css" "^10.0.9" memoize-one "^5.0.0" prop-types "^15.6.0" - react-input-autosize "^2.2.2" - react-transition-group "^2.2.1" + react-input-autosize "^3.0.0" + react-transition-group "^4.3.0" react-simple-file-input@^2.0.0: version "2.0.1" @@ -23293,17 +24431,17 @@ react-simple-file-input@^2.0.0: dependencies: prop-types "^15.5.7" -react-sizeme@^2.6.7: - version "2.6.12" - resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-2.6.12.tgz#ed207be5476f4a85bf364e92042520499455453e" - integrity sha512-tL4sCgfmvapYRZ1FO2VmBmjPVzzqgHA7kI8lSJ6JS6L78jXFNRdOZFpXyK6P1NBZvKPPCZxReNgzZNUajAerZw== +react-sizeme@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-3.0.2.tgz#4a2f167905ba8f8b8d932a9e35164e459f9020e4" + integrity sha512-xOIAOqqSSmKlKFJLO3inBQBdymzDuXx4iuwkNcJmC96jeiOg5ojByvL+g3MW9LPEsojLbC6pf68zOfobK8IPlw== dependencies: - element-resize-detector "^1.2.1" + element-resize-detector "^1.2.2" invariant "^2.2.4" shallowequal "^1.1.0" - throttle-debounce "^2.1.0" + throttle-debounce "^3.0.1" -react-syntax-highlighter@^13.5.0, react-syntax-highlighter@^13.5.3: +react-syntax-highlighter@^13.5.3: version "13.5.3" resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-13.5.3.tgz#9712850f883a3e19eb858cf93fad7bb357eea9c6" integrity sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg== @@ -23324,15 +24462,6 @@ react-test-renderer@^16.0.0-0: react-is "^16.8.6" scheduler "^0.18.0" -react-textarea-autosize@^8.1.1: - version "8.3.0" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.0.tgz#e6e2fd186d9f61bb80ac6e2dcb4c55504f93c2fa" - integrity sha512-3GLWFAan2pbwBeoeNDoqGmSbrShORtgWfaWX0RJDivsUrpShh01saRM5RU/i4Zmf+whpBVEY5cA90Eq8Ub1N3w== - dependencies: - "@babel/runtime" "^7.10.2" - use-composed-ref "^1.0.0" - use-latest "^1.0.0" - react-textarea-autosize@^8.3.0: version "8.3.3" resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz#f70913945369da453fd554c168f6baacd1fa04d8" @@ -23368,15 +24497,15 @@ react-transition-group@^1.2.1: prop-types "^15.5.6" warning "^3.0.0" -react-transition-group@^2.2.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" - integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== +react-transition-group@^4.3.0: + version "4.4.2" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" + integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== dependencies: - dom-helpers "^3.4.0" + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" loose-envify "^1.4.0" prop-types "^15.6.2" - react-lifecycles-compat "^3.0.4" react-transition-group@^4.4.0: version "4.4.1" @@ -23389,21 +24518,14 @@ react-transition-group@^4.4.0: prop-types "^15.6.2" react@^16.12.0: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83" - integrity sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA== + version "16.14.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" + integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" -reactcss@^1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/reactcss/-/reactcss-1.2.3.tgz#c00013875e557b1cf0dfd9a368a1c3dab3b548dd" - integrity sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A== - dependencies: - lodash "^4.0.1" - read-all-stream@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" @@ -23720,7 +24842,7 @@ regenerate@^1.2.1, regenerate@^1.4.0: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== -regenerator-runtime@0.13.3, regenerator-runtime@^0.11.0, regenerator-runtime@^0.12.0, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: +regenerator-runtime@0.13.3, regenerator-runtime@^0.11.0, regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: version "0.13.7" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== @@ -23887,6 +25009,58 @@ release-zalgo@^1.0.0: dependencies: es6-error "^4.0.1" +remark-external-links@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/remark-external-links/-/remark-external-links-8.0.0.tgz#308de69482958b5d1cd3692bc9b725ce0240f345" + integrity sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA== + dependencies: + extend "^3.0.0" + is-absolute-url "^3.0.0" + mdast-util-definitions "^4.0.0" + space-separated-tokens "^1.0.0" + unist-util-visit "^2.0.0" + +remark-footnotes@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" + integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== + +remark-mdx@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" + integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== + dependencies: + "@babel/core" "7.12.9" + "@babel/helper-plugin-utils" "7.10.4" + "@babel/plugin-proposal-object-rest-spread" "7.12.1" + "@babel/plugin-syntax-jsx" "7.12.1" + "@mdx-js/util" "1.6.22" + is-alphabetical "1.0.4" + remark-parse "8.0.3" + unified "9.2.0" + +remark-parse@8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + remark-parse@^8.0.0: version "8.0.2" resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.2.tgz#5999bc0b9c2e3edc038800a64ff103d0890b318b" @@ -23909,6 +25083,22 @@ remark-parse@^8.0.0: vfile-location "^3.0.0" xtend "^4.0.1" +remark-slug@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/remark-slug/-/remark-slug-6.1.0.tgz#0503268d5f0c4ecb1f33315c00465ccdd97923ce" + integrity sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ== + dependencies: + github-slugger "^1.0.0" + mdast-util-to-string "^1.0.0" + unist-util-visit "^2.0.0" + +remark-squeeze-paragraphs@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" + integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== + dependencies: + mdast-squeeze-paragraphs "^4.0.0" + remark-stringify@^8.0.0: version "8.1.0" resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-8.1.0.tgz#1e555f4402e445c364fb23d12fc5f5e0337ec8b7" @@ -24078,7 +25268,7 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-from-string@^2.0.1, require-from-string@^2.0.2: +require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -24154,11 +25344,6 @@ resolve-from@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -24223,6 +25408,14 @@ resolve@^1.1.4, resolve@^1.1.5, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, is-core-module "^2.0.0" path-parse "^1.0.6" +resolve@^1.14.2, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + resolve@^1.15.1: version "1.19.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" @@ -24231,14 +25424,6 @@ resolve@^1.15.1: is-core-module "^2.1.0" path-parse "^1.0.6" -resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - resolve@^2.0.0-next.3: version "2.0.0-next.3" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" @@ -24277,14 +25462,6 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - resumer@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" @@ -24527,7 +25704,7 @@ rx-lite@^3.1.2: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" integrity sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI= -rxjs@^6.4.0, rxjs@^6.5.2, rxjs@^6.5.3: +rxjs@^6.4.0, rxjs@^6.5.2: version "6.5.4" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== @@ -24671,6 +25848,15 @@ scheduler@^0.18.0: loose-envify "^1.1.0" object-assign "^4.1.1" +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + schema-utils@^0.4.5: version "0.4.5" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" @@ -24688,7 +25874,7 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: +schema-utils@^2.6.5, schema-utils@^2.7.0: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== @@ -24814,7 +26000,7 @@ semver-greatest-satisfied-range@^1.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@6.3.0, semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.2.0, semver@^6.3.0: +semver@6.3.0, semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -24869,6 +26055,13 @@ serialize-javascript@^4.0.0: dependencies: randombytes "^2.1.0" +serialize-javascript@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + serve-favicon@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.5.0.tgz#935d240cdfe0f5805307fdfe967d88942a2cbcf0" @@ -25012,7 +26205,7 @@ shallow-copy@~0.0.1: resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= -shallowequal@1.1.0, shallowequal@^1.0.2, shallowequal@^1.1.0: +shallowequal@^1.0.2, shallowequal@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== @@ -25070,7 +26263,7 @@ shelljs@^0.7.5: interpret "^1.0.0" rechoir "^0.6.2" -shelljs@^0.8.1, shelljs@^0.8.4: +shelljs@^0.8.1: version "0.8.4" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== @@ -25443,6 +26636,14 @@ source-map-support@^0.5.11, source-map-support@^0.5.16, source-map-support@^0.5. buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@~0.5.20: + version "0.5.20" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" @@ -25671,16 +26872,22 @@ store2@^2.12.0: resolved "https://registry.yarnpkg.com/store2/-/store2-2.12.0.tgz#e1f1b7e1a59b6083b2596a8d067f6ee88fd4d3cf" integrity sha512-7t+/wpKLanLzSnQPX8WAcuLCCeuSHoWdQuh9SB3xD0kNOM38DNf+0Oa+wmvxmYueRzkmh6IcdKFtvTa+ecgPDw== -store2@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/store2/-/store2-2.7.1.tgz#22070b7dc04748a792fc6912a58ab99d3a21d788" - integrity sha512-zzzP5ZY6QWumnAFV6kBRbS44pUMcpZBNER5DWUe1HETlaKXqLcCQxbNu6IHaKr1pUsjuhUGBdOy8sWKmMkL6pQ== - store@^2.0.12: version "2.0.12" resolved "https://registry.yarnpkg.com/store/-/store-2.0.12.tgz#8c534e2a0b831f72b75fc5f1119857c44ef5d593" integrity sha1-jFNOKguDH3K3X8XxEZhXxE711ZM= +storybook-addon-outline@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/storybook-addon-outline/-/storybook-addon-outline-1.4.1.tgz#0a1b262b9c65df43fc63308a1fdbd4283c3d9458" + integrity sha512-Qvv9X86CoONbi+kYY78zQcTGmCgFaewYnOVR6WL7aOFJoW7TrLiIc/O4hH5X9PsEPZFqjfXEPUPENWVUQim6yw== + dependencies: + "@storybook/addons" "^6.3.0" + "@storybook/api" "^6.3.0" + "@storybook/components" "^6.3.0" + "@storybook/core-events" "^6.3.0" + ts-dedent "^2.1.1" + stream-browserify@^2.0.0, stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" @@ -26115,7 +27322,7 @@ style-loader@^0.21.0: loader-utils "^1.1.0" schema-utils "^0.4.5" -style-loader@^1.2.1: +style-loader@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== @@ -26128,6 +27335,13 @@ style-search@^0.1.0: resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI= +style-to-object@0.3.0, style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + stylelint@^13.6.1: version "13.6.1" resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.6.1.tgz#cc1d76338116d55e8ff2be94c4a4386c1239b878" @@ -26482,20 +27696,6 @@ tdigest@^0.1.1: dependencies: bintrees "1.0.1" -telejson@^5.0.2: - version "5.1.0" - resolved "https://registry.yarnpkg.com/telejson/-/telejson-5.1.0.tgz#cc04e4c2a355f9eb6af557e37acd6449feb1d146" - integrity sha512-Yy0N2OV0mosmr1SCZEm3Ezhu/oi5Dbao5RqauZu4+VI5I/XtVBHXajRk0txuqbFYtKdzzWGDZFGSif9ovVLjEA== - dependencies: - "@types/is-function" "^1.0.0" - global "^4.4.0" - is-function "^1.0.2" - is-regex "^1.1.1" - is-symbol "^1.0.3" - isobject "^4.0.0" - lodash "^4.17.20" - memoizerific "^1.11.3" - telejson@^5.3.2: version "5.3.3" resolved "https://registry.yarnpkg.com/telejson/-/telejson-5.3.3.tgz#fa8ca84543e336576d8734123876a9f02bf41d2e" @@ -26552,22 +27752,22 @@ terser-webpack-plugin@^1.4.3: webpack-sources "^1.4.0" worker-farm "^1.7.0" -terser-webpack-plugin@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-3.1.0.tgz#91e6d39571460ed240c0cf69d295bcf30ebf98cb" - integrity sha512-cjdZte66fYkZ65rQ2oJfrdCAkkhJA7YLYk5eGOcGCSGlq0ieZupRdjedSQXYknMPo2IveQL+tPdrxUkERENCFA== +terser-webpack-plugin@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" + integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== dependencies: cacache "^15.0.5" find-cache-dir "^3.3.1" - jest-worker "^26.2.1" + jest-worker "^26.5.0" p-limit "^3.0.2" - schema-utils "^2.6.6" - serialize-javascript "^4.0.0" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" source-map "^0.6.1" - terser "^4.8.0" + terser "^5.3.4" webpack-sources "^1.4.3" -terser@^4.1.2, terser@^4.6.3, terser@^4.8.0: +terser@^4.1.2, terser@^4.6.3: version "4.8.0" resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== @@ -26576,6 +27776,15 @@ terser@^4.1.2, terser@^4.6.3, terser@^4.8.0: source-map "~0.6.1" source-map-support "~0.5.12" +terser@^5.3.4: + version "5.9.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.9.0.tgz#47d6e629a522963240f2b55fcaa3c99083d2c351" + integrity sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.20" + terser@^5.7.0: version "5.7.0" resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693" @@ -26614,10 +27823,10 @@ throat@^5.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== -throttle-debounce@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.1.0.tgz#257e648f0a56bd9e54fe0f132c4ab8611df4e1d5" - integrity sha512-AOvyNahXQuU7NN+VVvOOX+uW6FPaWdAOdRP5HfwYxAfCzXTFKRMoIMk+n+po318+ktcChx+F1Dd91G3YHeMKyg== +throttle-debounce@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-3.0.1.tgz#32f94d84dfa894f786c9a1f290e7a645b6a19abb" + integrity sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg== through2-filter@^2.0.0: version "2.0.0" @@ -26763,11 +27972,6 @@ tiny-worker@^2.3.0: dependencies: esm "^3.2.25" -tinycolor2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" - integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g= - tmp@0.0.30: version "0.0.30" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" @@ -26871,7 +28075,7 @@ to-through@^2.0.0: dependencies: through2 "^2.0.3" -toggle-selection@^1.0.3: +toggle-selection@^1.0.3, toggle-selection@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= @@ -27006,6 +28210,11 @@ ts-dedent@^2.0.0: resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.0.0.tgz#47c5eb23d9096f3237cc413bc82d387d36dbe690" integrity sha512-DfxKjSFQfw9+uf7N9Cy8Ebx9fv5fquK4hZ6SD3Rzr+1jKP6AVA6H8+B5457ZpUs0JKsGpGqIevbpZ9DMQJDp1A== +ts-dedent@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" + integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== + ts-essentials@^2.0.3: version "2.0.12" resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-2.0.12.tgz#c9303f3d74f75fa7528c3d49b80e089ab09d8745" @@ -27036,6 +28245,11 @@ tslib@^2.0.0, tslib@^2.0.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== +tslib@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + tsscmp@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" @@ -27279,10 +28493,10 @@ undertaker@^1.2.1: object.reduce "^1.0.0" undertaker-registry "^1.0.0" -unfetch@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.1.0.tgz#6ec2dd0de887e58a4dee83a050ded80ffc4137db" - integrity sha512-crP/n3eAPUJxZXM9T80/yv0YhkTEx2K1D3h7D1AJM6fzsWZrxdyRuLN0JH/dkZh1LNH8LxCnBzoPFCPbb2iGpg== +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== unherit@^1.0.4: version "1.1.2" @@ -27320,6 +28534,18 @@ unicode-property-aliases-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== +unified@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + unified@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/unified/-/unified-9.0.0.tgz#12b099f97ee8b36792dbad13d278ee2f696eed1d" @@ -27381,6 +28607,11 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" +unist-builder@2.0.3, unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + unist-util-find-all-after@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz#95cc62f48812d879b4685a0512bf1b838da50e9a" @@ -27388,11 +28619,21 @@ unist-util-find-all-after@^3.0.1: dependencies: unist-util-is "^4.0.0" +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + unist-util-is@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.2.tgz#c7d1341188aa9ce5b3cff538958de9895f14a5de" integrity sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ== +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + unist-util-remove-position@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" @@ -27400,6 +28641,13 @@ unist-util-remove-position@^2.0.0: dependencies: unist-util-visit "^2.0.0" +unist-util-remove@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" + integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== + dependencies: + unist-util-is "^4.0.0" + unist-util-stringify-position@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.1.tgz#de2a2bc8d3febfa606652673a91455b6a36fb9f3" @@ -27415,7 +28663,7 @@ unist-util-visit-parents@^3.0.0: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" -unist-util-visit@^2.0.0: +unist-util-visit@2.0.3, unist-util-visit@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== @@ -27538,7 +28786,7 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-loader@^4.0.0: +url-loader@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== @@ -27706,6 +28954,11 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= +uuid-browser@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid-browser/-/uuid-browser-3.1.0.tgz#0f05a40aef74f9e5951e20efbf44b11871e56410" + integrity sha1-DwWkCu90+eWVHiDvv0SxGHHlZBA= + uuid@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" @@ -27721,12 +28974,12 @@ uuid@3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== -uuid@^3.1.0, uuid@^3.2.1, uuid@^3.2.2, uuid@^3.3.2, uuid@^3.3.3: +uuid@^3.2.1, uuid@^3.2.2, uuid@^3.3.2, uuid@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== -uuid@^8.0.0, uuid@^8.3.0, uuid@^8.3.2: +uuid@^8.3.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -27823,6 +29076,11 @@ vfile-location@^3.0.0: resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.0.1.tgz#d78677c3546de0f7cd977544c367266764d31bb3" integrity sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ== +vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + vfile-message@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.1.tgz#951881861c22fc1eb39f873c0b93e336a64e8f6d" @@ -28038,6 +29296,11 @@ web-encoding@^1.0.2, web-encoding@^1.0.6: optionalDependencies: "@zxing/text-encoding" "0.9.0" +web-namespaces@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + web3-bzz@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f" @@ -28388,13 +29651,14 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webpack-dev-middleware@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz#ef751d25f4e9a5c8a35da600c5fda3582b5c6cff" - integrity sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA== +webpack-dev-middleware@^3.7.3: + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== dependencies: memory-fs "^0.4.1" - mime "^2.4.2" + mime "^2.4.4" + mkdirp "^0.5.1" range-parser "^1.2.1" webpack-log "^2.0.0" @@ -28413,16 +29677,6 @@ webpack-hot-middleware@^2.25.0: querystring "^0.2.0" strip-ansi "^3.0.0" -webpack-log@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d" - integrity sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA== - dependencies: - chalk "^2.1.0" - log-symbols "^2.1.0" - loglevelnext "^1.0.1" - uuid "^3.1.0" - webpack-log@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" @@ -28446,7 +29700,36 @@ webpack-virtual-modules@^0.2.2: dependencies: debug "^3.0.0" -webpack@^4.41.6, webpack@^4.44.2: +webpack@4: + version "4.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.5.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +webpack@^4.41.6: version "4.44.2" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== @@ -29099,3 +30382,8 @@ zcash-bitcore-lib@~0.13.20-rc3: elliptic "=3.0.3" inherits "=2.0.1" lodash "=3.10.1" + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== From 22f7baebdc334fa2461a6685b12457cb59f5d41f Mon Sep 17 00:00:00 2001 From: Brad Decker Date: Fri, 29 Oct 2021 15:17:49 -0500 Subject: [PATCH 25/97] update anonymous id (#12503) Co-authored-by: Dan Finlay <542863+danfinlay@users.noreply.github.com> --- shared/constants/metametrics.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/constants/metametrics.js b/shared/constants/metametrics.js index e9262d750..7f0a3804f 100644 --- a/shared/constants/metametrics.js +++ b/shared/constants/metametrics.js @@ -110,9 +110,9 @@ * the page view */ -// An empty string "" is a, currently undocumented, way of telling mixpanel +// An empty string is a, currently undocumented, way of telling mixpanel // that these events are meant to be anonymous and not identified to any user -export const METAMETRICS_ANONYMOUS_ID = '""'; +export const METAMETRICS_ANONYMOUS_ID = ''; /** * This object is used to identify events that are triggered by the background From 6f6576917cdedeff14c48fe111a60be21bfd19c5 Mon Sep 17 00:00:00 2001 From: Etienne Dusseault Date: Fri, 29 Oct 2021 20:40:32 -0300 Subject: [PATCH 26/97] Add settings-component to Storybook (#12086) * settings * add id filename * remove platform version * readd platform version --- ui/pages/settings/settings.stories.js | 78 +++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 ui/pages/settings/settings.stories.js diff --git a/ui/pages/settings/settings.stories.js b/ui/pages/settings/settings.stories.js new file mode 100644 index 000000000..c05953a76 --- /dev/null +++ b/ui/pages/settings/settings.stories.js @@ -0,0 +1,78 @@ +import React from 'react'; + +import PropTypes from 'prop-types'; +import { withRouter, MemoryRouter } from 'react-router-dom'; +import { + ABOUT_US_ROUTE, + ADVANCED_ROUTE, + ALERTS_ROUTE, + CONTACT_LIST_ROUTE, + CONTACT_ADD_ROUTE, + CONTACT_EDIT_ROUTE, + CONTACT_VIEW_ROUTE, + GENERAL_ROUTE, + NETWORKS_FORM_ROUTE, + NETWORKS_ROUTE, + SECURITY_ROUTE, + SETTINGS_ROUTE, +} from '../../helpers/constants/routes'; +import SettingsPage from './settings.component'; + +export default { + title: 'SettingPage', + id: __filename, + decorators: [ + (story) => ( + + {story()} + + ), + ], +}; + +const ROUTES_TO_I18N_KEYS = { + [ABOUT_US_ROUTE]: 'about', + [ADVANCED_ROUTE]: 'advanced', + [ALERTS_ROUTE]: 'alerts', + [GENERAL_ROUTE]: 'general', + [CONTACT_ADD_ROUTE]: 'newContact', + [CONTACT_EDIT_ROUTE]: 'editContact', + [CONTACT_LIST_ROUTE]: 'contacts', + [CONTACT_VIEW_ROUTE]: 'viewContact', + [NETWORKS_ROUTE]: 'networks', + [NETWORKS_FORM_ROUTE]: 'networks', + [SECURITY_ROUTE]: 'securityAndPrivacy', +}; + +global.platform = { + getVersion: () => 'V3.14.159', +}; + +const Settings = ({ history }) => { + const { location } = history; + const pathname = + location.pathname === '/iframe.html' + ? '/settings/general' + : location.pathname; + + const pathnameI18nKey = ROUTES_TO_I18N_KEYS[pathname]; + const backRoute = SETTINGS_ROUTE; + + return ( +
+ +
+ ); +}; + +Settings.propTypes = { + history: PropTypes.object, +}; + +export const SettingsPageComponent = withRouter(Settings); From 2e8752183f81a74570784451fa336cede7c1be41 Mon Sep 17 00:00:00 2001 From: Erik Marks <25517051+rekmarks@users.noreply.github.com> Date: Fri, 29 Oct 2021 16:45:27 -0700 Subject: [PATCH 27/97] Fix off-by-one error in code fence transform (#12540) The code fence transform was including contents after the final END directive twice. That was not covered by the tests, because none of the examples contained any content after the final END directive, and concatenating the empty string twice does not produce an observable difference in the test results. This bug was due to an off-by-one error in the loop of the multiSplice function. The error has been fixed, and more test cases have been added. --- .../build/transforms/remove-fenced-code.js | 4 +- .../transforms/remove-fenced-code.test.js | 115 ++++++++++++++++++ 2 files changed, 118 insertions(+), 1 deletion(-) diff --git a/development/build/transforms/remove-fenced-code.js b/development/build/transforms/remove-fenced-code.js index 7f26ad6cf..200233fe8 100644 --- a/development/build/transforms/remove-fenced-code.js +++ b/development/build/transforms/remove-fenced-code.js @@ -408,7 +408,9 @@ function multiSplice(toSplice, splicingIndices) { // pushes the substring between each "end" index and the next "begin" index // to the array of retained substrings. if (splicingIndices.length > 2) { - for (let i = 1; i < splicingIndices.length; i += 2) { + // Note the boundary index of "splicingIndices.length - 1". This loop must + // not iterate over the last element of the array. + for (let i = 1; i < splicingIndices.length - 1; i += 2) { retainedSubstrings.push( toSplice.substring(splicingIndices[i], splicingIndices[i + 1]), ); diff --git a/development/build/transforms/remove-fenced-code.test.js b/development/build/transforms/remove-fenced-code.test.js index 33461b89d..5eebc1135 100644 --- a/development/build/transforms/remove-fenced-code.test.js +++ b/development/build/transforms/remove-fenced-code.test.js @@ -201,6 +201,14 @@ describe('build/transforms/remove-fenced-code', () => { ), ).toStrictEqual(testData.validOutputs[buildType]); + expect( + removeFencedCode( + mockFileName, + buildType, + testData.validInputs.extraContentWithFences, + ), + ).toStrictEqual(testData.validOutputsWithExtraContent[buildType]); + // Ensure that the minimal input template is in fact valid const minimalInput = getMinimalFencedCode(buildType); expect( @@ -216,6 +224,17 @@ describe('build/transforms/remove-fenced-code', () => { testData.validInputs.withoutFences, ), ).toStrictEqual([testData.validInputs.withoutFences, false]); + + expect( + removeFencedCode( + mockFileName, + buildType, + testData.validInputs.extraContentWithoutFences, + ), + ).toStrictEqual([ + testData.validInputs.extraContentWithoutFences, + false, + ]); }); }); @@ -611,6 +630,43 @@ Conditionally_Included ///: END:ONLY_INCLUDE_IN `, + extraContentWithFences: ` +///: BEGIN:ONLY_INCLUDE_IN(flask,beta) +Conditionally_Included +///: END:ONLY_INCLUDE_IN + Always_Included +Always_Included + Always_Included +Always_Included + ///: BEGIN:ONLY_INCLUDE_IN(flask,beta) + Conditionally_Included + + Conditionally_Included + Conditionally_Included + ///: END:ONLY_INCLUDE_IN +Always_Included + +Always_Included + Always_Included + ///: BEGIN:ONLY_INCLUDE_IN(flask) + + Conditionally_Included + Conditionally_Included + ///: END:ONLY_INCLUDE_IN +Always_Included + Always_Included +Always_Included + +///: BEGIN:ONLY_INCLUDE_IN(flask) + Conditionally_Included +Conditionally_Included + + ///: END:ONLY_INCLUDE_IN + Always_Included + Always_Included +Always_Included +`, + withoutFences: ` Always_Included Always_Included @@ -624,6 +680,24 @@ Always_Included Always_Included Always_Included +`, + + extraContentWithoutFences: ` + Always_Included +Always_Included + Always_Included +Always_Included +Always_Included + +Always_Included + Always_Included +Always_Included + Always_Included +Always_Included + + Always_Included + Always_Included +Always_Included `, }, @@ -651,6 +725,38 @@ Always_Included Always_Included Always_Included +`, + true, + ], + }, + + validOutputsWithExtraContent: { + beta: [ + ` +///: BEGIN:ONLY_INCLUDE_IN(flask,beta) +Conditionally_Included +///: END:ONLY_INCLUDE_IN + Always_Included +Always_Included + Always_Included +Always_Included + ///: BEGIN:ONLY_INCLUDE_IN(flask,beta) + Conditionally_Included + + Conditionally_Included + Conditionally_Included + ///: END:ONLY_INCLUDE_IN +Always_Included + +Always_Included + Always_Included +Always_Included + Always_Included +Always_Included + + Always_Included + Always_Included +Always_Included `, true, ], @@ -659,5 +765,14 @@ Always_Included data.validOutputs.flask = [data.validInputs.withFences, false]; data.validOutputs.main = [data.validInputs.withoutFences, true]; + + data.validOutputsWithExtraContent.flask = [ + data.validInputs.extraContentWithFences, + false, + ]; + data.validOutputsWithExtraContent.main = [ + data.validInputs.extraContentWithoutFences, + true, + ]; return deepFreeze(data); } From b058cbed3b0f2beab8ef7923c9e8a1b9fb95a5e0 Mon Sep 17 00:00:00 2001 From: ryanml Date: Sat, 30 Oct 2021 11:04:09 -0700 Subject: [PATCH 28/97] Fixing COLORS.GRAY (#12538) --- ui/css/design-system/colors.scss | 2 ++ ui/helpers/constants/design-system.js | 2 +- .../confirm-transaction-base.component.js | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ui/css/design-system/colors.scss b/ui/css/design-system/colors.scss index 264af073c..bda23ce09 100644 --- a/ui/css/design-system/colors.scss +++ b/ui/css/design-system/colors.scss @@ -97,6 +97,7 @@ $success-2: #caf4d1; $success-3: #219e37; $ui-black: #24292e; +$ui-grey: #d6d9dc; $ui-white: #fff; $ui-1: #f2f3f4; $ui-2: #d6d9dc; @@ -117,6 +118,7 @@ $color-map: ( 'ui-4': $ui-4, 'white': $ui-white, 'black': $ui-black, + 'grey': $ui-grey, 'primary-1': $primary-1, 'primary-2': $primary-2, 'primary-3': $primary-3, diff --git a/ui/helpers/constants/design-system.js b/ui/helpers/constants/design-system.js index c82b168be..582b0c3a8 100644 --- a/ui/helpers/constants/design-system.js +++ b/ui/helpers/constants/design-system.js @@ -10,7 +10,7 @@ export const COLORS = { UI3: 'ui-3', UI4: 'ui-4', BLACK: 'black', - GRAY: 'gray', + GREY: 'grey', WHITE: 'white', PRIMARY1: 'primary-1', PRIMARY2: 'primary-2', diff --git a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js index 03bab18ab..aa0482d7b 100644 --- a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js +++ b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js @@ -495,7 +495,7 @@ export default class ConfirmTransactionBase extends Component { {t('transactionDetailDappGasMoreInfo')} From db20399d817e3f19fe0e83004c4f1deffd70df16 Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Mon, 1 Nov 2021 08:16:05 -0230 Subject: [PATCH 29/97] Turn off all old notifications (#12500) * Turn off all old notifications * Remove unnecessary attempt to close whats new popup in e2e test * Remove unneeded whats new popup closes in e2e tests * Lint fix --- test/e2e/metamask-ui.spec.js | 18 ------------------ test/e2e/tests/add-hide-token.spec.js | 2 -- test/e2e/tests/from-import-ui.spec.js | 5 ----- test/e2e/tests/incremental-security.spec.js | 7 ------- ui/selectors/selectors.js | 20 ++++++++------------ 5 files changed, 8 insertions(+), 44 deletions(-) diff --git a/test/e2e/metamask-ui.spec.js b/test/e2e/metamask-ui.spec.js index 3f57d00ae..f12b8a090 100644 --- a/test/e2e/metamask-ui.spec.js +++ b/test/e2e/metamask-ui.spec.js @@ -176,24 +176,6 @@ describe('MetaMask', function () { }); }); - describe("Close the what's new popup", function () { - it("should show the what's new popover", async function () { - const popoverTitle = await driver.findElement( - '.popover-header__title h2', - ); - - assert.equal(await popoverTitle.getText(), "What's new"); - }); - - it("should close the what's new popup", async function () { - const popover = await driver.findElement('.popover-container'); - - await driver.clickElement('[data-testid="popover-close"]'); - - await popover.waitForElementState('hidden'); - }); - }); - describe('Import Secret Recovery Phrase', function () { it('logs out of the vault', async function () { await driver.clickElement('.account-menu__icon'); diff --git a/test/e2e/tests/add-hide-token.spec.js b/test/e2e/tests/add-hide-token.spec.js index fa5e85009..66c6067bb 100644 --- a/test/e2e/tests/add-hide-token.spec.js +++ b/test/e2e/tests/add-hide-token.spec.js @@ -27,7 +27,6 @@ describe('Hide token', function () { css: '.asset-list-item__token-button', text: '0 TST', }); - await driver.clickElement('.popover-header__button'); let assets = await driver.findElements('.asset-list-item'); assert.equal(assets.length, 2); @@ -39,7 +38,6 @@ describe('Hide token', function () { await driver.clickElement('[data-testid="asset-options__button"]'); await driver.clickElement('[data-testid="asset-options__hide"]'); - // wait for confirm hide modal to be visible const confirmHideModal = await driver.findVisibleElement('span .modal'); diff --git a/test/e2e/tests/from-import-ui.spec.js b/test/e2e/tests/from-import-ui.spec.js index ad97bb257..0bd3b683a 100644 --- a/test/e2e/tests/from-import-ui.spec.js +++ b/test/e2e/tests/from-import-ui.spec.js @@ -60,11 +60,6 @@ describe('Metamask Import UI', function () { tag: 'button', }); - // close the what's new popup - const popover = await driver.findElement('.popover-container'); - await driver.clickElement('[data-testid="popover-close"]'); - await popover.waitForElementState('hidden'); - // Show account information await driver.clickElement( '[data-testid="account-options-menu-button"]', diff --git a/test/e2e/tests/incremental-security.spec.js b/test/e2e/tests/incremental-security.spec.js index e000e9817..90df69560 100644 --- a/test/e2e/tests/incremental-security.spec.js +++ b/test/e2e/tests/incremental-security.spec.js @@ -65,13 +65,6 @@ describe('Incremental Security', function () { tag: 'button', }); - // closes the what's new popup - const popover = await driver.findElement('.popover-container'); - - await driver.clickElement('[data-testid="popover-close"]'); - - await popover.waitForElementState('hidden'); - await driver.clickElement( '[data-testid="account-options-menu-button"]', ); diff --git a/ui/selectors/selectors.js b/ui/selectors/selectors.js index cfbd8e246..dec951328 100644 --- a/ui/selectors/selectors.js +++ b/ui/selectors/selectors.js @@ -2,7 +2,6 @@ import { createSelector } from 'reselect'; import { addHexPrefix } from '../../app/scripts/lib/util'; import { MAINNET_CHAIN_ID, - BSC_CHAIN_ID, TEST_CHAINS, NETWORK_TYPE_RPC, NATIVE_CURRENCY_TOKEN_IMAGE_MAP, @@ -576,18 +575,15 @@ export function getShowWhatsNewPopup(state) { * @param {Object} state * @returns {Object} */ -function getAllowedNotificationIds(state) { - const currentKeyring = getCurrentKeyring(state); - const currentKeyringIsLedger = currentKeyring?.type === KEYRING_TYPES.LEDGER; - +function getAllowedNotificationIds() { return { - 1: true, - 2: true, - 3: true, - 4: getCurrentChainId(state) === BSC_CHAIN_ID, - 5: true, - 6: currentKeyringIsLedger, - 7: currentKeyringIsLedger, + 1: false, + 2: false, + 3: false, + 4: false, + 5: false, + 6: false, + 7: false, }; } From 1390d72259b72db742d2e1ddd9d794308c85da93 Mon Sep 17 00:00:00 2001 From: ryanml Date: Mon, 1 Nov 2021 12:16:23 -0700 Subject: [PATCH 30/97] Adding flexWrap prop to Box (#12542) --- ui/components/ui/box/box.js | 4 ++++ ui/components/ui/box/box.scss | 6 ++++++ ui/css/design-system/attributes.scss | 5 +++++ ui/helpers/constants/design-system.js | 6 ++++++ 4 files changed, 21 insertions(+) diff --git a/ui/components/ui/box/box.js b/ui/components/ui/box/box.js index 9727d09ef..e9fb0cb3a 100644 --- a/ui/components/ui/box/box.js +++ b/ui/components/ui/box/box.js @@ -11,6 +11,7 @@ import { SIZES, TEXT_ALIGN, FLEX_DIRECTION, + FLEX_WRAP, } from '../../../helpers/constants/design-system'; const ValidSize = PropTypes.oneOf([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]); @@ -77,6 +78,7 @@ export default function Box({ justifyContent, textAlign, flexDirection = FLEX_DIRECTION.ROW, + flexWrap, display, width, height, @@ -122,6 +124,7 @@ export default function Box({ [`box--justify-content-${justifyContent}`]: Boolean(justifyContent), [`box--align-items-${alignItems}`]: Boolean(alignItems), [`box--flex-direction-${flexDirection}`]: Boolean(flexDirection), + [`box--flex-wrap-${flexWrap}`]: Boolean(flexWrap), // text align [`box--text-align-${textAlign}`]: Boolean(textAlign), // display @@ -142,6 +145,7 @@ export default function Box({ Box.propTypes = { children: PropTypes.oneOfType([PropTypes.node, PropTypes.func]), flexDirection: PropTypes.oneOf(Object.values(FLEX_DIRECTION)), + flexWrap: PropTypes.oneOf(Object.values(FLEX_WRAP)), margin: MultipleSizes, marginTop: ValidSize, marginBottom: ValidSize, diff --git a/ui/components/ui/box/box.scss b/ui/components/ui/box/box.scss index 3f657ac6d..322f2d43c 100644 --- a/ui/components/ui/box/box.scss +++ b/ui/components/ui/box/box.scss @@ -90,6 +90,12 @@ $attributes: padding, margin; } } + @each $wrap in design-system.$flex-wrap { + &--flex-wrap-#{$wrap} { + flex-wrap: $wrap; + } + } + // Width and Height &--width-full { width: 100%; diff --git a/ui/css/design-system/attributes.scss b/ui/css/design-system/attributes.scss index 7373c7c3b..e9f03e053 100644 --- a/ui/css/design-system/attributes.scss +++ b/ui/css/design-system/attributes.scss @@ -19,6 +19,11 @@ $flex-direction: column, column-reverse; +$flex-wrap: + wrap, + wrap-reverse, + nowrap; + $fractions: ( 1\/2: 50%, 1\/3: 33.333333%, diff --git a/ui/helpers/constants/design-system.js b/ui/helpers/constants/design-system.js index 582b0c3a8..ae26f9d28 100644 --- a/ui/helpers/constants/design-system.js +++ b/ui/helpers/constants/design-system.js @@ -96,6 +96,12 @@ export const FLEX_DIRECTION = { COLUMN_REVERSE: 'column-reverse', }; +export const FLEX_WRAP = { + WRAP: 'wrap', + WRAP_REVERSE: 'wrap-reverse', + NO_WRAP: 'nowrap', +}; + export const DISPLAY = { BLOCK: 'block', FLEX: 'flex', From 0c229e2d4ae65499c4f2db2728fc6657b6ef8d94 Mon Sep 17 00:00:00 2001 From: filipsekulic Date: Tue, 2 Nov 2021 02:38:41 +0100 Subject: [PATCH 31/97] Fixed approve confirmation logic (#12511) --- .../edit-approval-permission.component.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/components/app/modals/edit-approval-permission/edit-approval-permission.component.js b/ui/components/app/modals/edit-approval-permission/edit-approval-permission.component.js index b6cfec569..373d2c1d3 100644 --- a/ui/components/app/modals/edit-approval-permission/edit-approval-permission.component.js +++ b/ui/components/app/modals/edit-approval-permission/edit-approval-permission.component.js @@ -103,11 +103,11 @@ export default class EditApprovalPermission extends PureComponent { 'edit-approval-permission__edit-section__option-label--selected': selectedOptionIsUnlimited, })} > - {new BigNumber(tokenAmount).lessThan( - new BigNumber(tokenBalance), + {new BigNumber(tokenAmount).equals( + new BigNumber(MAX_UNSIGNED_256_INT), ) - ? t('proposedApprovalLimit') - : t('unlimited')} + ? t('unlimited') + : t('proposedApprovalLimit')}
{t('spendLimitRequestedBy', [origin])} From a2d3d942ec65258e4571685d8a2f5602134dbd7d Mon Sep 17 00:00:00 2001 From: Erik Marks <25517051+rekmarks@users.noreply.github.com> Date: Mon, 1 Nov 2021 20:20:31 -0700 Subject: [PATCH 32/97] Exclude files from builds by build type (#12521) This PR enables the exclusion of JavaScript and JSON source by `buildType`, and enables the running of `eslint` under LavaMoat. 80-90% of the changes in this PR are `.patch` files and LavaMoat policy additions. The file exclusion is designed to work in conjunction with our code fencing. If you forget to fence an import statement of an excluded file, the application will now error on boot. **This PR commits us to a particular naming convention for files intended only for certain builds.** Continue reading for details. ### Code Fencing and ESLint When a file is modified by the code fencing transform, we run ESLint on it to ensure that we fail early for syntax-related issues. This PR adds the first code fences that will be actually be removed in production builds. As a consequence, this was also the first time we attempted to run ESLint under LavaMoat. Making that work required a lot of manual labor because of ESLint's use of dynamic imports, but the manual changes necessary were ultimately quite minor. ### File Exclusion For all builds, any file in `app/`, `shared/` or `ui/` in a sub-directory matching `**/${otherBuildType}/**` (where `otherBuildType` is any build type except `main`) will be added to the list of excluded files, regardless of its file extension. For example, if we want to add one or more pages to the UI settings in Flask, we'd create the folder `ui/pages/settings/flask`, add any necessary files or sub-folders there, and fence the import statements for anything in that folder. If we wanted the same thing for Beta, we would name the directory `ui/pages/settings/beta`. As it happens, we already organize some of our source files in this way, namely the logo JSON for Beta and Flask builds. See `ui/helpers/utils/build-types.js` to see how this works in practice. Because the list of ignored filed is only passed to `browserify.exclude()`, any files not bundled by `browserify` will be ignored. For our purposes, this is mostly relevant for `.scss`. Since we don't have anything like code fencing for SCSS, we'll have to consider how to handle our styles separately. --- .eslintrc.js | 9 +- development/build/index.js | 53 ++- development/build/scripts.js | 42 +- development/build/transforms/utils.js | 16 + lavamoat/node/policy-override.json | 36 +- lavamoat/node/policy.json | 541 +++++++++++++++++++++++++- package.json | 2 + patches/@eslint+eslintrc+0.4.0.patch | 21 + patches/eslint+7.23.0.patch | 13 + patches/object.values+1.1.1.patch | 23 ++ ui/helpers/utils/build-types.js | 12 +- yarn.lock | 2 +- 12 files changed, 748 insertions(+), 22 deletions(-) create mode 100644 patches/@eslint+eslintrc+0.4.0.patch create mode 100644 patches/eslint+7.23.0.patch create mode 100644 patches/object.values+1.1.1.patch diff --git a/.eslintrc.js b/.eslintrc.js index b2967de39..a62366c17 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,3 +1,5 @@ +const { version: reactVersion } = require('react/package.json'); + module.exports = { root: true, parser: '@babel/eslint-parser', @@ -213,7 +215,12 @@ module.exports = { settings: { react: { - version: 'detect', + // If this is set to 'detect', ESLint will import React in order to find + // its version. Because we run ESLint in the build system under LavaMoat, + // this means that detecting the React version requires a LavaMoat policy + // for all of React, in the build system. That's a no-go, so we grab it + // from React's package.json. + version: reactVersion, }, }, }; diff --git a/development/build/index.js b/development/build/index.js index b98fbfdd7..d96f0706f 100755 --- a/development/build/index.js +++ b/development/build/index.js @@ -3,8 +3,10 @@ // // run any task with "yarn build ${taskName}" // +const path = require('path'); const livereload = require('gulp-livereload'); const minimist = require('minimist'); +const { sync: globby } = require('globby'); const { createTask, composeSeries, @@ -18,7 +20,8 @@ const createStaticAssetTasks = require('./static'); const createEtcTasks = require('./etc'); const { BuildType, getBrowserVersionMap } = require('./utils'); -// packages required dynamically via browserify configuration in dependencies +// Packages required dynamically via browserify configuration in dependencies +// Required for LavaMoat policy generation require('loose-envify'); require('@babel/plugin-proposal-object-rest-spread'); require('@babel/plugin-transform-runtime'); @@ -28,6 +31,19 @@ require('@babel/plugin-proposal-nullish-coalescing-operator'); require('@babel/preset-env'); require('@babel/preset-react'); require('@babel/core'); +// ESLint-related +require('@babel/eslint-parser'); +require('@babel/eslint-plugin'); +require('@metamask/eslint-config'); +require('@metamask/eslint-config-nodejs'); +require('eslint'); +require('eslint-config-prettier'); +require('eslint-import-resolver-node'); +require('eslint-plugin-import'); +require('eslint-plugin-node'); +require('eslint-plugin-prettier'); +require('eslint-plugin-react'); +require('eslint-plugin-react-hooks'); defineAndRunBuildTasks(); @@ -45,6 +61,8 @@ function defineAndRunBuildTasks() { const browserVersionMap = getBrowserVersionMap(browserPlatforms); + const ignoredFiles = getIgnoredFiles(buildType); + const staticTasks = createStaticAssetTasks({ livereload, browserPlatforms, @@ -63,6 +81,7 @@ function defineAndRunBuildTasks() { const scriptTasks = createScriptTasks({ browserPlatforms, buildType, + ignoredFiles, isLavaMoat, livereload, shouldLintFenceFiles, @@ -188,3 +207,35 @@ function parseArgv() { skipStats: argv[NamedArgs.SkipStats], }; } + +/** + * Gets the files to be ignored by the current build, if any. + * + * @param {string} buildType - The type of the current build. + * @returns {string[] | null} The array of files to be ignored by the current + * build, or `null` if no files are to be ignored. + */ +function getIgnoredFiles(currentBuildType) { + const excludedFiles = Object.values(BuildType) + // This filter removes "main" and the current build type. The files of any + // build types that remain in the array will be excluded. "main" is the + // default build type, and has no files that are excluded from other builds. + .filter( + (buildType) => + buildType !== BuildType.main && buildType !== currentBuildType, + ) + // Compute globs targeting files for exclusion for each excluded build + // type. + .reduce((excludedGlobs, excludedBuildType) => { + return excludedGlobs.concat([ + `../../app/**/${excludedBuildType}/**`, + `../../shared/**/${excludedBuildType}/**`, + `../../ui/**/${excludedBuildType}/**`, + ]); + }, []) + // This creates absolute paths of the form: + // PATH_TO_REPOSITORY_ROOT/app/**/${excludedBuildType}/** + .map((pathGlob) => path.resolve(__dirname, pathGlob)); + + return globby(excludedFiles); +} diff --git a/development/build/scripts.js b/development/build/scripts.js index bfdac3840..d8a22251e 100644 --- a/development/build/scripts.js +++ b/development/build/scripts.js @@ -138,6 +138,7 @@ module.exports = createScriptTasks; function createScriptTasks({ browserPlatforms, buildType, + ignoredFiles, isLavaMoat, livereload, shouldLintFenceFiles, @@ -182,8 +183,9 @@ function createScriptTasks({ } return `./app/scripts/${label}.js`; }), - testing, + ignoredFiles, shouldLintFenceFiles, + testing, }), ); @@ -253,6 +255,7 @@ function createScriptTasks({ destFilepath: `${label}.js`, devMode, entryFilepath: `./app/scripts/${label}.js`, + ignoredFiles, label, shouldLintFenceFiles, }); @@ -266,6 +269,7 @@ function createScriptTasks({ destFilepath: `${label}.js`, devMode, entryFilepath: `./app/scripts/${label}.js`, + ignoredFiles, label, shouldLintFenceFiles, }); @@ -279,6 +283,7 @@ function createScriptTasks({ destFilepath: `${label}.js`, devMode, entryFilepath: `./app/scripts/${label}.js`, + ignoredFiles, label, shouldLintFenceFiles, }); @@ -296,8 +301,9 @@ function createScriptTasks({ devMode, entryFilepath: `./app/scripts/${inpage}.js`, label: inpage, - testing, + ignoredFiles, shouldLintFenceFiles, + testing, }), createNormalBundle({ buildType, @@ -306,8 +312,9 @@ function createScriptTasks({ devMode, entryFilepath: `./app/scripts/${contentscript}.js`, label: contentscript, - testing, + ignoredFiles, shouldLintFenceFiles, + testing, }), ); } @@ -318,8 +325,9 @@ function createFactoredBuild({ buildType, devMode, entryFiles, - testing, + ignoredFiles, shouldLintFenceFiles, + testing, }) { return async function () { // create bundler setup and apply defaults @@ -336,6 +344,7 @@ function createFactoredBuild({ buildType, devMode, envVars, + ignoredFiles, minify, reloadOnChange, shouldLintFenceFiles, @@ -480,6 +489,7 @@ function createNormalBundle({ devMode, entryFilepath, extraEntries = [], + ignoredFiles, label, modulesToExpose, shouldLintFenceFiles, @@ -500,6 +510,7 @@ function createNormalBundle({ buildType, devMode, envVars, + ignoredFiles, minify, reloadOnChange, shouldLintFenceFiles, @@ -544,12 +555,20 @@ function createBuildConfiguration() { manualExternal: [], manualIgnore: [], }; - return { label, bundlerOpts, events }; + return { bundlerOpts, events, label }; } function setupBundlerDefaults( buildConfiguration, - { buildType, devMode, envVars, minify, reloadOnChange, shouldLintFenceFiles }, + { + buildType, + devMode, + envVars, + ignoredFiles, + minify, + reloadOnChange, + shouldLintFenceFiles, + }, ) { const { bundlerOpts } = buildConfiguration; @@ -579,6 +598,11 @@ function setupBundlerDefaults( bundlerOpts.transform.push([envify(envVars), { global: true }]); } + // Ensure that any files that should be ignored are excluded from the build + if (ignoredFiles) { + bundlerOpts.manualExclude = ignoredFiles; + } + // Setup reload on change if (reloadOnChange) { setupReloadOnChange(buildConfiguration); @@ -661,11 +685,17 @@ function setupSourcemaps(buildConfiguration, { devMode }) { async function bundleIt(buildConfiguration) { const { label, bundlerOpts, events } = buildConfiguration; const bundler = browserify(bundlerOpts); + // manually apply non-standard options bundler.external(bundlerOpts.manualExternal); bundler.ignore(bundlerOpts.manualIgnore); + if (Array.isArray(bundlerOpts.manualExclude)) { + bundler.exclude(bundlerOpts.manualExclude); + } + // output build logs to terminal bundler.on('log', log); + // forward update event (used by watchify) bundler.on('update', () => performBundle()); diff --git a/development/build/transforms/utils.js b/development/build/transforms/utils.js index c438d5351..171c38eae 100644 --- a/development/build/transforms/utils.js +++ b/development/build/transforms/utils.js @@ -1,6 +1,22 @@ const { ESLint } = require('eslint'); const eslintrc = require('../../../.eslintrc.js'); +// We don't want linting to fail for purely stylistic reasons. +eslintrc.rules['prettier/prettier'] = 'off'; + +// Remove all test-related overrides. We will never lint test files here. +eslintrc.overrides = eslintrc.overrides.filter((override) => { + return !( + (override.extends && + override.extends.find( + (configName) => + configName.includes('jest') || configName.includes('mocha'), + )) || + (override.plugins && + override.plugins.find((pluginName) => pluginName.includes('jest'))) + ); +}); + /** * The singleton ESLint instance. * diff --git a/lavamoat/node/policy-override.json b/lavamoat/node/policy-override.json index 85e84f001..eaa6b9b26 100644 --- a/lavamoat/node/policy-override.json +++ b/lavamoat/node/policy-override.json @@ -1,13 +1,5 @@ { "resources": { - "node-sass": { - "native": true - }, - "module-deps": { - "packages": { - "loose-envify": true - } - }, "@babel/core": { "packages": { "": true, @@ -20,6 +12,34 @@ "@babel/plugin-proposal-nullish-coalescing-operator": true } }, + "@eslint/eslintrc": { + "packages": { + "@babel/eslint-parser": true, + "@babel/eslint-plugin": true, + "@metamask/eslint-config": true, + "@metamask/eslint-config-nodejs": true, + "eslint": true, + "eslint-config-prettier": true, + "eslint-plugin-import": true, + "eslint-plugin-node": true, + "eslint-plugin-prettier": true, + "eslint-plugin-react": true, + "eslint-plugin-react-hooks": true + } + }, + "eslint-module-utils": { + "packages": { + "eslint-import-resolver-node": true + } + }, + "node-sass": { + "native": true + }, + "module-deps": { + "packages": { + "loose-envify": true + } + }, "sass": { "env": "unfrozen", "builtin": { diff --git a/lavamoat/node/policy.json b/lavamoat/node/policy.json index 601d1e488..5526f328d 100644 --- a/lavamoat/node/policy.json +++ b/lavamoat/node/policy.json @@ -41,6 +41,20 @@ "source-map": true } }, + "@babel/eslint-parser": { + "packages": { + "@babel/core": true, + "eslint-scope": true, + "eslint-visitor-keys": true, + "semver": true + } + }, + "@babel/eslint-plugin": { + "packages": { + "eslint": true, + "eslint-rule-composer": true + } + }, "@babel/generator": { "globals": { "console.error": true @@ -815,7 +829,6 @@ "espree": true, "globals": true, "ignore": true, - "import-fresh": true, "js-yaml": true, "minimatch": true, "strip-json-comments": true @@ -1038,6 +1051,15 @@ "make-iterator": true } }, + "array-includes": { + "packages": { + "call-bind": true, + "define-properties": true, + "es-abstract": true, + "get-intrinsic": true, + "is-string": true + } + }, "array-initial": { "packages": { "array-slice": true, @@ -1054,6 +1076,19 @@ "array-uniq": true } }, + "array.prototype.flat": { + "packages": { + "define-properties": true, + "es-abstract": true + } + }, + "array.prototype.flatmap": { + "packages": { + "call-bind": true, + "define-properties": true, + "es-abstract": true + } + }, "async-done": { "builtin": { "domain.create": true @@ -1340,6 +1375,12 @@ "process.cwd": true } }, + "call-bind": { + "packages": { + "function-bind": true, + "get-intrinsic": true + } + }, "chalk": { "globals": { "process.env.TERM": true, @@ -1491,6 +1532,11 @@ "typedarray": true } }, + "contains-path": { + "builtin": { + "path.normalize": true + } + }, "convert-source-map": { "builtin": { "fs.readFileSync": true, @@ -1679,7 +1725,8 @@ "assert": true }, "packages": { - "esutils": true + "esutils": true, + "isarray": true } }, "dom-serializer": { @@ -1753,9 +1800,22 @@ "WeakRef": true }, "packages": { + "call-bind": true, + "es-to-primitive": true, "function-bind": true, + "get-intrinsic": true, "has": true, - "has-symbols": true + "has-symbols": true, + "is-callable": true, + "is-regex": true, + "object-inspect": true + } + }, + "es-to-primitive": { + "packages": { + "is-callable": true, + "is-date-object": true, + "is-symbol": true } }, "es5-ext": { @@ -1866,6 +1926,141 @@ "regexpp": true } }, + "eslint-config-prettier": { + "globals": { + "process.env.ESLINT_CONFIG_PRETTIER_NO_DEPRECATED": true + } + }, + "eslint-import-resolver-node": { + "builtin": { + "path.dirname": true, + "path.resolve": true + }, + "packages": { + "debug": true, + "resolve": true + } + }, + "eslint-module-utils": { + "builtin": { + "crypto.createHash": true, + "fs.existsSync": true, + "fs.readdirSync": true, + "module": true, + "path.dirname": true, + "path.extname": true, + "path.join": true, + "path.parse": true, + "path.resolve": true + }, + "globals": { + "__dirname": true, + "console.warn": true, + "process.cwd": true, + "process.hrtime": true + }, + "packages": { + "debug": true, + "pkg-dir": true + } + }, + "eslint-plugin-es": { + "packages": { + "eslint-utils": true, + "regexpp": true + } + }, + "eslint-plugin-import": { + "builtin": { + "fs": true, + "path": true, + "vm": true + }, + "globals": { + "process.cwd": true, + "process.env": true + }, + "packages": { + "array-includes": true, + "array.prototype.flat": true, + "contains-path": true, + "debug": true, + "doctrine": true, + "eslint": true, + "eslint-module-utils": true, + "has": true, + "minimatch": true, + "object.values": true, + "read-pkg-up": true, + "resolve": true, + "tsconfig-paths": true, + "typescript": true + } + }, + "eslint-plugin-node": { + "builtin": { + "fs.readFileSync": true, + "fs.readdirSync": true, + "fs.statSync": true, + "path.basename": true, + "path.dirname": true, + "path.extname": true, + "path.isAbsolute": true, + "path.join": true, + "path.relative": true, + "path.resolve": true, + "path.sep": true + }, + "globals": { + "process.cwd": true + }, + "packages": { + "eslint-plugin-es": true, + "eslint-utils": true, + "ignore": true, + "minimatch": true, + "resolve": true, + "semver": true + } + }, + "eslint-plugin-prettier": { + "packages": { + "prettier": true, + "prettier-linter-helpers": true + } + }, + "eslint-plugin-react": { + "builtin": { + "fs.statSync": true, + "path.dirname": true, + "path.extname": true + }, + "globals": { + "console.error": true, + "console.log": true, + "process.argv.join": true, + "process.cwd": true + }, + "packages": { + "array-includes": true, + "array.prototype.flatmap": true, + "doctrine": true, + "has": true, + "jsx-ast-utils": true, + "minimatch": true, + "object.entries": true, + "object.fromentries": true, + "object.values": true, + "prop-types": true, + "resolve": true, + "string.prototype.matchall": true + } + }, + "eslint-plugin-react-hooks": { + "globals": { + "process.env.NODE_ENV": true + } + }, "eslint-scope": { "builtin": { "assert": true @@ -2064,6 +2259,17 @@ "to-regex-range": true } }, + "find-up": { + "builtin": { + "path.dirname": true, + "path.join": true, + "path.parse": true, + "path.resolve": true + }, + "packages": { + "locate-path": true + } + }, "first-chunk-stream": { "builtin": { "util.inherits": true @@ -2234,6 +2440,18 @@ "assert.equal": true } }, + "get-intrinsic": { + "globals": { + "AggregateError": true, + "FinalizationRegistry": true, + "WeakRef": true + }, + "packages": { + "function-bind": true, + "has": true, + "has-symbols": true + } + }, "get-stream": { "builtin": { "stream.PassThrough": true @@ -2613,6 +2831,12 @@ "kind-of": true } }, + "hosted-git-info": { + "builtin": { + "url.URL": true, + "url.parse": true + } + }, "htmlparser2": { "builtin": { "buffer.Buffer": true, @@ -2698,6 +2922,13 @@ "xtend": true } }, + "internal-slot": { + "packages": { + "get-intrinsic": true, + "has": true, + "side-channel": true + } + }, "is-absolute": { "packages": { "is-relative": true, @@ -2723,6 +2954,11 @@ "binary-extensions": true } }, + "is-callable": { + "globals": { + "document": true + } + }, "is-core-module": { "globals": { "process.versions": true @@ -2802,11 +3038,22 @@ "isobject": true } }, + "is-regex": { + "packages": { + "call-bind": true, + "has-symbols": true + } + }, "is-relative": { "packages": { "is-unc-path": true } }, + "is-symbol": { + "packages": { + "has-symbols": true + } + }, "is-unc-path": { "packages": { "unc-path-regex": true @@ -2872,6 +3119,14 @@ "Buffer": true } }, + "jsx-ast-utils": { + "globals": { + "console.error": true + }, + "packages": { + "object.assign": true + } + }, "just-debounce": { "globals": { "clearTimeout": true, @@ -2988,6 +3243,29 @@ "type-check": true } }, + "load-json-file": { + "builtin": { + "path.relative": true + }, + "packages": { + "graceful-fs": true, + "parse-json": true, + "pify": true, + "strip-bom": true + } + }, + "locate-path": { + "builtin": { + "path.resolve": true + }, + "globals": { + "process.cwd": true + }, + "packages": { + "p-locate": true, + "path-exists": true + } + }, "lodash": { "globals": { "define": true @@ -3285,6 +3563,18 @@ "osenv": true } }, + "normalize-package-data": { + "builtin": { + "url.parse": true, + "util.format": true + }, + "packages": { + "hosted-git-info": true, + "resolve": true, + "semver": true, + "validate-npm-package-license": true + } + }, "normalize-path": { "packages": { "remove-trailing-separator": true @@ -3338,6 +3628,7 @@ }, "object.assign": { "packages": { + "call-bind": true, "define-properties": true, "es-abstract": true, "has-symbols": true, @@ -3352,6 +3643,21 @@ "isobject": true } }, + "object.entries": { + "packages": { + "call-bind": true, + "define-properties": true, + "es-abstract": true, + "has": true + } + }, + "object.fromentries": { + "packages": { + "call-bind": true, + "define-properties": true, + "es-abstract": true + } + }, "object.omit": { "packages": { "for-own": true, @@ -3369,6 +3675,14 @@ "make-iterator": true } }, + "object.values": { + "packages": { + "call-bind": true, + "define-properties": true, + "es-abstract": true, + "has": true + } + }, "once": { "packages": { "wrappy": true @@ -3430,6 +3744,16 @@ "os-tmpdir": true } }, + "p-limit": { + "packages": { + "p-try": true + } + }, + "p-locate": { + "packages": { + "p-limit": true + } + }, "parent-module": { "packages": { "callsites": true @@ -3479,6 +3803,12 @@ "process.platform": true } }, + "path-exists": { + "builtin": { + "fs.access": true, + "fs.accessSync": true + } + }, "path-is-absolute": { "globals": { "process.platform": true @@ -3519,6 +3849,9 @@ "builtin": { "fs": true, "util.promisify": true + }, + "packages": { + "pify": true } }, "pause-stream": { @@ -3548,6 +3881,14 @@ "pinkie": true } }, + "pkg-dir": { + "builtin": { + "path.dirname": true + }, + "packages": { + "find-up": true + } + }, "plugin-error": { "builtin": { "util.inherits": true @@ -3634,11 +3975,62 @@ "postcss": true } }, + "prettier": { + "builtin": { + "assert": true, + "events": true, + "fs": true, + "module": true, + "os": true, + "path": true, + "stream": true, + "tty": true, + "util": true + }, + "globals": { + "Buffer": true, + "Intl": true, + "PerformanceObserver": true, + "WorkerGlobalScope": true, + "XMLHttpRequest": true, + "YAML_SILENCE_DEPRECATION_WARNINGS": true, + "YAML_SILENCE_WARNINGS": true, + "__dirname": true, + "__filename": true, + "atob": true, + "btoa": true, + "clearTimeout": true, + "console": true, + "define": true, + "document": true, + "localStorage": true, + "navigator": true, + "performance": true, + "process": true, + "setImmediate": true, + "setTimeout": true + } + }, + "prettier-linter-helpers": { + "packages": { + "fast-diff": true + } + }, "process-nextick-args": { "globals": { "process": true } }, + "prop-types": { + "globals": { + "console": true, + "process.env.NODE_ENV": true + }, + "packages": { + "object-assign": true, + "react-is": true + } + }, "pump": { "builtin": { "fs": true @@ -3709,11 +4101,33 @@ "strip-json-comments": true } }, + "react-is": { + "globals": { + "console": true, + "process.env.NODE_ENV": true + } + }, "read-only-stream": { "packages": { "readable-stream": true } }, + "read-pkg": { + "builtin": { + "path.join": true + }, + "packages": { + "load-json-file": true, + "normalize-package-data": true, + "path-type": true + } + }, + "read-pkg-up": { + "packages": { + "find-up": true, + "read-pkg": true + } + }, "readable-stream": { "builtin": { "buffer.Buffer": true, @@ -3788,6 +4202,12 @@ "safe-regex": true } }, + "regexp.prototype.flags": { + "packages": { + "call-bind": true, + "define-properties": true + } + }, "regexpu-core": { "packages": { "regenerate": true, @@ -4052,6 +4472,13 @@ "shebang-regex": true } }, + "side-channel": { + "packages": { + "call-bind": true, + "get-intrinsic": true, + "object-inspect": true + } + }, "signal-exit": { "builtin": { "assert.equal": true, @@ -4130,6 +4557,22 @@ "urix": true } }, + "source-map-support": { + "builtin": { + "fs": true, + "path.dirname": true, + "path.resolve": true + }, + "globals": { + "XMLHttpRequest": true, + "console.error": true, + "process": true + }, + "packages": { + "buffer-from": true, + "source-map": true + } + }, "source-map-url": { "globals": { "define": true @@ -4140,6 +4583,22 @@ "define": true } }, + "spdx-correct": { + "packages": { + "spdx-license-ids": true + } + }, + "spdx-expression-parse": { + "builtin": { + "fs.readFileSync": true, + "path.normalize": true + }, + "globals": { + "console.log": true, + "process.argv.slice": true, + "process.exit": true + } + }, "specificity": { "globals": { "define": true @@ -4237,6 +4696,16 @@ "strip-ansi": true } }, + "string.prototype.matchall": { + "packages": { + "call-bind": true, + "define-properties": true, + "es-abstract": true, + "has-symbols": true, + "internal-slot": true, + "regexp.prototype.flags": true + } + }, "string_decoder": { "builtin": { "buffer.Buffer": true @@ -4490,6 +4959,21 @@ "through2": true } }, + "tsconfig-paths": { + "builtin": { + "fs.existsSync": true, + "fs.lstatSync": true, + "fs.readFileSync": true, + "fs.statSync": true, + "path.dirname": true, + "path.join": true, + "path.resolve": true + }, + "packages": { + "json5": true, + "strip-bom": true + } + }, "type-check": { "packages": { "prelude-ls": true @@ -4503,6 +4987,51 @@ "is-typedarray": true } }, + "typescript": { + "builtin": { + "buffer.Buffer": true, + "crypto": true, + "fs.closeSync": true, + "fs.mkdirSync": true, + "fs.openSync": true, + "fs.readFileSync": true, + "fs.readdirSync": true, + "fs.realpathSync": true, + "fs.statSync": true, + "fs.unlinkSync": true, + "fs.unwatchFile": true, + "fs.utimesSync": true, + "fs.watch": true, + "fs.watchFile": true, + "fs.writeFileSync": true, + "fs.writeSync": true, + "inspector": true, + "os.EOL": true, + "os.platform": true, + "path.dirname": true, + "path.join": true, + "path.resolve": true + }, + "globals": { + "Intl": true, + "TypeScript": "write", + "__dirname": true, + "__filename": true, + "__magic__": true, + "clearTimeout": true, + "console.log": true, + "gc": true, + "globalThis": "write", + "onProfilerEvent": true, + "performance": true, + "process": true, + "setTimeout": true, + "toolsVersion": "write" + }, + "packages": { + "source-map-support": true + } + }, "undeclared-identifiers": { "packages": { "acorn-node": true, @@ -4620,6 +5149,12 @@ "util.deprecate": true } }, + "validate-npm-package-license": { + "packages": { + "spdx-correct": true, + "spdx-expression-parse": true + } + }, "vfile": { "builtin": { "path.basename": true, diff --git a/package.json b/package.json index e53f4c07e..5553a9651 100644 --- a/package.json +++ b/package.json @@ -264,6 +264,7 @@ "enzyme-adapter-react-16": "^1.15.1", "eslint": "^7.23.0", "eslint-config-prettier": "^8.1.0", + "eslint-import-resolver-node": "^0.3.4", "eslint-plugin-import": "^2.22.1", "eslint-plugin-jest": "^24.3.4", "eslint-plugin-mocha": "^8.1.0", @@ -277,6 +278,7 @@ "ganache-cli": "^6.12.1", "ganache-core": "^2.13.1", "geckodriver": "^1.21.0", + "globby": "^11.0.4", "gulp": "^4.0.2", "gulp-autoprefixer": "^5.0.0", "gulp-dart-sass": "^1.0.2", diff --git a/patches/@eslint+eslintrc+0.4.0.patch b/patches/@eslint+eslintrc+0.4.0.patch new file mode 100644 index 000000000..c469c7c84 --- /dev/null +++ b/patches/@eslint+eslintrc+0.4.0.patch @@ -0,0 +1,21 @@ +diff --git a/node_modules/@eslint/eslintrc/lib/config-array-factory.js b/node_modules/@eslint/eslintrc/lib/config-array-factory.js +index c7ff6a0..6a88c6d 100644 +--- a/node_modules/@eslint/eslintrc/lib/config-array-factory.js ++++ b/node_modules/@eslint/eslintrc/lib/config-array-factory.js +@@ -41,7 +41,6 @@ + + const fs = require("fs"); + const path = require("path"); +-const importFresh = require("import-fresh"); + const stripComments = require("strip-json-comments"); + const ConfigValidator = require("./shared/config-validator"); + const naming = require("./shared/naming"); +@@ -222,7 +221,7 @@ function loadLegacyConfigFile(filePath) { + function loadJSConfigFile(filePath) { + debug(`Loading JS config file: ${filePath}`); + try { +- return importFresh(filePath); ++ return require(filePath); + } catch (e) { + debug(`Error reading JavaScript file: ${filePath}`); + e.message = `Cannot read config file: ${filePath}\nError: ${e.message}`; diff --git a/patches/eslint+7.23.0.patch b/patches/eslint+7.23.0.patch new file mode 100644 index 000000000..8582fadc6 --- /dev/null +++ b/patches/eslint+7.23.0.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/eslint/lib/linter/linter.js b/node_modules/eslint/lib/linter/linter.js +index adb5c21..4a4be92 100644 +--- a/node_modules/eslint/lib/linter/linter.js ++++ b/node_modules/eslint/lib/linter/linter.js +@@ -560,7 +560,7 @@ function resolveParserOptions(parserName, providedOptions, enabledEnvironments) + */ + function resolveGlobals(providedGlobals, enabledEnvironments) { + return Object.assign( +- {}, ++ Object.create(null), + ...enabledEnvironments.filter(env => env.globals).map(env => env.globals), + providedGlobals + ); diff --git a/patches/object.values+1.1.1.patch b/patches/object.values+1.1.1.patch new file mode 100644 index 000000000..f0323c184 --- /dev/null +++ b/patches/object.values+1.1.1.patch @@ -0,0 +1,23 @@ +diff --git a/node_modules/object.values/index.js b/node_modules/object.values/index.js +index b8ba091..2dc8083 100644 +--- a/node_modules/object.values/index.js ++++ b/node_modules/object.values/index.js +@@ -1,17 +1,3 @@ + 'use strict'; + +-var define = require('define-properties'); +- +-var implementation = require('./implementation'); +-var getPolyfill = require('./polyfill'); +-var shim = require('./shim'); +- +-var polyfill = getPolyfill(); +- +-define(polyfill, { +- getPolyfill: getPolyfill, +- implementation: implementation, +- shim: shim +-}); +- +-module.exports = polyfill; ++module.exports = Object.values; diff --git a/ui/helpers/utils/build-types.js b/ui/helpers/utils/build-types.js index 759466e66..675e0222b 100644 --- a/ui/helpers/utils/build-types.js +++ b/ui/helpers/utils/build-types.js @@ -1,17 +1,25 @@ +///: BEGIN:ONLY_INCLUDE_IN(beta) import betaJson from '../../../app/build-types/beta/beta-mascot.json'; +///: END:ONLY_INCLUDE_IN +///: BEGIN:ONLY_INCLUDE_IN(flask) import flaskJson from '../../../app/build-types/flask/flask-mascot.json'; +///: END:ONLY_INCLUDE_IN const assetList = { main: { // Will use default provided by the @metamask/logo library foxMeshJson: undefined, }, + ///: BEGIN:ONLY_INCLUDE_IN(beta) beta: { foxMeshJson: betaJson, }, + ///: END:ONLY_INCLUDE_IN + ///: BEGIN:ONLY_INCLUDE_IN(flask) flask: { foxMeshJson: flaskJson, }, + ///: END:ONLY_INCLUDE_IN }; export function isBeta() { @@ -26,8 +34,8 @@ export function getBuildSpecificAsset(assetName) { !assetList[buildType] || !Object.keys(assetList[buildType]).includes(assetName) ) { - console.warn( - `Cannot find asset for build ${buildType}: ${assetName}, returning main build asset`, + console.error( + `Cannot find asset "${assetName}" for build "${buildType}", returning main build asset.`, ); return assetList.main[assetName]; } diff --git a/yarn.lock b/yarn.lock index d2ceaa846..4cd6fd695 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14718,7 +14718,7 @@ globby@11.0.1, globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" -globby@^11.0.2, globby@^11.0.3: +globby@^11.0.2, globby@^11.0.3, globby@^11.0.4: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== From 1fa4b5c776e0fddcb1fe2e9b2c2ad42f764b0bd1 Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Tue, 2 Nov 2021 04:54:24 -0230 Subject: [PATCH 33/97] Don't show ledger live option in advanced settings if using firefox (#12494) * Don't show ledger live option in advanced settings if using firefox * Hide ledger transport selector in advanced settings on firefox --- ui/pages/settings/advanced-tab/advanced-tab.component.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ui/pages/settings/advanced-tab/advanced-tab.component.js b/ui/pages/settings/advanced-tab/advanced-tab.component.js index 41027859e..001b51d8b 100644 --- a/ui/pages/settings/advanced-tab/advanced-tab.component.js +++ b/ui/pages/settings/advanced-tab/advanced-tab.component.js @@ -9,6 +9,10 @@ import { MOBILE_SYNC_ROUTE } from '../../../helpers/constants/routes'; import Dropdown from '../../../components/ui/dropdown'; import Dialog from '../../../components/ui/dialog'; +import { getPlatform } from '../../../../app/scripts/lib/util'; + +import { PLATFORM_FIREFOX } from '../../../../shared/constants/app'; + import { LEDGER_TRANSPORT_TYPES, LEDGER_USB_VENDOR_ID, @@ -634,6 +638,8 @@ export default class AdvancedTab extends PureComponent { render() { const { warning } = this.props; + const notUsingFirefox = getPlatform() !== PLATFORM_FIREFOX; + return (
{warning ?
{warning}
: null} @@ -648,7 +654,7 @@ export default class AdvancedTab extends PureComponent { {this.renderAutoLockTimeLimit()} {this.renderThreeBoxControl()} {this.renderIpfsGatewayControl()} - {this.renderLedgerLiveControl()} + {notUsingFirefox ? this.renderLedgerLiveControl() : null} {this.renderDismissSeedBackupReminderControl()}
); From 5560b7c3e5fd77ea80e916ca7dbe7a36e69101ed Mon Sep 17 00:00:00 2001 From: Erik Marks <25517051+rekmarks@users.noreply.github.com> Date: Tue, 2 Nov 2021 01:13:22 -0700 Subject: [PATCH 34/97] Update build system lockdown parameter (#12556) * Update build system lockdown parameter * Add @reduxjs/toolkit patch * Fix Mozilla lint syntax error * Standardize a thing * Remove redundant check for globalThis --- app/scripts/lockdown-more.js | 2 +- development/build/README.md | 8 +- development/build/index.js | 8 +- patches/@reduxjs+toolkit+1.6.2.patch | 4871 ++++++++++++++++++++++++++ 4 files changed, 4880 insertions(+), 9 deletions(-) create mode 100644 patches/@reduxjs+toolkit+1.6.2.patch diff --git a/app/scripts/lockdown-more.js b/app/scripts/lockdown-more.js index 7db50e43f..a1f413eed 100644 --- a/app/scripts/lockdown-more.js +++ b/app/scripts/lockdown-more.js @@ -83,7 +83,7 @@ try { })(); } catch (error) { console.error('Protecting intrinsics failed:', error); - if (globalThis?.sentry.captureException) { + if (globalThis.sentry && globalThis.sentry.captureException) { globalThis.sentry.captureException( new Error(`Protecting intrinsics failed: ${error.message}`), ); diff --git a/development/build/README.md b/development/build/README.md index 0e29f78ec..1218308c9 100644 --- a/development/build/README.md +++ b/development/build/README.md @@ -48,10 +48,10 @@ Options: Defaults to `false` if the entry task is `dev` or `testDev`, and `true` otherwise. [boolean] [default: ] - --omit-lockdown Whether to omit SES lockdown files from the extension - bundle. Useful when linking dependencies that are - incompatible with lockdown. - [boolean] [default: false] + --lockdown Whether to include SES lockdown files in the extension + bundle. Setting this to `false` is useful e.g. when + linking dependencies that are incompatible with lockdown. + [boolean] [default: true] --skip-stats Whether to refrain from logging build progress. Mostly used internally. [boolean] [default: false] diff --git a/development/build/index.js b/development/build/index.js index d96f0706f..7ee92f672 100755 --- a/development/build/index.js +++ b/development/build/index.js @@ -156,21 +156,21 @@ function parseArgv() { const NamedArgs = { BuildType: 'build-type', LintFenceFiles: 'lint-fence-files', - OmitLockdown: 'omit-lockdown', + Lockdown: 'lockdown', SkipStats: 'skip-stats', }; const argv = minimist(process.argv.slice(2), { boolean: [ NamedArgs.LintFenceFiles, - NamedArgs.OmitLockdown, + NamedArgs.Lockdown, NamedArgs.SkipStats, ], string: [NamedArgs.BuildType], default: { [NamedArgs.BuildType]: BuildType.main, [NamedArgs.LintFenceFiles]: true, - [NamedArgs.OmitLockdown]: false, + [NamedArgs.Lockdown]: true, [NamedArgs.SkipStats]: false, }, }); @@ -202,7 +202,7 @@ function parseArgv() { buildType, entryTask, isLavaMoat: process.argv[0].includes('lavamoat'), - shouldIncludeLockdown: argv[NamedArgs.OmitLockdown], + shouldIncludeLockdown: argv[NamedArgs.Lockdown], shouldLintFenceFiles, skipStats: argv[NamedArgs.SkipStats], }; diff --git a/patches/@reduxjs+toolkit+1.6.2.patch b/patches/@reduxjs+toolkit+1.6.2.patch new file mode 100644 index 000000000..e6dafd643 --- /dev/null +++ b/patches/@reduxjs+toolkit+1.6.2.patch @@ -0,0 +1,4871 @@ +diff --git a/node_modules/@reduxjs/toolkit/dist/index.js b/node_modules/@reduxjs/toolkit/dist/index.js +index 6b889a8..8a63cf3 100644 +--- a/node_modules/@reduxjs/toolkit/dist/index.js ++++ b/node_modules/@reduxjs/toolkit/dist/index.js +@@ -1,6 +1,2 @@ + 'use strict' +-if (process.env.NODE_ENV === 'production') { +- module.exports = require('./redux-toolkit.cjs.production.min.js') +-} else { +- module.exports = require('./redux-toolkit.cjs.development.js') +-} +\ No newline at end of file ++module.exports = require('./redux-toolkit.cjs.development.js') +diff --git a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.cjs.development.js b/node_modules/@reduxjs/toolkit/dist/redux-toolkit.cjs.development.js +index 273e028..1fe59e0 100644 +--- a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.cjs.development.js ++++ b/node_modules/@reduxjs/toolkit/dist/redux-toolkit.cjs.development.js +@@ -1,3 +1,13 @@ ++function __define(obj, key, value) { ++ Object.defineProperty(obj, key, { ++ value: value, ++ enumerable: true, ++ configurable: true, ++ writable: true ++ }); ++ return obj[key]; ++ } ++ + var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || +@@ -9,7 +19,7 @@ var __extends = (this && this.__extends) || (function () { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); +- function __() { this.constructor = d; } ++ function __() { __define(this, constructor, d); } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; + })(); +@@ -237,14 +247,14 @@ var MiddlewareArray = /** @class */ (function (_super) { + enumerable: false, + configurable: true + }); +- MiddlewareArray.prototype.concat = function () { ++ __define(MiddlewareArray.prototype, 'concat', function () { + var arr = []; + for (var _i = 0; _i < arguments.length; _i++) { + arr[_i] = arguments[_i]; + } + return _super.prototype.concat.apply(this, arr); +- }; +- MiddlewareArray.prototype.prepend = function () { ++ }); ++ __define(MiddlewareArray.prototype, 'prepend', function () { + var arr = []; + for (var _i = 0; _i < arguments.length; _i++) { + arr[_i] = arguments[_i]; +@@ -253,7 +263,7 @@ var MiddlewareArray = /** @class */ (function (_super) { + return new (MiddlewareArray.bind.apply(MiddlewareArray, __spreadArray([void 0], arr[0].concat(this))))(); + } + return new (MiddlewareArray.bind.apply(MiddlewareArray, __spreadArray([void 0], arr.concat(this))))(); +- }; ++ }); + return MiddlewareArray; + }(Array)); + // src/immutableStateInvariantMiddleware.ts +diff --git a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.cjs.production.min.js b/node_modules/@reduxjs/toolkit/dist/redux-toolkit.cjs.production.min.js +deleted file mode 100644 +index 448c551..0000000 +--- a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.cjs.production.min.js ++++ /dev/null +@@ -1,2 +0,0 @@ +-var e,t=this&&this.__extends||(e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)},function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}),n=this&&this.__generator||function(e,t){var n,r,i,o,u={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;u;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return u.label++,{value:o[1],done:!1};case 5:u.label++,r=o[1],o=[0];continue;case 7:o=u.ops.pop(),u.trys.pop();continue;default:if(!((i=(i=u.trys).length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){u=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]",value:e};if("object"!=typeof e||null===e)return!1;for(var u=null!=r?r(e):Object.entries(e),a=i.length>0,c=0,f=u;c=0)){if(!n(d))return{keyPath:p,value:d};if("object"==typeof d&&(o=C(d,p,n,r,i)))return o}}return!1}function T(e){return void 0===e&&(e={}),function(){return function(e){return function(t){return e(t)}}}}function V(e){void 0===e&&(e={});var t=e.thunk,n=void 0===t||t,r=new M;return n&&r.push("boolean"==typeof n?I.default:I.default.withExtraArgument(n.extraArgument)),r}function N(e){var t,n=function(e){return V(e)},i=e||{},o=i.reducer,u=void 0===o?void 0:o,a=i.middleware,c=void 0===a?n():a,f=i.devTools,l=void 0===f||f,s=i.preloadedState,d=void 0===s?void 0:s,p=i.enhancers,v=void 0===p?void 0:p;if("function"==typeof u)t=u;else{if(!q(u))throw new Error('"reducer" is a required argument, and must be a function or an object of functions that can be passed to combineReducers');t=(0,A.combineReducers)(u)}var h=c;"function"==typeof h&&(h=h(n));var g=A.applyMiddleware.apply(void 0,h),m=A.compose;l&&(m=x(y({trace:!1},"object"==typeof l&&l)));var b=[g];Array.isArray(v)?b=r([g],v):"function"==typeof v&&(b=v(b));var O=m.apply(void 0,b);return(0,A.createStore)(t,d,O)}function z(e,t){function n(){for(var n=[],r=0;r-1}function W(e){return""+e}var X=b(require("immer"));function U(e){var t,n={},r=[],i={addCase:function(e,t){var r="string"==typeof e?e:e.type;if(r in n)throw new Error("addCase cannot be called with two reducers for the same action type");return n[r]=t,i},addMatcher:function(e,t){return r.push({matcher:e,reducer:t}),i},addDefaultCase:function(e){return t=e,i}};return e(i),[n,r,t]}function B(e,t,n,i){void 0===n&&(n=[]);var o="function"==typeof t?U(t):[t,n,i],u=o[0],a=o[1],c=o[2],f=(0,X.default)(e,(function(){}));return function(e,t){void 0===e&&(e=f);var n=r([u[t.type]],a.filter((function(e){return(0,e.matcher)(t)})).map((function(e){return e.reducer})));return 0===n.filter((function(e){return!!e})).length&&(n=[c]),n.reduce((function(e,n){if(n){var r;if((0,X.isDraft)(e))return void 0===(r=n(e,t))?e:r;if((0,X.isDraftable)(e))return(0,X.default)(e,(function(e){return n(e,t)}));if(void 0===(r=n(e,t))){if(null===e)return e;throw Error("A case reducer on a non-draftable value must not return undefined")}return r}return e}),e)}}function F(e){var t=e.name,n=e.initialState;if(!t)throw new Error("`name` is a required option for createSlice");var r=e.reducers||{},i="function"==typeof e.extraReducers?U(e.extraReducers):[e.extraReducers],o=i[0],u=void 0===o?{}:o,a=i[1],c=void 0===a?[]:a,f=i[2],l=void 0===f?void 0:f,s=Object.keys(r),d={},p={},v={};s.forEach((function(e){var n,i,o=r[e],u=t+"/"+e;"reducer"in o?(n=o.reducer,i=o.prepare):n=o,d[e]=n,p[u]=n,v[e]=i?z(u,i):z(u)}));var h=B(n,y(y({},u),p),c,l);return{name:t,reducer:h,actions:v,caseReducers:d}}var G=b(require("immer"));function H(e){return function(t,n){var r=function(t){var r;q(r=n)&&"string"==typeof r.type&&Object.keys(r).every(L)?e(n.payload,t):e(n,t)};return(0,G.isDraft)(t)?(r(t),t):(0,G.default)(t,r)}}function J(e,t){return t(e)}function K(e){return Array.isArray(e)||(e=Object.values(e)),e}function Q(e,t,n){for(var r=[],i=[],o=0,u=e=K(e);o0&&t.filter((function(t){return function(t,n,r){var i=Object.assign({},r.entities[n.id],n.changes),o=J(i,e),u=o!==n.id;return u&&(t[n.id]=o,delete r.entities[n.id]),r.entities[o]=i,u}(r,t,n)})).length>0&&(n.ids=n.ids.map((function(e){return r[e]||e})))}function u(t,r){var i=Q(t,e,r),u=i[0];o(i[1],r),n(u,r)}return{removeAll:(a=function(e){Object.assign(e,{ids:[],entities:{}})},c=H((function(e,t){return a(t)})),function(e){return c(e,void 0)}),addOne:H(t),addMany:H(n),setOne:H(r),setMany:H((function(e,t){for(var n=0,i=e=K(e);n-1;return n&&r}function le(e){return"function"==typeof e[0]&&"pending"in e[0]&&"fulfilled"in e[0]&&"rejected"in e[0]}function se(){for(var e=[],t=0;t {\r\n const selector = (createSelector as any)(...args)\r\n const wrappedSelector = (value: unknown, ...rest: unknown[]) =>\r\n selector(isDraft(value) ? current(value) : value, ...rest)\r\n return wrappedSelector as any\r\n}\r\n","import type {\r\n Reducer,\r\n ReducersMapObject,\r\n Middleware,\r\n Action,\r\n AnyAction,\r\n StoreEnhancer,\r\n Store,\r\n Dispatch,\r\n PreloadedState,\r\n CombinedState,\r\n} from 'redux'\r\nimport { createStore, compose, applyMiddleware, combineReducers } from 'redux'\r\nimport type { EnhancerOptions as DevToolsOptions } from './devtoolsExtension'\r\nimport { composeWithDevTools } from './devtoolsExtension'\r\n\r\nimport isPlainObject from './isPlainObject'\r\nimport type {\r\n ThunkMiddlewareFor,\r\n CurriedGetDefaultMiddleware,\r\n} from './getDefaultMiddleware'\r\nimport { curryGetDefaultMiddleware } from './getDefaultMiddleware'\r\nimport type { DispatchForMiddlewares, NoInfer } from './tsHelpers'\r\n\r\nconst IS_PRODUCTION = process.env.NODE_ENV === 'production'\r\n\r\n/**\r\n * Callback function type, to be used in `ConfigureStoreOptions.enhancers`\r\n *\r\n * @public\r\n */\r\nexport type ConfigureEnhancersCallback = (\r\n defaultEnhancers: readonly StoreEnhancer[]\r\n) => StoreEnhancer[]\r\n\r\n/**\r\n * Options for `configureStore()`.\r\n *\r\n * @public\r\n */\r\nexport interface ConfigureStoreOptions<\r\n S = any,\r\n A extends Action = AnyAction,\r\n M extends Middlewares = Middlewares\r\n> {\r\n /**\r\n * A single reducer function that will be used as the root reducer, or an\r\n * object of slice reducers that will be passed to `combineReducers()`.\r\n */\r\n reducer: Reducer | ReducersMapObject\r\n\r\n /**\r\n * An array of Redux middleware to install. If not supplied, defaults to\r\n * the set of middleware returned by `getDefaultMiddleware()`.\r\n */\r\n middleware?: ((getDefaultMiddleware: CurriedGetDefaultMiddleware) => M) | M\r\n\r\n /**\r\n * Whether to enable Redux DevTools integration. Defaults to `true`.\r\n *\r\n * Additional configuration can be done by passing Redux DevTools options\r\n */\r\n devTools?: boolean | DevToolsOptions\r\n\r\n /**\r\n * The initial state, same as Redux's createStore.\r\n * You may optionally specify it to hydrate the state\r\n * from the server in universal apps, or to restore a previously serialized\r\n * user session. If you use `combineReducers()` to produce the root reducer\r\n * function (either directly or indirectly by passing an object as `reducer`),\r\n * this must be an object with the same shape as the reducer map keys.\r\n */\r\n /* \r\n Not 100% correct but the best approximation we can get:\r\n - if S is a `CombinedState` applying a second `CombinedState` on it does not change anything.\r\n - if it is not, there could be two cases:\r\n - `ReducersMapObject` is being passed in. In this case, we will call `combineReducers` on it and `CombinedState` is correct\r\n - `Reducer` is being passed in. In this case, actually `CombinedState` is wrong and `S` would be correct.\r\n As we cannot distinguish between those two cases without adding another generic paramter, \r\n we just make the pragmatic assumption that the latter almost never happens.\r\n */\r\n preloadedState?: PreloadedState>>\r\n\r\n /**\r\n * The store enhancers to apply. See Redux's `createStore()`.\r\n * All enhancers will be included before the DevTools Extension enhancer.\r\n * If you need to customize the order of enhancers, supply a callback\r\n * function that will receive the original array (ie, `[applyMiddleware]`),\r\n * and should return a new array (such as `[applyMiddleware, offline]`).\r\n * If you only need to add middleware, you can use the `middleware` parameter instead.\r\n */\r\n enhancers?: StoreEnhancer[] | ConfigureEnhancersCallback\r\n}\r\n\r\ntype Middlewares = ReadonlyArray>\r\n\r\n/**\r\n * A Redux store returned by `configureStore()`. Supports dispatching\r\n * side-effectful _thunks_ in addition to plain actions.\r\n *\r\n * @public\r\n */\r\nexport interface EnhancedStore<\r\n S = any,\r\n A extends Action = AnyAction,\r\n M extends Middlewares = Middlewares\r\n> extends Store {\r\n /**\r\n * The `dispatch` method of your store, enhanced by all its middlewares.\r\n *\r\n * @inheritdoc\r\n */\r\n dispatch: DispatchForMiddlewares & Dispatch\r\n}\r\n\r\n/**\r\n * A friendly abstraction over the standard Redux `createStore()` function.\r\n *\r\n * @param config The store configuration.\r\n * @returns A configured Redux store.\r\n *\r\n * @public\r\n */\r\nexport function configureStore<\r\n S = any,\r\n A extends Action = AnyAction,\r\n M extends Middlewares = [ThunkMiddlewareFor]\r\n>(options: ConfigureStoreOptions): EnhancedStore {\r\n const curriedGetDefaultMiddleware = curryGetDefaultMiddleware()\r\n\r\n const {\r\n reducer = undefined,\r\n middleware = curriedGetDefaultMiddleware(),\r\n devTools = true,\r\n preloadedState = undefined,\r\n enhancers = undefined,\r\n } = options || {}\r\n\r\n let rootReducer: Reducer\r\n\r\n if (typeof reducer === 'function') {\r\n rootReducer = reducer\r\n } else if (isPlainObject(reducer)) {\r\n rootReducer = combineReducers(reducer)\r\n } else {\r\n throw new Error(\r\n '\"reducer\" is a required argument, and must be a function or an object of functions that can be passed to combineReducers'\r\n )\r\n }\r\n\r\n let finalMiddleware = middleware\r\n if (typeof finalMiddleware === 'function') {\r\n finalMiddleware = finalMiddleware(curriedGetDefaultMiddleware)\r\n\r\n if (!IS_PRODUCTION && !Array.isArray(finalMiddleware)) {\r\n throw new Error(\r\n 'when using a middleware builder function, an array of middleware must be returned'\r\n )\r\n }\r\n }\r\n if (\r\n !IS_PRODUCTION &&\r\n finalMiddleware.some((item) => typeof item !== 'function')\r\n ) {\r\n throw new Error(\r\n 'each middleware provided to configureStore must be a function'\r\n )\r\n }\r\n\r\n const middlewareEnhancer = applyMiddleware(...finalMiddleware)\r\n\r\n let finalCompose = compose\r\n\r\n if (devTools) {\r\n finalCompose = composeWithDevTools({\r\n // Enable capture of stack traces for dispatched Redux actions\r\n trace: !IS_PRODUCTION,\r\n ...(typeof devTools === 'object' && devTools),\r\n })\r\n }\r\n\r\n let storeEnhancers: StoreEnhancer[] = [middlewareEnhancer]\r\n\r\n if (Array.isArray(enhancers)) {\r\n storeEnhancers = [middlewareEnhancer, ...enhancers]\r\n } else if (typeof enhancers === 'function') {\r\n storeEnhancers = enhancers(storeEnhancers)\r\n }\r\n\r\n const composedEnhancer = finalCompose(...storeEnhancers) as any\r\n\r\n return createStore(rootReducer, preloadedState, composedEnhancer)\r\n}\r\n","import type { Action, ActionCreator, StoreEnhancer } from 'redux'\r\nimport { compose } from 'redux'\r\n\r\n/**\r\n * @public\r\n */\r\nexport interface EnhancerOptions {\r\n /**\r\n * the instance name to be showed on the monitor page. Default value is `document.title`.\r\n * If not specified and there's no document title, it will consist of `tabId` and `instanceId`.\r\n */\r\n name?: string\r\n /**\r\n * action creators functions to be available in the Dispatcher.\r\n */\r\n actionCreators?: ActionCreator[] | { [key: string]: ActionCreator }\r\n /**\r\n * if more than one action is dispatched in the indicated interval, all new actions will be collected and sent at once.\r\n * It is the joint between performance and speed. When set to `0`, all actions will be sent instantly.\r\n * Set it to a higher value when experiencing perf issues (also `maxAge` to a lower value).\r\n *\r\n * @default 500 ms.\r\n */\r\n latency?: number\r\n /**\r\n * (> 1) - maximum allowed actions to be stored in the history tree. The oldest actions are removed once maxAge is reached. It's critical for performance.\r\n *\r\n * @default 50\r\n */\r\n maxAge?: number\r\n /**\r\n * See detailed documentation at http://extension.remotedev.io/docs/API/Arguments.html#serialize\r\n */\r\n serialize?:\r\n | boolean\r\n | {\r\n options?:\r\n | boolean\r\n | {\r\n date?: boolean\r\n regex?: boolean\r\n undefined?: boolean\r\n error?: boolean\r\n symbol?: boolean\r\n map?: boolean\r\n set?: boolean\r\n function?: boolean | Function\r\n }\r\n replacer?: (key: string, value: unknown) => unknown\r\n reviver?: (key: string, value: unknown) => unknown\r\n immutable?: unknown\r\n refs?: unknown[]\r\n }\r\n /**\r\n * function which takes `action` object and id number as arguments, and should return `action` object back.\r\n */\r\n actionSanitizer?: (action: A, id: number) => A\r\n /**\r\n * function which takes `state` object and index as arguments, and should return `state` object back.\r\n */\r\n stateSanitizer?: (state: S, index: number) => S\r\n /**\r\n * *string or array of strings as regex* - actions types to be hidden / shown in the monitors (while passed to the reducers).\r\n * If `actionsWhitelist` specified, `actionsBlacklist` is ignored.\r\n */\r\n actionsBlacklist?: string | string[]\r\n /**\r\n * *string or array of strings as regex* - actions types to be hidden / shown in the monitors (while passed to the reducers).\r\n * If `actionsWhitelist` specified, `actionsBlacklist` is ignored.\r\n */\r\n actionsWhitelist?: string | string[]\r\n /**\r\n * called for every action before sending, takes `state` and `action` object, and returns `true` in case it allows sending the current data to the monitor.\r\n * Use it as a more advanced version of `actionsBlacklist`/`actionsWhitelist` parameters.\r\n */\r\n predicate?: (state: S, action: A) => boolean\r\n /**\r\n * if specified as `false`, it will not record the changes till clicking on `Start recording` button.\r\n * Available only for Redux enhancer, for others use `autoPause`.\r\n *\r\n * @default true\r\n */\r\n shouldRecordChanges?: boolean\r\n /**\r\n * if specified, whenever clicking on `Pause recording` button and there are actions in the history log, will add this action type.\r\n * If not specified, will commit when paused. Available only for Redux enhancer.\r\n *\r\n * @default \"@@PAUSED\"\"\r\n */\r\n pauseActionType?: string\r\n /**\r\n * auto pauses when the extension’s window is not opened, and so has zero impact on your app when not in use.\r\n * Not available for Redux enhancer (as it already does it but storing the data to be sent).\r\n *\r\n * @default false\r\n */\r\n autoPause?: boolean\r\n /**\r\n * if specified as `true`, it will not allow any non-monitor actions to be dispatched till clicking on `Unlock changes` button.\r\n * Available only for Redux enhancer.\r\n *\r\n * @default false\r\n */\r\n shouldStartLocked?: boolean\r\n /**\r\n * if set to `false`, will not recompute the states on hot reloading (or on replacing the reducers). Available only for Redux enhancer.\r\n *\r\n * @default true\r\n */\r\n shouldHotReload?: boolean\r\n /**\r\n * if specified as `true`, whenever there's an exception in reducers, the monitors will show the error message, and next actions will not be dispatched.\r\n *\r\n * @default false\r\n */\r\n shouldCatchErrors?: boolean\r\n /**\r\n * If you want to restrict the extension, specify the features you allow.\r\n * If not specified, all of the features are enabled. When set as an object, only those included as `true` will be allowed.\r\n * Note that except `true`/`false`, `import` and `export` can be set as `custom` (which is by default for Redux enhancer), meaning that the importing/exporting occurs on the client side.\r\n * Otherwise, you'll get/set the data right from the monitor part.\r\n */\r\n features?: {\r\n /**\r\n * start/pause recording of dispatched actions\r\n */\r\n pause?: boolean\r\n /**\r\n * lock/unlock dispatching actions and side effects\r\n */\r\n lock?: boolean\r\n /**\r\n * persist states on page reloading\r\n */\r\n persist?: boolean\r\n /**\r\n * export history of actions in a file\r\n */\r\n export?: boolean | 'custom'\r\n /**\r\n * import history of actions from a file\r\n */\r\n import?: boolean | 'custom'\r\n /**\r\n * jump back and forth (time travelling)\r\n */\r\n jump?: boolean\r\n /**\r\n * skip (cancel) actions\r\n */\r\n skip?: boolean\r\n /**\r\n * drag and drop actions in the history list\r\n */\r\n reorder?: boolean\r\n /**\r\n * dispatch custom actions or action creators\r\n */\r\n dispatch?: boolean\r\n /**\r\n * generate tests for the selected actions\r\n */\r\n test?: boolean\r\n }\r\n /**\r\n * Set to true or a stacktrace-returning function to record call stack traces for dispatched actions.\r\n * Defaults to false.\r\n */\r\n trace?: boolean | ((action: A) => string)\r\n /**\r\n * The maximum number of stack trace entries to record per action. Defaults to 10.\r\n */\r\n traceLimit?: number\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport const composeWithDevTools: {\r\n (options: EnhancerOptions): typeof compose\r\n (...funcs: Array>): StoreEnhancer\r\n} =\r\n typeof window !== 'undefined' &&\r\n (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\r\n ? (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\r\n : function () {\r\n if (arguments.length === 0) return undefined\r\n if (typeof arguments[0] === 'object') return compose\r\n return compose.apply(null, arguments as any as Function[])\r\n }\r\n\r\n/**\r\n * @public\r\n */\r\nexport const devToolsEnhancer: {\r\n (options: EnhancerOptions): StoreEnhancer\r\n} =\r\n typeof window !== 'undefined' && (window as any).__REDUX_DEVTOOLS_EXTENSION__\r\n ? (window as any).__REDUX_DEVTOOLS_EXTENSION__\r\n : function () {\r\n return function (noop) {\r\n return noop\r\n }\r\n }\r\n","/**\r\n * Returns true if the passed value is \"plain\" object, i.e. an object whose\r\n * prototype is the root `Object.prototype`. This includes objects created\r\n * using object literals, but not for instance for class instances.\r\n *\r\n * @param {any} value The value to inspect.\r\n * @returns {boolean} True if the argument appears to be a plain object.\r\n *\r\n * @public\r\n */\r\nexport default function isPlainObject(value: unknown): value is object {\r\n if (typeof value !== 'object' || value === null) return false\r\n\r\n let proto = value\r\n while (Object.getPrototypeOf(proto) !== null) {\r\n proto = Object.getPrototypeOf(proto)\r\n }\r\n\r\n return Object.getPrototypeOf(value) === proto\r\n}\r\n","import type { Middleware, AnyAction } from 'redux'\r\nimport type { ThunkMiddleware } from 'redux-thunk'\r\nimport thunkMiddleware from 'redux-thunk'\r\nimport type { ImmutableStateInvariantMiddlewareOptions } from './immutableStateInvariantMiddleware'\r\n/* PROD_START_REMOVE_UMD */\r\nimport { createImmutableStateInvariantMiddleware } from './immutableStateInvariantMiddleware'\r\n/* PROD_STOP_REMOVE_UMD */\r\n\r\nimport type { SerializableStateInvariantMiddlewareOptions } from './serializableStateInvariantMiddleware'\r\nimport { createSerializableStateInvariantMiddleware } from './serializableStateInvariantMiddleware'\r\nimport { MiddlewareArray } from './utils'\r\n\r\nfunction isBoolean(x: any): x is boolean {\r\n return typeof x === 'boolean'\r\n}\r\n\r\ninterface ThunkOptions {\r\n extraArgument: E\r\n}\r\n\r\ninterface GetDefaultMiddlewareOptions {\r\n thunk?: boolean | ThunkOptions\r\n immutableCheck?: boolean | ImmutableStateInvariantMiddlewareOptions\r\n serializableCheck?: boolean | SerializableStateInvariantMiddlewareOptions\r\n}\r\n\r\nexport type ThunkMiddlewareFor<\r\n S,\r\n O extends GetDefaultMiddlewareOptions = {}\r\n> = O extends {\r\n thunk: false\r\n}\r\n ? never\r\n : O extends { thunk: { extraArgument: infer E } }\r\n ? ThunkMiddleware\r\n :\r\n | ThunkMiddleware //The ThunkMiddleware with a `null` ExtraArgument is here to provide backwards-compatibility.\r\n | ThunkMiddleware\r\n\r\nexport type CurriedGetDefaultMiddleware = <\r\n O extends Partial = {\r\n thunk: true\r\n immutableCheck: true\r\n serializableCheck: true\r\n }\r\n>(\r\n options?: O\r\n) => MiddlewareArray | ThunkMiddlewareFor>\r\n\r\nexport function curryGetDefaultMiddleware<\r\n S = any\r\n>(): CurriedGetDefaultMiddleware {\r\n return function curriedGetDefaultMiddleware(options) {\r\n return getDefaultMiddleware(options)\r\n }\r\n}\r\n\r\n/**\r\n * Returns any array containing the default middleware installed by\r\n * `configureStore()`. Useful if you want to configure your store with a custom\r\n * `middleware` array but still keep the default set.\r\n *\r\n * @return The default middleware used by `configureStore()`.\r\n *\r\n * @public\r\n *\r\n * @deprecated Prefer to use the callback notation for the `middleware` option in `configureStore`\r\n * to access a pre-typed `getDefaultMiddleware` instead.\r\n */\r\nexport function getDefaultMiddleware<\r\n S = any,\r\n O extends Partial = {\r\n thunk: true\r\n immutableCheck: true\r\n serializableCheck: true\r\n }\r\n>(\r\n options: O = {} as O\r\n): MiddlewareArray | ThunkMiddlewareFor> {\r\n const {\r\n thunk = true,\r\n immutableCheck = true,\r\n serializableCheck = true,\r\n } = options\r\n\r\n let middlewareArray: Middleware<{}, S>[] = new MiddlewareArray()\r\n\r\n if (thunk) {\r\n if (isBoolean(thunk)) {\r\n middlewareArray.push(thunkMiddleware)\r\n } else {\r\n middlewareArray.push(\r\n thunkMiddleware.withExtraArgument(thunk.extraArgument)\r\n )\r\n }\r\n }\r\n\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (immutableCheck) {\r\n /* PROD_START_REMOVE_UMD */\r\n let immutableOptions: ImmutableStateInvariantMiddlewareOptions = {}\r\n\r\n if (!isBoolean(immutableCheck)) {\r\n immutableOptions = immutableCheck\r\n }\r\n\r\n middlewareArray.unshift(\r\n createImmutableStateInvariantMiddleware(immutableOptions)\r\n )\r\n /* PROD_STOP_REMOVE_UMD */\r\n }\r\n\r\n if (serializableCheck) {\r\n let serializableOptions: SerializableStateInvariantMiddlewareOptions = {}\r\n\r\n if (!isBoolean(serializableCheck)) {\r\n serializableOptions = serializableCheck\r\n }\r\n\r\n middlewareArray.push(\r\n createSerializableStateInvariantMiddleware(serializableOptions)\r\n )\r\n }\r\n }\r\n\r\n return middlewareArray as any\r\n}\r\n","import type { Middleware } from 'redux'\r\n\r\nexport function getTimeMeasureUtils(maxDelay: number, fnName: string) {\r\n let elapsed = 0\r\n return {\r\n measureTime(fn: () => T): T {\r\n const started = Date.now()\r\n try {\r\n return fn()\r\n } finally {\r\n const finished = Date.now()\r\n elapsed += finished - started\r\n }\r\n },\r\n warnIfExceeded() {\r\n if (elapsed > maxDelay) {\r\n console.warn(`${fnName} took ${elapsed}ms, which is more than the warning threshold of ${maxDelay}ms. \r\nIf your state or actions are very large, you may want to disable the middleware as it might cause too much of a slowdown in development mode. See https://redux-toolkit.js.org/api/getDefaultMiddleware for instructions.\r\nIt is disabled in production builds, so you don't need to worry about that.`)\r\n }\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport class MiddlewareArray<\r\n Middlewares extends Middleware\r\n> extends Array {\r\n constructor(arrayLength?: number)\r\n constructor(...items: Middlewares[])\r\n constructor(...args: any[]) {\r\n super(...args)\r\n Object.setPrototypeOf(this, MiddlewareArray.prototype)\r\n }\r\n\r\n static get [Symbol.species]() {\r\n return MiddlewareArray as any\r\n }\r\n\r\n concat>>(\r\n items: AdditionalMiddlewares\r\n ): MiddlewareArray\r\n\r\n concat>>(\r\n ...items: AdditionalMiddlewares\r\n ): MiddlewareArray\r\n concat(...arr: any[]) {\r\n return super.concat.apply(this, arr)\r\n }\r\n\r\n prepend>>(\r\n items: AdditionalMiddlewares\r\n ): MiddlewareArray\r\n\r\n prepend>>(\r\n ...items: AdditionalMiddlewares\r\n ): MiddlewareArray\r\n\r\n prepend(...arr: any[]) {\r\n if (arr.length === 1 && Array.isArray(arr[0])) {\r\n return new MiddlewareArray(...arr[0].concat(this))\r\n }\r\n return new MiddlewareArray(...arr.concat(this))\r\n }\r\n}\r\n","import type { Middleware } from 'redux'\r\nimport { getTimeMeasureUtils } from './utils'\r\n\r\ntype EntryProcessor = (key: string, value: any) => any\r\n\r\nconst isProduction: boolean = process.env.NODE_ENV === 'production'\r\nconst prefix: string = 'Invariant failed'\r\n\r\n// Throw an error if the condition fails\r\n// Strip out error messages for production\r\n// > Not providing an inline default argument for message as the result is smaller\r\nfunction invariant(condition: any, message?: string) {\r\n if (condition) {\r\n return\r\n }\r\n // Condition not passed\r\n\r\n // In production we strip the message but still throw\r\n if (isProduction) {\r\n throw new Error(prefix)\r\n }\r\n\r\n // When not in production we allow the message to pass through\r\n // *This block will be removed in production builds*\r\n throw new Error(`${prefix}: ${message || ''}`)\r\n}\r\n\r\nfunction stringify(\r\n obj: any,\r\n serializer?: EntryProcessor,\r\n indent?: string | number,\r\n decycler?: EntryProcessor\r\n): string {\r\n return JSON.stringify(obj, getSerialize(serializer, decycler), indent)\r\n}\r\n\r\nfunction getSerialize(\r\n serializer?: EntryProcessor,\r\n decycler?: EntryProcessor\r\n): EntryProcessor {\r\n let stack: any[] = [],\r\n keys: any[] = []\r\n\r\n if (!decycler)\r\n decycler = function (_: string, value: any) {\r\n if (stack[0] === value) return '[Circular ~]'\r\n return (\r\n '[Circular ~.' + keys.slice(0, stack.indexOf(value)).join('.') + ']'\r\n )\r\n }\r\n\r\n return function (this: any, key: string, value: any) {\r\n if (stack.length > 0) {\r\n var thisPos = stack.indexOf(this)\r\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this)\r\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key)\r\n if (~stack.indexOf(value)) value = decycler!.call(this, key, value)\r\n } else stack.push(value)\r\n\r\n return serializer == null ? value : serializer.call(this, key, value)\r\n }\r\n}\r\n\r\n/**\r\n * The default `isImmutable` function.\r\n *\r\n * @public\r\n */\r\nexport function isImmutableDefault(value: unknown): boolean {\r\n return (\r\n typeof value !== 'object' ||\r\n value === null ||\r\n typeof value === 'undefined' ||\r\n Object.isFrozen(value)\r\n )\r\n}\r\n\r\nexport function trackForMutations(\r\n isImmutable: IsImmutableFunc,\r\n ignorePaths: string[] | undefined,\r\n obj: any\r\n) {\r\n const trackedProperties = trackProperties(isImmutable, ignorePaths, obj)\r\n return {\r\n detectMutations() {\r\n return detectMutations(isImmutable, ignorePaths, trackedProperties, obj)\r\n },\r\n }\r\n}\r\n\r\ninterface TrackedProperty {\r\n value: any\r\n children: Record\r\n}\r\n\r\nfunction trackProperties(\r\n isImmutable: IsImmutableFunc,\r\n ignorePaths: IgnorePaths = [],\r\n obj: Record,\r\n path: string = ''\r\n) {\r\n const tracked: Partial = { value: obj }\r\n\r\n if (!isImmutable(obj)) {\r\n tracked.children = {}\r\n\r\n for (const key in obj) {\r\n const childPath = path ? path + '.' + key : key\r\n if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) {\r\n continue\r\n }\r\n\r\n tracked.children[key] = trackProperties(\r\n isImmutable,\r\n ignorePaths,\r\n obj[key],\r\n childPath\r\n )\r\n }\r\n }\r\n return tracked as TrackedProperty\r\n}\r\n\r\ntype IgnorePaths = readonly string[]\r\n\r\nfunction detectMutations(\r\n isImmutable: IsImmutableFunc,\r\n ignorePaths: IgnorePaths = [],\r\n trackedProperty: TrackedProperty,\r\n obj: any,\r\n sameParentRef: boolean = false,\r\n path: string = ''\r\n): { wasMutated: boolean; path?: string } {\r\n const prevObj = trackedProperty ? trackedProperty.value : undefined\r\n\r\n const sameRef = prevObj === obj\r\n\r\n if (sameParentRef && !sameRef && !Number.isNaN(obj)) {\r\n return { wasMutated: true, path }\r\n }\r\n\r\n if (isImmutable(prevObj) || isImmutable(obj)) {\r\n return { wasMutated: false }\r\n }\r\n\r\n // Gather all keys from prev (tracked) and after objs\r\n const keysToDetect: Record = {}\r\n for (let key in trackedProperty.children) {\r\n keysToDetect[key] = true\r\n }\r\n for (let key in obj) {\r\n keysToDetect[key] = true\r\n }\r\n\r\n for (let key in keysToDetect) {\r\n const childPath = path ? path + '.' + key : key\r\n if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) {\r\n continue\r\n }\r\n\r\n const result = detectMutations(\r\n isImmutable,\r\n ignorePaths,\r\n trackedProperty.children[key],\r\n obj[key],\r\n sameRef,\r\n childPath\r\n )\r\n\r\n if (result.wasMutated) {\r\n return result\r\n }\r\n }\r\n return { wasMutated: false }\r\n}\r\n\r\ntype IsImmutableFunc = (value: any) => boolean\r\n\r\n/**\r\n * Options for `createImmutableStateInvariantMiddleware()`.\r\n *\r\n * @public\r\n */\r\nexport interface ImmutableStateInvariantMiddlewareOptions {\r\n /**\r\n Callback function to check if a value is considered to be immutable.\r\n This function is applied recursively to every value contained in the state.\r\n The default implementation will return true for primitive types \r\n (like numbers, strings, booleans, null and undefined).\r\n */\r\n isImmutable?: IsImmutableFunc\r\n /** \r\n An array of dot-separated path strings that match named nodes from \r\n the root state to ignore when checking for immutability.\r\n Defaults to undefined\r\n */\r\n ignoredPaths?: string[]\r\n /** Print a warning if checks take longer than N ms. Default: 32ms */\r\n warnAfter?: number\r\n // @deprecated. Use ignoredPaths\r\n ignore?: string[]\r\n}\r\n\r\n/**\r\n * Creates a middleware that checks whether any state was mutated in between\r\n * dispatches or during a dispatch. If any mutations are detected, an error is\r\n * thrown.\r\n *\r\n * @param options Middleware options.\r\n *\r\n * @public\r\n */\r\nexport function createImmutableStateInvariantMiddleware(\r\n options: ImmutableStateInvariantMiddlewareOptions = {}\r\n): Middleware {\r\n if (process.env.NODE_ENV === 'production') {\r\n return () => (next) => (action) => next(action)\r\n }\r\n\r\n let {\r\n isImmutable = isImmutableDefault,\r\n ignoredPaths,\r\n warnAfter = 32,\r\n ignore,\r\n } = options\r\n\r\n // Alias ignore->ignoredPaths, but prefer ignoredPaths if present\r\n ignoredPaths = ignoredPaths || ignore\r\n\r\n const track = trackForMutations.bind(null, isImmutable, ignoredPaths)\r\n\r\n return ({ getState }) => {\r\n let state = getState()\r\n let tracker = track(state)\r\n\r\n let result\r\n return (next) => (action) => {\r\n const measureUtils = getTimeMeasureUtils(\r\n warnAfter,\r\n 'ImmutableStateInvariantMiddleware'\r\n )\r\n\r\n measureUtils.measureTime(() => {\r\n state = getState()\r\n\r\n result = tracker.detectMutations()\r\n // Track before potentially not meeting the invariant\r\n tracker = track(state)\r\n\r\n invariant(\r\n !result.wasMutated,\r\n `A state mutation was detected between dispatches, in the path '${\r\n result.path || ''\r\n }'. This may cause incorrect behavior. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`\r\n )\r\n })\r\n\r\n const dispatchedAction = next(action)\r\n\r\n measureUtils.measureTime(() => {\r\n state = getState()\r\n\r\n result = tracker.detectMutations()\r\n // Track before potentially not meeting the invariant\r\n tracker = track(state)\r\n\r\n result.wasMutated &&\r\n invariant(\r\n !result.wasMutated,\r\n `A state mutation was detected inside a dispatch, in the path: ${\r\n result.path || ''\r\n }. Take a look at the reducer(s) handling the action ${stringify(\r\n action\r\n )}. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`\r\n )\r\n })\r\n\r\n measureUtils.warnIfExceeded()\r\n\r\n return dispatchedAction\r\n }\r\n }\r\n}\r\n","import isPlainObject from './isPlainObject'\r\nimport type { Middleware } from 'redux'\r\nimport { getTimeMeasureUtils } from './utils'\r\n\r\n/**\r\n * Returns true if the passed value is \"plain\", i.e. a value that is either\r\n * directly JSON-serializable (boolean, number, string, array, plain object)\r\n * or `undefined`.\r\n *\r\n * @param val The value to check.\r\n *\r\n * @public\r\n */\r\nexport function isPlain(val: any) {\r\n const type = typeof val\r\n return (\r\n type === 'undefined' ||\r\n val === null ||\r\n type === 'string' ||\r\n type === 'boolean' ||\r\n type === 'number' ||\r\n Array.isArray(val) ||\r\n isPlainObject(val)\r\n )\r\n}\r\n\r\ninterface NonSerializableValue {\r\n keyPath: string\r\n value: unknown\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport function findNonSerializableValue(\r\n value: unknown,\r\n path: string = '',\r\n isSerializable: (value: unknown) => boolean = isPlain,\r\n getEntries?: (value: unknown) => [string, any][],\r\n ignoredPaths: readonly string[] = []\r\n): NonSerializableValue | false {\r\n let foundNestedSerializable: NonSerializableValue | false\r\n\r\n if (!isSerializable(value)) {\r\n return {\r\n keyPath: path || '',\r\n value: value,\r\n }\r\n }\r\n\r\n if (typeof value !== 'object' || value === null) {\r\n return false\r\n }\r\n\r\n const entries = getEntries != null ? getEntries(value) : Object.entries(value)\r\n\r\n const hasIgnoredPaths = ignoredPaths.length > 0\r\n\r\n for (const [key, nestedValue] of entries) {\r\n const nestedPath = path ? path + '.' + key : key\r\n\r\n if (hasIgnoredPaths && ignoredPaths.indexOf(nestedPath) >= 0) {\r\n continue\r\n }\r\n\r\n if (!isSerializable(nestedValue)) {\r\n return {\r\n keyPath: nestedPath,\r\n value: nestedValue,\r\n }\r\n }\r\n\r\n if (typeof nestedValue === 'object') {\r\n foundNestedSerializable = findNonSerializableValue(\r\n nestedValue,\r\n nestedPath,\r\n isSerializable,\r\n getEntries,\r\n ignoredPaths\r\n )\r\n\r\n if (foundNestedSerializable) {\r\n return foundNestedSerializable\r\n }\r\n }\r\n }\r\n\r\n return false\r\n}\r\n\r\n/**\r\n * Options for `createSerializableStateInvariantMiddleware()`.\r\n *\r\n * @public\r\n */\r\nexport interface SerializableStateInvariantMiddlewareOptions {\r\n /**\r\n * The function to check if a value is considered serializable. This\r\n * function is applied recursively to every value contained in the\r\n * state. Defaults to `isPlain()`.\r\n */\r\n isSerializable?: (value: any) => boolean\r\n /**\r\n * The function that will be used to retrieve entries from each\r\n * value. If unspecified, `Object.entries` will be used. Defaults\r\n * to `undefined`.\r\n */\r\n getEntries?: (value: any) => [string, any][]\r\n\r\n /**\r\n * An array of action types to ignore when checking for serializability.\r\n * Defaults to []\r\n */\r\n ignoredActions?: string[]\r\n\r\n /**\r\n * An array of dot-separated path strings to ignore when checking\r\n * for serializability, Defaults to ['meta.arg']\r\n */\r\n ignoredActionPaths?: string[]\r\n\r\n /**\r\n * An array of dot-separated path strings to ignore when checking\r\n * for serializability, Defaults to []\r\n */\r\n ignoredPaths?: string[]\r\n /**\r\n * Execution time warning threshold. If the middleware takes longer\r\n * than `warnAfter` ms, a warning will be displayed in the console.\r\n * Defaults to 32ms.\r\n */\r\n warnAfter?: number\r\n\r\n /**\r\n * Opt out of checking state, but continue checking actions\r\n */\r\n ignoreState?: boolean\r\n}\r\n\r\n/**\r\n * Creates a middleware that, after every state change, checks if the new\r\n * state is serializable. If a non-serializable value is found within the\r\n * state, an error is printed to the console.\r\n *\r\n * @param options Middleware options.\r\n *\r\n * @public\r\n */\r\nexport function createSerializableStateInvariantMiddleware(\r\n options: SerializableStateInvariantMiddlewareOptions = {}\r\n): Middleware {\r\n if (process.env.NODE_ENV === 'production') {\r\n return () => (next) => (action) => next(action)\r\n }\r\n const {\r\n isSerializable = isPlain,\r\n getEntries,\r\n ignoredActions = [],\r\n ignoredActionPaths = ['meta.arg', 'meta.baseQueryMeta'],\r\n ignoredPaths = [],\r\n warnAfter = 32,\r\n ignoreState = false,\r\n } = options\r\n\r\n return (storeAPI) => (next) => (action) => {\r\n if (ignoredActions.length && ignoredActions.indexOf(action.type) !== -1) {\r\n return next(action)\r\n }\r\n\r\n const measureUtils = getTimeMeasureUtils(\r\n warnAfter,\r\n 'SerializableStateInvariantMiddleware'\r\n )\r\n measureUtils.measureTime(() => {\r\n const foundActionNonSerializableValue = findNonSerializableValue(\r\n action,\r\n '',\r\n isSerializable,\r\n getEntries,\r\n ignoredActionPaths\r\n )\r\n\r\n if (foundActionNonSerializableValue) {\r\n const { keyPath, value } = foundActionNonSerializableValue\r\n\r\n console.error(\r\n `A non-serializable value was detected in an action, in the path: \\`${keyPath}\\`. Value:`,\r\n value,\r\n '\\nTake a look at the logic that dispatched this action: ',\r\n action,\r\n '\\n(See https://redux.js.org/faq/actions#why-should-type-be-a-string-or-at-least-serializable-why-should-my-action-types-be-constants)',\r\n '\\n(To allow non-serializable values see: https://redux-toolkit.js.org/usage/usage-guide#working-with-non-serializable-data)'\r\n )\r\n }\r\n })\r\n\r\n const result = next(action)\r\n\r\n if (!ignoreState) {\r\n measureUtils.measureTime(() => {\r\n const state = storeAPI.getState()\r\n\r\n const foundStateNonSerializableValue = findNonSerializableValue(\r\n state,\r\n '',\r\n isSerializable,\r\n getEntries,\r\n ignoredPaths\r\n )\r\n\r\n if (foundStateNonSerializableValue) {\r\n const { keyPath, value } = foundStateNonSerializableValue\r\n\r\n console.error(\r\n `A non-serializable value was detected in the state, in the path: \\`${keyPath}\\`. Value:`,\r\n value,\r\n `\r\nTake a look at the reducer(s) handling this action type: ${action.type}.\r\n(See https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state)`\r\n )\r\n }\r\n })\r\n\r\n measureUtils.warnIfExceeded()\r\n }\r\n\r\n return result\r\n }\r\n}\r\n","import type { Action } from 'redux'\r\nimport type {\r\n IsUnknownOrNonInferrable,\r\n IfMaybeUndefined,\r\n IfVoid,\r\n IsAny,\r\n} from './tsHelpers'\r\nimport isPlainObject from './isPlainObject'\r\n\r\n/**\r\n * An action with a string type and an associated payload. This is the\r\n * type of action returned by `createAction()` action creators.\r\n *\r\n * @template P The type of the action's payload.\r\n * @template T the type used for the action type.\r\n * @template M The type of the action's meta (optional)\r\n * @template E The type of the action's error (optional)\r\n *\r\n * @public\r\n */\r\nexport type PayloadAction<\r\n P = void,\r\n T extends string = string,\r\n M = never,\r\n E = never\r\n> = {\r\n payload: P\r\n type: T\r\n} & ([M] extends [never]\r\n ? {}\r\n : {\r\n meta: M\r\n }) &\r\n ([E] extends [never]\r\n ? {}\r\n : {\r\n error: E\r\n })\r\n\r\n/**\r\n * A \"prepare\" method to be used as the second parameter of `createAction`.\r\n * Takes any number of arguments and returns a Flux Standard Action without\r\n * type (will be added later) that *must* contain a payload (might be undefined).\r\n *\r\n * @public\r\n */\r\nexport type PrepareAction

=\r\n | ((...args: any[]) => { payload: P })\r\n | ((...args: any[]) => { payload: P; meta: any })\r\n | ((...args: any[]) => { payload: P; error: any })\r\n | ((...args: any[]) => { payload: P; meta: any; error: any })\r\n\r\n/**\r\n * Internal version of `ActionCreatorWithPreparedPayload`. Not to be used externally.\r\n *\r\n * @internal\r\n */\r\nexport type _ActionCreatorWithPreparedPayload<\r\n PA extends PrepareAction | void,\r\n T extends string = string\r\n> = PA extends PrepareAction\r\n ? ActionCreatorWithPreparedPayload<\r\n Parameters,\r\n P,\r\n T,\r\n ReturnType extends {\r\n error: infer E\r\n }\r\n ? E\r\n : never,\r\n ReturnType extends {\r\n meta: infer M\r\n }\r\n ? M\r\n : never\r\n >\r\n : void\r\n\r\n/**\r\n * Basic type for all action creators.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n */\r\ninterface BaseActionCreator {\r\n type: T\r\n match: (action: Action) => action is PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator that takes multiple arguments that are passed\r\n * to a `PrepareAction` method to create the final Action.\r\n * @typeParam Args arguments for the action creator function\r\n * @typeParam P `payload` type\r\n * @typeParam T `type` name\r\n * @typeParam E optional `error` type\r\n * @typeParam M optional `meta` type\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithPreparedPayload<\r\n Args extends unknown[],\r\n P,\r\n T extends string = string,\r\n E = never,\r\n M = never\r\n> extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} with `Args` will return\r\n * an Action with a payload of type `P` and (depending on the `PrepareAction`\r\n * method used) a `meta`- and `error` property of types `M` and `E` respectively.\r\n */\r\n (...args: Args): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator of type `T` that takes an optional payload of type `P`.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithOptionalPayload\r\n extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} with an argument will\r\n * return a {@link PayloadAction} of type `T` with a payload of `P`.\r\n * Calling it without an argument will return a PayloadAction with a payload of `undefined`.\r\n */\r\n (payload?: P): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator of type `T` that takes no payload.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithoutPayload\r\n extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} will\r\n * return a {@link PayloadAction} of type `T` with a payload of `undefined`\r\n */\r\n (): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator of type `T` that requires a payload of type P.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithPayload\r\n extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} with an argument will\r\n * return a {@link PayloadAction} of type `T` with a payload of `P`\r\n */\r\n (payload: P): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator of type `T` whose `payload` type could not be inferred. Accepts everything as `payload`.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithNonInferrablePayload<\r\n T extends string = string\r\n> extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} with an argument will\r\n * return a {@link PayloadAction} of type `T` with a payload\r\n * of exactly the type of the argument.\r\n */\r\n (payload: PT): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator that produces actions with a `payload` attribute.\r\n *\r\n * @typeParam P the `payload` type\r\n * @typeParam T the `type` of the resulting action\r\n * @typeParam PA if the resulting action is preprocessed by a `prepare` method, the signature of said method.\r\n *\r\n * @public\r\n */\r\nexport type PayloadActionCreator<\r\n P = void,\r\n T extends string = string,\r\n PA extends PrepareAction

| void = void\r\n> = IfPrepareActionMethodProvided<\r\n PA,\r\n _ActionCreatorWithPreparedPayload,\r\n // else\r\n IsAny<\r\n P,\r\n ActionCreatorWithPayload,\r\n IsUnknownOrNonInferrable<\r\n P,\r\n ActionCreatorWithNonInferrablePayload,\r\n // else\r\n IfVoid<\r\n P,\r\n ActionCreatorWithoutPayload,\r\n // else\r\n IfMaybeUndefined<\r\n P,\r\n ActionCreatorWithOptionalPayload,\r\n // else\r\n ActionCreatorWithPayload\r\n >\r\n >\r\n >\r\n >\r\n>\r\n\r\n/**\r\n * A utility function to create an action creator for the given action type\r\n * string. The action creator accepts a single argument, which will be included\r\n * in the action object as a field called payload. The action creator function\r\n * will also have its toString() overriden so that it returns the action type,\r\n * allowing it to be used in reducer logic that is looking for that action type.\r\n *\r\n * @param type The action type to use for created actions.\r\n * @param prepare (optional) a method that takes any number of arguments and returns { payload } or { payload, meta }.\r\n * If this is given, the resulting action creator will pass its arguments to this method to calculate payload & meta.\r\n *\r\n * @public\r\n */\r\nexport function createAction

= PayloadActionCreator

\r\n\r\n/**\r\n * The return value of `createSlice`\r\n *\r\n * @public\r\n */\r\nexport interface Slice<\r\n State = any,\r\n CaseReducers extends SliceCaseReducers = SliceCaseReducers,\r\n Name extends string = string\r\n> {\r\n /**\r\n * The slice name.\r\n */\r\n name: Name\r\n\r\n /**\r\n * The slice's reducer.\r\n */\r\n reducer: Reducer\r\n\r\n /**\r\n * Action creators for the types of actions that are handled by the slice\r\n * reducer.\r\n */\r\n actions: CaseReducerActions\r\n\r\n /**\r\n * The individual case reducer functions that were passed in the `reducers` parameter.\r\n * This enables reuse and testing if they were defined inline when calling `createSlice`.\r\n */\r\n caseReducers: SliceDefinedCaseReducers\r\n}\r\n\r\n/**\r\n * Options for `createSlice()`.\r\n *\r\n * @public\r\n */\r\nexport interface CreateSliceOptions<\r\n State = any,\r\n CR extends SliceCaseReducers = SliceCaseReducers,\r\n Name extends string = string\r\n> {\r\n /**\r\n * The slice's name. Used to namespace the generated action types.\r\n */\r\n name: Name\r\n\r\n /**\r\n * The initial state to be returned by the slice reducer.\r\n */\r\n initialState: State\r\n\r\n /**\r\n * A mapping from action types to action-type-specific *case reducer*\r\n * functions. For every action type, a matching action creator will be\r\n * generated using `createAction()`.\r\n */\r\n reducers: ValidateSliceCaseReducers\r\n\r\n /**\r\n * A callback that receives a *builder* object to define\r\n * case reducers via calls to `builder.addCase(actionCreatorOrType, reducer)`.\r\n * \r\n * Alternatively, a mapping from action types to action-type-specific *case reducer*\r\n * functions. These reducers should have existing action types used\r\n * as the keys, and action creators will _not_ be generated.\r\n * \r\n * @example\r\n```ts\r\nimport { createAction, createSlice, Action, AnyAction } from '@reduxjs/toolkit'\r\nconst incrementBy = createAction('incrementBy')\r\nconst decrement = createAction('decrement')\r\n\r\ninterface RejectedAction extends Action {\r\n error: Error\r\n}\r\n\r\nfunction isRejectedAction(action: AnyAction): action is RejectedAction {\r\n return action.type.endsWith('rejected')\r\n}\r\n\r\ncreateSlice({\r\n name: 'counter',\r\n initialState: 0,\r\n reducers: {},\r\n extraReducers: builder => {\r\n builder\r\n .addCase(incrementBy, (state, action) => {\r\n // action is inferred correctly here if using TS\r\n })\r\n // You can chain calls, or have separate `builder.addCase()` lines each time\r\n .addCase(decrement, (state, action) => {})\r\n // You can match a range of action types\r\n .addMatcher(\r\n isRejectedAction,\r\n // `action` will be inferred as a RejectedAction due to isRejectedAction being defined as a type guard\r\n (state, action) => {}\r\n )\r\n // and provide a default case if no other handlers matched\r\n .addDefaultCase((state, action) => {})\r\n }\r\n})\r\n```\r\n */\r\n extraReducers?:\r\n | CaseReducers, any>\r\n | ((builder: ActionReducerMapBuilder>) => void)\r\n}\r\n\r\n/**\r\n * A CaseReducer with a `prepare` method.\r\n *\r\n * @public\r\n */\r\nexport type CaseReducerWithPrepare = {\r\n reducer: CaseReducer\r\n prepare: PrepareAction\r\n}\r\n\r\n/**\r\n * The type describing a slice's `reducers` option.\r\n *\r\n * @public\r\n */\r\nexport type SliceCaseReducers = {\r\n [K: string]:\r\n | CaseReducer>\r\n | CaseReducerWithPrepare>\r\n}\r\n\r\n/**\r\n * Derives the slice's `actions` property from the `reducers` options\r\n *\r\n * @public\r\n */\r\nexport type CaseReducerActions> = {\r\n [Type in keyof CaseReducers]: CaseReducers[Type] extends { prepare: any }\r\n ? ActionCreatorForCaseReducerWithPrepare\r\n : ActionCreatorForCaseReducer\r\n}\r\n\r\n/**\r\n * Get a `PayloadActionCreator` type for a passed `CaseReducerWithPrepare`\r\n *\r\n * @internal\r\n */\r\ntype ActionCreatorForCaseReducerWithPrepare =\r\n _ActionCreatorWithPreparedPayload\r\n\r\n/**\r\n * Get a `PayloadActionCreator` type for a passed `CaseReducer`\r\n *\r\n * @internal\r\n */\r\ntype ActionCreatorForCaseReducer = CR extends (\r\n state: any,\r\n action: infer Action\r\n) => any\r\n ? Action extends { payload: infer P }\r\n ? PayloadActionCreator

\r\n : ActionCreatorWithoutPayload\r\n : ActionCreatorWithoutPayload\r\n\r\n/**\r\n * Extracts the CaseReducers out of a `reducers` object, even if they are\r\n * tested into a `CaseReducerWithPrepare`.\r\n *\r\n * @internal\r\n */\r\ntype SliceDefinedCaseReducers> = {\r\n [Type in keyof CaseReducers]: CaseReducers[Type] extends {\r\n reducer: infer Reducer\r\n }\r\n ? Reducer\r\n : CaseReducers[Type]\r\n}\r\n\r\n/**\r\n * Used on a SliceCaseReducers object.\r\n * Ensures that if a CaseReducer is a `CaseReducerWithPrepare`, that\r\n * the `reducer` and the `prepare` function use the same type of `payload`.\r\n *\r\n * Might do additional such checks in the future.\r\n *\r\n * This type is only ever useful if you want to write your own wrapper around\r\n * `createSlice`. Please don't use it otherwise!\r\n *\r\n * @public\r\n */\r\nexport type ValidateSliceCaseReducers<\r\n S,\r\n ACR extends SliceCaseReducers\r\n> = ACR &\r\n {\r\n [T in keyof ACR]: ACR[T] extends {\r\n reducer(s: S, action?: infer A): any\r\n }\r\n ? {\r\n prepare(...a: never[]): Omit\r\n }\r\n : {}\r\n }\r\n\r\nfunction getType(slice: string, actionKey: string): string {\r\n return `${slice}/${actionKey}`\r\n}\r\n\r\n/**\r\n * A function that accepts an initial state, an object full of reducer\r\n * functions, and a \"slice name\", and automatically generates\r\n * action creators and action types that correspond to the\r\n * reducers and state.\r\n *\r\n * The `reducer` argument is passed to `createReducer()`.\r\n *\r\n * @public\r\n */\r\nexport function createSlice<\r\n State,\r\n CaseReducers extends SliceCaseReducers,\r\n Name extends string = string\r\n>(\r\n options: CreateSliceOptions\r\n): Slice {\r\n const { name, initialState } = options\r\n if (!name) {\r\n throw new Error('`name` is a required option for createSlice')\r\n }\r\n const reducers = options.reducers || {}\r\n const [\r\n extraReducers = {},\r\n actionMatchers = [],\r\n defaultCaseReducer = undefined,\r\n ] =\r\n typeof options.extraReducers === 'function'\r\n ? executeReducerBuilderCallback(options.extraReducers)\r\n : [options.extraReducers]\r\n\r\n const reducerNames = Object.keys(reducers)\r\n\r\n const sliceCaseReducersByName: Record = {}\r\n const sliceCaseReducersByType: Record = {}\r\n const actionCreators: Record = {}\r\n\r\n reducerNames.forEach((reducerName) => {\r\n const maybeReducerWithPrepare = reducers[reducerName]\r\n const type = getType(name, reducerName)\r\n\r\n let caseReducer: CaseReducer\r\n let prepareCallback: PrepareAction | undefined\r\n\r\n if ('reducer' in maybeReducerWithPrepare) {\r\n caseReducer = maybeReducerWithPrepare.reducer\r\n prepareCallback = maybeReducerWithPrepare.prepare\r\n } else {\r\n caseReducer = maybeReducerWithPrepare\r\n }\r\n\r\n sliceCaseReducersByName[reducerName] = caseReducer\r\n sliceCaseReducersByType[type] = caseReducer\r\n actionCreators[reducerName] = prepareCallback\r\n ? createAction(type, prepareCallback)\r\n : createAction(type)\r\n })\r\n\r\n const finalCaseReducers = { ...extraReducers, ...sliceCaseReducersByType }\r\n const reducer = createReducer(\r\n initialState,\r\n finalCaseReducers as any,\r\n actionMatchers,\r\n defaultCaseReducer\r\n )\r\n\r\n return {\r\n name,\r\n reducer,\r\n actions: actionCreators as any,\r\n caseReducers: sliceCaseReducersByName as any,\r\n }\r\n}\r\n","import createNextState, { isDraft } from 'immer'\r\nimport type { EntityState, PreventAny } from './models'\r\nimport type { PayloadAction } from '../createAction'\r\nimport { isFSA } from '../createAction'\r\nimport { IsAny } from '../tsHelpers'\r\n\r\nexport function createSingleArgumentStateOperator(\r\n mutator: (state: EntityState) => void\r\n) {\r\n const operator = createStateOperator((_: undefined, state: EntityState) =>\r\n mutator(state)\r\n )\r\n\r\n return function operation>(\r\n state: PreventAny\r\n ): S {\r\n return operator(state as S, undefined)\r\n }\r\n}\r\n\r\nexport function createStateOperator(\r\n mutator: (arg: R, state: EntityState) => void\r\n) {\r\n return function operation>(\r\n state: S,\r\n arg: R | PayloadAction\r\n ): S {\r\n function isPayloadActionArgument(\r\n arg: R | PayloadAction\r\n ): arg is PayloadAction {\r\n return isFSA(arg)\r\n }\r\n\r\n const runMutator = (draft: EntityState) => {\r\n if (isPayloadActionArgument(arg)) {\r\n mutator(arg.payload, draft)\r\n } else {\r\n mutator(arg, draft)\r\n }\r\n }\r\n\r\n if (isDraft(state)) {\r\n // we must already be inside a `createNextState` call, likely because\r\n // this is being wrapped in `createReducer` or `createSlice`.\r\n // It's safe to just pass the draft to the mutator.\r\n runMutator(state)\r\n\r\n // since it's a draft, we'll just return it\r\n return state\r\n } else {\r\n // @ts-ignore createNextState() produces an Immutable> rather\r\n // than an Immutable, and TypeScript cannot find out how to reconcile\r\n // these two types.\r\n return createNextState(state, runMutator)\r\n }\r\n }\r\n}\r\n","import type { EntityState, IdSelector, Update, EntityId } from './models'\r\n\r\nexport function selectIdValue(entity: T, selectId: IdSelector) {\r\n const key = selectId(entity)\r\n\r\n if (process.env.NODE_ENV !== 'production' && key === undefined) {\r\n console.warn(\r\n 'The entity passed to the `selectId` implementation returned undefined.',\r\n 'You should probably provide your own `selectId` implementation.',\r\n 'The entity that was passed:',\r\n entity,\r\n 'The `selectId` implementation:',\r\n selectId.toString()\r\n )\r\n }\r\n\r\n return key\r\n}\r\n\r\nexport function ensureEntitiesArray(\r\n entities: readonly T[] | Record\r\n): readonly T[] {\r\n if (!Array.isArray(entities)) {\r\n entities = Object.values(entities)\r\n }\r\n\r\n return entities\r\n}\r\n\r\nexport function splitAddedUpdatedEntities(\r\n newEntities: readonly T[] | Record,\r\n selectId: IdSelector,\r\n state: EntityState\r\n): [T[], Update[]] {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n\r\n const added: T[] = []\r\n const updated: Update[] = []\r\n\r\n for (const entity of newEntities) {\r\n const id = selectIdValue(entity, selectId)\r\n if (id in state.entities) {\r\n updated.push({ id, changes: entity })\r\n } else {\r\n added.push(entity)\r\n }\r\n }\r\n return [added, updated]\r\n}\r\n","import type {\r\n EntityState,\r\n EntityStateAdapter,\r\n IdSelector,\r\n Update,\r\n EntityId,\r\n} from './models'\r\nimport {\r\n createStateOperator,\r\n createSingleArgumentStateOperator,\r\n} from './state_adapter'\r\nimport {\r\n selectIdValue,\r\n ensureEntitiesArray,\r\n splitAddedUpdatedEntities,\r\n} from './utils'\r\n\r\nexport function createUnsortedStateAdapter(\r\n selectId: IdSelector\r\n): EntityStateAdapter {\r\n type R = EntityState\r\n\r\n function addOneMutably(entity: T, state: R): void {\r\n const key = selectIdValue(entity, selectId)\r\n\r\n if (key in state.entities) {\r\n return\r\n }\r\n\r\n state.ids.push(key)\r\n state.entities[key] = entity\r\n }\r\n\r\n function addManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n\r\n for (const entity of newEntities) {\r\n addOneMutably(entity, state)\r\n }\r\n }\r\n\r\n function setOneMutably(entity: T, state: R): void {\r\n const key = selectIdValue(entity, selectId)\r\n if (!(key in state.entities)) {\r\n state.ids.push(key)\r\n }\r\n state.entities[key] = entity\r\n }\r\n\r\n function setManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n for (const entity of newEntities) {\r\n setOneMutably(entity, state)\r\n }\r\n }\r\n\r\n function setAllMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n\r\n state.ids = []\r\n state.entities = {}\r\n\r\n addManyMutably(newEntities, state)\r\n }\r\n\r\n function removeOneMutably(key: EntityId, state: R): void {\r\n return removeManyMutably([key], state)\r\n }\r\n\r\n function removeManyMutably(keys: readonly EntityId[], state: R): void {\r\n let didMutate = false\r\n\r\n keys.forEach((key) => {\r\n if (key in state.entities) {\r\n delete state.entities[key]\r\n didMutate = true\r\n }\r\n })\r\n\r\n if (didMutate) {\r\n state.ids = state.ids.filter((id) => id in state.entities)\r\n }\r\n }\r\n\r\n function removeAllMutably(state: R): void {\r\n Object.assign(state, {\r\n ids: [],\r\n entities: {},\r\n })\r\n }\r\n\r\n function takeNewKey(\r\n keys: { [id: string]: EntityId },\r\n update: Update,\r\n state: R\r\n ): boolean {\r\n const original = state.entities[update.id]\r\n const updated: T = Object.assign({}, original, update.changes)\r\n const newKey = selectIdValue(updated, selectId)\r\n const hasNewKey = newKey !== update.id\r\n\r\n if (hasNewKey) {\r\n keys[update.id] = newKey\r\n delete state.entities[update.id]\r\n }\r\n\r\n state.entities[newKey] = updated\r\n\r\n return hasNewKey\r\n }\r\n\r\n function updateOneMutably(update: Update, state: R): void {\r\n return updateManyMutably([update], state)\r\n }\r\n\r\n function updateManyMutably(\r\n updates: ReadonlyArray>,\r\n state: R\r\n ): void {\r\n const newKeys: { [id: string]: EntityId } = {}\r\n\r\n const updatesPerEntity: { [id: string]: Update } = {}\r\n\r\n updates.forEach((update) => {\r\n // Only apply updates to entities that currently exist\r\n if (update.id in state.entities) {\r\n // If there are multiple updates to one entity, merge them together\r\n updatesPerEntity[update.id] = {\r\n id: update.id,\r\n // Spreads ignore falsy values, so this works even if there isn't\r\n // an existing update already at this key\r\n changes: {\r\n ...(updatesPerEntity[update.id]\r\n ? updatesPerEntity[update.id].changes\r\n : null),\r\n ...update.changes,\r\n },\r\n }\r\n }\r\n })\r\n\r\n updates = Object.values(updatesPerEntity)\r\n\r\n const didMutateEntities = updates.length > 0\r\n\r\n if (didMutateEntities) {\r\n const didMutateIds =\r\n updates.filter((update) => takeNewKey(newKeys, update, state)).length >\r\n 0\r\n\r\n if (didMutateIds) {\r\n state.ids = state.ids.map((id) => newKeys[id] || id)\r\n }\r\n }\r\n }\r\n\r\n function upsertOneMutably(entity: T, state: R): void {\r\n return upsertManyMutably([entity], state)\r\n }\r\n\r\n function upsertManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n const [added, updated] = splitAddedUpdatedEntities(\r\n newEntities,\r\n selectId,\r\n state\r\n )\r\n\r\n updateManyMutably(updated, state)\r\n addManyMutably(added, state)\r\n }\r\n\r\n return {\r\n removeAll: createSingleArgumentStateOperator(removeAllMutably),\r\n addOne: createStateOperator(addOneMutably),\r\n addMany: createStateOperator(addManyMutably),\r\n setOne: createStateOperator(setOneMutably),\r\n setMany: createStateOperator(setManyMutably),\r\n setAll: createStateOperator(setAllMutably),\r\n updateOne: createStateOperator(updateOneMutably),\r\n updateMany: createStateOperator(updateManyMutably),\r\n upsertOne: createStateOperator(upsertOneMutably),\r\n upsertMany: createStateOperator(upsertManyMutably),\r\n removeOne: createStateOperator(removeOneMutably),\r\n removeMany: createStateOperator(removeManyMutably),\r\n }\r\n}\r\n","import type {\r\n EntityDefinition,\r\n Comparer,\r\n IdSelector,\r\n EntityAdapter,\r\n} from './models'\r\nimport { createInitialStateFactory } from './entity_state'\r\nimport { createSelectorsFactory } from './state_selectors'\r\nimport { createSortedStateAdapter } from './sorted_state_adapter'\r\nimport { createUnsortedStateAdapter } from './unsorted_state_adapter'\r\n\r\n/**\r\n *\r\n * @param options\r\n *\r\n * @public\r\n */\r\nexport function createEntityAdapter(\r\n options: {\r\n selectId?: IdSelector\r\n sortComparer?: false | Comparer\r\n } = {}\r\n): EntityAdapter {\r\n const { selectId, sortComparer }: EntityDefinition = {\r\n sortComparer: false,\r\n selectId: (instance: any) => instance.id,\r\n ...options,\r\n }\r\n\r\n const stateFactory = createInitialStateFactory()\r\n const selectorsFactory = createSelectorsFactory()\r\n const stateAdapter = sortComparer\r\n ? createSortedStateAdapter(selectId, sortComparer)\r\n : createUnsortedStateAdapter(selectId)\r\n\r\n return {\r\n selectId,\r\n sortComparer,\r\n ...stateFactory,\r\n ...selectorsFactory,\r\n ...stateAdapter,\r\n }\r\n}\r\n","import type { EntityState } from './models'\r\n\r\nexport function getInitialEntityState(): EntityState {\r\n return {\r\n ids: [],\r\n entities: {},\r\n }\r\n}\r\n\r\nexport function createInitialStateFactory() {\r\n function getInitialState(): EntityState\r\n function getInitialState(\r\n additionalState: S\r\n ): EntityState & S\r\n function getInitialState(additionalState: any = {}): any {\r\n return Object.assign(getInitialEntityState(), additionalState)\r\n }\r\n\r\n return { getInitialState }\r\n}\r\n","import { createDraftSafeSelector } from '../createDraftSafeSelector'\r\nimport type {\r\n EntityState,\r\n EntitySelectors,\r\n Dictionary,\r\n EntityId,\r\n} from './models'\r\n\r\nexport function createSelectorsFactory() {\r\n function getSelectors(): EntitySelectors>\r\n function getSelectors(\r\n selectState: (state: V) => EntityState\r\n ): EntitySelectors\r\n function getSelectors(\r\n selectState?: (state: any) => EntityState\r\n ): EntitySelectors {\r\n const selectIds = (state: any) => state.ids\r\n\r\n const selectEntities = (state: EntityState) => state.entities\r\n\r\n const selectAll = createDraftSafeSelector(\r\n selectIds,\r\n selectEntities,\r\n (ids: readonly T[], entities: Dictionary): any =>\r\n ids.map((id: any) => (entities as any)[id])\r\n )\r\n\r\n const selectId = (_: any, id: EntityId) => id\r\n\r\n const selectById = (entities: Dictionary, id: EntityId) => entities[id]\r\n\r\n const selectTotal = createDraftSafeSelector(selectIds, (ids) => ids.length)\r\n\r\n if (!selectState) {\r\n return {\r\n selectIds,\r\n selectEntities,\r\n selectAll,\r\n selectTotal,\r\n selectById: createDraftSafeSelector(\r\n selectEntities,\r\n selectId,\r\n selectById\r\n ),\r\n }\r\n }\r\n\r\n const selectGlobalizedEntities = createDraftSafeSelector(\r\n selectState,\r\n selectEntities\r\n )\r\n\r\n return {\r\n selectIds: createDraftSafeSelector(selectState, selectIds),\r\n selectEntities: selectGlobalizedEntities,\r\n selectAll: createDraftSafeSelector(selectState, selectAll),\r\n selectTotal: createDraftSafeSelector(selectState, selectTotal),\r\n selectById: createDraftSafeSelector(\r\n selectGlobalizedEntities,\r\n selectId,\r\n selectById\r\n ),\r\n }\r\n }\r\n\r\n return { getSelectors }\r\n}\r\n","import type {\r\n EntityState,\r\n IdSelector,\r\n Comparer,\r\n EntityStateAdapter,\r\n Update,\r\n EntityId,\r\n} from './models'\r\nimport { createStateOperator } from './state_adapter'\r\nimport { createUnsortedStateAdapter } from './unsorted_state_adapter'\r\nimport {\r\n selectIdValue,\r\n ensureEntitiesArray,\r\n splitAddedUpdatedEntities,\r\n} from './utils'\r\n\r\nexport function createSortedStateAdapter(\r\n selectId: IdSelector,\r\n sort: Comparer\r\n): EntityStateAdapter {\r\n type R = EntityState\r\n\r\n const { removeOne, removeMany, removeAll } =\r\n createUnsortedStateAdapter(selectId)\r\n\r\n function addOneMutably(entity: T, state: R): void {\r\n return addManyMutably([entity], state)\r\n }\r\n\r\n function addManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n\r\n const models = newEntities.filter(\r\n (model) => !(selectIdValue(model, selectId) in state.entities)\r\n )\r\n\r\n if (models.length !== 0) {\r\n merge(models, state)\r\n }\r\n }\r\n\r\n function setOneMutably(entity: T, state: R): void {\r\n return setManyMutably([entity], state)\r\n }\r\n\r\n function setManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n if (newEntities.length !== 0) {\r\n merge(newEntities, state)\r\n }\r\n }\r\n\r\n function setAllMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n state.entities = {}\r\n state.ids = []\r\n\r\n addManyMutably(newEntities, state)\r\n }\r\n\r\n function updateOneMutably(update: Update, state: R): void {\r\n return updateManyMutably([update], state)\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\r\n function takeUpdatedModel(models: T[], update: Update, state: R): boolean {\r\n if (!(update.id in state.entities)) {\r\n return false\r\n }\r\n\r\n const original = state.entities[update.id]\r\n const updated = Object.assign({}, original, update.changes)\r\n const newKey = selectIdValue(updated, selectId)\r\n\r\n delete state.entities[update.id]\r\n\r\n models.push(updated)\r\n\r\n return newKey !== update.id\r\n }\r\n\r\n function updateManyMutably(\r\n updates: ReadonlyArray>,\r\n state: R\r\n ): void {\r\n const models: T[] = []\r\n\r\n updates.forEach((update) => takeUpdatedModel(models, update, state))\r\n\r\n if (models.length !== 0) {\r\n merge(models, state)\r\n }\r\n }\r\n\r\n function upsertOneMutably(entity: T, state: R): void {\r\n return upsertManyMutably([entity], state)\r\n }\r\n\r\n function upsertManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n const [added, updated] = splitAddedUpdatedEntities(\r\n newEntities,\r\n selectId,\r\n state\r\n )\r\n\r\n updateManyMutably(updated, state)\r\n addManyMutably(added, state)\r\n }\r\n\r\n function areArraysEqual(a: readonly unknown[], b: readonly unknown[]) {\r\n if (a.length !== b.length) {\r\n return false\r\n }\r\n\r\n for (let i = 0; i < a.length && i < b.length; i++) {\r\n if (a[i] === b[i]) {\r\n continue\r\n }\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n function merge(models: readonly T[], state: R): void {\r\n // Insert/overwrite all new/updated\r\n models.forEach((model) => {\r\n state.entities[selectId(model)] = model\r\n })\r\n\r\n const allEntities = Object.values(state.entities) as T[]\r\n allEntities.sort(sort)\r\n\r\n const newSortedIds = allEntities.map(selectId)\r\n const { ids } = state\r\n\r\n if (!areArraysEqual(ids, newSortedIds)) {\r\n state.ids = newSortedIds\r\n }\r\n }\r\n\r\n return {\r\n removeOne,\r\n removeMany,\r\n removeAll,\r\n addOne: createStateOperator(addOneMutably),\r\n updateOne: createStateOperator(updateOneMutably),\r\n upsertOne: createStateOperator(upsertOneMutably),\r\n setOne: createStateOperator(setOneMutably),\r\n setMany: createStateOperator(setManyMutably),\r\n setAll: createStateOperator(setAllMutably),\r\n addMany: createStateOperator(addManyMutably),\r\n updateMany: createStateOperator(updateManyMutably),\r\n upsertMany: createStateOperator(upsertManyMutably),\r\n }\r\n}\r\n","// Borrowed from https://github.com/ai/nanoid/blob/3.0.2/non-secure/index.js\r\n// This alphabet uses `A-Za-z0-9_-` symbols. A genetic algorithm helped\r\n// optimize the gzip compression for this alphabet.\r\nlet urlAlphabet =\r\n 'ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW'\r\n\r\n/**\r\n *\r\n * @public\r\n */\r\nexport let nanoid = (size = 21) => {\r\n let id = ''\r\n // A compact alternative for `for (var i = 0; i < step; i++)`.\r\n let i = size\r\n while (i--) {\r\n // `| 0` is more compact and faster than `Math.floor()`.\r\n id += urlAlphabet[(Math.random() * 64) | 0]\r\n }\r\n return id\r\n}\r\n","import type { Dispatch, AnyAction } from 'redux'\r\nimport type {\r\n PayloadAction,\r\n ActionCreatorWithPreparedPayload,\r\n} from './createAction'\r\nimport { createAction } from './createAction'\r\nimport type { ThunkDispatch } from 'redux-thunk'\r\nimport type { FallbackIfUnknown, IsAny, IsUnknown } from './tsHelpers'\r\nimport { nanoid } from './nanoid'\r\n\r\n// @ts-ignore we need the import of these types due to a bundling issue.\r\ntype _Keep = PayloadAction | ActionCreatorWithPreparedPayload\r\n\r\nexport type BaseThunkAPI<\r\n S,\r\n E,\r\n D extends Dispatch = Dispatch,\r\n RejectedValue = undefined,\r\n RejectedMeta = unknown,\r\n FulfilledMeta = unknown\r\n> = {\r\n dispatch: D\r\n getState: () => S\r\n extra: E\r\n requestId: string\r\n signal: AbortSignal\r\n rejectWithValue: IsUnknown<\r\n RejectedMeta,\r\n (value: RejectedValue) => RejectWithValue,\r\n (\r\n value: RejectedValue,\r\n meta: RejectedMeta\r\n ) => RejectWithValue\r\n >\r\n fulfillWithValue: IsUnknown<\r\n FulfilledMeta,\r\n (\r\n value: FulfilledValue\r\n ) => FulfillWithMeta,\r\n (\r\n value: FulfilledValue,\r\n meta: FulfilledMeta\r\n ) => FulfillWithMeta\r\n >\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport interface SerializedError {\r\n name?: string\r\n message?: string\r\n stack?: string\r\n code?: string\r\n}\r\n\r\nconst commonProperties: Array = [\r\n 'name',\r\n 'message',\r\n 'stack',\r\n 'code',\r\n]\r\n\r\nclass RejectWithValue {\r\n /*\r\n type-only property to distinguish between RejectWithValue and FulfillWithMeta\r\n does not exist at runtime\r\n */\r\n private readonly _type!: 'RejectWithValue'\r\n constructor(\r\n public readonly payload: Payload,\r\n public readonly meta: RejectedMeta\r\n ) {}\r\n}\r\n\r\nclass FulfillWithMeta {\r\n /*\r\n type-only property to distinguish between RejectWithValue and FulfillWithMeta\r\n does not exist at runtime\r\n */\r\n private readonly _type!: 'FulfillWithMeta'\r\n constructor(\r\n public readonly payload: Payload,\r\n public readonly meta: FulfilledMeta\r\n ) {}\r\n}\r\n\r\n/**\r\n * Serializes an error into a plain object.\r\n * Reworked from https://github.com/sindresorhus/serialize-error\r\n *\r\n * @public\r\n */\r\nexport const miniSerializeError = (value: any): SerializedError => {\r\n if (typeof value === 'object' && value !== null) {\r\n const simpleError: SerializedError = {}\r\n for (const property of commonProperties) {\r\n if (typeof value[property] === 'string') {\r\n simpleError[property] = value[property]\r\n }\r\n }\r\n\r\n return simpleError\r\n }\r\n\r\n return { message: String(value) }\r\n}\r\n\r\ntype AsyncThunkConfig = {\r\n state?: unknown\r\n dispatch?: Dispatch\r\n extra?: unknown\r\n rejectValue?: unknown\r\n serializedErrorType?: unknown\r\n pendingMeta?: unknown\r\n fulfilledMeta?: unknown\r\n rejectedMeta?: unknown\r\n}\r\n\r\ntype GetState = ThunkApiConfig extends {\r\n state: infer State\r\n}\r\n ? State\r\n : unknown\r\ntype GetExtra = ThunkApiConfig extends { extra: infer Extra }\r\n ? Extra\r\n : unknown\r\ntype GetDispatch = ThunkApiConfig extends {\r\n dispatch: infer Dispatch\r\n}\r\n ? FallbackIfUnknown<\r\n Dispatch,\r\n ThunkDispatch<\r\n GetState,\r\n GetExtra,\r\n AnyAction\r\n >\r\n >\r\n : ThunkDispatch, GetExtra, AnyAction>\r\n\r\ntype GetThunkAPI = BaseThunkAPI<\r\n GetState,\r\n GetExtra,\r\n GetDispatch,\r\n GetRejectValue,\r\n GetRejectedMeta,\r\n GetFulfilledMeta\r\n>\r\n\r\ntype GetRejectValue = ThunkApiConfig extends {\r\n rejectValue: infer RejectValue\r\n}\r\n ? RejectValue\r\n : unknown\r\n\r\ntype GetPendingMeta = ThunkApiConfig extends {\r\n pendingMeta: infer PendingMeta\r\n}\r\n ? PendingMeta\r\n : unknown\r\n\r\ntype GetFulfilledMeta = ThunkApiConfig extends {\r\n fulfilledMeta: infer FulfilledMeta\r\n}\r\n ? FulfilledMeta\r\n : unknown\r\n\r\ntype GetRejectedMeta = ThunkApiConfig extends {\r\n rejectedMeta: infer RejectedMeta\r\n}\r\n ? RejectedMeta\r\n : unknown\r\n\r\ntype GetSerializedErrorType = ThunkApiConfig extends {\r\n serializedErrorType: infer GetSerializedErrorType\r\n}\r\n ? GetSerializedErrorType\r\n : SerializedError\r\n\r\ntype MaybePromise = T | Promise | (T extends any ? Promise : never)\r\n\r\n/**\r\n * A type describing the return value of the `payloadCreator` argument to `createAsyncThunk`.\r\n * Might be useful for wrapping `createAsyncThunk` in custom abstractions.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunkPayloadCreatorReturnValue<\r\n Returned,\r\n ThunkApiConfig extends AsyncThunkConfig\r\n> = MaybePromise<\r\n | IsUnknown<\r\n GetFulfilledMeta,\r\n Returned,\r\n FulfillWithMeta>\r\n >\r\n | RejectWithValue<\r\n GetRejectValue,\r\n GetRejectedMeta\r\n >\r\n>\r\n/**\r\n * A type describing the `payloadCreator` argument to `createAsyncThunk`.\r\n * Might be useful for wrapping `createAsyncThunk` in custom abstractions.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunkPayloadCreator<\r\n Returned,\r\n ThunkArg = void,\r\n ThunkApiConfig extends AsyncThunkConfig = {}\r\n> = (\r\n arg: ThunkArg,\r\n thunkAPI: GetThunkAPI\r\n) => AsyncThunkPayloadCreatorReturnValue\r\n\r\n/**\r\n * A ThunkAction created by `createAsyncThunk`.\r\n * Dispatching it returns a Promise for either a\r\n * fulfilled or rejected action.\r\n * Also, the returned value contains an `abort()` method\r\n * that allows the asyncAction to be cancelled from the outside.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunkAction<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig extends AsyncThunkConfig\r\n> = (\r\n dispatch: GetDispatch,\r\n getState: () => GetState,\r\n extra: GetExtra\r\n) => Promise<\r\n | ReturnType>\r\n | ReturnType>\r\n> & {\r\n abort: (reason?: string) => void\r\n requestId: string\r\n arg: ThunkArg\r\n unwrap: () => Promise\r\n}\r\n\r\ntype AsyncThunkActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig extends AsyncThunkConfig\r\n> = IsAny<\r\n ThunkArg,\r\n // any handling\r\n (arg: ThunkArg) => AsyncThunkAction,\r\n // unknown handling\r\n unknown extends ThunkArg\r\n ? (arg: ThunkArg) => AsyncThunkAction // argument not specified or specified as void or undefined\r\n : [ThunkArg] extends [void] | [undefined]\r\n ? () => AsyncThunkAction // argument contains void\r\n : [void] extends [ThunkArg] // make optional\r\n ? (arg?: ThunkArg) => AsyncThunkAction // argument contains undefined\r\n : [undefined] extends [ThunkArg]\r\n ? WithStrictNullChecks<\r\n // with strict nullChecks: make optional\r\n (\r\n arg?: ThunkArg\r\n ) => AsyncThunkAction,\r\n // without strict null checks this will match everything, so don't make it optional\r\n (arg: ThunkArg) => AsyncThunkAction\r\n > // default case: normal argument\r\n : (arg: ThunkArg) => AsyncThunkAction\r\n>\r\n\r\n/**\r\n * Options object for `createAsyncThunk`.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunkOptions<\r\n ThunkArg = void,\r\n ThunkApiConfig extends AsyncThunkConfig = {}\r\n> = {\r\n /**\r\n * A method to control whether the asyncThunk should be executed. Has access to the\r\n * `arg`, `api.getState()` and `api.extra` arguments.\r\n *\r\n * @returns `false` if it should be skipped\r\n */\r\n condition?(\r\n arg: ThunkArg,\r\n api: Pick, 'getState' | 'extra'>\r\n ): boolean | undefined\r\n /**\r\n * If `condition` returns `false`, the asyncThunk will be skipped.\r\n * This option allows you to control whether a `rejected` action with `meta.condition == false`\r\n * will be dispatched or not.\r\n *\r\n * @default `false`\r\n */\r\n dispatchConditionRejection?: boolean\r\n\r\n serializeError?: (x: unknown) => GetSerializedErrorType\r\n\r\n /**\r\n * A function to use when generating the `requestId` for the request sequence.\r\n *\r\n * @default `nanoid`\r\n */\r\n idGenerator?: () => string\r\n} & IsUnknown<\r\n GetPendingMeta,\r\n {\r\n /**\r\n * A method to generate additional properties to be added to `meta` of the pending action.\r\n *\r\n * Using this optional overload will not modify the types correctly, this overload is only in place to support JavaScript users.\r\n * Please use the `ThunkApiConfig` parameter `pendingMeta` to get access to a correctly typed overload\r\n */\r\n getPendingMeta?(\r\n base: {\r\n arg: ThunkArg\r\n requestId: string\r\n },\r\n api: Pick, 'getState' | 'extra'>\r\n ): GetPendingMeta\r\n },\r\n {\r\n /**\r\n * A method to generate additional properties to be added to `meta` of the pending action.\r\n */\r\n getPendingMeta(\r\n base: {\r\n arg: ThunkArg\r\n requestId: string\r\n },\r\n api: Pick, 'getState' | 'extra'>\r\n ): GetPendingMeta\r\n }\r\n>\r\n\r\nexport type AsyncThunkPendingActionCreator<\r\n ThunkArg,\r\n ThunkApiConfig = {}\r\n> = ActionCreatorWithPreparedPayload<\r\n [string, ThunkArg, GetPendingMeta?],\r\n undefined,\r\n string,\r\n never,\r\n {\r\n arg: ThunkArg\r\n requestId: string\r\n requestStatus: 'pending'\r\n } & GetPendingMeta\r\n>\r\n\r\nexport type AsyncThunkRejectedActionCreator<\r\n ThunkArg,\r\n ThunkApiConfig = {}\r\n> = ActionCreatorWithPreparedPayload<\r\n [\r\n Error | null,\r\n string,\r\n ThunkArg,\r\n GetRejectValue?,\r\n GetRejectedMeta?\r\n ],\r\n GetRejectValue | undefined,\r\n string,\r\n GetSerializedErrorType,\r\n {\r\n arg: ThunkArg\r\n requestId: string\r\n requestStatus: 'rejected'\r\n aborted: boolean\r\n condition: boolean\r\n } & (\r\n | ({ rejectedWithValue: false } & {\r\n [K in keyof GetRejectedMeta]?: undefined\r\n })\r\n | ({ rejectedWithValue: true } & GetRejectedMeta)\r\n )\r\n>\r\n\r\nexport type AsyncThunkFulfilledActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig = {}\r\n> = ActionCreatorWithPreparedPayload<\r\n [Returned, string, ThunkArg, GetFulfilledMeta?],\r\n Returned,\r\n string,\r\n never,\r\n {\r\n arg: ThunkArg\r\n requestId: string\r\n requestStatus: 'fulfilled'\r\n } & GetFulfilledMeta\r\n>\r\n\r\n/**\r\n * A type describing the return value of `createAsyncThunk`.\r\n * Might be useful for wrapping `createAsyncThunk` in custom abstractions.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunk<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig extends AsyncThunkConfig\r\n> = AsyncThunkActionCreator & {\r\n pending: AsyncThunkPendingActionCreator\r\n rejected: AsyncThunkRejectedActionCreator\r\n fulfilled: AsyncThunkFulfilledActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig\r\n >\r\n typePrefix: string\r\n}\r\n\r\n/**\r\n *\r\n * @param typePrefix\r\n * @param payloadCreator\r\n * @param options\r\n *\r\n * @public\r\n */\r\nexport function createAsyncThunk<\r\n Returned,\r\n ThunkArg = void,\r\n ThunkApiConfig extends AsyncThunkConfig = {}\r\n>(\r\n typePrefix: string,\r\n payloadCreator: AsyncThunkPayloadCreator,\r\n options?: AsyncThunkOptions\r\n): AsyncThunk {\r\n type RejectedValue = GetRejectValue\r\n type PendingMeta = GetPendingMeta\r\n type FulfilledMeta = GetFulfilledMeta\r\n type RejectedMeta = GetRejectedMeta\r\n\r\n const fulfilled: AsyncThunkFulfilledActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig\r\n > = createAction(\r\n typePrefix + '/fulfilled',\r\n (\r\n payload: Returned,\r\n requestId: string,\r\n arg: ThunkArg,\r\n meta?: FulfilledMeta\r\n ) => ({\r\n payload,\r\n meta: {\r\n ...((meta as any) || {}),\r\n arg,\r\n requestId,\r\n requestStatus: 'fulfilled' as const,\r\n },\r\n })\r\n )\r\n\r\n const pending: AsyncThunkPendingActionCreator =\r\n createAction(\r\n typePrefix + '/pending',\r\n (requestId: string, arg: ThunkArg, meta?: PendingMeta) => ({\r\n payload: undefined,\r\n meta: {\r\n ...((meta as any) || {}),\r\n arg,\r\n requestId,\r\n requestStatus: 'pending' as const,\r\n },\r\n })\r\n )\r\n\r\n const rejected: AsyncThunkRejectedActionCreator =\r\n createAction(\r\n typePrefix + '/rejected',\r\n (\r\n error: Error | null,\r\n requestId: string,\r\n arg: ThunkArg,\r\n payload?: RejectedValue,\r\n meta?: RejectedMeta\r\n ) => ({\r\n payload,\r\n error: ((options && options.serializeError) || miniSerializeError)(\r\n error || 'Rejected'\r\n ) as GetSerializedErrorType,\r\n meta: {\r\n ...((meta as any) || {}),\r\n arg,\r\n requestId,\r\n rejectedWithValue: !!payload,\r\n requestStatus: 'rejected' as const,\r\n aborted: error?.name === 'AbortError',\r\n condition: error?.name === 'ConditionError',\r\n },\r\n })\r\n )\r\n\r\n let displayedWarning = false\r\n\r\n const AC =\r\n typeof AbortController !== 'undefined'\r\n ? AbortController\r\n : class implements AbortController {\r\n signal: AbortSignal = {\r\n aborted: false,\r\n addEventListener() {},\r\n dispatchEvent() {\r\n return false\r\n },\r\n onabort() {},\r\n removeEventListener() {},\r\n }\r\n abort() {\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (!displayedWarning) {\r\n displayedWarning = true\r\n console.info(\r\n `This platform does not implement AbortController. \r\nIf you want to use the AbortController to react to \\`abort\\` events, please consider importing a polyfill like 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only'.`\r\n )\r\n }\r\n }\r\n }\r\n }\r\n\r\n function actionCreator(\r\n arg: ThunkArg\r\n ): AsyncThunkAction {\r\n return (dispatch, getState, extra) => {\r\n const requestId = (options?.idGenerator ?? nanoid)()\r\n\r\n const abortController = new AC()\r\n let abortReason: string | undefined\r\n\r\n const abortedPromise = new Promise((_, reject) =>\r\n abortController.signal.addEventListener('abort', () =>\r\n reject({ name: 'AbortError', message: abortReason || 'Aborted' })\r\n )\r\n )\r\n\r\n let started = false\r\n function abort(reason?: string) {\r\n if (started) {\r\n abortReason = reason\r\n abortController.abort()\r\n }\r\n }\r\n\r\n const promise = (async function () {\r\n let finalAction: ReturnType\r\n try {\r\n if (\r\n options &&\r\n options.condition &&\r\n options.condition(arg, { getState, extra }) === false\r\n ) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw {\r\n name: 'ConditionError',\r\n message: 'Aborted due to condition callback returning false.',\r\n }\r\n }\r\n started = true\r\n dispatch(\r\n pending(\r\n requestId,\r\n arg,\r\n options?.getPendingMeta?.({ requestId, arg }, { getState, extra })\r\n )\r\n )\r\n finalAction = await Promise.race([\r\n abortedPromise,\r\n Promise.resolve(\r\n payloadCreator(arg, {\r\n dispatch,\r\n getState,\r\n extra,\r\n requestId,\r\n signal: abortController.signal,\r\n rejectWithValue: ((\r\n value: RejectedValue,\r\n meta?: RejectedMeta\r\n ) => {\r\n return new RejectWithValue(value, meta)\r\n }) as any,\r\n fulfillWithValue: ((value: unknown, meta?: FulfilledMeta) => {\r\n return new FulfillWithMeta(value, meta)\r\n }) as any,\r\n })\r\n ).then((result) => {\r\n if (result instanceof RejectWithValue) {\r\n throw result\r\n }\r\n if (result instanceof FulfillWithMeta) {\r\n return fulfilled(result.payload, requestId, arg, result.meta)\r\n }\r\n return fulfilled(result as any, requestId, arg)\r\n }),\r\n ])\r\n } catch (err) {\r\n finalAction =\r\n err instanceof RejectWithValue\r\n ? rejected(null, requestId, arg, err.payload, err.meta)\r\n : rejected(err as any, requestId, arg)\r\n }\r\n // We dispatch the result action _after_ the catch, to avoid having any errors\r\n // here get swallowed by the try/catch block,\r\n // per https://twitter.com/dan_abramov/status/770914221638942720\r\n // and https://github.com/reduxjs/redux-toolkit/blob/e85eb17b39a2118d859f7b7746e0f3fee523e089/docs/tutorials/advanced-tutorial.md#async-error-handling-logic-in-thunks\r\n\r\n const skipDispatch =\r\n options &&\r\n !options.dispatchConditionRejection &&\r\n rejected.match(finalAction) &&\r\n (finalAction as any).meta.condition\r\n\r\n if (!skipDispatch) {\r\n dispatch(finalAction)\r\n }\r\n return finalAction\r\n })()\r\n return Object.assign(promise as Promise, {\r\n abort,\r\n requestId,\r\n arg,\r\n unwrap() {\r\n return promise.then(unwrapResult)\r\n },\r\n })\r\n }\r\n }\r\n\r\n return Object.assign(\r\n actionCreator as AsyncThunkActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig\r\n >,\r\n {\r\n pending,\r\n rejected,\r\n fulfilled,\r\n typePrefix,\r\n }\r\n )\r\n}\r\n\r\ninterface UnwrappableAction {\r\n payload: any\r\n meta?: any\r\n error?: any\r\n}\r\n\r\ntype UnwrappedActionPayload = Exclude<\r\n T,\r\n { error: any }\r\n>['payload']\r\n\r\n/**\r\n * @public\r\n */\r\nexport function unwrapResult(\r\n action: R\r\n): UnwrappedActionPayload {\r\n if (action.meta && action.meta.rejectedWithValue) {\r\n throw action.payload\r\n }\r\n if (action.error) {\r\n throw action.error\r\n }\r\n return action.payload\r\n}\r\n\r\ntype WithStrictNullChecks = undefined extends boolean\r\n ? False\r\n : True\r\n","import type { Middleware } from 'redux'\r\n\r\n/**\r\n * return True if T is `any`, otherwise return False\r\n * taken from https://github.com/joonhocho/tsdef\r\n *\r\n * @internal\r\n */\r\nexport type IsAny =\r\n // test if we are going the left AND right path in the condition\r\n true | false extends (T extends never ? true : false) ? True : False\r\n\r\n/**\r\n * return True if T is `unknown`, otherwise return False\r\n * taken from https://github.com/joonhocho/tsdef\r\n *\r\n * @internal\r\n */\r\nexport type IsUnknown = unknown extends T\r\n ? IsAny\r\n : False\r\n\r\nexport type FallbackIfUnknown = IsUnknown\r\n\r\n/**\r\n * @internal\r\n */\r\nexport type IfMaybeUndefined = [undefined] extends [P]\r\n ? True\r\n : False\r\n\r\n/**\r\n * @internal\r\n */\r\nexport type IfVoid = [void] extends [P] ? True : False\r\n\r\n/**\r\n * @internal\r\n */\r\nexport type IsEmptyObj = T extends any\r\n ? keyof T extends never\r\n ? IsUnknown>>\r\n : False\r\n : never\r\n\r\n/**\r\n * returns True if TS version is above 3.5, False if below.\r\n * uses feature detection to detect TS version >= 3.5\r\n * * versions below 3.5 will return `{}` for unresolvable interference\r\n * * versions above will return `unknown`\r\n *\r\n * @internal\r\n */\r\nexport type AtLeastTS35 = [True, False][IsUnknown<\r\n ReturnType<() => T>,\r\n 0,\r\n 1\r\n>]\r\n\r\n/**\r\n * @internal\r\n */\r\nexport type IsUnknownOrNonInferrable = AtLeastTS35<\r\n IsUnknown,\r\n IsEmptyObj>\r\n>\r\n\r\n/**\r\n * Combines all dispatch signatures of all middlewares in the array `M` into\r\n * one intersected dispatch signature.\r\n */\r\nexport type DispatchForMiddlewares = M extends ReadonlyArray\r\n ? UnionToIntersection<\r\n M[number] extends infer MiddlewareValues\r\n ? MiddlewareValues extends Middleware\r\n ? DispatchExt extends Function\r\n ? IsAny\r\n : never\r\n : never\r\n : never\r\n >\r\n : never\r\n\r\n/**\r\n * Convert a Union type `(A|B)` to an intersection type `(A&B)`\r\n */\r\nexport type UnionToIntersection = (\r\n U extends any ? (k: U) => void : never\r\n) extends (k: infer I) => void\r\n ? I\r\n : never\r\n\r\n/**\r\n * Helper type. Passes T out again, but boxes it in a way that it cannot\r\n * \"widen\" the type by accident if it is a generic that should be inferred\r\n * from elsewhere.\r\n *\r\n * @internal\r\n */\r\nexport type NoInfer = [T][T extends any ? 0 : never]\r\n\r\nexport type Omit = Pick>\r\n\r\nexport interface HasMatchFunction {\r\n match: (v: any) => v is T\r\n}\r\n\r\nexport const hasMatchFunction = (\r\n v: Matcher\r\n): v is HasMatchFunction => {\r\n return v && typeof (v as HasMatchFunction).match === 'function'\r\n}\r\n\r\n/** @public */\r\nexport type Matcher = HasMatchFunction | ((v: any) => v is T)\r\n\r\n/** @public */\r\nexport type ActionFromMatcher> = M extends Matcher<\r\n infer T\r\n>\r\n ? T\r\n : never\r\n","import type {\r\n ActionFromMatcher,\r\n Matcher,\r\n UnionToIntersection,\r\n} from './tsHelpers'\r\nimport { hasMatchFunction } from './tsHelpers'\r\nimport type {\r\n AsyncThunk,\r\n AsyncThunkFulfilledActionCreator,\r\n AsyncThunkPendingActionCreator,\r\n AsyncThunkRejectedActionCreator,\r\n} from './createAsyncThunk'\r\n\r\n/** @public */\r\nexport type ActionMatchingAnyOf<\r\n Matchers extends [Matcher, ...Matcher[]]\r\n> = ActionFromMatcher\r\n\r\n/** @public */\r\nexport type ActionMatchingAllOf<\r\n Matchers extends [Matcher, ...Matcher[]]\r\n> = UnionToIntersection>\r\n\r\nconst matches = (matcher: Matcher, action: any) => {\r\n if (hasMatchFunction(matcher)) {\r\n return matcher.match(action)\r\n } else {\r\n return matcher(action)\r\n }\r\n}\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action matches any one of the supplied type guards or action\r\n * creators.\r\n *\r\n * @param matchers The type guards or action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isAnyOf, ...Matcher[]]>(\r\n ...matchers: Matchers\r\n) {\r\n return (action: any): action is ActionMatchingAnyOf => {\r\n return matchers.some((matcher) => matches(matcher, action))\r\n }\r\n}\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action matches all of the supplied type guards or action\r\n * creators.\r\n *\r\n * @param matchers The type guards or action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isAllOf, ...Matcher[]]>(\r\n ...matchers: Matchers\r\n) {\r\n return (action: any): action is ActionMatchingAllOf => {\r\n return matchers.every((matcher) => matches(matcher, action))\r\n }\r\n}\r\n\r\n/**\r\n * @param action A redux action\r\n * @param validStatus An array of valid meta.requestStatus values\r\n *\r\n * @internal\r\n */\r\nexport function hasExpectedRequestMetadata(\r\n action: any,\r\n validStatus: readonly string[]\r\n) {\r\n if (!action || !action.meta) return false\r\n\r\n const hasValidRequestId = typeof action.meta.requestId === 'string'\r\n const hasValidRequestStatus =\r\n validStatus.indexOf(action.meta.requestStatus) > -1\r\n\r\n return hasValidRequestId && hasValidRequestStatus\r\n}\r\n\r\nfunction isAsyncThunkArray(a: [any] | AnyAsyncThunk[]): a is AnyAsyncThunk[] {\r\n return (\r\n typeof a[0] === 'function' &&\r\n 'pending' in a[0] &&\r\n 'fulfilled' in a[0] &&\r\n 'rejected' in a[0]\r\n )\r\n}\r\n\r\nexport type UnknownAsyncThunkPendingAction = ReturnType<\r\n AsyncThunkPendingActionCreator\r\n>\r\n\r\nexport type PendingActionFromAsyncThunk =\r\n ActionFromMatcher\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator, and that\r\n * the action is pending.\r\n *\r\n * @public\r\n */\r\nexport function isPending(): (\r\n action: any\r\n) => action is UnknownAsyncThunkPendingAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators,\r\n * and that the action is pending.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isPending<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (action: any) => action is PendingActionFromAsyncThunk\r\n/**\r\n * Tests if `action` is a pending thunk action\r\n * @public\r\n */\r\nexport function isPending(action: any): action is UnknownAsyncThunkPendingAction\r\nexport function isPending<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n if (asyncThunks.length === 0) {\r\n return (action: any) => hasExpectedRequestMetadata(action, ['pending'])\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isPending()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is PendingActionFromAsyncThunk => {\r\n // note: this type will be correct because we have at least 1 asyncThunk\r\n const matchers: [Matcher, ...Matcher[]] = asyncThunks.map(\r\n (asyncThunk) => asyncThunk.pending\r\n ) as any\r\n\r\n const combinedMatcher = isAnyOf(...matchers)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n\r\nexport type UnknownAsyncThunkRejectedAction = ReturnType<\r\n AsyncThunkRejectedActionCreator\r\n>\r\n\r\nexport type RejectedActionFromAsyncThunk =\r\n ActionFromMatcher\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator, and that\r\n * the action is rejected.\r\n *\r\n * @public\r\n */\r\nexport function isRejected(): (\r\n action: any\r\n) => action is UnknownAsyncThunkRejectedAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators,\r\n * and that the action is rejected.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isRejected<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (action: any) => action is RejectedActionFromAsyncThunk\r\n/**\r\n * Tests if `action` is a rejected thunk action\r\n * @public\r\n */\r\nexport function isRejected(\r\n action: any\r\n): action is UnknownAsyncThunkRejectedAction\r\nexport function isRejected<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n if (asyncThunks.length === 0) {\r\n return (action: any) => hasExpectedRequestMetadata(action, ['rejected'])\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isRejected()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is RejectedActionFromAsyncThunk => {\r\n // note: this type will be correct because we have at least 1 asyncThunk\r\n const matchers: [Matcher, ...Matcher[]] = asyncThunks.map(\r\n (asyncThunk) => asyncThunk.rejected\r\n ) as any\r\n\r\n const combinedMatcher = isAnyOf(...matchers)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n\r\nexport type UnknownAsyncThunkRejectedWithValueAction = ReturnType<\r\n AsyncThunkRejectedActionCreator\r\n>\r\n\r\nexport type RejectedWithValueActionFromAsyncThunk =\r\n ActionFromMatcher &\r\n (T extends AsyncThunk\r\n ? { payload: RejectedValue }\r\n : unknown)\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator, and that\r\n * the action is rejected with value.\r\n *\r\n * @public\r\n */\r\nexport function isRejectedWithValue(): (\r\n action: any\r\n) => action is UnknownAsyncThunkRejectedAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators,\r\n * and that the action is rejected with value.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isRejectedWithValue<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (\r\n action: any\r\n) => action is RejectedWithValueActionFromAsyncThunk\r\n/**\r\n * Tests if `action` is a rejected thunk action with value\r\n * @public\r\n */\r\nexport function isRejectedWithValue(\r\n action: any\r\n): action is UnknownAsyncThunkRejectedAction\r\nexport function isRejectedWithValue<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n const hasFlag = (action: any): action is any => {\r\n return action && action.meta && action.meta.rejectedWithValue\r\n }\r\n\r\n if (asyncThunks.length === 0) {\r\n return (action: any) => {\r\n const combinedMatcher = isAllOf(isRejected(...asyncThunks), hasFlag)\r\n\r\n return combinedMatcher(action)\r\n }\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isRejectedWithValue()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is RejectedActionFromAsyncThunk => {\r\n const combinedMatcher = isAllOf(isRejected(...asyncThunks), hasFlag)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n\r\nexport type UnknownAsyncThunkFulfilledAction = ReturnType<\r\n AsyncThunkFulfilledActionCreator\r\n>\r\n\r\nexport type FulfilledActionFromAsyncThunk =\r\n ActionFromMatcher\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator, and that\r\n * the action is fulfilled.\r\n *\r\n * @public\r\n */\r\nexport function isFulfilled(): (\r\n action: any\r\n) => action is UnknownAsyncThunkFulfilledAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators,\r\n * and that the action is fulfilled.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isFulfilled<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (action: any) => action is FulfilledActionFromAsyncThunk\r\n/**\r\n * Tests if `action` is a fulfilled thunk action\r\n * @public\r\n */\r\nexport function isFulfilled(\r\n action: any\r\n): action is UnknownAsyncThunkFulfilledAction\r\nexport function isFulfilled<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n if (asyncThunks.length === 0) {\r\n return (action: any) => hasExpectedRequestMetadata(action, ['fulfilled'])\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isFulfilled()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is FulfilledActionFromAsyncThunk => {\r\n // note: this type will be correct because we have at least 1 asyncThunk\r\n const matchers: [Matcher, ...Matcher[]] = asyncThunks.map(\r\n (asyncThunk) => asyncThunk.fulfilled\r\n ) as any\r\n\r\n const combinedMatcher = isAnyOf(...matchers)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n\r\nexport type UnknownAsyncThunkAction =\r\n | UnknownAsyncThunkPendingAction\r\n | UnknownAsyncThunkRejectedAction\r\n | UnknownAsyncThunkFulfilledAction\r\n\r\nexport type AnyAsyncThunk = {\r\n pending: { match: (action: any) => action is any }\r\n fulfilled: { match: (action: any) => action is any }\r\n rejected: { match: (action: any) => action is any }\r\n}\r\n\r\nexport type ActionsFromAsyncThunk =\r\n | ActionFromMatcher\r\n | ActionFromMatcher\r\n | ActionFromMatcher\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator.\r\n *\r\n * @public\r\n */\r\nexport function isAsyncThunkAction(): (\r\n action: any\r\n) => action is UnknownAsyncThunkAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isAsyncThunkAction<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (action: any) => action is ActionsFromAsyncThunk\r\n/**\r\n * Tests if `action` is a thunk action\r\n * @public\r\n */\r\nexport function isAsyncThunkAction(\r\n action: any\r\n): action is UnknownAsyncThunkAction\r\nexport function isAsyncThunkAction<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n if (asyncThunks.length === 0) {\r\n return (action: any) =>\r\n hasExpectedRequestMetadata(action, ['pending', 'fulfilled', 'rejected'])\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isAsyncThunkAction()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is ActionsFromAsyncThunk => {\r\n // note: this type will be correct because we have at least 1 asyncThunk\r\n const matchers: [Matcher, ...Matcher[]] = [] as any\r\n\r\n for (const asyncThunk of asyncThunks) {\r\n matchers.push(\r\n asyncThunk.pending,\r\n asyncThunk.rejected,\r\n asyncThunk.fulfilled\r\n )\r\n }\r\n\r\n const combinedMatcher = isAnyOf(...matchers)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n"]} +diff --git a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js b/node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js +index dec2629..ef606d8 100644 +--- a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js ++++ b/node_modules/@reduxjs/toolkit/dist/redux-toolkit.esm.js +@@ -1,3 +1,13 @@ ++function __define(obj, key, value) { ++ Object.defineProperty(obj, key, { ++ value: value, ++ enumerable: true, ++ configurable: true, ++ writable: true ++ }); ++ return obj[key]; ++ } ++ + var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || +@@ -9,7 +19,7 @@ var __extends = (this && this.__extends) || (function () { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); +- function __() { this.constructor = d; } ++ function __() { __define(this, constructor, d); } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; + })(); +@@ -177,14 +187,14 @@ var MiddlewareArray = /** @class */ (function (_super) { + enumerable: false, + configurable: true + }); +- MiddlewareArray.prototype.concat = function () { ++ __define(MiddlewareArray.prototype, 'concat', function () { + var arr = []; + for (var _i = 0; _i < arguments.length; _i++) { + arr[_i] = arguments[_i]; + } + return _super.prototype.concat.apply(this, arr); +- }; +- MiddlewareArray.prototype.prepend = function () { ++ }); ++ __define(MiddlewareArray.prototype, 'prepend', function () { + var arr = []; + for (var _i = 0; _i < arguments.length; _i++) { + arr[_i] = arguments[_i]; +@@ -193,7 +203,7 @@ var MiddlewareArray = /** @class */ (function (_super) { + return new (MiddlewareArray.bind.apply(MiddlewareArray, __spreadArray([void 0], arr[0].concat(this))))(); + } + return new (MiddlewareArray.bind.apply(MiddlewareArray, __spreadArray([void 0], arr.concat(this))))(); +- }; ++ }); + return MiddlewareArray; + }(Array)); + // src/immutableStateInvariantMiddleware.ts +diff --git a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.development.js b/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.development.js +deleted file mode 100644 +index ea81f95..0000000 +--- a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.development.js ++++ /dev/null +@@ -1,1148 +0,0 @@ +-var __defProp = Object.defineProperty; +-var __defProps = Object.defineProperties; +-var __getOwnPropDescs = Object.getOwnPropertyDescriptors; +-var __getOwnPropSymbols = Object.getOwnPropertySymbols; +-var __hasOwnProp = Object.prototype.hasOwnProperty; +-var __propIsEnum = Object.prototype.propertyIsEnumerable; +-var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +-var __spreadValues = (a, b) => { +- for (var prop in b || (b = {})) +- if (__hasOwnProp.call(b, prop)) +- __defNormalProp(a, prop, b[prop]); +- if (__getOwnPropSymbols) +- for (var prop of __getOwnPropSymbols(b)) { +- if (__propIsEnum.call(b, prop)) +- __defNormalProp(a, prop, b[prop]); +- } +- return a; +-}; +-var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); +-// src/index.ts +-import { enableES5 } from "immer"; +-export * from "redux"; +-import { default as default2, current as current2, freeze, original, isDraft as isDraft4 } from "immer"; +-import { createSelector as createSelector2 } from "reselect"; +-// src/createDraftSafeSelector.ts +-import { current, isDraft } from "immer"; +-import { createSelector } from "reselect"; +-var createDraftSafeSelector = (...args) => { +- const selector = createSelector(...args); +- const wrappedSelector = (value, ...rest) => selector(isDraft(value) ? current(value) : value, ...rest); +- return wrappedSelector; +-}; +-// src/configureStore.ts +-import { createStore, compose as compose2, applyMiddleware, combineReducers } from "redux"; +-// src/devtoolsExtension.ts +-import { compose } from "redux"; +-var composeWithDevTools = typeof window !== "undefined" && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : function () { +- if (arguments.length === 0) +- return void 0; +- if (typeof arguments[0] === "object") +- return compose; +- return compose.apply(null, arguments); +-}; +-var devToolsEnhancer = typeof window !== "undefined" && window.__REDUX_DEVTOOLS_EXTENSION__ ? window.__REDUX_DEVTOOLS_EXTENSION__ : function () { +- return function (noop) { +- return noop; +- }; +-}; +-// src/isPlainObject.ts +-function isPlainObject(value) { +- if (typeof value !== "object" || value === null) +- return false; +- let proto = value; +- while (Object.getPrototypeOf(proto) !== null) { +- proto = Object.getPrototypeOf(proto); +- } +- return Object.getPrototypeOf(value) === proto; +-} +-// src/getDefaultMiddleware.ts +-import thunkMiddleware from "redux-thunk"; +-// src/utils.ts +-function getTimeMeasureUtils(maxDelay, fnName) { +- let elapsed = 0; +- return { +- measureTime(fn) { +- const started = Date.now(); +- try { +- return fn(); +- } +- finally { +- const finished = Date.now(); +- elapsed += finished - started; +- } +- }, +- warnIfExceeded() { +- if (elapsed > maxDelay) { +- console.warn(`${fnName} took ${elapsed}ms, which is more than the warning threshold of ${maxDelay}ms. +-If your state or actions are very large, you may want to disable the middleware as it might cause too much of a slowdown in development mode. See https://redux-toolkit.js.org/api/getDefaultMiddleware for instructions. +-It is disabled in production builds, so you don't need to worry about that.`); +- } +- } +- }; +-} +-var MiddlewareArray = class extends Array { +- constructor(...args) { +- super(...args); +- Object.setPrototypeOf(this, MiddlewareArray.prototype); +- } +- static get [Symbol.species]() { +- return MiddlewareArray; +- } +- concat(...arr) { +- return super.concat.apply(this, arr); +- } +- prepend(...arr) { +- if (arr.length === 1 && Array.isArray(arr[0])) { +- return new MiddlewareArray(...arr[0].concat(this)); +- } +- return new MiddlewareArray(...arr.concat(this)); +- } +-}; +-// src/immutableStateInvariantMiddleware.ts +-var isProduction = false; +-var prefix = "Invariant failed"; +-function invariant(condition, message) { +- if (condition) { +- return; +- } +- if (isProduction) { +- throw new Error(prefix); +- } +- throw new Error(`${prefix}: ${message || ""}`); +-} +-function stringify(obj, serializer, indent, decycler) { +- return JSON.stringify(obj, getSerialize(serializer, decycler), indent); +-} +-function getSerialize(serializer, decycler) { +- let stack = [], keys = []; +- if (!decycler) +- decycler = function (_, value) { +- if (stack[0] === value) +- return "[Circular ~]"; +- return "[Circular ~." + keys.slice(0, stack.indexOf(value)).join(".") + "]"; +- }; +- return function (key, value) { +- if (stack.length > 0) { +- var thisPos = stack.indexOf(this); +- ~thisPos ? stack.splice(thisPos + 1) : stack.push(this); +- ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key); +- if (~stack.indexOf(value)) +- value = decycler.call(this, key, value); +- } +- else +- stack.push(value); +- return serializer == null ? value : serializer.call(this, key, value); +- }; +-} +-function isImmutableDefault(value) { +- return typeof value !== "object" || value === null || typeof value === "undefined" || Object.isFrozen(value); +-} +-function trackForMutations(isImmutable, ignorePaths, obj) { +- const trackedProperties = trackProperties(isImmutable, ignorePaths, obj); +- return { +- detectMutations() { +- return detectMutations(isImmutable, ignorePaths, trackedProperties, obj); +- } +- }; +-} +-function trackProperties(isImmutable, ignorePaths = [], obj, path = "") { +- const tracked = { value: obj }; +- if (!isImmutable(obj)) { +- tracked.children = {}; +- for (const key in obj) { +- const childPath = path ? path + "." + key : key; +- if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) { +- continue; +- } +- tracked.children[key] = trackProperties(isImmutable, ignorePaths, obj[key], childPath); +- } +- } +- return tracked; +-} +-function detectMutations(isImmutable, ignorePaths = [], trackedProperty, obj, sameParentRef = false, path = "") { +- const prevObj = trackedProperty ? trackedProperty.value : void 0; +- const sameRef = prevObj === obj; +- if (sameParentRef && !sameRef && !Number.isNaN(obj)) { +- return { wasMutated: true, path }; +- } +- if (isImmutable(prevObj) || isImmutable(obj)) { +- return { wasMutated: false }; +- } +- const keysToDetect = {}; +- for (let key in trackedProperty.children) { +- keysToDetect[key] = true; +- } +- for (let key in obj) { +- keysToDetect[key] = true; +- } +- for (let key in keysToDetect) { +- const childPath = path ? path + "." + key : key; +- if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) { +- continue; +- } +- const result = detectMutations(isImmutable, ignorePaths, trackedProperty.children[key], obj[key], sameRef, childPath); +- if (result.wasMutated) { +- return result; +- } +- } +- return { wasMutated: false }; +-} +-function createImmutableStateInvariantMiddleware(options = {}) { +- if (false) { +- return () => (next) => (action) => next(action); +- } +- let { isImmutable = isImmutableDefault, ignoredPaths, warnAfter = 32, ignore } = options; +- ignoredPaths = ignoredPaths || ignore; +- const track = trackForMutations.bind(null, isImmutable, ignoredPaths); +- return ({ getState }) => { +- let state = getState(); +- let tracker = track(state); +- let result; +- return (next) => (action) => { +- const measureUtils = getTimeMeasureUtils(warnAfter, "ImmutableStateInvariantMiddleware"); +- measureUtils.measureTime(() => { +- state = getState(); +- result = tracker.detectMutations(); +- tracker = track(state); +- invariant(!result.wasMutated, `A state mutation was detected between dispatches, in the path '${result.path || ""}'. This may cause incorrect behavior. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`); +- }); +- const dispatchedAction = next(action); +- measureUtils.measureTime(() => { +- state = getState(); +- result = tracker.detectMutations(); +- tracker = track(state); +- result.wasMutated && invariant(!result.wasMutated, `A state mutation was detected inside a dispatch, in the path: ${result.path || ""}. Take a look at the reducer(s) handling the action ${stringify(action)}. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`); +- }); +- measureUtils.warnIfExceeded(); +- return dispatchedAction; +- }; +- }; +-} +-// src/serializableStateInvariantMiddleware.ts +-function isPlain(val) { +- const type = typeof val; +- return type === "undefined" || val === null || type === "string" || type === "boolean" || type === "number" || Array.isArray(val) || isPlainObject(val); +-} +-function findNonSerializableValue(value, path = "", isSerializable = isPlain, getEntries, ignoredPaths = []) { +- let foundNestedSerializable; +- if (!isSerializable(value)) { +- return { +- keyPath: path || "", +- value +- }; +- } +- if (typeof value !== "object" || value === null) { +- return false; +- } +- const entries = getEntries != null ? getEntries(value) : Object.entries(value); +- const hasIgnoredPaths = ignoredPaths.length > 0; +- for (const [key, nestedValue] of entries) { +- const nestedPath = path ? path + "." + key : key; +- if (hasIgnoredPaths && ignoredPaths.indexOf(nestedPath) >= 0) { +- continue; +- } +- if (!isSerializable(nestedValue)) { +- return { +- keyPath: nestedPath, +- value: nestedValue +- }; +- } +- if (typeof nestedValue === "object") { +- foundNestedSerializable = findNonSerializableValue(nestedValue, nestedPath, isSerializable, getEntries, ignoredPaths); +- if (foundNestedSerializable) { +- return foundNestedSerializable; +- } +- } +- } +- return false; +-} +-function createSerializableStateInvariantMiddleware(options = {}) { +- if (false) { +- return () => (next) => (action) => next(action); +- } +- const { isSerializable = isPlain, getEntries, ignoredActions = [], ignoredActionPaths = ["meta.arg", "meta.baseQueryMeta"], ignoredPaths = [], warnAfter = 32, ignoreState = false } = options; +- return (storeAPI) => (next) => (action) => { +- if (ignoredActions.length && ignoredActions.indexOf(action.type) !== -1) { +- return next(action); +- } +- const measureUtils = getTimeMeasureUtils(warnAfter, "SerializableStateInvariantMiddleware"); +- measureUtils.measureTime(() => { +- const foundActionNonSerializableValue = findNonSerializableValue(action, "", isSerializable, getEntries, ignoredActionPaths); +- if (foundActionNonSerializableValue) { +- const { keyPath, value } = foundActionNonSerializableValue; +- console.error(`A non-serializable value was detected in an action, in the path: \`${keyPath}\`. Value:`, value, "\nTake a look at the logic that dispatched this action: ", action, "\n(See https://redux.js.org/faq/actions#why-should-type-be-a-string-or-at-least-serializable-why-should-my-action-types-be-constants)", "\n(To allow non-serializable values see: https://redux-toolkit.js.org/usage/usage-guide#working-with-non-serializable-data)"); +- } +- }); +- const result = next(action); +- if (!ignoreState) { +- measureUtils.measureTime(() => { +- const state = storeAPI.getState(); +- const foundStateNonSerializableValue = findNonSerializableValue(state, "", isSerializable, getEntries, ignoredPaths); +- if (foundStateNonSerializableValue) { +- const { keyPath, value } = foundStateNonSerializableValue; +- console.error(`A non-serializable value was detected in the state, in the path: \`${keyPath}\`. Value:`, value, ` +-Take a look at the reducer(s) handling this action type: ${action.type}. +-(See https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state)`); +- } +- }); +- measureUtils.warnIfExceeded(); +- } +- return result; +- }; +-} +-// src/getDefaultMiddleware.ts +-function isBoolean(x) { +- return typeof x === "boolean"; +-} +-function curryGetDefaultMiddleware() { +- return function curriedGetDefaultMiddleware(options) { +- return getDefaultMiddleware(options); +- }; +-} +-function getDefaultMiddleware(options = {}) { +- const { thunk = true, immutableCheck = true, serializableCheck = true } = options; +- let middlewareArray = new MiddlewareArray(); +- if (thunk) { +- if (isBoolean(thunk)) { +- middlewareArray.push(thunkMiddleware); +- } +- else { +- middlewareArray.push(thunkMiddleware.withExtraArgument(thunk.extraArgument)); +- } +- } +- if (true) { +- if (immutableCheck) { +- let immutableOptions = {}; +- if (!isBoolean(immutableCheck)) { +- immutableOptions = immutableCheck; +- } +- middlewareArray.unshift(createImmutableStateInvariantMiddleware(immutableOptions)); +- } +- if (serializableCheck) { +- let serializableOptions = {}; +- if (!isBoolean(serializableCheck)) { +- serializableOptions = serializableCheck; +- } +- middlewareArray.push(createSerializableStateInvariantMiddleware(serializableOptions)); +- } +- } +- return middlewareArray; +-} +-// src/configureStore.ts +-var IS_PRODUCTION = false; +-function configureStore(options) { +- const curriedGetDefaultMiddleware = curryGetDefaultMiddleware(); +- const { reducer = void 0, middleware = curriedGetDefaultMiddleware(), devTools = true, preloadedState = void 0, enhancers = void 0 } = options || {}; +- let rootReducer; +- if (typeof reducer === "function") { +- rootReducer = reducer; +- } +- else if (isPlainObject(reducer)) { +- rootReducer = combineReducers(reducer); +- } +- else { +- throw new Error('"reducer" is a required argument, and must be a function or an object of functions that can be passed to combineReducers'); +- } +- let finalMiddleware = middleware; +- if (typeof finalMiddleware === "function") { +- finalMiddleware = finalMiddleware(curriedGetDefaultMiddleware); +- if (!IS_PRODUCTION && !Array.isArray(finalMiddleware)) { +- throw new Error("when using a middleware builder function, an array of middleware must be returned"); +- } +- } +- if (!IS_PRODUCTION && finalMiddleware.some((item) => typeof item !== "function")) { +- throw new Error("each middleware provided to configureStore must be a function"); +- } +- const middlewareEnhancer = applyMiddleware(...finalMiddleware); +- let finalCompose = compose2; +- if (devTools) { +- finalCompose = composeWithDevTools(__spreadValues({ +- trace: !IS_PRODUCTION +- }, typeof devTools === "object" && devTools)); +- } +- let storeEnhancers = [middlewareEnhancer]; +- if (Array.isArray(enhancers)) { +- storeEnhancers = [middlewareEnhancer, ...enhancers]; +- } +- else if (typeof enhancers === "function") { +- storeEnhancers = enhancers(storeEnhancers); +- } +- const composedEnhancer = finalCompose(...storeEnhancers); +- return createStore(rootReducer, preloadedState, composedEnhancer); +-} +-// src/createAction.ts +-function createAction(type, prepareAction) { +- function actionCreator(...args) { +- if (prepareAction) { +- let prepared = prepareAction(...args); +- if (!prepared) { +- throw new Error("prepareAction did not return an object"); +- } +- return __spreadValues(__spreadValues({ +- type, +- payload: prepared.payload +- }, "meta" in prepared && { meta: prepared.meta }), "error" in prepared && { error: prepared.error }); +- } +- return { type, payload: args[0] }; +- } +- actionCreator.toString = () => `${type}`; +- actionCreator.type = type; +- actionCreator.match = (action) => action.type === type; +- return actionCreator; +-} +-function isFSA(action) { +- return isPlainObject(action) && typeof action.type === "string" && Object.keys(action).every(isValidKey); +-} +-function isValidKey(key) { +- return ["type", "payload", "error", "meta"].indexOf(key) > -1; +-} +-function getType(actionCreator) { +- return `${actionCreator}`; +-} +-// src/createReducer.ts +-import createNextState, { isDraft as isDraft2, isDraftable } from "immer"; +-// src/mapBuilders.ts +-function executeReducerBuilderCallback(builderCallback) { +- const actionsMap = {}; +- const actionMatchers = []; +- let defaultCaseReducer; +- const builder = { +- addCase(typeOrActionCreator, reducer) { +- if (true) { +- if (actionMatchers.length > 0) { +- throw new Error("`builder.addCase` should only be called before calling `builder.addMatcher`"); +- } +- if (defaultCaseReducer) { +- throw new Error("`builder.addCase` should only be called before calling `builder.addDefaultCase`"); +- } +- } +- const type = typeof typeOrActionCreator === "string" ? typeOrActionCreator : typeOrActionCreator.type; +- if (type in actionsMap) { +- throw new Error("addCase cannot be called with two reducers for the same action type"); +- } +- actionsMap[type] = reducer; +- return builder; +- }, +- addMatcher(matcher, reducer) { +- if (true) { +- if (defaultCaseReducer) { +- throw new Error("`builder.addMatcher` should only be called before calling `builder.addDefaultCase`"); +- } +- } +- actionMatchers.push({ matcher, reducer }); +- return builder; +- }, +- addDefaultCase(reducer) { +- if (true) { +- if (defaultCaseReducer) { +- throw new Error("`builder.addDefaultCase` can only be called once"); +- } +- } +- defaultCaseReducer = reducer; +- return builder; +- } +- }; +- builderCallback(builder); +- return [actionsMap, actionMatchers, defaultCaseReducer]; +-} +-// src/createReducer.ts +-function createReducer(initialState, mapOrBuilderCallback, actionMatchers = [], defaultCaseReducer) { +- let [actionsMap, finalActionMatchers, finalDefaultCaseReducer] = typeof mapOrBuilderCallback === "function" ? executeReducerBuilderCallback(mapOrBuilderCallback) : [mapOrBuilderCallback, actionMatchers, defaultCaseReducer]; +- const frozenInitialState = createNextState(initialState, () => { +- }); +- return function (state = frozenInitialState, action) { +- let caseReducers = [ +- actionsMap[action.type], +- ...finalActionMatchers.filter(({ matcher }) => matcher(action)).map(({ reducer }) => reducer) +- ]; +- if (caseReducers.filter((cr) => !!cr).length === 0) { +- caseReducers = [finalDefaultCaseReducer]; +- } +- return caseReducers.reduce((previousState, caseReducer) => { +- if (caseReducer) { +- if (isDraft2(previousState)) { +- const draft = previousState; +- const result = caseReducer(draft, action); +- if (typeof result === "undefined") { +- return previousState; +- } +- return result; +- } +- else if (!isDraftable(previousState)) { +- const result = caseReducer(previousState, action); +- if (typeof result === "undefined") { +- if (previousState === null) { +- return previousState; +- } +- throw Error("A case reducer on a non-draftable value must not return undefined"); +- } +- return result; +- } +- else { +- return createNextState(previousState, (draft) => { +- return caseReducer(draft, action); +- }); +- } +- } +- return previousState; +- }, state); +- }; +-} +-// src/createSlice.ts +-function getType2(slice, actionKey) { +- return `${slice}/${actionKey}`; +-} +-function createSlice(options) { +- const { name, initialState } = options; +- if (!name) { +- throw new Error("`name` is a required option for createSlice"); +- } +- const reducers = options.reducers || {}; +- const [extraReducers = {}, actionMatchers = [], defaultCaseReducer = void 0] = typeof options.extraReducers === "function" ? executeReducerBuilderCallback(options.extraReducers) : [options.extraReducers]; +- const reducerNames = Object.keys(reducers); +- const sliceCaseReducersByName = {}; +- const sliceCaseReducersByType = {}; +- const actionCreators = {}; +- reducerNames.forEach((reducerName) => { +- const maybeReducerWithPrepare = reducers[reducerName]; +- const type = getType2(name, reducerName); +- let caseReducer; +- let prepareCallback; +- if ("reducer" in maybeReducerWithPrepare) { +- caseReducer = maybeReducerWithPrepare.reducer; +- prepareCallback = maybeReducerWithPrepare.prepare; +- } +- else { +- caseReducer = maybeReducerWithPrepare; +- } +- sliceCaseReducersByName[reducerName] = caseReducer; +- sliceCaseReducersByType[type] = caseReducer; +- actionCreators[reducerName] = prepareCallback ? createAction(type, prepareCallback) : createAction(type); +- }); +- const finalCaseReducers = __spreadValues(__spreadValues({}, extraReducers), sliceCaseReducersByType); +- const reducer = createReducer(initialState, finalCaseReducers, actionMatchers, defaultCaseReducer); +- return { +- name, +- reducer, +- actions: actionCreators, +- caseReducers: sliceCaseReducersByName +- }; +-} +-// src/entities/entity_state.ts +-function getInitialEntityState() { +- return { +- ids: [], +- entities: {} +- }; +-} +-function createInitialStateFactory() { +- function getInitialState(additionalState = {}) { +- return Object.assign(getInitialEntityState(), additionalState); +- } +- return { getInitialState }; +-} +-// src/entities/state_selectors.ts +-function createSelectorsFactory() { +- function getSelectors(selectState) { +- const selectIds = (state) => state.ids; +- const selectEntities = (state) => state.entities; +- const selectAll = createDraftSafeSelector(selectIds, selectEntities, (ids, entities) => ids.map((id) => entities[id])); +- const selectId = (_, id) => id; +- const selectById = (entities, id) => entities[id]; +- const selectTotal = createDraftSafeSelector(selectIds, (ids) => ids.length); +- if (!selectState) { +- return { +- selectIds, +- selectEntities, +- selectAll, +- selectTotal, +- selectById: createDraftSafeSelector(selectEntities, selectId, selectById) +- }; +- } +- const selectGlobalizedEntities = createDraftSafeSelector(selectState, selectEntities); +- return { +- selectIds: createDraftSafeSelector(selectState, selectIds), +- selectEntities: selectGlobalizedEntities, +- selectAll: createDraftSafeSelector(selectState, selectAll), +- selectTotal: createDraftSafeSelector(selectState, selectTotal), +- selectById: createDraftSafeSelector(selectGlobalizedEntities, selectId, selectById) +- }; +- } +- return { getSelectors }; +-} +-// src/entities/state_adapter.ts +-import createNextState2, { isDraft as isDraft3 } from "immer"; +-function createSingleArgumentStateOperator(mutator) { +- const operator = createStateOperator((_, state) => mutator(state)); +- return function operation(state) { +- return operator(state, void 0); +- }; +-} +-function createStateOperator(mutator) { +- return function operation(state, arg) { +- function isPayloadActionArgument(arg2) { +- return isFSA(arg2); +- } +- const runMutator = (draft) => { +- if (isPayloadActionArgument(arg)) { +- mutator(arg.payload, draft); +- } +- else { +- mutator(arg, draft); +- } +- }; +- if (isDraft3(state)) { +- runMutator(state); +- return state; +- } +- else { +- return createNextState2(state, runMutator); +- } +- }; +-} +-// src/entities/utils.ts +-function selectIdValue(entity, selectId) { +- const key = selectId(entity); +- if (key === void 0) { +- console.warn("The entity passed to the `selectId` implementation returned undefined.", "You should probably provide your own `selectId` implementation.", "The entity that was passed:", entity, "The `selectId` implementation:", selectId.toString()); +- } +- return key; +-} +-function ensureEntitiesArray(entities) { +- if (!Array.isArray(entities)) { +- entities = Object.values(entities); +- } +- return entities; +-} +-function splitAddedUpdatedEntities(newEntities, selectId, state) { +- newEntities = ensureEntitiesArray(newEntities); +- const added = []; +- const updated = []; +- for (const entity of newEntities) { +- const id = selectIdValue(entity, selectId); +- if (id in state.entities) { +- updated.push({ id, changes: entity }); +- } +- else { +- added.push(entity); +- } +- } +- return [added, updated]; +-} +-// src/entities/unsorted_state_adapter.ts +-function createUnsortedStateAdapter(selectId) { +- function addOneMutably(entity, state) { +- const key = selectIdValue(entity, selectId); +- if (key in state.entities) { +- return; +- } +- state.ids.push(key); +- state.entities[key] = entity; +- } +- function addManyMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- for (const entity of newEntities) { +- addOneMutably(entity, state); +- } +- } +- function setOneMutably(entity, state) { +- const key = selectIdValue(entity, selectId); +- if (!(key in state.entities)) { +- state.ids.push(key); +- } +- state.entities[key] = entity; +- } +- function setManyMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- for (const entity of newEntities) { +- setOneMutably(entity, state); +- } +- } +- function setAllMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- state.ids = []; +- state.entities = {}; +- addManyMutably(newEntities, state); +- } +- function removeOneMutably(key, state) { +- return removeManyMutably([key], state); +- } +- function removeManyMutably(keys, state) { +- let didMutate = false; +- keys.forEach((key) => { +- if (key in state.entities) { +- delete state.entities[key]; +- didMutate = true; +- } +- }); +- if (didMutate) { +- state.ids = state.ids.filter((id) => id in state.entities); +- } +- } +- function removeAllMutably(state) { +- Object.assign(state, { +- ids: [], +- entities: {} +- }); +- } +- function takeNewKey(keys, update, state) { +- const original2 = state.entities[update.id]; +- const updated = Object.assign({}, original2, update.changes); +- const newKey = selectIdValue(updated, selectId); +- const hasNewKey = newKey !== update.id; +- if (hasNewKey) { +- keys[update.id] = newKey; +- delete state.entities[update.id]; +- } +- state.entities[newKey] = updated; +- return hasNewKey; +- } +- function updateOneMutably(update, state) { +- return updateManyMutably([update], state); +- } +- function updateManyMutably(updates, state) { +- const newKeys = {}; +- const updatesPerEntity = {}; +- updates.forEach((update) => { +- if (update.id in state.entities) { +- updatesPerEntity[update.id] = { +- id: update.id, +- changes: __spreadValues(__spreadValues({}, updatesPerEntity[update.id] ? updatesPerEntity[update.id].changes : null), update.changes) +- }; +- } +- }); +- updates = Object.values(updatesPerEntity); +- const didMutateEntities = updates.length > 0; +- if (didMutateEntities) { +- const didMutateIds = updates.filter((update) => takeNewKey(newKeys, update, state)).length > 0; +- if (didMutateIds) { +- state.ids = state.ids.map((id) => newKeys[id] || id); +- } +- } +- } +- function upsertOneMutably(entity, state) { +- return upsertManyMutably([entity], state); +- } +- function upsertManyMutably(newEntities, state) { +- const [added, updated] = splitAddedUpdatedEntities(newEntities, selectId, state); +- updateManyMutably(updated, state); +- addManyMutably(added, state); +- } +- return { +- removeAll: createSingleArgumentStateOperator(removeAllMutably), +- addOne: createStateOperator(addOneMutably), +- addMany: createStateOperator(addManyMutably), +- setOne: createStateOperator(setOneMutably), +- setMany: createStateOperator(setManyMutably), +- setAll: createStateOperator(setAllMutably), +- updateOne: createStateOperator(updateOneMutably), +- updateMany: createStateOperator(updateManyMutably), +- upsertOne: createStateOperator(upsertOneMutably), +- upsertMany: createStateOperator(upsertManyMutably), +- removeOne: createStateOperator(removeOneMutably), +- removeMany: createStateOperator(removeManyMutably) +- }; +-} +-// src/entities/sorted_state_adapter.ts +-function createSortedStateAdapter(selectId, sort) { +- const { removeOne, removeMany, removeAll } = createUnsortedStateAdapter(selectId); +- function addOneMutably(entity, state) { +- return addManyMutably([entity], state); +- } +- function addManyMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- const models = newEntities.filter((model) => !(selectIdValue(model, selectId) in state.entities)); +- if (models.length !== 0) { +- merge(models, state); +- } +- } +- function setOneMutably(entity, state) { +- return setManyMutably([entity], state); +- } +- function setManyMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- if (newEntities.length !== 0) { +- merge(newEntities, state); +- } +- } +- function setAllMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- state.entities = {}; +- state.ids = []; +- addManyMutably(newEntities, state); +- } +- function updateOneMutably(update, state) { +- return updateManyMutably([update], state); +- } +- function takeUpdatedModel(models, update, state) { +- if (!(update.id in state.entities)) { +- return false; +- } +- const original2 = state.entities[update.id]; +- const updated = Object.assign({}, original2, update.changes); +- const newKey = selectIdValue(updated, selectId); +- delete state.entities[update.id]; +- models.push(updated); +- return newKey !== update.id; +- } +- function updateManyMutably(updates, state) { +- const models = []; +- updates.forEach((update) => takeUpdatedModel(models, update, state)); +- if (models.length !== 0) { +- merge(models, state); +- } +- } +- function upsertOneMutably(entity, state) { +- return upsertManyMutably([entity], state); +- } +- function upsertManyMutably(newEntities, state) { +- const [added, updated] = splitAddedUpdatedEntities(newEntities, selectId, state); +- updateManyMutably(updated, state); +- addManyMutably(added, state); +- } +- function areArraysEqual(a, b) { +- if (a.length !== b.length) { +- return false; +- } +- for (let i = 0; i < a.length && i < b.length; i++) { +- if (a[i] === b[i]) { +- continue; +- } +- return false; +- } +- return true; +- } +- function merge(models, state) { +- models.forEach((model) => { +- state.entities[selectId(model)] = model; +- }); +- const allEntities = Object.values(state.entities); +- allEntities.sort(sort); +- const newSortedIds = allEntities.map(selectId); +- const { ids } = state; +- if (!areArraysEqual(ids, newSortedIds)) { +- state.ids = newSortedIds; +- } +- } +- return { +- removeOne, +- removeMany, +- removeAll, +- addOne: createStateOperator(addOneMutably), +- updateOne: createStateOperator(updateOneMutably), +- upsertOne: createStateOperator(upsertOneMutably), +- setOne: createStateOperator(setOneMutably), +- setMany: createStateOperator(setManyMutably), +- setAll: createStateOperator(setAllMutably), +- addMany: createStateOperator(addManyMutably), +- updateMany: createStateOperator(updateManyMutably), +- upsertMany: createStateOperator(upsertManyMutably) +- }; +-} +-// src/entities/create_adapter.ts +-function createEntityAdapter(options = {}) { +- const { selectId, sortComparer } = __spreadValues({ +- sortComparer: false, +- selectId: (instance) => instance.id +- }, options); +- const stateFactory = createInitialStateFactory(); +- const selectorsFactory = createSelectorsFactory(); +- const stateAdapter = sortComparer ? createSortedStateAdapter(selectId, sortComparer) : createUnsortedStateAdapter(selectId); +- return __spreadValues(__spreadValues(__spreadValues({ +- selectId, +- sortComparer +- }, stateFactory), selectorsFactory), stateAdapter); +-} +-// src/nanoid.ts +-var urlAlphabet = "ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW"; +-var nanoid = (size = 21) => { +- let id = ""; +- let i = size; +- while (i--) { +- id += urlAlphabet[Math.random() * 64 | 0]; +- } +- return id; +-}; +-// src/createAsyncThunk.ts +-var commonProperties = [ +- "name", +- "message", +- "stack", +- "code" +-]; +-var RejectWithValue = class { +- constructor(payload, meta) { +- this.payload = payload; +- this.meta = meta; +- } +-}; +-var FulfillWithMeta = class { +- constructor(payload, meta) { +- this.payload = payload; +- this.meta = meta; +- } +-}; +-var miniSerializeError = (value) => { +- if (typeof value === "object" && value !== null) { +- const simpleError = {}; +- for (const property of commonProperties) { +- if (typeof value[property] === "string") { +- simpleError[property] = value[property]; +- } +- } +- return simpleError; +- } +- return { message: String(value) }; +-}; +-function createAsyncThunk(typePrefix, payloadCreator, options) { +- const fulfilled = createAction(typePrefix + "/fulfilled", (payload, requestId, arg, meta) => ({ +- payload, +- meta: __spreadProps(__spreadValues({}, meta || {}), { +- arg, +- requestId, +- requestStatus: "fulfilled" +- }) +- })); +- const pending = createAction(typePrefix + "/pending", (requestId, arg, meta) => ({ +- payload: void 0, +- meta: __spreadProps(__spreadValues({}, meta || {}), { +- arg, +- requestId, +- requestStatus: "pending" +- }) +- })); +- const rejected = createAction(typePrefix + "/rejected", (error, requestId, arg, payload, meta) => ({ +- payload, +- error: (options && options.serializeError || miniSerializeError)(error || "Rejected"), +- meta: __spreadProps(__spreadValues({}, meta || {}), { +- arg, +- requestId, +- rejectedWithValue: !!payload, +- requestStatus: "rejected", +- aborted: (error == null ? void 0 : error.name) === "AbortError", +- condition: (error == null ? void 0 : error.name) === "ConditionError" +- }) +- })); +- let displayedWarning = false; +- const AC = typeof AbortController !== "undefined" ? AbortController : class { +- constructor() { +- this.signal = { +- aborted: false, +- addEventListener() { +- }, +- dispatchEvent() { +- return false; +- }, +- onabort() { +- }, +- removeEventListener() { +- } +- }; +- } +- abort() { +- if (true) { +- if (!displayedWarning) { +- displayedWarning = true; +- console.info(`This platform does not implement AbortController. +-If you want to use the AbortController to react to \`abort\` events, please consider importing a polyfill like 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only'.`); +- } +- } +- } +- }; +- function actionCreator(arg) { +- return (dispatch, getState, extra) => { +- var _a; +- const requestId = ((_a = options == null ? void 0 : options.idGenerator) != null ? _a : nanoid)(); +- const abortController = new AC(); +- let abortReason; +- const abortedPromise = new Promise((_, reject) => abortController.signal.addEventListener("abort", () => reject({ name: "AbortError", message: abortReason || "Aborted" }))); +- let started = false; +- function abort(reason) { +- if (started) { +- abortReason = reason; +- abortController.abort(); +- } +- } +- const promise = async function () { +- var _a2; +- let finalAction; +- try { +- if (options && options.condition && options.condition(arg, { getState, extra }) === false) { +- throw { +- name: "ConditionError", +- message: "Aborted due to condition callback returning false." +- }; +- } +- started = true; +- dispatch(pending(requestId, arg, (_a2 = options == null ? void 0 : options.getPendingMeta) == null ? void 0 : _a2.call(options, { requestId, arg }, { getState, extra }))); +- finalAction = await Promise.race([ +- abortedPromise, +- Promise.resolve(payloadCreator(arg, { +- dispatch, +- getState, +- extra, +- requestId, +- signal: abortController.signal, +- rejectWithValue: (value, meta) => { +- return new RejectWithValue(value, meta); +- }, +- fulfillWithValue: (value, meta) => { +- return new FulfillWithMeta(value, meta); +- } +- })).then((result) => { +- if (result instanceof RejectWithValue) { +- throw result; +- } +- if (result instanceof FulfillWithMeta) { +- return fulfilled(result.payload, requestId, arg, result.meta); +- } +- return fulfilled(result, requestId, arg); +- }) +- ]); +- } +- catch (err) { +- finalAction = err instanceof RejectWithValue ? rejected(null, requestId, arg, err.payload, err.meta) : rejected(err, requestId, arg); +- } +- const skipDispatch = options && !options.dispatchConditionRejection && rejected.match(finalAction) && finalAction.meta.condition; +- if (!skipDispatch) { +- dispatch(finalAction); +- } +- return finalAction; +- }(); +- return Object.assign(promise, { +- abort, +- requestId, +- arg, +- unwrap() { +- return promise.then(unwrapResult); +- } +- }); +- }; +- } +- return Object.assign(actionCreator, { +- pending, +- rejected, +- fulfilled, +- typePrefix +- }); +-} +-function unwrapResult(action) { +- if (action.meta && action.meta.rejectedWithValue) { +- throw action.payload; +- } +- if (action.error) { +- throw action.error; +- } +- return action.payload; +-} +-// src/tsHelpers.ts +-var hasMatchFunction = (v) => { +- return v && typeof v.match === "function"; +-}; +-// src/matchers.ts +-var matches = (matcher, action) => { +- if (hasMatchFunction(matcher)) { +- return matcher.match(action); +- } +- else { +- return matcher(action); +- } +-}; +-function isAnyOf(...matchers) { +- return (action) => { +- return matchers.some((matcher) => matches(matcher, action)); +- }; +-} +-function isAllOf(...matchers) { +- return (action) => { +- return matchers.every((matcher) => matches(matcher, action)); +- }; +-} +-function hasExpectedRequestMetadata(action, validStatus) { +- if (!action || !action.meta) +- return false; +- const hasValidRequestId = typeof action.meta.requestId === "string"; +- const hasValidRequestStatus = validStatus.indexOf(action.meta.requestStatus) > -1; +- return hasValidRequestId && hasValidRequestStatus; +-} +-function isAsyncThunkArray(a) { +- return typeof a[0] === "function" && "pending" in a[0] && "fulfilled" in a[0] && "rejected" in a[0]; +-} +-function isPending(...asyncThunks) { +- if (asyncThunks.length === 0) { +- return (action) => hasExpectedRequestMetadata(action, ["pending"]); +- } +- if (!isAsyncThunkArray(asyncThunks)) { +- return isPending()(asyncThunks[0]); +- } +- return (action) => { +- const matchers = asyncThunks.map((asyncThunk) => asyncThunk.pending); +- const combinedMatcher = isAnyOf(...matchers); +- return combinedMatcher(action); +- }; +-} +-function isRejected(...asyncThunks) { +- if (asyncThunks.length === 0) { +- return (action) => hasExpectedRequestMetadata(action, ["rejected"]); +- } +- if (!isAsyncThunkArray(asyncThunks)) { +- return isRejected()(asyncThunks[0]); +- } +- return (action) => { +- const matchers = asyncThunks.map((asyncThunk) => asyncThunk.rejected); +- const combinedMatcher = isAnyOf(...matchers); +- return combinedMatcher(action); +- }; +-} +-function isRejectedWithValue(...asyncThunks) { +- const hasFlag = (action) => { +- return action && action.meta && action.meta.rejectedWithValue; +- }; +- if (asyncThunks.length === 0) { +- return (action) => { +- const combinedMatcher = isAllOf(isRejected(...asyncThunks), hasFlag); +- return combinedMatcher(action); +- }; +- } +- if (!isAsyncThunkArray(asyncThunks)) { +- return isRejectedWithValue()(asyncThunks[0]); +- } +- return (action) => { +- const combinedMatcher = isAllOf(isRejected(...asyncThunks), hasFlag); +- return combinedMatcher(action); +- }; +-} +-function isFulfilled(...asyncThunks) { +- if (asyncThunks.length === 0) { +- return (action) => hasExpectedRequestMetadata(action, ["fulfilled"]); +- } +- if (!isAsyncThunkArray(asyncThunks)) { +- return isFulfilled()(asyncThunks[0]); +- } +- return (action) => { +- const matchers = asyncThunks.map((asyncThunk) => asyncThunk.fulfilled); +- const combinedMatcher = isAnyOf(...matchers); +- return combinedMatcher(action); +- }; +-} +-function isAsyncThunkAction(...asyncThunks) { +- if (asyncThunks.length === 0) { +- return (action) => hasExpectedRequestMetadata(action, ["pending", "fulfilled", "rejected"]); +- } +- if (!isAsyncThunkArray(asyncThunks)) { +- return isAsyncThunkAction()(asyncThunks[0]); +- } +- return (action) => { +- const matchers = []; +- for (const asyncThunk of asyncThunks) { +- matchers.push(asyncThunk.pending, asyncThunk.rejected, asyncThunk.fulfilled); +- } +- const combinedMatcher = isAnyOf(...matchers); +- return combinedMatcher(action); +- }; +-} +-// src/index.ts +-enableES5(); +-export { MiddlewareArray, configureStore, createAction, createAsyncThunk, createDraftSafeSelector, createEntityAdapter, createImmutableStateInvariantMiddleware, default2 as createNextState, createReducer, createSelector2 as createSelector, createSerializableStateInvariantMiddleware, createSlice, current2 as current, findNonSerializableValue, freeze, getDefaultMiddleware, getType, isAllOf, isAnyOf, isAsyncThunkAction, isDraft4 as isDraft, isFulfilled, isImmutableDefault, isPending, isPlain, isPlainObject, isRejected, isRejectedWithValue, miniSerializeError, nanoid, original, unwrapResult }; +-//# sourceMappingURL=redux-toolkit.modern.development.js.map +\ No newline at end of file +diff --git a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.development.js.map b/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.development.js.map +deleted file mode 100644 +index 8b8b341..0000000 +--- a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.development.js.map ++++ /dev/null +@@ -1 +0,0 @@ +-{"version":3,"sources":["../src/index.ts","../src/createDraftSafeSelector.ts","../src/configureStore.ts","../src/devtoolsExtension.ts","../src/isPlainObject.ts","../src/getDefaultMiddleware.ts","../src/utils.ts","../src/immutableStateInvariantMiddleware.ts","../src/serializableStateInvariantMiddleware.ts","../src/createAction.ts","../src/createReducer.ts","../src/mapBuilders.ts","../src/createSlice.ts","../src/entities/entity_state.ts","../src/entities/state_selectors.ts","../src/entities/state_adapter.ts","../src/entities/utils.ts","../src/entities/unsorted_state_adapter.ts","../src/entities/sorted_state_adapter.ts","../src/entities/create_adapter.ts","../src/nanoid.ts","../src/createAsyncThunk.ts","../src/tsHelpers.ts","../src/matchers.ts","redux-toolkit.modern.development.ts"],"names":[],"mappings":"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","sourcesContent":["import { enableES5 } from 'immer'\r\nexport * from 'redux'\r\nexport {\r\n default as createNextState,\r\n current,\r\n freeze,\r\n original,\r\n isDraft,\r\n} from 'immer'\r\nexport type { Draft } from 'immer'\r\nexport { createSelector } from 'reselect'\r\nexport type {\r\n Selector,\r\n OutputParametricSelector,\r\n OutputSelector,\r\n ParametricSelector,\r\n} from 'reselect'\r\nexport { createDraftSafeSelector } from './createDraftSafeSelector'\r\nexport type { ThunkAction, ThunkDispatch } from 'redux-thunk'\r\n\r\n// We deliberately enable Immer's ES5 support, on the grounds that\r\n// we assume RTK will be used with React Native and other Proxy-less\r\n// environments. In addition, that's how Immer 4 behaved, and since\r\n// we want to ship this in an RTK minor, we should keep the same behavior.\r\nenableES5()\r\n\r\nexport {\r\n // js\r\n configureStore,\r\n} from './configureStore'\r\nexport type {\r\n // types\r\n ConfigureEnhancersCallback,\r\n ConfigureStoreOptions,\r\n EnhancedStore,\r\n} from './configureStore'\r\nexport {\r\n // js\r\n createAction,\r\n getType,\r\n} from './createAction'\r\nexport type {\r\n // types\r\n PayloadAction,\r\n PayloadActionCreator,\r\n ActionCreatorWithNonInferrablePayload,\r\n ActionCreatorWithOptionalPayload,\r\n ActionCreatorWithPayload,\r\n ActionCreatorWithoutPayload,\r\n ActionCreatorWithPreparedPayload,\r\n PrepareAction,\r\n} from './createAction'\r\nexport {\r\n // js\r\n createReducer,\r\n} from './createReducer'\r\nexport type {\r\n // types\r\n Actions,\r\n CaseReducer,\r\n CaseReducers,\r\n} from './createReducer'\r\nexport {\r\n // js\r\n createSlice,\r\n} from './createSlice'\r\n\r\nexport type {\r\n // types\r\n CreateSliceOptions,\r\n Slice,\r\n CaseReducerActions,\r\n SliceCaseReducers,\r\n ValidateSliceCaseReducers,\r\n CaseReducerWithPrepare,\r\n SliceActionCreator,\r\n} from './createSlice'\r\nexport {\r\n // js\r\n createImmutableStateInvariantMiddleware,\r\n isImmutableDefault,\r\n} from './immutableStateInvariantMiddleware'\r\nexport type {\r\n // types\r\n ImmutableStateInvariantMiddlewareOptions,\r\n} from './immutableStateInvariantMiddleware'\r\nexport {\r\n // js\r\n createSerializableStateInvariantMiddleware,\r\n findNonSerializableValue,\r\n isPlain,\r\n} from './serializableStateInvariantMiddleware'\r\nexport type {\r\n // types\r\n SerializableStateInvariantMiddlewareOptions,\r\n} from './serializableStateInvariantMiddleware'\r\nexport {\r\n // js\r\n getDefaultMiddleware,\r\n} from './getDefaultMiddleware'\r\nexport type {\r\n // types\r\n ActionReducerMapBuilder,\r\n} from './mapBuilders'\r\nexport { MiddlewareArray } from './utils'\r\n\r\nexport { createEntityAdapter } from './entities/create_adapter'\r\nexport type {\r\n Dictionary,\r\n EntityState,\r\n EntityAdapter,\r\n EntitySelectors,\r\n EntityStateAdapter,\r\n EntityId,\r\n Update,\r\n IdSelector,\r\n Comparer,\r\n} from './entities/models'\r\n\r\nexport {\r\n createAsyncThunk,\r\n unwrapResult,\r\n miniSerializeError,\r\n} from './createAsyncThunk'\r\nexport type {\r\n AsyncThunk,\r\n AsyncThunkOptions,\r\n AsyncThunkAction,\r\n AsyncThunkPayloadCreatorReturnValue,\r\n AsyncThunkPayloadCreator,\r\n SerializedError,\r\n} from './createAsyncThunk'\r\n\r\nexport {\r\n // js\r\n isAllOf,\r\n isAnyOf,\r\n isPending,\r\n isRejected,\r\n isFulfilled,\r\n isAsyncThunkAction,\r\n isRejectedWithValue,\r\n} from './matchers'\r\nexport type {\r\n // types\r\n ActionMatchingAllOf,\r\n ActionMatchingAnyOf,\r\n} from './matchers'\r\n\r\nexport { nanoid } from './nanoid'\r\n\r\nexport { default as isPlainObject } from './isPlainObject'\r\n","import { current, isDraft } from 'immer'\r\nimport { createSelector } from 'reselect'\r\n\r\n/**\r\n * \"Draft-Safe\" version of `reselect`'s `createSelector`:\r\n * If an `immer`-drafted object is passed into the resulting selector's first argument,\r\n * the selector will act on the current draft value, instead of returning a cached value\r\n * that might be possibly outdated if the draft has been modified since.\r\n * @public\r\n */\r\nexport const createDraftSafeSelector: typeof createSelector = (\r\n ...args: unknown[]\r\n) => {\r\n const selector = (createSelector as any)(...args)\r\n const wrappedSelector = (value: unknown, ...rest: unknown[]) =>\r\n selector(isDraft(value) ? current(value) : value, ...rest)\r\n return wrappedSelector as any\r\n}\r\n","import type {\r\n Reducer,\r\n ReducersMapObject,\r\n Middleware,\r\n Action,\r\n AnyAction,\r\n StoreEnhancer,\r\n Store,\r\n Dispatch,\r\n PreloadedState,\r\n CombinedState,\r\n} from 'redux'\r\nimport { createStore, compose, applyMiddleware, combineReducers } from 'redux'\r\nimport type { EnhancerOptions as DevToolsOptions } from './devtoolsExtension'\r\nimport { composeWithDevTools } from './devtoolsExtension'\r\n\r\nimport isPlainObject from './isPlainObject'\r\nimport type {\r\n ThunkMiddlewareFor,\r\n CurriedGetDefaultMiddleware,\r\n} from './getDefaultMiddleware'\r\nimport { curryGetDefaultMiddleware } from './getDefaultMiddleware'\r\nimport type { DispatchForMiddlewares, NoInfer } from './tsHelpers'\r\n\r\nconst IS_PRODUCTION = process.env.NODE_ENV === 'production'\r\n\r\n/**\r\n * Callback function type, to be used in `ConfigureStoreOptions.enhancers`\r\n *\r\n * @public\r\n */\r\nexport type ConfigureEnhancersCallback = (\r\n defaultEnhancers: readonly StoreEnhancer[]\r\n) => StoreEnhancer[]\r\n\r\n/**\r\n * Options for `configureStore()`.\r\n *\r\n * @public\r\n */\r\nexport interface ConfigureStoreOptions<\r\n S = any,\r\n A extends Action = AnyAction,\r\n M extends Middlewares = Middlewares\r\n> {\r\n /**\r\n * A single reducer function that will be used as the root reducer, or an\r\n * object of slice reducers that will be passed to `combineReducers()`.\r\n */\r\n reducer: Reducer | ReducersMapObject\r\n\r\n /**\r\n * An array of Redux middleware to install. If not supplied, defaults to\r\n * the set of middleware returned by `getDefaultMiddleware()`.\r\n */\r\n middleware?: ((getDefaultMiddleware: CurriedGetDefaultMiddleware) => M) | M\r\n\r\n /**\r\n * Whether to enable Redux DevTools integration. Defaults to `true`.\r\n *\r\n * Additional configuration can be done by passing Redux DevTools options\r\n */\r\n devTools?: boolean | DevToolsOptions\r\n\r\n /**\r\n * The initial state, same as Redux's createStore.\r\n * You may optionally specify it to hydrate the state\r\n * from the server in universal apps, or to restore a previously serialized\r\n * user session. If you use `combineReducers()` to produce the root reducer\r\n * function (either directly or indirectly by passing an object as `reducer`),\r\n * this must be an object with the same shape as the reducer map keys.\r\n */\r\n /* \r\n Not 100% correct but the best approximation we can get:\r\n - if S is a `CombinedState` applying a second `CombinedState` on it does not change anything.\r\n - if it is not, there could be two cases:\r\n - `ReducersMapObject` is being passed in. In this case, we will call `combineReducers` on it and `CombinedState` is correct\r\n - `Reducer` is being passed in. In this case, actually `CombinedState` is wrong and `S` would be correct.\r\n As we cannot distinguish between those two cases without adding another generic paramter, \r\n we just make the pragmatic assumption that the latter almost never happens.\r\n */\r\n preloadedState?: PreloadedState>>\r\n\r\n /**\r\n * The store enhancers to apply. See Redux's `createStore()`.\r\n * All enhancers will be included before the DevTools Extension enhancer.\r\n * If you need to customize the order of enhancers, supply a callback\r\n * function that will receive the original array (ie, `[applyMiddleware]`),\r\n * and should return a new array (such as `[applyMiddleware, offline]`).\r\n * If you only need to add middleware, you can use the `middleware` parameter instead.\r\n */\r\n enhancers?: StoreEnhancer[] | ConfigureEnhancersCallback\r\n}\r\n\r\ntype Middlewares = ReadonlyArray>\r\n\r\n/**\r\n * A Redux store returned by `configureStore()`. Supports dispatching\r\n * side-effectful _thunks_ in addition to plain actions.\r\n *\r\n * @public\r\n */\r\nexport interface EnhancedStore<\r\n S = any,\r\n A extends Action = AnyAction,\r\n M extends Middlewares = Middlewares\r\n> extends Store {\r\n /**\r\n * The `dispatch` method of your store, enhanced by all its middlewares.\r\n *\r\n * @inheritdoc\r\n */\r\n dispatch: DispatchForMiddlewares & Dispatch\r\n}\r\n\r\n/**\r\n * A friendly abstraction over the standard Redux `createStore()` function.\r\n *\r\n * @param config The store configuration.\r\n * @returns A configured Redux store.\r\n *\r\n * @public\r\n */\r\nexport function configureStore<\r\n S = any,\r\n A extends Action = AnyAction,\r\n M extends Middlewares = [ThunkMiddlewareFor]\r\n>(options: ConfigureStoreOptions): EnhancedStore {\r\n const curriedGetDefaultMiddleware = curryGetDefaultMiddleware()\r\n\r\n const {\r\n reducer = undefined,\r\n middleware = curriedGetDefaultMiddleware(),\r\n devTools = true,\r\n preloadedState = undefined,\r\n enhancers = undefined,\r\n } = options || {}\r\n\r\n let rootReducer: Reducer\r\n\r\n if (typeof reducer === 'function') {\r\n rootReducer = reducer\r\n } else if (isPlainObject(reducer)) {\r\n rootReducer = combineReducers(reducer)\r\n } else {\r\n throw new Error(\r\n '\"reducer\" is a required argument, and must be a function or an object of functions that can be passed to combineReducers'\r\n )\r\n }\r\n\r\n let finalMiddleware = middleware\r\n if (typeof finalMiddleware === 'function') {\r\n finalMiddleware = finalMiddleware(curriedGetDefaultMiddleware)\r\n\r\n if (!IS_PRODUCTION && !Array.isArray(finalMiddleware)) {\r\n throw new Error(\r\n 'when using a middleware builder function, an array of middleware must be returned'\r\n )\r\n }\r\n }\r\n if (\r\n !IS_PRODUCTION &&\r\n finalMiddleware.some((item) => typeof item !== 'function')\r\n ) {\r\n throw new Error(\r\n 'each middleware provided to configureStore must be a function'\r\n )\r\n }\r\n\r\n const middlewareEnhancer = applyMiddleware(...finalMiddleware)\r\n\r\n let finalCompose = compose\r\n\r\n if (devTools) {\r\n finalCompose = composeWithDevTools({\r\n // Enable capture of stack traces for dispatched Redux actions\r\n trace: !IS_PRODUCTION,\r\n ...(typeof devTools === 'object' && devTools),\r\n })\r\n }\r\n\r\n let storeEnhancers: StoreEnhancer[] = [middlewareEnhancer]\r\n\r\n if (Array.isArray(enhancers)) {\r\n storeEnhancers = [middlewareEnhancer, ...enhancers]\r\n } else if (typeof enhancers === 'function') {\r\n storeEnhancers = enhancers(storeEnhancers)\r\n }\r\n\r\n const composedEnhancer = finalCompose(...storeEnhancers) as any\r\n\r\n return createStore(rootReducer, preloadedState, composedEnhancer)\r\n}\r\n","import type { Action, ActionCreator, StoreEnhancer } from 'redux'\r\nimport { compose } from 'redux'\r\n\r\n/**\r\n * @public\r\n */\r\nexport interface EnhancerOptions {\r\n /**\r\n * the instance name to be showed on the monitor page. Default value is `document.title`.\r\n * If not specified and there's no document title, it will consist of `tabId` and `instanceId`.\r\n */\r\n name?: string\r\n /**\r\n * action creators functions to be available in the Dispatcher.\r\n */\r\n actionCreators?: ActionCreator[] | { [key: string]: ActionCreator }\r\n /**\r\n * if more than one action is dispatched in the indicated interval, all new actions will be collected and sent at once.\r\n * It is the joint between performance and speed. When set to `0`, all actions will be sent instantly.\r\n * Set it to a higher value when experiencing perf issues (also `maxAge` to a lower value).\r\n *\r\n * @default 500 ms.\r\n */\r\n latency?: number\r\n /**\r\n * (> 1) - maximum allowed actions to be stored in the history tree. The oldest actions are removed once maxAge is reached. It's critical for performance.\r\n *\r\n * @default 50\r\n */\r\n maxAge?: number\r\n /**\r\n * See detailed documentation at http://extension.remotedev.io/docs/API/Arguments.html#serialize\r\n */\r\n serialize?:\r\n | boolean\r\n | {\r\n options?:\r\n | boolean\r\n | {\r\n date?: boolean\r\n regex?: boolean\r\n undefined?: boolean\r\n error?: boolean\r\n symbol?: boolean\r\n map?: boolean\r\n set?: boolean\r\n function?: boolean | Function\r\n }\r\n replacer?: (key: string, value: unknown) => unknown\r\n reviver?: (key: string, value: unknown) => unknown\r\n immutable?: unknown\r\n refs?: unknown[]\r\n }\r\n /**\r\n * function which takes `action` object and id number as arguments, and should return `action` object back.\r\n */\r\n actionSanitizer?: (action: A, id: number) => A\r\n /**\r\n * function which takes `state` object and index as arguments, and should return `state` object back.\r\n */\r\n stateSanitizer?: (state: S, index: number) => S\r\n /**\r\n * *string or array of strings as regex* - actions types to be hidden / shown in the monitors (while passed to the reducers).\r\n * If `actionsWhitelist` specified, `actionsBlacklist` is ignored.\r\n */\r\n actionsBlacklist?: string | string[]\r\n /**\r\n * *string or array of strings as regex* - actions types to be hidden / shown in the monitors (while passed to the reducers).\r\n * If `actionsWhitelist` specified, `actionsBlacklist` is ignored.\r\n */\r\n actionsWhitelist?: string | string[]\r\n /**\r\n * called for every action before sending, takes `state` and `action` object, and returns `true` in case it allows sending the current data to the monitor.\r\n * Use it as a more advanced version of `actionsBlacklist`/`actionsWhitelist` parameters.\r\n */\r\n predicate?: (state: S, action: A) => boolean\r\n /**\r\n * if specified as `false`, it will not record the changes till clicking on `Start recording` button.\r\n * Available only for Redux enhancer, for others use `autoPause`.\r\n *\r\n * @default true\r\n */\r\n shouldRecordChanges?: boolean\r\n /**\r\n * if specified, whenever clicking on `Pause recording` button and there are actions in the history log, will add this action type.\r\n * If not specified, will commit when paused. Available only for Redux enhancer.\r\n *\r\n * @default \"@@PAUSED\"\"\r\n */\r\n pauseActionType?: string\r\n /**\r\n * auto pauses when the extension’s window is not opened, and so has zero impact on your app when not in use.\r\n * Not available for Redux enhancer (as it already does it but storing the data to be sent).\r\n *\r\n * @default false\r\n */\r\n autoPause?: boolean\r\n /**\r\n * if specified as `true`, it will not allow any non-monitor actions to be dispatched till clicking on `Unlock changes` button.\r\n * Available only for Redux enhancer.\r\n *\r\n * @default false\r\n */\r\n shouldStartLocked?: boolean\r\n /**\r\n * if set to `false`, will not recompute the states on hot reloading (or on replacing the reducers). Available only for Redux enhancer.\r\n *\r\n * @default true\r\n */\r\n shouldHotReload?: boolean\r\n /**\r\n * if specified as `true`, whenever there's an exception in reducers, the monitors will show the error message, and next actions will not be dispatched.\r\n *\r\n * @default false\r\n */\r\n shouldCatchErrors?: boolean\r\n /**\r\n * If you want to restrict the extension, specify the features you allow.\r\n * If not specified, all of the features are enabled. When set as an object, only those included as `true` will be allowed.\r\n * Note that except `true`/`false`, `import` and `export` can be set as `custom` (which is by default for Redux enhancer), meaning that the importing/exporting occurs on the client side.\r\n * Otherwise, you'll get/set the data right from the monitor part.\r\n */\r\n features?: {\r\n /**\r\n * start/pause recording of dispatched actions\r\n */\r\n pause?: boolean\r\n /**\r\n * lock/unlock dispatching actions and side effects\r\n */\r\n lock?: boolean\r\n /**\r\n * persist states on page reloading\r\n */\r\n persist?: boolean\r\n /**\r\n * export history of actions in a file\r\n */\r\n export?: boolean | 'custom'\r\n /**\r\n * import history of actions from a file\r\n */\r\n import?: boolean | 'custom'\r\n /**\r\n * jump back and forth (time travelling)\r\n */\r\n jump?: boolean\r\n /**\r\n * skip (cancel) actions\r\n */\r\n skip?: boolean\r\n /**\r\n * drag and drop actions in the history list\r\n */\r\n reorder?: boolean\r\n /**\r\n * dispatch custom actions or action creators\r\n */\r\n dispatch?: boolean\r\n /**\r\n * generate tests for the selected actions\r\n */\r\n test?: boolean\r\n }\r\n /**\r\n * Set to true or a stacktrace-returning function to record call stack traces for dispatched actions.\r\n * Defaults to false.\r\n */\r\n trace?: boolean | ((action: A) => string)\r\n /**\r\n * The maximum number of stack trace entries to record per action. Defaults to 10.\r\n */\r\n traceLimit?: number\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport const composeWithDevTools: {\r\n (options: EnhancerOptions): typeof compose\r\n (...funcs: Array>): StoreEnhancer\r\n} =\r\n typeof window !== 'undefined' &&\r\n (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\r\n ? (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\r\n : function () {\r\n if (arguments.length === 0) return undefined\r\n if (typeof arguments[0] === 'object') return compose\r\n return compose.apply(null, arguments as any as Function[])\r\n }\r\n\r\n/**\r\n * @public\r\n */\r\nexport const devToolsEnhancer: {\r\n (options: EnhancerOptions): StoreEnhancer\r\n} =\r\n typeof window !== 'undefined' && (window as any).__REDUX_DEVTOOLS_EXTENSION__\r\n ? (window as any).__REDUX_DEVTOOLS_EXTENSION__\r\n : function () {\r\n return function (noop) {\r\n return noop\r\n }\r\n }\r\n","/**\r\n * Returns true if the passed value is \"plain\" object, i.e. an object whose\r\n * prototype is the root `Object.prototype`. This includes objects created\r\n * using object literals, but not for instance for class instances.\r\n *\r\n * @param {any} value The value to inspect.\r\n * @returns {boolean} True if the argument appears to be a plain object.\r\n *\r\n * @public\r\n */\r\nexport default function isPlainObject(value: unknown): value is object {\r\n if (typeof value !== 'object' || value === null) return false\r\n\r\n let proto = value\r\n while (Object.getPrototypeOf(proto) !== null) {\r\n proto = Object.getPrototypeOf(proto)\r\n }\r\n\r\n return Object.getPrototypeOf(value) === proto\r\n}\r\n","import type { Middleware, AnyAction } from 'redux'\r\nimport type { ThunkMiddleware } from 'redux-thunk'\r\nimport thunkMiddleware from 'redux-thunk'\r\nimport type { ImmutableStateInvariantMiddlewareOptions } from './immutableStateInvariantMiddleware'\r\n/* PROD_START_REMOVE_UMD */\r\nimport { createImmutableStateInvariantMiddleware } from './immutableStateInvariantMiddleware'\r\n/* PROD_STOP_REMOVE_UMD */\r\n\r\nimport type { SerializableStateInvariantMiddlewareOptions } from './serializableStateInvariantMiddleware'\r\nimport { createSerializableStateInvariantMiddleware } from './serializableStateInvariantMiddleware'\r\nimport { MiddlewareArray } from './utils'\r\n\r\nfunction isBoolean(x: any): x is boolean {\r\n return typeof x === 'boolean'\r\n}\r\n\r\ninterface ThunkOptions {\r\n extraArgument: E\r\n}\r\n\r\ninterface GetDefaultMiddlewareOptions {\r\n thunk?: boolean | ThunkOptions\r\n immutableCheck?: boolean | ImmutableStateInvariantMiddlewareOptions\r\n serializableCheck?: boolean | SerializableStateInvariantMiddlewareOptions\r\n}\r\n\r\nexport type ThunkMiddlewareFor<\r\n S,\r\n O extends GetDefaultMiddlewareOptions = {}\r\n> = O extends {\r\n thunk: false\r\n}\r\n ? never\r\n : O extends { thunk: { extraArgument: infer E } }\r\n ? ThunkMiddleware\r\n :\r\n | ThunkMiddleware //The ThunkMiddleware with a `null` ExtraArgument is here to provide backwards-compatibility.\r\n | ThunkMiddleware\r\n\r\nexport type CurriedGetDefaultMiddleware = <\r\n O extends Partial = {\r\n thunk: true\r\n immutableCheck: true\r\n serializableCheck: true\r\n }\r\n>(\r\n options?: O\r\n) => MiddlewareArray | ThunkMiddlewareFor>\r\n\r\nexport function curryGetDefaultMiddleware<\r\n S = any\r\n>(): CurriedGetDefaultMiddleware {\r\n return function curriedGetDefaultMiddleware(options) {\r\n return getDefaultMiddleware(options)\r\n }\r\n}\r\n\r\n/**\r\n * Returns any array containing the default middleware installed by\r\n * `configureStore()`. Useful if you want to configure your store with a custom\r\n * `middleware` array but still keep the default set.\r\n *\r\n * @return The default middleware used by `configureStore()`.\r\n *\r\n * @public\r\n *\r\n * @deprecated Prefer to use the callback notation for the `middleware` option in `configureStore`\r\n * to access a pre-typed `getDefaultMiddleware` instead.\r\n */\r\nexport function getDefaultMiddleware<\r\n S = any,\r\n O extends Partial = {\r\n thunk: true\r\n immutableCheck: true\r\n serializableCheck: true\r\n }\r\n>(\r\n options: O = {} as O\r\n): MiddlewareArray | ThunkMiddlewareFor> {\r\n const {\r\n thunk = true,\r\n immutableCheck = true,\r\n serializableCheck = true,\r\n } = options\r\n\r\n let middlewareArray: Middleware<{}, S>[] = new MiddlewareArray()\r\n\r\n if (thunk) {\r\n if (isBoolean(thunk)) {\r\n middlewareArray.push(thunkMiddleware)\r\n } else {\r\n middlewareArray.push(\r\n thunkMiddleware.withExtraArgument(thunk.extraArgument)\r\n )\r\n }\r\n }\r\n\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (immutableCheck) {\r\n /* PROD_START_REMOVE_UMD */\r\n let immutableOptions: ImmutableStateInvariantMiddlewareOptions = {}\r\n\r\n if (!isBoolean(immutableCheck)) {\r\n immutableOptions = immutableCheck\r\n }\r\n\r\n middlewareArray.unshift(\r\n createImmutableStateInvariantMiddleware(immutableOptions)\r\n )\r\n /* PROD_STOP_REMOVE_UMD */\r\n }\r\n\r\n if (serializableCheck) {\r\n let serializableOptions: SerializableStateInvariantMiddlewareOptions = {}\r\n\r\n if (!isBoolean(serializableCheck)) {\r\n serializableOptions = serializableCheck\r\n }\r\n\r\n middlewareArray.push(\r\n createSerializableStateInvariantMiddleware(serializableOptions)\r\n )\r\n }\r\n }\r\n\r\n return middlewareArray as any\r\n}\r\n","import type { Middleware } from 'redux'\r\n\r\nexport function getTimeMeasureUtils(maxDelay: number, fnName: string) {\r\n let elapsed = 0\r\n return {\r\n measureTime(fn: () => T): T {\r\n const started = Date.now()\r\n try {\r\n return fn()\r\n } finally {\r\n const finished = Date.now()\r\n elapsed += finished - started\r\n }\r\n },\r\n warnIfExceeded() {\r\n if (elapsed > maxDelay) {\r\n console.warn(`${fnName} took ${elapsed}ms, which is more than the warning threshold of ${maxDelay}ms. \r\nIf your state or actions are very large, you may want to disable the middleware as it might cause too much of a slowdown in development mode. See https://redux-toolkit.js.org/api/getDefaultMiddleware for instructions.\r\nIt is disabled in production builds, so you don't need to worry about that.`)\r\n }\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport class MiddlewareArray<\r\n Middlewares extends Middleware\r\n> extends Array {\r\n constructor(arrayLength?: number)\r\n constructor(...items: Middlewares[])\r\n constructor(...args: any[]) {\r\n super(...args)\r\n Object.setPrototypeOf(this, MiddlewareArray.prototype)\r\n }\r\n\r\n static get [Symbol.species]() {\r\n return MiddlewareArray as any\r\n }\r\n\r\n concat>>(\r\n items: AdditionalMiddlewares\r\n ): MiddlewareArray\r\n\r\n concat>>(\r\n ...items: AdditionalMiddlewares\r\n ): MiddlewareArray\r\n concat(...arr: any[]) {\r\n return super.concat.apply(this, arr)\r\n }\r\n\r\n prepend>>(\r\n items: AdditionalMiddlewares\r\n ): MiddlewareArray\r\n\r\n prepend>>(\r\n ...items: AdditionalMiddlewares\r\n ): MiddlewareArray\r\n\r\n prepend(...arr: any[]) {\r\n if (arr.length === 1 && Array.isArray(arr[0])) {\r\n return new MiddlewareArray(...arr[0].concat(this))\r\n }\r\n return new MiddlewareArray(...arr.concat(this))\r\n }\r\n}\r\n","import type { Middleware } from 'redux'\r\nimport { getTimeMeasureUtils } from './utils'\r\n\r\ntype EntryProcessor = (key: string, value: any) => any\r\n\r\nconst isProduction: boolean = process.env.NODE_ENV === 'production'\r\nconst prefix: string = 'Invariant failed'\r\n\r\n// Throw an error if the condition fails\r\n// Strip out error messages for production\r\n// > Not providing an inline default argument for message as the result is smaller\r\nfunction invariant(condition: any, message?: string) {\r\n if (condition) {\r\n return\r\n }\r\n // Condition not passed\r\n\r\n // In production we strip the message but still throw\r\n if (isProduction) {\r\n throw new Error(prefix)\r\n }\r\n\r\n // When not in production we allow the message to pass through\r\n // *This block will be removed in production builds*\r\n throw new Error(`${prefix}: ${message || ''}`)\r\n}\r\n\r\nfunction stringify(\r\n obj: any,\r\n serializer?: EntryProcessor,\r\n indent?: string | number,\r\n decycler?: EntryProcessor\r\n): string {\r\n return JSON.stringify(obj, getSerialize(serializer, decycler), indent)\r\n}\r\n\r\nfunction getSerialize(\r\n serializer?: EntryProcessor,\r\n decycler?: EntryProcessor\r\n): EntryProcessor {\r\n let stack: any[] = [],\r\n keys: any[] = []\r\n\r\n if (!decycler)\r\n decycler = function (_: string, value: any) {\r\n if (stack[0] === value) return '[Circular ~]'\r\n return (\r\n '[Circular ~.' + keys.slice(0, stack.indexOf(value)).join('.') + ']'\r\n )\r\n }\r\n\r\n return function (this: any, key: string, value: any) {\r\n if (stack.length > 0) {\r\n var thisPos = stack.indexOf(this)\r\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this)\r\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key)\r\n if (~stack.indexOf(value)) value = decycler!.call(this, key, value)\r\n } else stack.push(value)\r\n\r\n return serializer == null ? value : serializer.call(this, key, value)\r\n }\r\n}\r\n\r\n/**\r\n * The default `isImmutable` function.\r\n *\r\n * @public\r\n */\r\nexport function isImmutableDefault(value: unknown): boolean {\r\n return (\r\n typeof value !== 'object' ||\r\n value === null ||\r\n typeof value === 'undefined' ||\r\n Object.isFrozen(value)\r\n )\r\n}\r\n\r\nexport function trackForMutations(\r\n isImmutable: IsImmutableFunc,\r\n ignorePaths: string[] | undefined,\r\n obj: any\r\n) {\r\n const trackedProperties = trackProperties(isImmutable, ignorePaths, obj)\r\n return {\r\n detectMutations() {\r\n return detectMutations(isImmutable, ignorePaths, trackedProperties, obj)\r\n },\r\n }\r\n}\r\n\r\ninterface TrackedProperty {\r\n value: any\r\n children: Record\r\n}\r\n\r\nfunction trackProperties(\r\n isImmutable: IsImmutableFunc,\r\n ignorePaths: IgnorePaths = [],\r\n obj: Record,\r\n path: string = ''\r\n) {\r\n const tracked: Partial = { value: obj }\r\n\r\n if (!isImmutable(obj)) {\r\n tracked.children = {}\r\n\r\n for (const key in obj) {\r\n const childPath = path ? path + '.' + key : key\r\n if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) {\r\n continue\r\n }\r\n\r\n tracked.children[key] = trackProperties(\r\n isImmutable,\r\n ignorePaths,\r\n obj[key],\r\n childPath\r\n )\r\n }\r\n }\r\n return tracked as TrackedProperty\r\n}\r\n\r\ntype IgnorePaths = readonly string[]\r\n\r\nfunction detectMutations(\r\n isImmutable: IsImmutableFunc,\r\n ignorePaths: IgnorePaths = [],\r\n trackedProperty: TrackedProperty,\r\n obj: any,\r\n sameParentRef: boolean = false,\r\n path: string = ''\r\n): { wasMutated: boolean; path?: string } {\r\n const prevObj = trackedProperty ? trackedProperty.value : undefined\r\n\r\n const sameRef = prevObj === obj\r\n\r\n if (sameParentRef && !sameRef && !Number.isNaN(obj)) {\r\n return { wasMutated: true, path }\r\n }\r\n\r\n if (isImmutable(prevObj) || isImmutable(obj)) {\r\n return { wasMutated: false }\r\n }\r\n\r\n // Gather all keys from prev (tracked) and after objs\r\n const keysToDetect: Record = {}\r\n for (let key in trackedProperty.children) {\r\n keysToDetect[key] = true\r\n }\r\n for (let key in obj) {\r\n keysToDetect[key] = true\r\n }\r\n\r\n for (let key in keysToDetect) {\r\n const childPath = path ? path + '.' + key : key\r\n if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) {\r\n continue\r\n }\r\n\r\n const result = detectMutations(\r\n isImmutable,\r\n ignorePaths,\r\n trackedProperty.children[key],\r\n obj[key],\r\n sameRef,\r\n childPath\r\n )\r\n\r\n if (result.wasMutated) {\r\n return result\r\n }\r\n }\r\n return { wasMutated: false }\r\n}\r\n\r\ntype IsImmutableFunc = (value: any) => boolean\r\n\r\n/**\r\n * Options for `createImmutableStateInvariantMiddleware()`.\r\n *\r\n * @public\r\n */\r\nexport interface ImmutableStateInvariantMiddlewareOptions {\r\n /**\r\n Callback function to check if a value is considered to be immutable.\r\n This function is applied recursively to every value contained in the state.\r\n The default implementation will return true for primitive types \r\n (like numbers, strings, booleans, null and undefined).\r\n */\r\n isImmutable?: IsImmutableFunc\r\n /** \r\n An array of dot-separated path strings that match named nodes from \r\n the root state to ignore when checking for immutability.\r\n Defaults to undefined\r\n */\r\n ignoredPaths?: string[]\r\n /** Print a warning if checks take longer than N ms. Default: 32ms */\r\n warnAfter?: number\r\n // @deprecated. Use ignoredPaths\r\n ignore?: string[]\r\n}\r\n\r\n/**\r\n * Creates a middleware that checks whether any state was mutated in between\r\n * dispatches or during a dispatch. If any mutations are detected, an error is\r\n * thrown.\r\n *\r\n * @param options Middleware options.\r\n *\r\n * @public\r\n */\r\nexport function createImmutableStateInvariantMiddleware(\r\n options: ImmutableStateInvariantMiddlewareOptions = {}\r\n): Middleware {\r\n if (process.env.NODE_ENV === 'production') {\r\n return () => (next) => (action) => next(action)\r\n }\r\n\r\n let {\r\n isImmutable = isImmutableDefault,\r\n ignoredPaths,\r\n warnAfter = 32,\r\n ignore,\r\n } = options\r\n\r\n // Alias ignore->ignoredPaths, but prefer ignoredPaths if present\r\n ignoredPaths = ignoredPaths || ignore\r\n\r\n const track = trackForMutations.bind(null, isImmutable, ignoredPaths)\r\n\r\n return ({ getState }) => {\r\n let state = getState()\r\n let tracker = track(state)\r\n\r\n let result\r\n return (next) => (action) => {\r\n const measureUtils = getTimeMeasureUtils(\r\n warnAfter,\r\n 'ImmutableStateInvariantMiddleware'\r\n )\r\n\r\n measureUtils.measureTime(() => {\r\n state = getState()\r\n\r\n result = tracker.detectMutations()\r\n // Track before potentially not meeting the invariant\r\n tracker = track(state)\r\n\r\n invariant(\r\n !result.wasMutated,\r\n `A state mutation was detected between dispatches, in the path '${\r\n result.path || ''\r\n }'. This may cause incorrect behavior. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`\r\n )\r\n })\r\n\r\n const dispatchedAction = next(action)\r\n\r\n measureUtils.measureTime(() => {\r\n state = getState()\r\n\r\n result = tracker.detectMutations()\r\n // Track before potentially not meeting the invariant\r\n tracker = track(state)\r\n\r\n result.wasMutated &&\r\n invariant(\r\n !result.wasMutated,\r\n `A state mutation was detected inside a dispatch, in the path: ${\r\n result.path || ''\r\n }. Take a look at the reducer(s) handling the action ${stringify(\r\n action\r\n )}. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`\r\n )\r\n })\r\n\r\n measureUtils.warnIfExceeded()\r\n\r\n return dispatchedAction\r\n }\r\n }\r\n}\r\n","import isPlainObject from './isPlainObject'\r\nimport type { Middleware } from 'redux'\r\nimport { getTimeMeasureUtils } from './utils'\r\n\r\n/**\r\n * Returns true if the passed value is \"plain\", i.e. a value that is either\r\n * directly JSON-serializable (boolean, number, string, array, plain object)\r\n * or `undefined`.\r\n *\r\n * @param val The value to check.\r\n *\r\n * @public\r\n */\r\nexport function isPlain(val: any) {\r\n const type = typeof val\r\n return (\r\n type === 'undefined' ||\r\n val === null ||\r\n type === 'string' ||\r\n type === 'boolean' ||\r\n type === 'number' ||\r\n Array.isArray(val) ||\r\n isPlainObject(val)\r\n )\r\n}\r\n\r\ninterface NonSerializableValue {\r\n keyPath: string\r\n value: unknown\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport function findNonSerializableValue(\r\n value: unknown,\r\n path: string = '',\r\n isSerializable: (value: unknown) => boolean = isPlain,\r\n getEntries?: (value: unknown) => [string, any][],\r\n ignoredPaths: readonly string[] = []\r\n): NonSerializableValue | false {\r\n let foundNestedSerializable: NonSerializableValue | false\r\n\r\n if (!isSerializable(value)) {\r\n return {\r\n keyPath: path || '',\r\n value: value,\r\n }\r\n }\r\n\r\n if (typeof value !== 'object' || value === null) {\r\n return false\r\n }\r\n\r\n const entries = getEntries != null ? getEntries(value) : Object.entries(value)\r\n\r\n const hasIgnoredPaths = ignoredPaths.length > 0\r\n\r\n for (const [key, nestedValue] of entries) {\r\n const nestedPath = path ? path + '.' + key : key\r\n\r\n if (hasIgnoredPaths && ignoredPaths.indexOf(nestedPath) >= 0) {\r\n continue\r\n }\r\n\r\n if (!isSerializable(nestedValue)) {\r\n return {\r\n keyPath: nestedPath,\r\n value: nestedValue,\r\n }\r\n }\r\n\r\n if (typeof nestedValue === 'object') {\r\n foundNestedSerializable = findNonSerializableValue(\r\n nestedValue,\r\n nestedPath,\r\n isSerializable,\r\n getEntries,\r\n ignoredPaths\r\n )\r\n\r\n if (foundNestedSerializable) {\r\n return foundNestedSerializable\r\n }\r\n }\r\n }\r\n\r\n return false\r\n}\r\n\r\n/**\r\n * Options for `createSerializableStateInvariantMiddleware()`.\r\n *\r\n * @public\r\n */\r\nexport interface SerializableStateInvariantMiddlewareOptions {\r\n /**\r\n * The function to check if a value is considered serializable. This\r\n * function is applied recursively to every value contained in the\r\n * state. Defaults to `isPlain()`.\r\n */\r\n isSerializable?: (value: any) => boolean\r\n /**\r\n * The function that will be used to retrieve entries from each\r\n * value. If unspecified, `Object.entries` will be used. Defaults\r\n * to `undefined`.\r\n */\r\n getEntries?: (value: any) => [string, any][]\r\n\r\n /**\r\n * An array of action types to ignore when checking for serializability.\r\n * Defaults to []\r\n */\r\n ignoredActions?: string[]\r\n\r\n /**\r\n * An array of dot-separated path strings to ignore when checking\r\n * for serializability, Defaults to ['meta.arg']\r\n */\r\n ignoredActionPaths?: string[]\r\n\r\n /**\r\n * An array of dot-separated path strings to ignore when checking\r\n * for serializability, Defaults to []\r\n */\r\n ignoredPaths?: string[]\r\n /**\r\n * Execution time warning threshold. If the middleware takes longer\r\n * than `warnAfter` ms, a warning will be displayed in the console.\r\n * Defaults to 32ms.\r\n */\r\n warnAfter?: number\r\n\r\n /**\r\n * Opt out of checking state, but continue checking actions\r\n */\r\n ignoreState?: boolean\r\n}\r\n\r\n/**\r\n * Creates a middleware that, after every state change, checks if the new\r\n * state is serializable. If a non-serializable value is found within the\r\n * state, an error is printed to the console.\r\n *\r\n * @param options Middleware options.\r\n *\r\n * @public\r\n */\r\nexport function createSerializableStateInvariantMiddleware(\r\n options: SerializableStateInvariantMiddlewareOptions = {}\r\n): Middleware {\r\n if (process.env.NODE_ENV === 'production') {\r\n return () => (next) => (action) => next(action)\r\n }\r\n const {\r\n isSerializable = isPlain,\r\n getEntries,\r\n ignoredActions = [],\r\n ignoredActionPaths = ['meta.arg', 'meta.baseQueryMeta'],\r\n ignoredPaths = [],\r\n warnAfter = 32,\r\n ignoreState = false,\r\n } = options\r\n\r\n return (storeAPI) => (next) => (action) => {\r\n if (ignoredActions.length && ignoredActions.indexOf(action.type) !== -1) {\r\n return next(action)\r\n }\r\n\r\n const measureUtils = getTimeMeasureUtils(\r\n warnAfter,\r\n 'SerializableStateInvariantMiddleware'\r\n )\r\n measureUtils.measureTime(() => {\r\n const foundActionNonSerializableValue = findNonSerializableValue(\r\n action,\r\n '',\r\n isSerializable,\r\n getEntries,\r\n ignoredActionPaths\r\n )\r\n\r\n if (foundActionNonSerializableValue) {\r\n const { keyPath, value } = foundActionNonSerializableValue\r\n\r\n console.error(\r\n `A non-serializable value was detected in an action, in the path: \\`${keyPath}\\`. Value:`,\r\n value,\r\n '\\nTake a look at the logic that dispatched this action: ',\r\n action,\r\n '\\n(See https://redux.js.org/faq/actions#why-should-type-be-a-string-or-at-least-serializable-why-should-my-action-types-be-constants)',\r\n '\\n(To allow non-serializable values see: https://redux-toolkit.js.org/usage/usage-guide#working-with-non-serializable-data)'\r\n )\r\n }\r\n })\r\n\r\n const result = next(action)\r\n\r\n if (!ignoreState) {\r\n measureUtils.measureTime(() => {\r\n const state = storeAPI.getState()\r\n\r\n const foundStateNonSerializableValue = findNonSerializableValue(\r\n state,\r\n '',\r\n isSerializable,\r\n getEntries,\r\n ignoredPaths\r\n )\r\n\r\n if (foundStateNonSerializableValue) {\r\n const { keyPath, value } = foundStateNonSerializableValue\r\n\r\n console.error(\r\n `A non-serializable value was detected in the state, in the path: \\`${keyPath}\\`. Value:`,\r\n value,\r\n `\r\nTake a look at the reducer(s) handling this action type: ${action.type}.\r\n(See https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state)`\r\n )\r\n }\r\n })\r\n\r\n measureUtils.warnIfExceeded()\r\n }\r\n\r\n return result\r\n }\r\n}\r\n","import type { Action } from 'redux'\r\nimport type {\r\n IsUnknownOrNonInferrable,\r\n IfMaybeUndefined,\r\n IfVoid,\r\n IsAny,\r\n} from './tsHelpers'\r\nimport isPlainObject from './isPlainObject'\r\n\r\n/**\r\n * An action with a string type and an associated payload. This is the\r\n * type of action returned by `createAction()` action creators.\r\n *\r\n * @template P The type of the action's payload.\r\n * @template T the type used for the action type.\r\n * @template M The type of the action's meta (optional)\r\n * @template E The type of the action's error (optional)\r\n *\r\n * @public\r\n */\r\nexport type PayloadAction<\r\n P = void,\r\n T extends string = string,\r\n M = never,\r\n E = never\r\n> = {\r\n payload: P\r\n type: T\r\n} & ([M] extends [never]\r\n ? {}\r\n : {\r\n meta: M\r\n }) &\r\n ([E] extends [never]\r\n ? {}\r\n : {\r\n error: E\r\n })\r\n\r\n/**\r\n * A \"prepare\" method to be used as the second parameter of `createAction`.\r\n * Takes any number of arguments and returns a Flux Standard Action without\r\n * type (will be added later) that *must* contain a payload (might be undefined).\r\n *\r\n * @public\r\n */\r\nexport type PrepareAction

=\r\n | ((...args: any[]) => { payload: P })\r\n | ((...args: any[]) => { payload: P; meta: any })\r\n | ((...args: any[]) => { payload: P; error: any })\r\n | ((...args: any[]) => { payload: P; meta: any; error: any })\r\n\r\n/**\r\n * Internal version of `ActionCreatorWithPreparedPayload`. Not to be used externally.\r\n *\r\n * @internal\r\n */\r\nexport type _ActionCreatorWithPreparedPayload<\r\n PA extends PrepareAction | void,\r\n T extends string = string\r\n> = PA extends PrepareAction\r\n ? ActionCreatorWithPreparedPayload<\r\n Parameters,\r\n P,\r\n T,\r\n ReturnType extends {\r\n error: infer E\r\n }\r\n ? E\r\n : never,\r\n ReturnType extends {\r\n meta: infer M\r\n }\r\n ? M\r\n : never\r\n >\r\n : void\r\n\r\n/**\r\n * Basic type for all action creators.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n */\r\ninterface BaseActionCreator {\r\n type: T\r\n match: (action: Action) => action is PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator that takes multiple arguments that are passed\r\n * to a `PrepareAction` method to create the final Action.\r\n * @typeParam Args arguments for the action creator function\r\n * @typeParam P `payload` type\r\n * @typeParam T `type` name\r\n * @typeParam E optional `error` type\r\n * @typeParam M optional `meta` type\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithPreparedPayload<\r\n Args extends unknown[],\r\n P,\r\n T extends string = string,\r\n E = never,\r\n M = never\r\n> extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} with `Args` will return\r\n * an Action with a payload of type `P` and (depending on the `PrepareAction`\r\n * method used) a `meta`- and `error` property of types `M` and `E` respectively.\r\n */\r\n (...args: Args): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator of type `T` that takes an optional payload of type `P`.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithOptionalPayload\r\n extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} with an argument will\r\n * return a {@link PayloadAction} of type `T` with a payload of `P`.\r\n * Calling it without an argument will return a PayloadAction with a payload of `undefined`.\r\n */\r\n (payload?: P): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator of type `T` that takes no payload.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithoutPayload\r\n extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} will\r\n * return a {@link PayloadAction} of type `T` with a payload of `undefined`\r\n */\r\n (): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator of type `T` that requires a payload of type P.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithPayload\r\n extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} with an argument will\r\n * return a {@link PayloadAction} of type `T` with a payload of `P`\r\n */\r\n (payload: P): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator of type `T` whose `payload` type could not be inferred. Accepts everything as `payload`.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithNonInferrablePayload<\r\n T extends string = string\r\n> extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} with an argument will\r\n * return a {@link PayloadAction} of type `T` with a payload\r\n * of exactly the type of the argument.\r\n */\r\n (payload: PT): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator that produces actions with a `payload` attribute.\r\n *\r\n * @typeParam P the `payload` type\r\n * @typeParam T the `type` of the resulting action\r\n * @typeParam PA if the resulting action is preprocessed by a `prepare` method, the signature of said method.\r\n *\r\n * @public\r\n */\r\nexport type PayloadActionCreator<\r\n P = void,\r\n T extends string = string,\r\n PA extends PrepareAction

| void = void\r\n> = IfPrepareActionMethodProvided<\r\n PA,\r\n _ActionCreatorWithPreparedPayload,\r\n // else\r\n IsAny<\r\n P,\r\n ActionCreatorWithPayload,\r\n IsUnknownOrNonInferrable<\r\n P,\r\n ActionCreatorWithNonInferrablePayload,\r\n // else\r\n IfVoid<\r\n P,\r\n ActionCreatorWithoutPayload,\r\n // else\r\n IfMaybeUndefined<\r\n P,\r\n ActionCreatorWithOptionalPayload,\r\n // else\r\n ActionCreatorWithPayload\r\n >\r\n >\r\n >\r\n >\r\n>\r\n\r\n/**\r\n * A utility function to create an action creator for the given action type\r\n * string. The action creator accepts a single argument, which will be included\r\n * in the action object as a field called payload. The action creator function\r\n * will also have its toString() overriden so that it returns the action type,\r\n * allowing it to be used in reducer logic that is looking for that action type.\r\n *\r\n * @param type The action type to use for created actions.\r\n * @param prepare (optional) a method that takes any number of arguments and returns { payload } or { payload, meta }.\r\n * If this is given, the resulting action creator will pass its arguments to this method to calculate payload & meta.\r\n *\r\n * @public\r\n */\r\nexport function createAction

(\r\n type: T\r\n): PayloadActionCreator\r\n\r\n/**\r\n * A utility function to create an action creator for the given action type\r\n * string. The action creator accepts a single argument, which will be included\r\n * in the action object as a field called payload. The action creator function\r\n * will also have its toString() overriden so that it returns the action type,\r\n * allowing it to be used in reducer logic that is looking for that action type.\r\n *\r\n * @param type The action type to use for created actions.\r\n * @param prepare (optional) a method that takes any number of arguments and returns { payload } or { payload, meta }.\r\n * If this is given, the resulting action creator will pass its arguments to this method to calculate payload & meta.\r\n *\r\n * @public\r\n */\r\nexport function createAction<\r\n PA extends PrepareAction,\r\n T extends string = string\r\n>(\r\n type: T,\r\n prepareAction: PA\r\n): PayloadActionCreator['payload'], T, PA>\r\n\r\nexport function createAction(type: string, prepareAction?: Function): any {\r\n function actionCreator(...args: any[]) {\r\n if (prepareAction) {\r\n let prepared = prepareAction(...args)\r\n if (!prepared) {\r\n throw new Error('prepareAction did not return an object')\r\n }\r\n\r\n return {\r\n type,\r\n payload: prepared.payload,\r\n ...('meta' in prepared && { meta: prepared.meta }),\r\n ...('error' in prepared && { error: prepared.error }),\r\n }\r\n }\r\n return { type, payload: args[0] }\r\n }\r\n\r\n actionCreator.toString = () => `${type}`\r\n\r\n actionCreator.type = type\r\n\r\n actionCreator.match = (action: Action): action is PayloadAction =>\r\n action.type === type\r\n\r\n return actionCreator\r\n}\r\n\r\nexport function isFSA(action: unknown): action is {\r\n type: string\r\n payload?: unknown\r\n error?: unknown\r\n meta?: unknown\r\n} {\r\n return (\r\n isPlainObject(action) &&\r\n typeof (action as any).type === 'string' &&\r\n Object.keys(action).every(isValidKey)\r\n )\r\n}\r\n\r\nfunction isValidKey(key: string) {\r\n return ['type', 'payload', 'error', 'meta'].indexOf(key) > -1\r\n}\r\n\r\n/**\r\n * Returns the action type of the actions created by the passed\r\n * `createAction()`-generated action creator (arbitrary action creators\r\n * are not supported).\r\n *\r\n * @param action The action creator whose action type to get.\r\n * @returns The action type used by the action creator.\r\n *\r\n * @public\r\n */\r\nexport function getType(\r\n actionCreator: PayloadActionCreator\r\n): T {\r\n return `${actionCreator}` as T\r\n}\r\n\r\n// helper types for more readable typings\r\n\r\ntype IfPrepareActionMethodProvided<\r\n PA extends PrepareAction | void,\r\n True,\r\n False\r\n> = PA extends (...args: any[]) => any ? True : False\r\n","import type { Draft } from 'immer'\r\nimport createNextState, { isDraft, isDraftable } from 'immer'\r\nimport type { AnyAction, Action, Reducer } from 'redux'\r\nimport type { ActionReducerMapBuilder } from './mapBuilders'\r\nimport { executeReducerBuilderCallback } from './mapBuilders'\r\nimport type { NoInfer } from './tsHelpers'\r\n\r\n/**\r\n * Defines a mapping from action types to corresponding action object shapes.\r\n *\r\n * @deprecated This should not be used manually - it is only used for internal\r\n * inference purposes and should not have any further value.\r\n * It might be removed in the future.\r\n * @public\r\n */\r\nexport type Actions = Record\r\n\r\nexport interface ActionMatcher {\r\n (action: AnyAction): action is A\r\n}\r\n\r\nexport type ActionMatcherDescription = {\r\n matcher: ActionMatcher\r\n reducer: CaseReducer>\r\n}\r\n\r\nexport type ReadonlyActionMatcherDescriptionCollection = ReadonlyArray<\r\n ActionMatcherDescription\r\n>\r\n\r\nexport type ActionMatcherDescriptionCollection = Array<\r\n ActionMatcherDescription\r\n>\r\n\r\n/**\r\n * An *case reducer* is a reducer function for a specific action type. Case\r\n * reducers can be composed to full reducers using `createReducer()`.\r\n *\r\n * Unlike a normal Redux reducer, a case reducer is never called with an\r\n * `undefined` state to determine the initial state. Instead, the initial\r\n * state is explicitly specified as an argument to `createReducer()`.\r\n *\r\n * In addition, a case reducer can choose to mutate the passed-in `state`\r\n * value directly instead of returning a new state. This does not actually\r\n * cause the store state to be mutated directly; instead, thanks to\r\n * [immer](https://github.com/mweststrate/immer), the mutations are\r\n * translated to copy operations that result in a new state.\r\n *\r\n * @public\r\n */\r\nexport type CaseReducer = (\r\n state: Draft,\r\n action: A\r\n) => S | void | Draft\r\n\r\n/**\r\n * A mapping from action types to case reducers for `createReducer()`.\r\n *\r\n * @deprecated This should not be used manually - it is only used\r\n * for internal inference purposes and using it manually\r\n * would lead to type erasure.\r\n * It might be removed in the future.\r\n * @public\r\n */\r\nexport type CaseReducers = {\r\n [T in keyof AS]: AS[T] extends Action ? CaseReducer : void\r\n}\r\n\r\n/**\r\n * A utility function that allows defining a reducer as a mapping from action\r\n * type to *case reducer* functions that handle these action types. The\r\n * reducer's initial state is passed as the first argument.\r\n *\r\n * @remarks\r\n * The body of every case reducer is implicitly wrapped with a call to\r\n * `produce()` from the [immer](https://github.com/mweststrate/immer) library.\r\n * This means that rather than returning a new state object, you can also\r\n * mutate the passed-in state object directly; these mutations will then be\r\n * automatically and efficiently translated into copies, giving you both\r\n * convenience and immutability.\r\n *\r\n * @overloadSummary\r\n * This overload accepts a callback function that receives a `builder` object as its argument.\r\n * That builder provides `addCase`, `addMatcher` and `addDefaultCase` functions that may be\r\n * called to define what actions this reducer will handle.\r\n *\r\n * @param initialState - The initial state that should be used when the reducer is called the first time.\r\n * @param builderCallback - A callback that receives a *builder* object to define\r\n * case reducers via calls to `builder.addCase(actionCreatorOrType, reducer)`.\r\n * @example\r\n```ts\r\nimport {\r\n createAction,\r\n createReducer,\r\n AnyAction,\r\n PayloadAction,\r\n} from \"@reduxjs/toolkit\";\r\n\r\nconst increment = createAction(\"increment\");\r\nconst decrement = createAction(\"decrement\");\r\n\r\nfunction isActionWithNumberPayload(\r\n action: AnyAction\r\n): action is PayloadAction {\r\n return typeof action.payload === \"number\";\r\n}\r\n\r\ncreateReducer(\r\n {\r\n counter: 0,\r\n sumOfNumberPayloads: 0,\r\n unhandledActions: 0,\r\n },\r\n (builder) => {\r\n builder\r\n .addCase(increment, (state, action) => {\r\n // action is inferred correctly here\r\n state.counter += action.payload;\r\n })\r\n // You can chain calls, or have separate `builder.addCase()` lines each time\r\n .addCase(decrement, (state, action) => {\r\n state.counter -= action.payload;\r\n })\r\n // You can apply a \"matcher function\" to incoming actions\r\n .addMatcher(isActionWithNumberPayload, (state, action) => {})\r\n // and provide a default case if no other handlers matched\r\n .addDefaultCase((state, action) => {});\r\n }\r\n);\r\n```\r\n * @public\r\n */\r\nexport function createReducer(\r\n initialState: S,\r\n builderCallback: (builder: ActionReducerMapBuilder) => void\r\n): Reducer\r\n\r\n/**\r\n * A utility function that allows defining a reducer as a mapping from action\r\n * type to *case reducer* functions that handle these action types. The\r\n * reducer's initial state is passed as the first argument.\r\n *\r\n * The body of every case reducer is implicitly wrapped with a call to\r\n * `produce()` from the [immer](https://github.com/mweststrate/immer) library.\r\n * This means that rather than returning a new state object, you can also\r\n * mutate the passed-in state object directly; these mutations will then be\r\n * automatically and efficiently translated into copies, giving you both\r\n * convenience and immutability.\r\n * \r\n * @overloadSummary\r\n * This overload accepts an object where the keys are string action types, and the values\r\n * are case reducer functions to handle those action types.\r\n *\r\n * @param initialState - The initial state that should be used when the reducer is called the first time.\r\n * @param actionsMap - An object mapping from action types to _case reducers_, each of which handles one specific action type.\r\n * @param actionMatchers - An array of matcher definitions in the form `{matcher, reducer}`.\r\n * All matching reducers will be executed in order, independently if a case reducer matched or not.\r\n * @param defaultCaseReducer - A \"default case\" reducer that is executed if no case reducer and no matcher\r\n * reducer was executed for this action.\r\n *\r\n * @example\r\n```js\r\nconst counterReducer = createReducer(0, {\r\n increment: (state, action) => state + action.payload,\r\n decrement: (state, action) => state - action.payload\r\n})\r\n```\r\n \r\n * Action creators that were generated using [`createAction`](./createAction) may be used directly as the keys here, using computed property syntax:\r\n\r\n```js\r\nconst increment = createAction('increment')\r\nconst decrement = createAction('decrement')\r\n\r\nconst counterReducer = createReducer(0, {\r\n [increment]: (state, action) => state + action.payload,\r\n [decrement.type]: (state, action) => state - action.payload\r\n})\r\n```\r\n * @public\r\n */\r\nexport function createReducer<\r\n S,\r\n CR extends CaseReducers = CaseReducers\r\n>(\r\n initialState: S,\r\n actionsMap: CR,\r\n actionMatchers?: ActionMatcherDescriptionCollection,\r\n defaultCaseReducer?: CaseReducer\r\n): Reducer\r\n\r\nexport function createReducer(\r\n initialState: S,\r\n mapOrBuilderCallback:\r\n | CaseReducers\r\n | ((builder: ActionReducerMapBuilder) => void),\r\n actionMatchers: ReadonlyActionMatcherDescriptionCollection = [],\r\n defaultCaseReducer?: CaseReducer\r\n): Reducer {\r\n let [actionsMap, finalActionMatchers, finalDefaultCaseReducer] =\r\n typeof mapOrBuilderCallback === 'function'\r\n ? executeReducerBuilderCallback(mapOrBuilderCallback)\r\n : [mapOrBuilderCallback, actionMatchers, defaultCaseReducer]\r\n\r\n const frozenInitialState = createNextState(initialState, () => {})\r\n\r\n return function (state = frozenInitialState, action): S {\r\n let caseReducers = [\r\n actionsMap[action.type],\r\n ...finalActionMatchers\r\n .filter(({ matcher }) => matcher(action))\r\n .map(({ reducer }) => reducer),\r\n ]\r\n if (caseReducers.filter((cr) => !!cr).length === 0) {\r\n caseReducers = [finalDefaultCaseReducer]\r\n }\r\n\r\n return caseReducers.reduce((previousState, caseReducer): S => {\r\n if (caseReducer) {\r\n if (isDraft(previousState)) {\r\n // If it's already a draft, we must already be inside a `createNextState` call,\r\n // likely because this is being wrapped in `createReducer`, `createSlice`, or nested\r\n // inside an existing draft. It's safe to just pass the draft to the mutator.\r\n const draft = previousState as Draft // We can assume this is already a draft\r\n const result = caseReducer(draft, action)\r\n\r\n if (typeof result === 'undefined') {\r\n return previousState\r\n }\r\n\r\n return result as S\r\n } else if (!isDraftable(previousState)) {\r\n // If state is not draftable (ex: a primitive, such as 0), we want to directly\r\n // return the caseReducer func and not wrap it with produce.\r\n const result = caseReducer(previousState as any, action)\r\n\r\n if (typeof result === 'undefined') {\r\n if (previousState === null) {\r\n return previousState\r\n }\r\n throw Error(\r\n 'A case reducer on a non-draftable value must not return undefined'\r\n )\r\n }\r\n\r\n return result as S\r\n } else {\r\n // @ts-ignore createNextState() produces an Immutable> rather\r\n // than an Immutable, and TypeScript cannot find out how to reconcile\r\n // these two types.\r\n return createNextState(previousState, (draft: Draft) => {\r\n return caseReducer(draft, action)\r\n })\r\n }\r\n }\r\n\r\n return previousState\r\n }, state)\r\n }\r\n}\r\n","import type { Action, AnyAction } from 'redux'\r\nimport type {\r\n CaseReducer,\r\n CaseReducers,\r\n ActionMatcher,\r\n ActionMatcherDescriptionCollection,\r\n} from './createReducer'\r\n\r\nexport interface TypedActionCreator {\r\n (...args: any[]): Action\r\n type: Type\r\n}\r\n\r\n/**\r\n * A builder for an action <-> reducer map.\r\n *\r\n * @public\r\n */\r\nexport interface ActionReducerMapBuilder {\r\n /**\r\n * Adds a case reducer to handle a single exact action type.\r\n * @remarks\r\n * All calls to `builder.addCase` must come before any calls to `builder.addMatcher` or `builder.addDefaultCase`.\r\n * @param actionCreator - Either a plain action type string, or an action creator generated by [`createAction`](./createAction) that can be used to determine the action type.\r\n * @param reducer - The actual case reducer function.\r\n */\r\n addCase>(\r\n actionCreator: ActionCreator,\r\n reducer: CaseReducer>\r\n ): ActionReducerMapBuilder\r\n /**\r\n * Adds a case reducer to handle a single exact action type.\r\n * @remarks\r\n * All calls to `builder.addCase` must come before any calls to `builder.addMatcher` or `builder.addDefaultCase`.\r\n * @param actionCreator - Either a plain action type string, or an action creator generated by [`createAction`](./createAction) that can be used to determine the action type.\r\n * @param reducer - The actual case reducer function.\r\n */\r\n addCase>(\r\n type: Type,\r\n reducer: CaseReducer\r\n ): ActionReducerMapBuilder\r\n\r\n /**\r\n * Allows you to match your incoming actions against your own filter function instead of only the `action.type` property.\r\n * @remarks\r\n * If multiple matcher reducers match, all of them will be executed in the order\r\n * they were defined in - even if a case reducer already matched.\r\n * All calls to `builder.addMatcher` must come after any calls to `builder.addCase` and before any calls to `builder.addDefaultCase`.\r\n * @param matcher - A matcher function. In TypeScript, this should be a [type predicate](https://www.typescriptlang.org/docs/handbook/advanced-types.html#using-type-predicates)\r\n * function\r\n * @param reducer - The actual case reducer function.\r\n *\r\n * @example\r\n```ts\r\nimport {\r\n createAction,\r\n createReducer,\r\n AsyncThunk,\r\n AnyAction,\r\n} from \"@reduxjs/toolkit\";\r\n\r\ntype GenericAsyncThunk = AsyncThunk;\r\n\r\ntype PendingAction = ReturnType;\r\ntype RejectedAction = ReturnType;\r\ntype FulfilledAction = ReturnType;\r\n\r\nconst initialState: Record = {};\r\nconst resetAction = createAction(\"reset-tracked-loading-state\");\r\n\r\nfunction isPendingAction(action: AnyAction): action is PendingAction {\r\n return action.type.endsWith(\"/pending\");\r\n}\r\n\r\nconst reducer = createReducer(initialState, (builder) => {\r\n builder\r\n .addCase(resetAction, () => initialState)\r\n // matcher can be defined outside as a type predicate function\r\n .addMatcher(isPendingAction, (state, action) => {\r\n state[action.meta.requestId] = \"pending\";\r\n })\r\n .addMatcher(\r\n // matcher can be defined inline as a type predicate function\r\n (action): action is RejectedAction => action.type.endsWith(\"/rejected\"),\r\n (state, action) => {\r\n state[action.meta.requestId] = \"rejected\";\r\n }\r\n )\r\n // matcher can just return boolean and the matcher can receive a generic argument\r\n .addMatcher(\r\n (action) => action.type.endsWith(\"/fulfilled\"),\r\n (state, action) => {\r\n state[action.meta.requestId] = \"fulfilled\";\r\n }\r\n );\r\n});\r\n```\r\n */\r\n addMatcher(\r\n matcher: ActionMatcher | ((action: AnyAction) => boolean),\r\n reducer: CaseReducer\r\n ): Omit, 'addCase'>\r\n\r\n /**\r\n * Adds a \"default case\" reducer that is executed if no case reducer and no matcher\r\n * reducer was executed for this action.\r\n * @param reducer - The fallback \"default case\" reducer function.\r\n *\r\n * @example\r\n```ts\r\nimport { createReducer } from '@reduxjs/toolkit'\r\nconst initialState = { otherActions: 0 }\r\nconst reducer = createReducer(initialState, builder => {\r\n builder\r\n // .addCase(...)\r\n // .addMatcher(...)\r\n .addDefaultCase((state, action) => {\r\n state.otherActions++\r\n })\r\n})\r\n```\r\n */\r\n addDefaultCase(reducer: CaseReducer): {}\r\n}\r\n\r\nexport function executeReducerBuilderCallback(\r\n builderCallback: (builder: ActionReducerMapBuilder) => void\r\n): [\r\n CaseReducers,\r\n ActionMatcherDescriptionCollection,\r\n CaseReducer | undefined\r\n] {\r\n const actionsMap: CaseReducers = {}\r\n const actionMatchers: ActionMatcherDescriptionCollection = []\r\n let defaultCaseReducer: CaseReducer | undefined\r\n const builder = {\r\n addCase(\r\n typeOrActionCreator: string | TypedActionCreator,\r\n reducer: CaseReducer\r\n ) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n /*\r\n to keep the definition by the user in line with actual behavior, \r\n we enforce `addCase` to always be called before calling `addMatcher`\r\n as matching cases take precedence over matchers\r\n */\r\n if (actionMatchers.length > 0) {\r\n throw new Error(\r\n '`builder.addCase` should only be called before calling `builder.addMatcher`'\r\n )\r\n }\r\n if (defaultCaseReducer) {\r\n throw new Error(\r\n '`builder.addCase` should only be called before calling `builder.addDefaultCase`'\r\n )\r\n }\r\n }\r\n const type =\r\n typeof typeOrActionCreator === 'string'\r\n ? typeOrActionCreator\r\n : typeOrActionCreator.type\r\n if (type in actionsMap) {\r\n throw new Error(\r\n 'addCase cannot be called with two reducers for the same action type'\r\n )\r\n }\r\n actionsMap[type] = reducer\r\n return builder\r\n },\r\n addMatcher(\r\n matcher: ActionMatcher,\r\n reducer: CaseReducer\r\n ) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (defaultCaseReducer) {\r\n throw new Error(\r\n '`builder.addMatcher` should only be called before calling `builder.addDefaultCase`'\r\n )\r\n }\r\n }\r\n actionMatchers.push({ matcher, reducer })\r\n return builder\r\n },\r\n addDefaultCase(reducer: CaseReducer) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (defaultCaseReducer) {\r\n throw new Error('`builder.addDefaultCase` can only be called once')\r\n }\r\n }\r\n defaultCaseReducer = reducer\r\n return builder\r\n },\r\n }\r\n builderCallback(builder)\r\n return [actionsMap, actionMatchers, defaultCaseReducer]\r\n}\r\n","import type { Reducer } from 'redux'\r\nimport type {\r\n ActionCreatorWithoutPayload,\r\n PayloadAction,\r\n PayloadActionCreator,\r\n PrepareAction,\r\n _ActionCreatorWithPreparedPayload,\r\n} from './createAction'\r\nimport { createAction } from './createAction'\r\nimport type { CaseReducer, CaseReducers } from './createReducer'\r\nimport { createReducer } from './createReducer'\r\nimport type { ActionReducerMapBuilder } from './mapBuilders'\r\nimport { executeReducerBuilderCallback } from './mapBuilders'\r\nimport type { NoInfer } from './tsHelpers'\r\n\r\n/**\r\n * An action creator attached to a slice.\r\n *\r\n * @deprecated please use PayloadActionCreator directly\r\n *\r\n * @public\r\n */\r\nexport type SliceActionCreator

= PayloadActionCreator

\r\n\r\n/**\r\n * The return value of `createSlice`\r\n *\r\n * @public\r\n */\r\nexport interface Slice<\r\n State = any,\r\n CaseReducers extends SliceCaseReducers = SliceCaseReducers,\r\n Name extends string = string\r\n> {\r\n /**\r\n * The slice name.\r\n */\r\n name: Name\r\n\r\n /**\r\n * The slice's reducer.\r\n */\r\n reducer: Reducer\r\n\r\n /**\r\n * Action creators for the types of actions that are handled by the slice\r\n * reducer.\r\n */\r\n actions: CaseReducerActions\r\n\r\n /**\r\n * The individual case reducer functions that were passed in the `reducers` parameter.\r\n * This enables reuse and testing if they were defined inline when calling `createSlice`.\r\n */\r\n caseReducers: SliceDefinedCaseReducers\r\n}\r\n\r\n/**\r\n * Options for `createSlice()`.\r\n *\r\n * @public\r\n */\r\nexport interface CreateSliceOptions<\r\n State = any,\r\n CR extends SliceCaseReducers = SliceCaseReducers,\r\n Name extends string = string\r\n> {\r\n /**\r\n * The slice's name. Used to namespace the generated action types.\r\n */\r\n name: Name\r\n\r\n /**\r\n * The initial state to be returned by the slice reducer.\r\n */\r\n initialState: State\r\n\r\n /**\r\n * A mapping from action types to action-type-specific *case reducer*\r\n * functions. For every action type, a matching action creator will be\r\n * generated using `createAction()`.\r\n */\r\n reducers: ValidateSliceCaseReducers\r\n\r\n /**\r\n * A callback that receives a *builder* object to define\r\n * case reducers via calls to `builder.addCase(actionCreatorOrType, reducer)`.\r\n * \r\n * Alternatively, a mapping from action types to action-type-specific *case reducer*\r\n * functions. These reducers should have existing action types used\r\n * as the keys, and action creators will _not_ be generated.\r\n * \r\n * @example\r\n```ts\r\nimport { createAction, createSlice, Action, AnyAction } from '@reduxjs/toolkit'\r\nconst incrementBy = createAction('incrementBy')\r\nconst decrement = createAction('decrement')\r\n\r\ninterface RejectedAction extends Action {\r\n error: Error\r\n}\r\n\r\nfunction isRejectedAction(action: AnyAction): action is RejectedAction {\r\n return action.type.endsWith('rejected')\r\n}\r\n\r\ncreateSlice({\r\n name: 'counter',\r\n initialState: 0,\r\n reducers: {},\r\n extraReducers: builder => {\r\n builder\r\n .addCase(incrementBy, (state, action) => {\r\n // action is inferred correctly here if using TS\r\n })\r\n // You can chain calls, or have separate `builder.addCase()` lines each time\r\n .addCase(decrement, (state, action) => {})\r\n // You can match a range of action types\r\n .addMatcher(\r\n isRejectedAction,\r\n // `action` will be inferred as a RejectedAction due to isRejectedAction being defined as a type guard\r\n (state, action) => {}\r\n )\r\n // and provide a default case if no other handlers matched\r\n .addDefaultCase((state, action) => {})\r\n }\r\n})\r\n```\r\n */\r\n extraReducers?:\r\n | CaseReducers, any>\r\n | ((builder: ActionReducerMapBuilder>) => void)\r\n}\r\n\r\n/**\r\n * A CaseReducer with a `prepare` method.\r\n *\r\n * @public\r\n */\r\nexport type CaseReducerWithPrepare = {\r\n reducer: CaseReducer\r\n prepare: PrepareAction\r\n}\r\n\r\n/**\r\n * The type describing a slice's `reducers` option.\r\n *\r\n * @public\r\n */\r\nexport type SliceCaseReducers = {\r\n [K: string]:\r\n | CaseReducer>\r\n | CaseReducerWithPrepare>\r\n}\r\n\r\n/**\r\n * Derives the slice's `actions` property from the `reducers` options\r\n *\r\n * @public\r\n */\r\nexport type CaseReducerActions> = {\r\n [Type in keyof CaseReducers]: CaseReducers[Type] extends { prepare: any }\r\n ? ActionCreatorForCaseReducerWithPrepare\r\n : ActionCreatorForCaseReducer\r\n}\r\n\r\n/**\r\n * Get a `PayloadActionCreator` type for a passed `CaseReducerWithPrepare`\r\n *\r\n * @internal\r\n */\r\ntype ActionCreatorForCaseReducerWithPrepare =\r\n _ActionCreatorWithPreparedPayload\r\n\r\n/**\r\n * Get a `PayloadActionCreator` type for a passed `CaseReducer`\r\n *\r\n * @internal\r\n */\r\ntype ActionCreatorForCaseReducer = CR extends (\r\n state: any,\r\n action: infer Action\r\n) => any\r\n ? Action extends { payload: infer P }\r\n ? PayloadActionCreator

\r\n : ActionCreatorWithoutPayload\r\n : ActionCreatorWithoutPayload\r\n\r\n/**\r\n * Extracts the CaseReducers out of a `reducers` object, even if they are\r\n * tested into a `CaseReducerWithPrepare`.\r\n *\r\n * @internal\r\n */\r\ntype SliceDefinedCaseReducers> = {\r\n [Type in keyof CaseReducers]: CaseReducers[Type] extends {\r\n reducer: infer Reducer\r\n }\r\n ? Reducer\r\n : CaseReducers[Type]\r\n}\r\n\r\n/**\r\n * Used on a SliceCaseReducers object.\r\n * Ensures that if a CaseReducer is a `CaseReducerWithPrepare`, that\r\n * the `reducer` and the `prepare` function use the same type of `payload`.\r\n *\r\n * Might do additional such checks in the future.\r\n *\r\n * This type is only ever useful if you want to write your own wrapper around\r\n * `createSlice`. Please don't use it otherwise!\r\n *\r\n * @public\r\n */\r\nexport type ValidateSliceCaseReducers<\r\n S,\r\n ACR extends SliceCaseReducers\r\n> = ACR &\r\n {\r\n [T in keyof ACR]: ACR[T] extends {\r\n reducer(s: S, action?: infer A): any\r\n }\r\n ? {\r\n prepare(...a: never[]): Omit\r\n }\r\n : {}\r\n }\r\n\r\nfunction getType(slice: string, actionKey: string): string {\r\n return `${slice}/${actionKey}`\r\n}\r\n\r\n/**\r\n * A function that accepts an initial state, an object full of reducer\r\n * functions, and a \"slice name\", and automatically generates\r\n * action creators and action types that correspond to the\r\n * reducers and state.\r\n *\r\n * The `reducer` argument is passed to `createReducer()`.\r\n *\r\n * @public\r\n */\r\nexport function createSlice<\r\n State,\r\n CaseReducers extends SliceCaseReducers,\r\n Name extends string = string\r\n>(\r\n options: CreateSliceOptions\r\n): Slice {\r\n const { name, initialState } = options\r\n if (!name) {\r\n throw new Error('`name` is a required option for createSlice')\r\n }\r\n const reducers = options.reducers || {}\r\n const [\r\n extraReducers = {},\r\n actionMatchers = [],\r\n defaultCaseReducer = undefined,\r\n ] =\r\n typeof options.extraReducers === 'function'\r\n ? executeReducerBuilderCallback(options.extraReducers)\r\n : [options.extraReducers]\r\n\r\n const reducerNames = Object.keys(reducers)\r\n\r\n const sliceCaseReducersByName: Record = {}\r\n const sliceCaseReducersByType: Record = {}\r\n const actionCreators: Record = {}\r\n\r\n reducerNames.forEach((reducerName) => {\r\n const maybeReducerWithPrepare = reducers[reducerName]\r\n const type = getType(name, reducerName)\r\n\r\n let caseReducer: CaseReducer\r\n let prepareCallback: PrepareAction | undefined\r\n\r\n if ('reducer' in maybeReducerWithPrepare) {\r\n caseReducer = maybeReducerWithPrepare.reducer\r\n prepareCallback = maybeReducerWithPrepare.prepare\r\n } else {\r\n caseReducer = maybeReducerWithPrepare\r\n }\r\n\r\n sliceCaseReducersByName[reducerName] = caseReducer\r\n sliceCaseReducersByType[type] = caseReducer\r\n actionCreators[reducerName] = prepareCallback\r\n ? createAction(type, prepareCallback)\r\n : createAction(type)\r\n })\r\n\r\n const finalCaseReducers = { ...extraReducers, ...sliceCaseReducersByType }\r\n const reducer = createReducer(\r\n initialState,\r\n finalCaseReducers as any,\r\n actionMatchers,\r\n defaultCaseReducer\r\n )\r\n\r\n return {\r\n name,\r\n reducer,\r\n actions: actionCreators as any,\r\n caseReducers: sliceCaseReducersByName as any,\r\n }\r\n}\r\n","import type { EntityState } from './models'\r\n\r\nexport function getInitialEntityState(): EntityState {\r\n return {\r\n ids: [],\r\n entities: {},\r\n }\r\n}\r\n\r\nexport function createInitialStateFactory() {\r\n function getInitialState(): EntityState\r\n function getInitialState(\r\n additionalState: S\r\n ): EntityState & S\r\n function getInitialState(additionalState: any = {}): any {\r\n return Object.assign(getInitialEntityState(), additionalState)\r\n }\r\n\r\n return { getInitialState }\r\n}\r\n","import { createDraftSafeSelector } from '../createDraftSafeSelector'\r\nimport type {\r\n EntityState,\r\n EntitySelectors,\r\n Dictionary,\r\n EntityId,\r\n} from './models'\r\n\r\nexport function createSelectorsFactory() {\r\n function getSelectors(): EntitySelectors>\r\n function getSelectors(\r\n selectState: (state: V) => EntityState\r\n ): EntitySelectors\r\n function getSelectors(\r\n selectState?: (state: any) => EntityState\r\n ): EntitySelectors {\r\n const selectIds = (state: any) => state.ids\r\n\r\n const selectEntities = (state: EntityState) => state.entities\r\n\r\n const selectAll = createDraftSafeSelector(\r\n selectIds,\r\n selectEntities,\r\n (ids: readonly T[], entities: Dictionary): any =>\r\n ids.map((id: any) => (entities as any)[id])\r\n )\r\n\r\n const selectId = (_: any, id: EntityId) => id\r\n\r\n const selectById = (entities: Dictionary, id: EntityId) => entities[id]\r\n\r\n const selectTotal = createDraftSafeSelector(selectIds, (ids) => ids.length)\r\n\r\n if (!selectState) {\r\n return {\r\n selectIds,\r\n selectEntities,\r\n selectAll,\r\n selectTotal,\r\n selectById: createDraftSafeSelector(\r\n selectEntities,\r\n selectId,\r\n selectById\r\n ),\r\n }\r\n }\r\n\r\n const selectGlobalizedEntities = createDraftSafeSelector(\r\n selectState,\r\n selectEntities\r\n )\r\n\r\n return {\r\n selectIds: createDraftSafeSelector(selectState, selectIds),\r\n selectEntities: selectGlobalizedEntities,\r\n selectAll: createDraftSafeSelector(selectState, selectAll),\r\n selectTotal: createDraftSafeSelector(selectState, selectTotal),\r\n selectById: createDraftSafeSelector(\r\n selectGlobalizedEntities,\r\n selectId,\r\n selectById\r\n ),\r\n }\r\n }\r\n\r\n return { getSelectors }\r\n}\r\n","import createNextState, { isDraft } from 'immer'\r\nimport type { EntityState, PreventAny } from './models'\r\nimport type { PayloadAction } from '../createAction'\r\nimport { isFSA } from '../createAction'\r\nimport { IsAny } from '../tsHelpers'\r\n\r\nexport function createSingleArgumentStateOperator(\r\n mutator: (state: EntityState) => void\r\n) {\r\n const operator = createStateOperator((_: undefined, state: EntityState) =>\r\n mutator(state)\r\n )\r\n\r\n return function operation>(\r\n state: PreventAny\r\n ): S {\r\n return operator(state as S, undefined)\r\n }\r\n}\r\n\r\nexport function createStateOperator(\r\n mutator: (arg: R, state: EntityState) => void\r\n) {\r\n return function operation>(\r\n state: S,\r\n arg: R | PayloadAction\r\n ): S {\r\n function isPayloadActionArgument(\r\n arg: R | PayloadAction\r\n ): arg is PayloadAction {\r\n return isFSA(arg)\r\n }\r\n\r\n const runMutator = (draft: EntityState) => {\r\n if (isPayloadActionArgument(arg)) {\r\n mutator(arg.payload, draft)\r\n } else {\r\n mutator(arg, draft)\r\n }\r\n }\r\n\r\n if (isDraft(state)) {\r\n // we must already be inside a `createNextState` call, likely because\r\n // this is being wrapped in `createReducer` or `createSlice`.\r\n // It's safe to just pass the draft to the mutator.\r\n runMutator(state)\r\n\r\n // since it's a draft, we'll just return it\r\n return state\r\n } else {\r\n // @ts-ignore createNextState() produces an Immutable> rather\r\n // than an Immutable, and TypeScript cannot find out how to reconcile\r\n // these two types.\r\n return createNextState(state, runMutator)\r\n }\r\n }\r\n}\r\n","import type { EntityState, IdSelector, Update, EntityId } from './models'\r\n\r\nexport function selectIdValue(entity: T, selectId: IdSelector) {\r\n const key = selectId(entity)\r\n\r\n if (process.env.NODE_ENV !== 'production' && key === undefined) {\r\n console.warn(\r\n 'The entity passed to the `selectId` implementation returned undefined.',\r\n 'You should probably provide your own `selectId` implementation.',\r\n 'The entity that was passed:',\r\n entity,\r\n 'The `selectId` implementation:',\r\n selectId.toString()\r\n )\r\n }\r\n\r\n return key\r\n}\r\n\r\nexport function ensureEntitiesArray(\r\n entities: readonly T[] | Record\r\n): readonly T[] {\r\n if (!Array.isArray(entities)) {\r\n entities = Object.values(entities)\r\n }\r\n\r\n return entities\r\n}\r\n\r\nexport function splitAddedUpdatedEntities(\r\n newEntities: readonly T[] | Record,\r\n selectId: IdSelector,\r\n state: EntityState\r\n): [T[], Update[]] {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n\r\n const added: T[] = []\r\n const updated: Update[] = []\r\n\r\n for (const entity of newEntities) {\r\n const id = selectIdValue(entity, selectId)\r\n if (id in state.entities) {\r\n updated.push({ id, changes: entity })\r\n } else {\r\n added.push(entity)\r\n }\r\n }\r\n return [added, updated]\r\n}\r\n","import type {\r\n EntityState,\r\n EntityStateAdapter,\r\n IdSelector,\r\n Update,\r\n EntityId,\r\n} from './models'\r\nimport {\r\n createStateOperator,\r\n createSingleArgumentStateOperator,\r\n} from './state_adapter'\r\nimport {\r\n selectIdValue,\r\n ensureEntitiesArray,\r\n splitAddedUpdatedEntities,\r\n} from './utils'\r\n\r\nexport function createUnsortedStateAdapter(\r\n selectId: IdSelector\r\n): EntityStateAdapter {\r\n type R = EntityState\r\n\r\n function addOneMutably(entity: T, state: R): void {\r\n const key = selectIdValue(entity, selectId)\r\n\r\n if (key in state.entities) {\r\n return\r\n }\r\n\r\n state.ids.push(key)\r\n state.entities[key] = entity\r\n }\r\n\r\n function addManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n\r\n for (const entity of newEntities) {\r\n addOneMutably(entity, state)\r\n }\r\n }\r\n\r\n function setOneMutably(entity: T, state: R): void {\r\n const key = selectIdValue(entity, selectId)\r\n if (!(key in state.entities)) {\r\n state.ids.push(key)\r\n }\r\n state.entities[key] = entity\r\n }\r\n\r\n function setManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n for (const entity of newEntities) {\r\n setOneMutably(entity, state)\r\n }\r\n }\r\n\r\n function setAllMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n\r\n state.ids = []\r\n state.entities = {}\r\n\r\n addManyMutably(newEntities, state)\r\n }\r\n\r\n function removeOneMutably(key: EntityId, state: R): void {\r\n return removeManyMutably([key], state)\r\n }\r\n\r\n function removeManyMutably(keys: readonly EntityId[], state: R): void {\r\n let didMutate = false\r\n\r\n keys.forEach((key) => {\r\n if (key in state.entities) {\r\n delete state.entities[key]\r\n didMutate = true\r\n }\r\n })\r\n\r\n if (didMutate) {\r\n state.ids = state.ids.filter((id) => id in state.entities)\r\n }\r\n }\r\n\r\n function removeAllMutably(state: R): void {\r\n Object.assign(state, {\r\n ids: [],\r\n entities: {},\r\n })\r\n }\r\n\r\n function takeNewKey(\r\n keys: { [id: string]: EntityId },\r\n update: Update,\r\n state: R\r\n ): boolean {\r\n const original = state.entities[update.id]\r\n const updated: T = Object.assign({}, original, update.changes)\r\n const newKey = selectIdValue(updated, selectId)\r\n const hasNewKey = newKey !== update.id\r\n\r\n if (hasNewKey) {\r\n keys[update.id] = newKey\r\n delete state.entities[update.id]\r\n }\r\n\r\n state.entities[newKey] = updated\r\n\r\n return hasNewKey\r\n }\r\n\r\n function updateOneMutably(update: Update, state: R): void {\r\n return updateManyMutably([update], state)\r\n }\r\n\r\n function updateManyMutably(\r\n updates: ReadonlyArray>,\r\n state: R\r\n ): void {\r\n const newKeys: { [id: string]: EntityId } = {}\r\n\r\n const updatesPerEntity: { [id: string]: Update } = {}\r\n\r\n updates.forEach((update) => {\r\n // Only apply updates to entities that currently exist\r\n if (update.id in state.entities) {\r\n // If there are multiple updates to one entity, merge them together\r\n updatesPerEntity[update.id] = {\r\n id: update.id,\r\n // Spreads ignore falsy values, so this works even if there isn't\r\n // an existing update already at this key\r\n changes: {\r\n ...(updatesPerEntity[update.id]\r\n ? updatesPerEntity[update.id].changes\r\n : null),\r\n ...update.changes,\r\n },\r\n }\r\n }\r\n })\r\n\r\n updates = Object.values(updatesPerEntity)\r\n\r\n const didMutateEntities = updates.length > 0\r\n\r\n if (didMutateEntities) {\r\n const didMutateIds =\r\n updates.filter((update) => takeNewKey(newKeys, update, state)).length >\r\n 0\r\n\r\n if (didMutateIds) {\r\n state.ids = state.ids.map((id) => newKeys[id] || id)\r\n }\r\n }\r\n }\r\n\r\n function upsertOneMutably(entity: T, state: R): void {\r\n return upsertManyMutably([entity], state)\r\n }\r\n\r\n function upsertManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n const [added, updated] = splitAddedUpdatedEntities(\r\n newEntities,\r\n selectId,\r\n state\r\n )\r\n\r\n updateManyMutably(updated, state)\r\n addManyMutably(added, state)\r\n }\r\n\r\n return {\r\n removeAll: createSingleArgumentStateOperator(removeAllMutably),\r\n addOne: createStateOperator(addOneMutably),\r\n addMany: createStateOperator(addManyMutably),\r\n setOne: createStateOperator(setOneMutably),\r\n setMany: createStateOperator(setManyMutably),\r\n setAll: createStateOperator(setAllMutably),\r\n updateOne: createStateOperator(updateOneMutably),\r\n updateMany: createStateOperator(updateManyMutably),\r\n upsertOne: createStateOperator(upsertOneMutably),\r\n upsertMany: createStateOperator(upsertManyMutably),\r\n removeOne: createStateOperator(removeOneMutably),\r\n removeMany: createStateOperator(removeManyMutably),\r\n }\r\n}\r\n","import type {\r\n EntityState,\r\n IdSelector,\r\n Comparer,\r\n EntityStateAdapter,\r\n Update,\r\n EntityId,\r\n} from './models'\r\nimport { createStateOperator } from './state_adapter'\r\nimport { createUnsortedStateAdapter } from './unsorted_state_adapter'\r\nimport {\r\n selectIdValue,\r\n ensureEntitiesArray,\r\n splitAddedUpdatedEntities,\r\n} from './utils'\r\n\r\nexport function createSortedStateAdapter(\r\n selectId: IdSelector,\r\n sort: Comparer\r\n): EntityStateAdapter {\r\n type R = EntityState\r\n\r\n const { removeOne, removeMany, removeAll } =\r\n createUnsortedStateAdapter(selectId)\r\n\r\n function addOneMutably(entity: T, state: R): void {\r\n return addManyMutably([entity], state)\r\n }\r\n\r\n function addManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n\r\n const models = newEntities.filter(\r\n (model) => !(selectIdValue(model, selectId) in state.entities)\r\n )\r\n\r\n if (models.length !== 0) {\r\n merge(models, state)\r\n }\r\n }\r\n\r\n function setOneMutably(entity: T, state: R): void {\r\n return setManyMutably([entity], state)\r\n }\r\n\r\n function setManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n if (newEntities.length !== 0) {\r\n merge(newEntities, state)\r\n }\r\n }\r\n\r\n function setAllMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n state.entities = {}\r\n state.ids = []\r\n\r\n addManyMutably(newEntities, state)\r\n }\r\n\r\n function updateOneMutably(update: Update, state: R): void {\r\n return updateManyMutably([update], state)\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\r\n function takeUpdatedModel(models: T[], update: Update, state: R): boolean {\r\n if (!(update.id in state.entities)) {\r\n return false\r\n }\r\n\r\n const original = state.entities[update.id]\r\n const updated = Object.assign({}, original, update.changes)\r\n const newKey = selectIdValue(updated, selectId)\r\n\r\n delete state.entities[update.id]\r\n\r\n models.push(updated)\r\n\r\n return newKey !== update.id\r\n }\r\n\r\n function updateManyMutably(\r\n updates: ReadonlyArray>,\r\n state: R\r\n ): void {\r\n const models: T[] = []\r\n\r\n updates.forEach((update) => takeUpdatedModel(models, update, state))\r\n\r\n if (models.length !== 0) {\r\n merge(models, state)\r\n }\r\n }\r\n\r\n function upsertOneMutably(entity: T, state: R): void {\r\n return upsertManyMutably([entity], state)\r\n }\r\n\r\n function upsertManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n const [added, updated] = splitAddedUpdatedEntities(\r\n newEntities,\r\n selectId,\r\n state\r\n )\r\n\r\n updateManyMutably(updated, state)\r\n addManyMutably(added, state)\r\n }\r\n\r\n function areArraysEqual(a: readonly unknown[], b: readonly unknown[]) {\r\n if (a.length !== b.length) {\r\n return false\r\n }\r\n\r\n for (let i = 0; i < a.length && i < b.length; i++) {\r\n if (a[i] === b[i]) {\r\n continue\r\n }\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n function merge(models: readonly T[], state: R): void {\r\n // Insert/overwrite all new/updated\r\n models.forEach((model) => {\r\n state.entities[selectId(model)] = model\r\n })\r\n\r\n const allEntities = Object.values(state.entities) as T[]\r\n allEntities.sort(sort)\r\n\r\n const newSortedIds = allEntities.map(selectId)\r\n const { ids } = state\r\n\r\n if (!areArraysEqual(ids, newSortedIds)) {\r\n state.ids = newSortedIds\r\n }\r\n }\r\n\r\n return {\r\n removeOne,\r\n removeMany,\r\n removeAll,\r\n addOne: createStateOperator(addOneMutably),\r\n updateOne: createStateOperator(updateOneMutably),\r\n upsertOne: createStateOperator(upsertOneMutably),\r\n setOne: createStateOperator(setOneMutably),\r\n setMany: createStateOperator(setManyMutably),\r\n setAll: createStateOperator(setAllMutably),\r\n addMany: createStateOperator(addManyMutably),\r\n updateMany: createStateOperator(updateManyMutably),\r\n upsertMany: createStateOperator(upsertManyMutably),\r\n }\r\n}\r\n","import type {\r\n EntityDefinition,\r\n Comparer,\r\n IdSelector,\r\n EntityAdapter,\r\n} from './models'\r\nimport { createInitialStateFactory } from './entity_state'\r\nimport { createSelectorsFactory } from './state_selectors'\r\nimport { createSortedStateAdapter } from './sorted_state_adapter'\r\nimport { createUnsortedStateAdapter } from './unsorted_state_adapter'\r\n\r\n/**\r\n *\r\n * @param options\r\n *\r\n * @public\r\n */\r\nexport function createEntityAdapter(\r\n options: {\r\n selectId?: IdSelector\r\n sortComparer?: false | Comparer\r\n } = {}\r\n): EntityAdapter {\r\n const { selectId, sortComparer }: EntityDefinition = {\r\n sortComparer: false,\r\n selectId: (instance: any) => instance.id,\r\n ...options,\r\n }\r\n\r\n const stateFactory = createInitialStateFactory()\r\n const selectorsFactory = createSelectorsFactory()\r\n const stateAdapter = sortComparer\r\n ? createSortedStateAdapter(selectId, sortComparer)\r\n : createUnsortedStateAdapter(selectId)\r\n\r\n return {\r\n selectId,\r\n sortComparer,\r\n ...stateFactory,\r\n ...selectorsFactory,\r\n ...stateAdapter,\r\n }\r\n}\r\n","// Borrowed from https://github.com/ai/nanoid/blob/3.0.2/non-secure/index.js\r\n// This alphabet uses `A-Za-z0-9_-` symbols. A genetic algorithm helped\r\n// optimize the gzip compression for this alphabet.\r\nlet urlAlphabet =\r\n 'ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW'\r\n\r\n/**\r\n *\r\n * @public\r\n */\r\nexport let nanoid = (size = 21) => {\r\n let id = ''\r\n // A compact alternative for `for (var i = 0; i < step; i++)`.\r\n let i = size\r\n while (i--) {\r\n // `| 0` is more compact and faster than `Math.floor()`.\r\n id += urlAlphabet[(Math.random() * 64) | 0]\r\n }\r\n return id\r\n}\r\n","import type { Dispatch, AnyAction } from 'redux'\r\nimport type {\r\n PayloadAction,\r\n ActionCreatorWithPreparedPayload,\r\n} from './createAction'\r\nimport { createAction } from './createAction'\r\nimport type { ThunkDispatch } from 'redux-thunk'\r\nimport type { FallbackIfUnknown, IsAny, IsUnknown } from './tsHelpers'\r\nimport { nanoid } from './nanoid'\r\n\r\n// @ts-ignore we need the import of these types due to a bundling issue.\r\ntype _Keep = PayloadAction | ActionCreatorWithPreparedPayload\r\n\r\nexport type BaseThunkAPI<\r\n S,\r\n E,\r\n D extends Dispatch = Dispatch,\r\n RejectedValue = undefined,\r\n RejectedMeta = unknown,\r\n FulfilledMeta = unknown\r\n> = {\r\n dispatch: D\r\n getState: () => S\r\n extra: E\r\n requestId: string\r\n signal: AbortSignal\r\n rejectWithValue: IsUnknown<\r\n RejectedMeta,\r\n (value: RejectedValue) => RejectWithValue,\r\n (\r\n value: RejectedValue,\r\n meta: RejectedMeta\r\n ) => RejectWithValue\r\n >\r\n fulfillWithValue: IsUnknown<\r\n FulfilledMeta,\r\n (\r\n value: FulfilledValue\r\n ) => FulfillWithMeta,\r\n (\r\n value: FulfilledValue,\r\n meta: FulfilledMeta\r\n ) => FulfillWithMeta\r\n >\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport interface SerializedError {\r\n name?: string\r\n message?: string\r\n stack?: string\r\n code?: string\r\n}\r\n\r\nconst commonProperties: Array = [\r\n 'name',\r\n 'message',\r\n 'stack',\r\n 'code',\r\n]\r\n\r\nclass RejectWithValue {\r\n /*\r\n type-only property to distinguish between RejectWithValue and FulfillWithMeta\r\n does not exist at runtime\r\n */\r\n private readonly _type!: 'RejectWithValue'\r\n constructor(\r\n public readonly payload: Payload,\r\n public readonly meta: RejectedMeta\r\n ) {}\r\n}\r\n\r\nclass FulfillWithMeta {\r\n /*\r\n type-only property to distinguish between RejectWithValue and FulfillWithMeta\r\n does not exist at runtime\r\n */\r\n private readonly _type!: 'FulfillWithMeta'\r\n constructor(\r\n public readonly payload: Payload,\r\n public readonly meta: FulfilledMeta\r\n ) {}\r\n}\r\n\r\n/**\r\n * Serializes an error into a plain object.\r\n * Reworked from https://github.com/sindresorhus/serialize-error\r\n *\r\n * @public\r\n */\r\nexport const miniSerializeError = (value: any): SerializedError => {\r\n if (typeof value === 'object' && value !== null) {\r\n const simpleError: SerializedError = {}\r\n for (const property of commonProperties) {\r\n if (typeof value[property] === 'string') {\r\n simpleError[property] = value[property]\r\n }\r\n }\r\n\r\n return simpleError\r\n }\r\n\r\n return { message: String(value) }\r\n}\r\n\r\ntype AsyncThunkConfig = {\r\n state?: unknown\r\n dispatch?: Dispatch\r\n extra?: unknown\r\n rejectValue?: unknown\r\n serializedErrorType?: unknown\r\n pendingMeta?: unknown\r\n fulfilledMeta?: unknown\r\n rejectedMeta?: unknown\r\n}\r\n\r\ntype GetState = ThunkApiConfig extends {\r\n state: infer State\r\n}\r\n ? State\r\n : unknown\r\ntype GetExtra = ThunkApiConfig extends { extra: infer Extra }\r\n ? Extra\r\n : unknown\r\ntype GetDispatch = ThunkApiConfig extends {\r\n dispatch: infer Dispatch\r\n}\r\n ? FallbackIfUnknown<\r\n Dispatch,\r\n ThunkDispatch<\r\n GetState,\r\n GetExtra,\r\n AnyAction\r\n >\r\n >\r\n : ThunkDispatch, GetExtra, AnyAction>\r\n\r\ntype GetThunkAPI = BaseThunkAPI<\r\n GetState,\r\n GetExtra,\r\n GetDispatch,\r\n GetRejectValue,\r\n GetRejectedMeta,\r\n GetFulfilledMeta\r\n>\r\n\r\ntype GetRejectValue = ThunkApiConfig extends {\r\n rejectValue: infer RejectValue\r\n}\r\n ? RejectValue\r\n : unknown\r\n\r\ntype GetPendingMeta = ThunkApiConfig extends {\r\n pendingMeta: infer PendingMeta\r\n}\r\n ? PendingMeta\r\n : unknown\r\n\r\ntype GetFulfilledMeta = ThunkApiConfig extends {\r\n fulfilledMeta: infer FulfilledMeta\r\n}\r\n ? FulfilledMeta\r\n : unknown\r\n\r\ntype GetRejectedMeta = ThunkApiConfig extends {\r\n rejectedMeta: infer RejectedMeta\r\n}\r\n ? RejectedMeta\r\n : unknown\r\n\r\ntype GetSerializedErrorType = ThunkApiConfig extends {\r\n serializedErrorType: infer GetSerializedErrorType\r\n}\r\n ? GetSerializedErrorType\r\n : SerializedError\r\n\r\ntype MaybePromise = T | Promise | (T extends any ? Promise : never)\r\n\r\n/**\r\n * A type describing the return value of the `payloadCreator` argument to `createAsyncThunk`.\r\n * Might be useful for wrapping `createAsyncThunk` in custom abstractions.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunkPayloadCreatorReturnValue<\r\n Returned,\r\n ThunkApiConfig extends AsyncThunkConfig\r\n> = MaybePromise<\r\n | IsUnknown<\r\n GetFulfilledMeta,\r\n Returned,\r\n FulfillWithMeta>\r\n >\r\n | RejectWithValue<\r\n GetRejectValue,\r\n GetRejectedMeta\r\n >\r\n>\r\n/**\r\n * A type describing the `payloadCreator` argument to `createAsyncThunk`.\r\n * Might be useful for wrapping `createAsyncThunk` in custom abstractions.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunkPayloadCreator<\r\n Returned,\r\n ThunkArg = void,\r\n ThunkApiConfig extends AsyncThunkConfig = {}\r\n> = (\r\n arg: ThunkArg,\r\n thunkAPI: GetThunkAPI\r\n) => AsyncThunkPayloadCreatorReturnValue\r\n\r\n/**\r\n * A ThunkAction created by `createAsyncThunk`.\r\n * Dispatching it returns a Promise for either a\r\n * fulfilled or rejected action.\r\n * Also, the returned value contains an `abort()` method\r\n * that allows the asyncAction to be cancelled from the outside.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunkAction<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig extends AsyncThunkConfig\r\n> = (\r\n dispatch: GetDispatch,\r\n getState: () => GetState,\r\n extra: GetExtra\r\n) => Promise<\r\n | ReturnType>\r\n | ReturnType>\r\n> & {\r\n abort: (reason?: string) => void\r\n requestId: string\r\n arg: ThunkArg\r\n unwrap: () => Promise\r\n}\r\n\r\ntype AsyncThunkActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig extends AsyncThunkConfig\r\n> = IsAny<\r\n ThunkArg,\r\n // any handling\r\n (arg: ThunkArg) => AsyncThunkAction,\r\n // unknown handling\r\n unknown extends ThunkArg\r\n ? (arg: ThunkArg) => AsyncThunkAction // argument not specified or specified as void or undefined\r\n : [ThunkArg] extends [void] | [undefined]\r\n ? () => AsyncThunkAction // argument contains void\r\n : [void] extends [ThunkArg] // make optional\r\n ? (arg?: ThunkArg) => AsyncThunkAction // argument contains undefined\r\n : [undefined] extends [ThunkArg]\r\n ? WithStrictNullChecks<\r\n // with strict nullChecks: make optional\r\n (\r\n arg?: ThunkArg\r\n ) => AsyncThunkAction,\r\n // without strict null checks this will match everything, so don't make it optional\r\n (arg: ThunkArg) => AsyncThunkAction\r\n > // default case: normal argument\r\n : (arg: ThunkArg) => AsyncThunkAction\r\n>\r\n\r\n/**\r\n * Options object for `createAsyncThunk`.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunkOptions<\r\n ThunkArg = void,\r\n ThunkApiConfig extends AsyncThunkConfig = {}\r\n> = {\r\n /**\r\n * A method to control whether the asyncThunk should be executed. Has access to the\r\n * `arg`, `api.getState()` and `api.extra` arguments.\r\n *\r\n * @returns `false` if it should be skipped\r\n */\r\n condition?(\r\n arg: ThunkArg,\r\n api: Pick, 'getState' | 'extra'>\r\n ): boolean | undefined\r\n /**\r\n * If `condition` returns `false`, the asyncThunk will be skipped.\r\n * This option allows you to control whether a `rejected` action with `meta.condition == false`\r\n * will be dispatched or not.\r\n *\r\n * @default `false`\r\n */\r\n dispatchConditionRejection?: boolean\r\n\r\n serializeError?: (x: unknown) => GetSerializedErrorType\r\n\r\n /**\r\n * A function to use when generating the `requestId` for the request sequence.\r\n *\r\n * @default `nanoid`\r\n */\r\n idGenerator?: () => string\r\n} & IsUnknown<\r\n GetPendingMeta,\r\n {\r\n /**\r\n * A method to generate additional properties to be added to `meta` of the pending action.\r\n *\r\n * Using this optional overload will not modify the types correctly, this overload is only in place to support JavaScript users.\r\n * Please use the `ThunkApiConfig` parameter `pendingMeta` to get access to a correctly typed overload\r\n */\r\n getPendingMeta?(\r\n base: {\r\n arg: ThunkArg\r\n requestId: string\r\n },\r\n api: Pick, 'getState' | 'extra'>\r\n ): GetPendingMeta\r\n },\r\n {\r\n /**\r\n * A method to generate additional properties to be added to `meta` of the pending action.\r\n */\r\n getPendingMeta(\r\n base: {\r\n arg: ThunkArg\r\n requestId: string\r\n },\r\n api: Pick, 'getState' | 'extra'>\r\n ): GetPendingMeta\r\n }\r\n>\r\n\r\nexport type AsyncThunkPendingActionCreator<\r\n ThunkArg,\r\n ThunkApiConfig = {}\r\n> = ActionCreatorWithPreparedPayload<\r\n [string, ThunkArg, GetPendingMeta?],\r\n undefined,\r\n string,\r\n never,\r\n {\r\n arg: ThunkArg\r\n requestId: string\r\n requestStatus: 'pending'\r\n } & GetPendingMeta\r\n>\r\n\r\nexport type AsyncThunkRejectedActionCreator<\r\n ThunkArg,\r\n ThunkApiConfig = {}\r\n> = ActionCreatorWithPreparedPayload<\r\n [\r\n Error | null,\r\n string,\r\n ThunkArg,\r\n GetRejectValue?,\r\n GetRejectedMeta?\r\n ],\r\n GetRejectValue | undefined,\r\n string,\r\n GetSerializedErrorType,\r\n {\r\n arg: ThunkArg\r\n requestId: string\r\n requestStatus: 'rejected'\r\n aborted: boolean\r\n condition: boolean\r\n } & (\r\n | ({ rejectedWithValue: false } & {\r\n [K in keyof GetRejectedMeta]?: undefined\r\n })\r\n | ({ rejectedWithValue: true } & GetRejectedMeta)\r\n )\r\n>\r\n\r\nexport type AsyncThunkFulfilledActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig = {}\r\n> = ActionCreatorWithPreparedPayload<\r\n [Returned, string, ThunkArg, GetFulfilledMeta?],\r\n Returned,\r\n string,\r\n never,\r\n {\r\n arg: ThunkArg\r\n requestId: string\r\n requestStatus: 'fulfilled'\r\n } & GetFulfilledMeta\r\n>\r\n\r\n/**\r\n * A type describing the return value of `createAsyncThunk`.\r\n * Might be useful for wrapping `createAsyncThunk` in custom abstractions.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunk<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig extends AsyncThunkConfig\r\n> = AsyncThunkActionCreator & {\r\n pending: AsyncThunkPendingActionCreator\r\n rejected: AsyncThunkRejectedActionCreator\r\n fulfilled: AsyncThunkFulfilledActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig\r\n >\r\n typePrefix: string\r\n}\r\n\r\n/**\r\n *\r\n * @param typePrefix\r\n * @param payloadCreator\r\n * @param options\r\n *\r\n * @public\r\n */\r\nexport function createAsyncThunk<\r\n Returned,\r\n ThunkArg = void,\r\n ThunkApiConfig extends AsyncThunkConfig = {}\r\n>(\r\n typePrefix: string,\r\n payloadCreator: AsyncThunkPayloadCreator,\r\n options?: AsyncThunkOptions\r\n): AsyncThunk {\r\n type RejectedValue = GetRejectValue\r\n type PendingMeta = GetPendingMeta\r\n type FulfilledMeta = GetFulfilledMeta\r\n type RejectedMeta = GetRejectedMeta\r\n\r\n const fulfilled: AsyncThunkFulfilledActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig\r\n > = createAction(\r\n typePrefix + '/fulfilled',\r\n (\r\n payload: Returned,\r\n requestId: string,\r\n arg: ThunkArg,\r\n meta?: FulfilledMeta\r\n ) => ({\r\n payload,\r\n meta: {\r\n ...((meta as any) || {}),\r\n arg,\r\n requestId,\r\n requestStatus: 'fulfilled' as const,\r\n },\r\n })\r\n )\r\n\r\n const pending: AsyncThunkPendingActionCreator =\r\n createAction(\r\n typePrefix + '/pending',\r\n (requestId: string, arg: ThunkArg, meta?: PendingMeta) => ({\r\n payload: undefined,\r\n meta: {\r\n ...((meta as any) || {}),\r\n arg,\r\n requestId,\r\n requestStatus: 'pending' as const,\r\n },\r\n })\r\n )\r\n\r\n const rejected: AsyncThunkRejectedActionCreator =\r\n createAction(\r\n typePrefix + '/rejected',\r\n (\r\n error: Error | null,\r\n requestId: string,\r\n arg: ThunkArg,\r\n payload?: RejectedValue,\r\n meta?: RejectedMeta\r\n ) => ({\r\n payload,\r\n error: ((options && options.serializeError) || miniSerializeError)(\r\n error || 'Rejected'\r\n ) as GetSerializedErrorType,\r\n meta: {\r\n ...((meta as any) || {}),\r\n arg,\r\n requestId,\r\n rejectedWithValue: !!payload,\r\n requestStatus: 'rejected' as const,\r\n aborted: error?.name === 'AbortError',\r\n condition: error?.name === 'ConditionError',\r\n },\r\n })\r\n )\r\n\r\n let displayedWarning = false\r\n\r\n const AC =\r\n typeof AbortController !== 'undefined'\r\n ? AbortController\r\n : class implements AbortController {\r\n signal: AbortSignal = {\r\n aborted: false,\r\n addEventListener() {},\r\n dispatchEvent() {\r\n return false\r\n },\r\n onabort() {},\r\n removeEventListener() {},\r\n }\r\n abort() {\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (!displayedWarning) {\r\n displayedWarning = true\r\n console.info(\r\n `This platform does not implement AbortController. \r\nIf you want to use the AbortController to react to \\`abort\\` events, please consider importing a polyfill like 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only'.`\r\n )\r\n }\r\n }\r\n }\r\n }\r\n\r\n function actionCreator(\r\n arg: ThunkArg\r\n ): AsyncThunkAction {\r\n return (dispatch, getState, extra) => {\r\n const requestId = (options?.idGenerator ?? nanoid)()\r\n\r\n const abortController = new AC()\r\n let abortReason: string | undefined\r\n\r\n const abortedPromise = new Promise((_, reject) =>\r\n abortController.signal.addEventListener('abort', () =>\r\n reject({ name: 'AbortError', message: abortReason || 'Aborted' })\r\n )\r\n )\r\n\r\n let started = false\r\n function abort(reason?: string) {\r\n if (started) {\r\n abortReason = reason\r\n abortController.abort()\r\n }\r\n }\r\n\r\n const promise = (async function () {\r\n let finalAction: ReturnType\r\n try {\r\n if (\r\n options &&\r\n options.condition &&\r\n options.condition(arg, { getState, extra }) === false\r\n ) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw {\r\n name: 'ConditionError',\r\n message: 'Aborted due to condition callback returning false.',\r\n }\r\n }\r\n started = true\r\n dispatch(\r\n pending(\r\n requestId,\r\n arg,\r\n options?.getPendingMeta?.({ requestId, arg }, { getState, extra })\r\n )\r\n )\r\n finalAction = await Promise.race([\r\n abortedPromise,\r\n Promise.resolve(\r\n payloadCreator(arg, {\r\n dispatch,\r\n getState,\r\n extra,\r\n requestId,\r\n signal: abortController.signal,\r\n rejectWithValue: ((\r\n value: RejectedValue,\r\n meta?: RejectedMeta\r\n ) => {\r\n return new RejectWithValue(value, meta)\r\n }) as any,\r\n fulfillWithValue: ((value: unknown, meta?: FulfilledMeta) => {\r\n return new FulfillWithMeta(value, meta)\r\n }) as any,\r\n })\r\n ).then((result) => {\r\n if (result instanceof RejectWithValue) {\r\n throw result\r\n }\r\n if (result instanceof FulfillWithMeta) {\r\n return fulfilled(result.payload, requestId, arg, result.meta)\r\n }\r\n return fulfilled(result as any, requestId, arg)\r\n }),\r\n ])\r\n } catch (err) {\r\n finalAction =\r\n err instanceof RejectWithValue\r\n ? rejected(null, requestId, arg, err.payload, err.meta)\r\n : rejected(err as any, requestId, arg)\r\n }\r\n // We dispatch the result action _after_ the catch, to avoid having any errors\r\n // here get swallowed by the try/catch block,\r\n // per https://twitter.com/dan_abramov/status/770914221638942720\r\n // and https://github.com/reduxjs/redux-toolkit/blob/e85eb17b39a2118d859f7b7746e0f3fee523e089/docs/tutorials/advanced-tutorial.md#async-error-handling-logic-in-thunks\r\n\r\n const skipDispatch =\r\n options &&\r\n !options.dispatchConditionRejection &&\r\n rejected.match(finalAction) &&\r\n (finalAction as any).meta.condition\r\n\r\n if (!skipDispatch) {\r\n dispatch(finalAction)\r\n }\r\n return finalAction\r\n })()\r\n return Object.assign(promise as Promise, {\r\n abort,\r\n requestId,\r\n arg,\r\n unwrap() {\r\n return promise.then(unwrapResult)\r\n },\r\n })\r\n }\r\n }\r\n\r\n return Object.assign(\r\n actionCreator as AsyncThunkActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig\r\n >,\r\n {\r\n pending,\r\n rejected,\r\n fulfilled,\r\n typePrefix,\r\n }\r\n )\r\n}\r\n\r\ninterface UnwrappableAction {\r\n payload: any\r\n meta?: any\r\n error?: any\r\n}\r\n\r\ntype UnwrappedActionPayload = Exclude<\r\n T,\r\n { error: any }\r\n>['payload']\r\n\r\n/**\r\n * @public\r\n */\r\nexport function unwrapResult(\r\n action: R\r\n): UnwrappedActionPayload {\r\n if (action.meta && action.meta.rejectedWithValue) {\r\n throw action.payload\r\n }\r\n if (action.error) {\r\n throw action.error\r\n }\r\n return action.payload\r\n}\r\n\r\ntype WithStrictNullChecks = undefined extends boolean\r\n ? False\r\n : True\r\n","import type { Middleware } from 'redux'\r\n\r\n/**\r\n * return True if T is `any`, otherwise return False\r\n * taken from https://github.com/joonhocho/tsdef\r\n *\r\n * @internal\r\n */\r\nexport type IsAny =\r\n // test if we are going the left AND right path in the condition\r\n true | false extends (T extends never ? true : false) ? True : False\r\n\r\n/**\r\n * return True if T is `unknown`, otherwise return False\r\n * taken from https://github.com/joonhocho/tsdef\r\n *\r\n * @internal\r\n */\r\nexport type IsUnknown = unknown extends T\r\n ? IsAny\r\n : False\r\n\r\nexport type FallbackIfUnknown = IsUnknown\r\n\r\n/**\r\n * @internal\r\n */\r\nexport type IfMaybeUndefined = [undefined] extends [P]\r\n ? True\r\n : False\r\n\r\n/**\r\n * @internal\r\n */\r\nexport type IfVoid = [void] extends [P] ? True : False\r\n\r\n/**\r\n * @internal\r\n */\r\nexport type IsEmptyObj = T extends any\r\n ? keyof T extends never\r\n ? IsUnknown>>\r\n : False\r\n : never\r\n\r\n/**\r\n * returns True if TS version is above 3.5, False if below.\r\n * uses feature detection to detect TS version >= 3.5\r\n * * versions below 3.5 will return `{}` for unresolvable interference\r\n * * versions above will return `unknown`\r\n *\r\n * @internal\r\n */\r\nexport type AtLeastTS35 = [True, False][IsUnknown<\r\n ReturnType<() => T>,\r\n 0,\r\n 1\r\n>]\r\n\r\n/**\r\n * @internal\r\n */\r\nexport type IsUnknownOrNonInferrable = AtLeastTS35<\r\n IsUnknown,\r\n IsEmptyObj>\r\n>\r\n\r\n/**\r\n * Combines all dispatch signatures of all middlewares in the array `M` into\r\n * one intersected dispatch signature.\r\n */\r\nexport type DispatchForMiddlewares = M extends ReadonlyArray\r\n ? UnionToIntersection<\r\n M[number] extends infer MiddlewareValues\r\n ? MiddlewareValues extends Middleware\r\n ? DispatchExt extends Function\r\n ? IsAny\r\n : never\r\n : never\r\n : never\r\n >\r\n : never\r\n\r\n/**\r\n * Convert a Union type `(A|B)` to an intersection type `(A&B)`\r\n */\r\nexport type UnionToIntersection = (\r\n U extends any ? (k: U) => void : never\r\n) extends (k: infer I) => void\r\n ? I\r\n : never\r\n\r\n/**\r\n * Helper type. Passes T out again, but boxes it in a way that it cannot\r\n * \"widen\" the type by accident if it is a generic that should be inferred\r\n * from elsewhere.\r\n *\r\n * @internal\r\n */\r\nexport type NoInfer = [T][T extends any ? 0 : never]\r\n\r\nexport type Omit = Pick>\r\n\r\nexport interface HasMatchFunction {\r\n match: (v: any) => v is T\r\n}\r\n\r\nexport const hasMatchFunction = (\r\n v: Matcher\r\n): v is HasMatchFunction => {\r\n return v && typeof (v as HasMatchFunction).match === 'function'\r\n}\r\n\r\n/** @public */\r\nexport type Matcher = HasMatchFunction | ((v: any) => v is T)\r\n\r\n/** @public */\r\nexport type ActionFromMatcher> = M extends Matcher<\r\n infer T\r\n>\r\n ? T\r\n : never\r\n","import type {\r\n ActionFromMatcher,\r\n Matcher,\r\n UnionToIntersection,\r\n} from './tsHelpers'\r\nimport { hasMatchFunction } from './tsHelpers'\r\nimport type {\r\n AsyncThunk,\r\n AsyncThunkFulfilledActionCreator,\r\n AsyncThunkPendingActionCreator,\r\n AsyncThunkRejectedActionCreator,\r\n} from './createAsyncThunk'\r\n\r\n/** @public */\r\nexport type ActionMatchingAnyOf<\r\n Matchers extends [Matcher, ...Matcher[]]\r\n> = ActionFromMatcher\r\n\r\n/** @public */\r\nexport type ActionMatchingAllOf<\r\n Matchers extends [Matcher, ...Matcher[]]\r\n> = UnionToIntersection>\r\n\r\nconst matches = (matcher: Matcher, action: any) => {\r\n if (hasMatchFunction(matcher)) {\r\n return matcher.match(action)\r\n } else {\r\n return matcher(action)\r\n }\r\n}\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action matches any one of the supplied type guards or action\r\n * creators.\r\n *\r\n * @param matchers The type guards or action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isAnyOf, ...Matcher[]]>(\r\n ...matchers: Matchers\r\n) {\r\n return (action: any): action is ActionMatchingAnyOf => {\r\n return matchers.some((matcher) => matches(matcher, action))\r\n }\r\n}\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action matches all of the supplied type guards or action\r\n * creators.\r\n *\r\n * @param matchers The type guards or action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isAllOf, ...Matcher[]]>(\r\n ...matchers: Matchers\r\n) {\r\n return (action: any): action is ActionMatchingAllOf => {\r\n return matchers.every((matcher) => matches(matcher, action))\r\n }\r\n}\r\n\r\n/**\r\n * @param action A redux action\r\n * @param validStatus An array of valid meta.requestStatus values\r\n *\r\n * @internal\r\n */\r\nexport function hasExpectedRequestMetadata(\r\n action: any,\r\n validStatus: readonly string[]\r\n) {\r\n if (!action || !action.meta) return false\r\n\r\n const hasValidRequestId = typeof action.meta.requestId === 'string'\r\n const hasValidRequestStatus =\r\n validStatus.indexOf(action.meta.requestStatus) > -1\r\n\r\n return hasValidRequestId && hasValidRequestStatus\r\n}\r\n\r\nfunction isAsyncThunkArray(a: [any] | AnyAsyncThunk[]): a is AnyAsyncThunk[] {\r\n return (\r\n typeof a[0] === 'function' &&\r\n 'pending' in a[0] &&\r\n 'fulfilled' in a[0] &&\r\n 'rejected' in a[0]\r\n )\r\n}\r\n\r\nexport type UnknownAsyncThunkPendingAction = ReturnType<\r\n AsyncThunkPendingActionCreator\r\n>\r\n\r\nexport type PendingActionFromAsyncThunk =\r\n ActionFromMatcher\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator, and that\r\n * the action is pending.\r\n *\r\n * @public\r\n */\r\nexport function isPending(): (\r\n action: any\r\n) => action is UnknownAsyncThunkPendingAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators,\r\n * and that the action is pending.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isPending<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (action: any) => action is PendingActionFromAsyncThunk\r\n/**\r\n * Tests if `action` is a pending thunk action\r\n * @public\r\n */\r\nexport function isPending(action: any): action is UnknownAsyncThunkPendingAction\r\nexport function isPending<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n if (asyncThunks.length === 0) {\r\n return (action: any) => hasExpectedRequestMetadata(action, ['pending'])\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isPending()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is PendingActionFromAsyncThunk => {\r\n // note: this type will be correct because we have at least 1 asyncThunk\r\n const matchers: [Matcher, ...Matcher[]] = asyncThunks.map(\r\n (asyncThunk) => asyncThunk.pending\r\n ) as any\r\n\r\n const combinedMatcher = isAnyOf(...matchers)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n\r\nexport type UnknownAsyncThunkRejectedAction = ReturnType<\r\n AsyncThunkRejectedActionCreator\r\n>\r\n\r\nexport type RejectedActionFromAsyncThunk =\r\n ActionFromMatcher\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator, and that\r\n * the action is rejected.\r\n *\r\n * @public\r\n */\r\nexport function isRejected(): (\r\n action: any\r\n) => action is UnknownAsyncThunkRejectedAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators,\r\n * and that the action is rejected.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isRejected<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (action: any) => action is RejectedActionFromAsyncThunk\r\n/**\r\n * Tests if `action` is a rejected thunk action\r\n * @public\r\n */\r\nexport function isRejected(\r\n action: any\r\n): action is UnknownAsyncThunkRejectedAction\r\nexport function isRejected<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n if (asyncThunks.length === 0) {\r\n return (action: any) => hasExpectedRequestMetadata(action, ['rejected'])\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isRejected()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is RejectedActionFromAsyncThunk => {\r\n // note: this type will be correct because we have at least 1 asyncThunk\r\n const matchers: [Matcher, ...Matcher[]] = asyncThunks.map(\r\n (asyncThunk) => asyncThunk.rejected\r\n ) as any\r\n\r\n const combinedMatcher = isAnyOf(...matchers)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n\r\nexport type UnknownAsyncThunkRejectedWithValueAction = ReturnType<\r\n AsyncThunkRejectedActionCreator\r\n>\r\n\r\nexport type RejectedWithValueActionFromAsyncThunk =\r\n ActionFromMatcher &\r\n (T extends AsyncThunk\r\n ? { payload: RejectedValue }\r\n : unknown)\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator, and that\r\n * the action is rejected with value.\r\n *\r\n * @public\r\n */\r\nexport function isRejectedWithValue(): (\r\n action: any\r\n) => action is UnknownAsyncThunkRejectedAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators,\r\n * and that the action is rejected with value.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isRejectedWithValue<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (\r\n action: any\r\n) => action is RejectedWithValueActionFromAsyncThunk\r\n/**\r\n * Tests if `action` is a rejected thunk action with value\r\n * @public\r\n */\r\nexport function isRejectedWithValue(\r\n action: any\r\n): action is UnknownAsyncThunkRejectedAction\r\nexport function isRejectedWithValue<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n const hasFlag = (action: any): action is any => {\r\n return action && action.meta && action.meta.rejectedWithValue\r\n }\r\n\r\n if (asyncThunks.length === 0) {\r\n return (action: any) => {\r\n const combinedMatcher = isAllOf(isRejected(...asyncThunks), hasFlag)\r\n\r\n return combinedMatcher(action)\r\n }\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isRejectedWithValue()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is RejectedActionFromAsyncThunk => {\r\n const combinedMatcher = isAllOf(isRejected(...asyncThunks), hasFlag)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n\r\nexport type UnknownAsyncThunkFulfilledAction = ReturnType<\r\n AsyncThunkFulfilledActionCreator\r\n>\r\n\r\nexport type FulfilledActionFromAsyncThunk =\r\n ActionFromMatcher\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator, and that\r\n * the action is fulfilled.\r\n *\r\n * @public\r\n */\r\nexport function isFulfilled(): (\r\n action: any\r\n) => action is UnknownAsyncThunkFulfilledAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators,\r\n * and that the action is fulfilled.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isFulfilled<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (action: any) => action is FulfilledActionFromAsyncThunk\r\n/**\r\n * Tests if `action` is a fulfilled thunk action\r\n * @public\r\n */\r\nexport function isFulfilled(\r\n action: any\r\n): action is UnknownAsyncThunkFulfilledAction\r\nexport function isFulfilled<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n if (asyncThunks.length === 0) {\r\n return (action: any) => hasExpectedRequestMetadata(action, ['fulfilled'])\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isFulfilled()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is FulfilledActionFromAsyncThunk => {\r\n // note: this type will be correct because we have at least 1 asyncThunk\r\n const matchers: [Matcher, ...Matcher[]] = asyncThunks.map(\r\n (asyncThunk) => asyncThunk.fulfilled\r\n ) as any\r\n\r\n const combinedMatcher = isAnyOf(...matchers)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n\r\nexport type UnknownAsyncThunkAction =\r\n | UnknownAsyncThunkPendingAction\r\n | UnknownAsyncThunkRejectedAction\r\n | UnknownAsyncThunkFulfilledAction\r\n\r\nexport type AnyAsyncThunk = {\r\n pending: { match: (action: any) => action is any }\r\n fulfilled: { match: (action: any) => action is any }\r\n rejected: { match: (action: any) => action is any }\r\n}\r\n\r\nexport type ActionsFromAsyncThunk =\r\n | ActionFromMatcher\r\n | ActionFromMatcher\r\n | ActionFromMatcher\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator.\r\n *\r\n * @public\r\n */\r\nexport function isAsyncThunkAction(): (\r\n action: any\r\n) => action is UnknownAsyncThunkAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isAsyncThunkAction<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (action: any) => action is ActionsFromAsyncThunk\r\n/**\r\n * Tests if `action` is a thunk action\r\n * @public\r\n */\r\nexport function isAsyncThunkAction(\r\n action: any\r\n): action is UnknownAsyncThunkAction\r\nexport function isAsyncThunkAction<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n if (asyncThunks.length === 0) {\r\n return (action: any) =>\r\n hasExpectedRequestMetadata(action, ['pending', 'fulfilled', 'rejected'])\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isAsyncThunkAction()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is ActionsFromAsyncThunk => {\r\n // note: this type will be correct because we have at least 1 asyncThunk\r\n const matchers: [Matcher, ...Matcher[]] = [] as any\r\n\r\n for (const asyncThunk of asyncThunks) {\r\n matchers.push(\r\n asyncThunk.pending,\r\n asyncThunk.rejected,\r\n asyncThunk.fulfilled\r\n )\r\n }\r\n\r\n const combinedMatcher = isAnyOf(...matchers)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n",null]} +diff --git a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.js b/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.js +deleted file mode 100644 +index 6e07302..0000000 +--- a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.js ++++ /dev/null +@@ -1,1148 +0,0 @@ +-var __defProp = Object.defineProperty; +-var __defProps = Object.defineProperties; +-var __getOwnPropDescs = Object.getOwnPropertyDescriptors; +-var __getOwnPropSymbols = Object.getOwnPropertySymbols; +-var __hasOwnProp = Object.prototype.hasOwnProperty; +-var __propIsEnum = Object.prototype.propertyIsEnumerable; +-var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +-var __spreadValues = (a, b) => { +- for (var prop in b || (b = {})) +- if (__hasOwnProp.call(b, prop)) +- __defNormalProp(a, prop, b[prop]); +- if (__getOwnPropSymbols) +- for (var prop of __getOwnPropSymbols(b)) { +- if (__propIsEnum.call(b, prop)) +- __defNormalProp(a, prop, b[prop]); +- } +- return a; +-}; +-var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); +-// src/index.ts +-import { enableES5 } from "immer"; +-export * from "redux"; +-import { default as default2, current as current2, freeze, original, isDraft as isDraft4 } from "immer"; +-import { createSelector as createSelector2 } from "reselect"; +-// src/createDraftSafeSelector.ts +-import { current, isDraft } from "immer"; +-import { createSelector } from "reselect"; +-var createDraftSafeSelector = (...args) => { +- const selector = createSelector(...args); +- const wrappedSelector = (value, ...rest) => selector(isDraft(value) ? current(value) : value, ...rest); +- return wrappedSelector; +-}; +-// src/configureStore.ts +-import { createStore, compose as compose2, applyMiddleware, combineReducers } from "redux"; +-// src/devtoolsExtension.ts +-import { compose } from "redux"; +-var composeWithDevTools = typeof window !== "undefined" && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : function () { +- if (arguments.length === 0) +- return void 0; +- if (typeof arguments[0] === "object") +- return compose; +- return compose.apply(null, arguments); +-}; +-var devToolsEnhancer = typeof window !== "undefined" && window.__REDUX_DEVTOOLS_EXTENSION__ ? window.__REDUX_DEVTOOLS_EXTENSION__ : function () { +- return function (noop) { +- return noop; +- }; +-}; +-// src/isPlainObject.ts +-function isPlainObject(value) { +- if (typeof value !== "object" || value === null) +- return false; +- let proto = value; +- while (Object.getPrototypeOf(proto) !== null) { +- proto = Object.getPrototypeOf(proto); +- } +- return Object.getPrototypeOf(value) === proto; +-} +-// src/getDefaultMiddleware.ts +-import thunkMiddleware from "redux-thunk"; +-// src/utils.ts +-function getTimeMeasureUtils(maxDelay, fnName) { +- let elapsed = 0; +- return { +- measureTime(fn) { +- const started = Date.now(); +- try { +- return fn(); +- } +- finally { +- const finished = Date.now(); +- elapsed += finished - started; +- } +- }, +- warnIfExceeded() { +- if (elapsed > maxDelay) { +- console.warn(`${fnName} took ${elapsed}ms, which is more than the warning threshold of ${maxDelay}ms. +-If your state or actions are very large, you may want to disable the middleware as it might cause too much of a slowdown in development mode. See https://redux-toolkit.js.org/api/getDefaultMiddleware for instructions. +-It is disabled in production builds, so you don't need to worry about that.`); +- } +- } +- }; +-} +-var MiddlewareArray = class extends Array { +- constructor(...args) { +- super(...args); +- Object.setPrototypeOf(this, MiddlewareArray.prototype); +- } +- static get [Symbol.species]() { +- return MiddlewareArray; +- } +- concat(...arr) { +- return super.concat.apply(this, arr); +- } +- prepend(...arr) { +- if (arr.length === 1 && Array.isArray(arr[0])) { +- return new MiddlewareArray(...arr[0].concat(this)); +- } +- return new MiddlewareArray(...arr.concat(this)); +- } +-}; +-// src/immutableStateInvariantMiddleware.ts +-var isProduction = process.env.NODE_ENV === "production"; +-var prefix = "Invariant failed"; +-function invariant(condition, message) { +- if (condition) { +- return; +- } +- if (isProduction) { +- throw new Error(prefix); +- } +- throw new Error(`${prefix}: ${message || ""}`); +-} +-function stringify(obj, serializer, indent, decycler) { +- return JSON.stringify(obj, getSerialize(serializer, decycler), indent); +-} +-function getSerialize(serializer, decycler) { +- let stack = [], keys = []; +- if (!decycler) +- decycler = function (_, value) { +- if (stack[0] === value) +- return "[Circular ~]"; +- return "[Circular ~." + keys.slice(0, stack.indexOf(value)).join(".") + "]"; +- }; +- return function (key, value) { +- if (stack.length > 0) { +- var thisPos = stack.indexOf(this); +- ~thisPos ? stack.splice(thisPos + 1) : stack.push(this); +- ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key); +- if (~stack.indexOf(value)) +- value = decycler.call(this, key, value); +- } +- else +- stack.push(value); +- return serializer == null ? value : serializer.call(this, key, value); +- }; +-} +-function isImmutableDefault(value) { +- return typeof value !== "object" || value === null || typeof value === "undefined" || Object.isFrozen(value); +-} +-function trackForMutations(isImmutable, ignorePaths, obj) { +- const trackedProperties = trackProperties(isImmutable, ignorePaths, obj); +- return { +- detectMutations() { +- return detectMutations(isImmutable, ignorePaths, trackedProperties, obj); +- } +- }; +-} +-function trackProperties(isImmutable, ignorePaths = [], obj, path = "") { +- const tracked = { value: obj }; +- if (!isImmutable(obj)) { +- tracked.children = {}; +- for (const key in obj) { +- const childPath = path ? path + "." + key : key; +- if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) { +- continue; +- } +- tracked.children[key] = trackProperties(isImmutable, ignorePaths, obj[key], childPath); +- } +- } +- return tracked; +-} +-function detectMutations(isImmutable, ignorePaths = [], trackedProperty, obj, sameParentRef = false, path = "") { +- const prevObj = trackedProperty ? trackedProperty.value : void 0; +- const sameRef = prevObj === obj; +- if (sameParentRef && !sameRef && !Number.isNaN(obj)) { +- return { wasMutated: true, path }; +- } +- if (isImmutable(prevObj) || isImmutable(obj)) { +- return { wasMutated: false }; +- } +- const keysToDetect = {}; +- for (let key in trackedProperty.children) { +- keysToDetect[key] = true; +- } +- for (let key in obj) { +- keysToDetect[key] = true; +- } +- for (let key in keysToDetect) { +- const childPath = path ? path + "." + key : key; +- if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) { +- continue; +- } +- const result = detectMutations(isImmutable, ignorePaths, trackedProperty.children[key], obj[key], sameRef, childPath); +- if (result.wasMutated) { +- return result; +- } +- } +- return { wasMutated: false }; +-} +-function createImmutableStateInvariantMiddleware(options = {}) { +- if (process.env.NODE_ENV === "production") { +- return () => (next) => (action) => next(action); +- } +- let { isImmutable = isImmutableDefault, ignoredPaths, warnAfter = 32, ignore } = options; +- ignoredPaths = ignoredPaths || ignore; +- const track = trackForMutations.bind(null, isImmutable, ignoredPaths); +- return ({ getState }) => { +- let state = getState(); +- let tracker = track(state); +- let result; +- return (next) => (action) => { +- const measureUtils = getTimeMeasureUtils(warnAfter, "ImmutableStateInvariantMiddleware"); +- measureUtils.measureTime(() => { +- state = getState(); +- result = tracker.detectMutations(); +- tracker = track(state); +- invariant(!result.wasMutated, `A state mutation was detected between dispatches, in the path '${result.path || ""}'. This may cause incorrect behavior. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`); +- }); +- const dispatchedAction = next(action); +- measureUtils.measureTime(() => { +- state = getState(); +- result = tracker.detectMutations(); +- tracker = track(state); +- result.wasMutated && invariant(!result.wasMutated, `A state mutation was detected inside a dispatch, in the path: ${result.path || ""}. Take a look at the reducer(s) handling the action ${stringify(action)}. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`); +- }); +- measureUtils.warnIfExceeded(); +- return dispatchedAction; +- }; +- }; +-} +-// src/serializableStateInvariantMiddleware.ts +-function isPlain(val) { +- const type = typeof val; +- return type === "undefined" || val === null || type === "string" || type === "boolean" || type === "number" || Array.isArray(val) || isPlainObject(val); +-} +-function findNonSerializableValue(value, path = "", isSerializable = isPlain, getEntries, ignoredPaths = []) { +- let foundNestedSerializable; +- if (!isSerializable(value)) { +- return { +- keyPath: path || "", +- value +- }; +- } +- if (typeof value !== "object" || value === null) { +- return false; +- } +- const entries = getEntries != null ? getEntries(value) : Object.entries(value); +- const hasIgnoredPaths = ignoredPaths.length > 0; +- for (const [key, nestedValue] of entries) { +- const nestedPath = path ? path + "." + key : key; +- if (hasIgnoredPaths && ignoredPaths.indexOf(nestedPath) >= 0) { +- continue; +- } +- if (!isSerializable(nestedValue)) { +- return { +- keyPath: nestedPath, +- value: nestedValue +- }; +- } +- if (typeof nestedValue === "object") { +- foundNestedSerializable = findNonSerializableValue(nestedValue, nestedPath, isSerializable, getEntries, ignoredPaths); +- if (foundNestedSerializable) { +- return foundNestedSerializable; +- } +- } +- } +- return false; +-} +-function createSerializableStateInvariantMiddleware(options = {}) { +- if (process.env.NODE_ENV === "production") { +- return () => (next) => (action) => next(action); +- } +- const { isSerializable = isPlain, getEntries, ignoredActions = [], ignoredActionPaths = ["meta.arg", "meta.baseQueryMeta"], ignoredPaths = [], warnAfter = 32, ignoreState = false } = options; +- return (storeAPI) => (next) => (action) => { +- if (ignoredActions.length && ignoredActions.indexOf(action.type) !== -1) { +- return next(action); +- } +- const measureUtils = getTimeMeasureUtils(warnAfter, "SerializableStateInvariantMiddleware"); +- measureUtils.measureTime(() => { +- const foundActionNonSerializableValue = findNonSerializableValue(action, "", isSerializable, getEntries, ignoredActionPaths); +- if (foundActionNonSerializableValue) { +- const { keyPath, value } = foundActionNonSerializableValue; +- console.error(`A non-serializable value was detected in an action, in the path: \`${keyPath}\`. Value:`, value, "\nTake a look at the logic that dispatched this action: ", action, "\n(See https://redux.js.org/faq/actions#why-should-type-be-a-string-or-at-least-serializable-why-should-my-action-types-be-constants)", "\n(To allow non-serializable values see: https://redux-toolkit.js.org/usage/usage-guide#working-with-non-serializable-data)"); +- } +- }); +- const result = next(action); +- if (!ignoreState) { +- measureUtils.measureTime(() => { +- const state = storeAPI.getState(); +- const foundStateNonSerializableValue = findNonSerializableValue(state, "", isSerializable, getEntries, ignoredPaths); +- if (foundStateNonSerializableValue) { +- const { keyPath, value } = foundStateNonSerializableValue; +- console.error(`A non-serializable value was detected in the state, in the path: \`${keyPath}\`. Value:`, value, ` +-Take a look at the reducer(s) handling this action type: ${action.type}. +-(See https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state)`); +- } +- }); +- measureUtils.warnIfExceeded(); +- } +- return result; +- }; +-} +-// src/getDefaultMiddleware.ts +-function isBoolean(x) { +- return typeof x === "boolean"; +-} +-function curryGetDefaultMiddleware() { +- return function curriedGetDefaultMiddleware(options) { +- return getDefaultMiddleware(options); +- }; +-} +-function getDefaultMiddleware(options = {}) { +- const { thunk = true, immutableCheck = true, serializableCheck = true } = options; +- let middlewareArray = new MiddlewareArray(); +- if (thunk) { +- if (isBoolean(thunk)) { +- middlewareArray.push(thunkMiddleware); +- } +- else { +- middlewareArray.push(thunkMiddleware.withExtraArgument(thunk.extraArgument)); +- } +- } +- if (process.env.NODE_ENV !== "production") { +- if (immutableCheck) { +- let immutableOptions = {}; +- if (!isBoolean(immutableCheck)) { +- immutableOptions = immutableCheck; +- } +- middlewareArray.unshift(createImmutableStateInvariantMiddleware(immutableOptions)); +- } +- if (serializableCheck) { +- let serializableOptions = {}; +- if (!isBoolean(serializableCheck)) { +- serializableOptions = serializableCheck; +- } +- middlewareArray.push(createSerializableStateInvariantMiddleware(serializableOptions)); +- } +- } +- return middlewareArray; +-} +-// src/configureStore.ts +-var IS_PRODUCTION = process.env.NODE_ENV === "production"; +-function configureStore(options) { +- const curriedGetDefaultMiddleware = curryGetDefaultMiddleware(); +- const { reducer = void 0, middleware = curriedGetDefaultMiddleware(), devTools = true, preloadedState = void 0, enhancers = void 0 } = options || {}; +- let rootReducer; +- if (typeof reducer === "function") { +- rootReducer = reducer; +- } +- else if (isPlainObject(reducer)) { +- rootReducer = combineReducers(reducer); +- } +- else { +- throw new Error('"reducer" is a required argument, and must be a function or an object of functions that can be passed to combineReducers'); +- } +- let finalMiddleware = middleware; +- if (typeof finalMiddleware === "function") { +- finalMiddleware = finalMiddleware(curriedGetDefaultMiddleware); +- if (!IS_PRODUCTION && !Array.isArray(finalMiddleware)) { +- throw new Error("when using a middleware builder function, an array of middleware must be returned"); +- } +- } +- if (!IS_PRODUCTION && finalMiddleware.some((item) => typeof item !== "function")) { +- throw new Error("each middleware provided to configureStore must be a function"); +- } +- const middlewareEnhancer = applyMiddleware(...finalMiddleware); +- let finalCompose = compose2; +- if (devTools) { +- finalCompose = composeWithDevTools(__spreadValues({ +- trace: !IS_PRODUCTION +- }, typeof devTools === "object" && devTools)); +- } +- let storeEnhancers = [middlewareEnhancer]; +- if (Array.isArray(enhancers)) { +- storeEnhancers = [middlewareEnhancer, ...enhancers]; +- } +- else if (typeof enhancers === "function") { +- storeEnhancers = enhancers(storeEnhancers); +- } +- const composedEnhancer = finalCompose(...storeEnhancers); +- return createStore(rootReducer, preloadedState, composedEnhancer); +-} +-// src/createAction.ts +-function createAction(type, prepareAction) { +- function actionCreator(...args) { +- if (prepareAction) { +- let prepared = prepareAction(...args); +- if (!prepared) { +- throw new Error("prepareAction did not return an object"); +- } +- return __spreadValues(__spreadValues({ +- type, +- payload: prepared.payload +- }, "meta" in prepared && { meta: prepared.meta }), "error" in prepared && { error: prepared.error }); +- } +- return { type, payload: args[0] }; +- } +- actionCreator.toString = () => `${type}`; +- actionCreator.type = type; +- actionCreator.match = (action) => action.type === type; +- return actionCreator; +-} +-function isFSA(action) { +- return isPlainObject(action) && typeof action.type === "string" && Object.keys(action).every(isValidKey); +-} +-function isValidKey(key) { +- return ["type", "payload", "error", "meta"].indexOf(key) > -1; +-} +-function getType(actionCreator) { +- return `${actionCreator}`; +-} +-// src/createReducer.ts +-import createNextState, { isDraft as isDraft2, isDraftable } from "immer"; +-// src/mapBuilders.ts +-function executeReducerBuilderCallback(builderCallback) { +- const actionsMap = {}; +- const actionMatchers = []; +- let defaultCaseReducer; +- const builder = { +- addCase(typeOrActionCreator, reducer) { +- if (process.env.NODE_ENV !== "production") { +- if (actionMatchers.length > 0) { +- throw new Error("`builder.addCase` should only be called before calling `builder.addMatcher`"); +- } +- if (defaultCaseReducer) { +- throw new Error("`builder.addCase` should only be called before calling `builder.addDefaultCase`"); +- } +- } +- const type = typeof typeOrActionCreator === "string" ? typeOrActionCreator : typeOrActionCreator.type; +- if (type in actionsMap) { +- throw new Error("addCase cannot be called with two reducers for the same action type"); +- } +- actionsMap[type] = reducer; +- return builder; +- }, +- addMatcher(matcher, reducer) { +- if (process.env.NODE_ENV !== "production") { +- if (defaultCaseReducer) { +- throw new Error("`builder.addMatcher` should only be called before calling `builder.addDefaultCase`"); +- } +- } +- actionMatchers.push({ matcher, reducer }); +- return builder; +- }, +- addDefaultCase(reducer) { +- if (process.env.NODE_ENV !== "production") { +- if (defaultCaseReducer) { +- throw new Error("`builder.addDefaultCase` can only be called once"); +- } +- } +- defaultCaseReducer = reducer; +- return builder; +- } +- }; +- builderCallback(builder); +- return [actionsMap, actionMatchers, defaultCaseReducer]; +-} +-// src/createReducer.ts +-function createReducer(initialState, mapOrBuilderCallback, actionMatchers = [], defaultCaseReducer) { +- let [actionsMap, finalActionMatchers, finalDefaultCaseReducer] = typeof mapOrBuilderCallback === "function" ? executeReducerBuilderCallback(mapOrBuilderCallback) : [mapOrBuilderCallback, actionMatchers, defaultCaseReducer]; +- const frozenInitialState = createNextState(initialState, () => { +- }); +- return function (state = frozenInitialState, action) { +- let caseReducers = [ +- actionsMap[action.type], +- ...finalActionMatchers.filter(({ matcher }) => matcher(action)).map(({ reducer }) => reducer) +- ]; +- if (caseReducers.filter((cr) => !!cr).length === 0) { +- caseReducers = [finalDefaultCaseReducer]; +- } +- return caseReducers.reduce((previousState, caseReducer) => { +- if (caseReducer) { +- if (isDraft2(previousState)) { +- const draft = previousState; +- const result = caseReducer(draft, action); +- if (typeof result === "undefined") { +- return previousState; +- } +- return result; +- } +- else if (!isDraftable(previousState)) { +- const result = caseReducer(previousState, action); +- if (typeof result === "undefined") { +- if (previousState === null) { +- return previousState; +- } +- throw Error("A case reducer on a non-draftable value must not return undefined"); +- } +- return result; +- } +- else { +- return createNextState(previousState, (draft) => { +- return caseReducer(draft, action); +- }); +- } +- } +- return previousState; +- }, state); +- }; +-} +-// src/createSlice.ts +-function getType2(slice, actionKey) { +- return `${slice}/${actionKey}`; +-} +-function createSlice(options) { +- const { name, initialState } = options; +- if (!name) { +- throw new Error("`name` is a required option for createSlice"); +- } +- const reducers = options.reducers || {}; +- const [extraReducers = {}, actionMatchers = [], defaultCaseReducer = void 0] = typeof options.extraReducers === "function" ? executeReducerBuilderCallback(options.extraReducers) : [options.extraReducers]; +- const reducerNames = Object.keys(reducers); +- const sliceCaseReducersByName = {}; +- const sliceCaseReducersByType = {}; +- const actionCreators = {}; +- reducerNames.forEach((reducerName) => { +- const maybeReducerWithPrepare = reducers[reducerName]; +- const type = getType2(name, reducerName); +- let caseReducer; +- let prepareCallback; +- if ("reducer" in maybeReducerWithPrepare) { +- caseReducer = maybeReducerWithPrepare.reducer; +- prepareCallback = maybeReducerWithPrepare.prepare; +- } +- else { +- caseReducer = maybeReducerWithPrepare; +- } +- sliceCaseReducersByName[reducerName] = caseReducer; +- sliceCaseReducersByType[type] = caseReducer; +- actionCreators[reducerName] = prepareCallback ? createAction(type, prepareCallback) : createAction(type); +- }); +- const finalCaseReducers = __spreadValues(__spreadValues({}, extraReducers), sliceCaseReducersByType); +- const reducer = createReducer(initialState, finalCaseReducers, actionMatchers, defaultCaseReducer); +- return { +- name, +- reducer, +- actions: actionCreators, +- caseReducers: sliceCaseReducersByName +- }; +-} +-// src/entities/entity_state.ts +-function getInitialEntityState() { +- return { +- ids: [], +- entities: {} +- }; +-} +-function createInitialStateFactory() { +- function getInitialState(additionalState = {}) { +- return Object.assign(getInitialEntityState(), additionalState); +- } +- return { getInitialState }; +-} +-// src/entities/state_selectors.ts +-function createSelectorsFactory() { +- function getSelectors(selectState) { +- const selectIds = (state) => state.ids; +- const selectEntities = (state) => state.entities; +- const selectAll = createDraftSafeSelector(selectIds, selectEntities, (ids, entities) => ids.map((id) => entities[id])); +- const selectId = (_, id) => id; +- const selectById = (entities, id) => entities[id]; +- const selectTotal = createDraftSafeSelector(selectIds, (ids) => ids.length); +- if (!selectState) { +- return { +- selectIds, +- selectEntities, +- selectAll, +- selectTotal, +- selectById: createDraftSafeSelector(selectEntities, selectId, selectById) +- }; +- } +- const selectGlobalizedEntities = createDraftSafeSelector(selectState, selectEntities); +- return { +- selectIds: createDraftSafeSelector(selectState, selectIds), +- selectEntities: selectGlobalizedEntities, +- selectAll: createDraftSafeSelector(selectState, selectAll), +- selectTotal: createDraftSafeSelector(selectState, selectTotal), +- selectById: createDraftSafeSelector(selectGlobalizedEntities, selectId, selectById) +- }; +- } +- return { getSelectors }; +-} +-// src/entities/state_adapter.ts +-import createNextState2, { isDraft as isDraft3 } from "immer"; +-function createSingleArgumentStateOperator(mutator) { +- const operator = createStateOperator((_, state) => mutator(state)); +- return function operation(state) { +- return operator(state, void 0); +- }; +-} +-function createStateOperator(mutator) { +- return function operation(state, arg) { +- function isPayloadActionArgument(arg2) { +- return isFSA(arg2); +- } +- const runMutator = (draft) => { +- if (isPayloadActionArgument(arg)) { +- mutator(arg.payload, draft); +- } +- else { +- mutator(arg, draft); +- } +- }; +- if (isDraft3(state)) { +- runMutator(state); +- return state; +- } +- else { +- return createNextState2(state, runMutator); +- } +- }; +-} +-// src/entities/utils.ts +-function selectIdValue(entity, selectId) { +- const key = selectId(entity); +- if (process.env.NODE_ENV !== "production" && key === void 0) { +- console.warn("The entity passed to the `selectId` implementation returned undefined.", "You should probably provide your own `selectId` implementation.", "The entity that was passed:", entity, "The `selectId` implementation:", selectId.toString()); +- } +- return key; +-} +-function ensureEntitiesArray(entities) { +- if (!Array.isArray(entities)) { +- entities = Object.values(entities); +- } +- return entities; +-} +-function splitAddedUpdatedEntities(newEntities, selectId, state) { +- newEntities = ensureEntitiesArray(newEntities); +- const added = []; +- const updated = []; +- for (const entity of newEntities) { +- const id = selectIdValue(entity, selectId); +- if (id in state.entities) { +- updated.push({ id, changes: entity }); +- } +- else { +- added.push(entity); +- } +- } +- return [added, updated]; +-} +-// src/entities/unsorted_state_adapter.ts +-function createUnsortedStateAdapter(selectId) { +- function addOneMutably(entity, state) { +- const key = selectIdValue(entity, selectId); +- if (key in state.entities) { +- return; +- } +- state.ids.push(key); +- state.entities[key] = entity; +- } +- function addManyMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- for (const entity of newEntities) { +- addOneMutably(entity, state); +- } +- } +- function setOneMutably(entity, state) { +- const key = selectIdValue(entity, selectId); +- if (!(key in state.entities)) { +- state.ids.push(key); +- } +- state.entities[key] = entity; +- } +- function setManyMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- for (const entity of newEntities) { +- setOneMutably(entity, state); +- } +- } +- function setAllMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- state.ids = []; +- state.entities = {}; +- addManyMutably(newEntities, state); +- } +- function removeOneMutably(key, state) { +- return removeManyMutably([key], state); +- } +- function removeManyMutably(keys, state) { +- let didMutate = false; +- keys.forEach((key) => { +- if (key in state.entities) { +- delete state.entities[key]; +- didMutate = true; +- } +- }); +- if (didMutate) { +- state.ids = state.ids.filter((id) => id in state.entities); +- } +- } +- function removeAllMutably(state) { +- Object.assign(state, { +- ids: [], +- entities: {} +- }); +- } +- function takeNewKey(keys, update, state) { +- const original2 = state.entities[update.id]; +- const updated = Object.assign({}, original2, update.changes); +- const newKey = selectIdValue(updated, selectId); +- const hasNewKey = newKey !== update.id; +- if (hasNewKey) { +- keys[update.id] = newKey; +- delete state.entities[update.id]; +- } +- state.entities[newKey] = updated; +- return hasNewKey; +- } +- function updateOneMutably(update, state) { +- return updateManyMutably([update], state); +- } +- function updateManyMutably(updates, state) { +- const newKeys = {}; +- const updatesPerEntity = {}; +- updates.forEach((update) => { +- if (update.id in state.entities) { +- updatesPerEntity[update.id] = { +- id: update.id, +- changes: __spreadValues(__spreadValues({}, updatesPerEntity[update.id] ? updatesPerEntity[update.id].changes : null), update.changes) +- }; +- } +- }); +- updates = Object.values(updatesPerEntity); +- const didMutateEntities = updates.length > 0; +- if (didMutateEntities) { +- const didMutateIds = updates.filter((update) => takeNewKey(newKeys, update, state)).length > 0; +- if (didMutateIds) { +- state.ids = state.ids.map((id) => newKeys[id] || id); +- } +- } +- } +- function upsertOneMutably(entity, state) { +- return upsertManyMutably([entity], state); +- } +- function upsertManyMutably(newEntities, state) { +- const [added, updated] = splitAddedUpdatedEntities(newEntities, selectId, state); +- updateManyMutably(updated, state); +- addManyMutably(added, state); +- } +- return { +- removeAll: createSingleArgumentStateOperator(removeAllMutably), +- addOne: createStateOperator(addOneMutably), +- addMany: createStateOperator(addManyMutably), +- setOne: createStateOperator(setOneMutably), +- setMany: createStateOperator(setManyMutably), +- setAll: createStateOperator(setAllMutably), +- updateOne: createStateOperator(updateOneMutably), +- updateMany: createStateOperator(updateManyMutably), +- upsertOne: createStateOperator(upsertOneMutably), +- upsertMany: createStateOperator(upsertManyMutably), +- removeOne: createStateOperator(removeOneMutably), +- removeMany: createStateOperator(removeManyMutably) +- }; +-} +-// src/entities/sorted_state_adapter.ts +-function createSortedStateAdapter(selectId, sort) { +- const { removeOne, removeMany, removeAll } = createUnsortedStateAdapter(selectId); +- function addOneMutably(entity, state) { +- return addManyMutably([entity], state); +- } +- function addManyMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- const models = newEntities.filter((model) => !(selectIdValue(model, selectId) in state.entities)); +- if (models.length !== 0) { +- merge(models, state); +- } +- } +- function setOneMutably(entity, state) { +- return setManyMutably([entity], state); +- } +- function setManyMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- if (newEntities.length !== 0) { +- merge(newEntities, state); +- } +- } +- function setAllMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- state.entities = {}; +- state.ids = []; +- addManyMutably(newEntities, state); +- } +- function updateOneMutably(update, state) { +- return updateManyMutably([update], state); +- } +- function takeUpdatedModel(models, update, state) { +- if (!(update.id in state.entities)) { +- return false; +- } +- const original2 = state.entities[update.id]; +- const updated = Object.assign({}, original2, update.changes); +- const newKey = selectIdValue(updated, selectId); +- delete state.entities[update.id]; +- models.push(updated); +- return newKey !== update.id; +- } +- function updateManyMutably(updates, state) { +- const models = []; +- updates.forEach((update) => takeUpdatedModel(models, update, state)); +- if (models.length !== 0) { +- merge(models, state); +- } +- } +- function upsertOneMutably(entity, state) { +- return upsertManyMutably([entity], state); +- } +- function upsertManyMutably(newEntities, state) { +- const [added, updated] = splitAddedUpdatedEntities(newEntities, selectId, state); +- updateManyMutably(updated, state); +- addManyMutably(added, state); +- } +- function areArraysEqual(a, b) { +- if (a.length !== b.length) { +- return false; +- } +- for (let i = 0; i < a.length && i < b.length; i++) { +- if (a[i] === b[i]) { +- continue; +- } +- return false; +- } +- return true; +- } +- function merge(models, state) { +- models.forEach((model) => { +- state.entities[selectId(model)] = model; +- }); +- const allEntities = Object.values(state.entities); +- allEntities.sort(sort); +- const newSortedIds = allEntities.map(selectId); +- const { ids } = state; +- if (!areArraysEqual(ids, newSortedIds)) { +- state.ids = newSortedIds; +- } +- } +- return { +- removeOne, +- removeMany, +- removeAll, +- addOne: createStateOperator(addOneMutably), +- updateOne: createStateOperator(updateOneMutably), +- upsertOne: createStateOperator(upsertOneMutably), +- setOne: createStateOperator(setOneMutably), +- setMany: createStateOperator(setManyMutably), +- setAll: createStateOperator(setAllMutably), +- addMany: createStateOperator(addManyMutably), +- updateMany: createStateOperator(updateManyMutably), +- upsertMany: createStateOperator(upsertManyMutably) +- }; +-} +-// src/entities/create_adapter.ts +-function createEntityAdapter(options = {}) { +- const { selectId, sortComparer } = __spreadValues({ +- sortComparer: false, +- selectId: (instance) => instance.id +- }, options); +- const stateFactory = createInitialStateFactory(); +- const selectorsFactory = createSelectorsFactory(); +- const stateAdapter = sortComparer ? createSortedStateAdapter(selectId, sortComparer) : createUnsortedStateAdapter(selectId); +- return __spreadValues(__spreadValues(__spreadValues({ +- selectId, +- sortComparer +- }, stateFactory), selectorsFactory), stateAdapter); +-} +-// src/nanoid.ts +-var urlAlphabet = "ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW"; +-var nanoid = (size = 21) => { +- let id = ""; +- let i = size; +- while (i--) { +- id += urlAlphabet[Math.random() * 64 | 0]; +- } +- return id; +-}; +-// src/createAsyncThunk.ts +-var commonProperties = [ +- "name", +- "message", +- "stack", +- "code" +-]; +-var RejectWithValue = class { +- constructor(payload, meta) { +- this.payload = payload; +- this.meta = meta; +- } +-}; +-var FulfillWithMeta = class { +- constructor(payload, meta) { +- this.payload = payload; +- this.meta = meta; +- } +-}; +-var miniSerializeError = (value) => { +- if (typeof value === "object" && value !== null) { +- const simpleError = {}; +- for (const property of commonProperties) { +- if (typeof value[property] === "string") { +- simpleError[property] = value[property]; +- } +- } +- return simpleError; +- } +- return { message: String(value) }; +-}; +-function createAsyncThunk(typePrefix, payloadCreator, options) { +- const fulfilled = createAction(typePrefix + "/fulfilled", (payload, requestId, arg, meta) => ({ +- payload, +- meta: __spreadProps(__spreadValues({}, meta || {}), { +- arg, +- requestId, +- requestStatus: "fulfilled" +- }) +- })); +- const pending = createAction(typePrefix + "/pending", (requestId, arg, meta) => ({ +- payload: void 0, +- meta: __spreadProps(__spreadValues({}, meta || {}), { +- arg, +- requestId, +- requestStatus: "pending" +- }) +- })); +- const rejected = createAction(typePrefix + "/rejected", (error, requestId, arg, payload, meta) => ({ +- payload, +- error: (options && options.serializeError || miniSerializeError)(error || "Rejected"), +- meta: __spreadProps(__spreadValues({}, meta || {}), { +- arg, +- requestId, +- rejectedWithValue: !!payload, +- requestStatus: "rejected", +- aborted: (error == null ? void 0 : error.name) === "AbortError", +- condition: (error == null ? void 0 : error.name) === "ConditionError" +- }) +- })); +- let displayedWarning = false; +- const AC = typeof AbortController !== "undefined" ? AbortController : class { +- constructor() { +- this.signal = { +- aborted: false, +- addEventListener() { +- }, +- dispatchEvent() { +- return false; +- }, +- onabort() { +- }, +- removeEventListener() { +- } +- }; +- } +- abort() { +- if (process.env.NODE_ENV !== "production") { +- if (!displayedWarning) { +- displayedWarning = true; +- console.info(`This platform does not implement AbortController. +-If you want to use the AbortController to react to \`abort\` events, please consider importing a polyfill like 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only'.`); +- } +- } +- } +- }; +- function actionCreator(arg) { +- return (dispatch, getState, extra) => { +- var _a; +- const requestId = ((_a = options == null ? void 0 : options.idGenerator) != null ? _a : nanoid)(); +- const abortController = new AC(); +- let abortReason; +- const abortedPromise = new Promise((_, reject) => abortController.signal.addEventListener("abort", () => reject({ name: "AbortError", message: abortReason || "Aborted" }))); +- let started = false; +- function abort(reason) { +- if (started) { +- abortReason = reason; +- abortController.abort(); +- } +- } +- const promise = async function () { +- var _a2; +- let finalAction; +- try { +- if (options && options.condition && options.condition(arg, { getState, extra }) === false) { +- throw { +- name: "ConditionError", +- message: "Aborted due to condition callback returning false." +- }; +- } +- started = true; +- dispatch(pending(requestId, arg, (_a2 = options == null ? void 0 : options.getPendingMeta) == null ? void 0 : _a2.call(options, { requestId, arg }, { getState, extra }))); +- finalAction = await Promise.race([ +- abortedPromise, +- Promise.resolve(payloadCreator(arg, { +- dispatch, +- getState, +- extra, +- requestId, +- signal: abortController.signal, +- rejectWithValue: (value, meta) => { +- return new RejectWithValue(value, meta); +- }, +- fulfillWithValue: (value, meta) => { +- return new FulfillWithMeta(value, meta); +- } +- })).then((result) => { +- if (result instanceof RejectWithValue) { +- throw result; +- } +- if (result instanceof FulfillWithMeta) { +- return fulfilled(result.payload, requestId, arg, result.meta); +- } +- return fulfilled(result, requestId, arg); +- }) +- ]); +- } +- catch (err) { +- finalAction = err instanceof RejectWithValue ? rejected(null, requestId, arg, err.payload, err.meta) : rejected(err, requestId, arg); +- } +- const skipDispatch = options && !options.dispatchConditionRejection && rejected.match(finalAction) && finalAction.meta.condition; +- if (!skipDispatch) { +- dispatch(finalAction); +- } +- return finalAction; +- }(); +- return Object.assign(promise, { +- abort, +- requestId, +- arg, +- unwrap() { +- return promise.then(unwrapResult); +- } +- }); +- }; +- } +- return Object.assign(actionCreator, { +- pending, +- rejected, +- fulfilled, +- typePrefix +- }); +-} +-function unwrapResult(action) { +- if (action.meta && action.meta.rejectedWithValue) { +- throw action.payload; +- } +- if (action.error) { +- throw action.error; +- } +- return action.payload; +-} +-// src/tsHelpers.ts +-var hasMatchFunction = (v) => { +- return v && typeof v.match === "function"; +-}; +-// src/matchers.ts +-var matches = (matcher, action) => { +- if (hasMatchFunction(matcher)) { +- return matcher.match(action); +- } +- else { +- return matcher(action); +- } +-}; +-function isAnyOf(...matchers) { +- return (action) => { +- return matchers.some((matcher) => matches(matcher, action)); +- }; +-} +-function isAllOf(...matchers) { +- return (action) => { +- return matchers.every((matcher) => matches(matcher, action)); +- }; +-} +-function hasExpectedRequestMetadata(action, validStatus) { +- if (!action || !action.meta) +- return false; +- const hasValidRequestId = typeof action.meta.requestId === "string"; +- const hasValidRequestStatus = validStatus.indexOf(action.meta.requestStatus) > -1; +- return hasValidRequestId && hasValidRequestStatus; +-} +-function isAsyncThunkArray(a) { +- return typeof a[0] === "function" && "pending" in a[0] && "fulfilled" in a[0] && "rejected" in a[0]; +-} +-function isPending(...asyncThunks) { +- if (asyncThunks.length === 0) { +- return (action) => hasExpectedRequestMetadata(action, ["pending"]); +- } +- if (!isAsyncThunkArray(asyncThunks)) { +- return isPending()(asyncThunks[0]); +- } +- return (action) => { +- const matchers = asyncThunks.map((asyncThunk) => asyncThunk.pending); +- const combinedMatcher = isAnyOf(...matchers); +- return combinedMatcher(action); +- }; +-} +-function isRejected(...asyncThunks) { +- if (asyncThunks.length === 0) { +- return (action) => hasExpectedRequestMetadata(action, ["rejected"]); +- } +- if (!isAsyncThunkArray(asyncThunks)) { +- return isRejected()(asyncThunks[0]); +- } +- return (action) => { +- const matchers = asyncThunks.map((asyncThunk) => asyncThunk.rejected); +- const combinedMatcher = isAnyOf(...matchers); +- return combinedMatcher(action); +- }; +-} +-function isRejectedWithValue(...asyncThunks) { +- const hasFlag = (action) => { +- return action && action.meta && action.meta.rejectedWithValue; +- }; +- if (asyncThunks.length === 0) { +- return (action) => { +- const combinedMatcher = isAllOf(isRejected(...asyncThunks), hasFlag); +- return combinedMatcher(action); +- }; +- } +- if (!isAsyncThunkArray(asyncThunks)) { +- return isRejectedWithValue()(asyncThunks[0]); +- } +- return (action) => { +- const combinedMatcher = isAllOf(isRejected(...asyncThunks), hasFlag); +- return combinedMatcher(action); +- }; +-} +-function isFulfilled(...asyncThunks) { +- if (asyncThunks.length === 0) { +- return (action) => hasExpectedRequestMetadata(action, ["fulfilled"]); +- } +- if (!isAsyncThunkArray(asyncThunks)) { +- return isFulfilled()(asyncThunks[0]); +- } +- return (action) => { +- const matchers = asyncThunks.map((asyncThunk) => asyncThunk.fulfilled); +- const combinedMatcher = isAnyOf(...matchers); +- return combinedMatcher(action); +- }; +-} +-function isAsyncThunkAction(...asyncThunks) { +- if (asyncThunks.length === 0) { +- return (action) => hasExpectedRequestMetadata(action, ["pending", "fulfilled", "rejected"]); +- } +- if (!isAsyncThunkArray(asyncThunks)) { +- return isAsyncThunkAction()(asyncThunks[0]); +- } +- return (action) => { +- const matchers = []; +- for (const asyncThunk of asyncThunks) { +- matchers.push(asyncThunk.pending, asyncThunk.rejected, asyncThunk.fulfilled); +- } +- const combinedMatcher = isAnyOf(...matchers); +- return combinedMatcher(action); +- }; +-} +-// src/index.ts +-enableES5(); +-export { MiddlewareArray, configureStore, createAction, createAsyncThunk, createDraftSafeSelector, createEntityAdapter, createImmutableStateInvariantMiddleware, default2 as createNextState, createReducer, createSelector2 as createSelector, createSerializableStateInvariantMiddleware, createSlice, current2 as current, findNonSerializableValue, freeze, getDefaultMiddleware, getType, isAllOf, isAnyOf, isAsyncThunkAction, isDraft4 as isDraft, isFulfilled, isImmutableDefault, isPending, isPlain, isPlainObject, isRejected, isRejectedWithValue, miniSerializeError, nanoid, original, unwrapResult }; +-//# sourceMappingURL=redux-toolkit.modern.js.map +\ No newline at end of file +diff --git a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.js.map b/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.js.map +deleted file mode 100644 +index 11cdaea..0000000 +--- a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.js.map ++++ /dev/null +@@ -1 +0,0 @@ +-{"version":3,"sources":["../src/index.ts","../src/createDraftSafeSelector.ts","../src/configureStore.ts","../src/devtoolsExtension.ts","../src/isPlainObject.ts","../src/getDefaultMiddleware.ts","../src/utils.ts","../src/immutableStateInvariantMiddleware.ts","../src/serializableStateInvariantMiddleware.ts","../src/createAction.ts","../src/createReducer.ts","../src/mapBuilders.ts","../src/createSlice.ts","../src/entities/entity_state.ts","../src/entities/state_selectors.ts","../src/entities/state_adapter.ts","../src/entities/utils.ts","../src/entities/unsorted_state_adapter.ts","../src/entities/sorted_state_adapter.ts","../src/entities/create_adapter.ts","../src/nanoid.ts","../src/createAsyncThunk.ts","../src/tsHelpers.ts","../src/matchers.ts","redux-toolkit.modern.ts"],"names":[],"mappings":"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","sourcesContent":["import { enableES5 } from 'immer'\r\nexport * from 'redux'\r\nexport {\r\n default as createNextState,\r\n current,\r\n freeze,\r\n original,\r\n isDraft,\r\n} from 'immer'\r\nexport type { Draft } from 'immer'\r\nexport { createSelector } from 'reselect'\r\nexport type {\r\n Selector,\r\n OutputParametricSelector,\r\n OutputSelector,\r\n ParametricSelector,\r\n} from 'reselect'\r\nexport { createDraftSafeSelector } from './createDraftSafeSelector'\r\nexport type { ThunkAction, ThunkDispatch } from 'redux-thunk'\r\n\r\n// We deliberately enable Immer's ES5 support, on the grounds that\r\n// we assume RTK will be used with React Native and other Proxy-less\r\n// environments. In addition, that's how Immer 4 behaved, and since\r\n// we want to ship this in an RTK minor, we should keep the same behavior.\r\nenableES5()\r\n\r\nexport {\r\n // js\r\n configureStore,\r\n} from './configureStore'\r\nexport type {\r\n // types\r\n ConfigureEnhancersCallback,\r\n ConfigureStoreOptions,\r\n EnhancedStore,\r\n} from './configureStore'\r\nexport {\r\n // js\r\n createAction,\r\n getType,\r\n} from './createAction'\r\nexport type {\r\n // types\r\n PayloadAction,\r\n PayloadActionCreator,\r\n ActionCreatorWithNonInferrablePayload,\r\n ActionCreatorWithOptionalPayload,\r\n ActionCreatorWithPayload,\r\n ActionCreatorWithoutPayload,\r\n ActionCreatorWithPreparedPayload,\r\n PrepareAction,\r\n} from './createAction'\r\nexport {\r\n // js\r\n createReducer,\r\n} from './createReducer'\r\nexport type {\r\n // types\r\n Actions,\r\n CaseReducer,\r\n CaseReducers,\r\n} from './createReducer'\r\nexport {\r\n // js\r\n createSlice,\r\n} from './createSlice'\r\n\r\nexport type {\r\n // types\r\n CreateSliceOptions,\r\n Slice,\r\n CaseReducerActions,\r\n SliceCaseReducers,\r\n ValidateSliceCaseReducers,\r\n CaseReducerWithPrepare,\r\n SliceActionCreator,\r\n} from './createSlice'\r\nexport {\r\n // js\r\n createImmutableStateInvariantMiddleware,\r\n isImmutableDefault,\r\n} from './immutableStateInvariantMiddleware'\r\nexport type {\r\n // types\r\n ImmutableStateInvariantMiddlewareOptions,\r\n} from './immutableStateInvariantMiddleware'\r\nexport {\r\n // js\r\n createSerializableStateInvariantMiddleware,\r\n findNonSerializableValue,\r\n isPlain,\r\n} from './serializableStateInvariantMiddleware'\r\nexport type {\r\n // types\r\n SerializableStateInvariantMiddlewareOptions,\r\n} from './serializableStateInvariantMiddleware'\r\nexport {\r\n // js\r\n getDefaultMiddleware,\r\n} from './getDefaultMiddleware'\r\nexport type {\r\n // types\r\n ActionReducerMapBuilder,\r\n} from './mapBuilders'\r\nexport { MiddlewareArray } from './utils'\r\n\r\nexport { createEntityAdapter } from './entities/create_adapter'\r\nexport type {\r\n Dictionary,\r\n EntityState,\r\n EntityAdapter,\r\n EntitySelectors,\r\n EntityStateAdapter,\r\n EntityId,\r\n Update,\r\n IdSelector,\r\n Comparer,\r\n} from './entities/models'\r\n\r\nexport {\r\n createAsyncThunk,\r\n unwrapResult,\r\n miniSerializeError,\r\n} from './createAsyncThunk'\r\nexport type {\r\n AsyncThunk,\r\n AsyncThunkOptions,\r\n AsyncThunkAction,\r\n AsyncThunkPayloadCreatorReturnValue,\r\n AsyncThunkPayloadCreator,\r\n SerializedError,\r\n} from './createAsyncThunk'\r\n\r\nexport {\r\n // js\r\n isAllOf,\r\n isAnyOf,\r\n isPending,\r\n isRejected,\r\n isFulfilled,\r\n isAsyncThunkAction,\r\n isRejectedWithValue,\r\n} from './matchers'\r\nexport type {\r\n // types\r\n ActionMatchingAllOf,\r\n ActionMatchingAnyOf,\r\n} from './matchers'\r\n\r\nexport { nanoid } from './nanoid'\r\n\r\nexport { default as isPlainObject } from './isPlainObject'\r\n","import { current, isDraft } from 'immer'\r\nimport { createSelector } from 'reselect'\r\n\r\n/**\r\n * \"Draft-Safe\" version of `reselect`'s `createSelector`:\r\n * If an `immer`-drafted object is passed into the resulting selector's first argument,\r\n * the selector will act on the current draft value, instead of returning a cached value\r\n * that might be possibly outdated if the draft has been modified since.\r\n * @public\r\n */\r\nexport const createDraftSafeSelector: typeof createSelector = (\r\n ...args: unknown[]\r\n) => {\r\n const selector = (createSelector as any)(...args)\r\n const wrappedSelector = (value: unknown, ...rest: unknown[]) =>\r\n selector(isDraft(value) ? current(value) : value, ...rest)\r\n return wrappedSelector as any\r\n}\r\n","import type {\r\n Reducer,\r\n ReducersMapObject,\r\n Middleware,\r\n Action,\r\n AnyAction,\r\n StoreEnhancer,\r\n Store,\r\n Dispatch,\r\n PreloadedState,\r\n CombinedState,\r\n} from 'redux'\r\nimport { createStore, compose, applyMiddleware, combineReducers } from 'redux'\r\nimport type { EnhancerOptions as DevToolsOptions } from './devtoolsExtension'\r\nimport { composeWithDevTools } from './devtoolsExtension'\r\n\r\nimport isPlainObject from './isPlainObject'\r\nimport type {\r\n ThunkMiddlewareFor,\r\n CurriedGetDefaultMiddleware,\r\n} from './getDefaultMiddleware'\r\nimport { curryGetDefaultMiddleware } from './getDefaultMiddleware'\r\nimport type { DispatchForMiddlewares, NoInfer } from './tsHelpers'\r\n\r\nconst IS_PRODUCTION = process.env.NODE_ENV === 'production'\r\n\r\n/**\r\n * Callback function type, to be used in `ConfigureStoreOptions.enhancers`\r\n *\r\n * @public\r\n */\r\nexport type ConfigureEnhancersCallback = (\r\n defaultEnhancers: readonly StoreEnhancer[]\r\n) => StoreEnhancer[]\r\n\r\n/**\r\n * Options for `configureStore()`.\r\n *\r\n * @public\r\n */\r\nexport interface ConfigureStoreOptions<\r\n S = any,\r\n A extends Action = AnyAction,\r\n M extends Middlewares = Middlewares\r\n> {\r\n /**\r\n * A single reducer function that will be used as the root reducer, or an\r\n * object of slice reducers that will be passed to `combineReducers()`.\r\n */\r\n reducer: Reducer | ReducersMapObject\r\n\r\n /**\r\n * An array of Redux middleware to install. If not supplied, defaults to\r\n * the set of middleware returned by `getDefaultMiddleware()`.\r\n */\r\n middleware?: ((getDefaultMiddleware: CurriedGetDefaultMiddleware) => M) | M\r\n\r\n /**\r\n * Whether to enable Redux DevTools integration. Defaults to `true`.\r\n *\r\n * Additional configuration can be done by passing Redux DevTools options\r\n */\r\n devTools?: boolean | DevToolsOptions\r\n\r\n /**\r\n * The initial state, same as Redux's createStore.\r\n * You may optionally specify it to hydrate the state\r\n * from the server in universal apps, or to restore a previously serialized\r\n * user session. If you use `combineReducers()` to produce the root reducer\r\n * function (either directly or indirectly by passing an object as `reducer`),\r\n * this must be an object with the same shape as the reducer map keys.\r\n */\r\n /* \r\n Not 100% correct but the best approximation we can get:\r\n - if S is a `CombinedState` applying a second `CombinedState` on it does not change anything.\r\n - if it is not, there could be two cases:\r\n - `ReducersMapObject` is being passed in. In this case, we will call `combineReducers` on it and `CombinedState` is correct\r\n - `Reducer` is being passed in. In this case, actually `CombinedState` is wrong and `S` would be correct.\r\n As we cannot distinguish between those two cases without adding another generic paramter, \r\n we just make the pragmatic assumption that the latter almost never happens.\r\n */\r\n preloadedState?: PreloadedState>>\r\n\r\n /**\r\n * The store enhancers to apply. See Redux's `createStore()`.\r\n * All enhancers will be included before the DevTools Extension enhancer.\r\n * If you need to customize the order of enhancers, supply a callback\r\n * function that will receive the original array (ie, `[applyMiddleware]`),\r\n * and should return a new array (such as `[applyMiddleware, offline]`).\r\n * If you only need to add middleware, you can use the `middleware` parameter instead.\r\n */\r\n enhancers?: StoreEnhancer[] | ConfigureEnhancersCallback\r\n}\r\n\r\ntype Middlewares = ReadonlyArray>\r\n\r\n/**\r\n * A Redux store returned by `configureStore()`. Supports dispatching\r\n * side-effectful _thunks_ in addition to plain actions.\r\n *\r\n * @public\r\n */\r\nexport interface EnhancedStore<\r\n S = any,\r\n A extends Action = AnyAction,\r\n M extends Middlewares = Middlewares\r\n> extends Store {\r\n /**\r\n * The `dispatch` method of your store, enhanced by all its middlewares.\r\n *\r\n * @inheritdoc\r\n */\r\n dispatch: DispatchForMiddlewares & Dispatch\r\n}\r\n\r\n/**\r\n * A friendly abstraction over the standard Redux `createStore()` function.\r\n *\r\n * @param config The store configuration.\r\n * @returns A configured Redux store.\r\n *\r\n * @public\r\n */\r\nexport function configureStore<\r\n S = any,\r\n A extends Action = AnyAction,\r\n M extends Middlewares = [ThunkMiddlewareFor]\r\n>(options: ConfigureStoreOptions): EnhancedStore {\r\n const curriedGetDefaultMiddleware = curryGetDefaultMiddleware()\r\n\r\n const {\r\n reducer = undefined,\r\n middleware = curriedGetDefaultMiddleware(),\r\n devTools = true,\r\n preloadedState = undefined,\r\n enhancers = undefined,\r\n } = options || {}\r\n\r\n let rootReducer: Reducer\r\n\r\n if (typeof reducer === 'function') {\r\n rootReducer = reducer\r\n } else if (isPlainObject(reducer)) {\r\n rootReducer = combineReducers(reducer)\r\n } else {\r\n throw new Error(\r\n '\"reducer\" is a required argument, and must be a function or an object of functions that can be passed to combineReducers'\r\n )\r\n }\r\n\r\n let finalMiddleware = middleware\r\n if (typeof finalMiddleware === 'function') {\r\n finalMiddleware = finalMiddleware(curriedGetDefaultMiddleware)\r\n\r\n if (!IS_PRODUCTION && !Array.isArray(finalMiddleware)) {\r\n throw new Error(\r\n 'when using a middleware builder function, an array of middleware must be returned'\r\n )\r\n }\r\n }\r\n if (\r\n !IS_PRODUCTION &&\r\n finalMiddleware.some((item) => typeof item !== 'function')\r\n ) {\r\n throw new Error(\r\n 'each middleware provided to configureStore must be a function'\r\n )\r\n }\r\n\r\n const middlewareEnhancer = applyMiddleware(...finalMiddleware)\r\n\r\n let finalCompose = compose\r\n\r\n if (devTools) {\r\n finalCompose = composeWithDevTools({\r\n // Enable capture of stack traces for dispatched Redux actions\r\n trace: !IS_PRODUCTION,\r\n ...(typeof devTools === 'object' && devTools),\r\n })\r\n }\r\n\r\n let storeEnhancers: StoreEnhancer[] = [middlewareEnhancer]\r\n\r\n if (Array.isArray(enhancers)) {\r\n storeEnhancers = [middlewareEnhancer, ...enhancers]\r\n } else if (typeof enhancers === 'function') {\r\n storeEnhancers = enhancers(storeEnhancers)\r\n }\r\n\r\n const composedEnhancer = finalCompose(...storeEnhancers) as any\r\n\r\n return createStore(rootReducer, preloadedState, composedEnhancer)\r\n}\r\n","import type { Action, ActionCreator, StoreEnhancer } from 'redux'\r\nimport { compose } from 'redux'\r\n\r\n/**\r\n * @public\r\n */\r\nexport interface EnhancerOptions {\r\n /**\r\n * the instance name to be showed on the monitor page. Default value is `document.title`.\r\n * If not specified and there's no document title, it will consist of `tabId` and `instanceId`.\r\n */\r\n name?: string\r\n /**\r\n * action creators functions to be available in the Dispatcher.\r\n */\r\n actionCreators?: ActionCreator[] | { [key: string]: ActionCreator }\r\n /**\r\n * if more than one action is dispatched in the indicated interval, all new actions will be collected and sent at once.\r\n * It is the joint between performance and speed. When set to `0`, all actions will be sent instantly.\r\n * Set it to a higher value when experiencing perf issues (also `maxAge` to a lower value).\r\n *\r\n * @default 500 ms.\r\n */\r\n latency?: number\r\n /**\r\n * (> 1) - maximum allowed actions to be stored in the history tree. The oldest actions are removed once maxAge is reached. It's critical for performance.\r\n *\r\n * @default 50\r\n */\r\n maxAge?: number\r\n /**\r\n * See detailed documentation at http://extension.remotedev.io/docs/API/Arguments.html#serialize\r\n */\r\n serialize?:\r\n | boolean\r\n | {\r\n options?:\r\n | boolean\r\n | {\r\n date?: boolean\r\n regex?: boolean\r\n undefined?: boolean\r\n error?: boolean\r\n symbol?: boolean\r\n map?: boolean\r\n set?: boolean\r\n function?: boolean | Function\r\n }\r\n replacer?: (key: string, value: unknown) => unknown\r\n reviver?: (key: string, value: unknown) => unknown\r\n immutable?: unknown\r\n refs?: unknown[]\r\n }\r\n /**\r\n * function which takes `action` object and id number as arguments, and should return `action` object back.\r\n */\r\n actionSanitizer?: (action: A, id: number) => A\r\n /**\r\n * function which takes `state` object and index as arguments, and should return `state` object back.\r\n */\r\n stateSanitizer?: (state: S, index: number) => S\r\n /**\r\n * *string or array of strings as regex* - actions types to be hidden / shown in the monitors (while passed to the reducers).\r\n * If `actionsWhitelist` specified, `actionsBlacklist` is ignored.\r\n */\r\n actionsBlacklist?: string | string[]\r\n /**\r\n * *string or array of strings as regex* - actions types to be hidden / shown in the monitors (while passed to the reducers).\r\n * If `actionsWhitelist` specified, `actionsBlacklist` is ignored.\r\n */\r\n actionsWhitelist?: string | string[]\r\n /**\r\n * called for every action before sending, takes `state` and `action` object, and returns `true` in case it allows sending the current data to the monitor.\r\n * Use it as a more advanced version of `actionsBlacklist`/`actionsWhitelist` parameters.\r\n */\r\n predicate?: (state: S, action: A) => boolean\r\n /**\r\n * if specified as `false`, it will not record the changes till clicking on `Start recording` button.\r\n * Available only for Redux enhancer, for others use `autoPause`.\r\n *\r\n * @default true\r\n */\r\n shouldRecordChanges?: boolean\r\n /**\r\n * if specified, whenever clicking on `Pause recording` button and there are actions in the history log, will add this action type.\r\n * If not specified, will commit when paused. Available only for Redux enhancer.\r\n *\r\n * @default \"@@PAUSED\"\"\r\n */\r\n pauseActionType?: string\r\n /**\r\n * auto pauses when the extension’s window is not opened, and so has zero impact on your app when not in use.\r\n * Not available for Redux enhancer (as it already does it but storing the data to be sent).\r\n *\r\n * @default false\r\n */\r\n autoPause?: boolean\r\n /**\r\n * if specified as `true`, it will not allow any non-monitor actions to be dispatched till clicking on `Unlock changes` button.\r\n * Available only for Redux enhancer.\r\n *\r\n * @default false\r\n */\r\n shouldStartLocked?: boolean\r\n /**\r\n * if set to `false`, will not recompute the states on hot reloading (or on replacing the reducers). Available only for Redux enhancer.\r\n *\r\n * @default true\r\n */\r\n shouldHotReload?: boolean\r\n /**\r\n * if specified as `true`, whenever there's an exception in reducers, the monitors will show the error message, and next actions will not be dispatched.\r\n *\r\n * @default false\r\n */\r\n shouldCatchErrors?: boolean\r\n /**\r\n * If you want to restrict the extension, specify the features you allow.\r\n * If not specified, all of the features are enabled. When set as an object, only those included as `true` will be allowed.\r\n * Note that except `true`/`false`, `import` and `export` can be set as `custom` (which is by default for Redux enhancer), meaning that the importing/exporting occurs on the client side.\r\n * Otherwise, you'll get/set the data right from the monitor part.\r\n */\r\n features?: {\r\n /**\r\n * start/pause recording of dispatched actions\r\n */\r\n pause?: boolean\r\n /**\r\n * lock/unlock dispatching actions and side effects\r\n */\r\n lock?: boolean\r\n /**\r\n * persist states on page reloading\r\n */\r\n persist?: boolean\r\n /**\r\n * export history of actions in a file\r\n */\r\n export?: boolean | 'custom'\r\n /**\r\n * import history of actions from a file\r\n */\r\n import?: boolean | 'custom'\r\n /**\r\n * jump back and forth (time travelling)\r\n */\r\n jump?: boolean\r\n /**\r\n * skip (cancel) actions\r\n */\r\n skip?: boolean\r\n /**\r\n * drag and drop actions in the history list\r\n */\r\n reorder?: boolean\r\n /**\r\n * dispatch custom actions or action creators\r\n */\r\n dispatch?: boolean\r\n /**\r\n * generate tests for the selected actions\r\n */\r\n test?: boolean\r\n }\r\n /**\r\n * Set to true or a stacktrace-returning function to record call stack traces for dispatched actions.\r\n * Defaults to false.\r\n */\r\n trace?: boolean | ((action: A) => string)\r\n /**\r\n * The maximum number of stack trace entries to record per action. Defaults to 10.\r\n */\r\n traceLimit?: number\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport const composeWithDevTools: {\r\n (options: EnhancerOptions): typeof compose\r\n (...funcs: Array>): StoreEnhancer\r\n} =\r\n typeof window !== 'undefined' &&\r\n (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\r\n ? (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\r\n : function () {\r\n if (arguments.length === 0) return undefined\r\n if (typeof arguments[0] === 'object') return compose\r\n return compose.apply(null, arguments as any as Function[])\r\n }\r\n\r\n/**\r\n * @public\r\n */\r\nexport const devToolsEnhancer: {\r\n (options: EnhancerOptions): StoreEnhancer\r\n} =\r\n typeof window !== 'undefined' && (window as any).__REDUX_DEVTOOLS_EXTENSION__\r\n ? (window as any).__REDUX_DEVTOOLS_EXTENSION__\r\n : function () {\r\n return function (noop) {\r\n return noop\r\n }\r\n }\r\n","/**\r\n * Returns true if the passed value is \"plain\" object, i.e. an object whose\r\n * prototype is the root `Object.prototype`. This includes objects created\r\n * using object literals, but not for instance for class instances.\r\n *\r\n * @param {any} value The value to inspect.\r\n * @returns {boolean} True if the argument appears to be a plain object.\r\n *\r\n * @public\r\n */\r\nexport default function isPlainObject(value: unknown): value is object {\r\n if (typeof value !== 'object' || value === null) return false\r\n\r\n let proto = value\r\n while (Object.getPrototypeOf(proto) !== null) {\r\n proto = Object.getPrototypeOf(proto)\r\n }\r\n\r\n return Object.getPrototypeOf(value) === proto\r\n}\r\n","import type { Middleware, AnyAction } from 'redux'\r\nimport type { ThunkMiddleware } from 'redux-thunk'\r\nimport thunkMiddleware from 'redux-thunk'\r\nimport type { ImmutableStateInvariantMiddlewareOptions } from './immutableStateInvariantMiddleware'\r\n/* PROD_START_REMOVE_UMD */\r\nimport { createImmutableStateInvariantMiddleware } from './immutableStateInvariantMiddleware'\r\n/* PROD_STOP_REMOVE_UMD */\r\n\r\nimport type { SerializableStateInvariantMiddlewareOptions } from './serializableStateInvariantMiddleware'\r\nimport { createSerializableStateInvariantMiddleware } from './serializableStateInvariantMiddleware'\r\nimport { MiddlewareArray } from './utils'\r\n\r\nfunction isBoolean(x: any): x is boolean {\r\n return typeof x === 'boolean'\r\n}\r\n\r\ninterface ThunkOptions {\r\n extraArgument: E\r\n}\r\n\r\ninterface GetDefaultMiddlewareOptions {\r\n thunk?: boolean | ThunkOptions\r\n immutableCheck?: boolean | ImmutableStateInvariantMiddlewareOptions\r\n serializableCheck?: boolean | SerializableStateInvariantMiddlewareOptions\r\n}\r\n\r\nexport type ThunkMiddlewareFor<\r\n S,\r\n O extends GetDefaultMiddlewareOptions = {}\r\n> = O extends {\r\n thunk: false\r\n}\r\n ? never\r\n : O extends { thunk: { extraArgument: infer E } }\r\n ? ThunkMiddleware\r\n :\r\n | ThunkMiddleware //The ThunkMiddleware with a `null` ExtraArgument is here to provide backwards-compatibility.\r\n | ThunkMiddleware\r\n\r\nexport type CurriedGetDefaultMiddleware = <\r\n O extends Partial = {\r\n thunk: true\r\n immutableCheck: true\r\n serializableCheck: true\r\n }\r\n>(\r\n options?: O\r\n) => MiddlewareArray | ThunkMiddlewareFor>\r\n\r\nexport function curryGetDefaultMiddleware<\r\n S = any\r\n>(): CurriedGetDefaultMiddleware {\r\n return function curriedGetDefaultMiddleware(options) {\r\n return getDefaultMiddleware(options)\r\n }\r\n}\r\n\r\n/**\r\n * Returns any array containing the default middleware installed by\r\n * `configureStore()`. Useful if you want to configure your store with a custom\r\n * `middleware` array but still keep the default set.\r\n *\r\n * @return The default middleware used by `configureStore()`.\r\n *\r\n * @public\r\n *\r\n * @deprecated Prefer to use the callback notation for the `middleware` option in `configureStore`\r\n * to access a pre-typed `getDefaultMiddleware` instead.\r\n */\r\nexport function getDefaultMiddleware<\r\n S = any,\r\n O extends Partial = {\r\n thunk: true\r\n immutableCheck: true\r\n serializableCheck: true\r\n }\r\n>(\r\n options: O = {} as O\r\n): MiddlewareArray | ThunkMiddlewareFor> {\r\n const {\r\n thunk = true,\r\n immutableCheck = true,\r\n serializableCheck = true,\r\n } = options\r\n\r\n let middlewareArray: Middleware<{}, S>[] = new MiddlewareArray()\r\n\r\n if (thunk) {\r\n if (isBoolean(thunk)) {\r\n middlewareArray.push(thunkMiddleware)\r\n } else {\r\n middlewareArray.push(\r\n thunkMiddleware.withExtraArgument(thunk.extraArgument)\r\n )\r\n }\r\n }\r\n\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (immutableCheck) {\r\n /* PROD_START_REMOVE_UMD */\r\n let immutableOptions: ImmutableStateInvariantMiddlewareOptions = {}\r\n\r\n if (!isBoolean(immutableCheck)) {\r\n immutableOptions = immutableCheck\r\n }\r\n\r\n middlewareArray.unshift(\r\n createImmutableStateInvariantMiddleware(immutableOptions)\r\n )\r\n /* PROD_STOP_REMOVE_UMD */\r\n }\r\n\r\n if (serializableCheck) {\r\n let serializableOptions: SerializableStateInvariantMiddlewareOptions = {}\r\n\r\n if (!isBoolean(serializableCheck)) {\r\n serializableOptions = serializableCheck\r\n }\r\n\r\n middlewareArray.push(\r\n createSerializableStateInvariantMiddleware(serializableOptions)\r\n )\r\n }\r\n }\r\n\r\n return middlewareArray as any\r\n}\r\n","import type { Middleware } from 'redux'\r\n\r\nexport function getTimeMeasureUtils(maxDelay: number, fnName: string) {\r\n let elapsed = 0\r\n return {\r\n measureTime(fn: () => T): T {\r\n const started = Date.now()\r\n try {\r\n return fn()\r\n } finally {\r\n const finished = Date.now()\r\n elapsed += finished - started\r\n }\r\n },\r\n warnIfExceeded() {\r\n if (elapsed > maxDelay) {\r\n console.warn(`${fnName} took ${elapsed}ms, which is more than the warning threshold of ${maxDelay}ms. \r\nIf your state or actions are very large, you may want to disable the middleware as it might cause too much of a slowdown in development mode. See https://redux-toolkit.js.org/api/getDefaultMiddleware for instructions.\r\nIt is disabled in production builds, so you don't need to worry about that.`)\r\n }\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport class MiddlewareArray<\r\n Middlewares extends Middleware\r\n> extends Array {\r\n constructor(arrayLength?: number)\r\n constructor(...items: Middlewares[])\r\n constructor(...args: any[]) {\r\n super(...args)\r\n Object.setPrototypeOf(this, MiddlewareArray.prototype)\r\n }\r\n\r\n static get [Symbol.species]() {\r\n return MiddlewareArray as any\r\n }\r\n\r\n concat>>(\r\n items: AdditionalMiddlewares\r\n ): MiddlewareArray\r\n\r\n concat>>(\r\n ...items: AdditionalMiddlewares\r\n ): MiddlewareArray\r\n concat(...arr: any[]) {\r\n return super.concat.apply(this, arr)\r\n }\r\n\r\n prepend>>(\r\n items: AdditionalMiddlewares\r\n ): MiddlewareArray\r\n\r\n prepend>>(\r\n ...items: AdditionalMiddlewares\r\n ): MiddlewareArray\r\n\r\n prepend(...arr: any[]) {\r\n if (arr.length === 1 && Array.isArray(arr[0])) {\r\n return new MiddlewareArray(...arr[0].concat(this))\r\n }\r\n return new MiddlewareArray(...arr.concat(this))\r\n }\r\n}\r\n","import type { Middleware } from 'redux'\r\nimport { getTimeMeasureUtils } from './utils'\r\n\r\ntype EntryProcessor = (key: string, value: any) => any\r\n\r\nconst isProduction: boolean = process.env.NODE_ENV === 'production'\r\nconst prefix: string = 'Invariant failed'\r\n\r\n// Throw an error if the condition fails\r\n// Strip out error messages for production\r\n// > Not providing an inline default argument for message as the result is smaller\r\nfunction invariant(condition: any, message?: string) {\r\n if (condition) {\r\n return\r\n }\r\n // Condition not passed\r\n\r\n // In production we strip the message but still throw\r\n if (isProduction) {\r\n throw new Error(prefix)\r\n }\r\n\r\n // When not in production we allow the message to pass through\r\n // *This block will be removed in production builds*\r\n throw new Error(`${prefix}: ${message || ''}`)\r\n}\r\n\r\nfunction stringify(\r\n obj: any,\r\n serializer?: EntryProcessor,\r\n indent?: string | number,\r\n decycler?: EntryProcessor\r\n): string {\r\n return JSON.stringify(obj, getSerialize(serializer, decycler), indent)\r\n}\r\n\r\nfunction getSerialize(\r\n serializer?: EntryProcessor,\r\n decycler?: EntryProcessor\r\n): EntryProcessor {\r\n let stack: any[] = [],\r\n keys: any[] = []\r\n\r\n if (!decycler)\r\n decycler = function (_: string, value: any) {\r\n if (stack[0] === value) return '[Circular ~]'\r\n return (\r\n '[Circular ~.' + keys.slice(0, stack.indexOf(value)).join('.') + ']'\r\n )\r\n }\r\n\r\n return function (this: any, key: string, value: any) {\r\n if (stack.length > 0) {\r\n var thisPos = stack.indexOf(this)\r\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this)\r\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key)\r\n if (~stack.indexOf(value)) value = decycler!.call(this, key, value)\r\n } else stack.push(value)\r\n\r\n return serializer == null ? value : serializer.call(this, key, value)\r\n }\r\n}\r\n\r\n/**\r\n * The default `isImmutable` function.\r\n *\r\n * @public\r\n */\r\nexport function isImmutableDefault(value: unknown): boolean {\r\n return (\r\n typeof value !== 'object' ||\r\n value === null ||\r\n typeof value === 'undefined' ||\r\n Object.isFrozen(value)\r\n )\r\n}\r\n\r\nexport function trackForMutations(\r\n isImmutable: IsImmutableFunc,\r\n ignorePaths: string[] | undefined,\r\n obj: any\r\n) {\r\n const trackedProperties = trackProperties(isImmutable, ignorePaths, obj)\r\n return {\r\n detectMutations() {\r\n return detectMutations(isImmutable, ignorePaths, trackedProperties, obj)\r\n },\r\n }\r\n}\r\n\r\ninterface TrackedProperty {\r\n value: any\r\n children: Record\r\n}\r\n\r\nfunction trackProperties(\r\n isImmutable: IsImmutableFunc,\r\n ignorePaths: IgnorePaths = [],\r\n obj: Record,\r\n path: string = ''\r\n) {\r\n const tracked: Partial = { value: obj }\r\n\r\n if (!isImmutable(obj)) {\r\n tracked.children = {}\r\n\r\n for (const key in obj) {\r\n const childPath = path ? path + '.' + key : key\r\n if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) {\r\n continue\r\n }\r\n\r\n tracked.children[key] = trackProperties(\r\n isImmutable,\r\n ignorePaths,\r\n obj[key],\r\n childPath\r\n )\r\n }\r\n }\r\n return tracked as TrackedProperty\r\n}\r\n\r\ntype IgnorePaths = readonly string[]\r\n\r\nfunction detectMutations(\r\n isImmutable: IsImmutableFunc,\r\n ignorePaths: IgnorePaths = [],\r\n trackedProperty: TrackedProperty,\r\n obj: any,\r\n sameParentRef: boolean = false,\r\n path: string = ''\r\n): { wasMutated: boolean; path?: string } {\r\n const prevObj = trackedProperty ? trackedProperty.value : undefined\r\n\r\n const sameRef = prevObj === obj\r\n\r\n if (sameParentRef && !sameRef && !Number.isNaN(obj)) {\r\n return { wasMutated: true, path }\r\n }\r\n\r\n if (isImmutable(prevObj) || isImmutable(obj)) {\r\n return { wasMutated: false }\r\n }\r\n\r\n // Gather all keys from prev (tracked) and after objs\r\n const keysToDetect: Record = {}\r\n for (let key in trackedProperty.children) {\r\n keysToDetect[key] = true\r\n }\r\n for (let key in obj) {\r\n keysToDetect[key] = true\r\n }\r\n\r\n for (let key in keysToDetect) {\r\n const childPath = path ? path + '.' + key : key\r\n if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) {\r\n continue\r\n }\r\n\r\n const result = detectMutations(\r\n isImmutable,\r\n ignorePaths,\r\n trackedProperty.children[key],\r\n obj[key],\r\n sameRef,\r\n childPath\r\n )\r\n\r\n if (result.wasMutated) {\r\n return result\r\n }\r\n }\r\n return { wasMutated: false }\r\n}\r\n\r\ntype IsImmutableFunc = (value: any) => boolean\r\n\r\n/**\r\n * Options for `createImmutableStateInvariantMiddleware()`.\r\n *\r\n * @public\r\n */\r\nexport interface ImmutableStateInvariantMiddlewareOptions {\r\n /**\r\n Callback function to check if a value is considered to be immutable.\r\n This function is applied recursively to every value contained in the state.\r\n The default implementation will return true for primitive types \r\n (like numbers, strings, booleans, null and undefined).\r\n */\r\n isImmutable?: IsImmutableFunc\r\n /** \r\n An array of dot-separated path strings that match named nodes from \r\n the root state to ignore when checking for immutability.\r\n Defaults to undefined\r\n */\r\n ignoredPaths?: string[]\r\n /** Print a warning if checks take longer than N ms. Default: 32ms */\r\n warnAfter?: number\r\n // @deprecated. Use ignoredPaths\r\n ignore?: string[]\r\n}\r\n\r\n/**\r\n * Creates a middleware that checks whether any state was mutated in between\r\n * dispatches or during a dispatch. If any mutations are detected, an error is\r\n * thrown.\r\n *\r\n * @param options Middleware options.\r\n *\r\n * @public\r\n */\r\nexport function createImmutableStateInvariantMiddleware(\r\n options: ImmutableStateInvariantMiddlewareOptions = {}\r\n): Middleware {\r\n if (process.env.NODE_ENV === 'production') {\r\n return () => (next) => (action) => next(action)\r\n }\r\n\r\n let {\r\n isImmutable = isImmutableDefault,\r\n ignoredPaths,\r\n warnAfter = 32,\r\n ignore,\r\n } = options\r\n\r\n // Alias ignore->ignoredPaths, but prefer ignoredPaths if present\r\n ignoredPaths = ignoredPaths || ignore\r\n\r\n const track = trackForMutations.bind(null, isImmutable, ignoredPaths)\r\n\r\n return ({ getState }) => {\r\n let state = getState()\r\n let tracker = track(state)\r\n\r\n let result\r\n return (next) => (action) => {\r\n const measureUtils = getTimeMeasureUtils(\r\n warnAfter,\r\n 'ImmutableStateInvariantMiddleware'\r\n )\r\n\r\n measureUtils.measureTime(() => {\r\n state = getState()\r\n\r\n result = tracker.detectMutations()\r\n // Track before potentially not meeting the invariant\r\n tracker = track(state)\r\n\r\n invariant(\r\n !result.wasMutated,\r\n `A state mutation was detected between dispatches, in the path '${\r\n result.path || ''\r\n }'. This may cause incorrect behavior. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`\r\n )\r\n })\r\n\r\n const dispatchedAction = next(action)\r\n\r\n measureUtils.measureTime(() => {\r\n state = getState()\r\n\r\n result = tracker.detectMutations()\r\n // Track before potentially not meeting the invariant\r\n tracker = track(state)\r\n\r\n result.wasMutated &&\r\n invariant(\r\n !result.wasMutated,\r\n `A state mutation was detected inside a dispatch, in the path: ${\r\n result.path || ''\r\n }. Take a look at the reducer(s) handling the action ${stringify(\r\n action\r\n )}. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`\r\n )\r\n })\r\n\r\n measureUtils.warnIfExceeded()\r\n\r\n return dispatchedAction\r\n }\r\n }\r\n}\r\n","import isPlainObject from './isPlainObject'\r\nimport type { Middleware } from 'redux'\r\nimport { getTimeMeasureUtils } from './utils'\r\n\r\n/**\r\n * Returns true if the passed value is \"plain\", i.e. a value that is either\r\n * directly JSON-serializable (boolean, number, string, array, plain object)\r\n * or `undefined`.\r\n *\r\n * @param val The value to check.\r\n *\r\n * @public\r\n */\r\nexport function isPlain(val: any) {\r\n const type = typeof val\r\n return (\r\n type === 'undefined' ||\r\n val === null ||\r\n type === 'string' ||\r\n type === 'boolean' ||\r\n type === 'number' ||\r\n Array.isArray(val) ||\r\n isPlainObject(val)\r\n )\r\n}\r\n\r\ninterface NonSerializableValue {\r\n keyPath: string\r\n value: unknown\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport function findNonSerializableValue(\r\n value: unknown,\r\n path: string = '',\r\n isSerializable: (value: unknown) => boolean = isPlain,\r\n getEntries?: (value: unknown) => [string, any][],\r\n ignoredPaths: readonly string[] = []\r\n): NonSerializableValue | false {\r\n let foundNestedSerializable: NonSerializableValue | false\r\n\r\n if (!isSerializable(value)) {\r\n return {\r\n keyPath: path || '',\r\n value: value,\r\n }\r\n }\r\n\r\n if (typeof value !== 'object' || value === null) {\r\n return false\r\n }\r\n\r\n const entries = getEntries != null ? getEntries(value) : Object.entries(value)\r\n\r\n const hasIgnoredPaths = ignoredPaths.length > 0\r\n\r\n for (const [key, nestedValue] of entries) {\r\n const nestedPath = path ? path + '.' + key : key\r\n\r\n if (hasIgnoredPaths && ignoredPaths.indexOf(nestedPath) >= 0) {\r\n continue\r\n }\r\n\r\n if (!isSerializable(nestedValue)) {\r\n return {\r\n keyPath: nestedPath,\r\n value: nestedValue,\r\n }\r\n }\r\n\r\n if (typeof nestedValue === 'object') {\r\n foundNestedSerializable = findNonSerializableValue(\r\n nestedValue,\r\n nestedPath,\r\n isSerializable,\r\n getEntries,\r\n ignoredPaths\r\n )\r\n\r\n if (foundNestedSerializable) {\r\n return foundNestedSerializable\r\n }\r\n }\r\n }\r\n\r\n return false\r\n}\r\n\r\n/**\r\n * Options for `createSerializableStateInvariantMiddleware()`.\r\n *\r\n * @public\r\n */\r\nexport interface SerializableStateInvariantMiddlewareOptions {\r\n /**\r\n * The function to check if a value is considered serializable. This\r\n * function is applied recursively to every value contained in the\r\n * state. Defaults to `isPlain()`.\r\n */\r\n isSerializable?: (value: any) => boolean\r\n /**\r\n * The function that will be used to retrieve entries from each\r\n * value. If unspecified, `Object.entries` will be used. Defaults\r\n * to `undefined`.\r\n */\r\n getEntries?: (value: any) => [string, any][]\r\n\r\n /**\r\n * An array of action types to ignore when checking for serializability.\r\n * Defaults to []\r\n */\r\n ignoredActions?: string[]\r\n\r\n /**\r\n * An array of dot-separated path strings to ignore when checking\r\n * for serializability, Defaults to ['meta.arg']\r\n */\r\n ignoredActionPaths?: string[]\r\n\r\n /**\r\n * An array of dot-separated path strings to ignore when checking\r\n * for serializability, Defaults to []\r\n */\r\n ignoredPaths?: string[]\r\n /**\r\n * Execution time warning threshold. If the middleware takes longer\r\n * than `warnAfter` ms, a warning will be displayed in the console.\r\n * Defaults to 32ms.\r\n */\r\n warnAfter?: number\r\n\r\n /**\r\n * Opt out of checking state, but continue checking actions\r\n */\r\n ignoreState?: boolean\r\n}\r\n\r\n/**\r\n * Creates a middleware that, after every state change, checks if the new\r\n * state is serializable. If a non-serializable value is found within the\r\n * state, an error is printed to the console.\r\n *\r\n * @param options Middleware options.\r\n *\r\n * @public\r\n */\r\nexport function createSerializableStateInvariantMiddleware(\r\n options: SerializableStateInvariantMiddlewareOptions = {}\r\n): Middleware {\r\n if (process.env.NODE_ENV === 'production') {\r\n return () => (next) => (action) => next(action)\r\n }\r\n const {\r\n isSerializable = isPlain,\r\n getEntries,\r\n ignoredActions = [],\r\n ignoredActionPaths = ['meta.arg', 'meta.baseQueryMeta'],\r\n ignoredPaths = [],\r\n warnAfter = 32,\r\n ignoreState = false,\r\n } = options\r\n\r\n return (storeAPI) => (next) => (action) => {\r\n if (ignoredActions.length && ignoredActions.indexOf(action.type) !== -1) {\r\n return next(action)\r\n }\r\n\r\n const measureUtils = getTimeMeasureUtils(\r\n warnAfter,\r\n 'SerializableStateInvariantMiddleware'\r\n )\r\n measureUtils.measureTime(() => {\r\n const foundActionNonSerializableValue = findNonSerializableValue(\r\n action,\r\n '',\r\n isSerializable,\r\n getEntries,\r\n ignoredActionPaths\r\n )\r\n\r\n if (foundActionNonSerializableValue) {\r\n const { keyPath, value } = foundActionNonSerializableValue\r\n\r\n console.error(\r\n `A non-serializable value was detected in an action, in the path: \\`${keyPath}\\`. Value:`,\r\n value,\r\n '\\nTake a look at the logic that dispatched this action: ',\r\n action,\r\n '\\n(See https://redux.js.org/faq/actions#why-should-type-be-a-string-or-at-least-serializable-why-should-my-action-types-be-constants)',\r\n '\\n(To allow non-serializable values see: https://redux-toolkit.js.org/usage/usage-guide#working-with-non-serializable-data)'\r\n )\r\n }\r\n })\r\n\r\n const result = next(action)\r\n\r\n if (!ignoreState) {\r\n measureUtils.measureTime(() => {\r\n const state = storeAPI.getState()\r\n\r\n const foundStateNonSerializableValue = findNonSerializableValue(\r\n state,\r\n '',\r\n isSerializable,\r\n getEntries,\r\n ignoredPaths\r\n )\r\n\r\n if (foundStateNonSerializableValue) {\r\n const { keyPath, value } = foundStateNonSerializableValue\r\n\r\n console.error(\r\n `A non-serializable value was detected in the state, in the path: \\`${keyPath}\\`. Value:`,\r\n value,\r\n `\r\nTake a look at the reducer(s) handling this action type: ${action.type}.\r\n(See https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state)`\r\n )\r\n }\r\n })\r\n\r\n measureUtils.warnIfExceeded()\r\n }\r\n\r\n return result\r\n }\r\n}\r\n","import type { Action } from 'redux'\r\nimport type {\r\n IsUnknownOrNonInferrable,\r\n IfMaybeUndefined,\r\n IfVoid,\r\n IsAny,\r\n} from './tsHelpers'\r\nimport isPlainObject from './isPlainObject'\r\n\r\n/**\r\n * An action with a string type and an associated payload. This is the\r\n * type of action returned by `createAction()` action creators.\r\n *\r\n * @template P The type of the action's payload.\r\n * @template T the type used for the action type.\r\n * @template M The type of the action's meta (optional)\r\n * @template E The type of the action's error (optional)\r\n *\r\n * @public\r\n */\r\nexport type PayloadAction<\r\n P = void,\r\n T extends string = string,\r\n M = never,\r\n E = never\r\n> = {\r\n payload: P\r\n type: T\r\n} & ([M] extends [never]\r\n ? {}\r\n : {\r\n meta: M\r\n }) &\r\n ([E] extends [never]\r\n ? {}\r\n : {\r\n error: E\r\n })\r\n\r\n/**\r\n * A \"prepare\" method to be used as the second parameter of `createAction`.\r\n * Takes any number of arguments and returns a Flux Standard Action without\r\n * type (will be added later) that *must* contain a payload (might be undefined).\r\n *\r\n * @public\r\n */\r\nexport type PrepareAction

=\r\n | ((...args: any[]) => { payload: P })\r\n | ((...args: any[]) => { payload: P; meta: any })\r\n | ((...args: any[]) => { payload: P; error: any })\r\n | ((...args: any[]) => { payload: P; meta: any; error: any })\r\n\r\n/**\r\n * Internal version of `ActionCreatorWithPreparedPayload`. Not to be used externally.\r\n *\r\n * @internal\r\n */\r\nexport type _ActionCreatorWithPreparedPayload<\r\n PA extends PrepareAction | void,\r\n T extends string = string\r\n> = PA extends PrepareAction\r\n ? ActionCreatorWithPreparedPayload<\r\n Parameters,\r\n P,\r\n T,\r\n ReturnType extends {\r\n error: infer E\r\n }\r\n ? E\r\n : never,\r\n ReturnType extends {\r\n meta: infer M\r\n }\r\n ? M\r\n : never\r\n >\r\n : void\r\n\r\n/**\r\n * Basic type for all action creators.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n */\r\ninterface BaseActionCreator {\r\n type: T\r\n match: (action: Action) => action is PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator that takes multiple arguments that are passed\r\n * to a `PrepareAction` method to create the final Action.\r\n * @typeParam Args arguments for the action creator function\r\n * @typeParam P `payload` type\r\n * @typeParam T `type` name\r\n * @typeParam E optional `error` type\r\n * @typeParam M optional `meta` type\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithPreparedPayload<\r\n Args extends unknown[],\r\n P,\r\n T extends string = string,\r\n E = never,\r\n M = never\r\n> extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} with `Args` will return\r\n * an Action with a payload of type `P` and (depending on the `PrepareAction`\r\n * method used) a `meta`- and `error` property of types `M` and `E` respectively.\r\n */\r\n (...args: Args): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator of type `T` that takes an optional payload of type `P`.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithOptionalPayload\r\n extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} with an argument will\r\n * return a {@link PayloadAction} of type `T` with a payload of `P`.\r\n * Calling it without an argument will return a PayloadAction with a payload of `undefined`.\r\n */\r\n (payload?: P): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator of type `T` that takes no payload.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithoutPayload\r\n extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} will\r\n * return a {@link PayloadAction} of type `T` with a payload of `undefined`\r\n */\r\n (): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator of type `T` that requires a payload of type P.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithPayload\r\n extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} with an argument will\r\n * return a {@link PayloadAction} of type `T` with a payload of `P`\r\n */\r\n (payload: P): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator of type `T` whose `payload` type could not be inferred. Accepts everything as `payload`.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithNonInferrablePayload<\r\n T extends string = string\r\n> extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} with an argument will\r\n * return a {@link PayloadAction} of type `T` with a payload\r\n * of exactly the type of the argument.\r\n */\r\n (payload: PT): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator that produces actions with a `payload` attribute.\r\n *\r\n * @typeParam P the `payload` type\r\n * @typeParam T the `type` of the resulting action\r\n * @typeParam PA if the resulting action is preprocessed by a `prepare` method, the signature of said method.\r\n *\r\n * @public\r\n */\r\nexport type PayloadActionCreator<\r\n P = void,\r\n T extends string = string,\r\n PA extends PrepareAction

| void = void\r\n> = IfPrepareActionMethodProvided<\r\n PA,\r\n _ActionCreatorWithPreparedPayload,\r\n // else\r\n IsAny<\r\n P,\r\n ActionCreatorWithPayload,\r\n IsUnknownOrNonInferrable<\r\n P,\r\n ActionCreatorWithNonInferrablePayload,\r\n // else\r\n IfVoid<\r\n P,\r\n ActionCreatorWithoutPayload,\r\n // else\r\n IfMaybeUndefined<\r\n P,\r\n ActionCreatorWithOptionalPayload,\r\n // else\r\n ActionCreatorWithPayload\r\n >\r\n >\r\n >\r\n >\r\n>\r\n\r\n/**\r\n * A utility function to create an action creator for the given action type\r\n * string. The action creator accepts a single argument, which will be included\r\n * in the action object as a field called payload. The action creator function\r\n * will also have its toString() overriden so that it returns the action type,\r\n * allowing it to be used in reducer logic that is looking for that action type.\r\n *\r\n * @param type The action type to use for created actions.\r\n * @param prepare (optional) a method that takes any number of arguments and returns { payload } or { payload, meta }.\r\n * If this is given, the resulting action creator will pass its arguments to this method to calculate payload & meta.\r\n *\r\n * @public\r\n */\r\nexport function createAction

(\r\n type: T\r\n): PayloadActionCreator\r\n\r\n/**\r\n * A utility function to create an action creator for the given action type\r\n * string. The action creator accepts a single argument, which will be included\r\n * in the action object as a field called payload. The action creator function\r\n * will also have its toString() overriden so that it returns the action type,\r\n * allowing it to be used in reducer logic that is looking for that action type.\r\n *\r\n * @param type The action type to use for created actions.\r\n * @param prepare (optional) a method that takes any number of arguments and returns { payload } or { payload, meta }.\r\n * If this is given, the resulting action creator will pass its arguments to this method to calculate payload & meta.\r\n *\r\n * @public\r\n */\r\nexport function createAction<\r\n PA extends PrepareAction,\r\n T extends string = string\r\n>(\r\n type: T,\r\n prepareAction: PA\r\n): PayloadActionCreator['payload'], T, PA>\r\n\r\nexport function createAction(type: string, prepareAction?: Function): any {\r\n function actionCreator(...args: any[]) {\r\n if (prepareAction) {\r\n let prepared = prepareAction(...args)\r\n if (!prepared) {\r\n throw new Error('prepareAction did not return an object')\r\n }\r\n\r\n return {\r\n type,\r\n payload: prepared.payload,\r\n ...('meta' in prepared && { meta: prepared.meta }),\r\n ...('error' in prepared && { error: prepared.error }),\r\n }\r\n }\r\n return { type, payload: args[0] }\r\n }\r\n\r\n actionCreator.toString = () => `${type}`\r\n\r\n actionCreator.type = type\r\n\r\n actionCreator.match = (action: Action): action is PayloadAction =>\r\n action.type === type\r\n\r\n return actionCreator\r\n}\r\n\r\nexport function isFSA(action: unknown): action is {\r\n type: string\r\n payload?: unknown\r\n error?: unknown\r\n meta?: unknown\r\n} {\r\n return (\r\n isPlainObject(action) &&\r\n typeof (action as any).type === 'string' &&\r\n Object.keys(action).every(isValidKey)\r\n )\r\n}\r\n\r\nfunction isValidKey(key: string) {\r\n return ['type', 'payload', 'error', 'meta'].indexOf(key) > -1\r\n}\r\n\r\n/**\r\n * Returns the action type of the actions created by the passed\r\n * `createAction()`-generated action creator (arbitrary action creators\r\n * are not supported).\r\n *\r\n * @param action The action creator whose action type to get.\r\n * @returns The action type used by the action creator.\r\n *\r\n * @public\r\n */\r\nexport function getType(\r\n actionCreator: PayloadActionCreator\r\n): T {\r\n return `${actionCreator}` as T\r\n}\r\n\r\n// helper types for more readable typings\r\n\r\ntype IfPrepareActionMethodProvided<\r\n PA extends PrepareAction | void,\r\n True,\r\n False\r\n> = PA extends (...args: any[]) => any ? True : False\r\n","import type { Draft } from 'immer'\r\nimport createNextState, { isDraft, isDraftable } from 'immer'\r\nimport type { AnyAction, Action, Reducer } from 'redux'\r\nimport type { ActionReducerMapBuilder } from './mapBuilders'\r\nimport { executeReducerBuilderCallback } from './mapBuilders'\r\nimport type { NoInfer } from './tsHelpers'\r\n\r\n/**\r\n * Defines a mapping from action types to corresponding action object shapes.\r\n *\r\n * @deprecated This should not be used manually - it is only used for internal\r\n * inference purposes and should not have any further value.\r\n * It might be removed in the future.\r\n * @public\r\n */\r\nexport type Actions = Record\r\n\r\nexport interface ActionMatcher {\r\n (action: AnyAction): action is A\r\n}\r\n\r\nexport type ActionMatcherDescription = {\r\n matcher: ActionMatcher\r\n reducer: CaseReducer>\r\n}\r\n\r\nexport type ReadonlyActionMatcherDescriptionCollection = ReadonlyArray<\r\n ActionMatcherDescription\r\n>\r\n\r\nexport type ActionMatcherDescriptionCollection = Array<\r\n ActionMatcherDescription\r\n>\r\n\r\n/**\r\n * An *case reducer* is a reducer function for a specific action type. Case\r\n * reducers can be composed to full reducers using `createReducer()`.\r\n *\r\n * Unlike a normal Redux reducer, a case reducer is never called with an\r\n * `undefined` state to determine the initial state. Instead, the initial\r\n * state is explicitly specified as an argument to `createReducer()`.\r\n *\r\n * In addition, a case reducer can choose to mutate the passed-in `state`\r\n * value directly instead of returning a new state. This does not actually\r\n * cause the store state to be mutated directly; instead, thanks to\r\n * [immer](https://github.com/mweststrate/immer), the mutations are\r\n * translated to copy operations that result in a new state.\r\n *\r\n * @public\r\n */\r\nexport type CaseReducer = (\r\n state: Draft,\r\n action: A\r\n) => S | void | Draft\r\n\r\n/**\r\n * A mapping from action types to case reducers for `createReducer()`.\r\n *\r\n * @deprecated This should not be used manually - it is only used\r\n * for internal inference purposes and using it manually\r\n * would lead to type erasure.\r\n * It might be removed in the future.\r\n * @public\r\n */\r\nexport type CaseReducers = {\r\n [T in keyof AS]: AS[T] extends Action ? CaseReducer : void\r\n}\r\n\r\n/**\r\n * A utility function that allows defining a reducer as a mapping from action\r\n * type to *case reducer* functions that handle these action types. The\r\n * reducer's initial state is passed as the first argument.\r\n *\r\n * @remarks\r\n * The body of every case reducer is implicitly wrapped with a call to\r\n * `produce()` from the [immer](https://github.com/mweststrate/immer) library.\r\n * This means that rather than returning a new state object, you can also\r\n * mutate the passed-in state object directly; these mutations will then be\r\n * automatically and efficiently translated into copies, giving you both\r\n * convenience and immutability.\r\n *\r\n * @overloadSummary\r\n * This overload accepts a callback function that receives a `builder` object as its argument.\r\n * That builder provides `addCase`, `addMatcher` and `addDefaultCase` functions that may be\r\n * called to define what actions this reducer will handle.\r\n *\r\n * @param initialState - The initial state that should be used when the reducer is called the first time.\r\n * @param builderCallback - A callback that receives a *builder* object to define\r\n * case reducers via calls to `builder.addCase(actionCreatorOrType, reducer)`.\r\n * @example\r\n```ts\r\nimport {\r\n createAction,\r\n createReducer,\r\n AnyAction,\r\n PayloadAction,\r\n} from \"@reduxjs/toolkit\";\r\n\r\nconst increment = createAction(\"increment\");\r\nconst decrement = createAction(\"decrement\");\r\n\r\nfunction isActionWithNumberPayload(\r\n action: AnyAction\r\n): action is PayloadAction {\r\n return typeof action.payload === \"number\";\r\n}\r\n\r\ncreateReducer(\r\n {\r\n counter: 0,\r\n sumOfNumberPayloads: 0,\r\n unhandledActions: 0,\r\n },\r\n (builder) => {\r\n builder\r\n .addCase(increment, (state, action) => {\r\n // action is inferred correctly here\r\n state.counter += action.payload;\r\n })\r\n // You can chain calls, or have separate `builder.addCase()` lines each time\r\n .addCase(decrement, (state, action) => {\r\n state.counter -= action.payload;\r\n })\r\n // You can apply a \"matcher function\" to incoming actions\r\n .addMatcher(isActionWithNumberPayload, (state, action) => {})\r\n // and provide a default case if no other handlers matched\r\n .addDefaultCase((state, action) => {});\r\n }\r\n);\r\n```\r\n * @public\r\n */\r\nexport function createReducer(\r\n initialState: S,\r\n builderCallback: (builder: ActionReducerMapBuilder) => void\r\n): Reducer\r\n\r\n/**\r\n * A utility function that allows defining a reducer as a mapping from action\r\n * type to *case reducer* functions that handle these action types. The\r\n * reducer's initial state is passed as the first argument.\r\n *\r\n * The body of every case reducer is implicitly wrapped with a call to\r\n * `produce()` from the [immer](https://github.com/mweststrate/immer) library.\r\n * This means that rather than returning a new state object, you can also\r\n * mutate the passed-in state object directly; these mutations will then be\r\n * automatically and efficiently translated into copies, giving you both\r\n * convenience and immutability.\r\n * \r\n * @overloadSummary\r\n * This overload accepts an object where the keys are string action types, and the values\r\n * are case reducer functions to handle those action types.\r\n *\r\n * @param initialState - The initial state that should be used when the reducer is called the first time.\r\n * @param actionsMap - An object mapping from action types to _case reducers_, each of which handles one specific action type.\r\n * @param actionMatchers - An array of matcher definitions in the form `{matcher, reducer}`.\r\n * All matching reducers will be executed in order, independently if a case reducer matched or not.\r\n * @param defaultCaseReducer - A \"default case\" reducer that is executed if no case reducer and no matcher\r\n * reducer was executed for this action.\r\n *\r\n * @example\r\n```js\r\nconst counterReducer = createReducer(0, {\r\n increment: (state, action) => state + action.payload,\r\n decrement: (state, action) => state - action.payload\r\n})\r\n```\r\n \r\n * Action creators that were generated using [`createAction`](./createAction) may be used directly as the keys here, using computed property syntax:\r\n\r\n```js\r\nconst increment = createAction('increment')\r\nconst decrement = createAction('decrement')\r\n\r\nconst counterReducer = createReducer(0, {\r\n [increment]: (state, action) => state + action.payload,\r\n [decrement.type]: (state, action) => state - action.payload\r\n})\r\n```\r\n * @public\r\n */\r\nexport function createReducer<\r\n S,\r\n CR extends CaseReducers = CaseReducers\r\n>(\r\n initialState: S,\r\n actionsMap: CR,\r\n actionMatchers?: ActionMatcherDescriptionCollection,\r\n defaultCaseReducer?: CaseReducer\r\n): Reducer\r\n\r\nexport function createReducer(\r\n initialState: S,\r\n mapOrBuilderCallback:\r\n | CaseReducers\r\n | ((builder: ActionReducerMapBuilder) => void),\r\n actionMatchers: ReadonlyActionMatcherDescriptionCollection = [],\r\n defaultCaseReducer?: CaseReducer\r\n): Reducer {\r\n let [actionsMap, finalActionMatchers, finalDefaultCaseReducer] =\r\n typeof mapOrBuilderCallback === 'function'\r\n ? executeReducerBuilderCallback(mapOrBuilderCallback)\r\n : [mapOrBuilderCallback, actionMatchers, defaultCaseReducer]\r\n\r\n const frozenInitialState = createNextState(initialState, () => {})\r\n\r\n return function (state = frozenInitialState, action): S {\r\n let caseReducers = [\r\n actionsMap[action.type],\r\n ...finalActionMatchers\r\n .filter(({ matcher }) => matcher(action))\r\n .map(({ reducer }) => reducer),\r\n ]\r\n if (caseReducers.filter((cr) => !!cr).length === 0) {\r\n caseReducers = [finalDefaultCaseReducer]\r\n }\r\n\r\n return caseReducers.reduce((previousState, caseReducer): S => {\r\n if (caseReducer) {\r\n if (isDraft(previousState)) {\r\n // If it's already a draft, we must already be inside a `createNextState` call,\r\n // likely because this is being wrapped in `createReducer`, `createSlice`, or nested\r\n // inside an existing draft. It's safe to just pass the draft to the mutator.\r\n const draft = previousState as Draft // We can assume this is already a draft\r\n const result = caseReducer(draft, action)\r\n\r\n if (typeof result === 'undefined') {\r\n return previousState\r\n }\r\n\r\n return result as S\r\n } else if (!isDraftable(previousState)) {\r\n // If state is not draftable (ex: a primitive, such as 0), we want to directly\r\n // return the caseReducer func and not wrap it with produce.\r\n const result = caseReducer(previousState as any, action)\r\n\r\n if (typeof result === 'undefined') {\r\n if (previousState === null) {\r\n return previousState\r\n }\r\n throw Error(\r\n 'A case reducer on a non-draftable value must not return undefined'\r\n )\r\n }\r\n\r\n return result as S\r\n } else {\r\n // @ts-ignore createNextState() produces an Immutable> rather\r\n // than an Immutable, and TypeScript cannot find out how to reconcile\r\n // these two types.\r\n return createNextState(previousState, (draft: Draft) => {\r\n return caseReducer(draft, action)\r\n })\r\n }\r\n }\r\n\r\n return previousState\r\n }, state)\r\n }\r\n}\r\n","import type { Action, AnyAction } from 'redux'\r\nimport type {\r\n CaseReducer,\r\n CaseReducers,\r\n ActionMatcher,\r\n ActionMatcherDescriptionCollection,\r\n} from './createReducer'\r\n\r\nexport interface TypedActionCreator {\r\n (...args: any[]): Action\r\n type: Type\r\n}\r\n\r\n/**\r\n * A builder for an action <-> reducer map.\r\n *\r\n * @public\r\n */\r\nexport interface ActionReducerMapBuilder {\r\n /**\r\n * Adds a case reducer to handle a single exact action type.\r\n * @remarks\r\n * All calls to `builder.addCase` must come before any calls to `builder.addMatcher` or `builder.addDefaultCase`.\r\n * @param actionCreator - Either a plain action type string, or an action creator generated by [`createAction`](./createAction) that can be used to determine the action type.\r\n * @param reducer - The actual case reducer function.\r\n */\r\n addCase>(\r\n actionCreator: ActionCreator,\r\n reducer: CaseReducer>\r\n ): ActionReducerMapBuilder\r\n /**\r\n * Adds a case reducer to handle a single exact action type.\r\n * @remarks\r\n * All calls to `builder.addCase` must come before any calls to `builder.addMatcher` or `builder.addDefaultCase`.\r\n * @param actionCreator - Either a plain action type string, or an action creator generated by [`createAction`](./createAction) that can be used to determine the action type.\r\n * @param reducer - The actual case reducer function.\r\n */\r\n addCase>(\r\n type: Type,\r\n reducer: CaseReducer\r\n ): ActionReducerMapBuilder\r\n\r\n /**\r\n * Allows you to match your incoming actions against your own filter function instead of only the `action.type` property.\r\n * @remarks\r\n * If multiple matcher reducers match, all of them will be executed in the order\r\n * they were defined in - even if a case reducer already matched.\r\n * All calls to `builder.addMatcher` must come after any calls to `builder.addCase` and before any calls to `builder.addDefaultCase`.\r\n * @param matcher - A matcher function. In TypeScript, this should be a [type predicate](https://www.typescriptlang.org/docs/handbook/advanced-types.html#using-type-predicates)\r\n * function\r\n * @param reducer - The actual case reducer function.\r\n *\r\n * @example\r\n```ts\r\nimport {\r\n createAction,\r\n createReducer,\r\n AsyncThunk,\r\n AnyAction,\r\n} from \"@reduxjs/toolkit\";\r\n\r\ntype GenericAsyncThunk = AsyncThunk;\r\n\r\ntype PendingAction = ReturnType;\r\ntype RejectedAction = ReturnType;\r\ntype FulfilledAction = ReturnType;\r\n\r\nconst initialState: Record = {};\r\nconst resetAction = createAction(\"reset-tracked-loading-state\");\r\n\r\nfunction isPendingAction(action: AnyAction): action is PendingAction {\r\n return action.type.endsWith(\"/pending\");\r\n}\r\n\r\nconst reducer = createReducer(initialState, (builder) => {\r\n builder\r\n .addCase(resetAction, () => initialState)\r\n // matcher can be defined outside as a type predicate function\r\n .addMatcher(isPendingAction, (state, action) => {\r\n state[action.meta.requestId] = \"pending\";\r\n })\r\n .addMatcher(\r\n // matcher can be defined inline as a type predicate function\r\n (action): action is RejectedAction => action.type.endsWith(\"/rejected\"),\r\n (state, action) => {\r\n state[action.meta.requestId] = \"rejected\";\r\n }\r\n )\r\n // matcher can just return boolean and the matcher can receive a generic argument\r\n .addMatcher(\r\n (action) => action.type.endsWith(\"/fulfilled\"),\r\n (state, action) => {\r\n state[action.meta.requestId] = \"fulfilled\";\r\n }\r\n );\r\n});\r\n```\r\n */\r\n addMatcher(\r\n matcher: ActionMatcher | ((action: AnyAction) => boolean),\r\n reducer: CaseReducer\r\n ): Omit, 'addCase'>\r\n\r\n /**\r\n * Adds a \"default case\" reducer that is executed if no case reducer and no matcher\r\n * reducer was executed for this action.\r\n * @param reducer - The fallback \"default case\" reducer function.\r\n *\r\n * @example\r\n```ts\r\nimport { createReducer } from '@reduxjs/toolkit'\r\nconst initialState = { otherActions: 0 }\r\nconst reducer = createReducer(initialState, builder => {\r\n builder\r\n // .addCase(...)\r\n // .addMatcher(...)\r\n .addDefaultCase((state, action) => {\r\n state.otherActions++\r\n })\r\n})\r\n```\r\n */\r\n addDefaultCase(reducer: CaseReducer): {}\r\n}\r\n\r\nexport function executeReducerBuilderCallback(\r\n builderCallback: (builder: ActionReducerMapBuilder) => void\r\n): [\r\n CaseReducers,\r\n ActionMatcherDescriptionCollection,\r\n CaseReducer | undefined\r\n] {\r\n const actionsMap: CaseReducers = {}\r\n const actionMatchers: ActionMatcherDescriptionCollection = []\r\n let defaultCaseReducer: CaseReducer | undefined\r\n const builder = {\r\n addCase(\r\n typeOrActionCreator: string | TypedActionCreator,\r\n reducer: CaseReducer\r\n ) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n /*\r\n to keep the definition by the user in line with actual behavior, \r\n we enforce `addCase` to always be called before calling `addMatcher`\r\n as matching cases take precedence over matchers\r\n */\r\n if (actionMatchers.length > 0) {\r\n throw new Error(\r\n '`builder.addCase` should only be called before calling `builder.addMatcher`'\r\n )\r\n }\r\n if (defaultCaseReducer) {\r\n throw new Error(\r\n '`builder.addCase` should only be called before calling `builder.addDefaultCase`'\r\n )\r\n }\r\n }\r\n const type =\r\n typeof typeOrActionCreator === 'string'\r\n ? typeOrActionCreator\r\n : typeOrActionCreator.type\r\n if (type in actionsMap) {\r\n throw new Error(\r\n 'addCase cannot be called with two reducers for the same action type'\r\n )\r\n }\r\n actionsMap[type] = reducer\r\n return builder\r\n },\r\n addMatcher(\r\n matcher: ActionMatcher,\r\n reducer: CaseReducer\r\n ) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (defaultCaseReducer) {\r\n throw new Error(\r\n '`builder.addMatcher` should only be called before calling `builder.addDefaultCase`'\r\n )\r\n }\r\n }\r\n actionMatchers.push({ matcher, reducer })\r\n return builder\r\n },\r\n addDefaultCase(reducer: CaseReducer) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (defaultCaseReducer) {\r\n throw new Error('`builder.addDefaultCase` can only be called once')\r\n }\r\n }\r\n defaultCaseReducer = reducer\r\n return builder\r\n },\r\n }\r\n builderCallback(builder)\r\n return [actionsMap, actionMatchers, defaultCaseReducer]\r\n}\r\n","import type { Reducer } from 'redux'\r\nimport type {\r\n ActionCreatorWithoutPayload,\r\n PayloadAction,\r\n PayloadActionCreator,\r\n PrepareAction,\r\n _ActionCreatorWithPreparedPayload,\r\n} from './createAction'\r\nimport { createAction } from './createAction'\r\nimport type { CaseReducer, CaseReducers } from './createReducer'\r\nimport { createReducer } from './createReducer'\r\nimport type { ActionReducerMapBuilder } from './mapBuilders'\r\nimport { executeReducerBuilderCallback } from './mapBuilders'\r\nimport type { NoInfer } from './tsHelpers'\r\n\r\n/**\r\n * An action creator attached to a slice.\r\n *\r\n * @deprecated please use PayloadActionCreator directly\r\n *\r\n * @public\r\n */\r\nexport type SliceActionCreator

= PayloadActionCreator

\r\n\r\n/**\r\n * The return value of `createSlice`\r\n *\r\n * @public\r\n */\r\nexport interface Slice<\r\n State = any,\r\n CaseReducers extends SliceCaseReducers = SliceCaseReducers,\r\n Name extends string = string\r\n> {\r\n /**\r\n * The slice name.\r\n */\r\n name: Name\r\n\r\n /**\r\n * The slice's reducer.\r\n */\r\n reducer: Reducer\r\n\r\n /**\r\n * Action creators for the types of actions that are handled by the slice\r\n * reducer.\r\n */\r\n actions: CaseReducerActions\r\n\r\n /**\r\n * The individual case reducer functions that were passed in the `reducers` parameter.\r\n * This enables reuse and testing if they were defined inline when calling `createSlice`.\r\n */\r\n caseReducers: SliceDefinedCaseReducers\r\n}\r\n\r\n/**\r\n * Options for `createSlice()`.\r\n *\r\n * @public\r\n */\r\nexport interface CreateSliceOptions<\r\n State = any,\r\n CR extends SliceCaseReducers = SliceCaseReducers,\r\n Name extends string = string\r\n> {\r\n /**\r\n * The slice's name. Used to namespace the generated action types.\r\n */\r\n name: Name\r\n\r\n /**\r\n * The initial state to be returned by the slice reducer.\r\n */\r\n initialState: State\r\n\r\n /**\r\n * A mapping from action types to action-type-specific *case reducer*\r\n * functions. For every action type, a matching action creator will be\r\n * generated using `createAction()`.\r\n */\r\n reducers: ValidateSliceCaseReducers\r\n\r\n /**\r\n * A callback that receives a *builder* object to define\r\n * case reducers via calls to `builder.addCase(actionCreatorOrType, reducer)`.\r\n * \r\n * Alternatively, a mapping from action types to action-type-specific *case reducer*\r\n * functions. These reducers should have existing action types used\r\n * as the keys, and action creators will _not_ be generated.\r\n * \r\n * @example\r\n```ts\r\nimport { createAction, createSlice, Action, AnyAction } from '@reduxjs/toolkit'\r\nconst incrementBy = createAction('incrementBy')\r\nconst decrement = createAction('decrement')\r\n\r\ninterface RejectedAction extends Action {\r\n error: Error\r\n}\r\n\r\nfunction isRejectedAction(action: AnyAction): action is RejectedAction {\r\n return action.type.endsWith('rejected')\r\n}\r\n\r\ncreateSlice({\r\n name: 'counter',\r\n initialState: 0,\r\n reducers: {},\r\n extraReducers: builder => {\r\n builder\r\n .addCase(incrementBy, (state, action) => {\r\n // action is inferred correctly here if using TS\r\n })\r\n // You can chain calls, or have separate `builder.addCase()` lines each time\r\n .addCase(decrement, (state, action) => {})\r\n // You can match a range of action types\r\n .addMatcher(\r\n isRejectedAction,\r\n // `action` will be inferred as a RejectedAction due to isRejectedAction being defined as a type guard\r\n (state, action) => {}\r\n )\r\n // and provide a default case if no other handlers matched\r\n .addDefaultCase((state, action) => {})\r\n }\r\n})\r\n```\r\n */\r\n extraReducers?:\r\n | CaseReducers, any>\r\n | ((builder: ActionReducerMapBuilder>) => void)\r\n}\r\n\r\n/**\r\n * A CaseReducer with a `prepare` method.\r\n *\r\n * @public\r\n */\r\nexport type CaseReducerWithPrepare = {\r\n reducer: CaseReducer\r\n prepare: PrepareAction\r\n}\r\n\r\n/**\r\n * The type describing a slice's `reducers` option.\r\n *\r\n * @public\r\n */\r\nexport type SliceCaseReducers = {\r\n [K: string]:\r\n | CaseReducer>\r\n | CaseReducerWithPrepare>\r\n}\r\n\r\n/**\r\n * Derives the slice's `actions` property from the `reducers` options\r\n *\r\n * @public\r\n */\r\nexport type CaseReducerActions> = {\r\n [Type in keyof CaseReducers]: CaseReducers[Type] extends { prepare: any }\r\n ? ActionCreatorForCaseReducerWithPrepare\r\n : ActionCreatorForCaseReducer\r\n}\r\n\r\n/**\r\n * Get a `PayloadActionCreator` type for a passed `CaseReducerWithPrepare`\r\n *\r\n * @internal\r\n */\r\ntype ActionCreatorForCaseReducerWithPrepare =\r\n _ActionCreatorWithPreparedPayload\r\n\r\n/**\r\n * Get a `PayloadActionCreator` type for a passed `CaseReducer`\r\n *\r\n * @internal\r\n */\r\ntype ActionCreatorForCaseReducer = CR extends (\r\n state: any,\r\n action: infer Action\r\n) => any\r\n ? Action extends { payload: infer P }\r\n ? PayloadActionCreator

\r\n : ActionCreatorWithoutPayload\r\n : ActionCreatorWithoutPayload\r\n\r\n/**\r\n * Extracts the CaseReducers out of a `reducers` object, even if they are\r\n * tested into a `CaseReducerWithPrepare`.\r\n *\r\n * @internal\r\n */\r\ntype SliceDefinedCaseReducers> = {\r\n [Type in keyof CaseReducers]: CaseReducers[Type] extends {\r\n reducer: infer Reducer\r\n }\r\n ? Reducer\r\n : CaseReducers[Type]\r\n}\r\n\r\n/**\r\n * Used on a SliceCaseReducers object.\r\n * Ensures that if a CaseReducer is a `CaseReducerWithPrepare`, that\r\n * the `reducer` and the `prepare` function use the same type of `payload`.\r\n *\r\n * Might do additional such checks in the future.\r\n *\r\n * This type is only ever useful if you want to write your own wrapper around\r\n * `createSlice`. Please don't use it otherwise!\r\n *\r\n * @public\r\n */\r\nexport type ValidateSliceCaseReducers<\r\n S,\r\n ACR extends SliceCaseReducers\r\n> = ACR &\r\n {\r\n [T in keyof ACR]: ACR[T] extends {\r\n reducer(s: S, action?: infer A): any\r\n }\r\n ? {\r\n prepare(...a: never[]): Omit\r\n }\r\n : {}\r\n }\r\n\r\nfunction getType(slice: string, actionKey: string): string {\r\n return `${slice}/${actionKey}`\r\n}\r\n\r\n/**\r\n * A function that accepts an initial state, an object full of reducer\r\n * functions, and a \"slice name\", and automatically generates\r\n * action creators and action types that correspond to the\r\n * reducers and state.\r\n *\r\n * The `reducer` argument is passed to `createReducer()`.\r\n *\r\n * @public\r\n */\r\nexport function createSlice<\r\n State,\r\n CaseReducers extends SliceCaseReducers,\r\n Name extends string = string\r\n>(\r\n options: CreateSliceOptions\r\n): Slice {\r\n const { name, initialState } = options\r\n if (!name) {\r\n throw new Error('`name` is a required option for createSlice')\r\n }\r\n const reducers = options.reducers || {}\r\n const [\r\n extraReducers = {},\r\n actionMatchers = [],\r\n defaultCaseReducer = undefined,\r\n ] =\r\n typeof options.extraReducers === 'function'\r\n ? executeReducerBuilderCallback(options.extraReducers)\r\n : [options.extraReducers]\r\n\r\n const reducerNames = Object.keys(reducers)\r\n\r\n const sliceCaseReducersByName: Record = {}\r\n const sliceCaseReducersByType: Record = {}\r\n const actionCreators: Record = {}\r\n\r\n reducerNames.forEach((reducerName) => {\r\n const maybeReducerWithPrepare = reducers[reducerName]\r\n const type = getType(name, reducerName)\r\n\r\n let caseReducer: CaseReducer\r\n let prepareCallback: PrepareAction | undefined\r\n\r\n if ('reducer' in maybeReducerWithPrepare) {\r\n caseReducer = maybeReducerWithPrepare.reducer\r\n prepareCallback = maybeReducerWithPrepare.prepare\r\n } else {\r\n caseReducer = maybeReducerWithPrepare\r\n }\r\n\r\n sliceCaseReducersByName[reducerName] = caseReducer\r\n sliceCaseReducersByType[type] = caseReducer\r\n actionCreators[reducerName] = prepareCallback\r\n ? createAction(type, prepareCallback)\r\n : createAction(type)\r\n })\r\n\r\n const finalCaseReducers = { ...extraReducers, ...sliceCaseReducersByType }\r\n const reducer = createReducer(\r\n initialState,\r\n finalCaseReducers as any,\r\n actionMatchers,\r\n defaultCaseReducer\r\n )\r\n\r\n return {\r\n name,\r\n reducer,\r\n actions: actionCreators as any,\r\n caseReducers: sliceCaseReducersByName as any,\r\n }\r\n}\r\n","import type { EntityState } from './models'\r\n\r\nexport function getInitialEntityState(): EntityState {\r\n return {\r\n ids: [],\r\n entities: {},\r\n }\r\n}\r\n\r\nexport function createInitialStateFactory() {\r\n function getInitialState(): EntityState\r\n function getInitialState(\r\n additionalState: S\r\n ): EntityState & S\r\n function getInitialState(additionalState: any = {}): any {\r\n return Object.assign(getInitialEntityState(), additionalState)\r\n }\r\n\r\n return { getInitialState }\r\n}\r\n","import { createDraftSafeSelector } from '../createDraftSafeSelector'\r\nimport type {\r\n EntityState,\r\n EntitySelectors,\r\n Dictionary,\r\n EntityId,\r\n} from './models'\r\n\r\nexport function createSelectorsFactory() {\r\n function getSelectors(): EntitySelectors>\r\n function getSelectors(\r\n selectState: (state: V) => EntityState\r\n ): EntitySelectors\r\n function getSelectors(\r\n selectState?: (state: any) => EntityState\r\n ): EntitySelectors {\r\n const selectIds = (state: any) => state.ids\r\n\r\n const selectEntities = (state: EntityState) => state.entities\r\n\r\n const selectAll = createDraftSafeSelector(\r\n selectIds,\r\n selectEntities,\r\n (ids: readonly T[], entities: Dictionary): any =>\r\n ids.map((id: any) => (entities as any)[id])\r\n )\r\n\r\n const selectId = (_: any, id: EntityId) => id\r\n\r\n const selectById = (entities: Dictionary, id: EntityId) => entities[id]\r\n\r\n const selectTotal = createDraftSafeSelector(selectIds, (ids) => ids.length)\r\n\r\n if (!selectState) {\r\n return {\r\n selectIds,\r\n selectEntities,\r\n selectAll,\r\n selectTotal,\r\n selectById: createDraftSafeSelector(\r\n selectEntities,\r\n selectId,\r\n selectById\r\n ),\r\n }\r\n }\r\n\r\n const selectGlobalizedEntities = createDraftSafeSelector(\r\n selectState,\r\n selectEntities\r\n )\r\n\r\n return {\r\n selectIds: createDraftSafeSelector(selectState, selectIds),\r\n selectEntities: selectGlobalizedEntities,\r\n selectAll: createDraftSafeSelector(selectState, selectAll),\r\n selectTotal: createDraftSafeSelector(selectState, selectTotal),\r\n selectById: createDraftSafeSelector(\r\n selectGlobalizedEntities,\r\n selectId,\r\n selectById\r\n ),\r\n }\r\n }\r\n\r\n return { getSelectors }\r\n}\r\n","import createNextState, { isDraft } from 'immer'\r\nimport type { EntityState, PreventAny } from './models'\r\nimport type { PayloadAction } from '../createAction'\r\nimport { isFSA } from '../createAction'\r\nimport { IsAny } from '../tsHelpers'\r\n\r\nexport function createSingleArgumentStateOperator(\r\n mutator: (state: EntityState) => void\r\n) {\r\n const operator = createStateOperator((_: undefined, state: EntityState) =>\r\n mutator(state)\r\n )\r\n\r\n return function operation>(\r\n state: PreventAny\r\n ): S {\r\n return operator(state as S, undefined)\r\n }\r\n}\r\n\r\nexport function createStateOperator(\r\n mutator: (arg: R, state: EntityState) => void\r\n) {\r\n return function operation>(\r\n state: S,\r\n arg: R | PayloadAction\r\n ): S {\r\n function isPayloadActionArgument(\r\n arg: R | PayloadAction\r\n ): arg is PayloadAction {\r\n return isFSA(arg)\r\n }\r\n\r\n const runMutator = (draft: EntityState) => {\r\n if (isPayloadActionArgument(arg)) {\r\n mutator(arg.payload, draft)\r\n } else {\r\n mutator(arg, draft)\r\n }\r\n }\r\n\r\n if (isDraft(state)) {\r\n // we must already be inside a `createNextState` call, likely because\r\n // this is being wrapped in `createReducer` or `createSlice`.\r\n // It's safe to just pass the draft to the mutator.\r\n runMutator(state)\r\n\r\n // since it's a draft, we'll just return it\r\n return state\r\n } else {\r\n // @ts-ignore createNextState() produces an Immutable> rather\r\n // than an Immutable, and TypeScript cannot find out how to reconcile\r\n // these two types.\r\n return createNextState(state, runMutator)\r\n }\r\n }\r\n}\r\n","import type { EntityState, IdSelector, Update, EntityId } from './models'\r\n\r\nexport function selectIdValue(entity: T, selectId: IdSelector) {\r\n const key = selectId(entity)\r\n\r\n if (process.env.NODE_ENV !== 'production' && key === undefined) {\r\n console.warn(\r\n 'The entity passed to the `selectId` implementation returned undefined.',\r\n 'You should probably provide your own `selectId` implementation.',\r\n 'The entity that was passed:',\r\n entity,\r\n 'The `selectId` implementation:',\r\n selectId.toString()\r\n )\r\n }\r\n\r\n return key\r\n}\r\n\r\nexport function ensureEntitiesArray(\r\n entities: readonly T[] | Record\r\n): readonly T[] {\r\n if (!Array.isArray(entities)) {\r\n entities = Object.values(entities)\r\n }\r\n\r\n return entities\r\n}\r\n\r\nexport function splitAddedUpdatedEntities(\r\n newEntities: readonly T[] | Record,\r\n selectId: IdSelector,\r\n state: EntityState\r\n): [T[], Update[]] {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n\r\n const added: T[] = []\r\n const updated: Update[] = []\r\n\r\n for (const entity of newEntities) {\r\n const id = selectIdValue(entity, selectId)\r\n if (id in state.entities) {\r\n updated.push({ id, changes: entity })\r\n } else {\r\n added.push(entity)\r\n }\r\n }\r\n return [added, updated]\r\n}\r\n","import type {\r\n EntityState,\r\n EntityStateAdapter,\r\n IdSelector,\r\n Update,\r\n EntityId,\r\n} from './models'\r\nimport {\r\n createStateOperator,\r\n createSingleArgumentStateOperator,\r\n} from './state_adapter'\r\nimport {\r\n selectIdValue,\r\n ensureEntitiesArray,\r\n splitAddedUpdatedEntities,\r\n} from './utils'\r\n\r\nexport function createUnsortedStateAdapter(\r\n selectId: IdSelector\r\n): EntityStateAdapter {\r\n type R = EntityState\r\n\r\n function addOneMutably(entity: T, state: R): void {\r\n const key = selectIdValue(entity, selectId)\r\n\r\n if (key in state.entities) {\r\n return\r\n }\r\n\r\n state.ids.push(key)\r\n state.entities[key] = entity\r\n }\r\n\r\n function addManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n\r\n for (const entity of newEntities) {\r\n addOneMutably(entity, state)\r\n }\r\n }\r\n\r\n function setOneMutably(entity: T, state: R): void {\r\n const key = selectIdValue(entity, selectId)\r\n if (!(key in state.entities)) {\r\n state.ids.push(key)\r\n }\r\n state.entities[key] = entity\r\n }\r\n\r\n function setManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n for (const entity of newEntities) {\r\n setOneMutably(entity, state)\r\n }\r\n }\r\n\r\n function setAllMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n\r\n state.ids = []\r\n state.entities = {}\r\n\r\n addManyMutably(newEntities, state)\r\n }\r\n\r\n function removeOneMutably(key: EntityId, state: R): void {\r\n return removeManyMutably([key], state)\r\n }\r\n\r\n function removeManyMutably(keys: readonly EntityId[], state: R): void {\r\n let didMutate = false\r\n\r\n keys.forEach((key) => {\r\n if (key in state.entities) {\r\n delete state.entities[key]\r\n didMutate = true\r\n }\r\n })\r\n\r\n if (didMutate) {\r\n state.ids = state.ids.filter((id) => id in state.entities)\r\n }\r\n }\r\n\r\n function removeAllMutably(state: R): void {\r\n Object.assign(state, {\r\n ids: [],\r\n entities: {},\r\n })\r\n }\r\n\r\n function takeNewKey(\r\n keys: { [id: string]: EntityId },\r\n update: Update,\r\n state: R\r\n ): boolean {\r\n const original = state.entities[update.id]\r\n const updated: T = Object.assign({}, original, update.changes)\r\n const newKey = selectIdValue(updated, selectId)\r\n const hasNewKey = newKey !== update.id\r\n\r\n if (hasNewKey) {\r\n keys[update.id] = newKey\r\n delete state.entities[update.id]\r\n }\r\n\r\n state.entities[newKey] = updated\r\n\r\n return hasNewKey\r\n }\r\n\r\n function updateOneMutably(update: Update, state: R): void {\r\n return updateManyMutably([update], state)\r\n }\r\n\r\n function updateManyMutably(\r\n updates: ReadonlyArray>,\r\n state: R\r\n ): void {\r\n const newKeys: { [id: string]: EntityId } = {}\r\n\r\n const updatesPerEntity: { [id: string]: Update } = {}\r\n\r\n updates.forEach((update) => {\r\n // Only apply updates to entities that currently exist\r\n if (update.id in state.entities) {\r\n // If there are multiple updates to one entity, merge them together\r\n updatesPerEntity[update.id] = {\r\n id: update.id,\r\n // Spreads ignore falsy values, so this works even if there isn't\r\n // an existing update already at this key\r\n changes: {\r\n ...(updatesPerEntity[update.id]\r\n ? updatesPerEntity[update.id].changes\r\n : null),\r\n ...update.changes,\r\n },\r\n }\r\n }\r\n })\r\n\r\n updates = Object.values(updatesPerEntity)\r\n\r\n const didMutateEntities = updates.length > 0\r\n\r\n if (didMutateEntities) {\r\n const didMutateIds =\r\n updates.filter((update) => takeNewKey(newKeys, update, state)).length >\r\n 0\r\n\r\n if (didMutateIds) {\r\n state.ids = state.ids.map((id) => newKeys[id] || id)\r\n }\r\n }\r\n }\r\n\r\n function upsertOneMutably(entity: T, state: R): void {\r\n return upsertManyMutably([entity], state)\r\n }\r\n\r\n function upsertManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n const [added, updated] = splitAddedUpdatedEntities(\r\n newEntities,\r\n selectId,\r\n state\r\n )\r\n\r\n updateManyMutably(updated, state)\r\n addManyMutably(added, state)\r\n }\r\n\r\n return {\r\n removeAll: createSingleArgumentStateOperator(removeAllMutably),\r\n addOne: createStateOperator(addOneMutably),\r\n addMany: createStateOperator(addManyMutably),\r\n setOne: createStateOperator(setOneMutably),\r\n setMany: createStateOperator(setManyMutably),\r\n setAll: createStateOperator(setAllMutably),\r\n updateOne: createStateOperator(updateOneMutably),\r\n updateMany: createStateOperator(updateManyMutably),\r\n upsertOne: createStateOperator(upsertOneMutably),\r\n upsertMany: createStateOperator(upsertManyMutably),\r\n removeOne: createStateOperator(removeOneMutably),\r\n removeMany: createStateOperator(removeManyMutably),\r\n }\r\n}\r\n","import type {\r\n EntityState,\r\n IdSelector,\r\n Comparer,\r\n EntityStateAdapter,\r\n Update,\r\n EntityId,\r\n} from './models'\r\nimport { createStateOperator } from './state_adapter'\r\nimport { createUnsortedStateAdapter } from './unsorted_state_adapter'\r\nimport {\r\n selectIdValue,\r\n ensureEntitiesArray,\r\n splitAddedUpdatedEntities,\r\n} from './utils'\r\n\r\nexport function createSortedStateAdapter(\r\n selectId: IdSelector,\r\n sort: Comparer\r\n): EntityStateAdapter {\r\n type R = EntityState\r\n\r\n const { removeOne, removeMany, removeAll } =\r\n createUnsortedStateAdapter(selectId)\r\n\r\n function addOneMutably(entity: T, state: R): void {\r\n return addManyMutably([entity], state)\r\n }\r\n\r\n function addManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n\r\n const models = newEntities.filter(\r\n (model) => !(selectIdValue(model, selectId) in state.entities)\r\n )\r\n\r\n if (models.length !== 0) {\r\n merge(models, state)\r\n }\r\n }\r\n\r\n function setOneMutably(entity: T, state: R): void {\r\n return setManyMutably([entity], state)\r\n }\r\n\r\n function setManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n if (newEntities.length !== 0) {\r\n merge(newEntities, state)\r\n }\r\n }\r\n\r\n function setAllMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n state.entities = {}\r\n state.ids = []\r\n\r\n addManyMutably(newEntities, state)\r\n }\r\n\r\n function updateOneMutably(update: Update, state: R): void {\r\n return updateManyMutably([update], state)\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\r\n function takeUpdatedModel(models: T[], update: Update, state: R): boolean {\r\n if (!(update.id in state.entities)) {\r\n return false\r\n }\r\n\r\n const original = state.entities[update.id]\r\n const updated = Object.assign({}, original, update.changes)\r\n const newKey = selectIdValue(updated, selectId)\r\n\r\n delete state.entities[update.id]\r\n\r\n models.push(updated)\r\n\r\n return newKey !== update.id\r\n }\r\n\r\n function updateManyMutably(\r\n updates: ReadonlyArray>,\r\n state: R\r\n ): void {\r\n const models: T[] = []\r\n\r\n updates.forEach((update) => takeUpdatedModel(models, update, state))\r\n\r\n if (models.length !== 0) {\r\n merge(models, state)\r\n }\r\n }\r\n\r\n function upsertOneMutably(entity: T, state: R): void {\r\n return upsertManyMutably([entity], state)\r\n }\r\n\r\n function upsertManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n const [added, updated] = splitAddedUpdatedEntities(\r\n newEntities,\r\n selectId,\r\n state\r\n )\r\n\r\n updateManyMutably(updated, state)\r\n addManyMutably(added, state)\r\n }\r\n\r\n function areArraysEqual(a: readonly unknown[], b: readonly unknown[]) {\r\n if (a.length !== b.length) {\r\n return false\r\n }\r\n\r\n for (let i = 0; i < a.length && i < b.length; i++) {\r\n if (a[i] === b[i]) {\r\n continue\r\n }\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n function merge(models: readonly T[], state: R): void {\r\n // Insert/overwrite all new/updated\r\n models.forEach((model) => {\r\n state.entities[selectId(model)] = model\r\n })\r\n\r\n const allEntities = Object.values(state.entities) as T[]\r\n allEntities.sort(sort)\r\n\r\n const newSortedIds = allEntities.map(selectId)\r\n const { ids } = state\r\n\r\n if (!areArraysEqual(ids, newSortedIds)) {\r\n state.ids = newSortedIds\r\n }\r\n }\r\n\r\n return {\r\n removeOne,\r\n removeMany,\r\n removeAll,\r\n addOne: createStateOperator(addOneMutably),\r\n updateOne: createStateOperator(updateOneMutably),\r\n upsertOne: createStateOperator(upsertOneMutably),\r\n setOne: createStateOperator(setOneMutably),\r\n setMany: createStateOperator(setManyMutably),\r\n setAll: createStateOperator(setAllMutably),\r\n addMany: createStateOperator(addManyMutably),\r\n updateMany: createStateOperator(updateManyMutably),\r\n upsertMany: createStateOperator(upsertManyMutably),\r\n }\r\n}\r\n","import type {\r\n EntityDefinition,\r\n Comparer,\r\n IdSelector,\r\n EntityAdapter,\r\n} from './models'\r\nimport { createInitialStateFactory } from './entity_state'\r\nimport { createSelectorsFactory } from './state_selectors'\r\nimport { createSortedStateAdapter } from './sorted_state_adapter'\r\nimport { createUnsortedStateAdapter } from './unsorted_state_adapter'\r\n\r\n/**\r\n *\r\n * @param options\r\n *\r\n * @public\r\n */\r\nexport function createEntityAdapter(\r\n options: {\r\n selectId?: IdSelector\r\n sortComparer?: false | Comparer\r\n } = {}\r\n): EntityAdapter {\r\n const { selectId, sortComparer }: EntityDefinition = {\r\n sortComparer: false,\r\n selectId: (instance: any) => instance.id,\r\n ...options,\r\n }\r\n\r\n const stateFactory = createInitialStateFactory()\r\n const selectorsFactory = createSelectorsFactory()\r\n const stateAdapter = sortComparer\r\n ? createSortedStateAdapter(selectId, sortComparer)\r\n : createUnsortedStateAdapter(selectId)\r\n\r\n return {\r\n selectId,\r\n sortComparer,\r\n ...stateFactory,\r\n ...selectorsFactory,\r\n ...stateAdapter,\r\n }\r\n}\r\n","// Borrowed from https://github.com/ai/nanoid/blob/3.0.2/non-secure/index.js\r\n// This alphabet uses `A-Za-z0-9_-` symbols. A genetic algorithm helped\r\n// optimize the gzip compression for this alphabet.\r\nlet urlAlphabet =\r\n 'ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW'\r\n\r\n/**\r\n *\r\n * @public\r\n */\r\nexport let nanoid = (size = 21) => {\r\n let id = ''\r\n // A compact alternative for `for (var i = 0; i < step; i++)`.\r\n let i = size\r\n while (i--) {\r\n // `| 0` is more compact and faster than `Math.floor()`.\r\n id += urlAlphabet[(Math.random() * 64) | 0]\r\n }\r\n return id\r\n}\r\n","import type { Dispatch, AnyAction } from 'redux'\r\nimport type {\r\n PayloadAction,\r\n ActionCreatorWithPreparedPayload,\r\n} from './createAction'\r\nimport { createAction } from './createAction'\r\nimport type { ThunkDispatch } from 'redux-thunk'\r\nimport type { FallbackIfUnknown, IsAny, IsUnknown } from './tsHelpers'\r\nimport { nanoid } from './nanoid'\r\n\r\n// @ts-ignore we need the import of these types due to a bundling issue.\r\ntype _Keep = PayloadAction | ActionCreatorWithPreparedPayload\r\n\r\nexport type BaseThunkAPI<\r\n S,\r\n E,\r\n D extends Dispatch = Dispatch,\r\n RejectedValue = undefined,\r\n RejectedMeta = unknown,\r\n FulfilledMeta = unknown\r\n> = {\r\n dispatch: D\r\n getState: () => S\r\n extra: E\r\n requestId: string\r\n signal: AbortSignal\r\n rejectWithValue: IsUnknown<\r\n RejectedMeta,\r\n (value: RejectedValue) => RejectWithValue,\r\n (\r\n value: RejectedValue,\r\n meta: RejectedMeta\r\n ) => RejectWithValue\r\n >\r\n fulfillWithValue: IsUnknown<\r\n FulfilledMeta,\r\n (\r\n value: FulfilledValue\r\n ) => FulfillWithMeta,\r\n (\r\n value: FulfilledValue,\r\n meta: FulfilledMeta\r\n ) => FulfillWithMeta\r\n >\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport interface SerializedError {\r\n name?: string\r\n message?: string\r\n stack?: string\r\n code?: string\r\n}\r\n\r\nconst commonProperties: Array = [\r\n 'name',\r\n 'message',\r\n 'stack',\r\n 'code',\r\n]\r\n\r\nclass RejectWithValue {\r\n /*\r\n type-only property to distinguish between RejectWithValue and FulfillWithMeta\r\n does not exist at runtime\r\n */\r\n private readonly _type!: 'RejectWithValue'\r\n constructor(\r\n public readonly payload: Payload,\r\n public readonly meta: RejectedMeta\r\n ) {}\r\n}\r\n\r\nclass FulfillWithMeta {\r\n /*\r\n type-only property to distinguish between RejectWithValue and FulfillWithMeta\r\n does not exist at runtime\r\n */\r\n private readonly _type!: 'FulfillWithMeta'\r\n constructor(\r\n public readonly payload: Payload,\r\n public readonly meta: FulfilledMeta\r\n ) {}\r\n}\r\n\r\n/**\r\n * Serializes an error into a plain object.\r\n * Reworked from https://github.com/sindresorhus/serialize-error\r\n *\r\n * @public\r\n */\r\nexport const miniSerializeError = (value: any): SerializedError => {\r\n if (typeof value === 'object' && value !== null) {\r\n const simpleError: SerializedError = {}\r\n for (const property of commonProperties) {\r\n if (typeof value[property] === 'string') {\r\n simpleError[property] = value[property]\r\n }\r\n }\r\n\r\n return simpleError\r\n }\r\n\r\n return { message: String(value) }\r\n}\r\n\r\ntype AsyncThunkConfig = {\r\n state?: unknown\r\n dispatch?: Dispatch\r\n extra?: unknown\r\n rejectValue?: unknown\r\n serializedErrorType?: unknown\r\n pendingMeta?: unknown\r\n fulfilledMeta?: unknown\r\n rejectedMeta?: unknown\r\n}\r\n\r\ntype GetState = ThunkApiConfig extends {\r\n state: infer State\r\n}\r\n ? State\r\n : unknown\r\ntype GetExtra = ThunkApiConfig extends { extra: infer Extra }\r\n ? Extra\r\n : unknown\r\ntype GetDispatch = ThunkApiConfig extends {\r\n dispatch: infer Dispatch\r\n}\r\n ? FallbackIfUnknown<\r\n Dispatch,\r\n ThunkDispatch<\r\n GetState,\r\n GetExtra,\r\n AnyAction\r\n >\r\n >\r\n : ThunkDispatch, GetExtra, AnyAction>\r\n\r\ntype GetThunkAPI = BaseThunkAPI<\r\n GetState,\r\n GetExtra,\r\n GetDispatch,\r\n GetRejectValue,\r\n GetRejectedMeta,\r\n GetFulfilledMeta\r\n>\r\n\r\ntype GetRejectValue = ThunkApiConfig extends {\r\n rejectValue: infer RejectValue\r\n}\r\n ? RejectValue\r\n : unknown\r\n\r\ntype GetPendingMeta = ThunkApiConfig extends {\r\n pendingMeta: infer PendingMeta\r\n}\r\n ? PendingMeta\r\n : unknown\r\n\r\ntype GetFulfilledMeta = ThunkApiConfig extends {\r\n fulfilledMeta: infer FulfilledMeta\r\n}\r\n ? FulfilledMeta\r\n : unknown\r\n\r\ntype GetRejectedMeta = ThunkApiConfig extends {\r\n rejectedMeta: infer RejectedMeta\r\n}\r\n ? RejectedMeta\r\n : unknown\r\n\r\ntype GetSerializedErrorType = ThunkApiConfig extends {\r\n serializedErrorType: infer GetSerializedErrorType\r\n}\r\n ? GetSerializedErrorType\r\n : SerializedError\r\n\r\ntype MaybePromise = T | Promise | (T extends any ? Promise : never)\r\n\r\n/**\r\n * A type describing the return value of the `payloadCreator` argument to `createAsyncThunk`.\r\n * Might be useful for wrapping `createAsyncThunk` in custom abstractions.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunkPayloadCreatorReturnValue<\r\n Returned,\r\n ThunkApiConfig extends AsyncThunkConfig\r\n> = MaybePromise<\r\n | IsUnknown<\r\n GetFulfilledMeta,\r\n Returned,\r\n FulfillWithMeta>\r\n >\r\n | RejectWithValue<\r\n GetRejectValue,\r\n GetRejectedMeta\r\n >\r\n>\r\n/**\r\n * A type describing the `payloadCreator` argument to `createAsyncThunk`.\r\n * Might be useful for wrapping `createAsyncThunk` in custom abstractions.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunkPayloadCreator<\r\n Returned,\r\n ThunkArg = void,\r\n ThunkApiConfig extends AsyncThunkConfig = {}\r\n> = (\r\n arg: ThunkArg,\r\n thunkAPI: GetThunkAPI\r\n) => AsyncThunkPayloadCreatorReturnValue\r\n\r\n/**\r\n * A ThunkAction created by `createAsyncThunk`.\r\n * Dispatching it returns a Promise for either a\r\n * fulfilled or rejected action.\r\n * Also, the returned value contains an `abort()` method\r\n * that allows the asyncAction to be cancelled from the outside.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunkAction<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig extends AsyncThunkConfig\r\n> = (\r\n dispatch: GetDispatch,\r\n getState: () => GetState,\r\n extra: GetExtra\r\n) => Promise<\r\n | ReturnType>\r\n | ReturnType>\r\n> & {\r\n abort: (reason?: string) => void\r\n requestId: string\r\n arg: ThunkArg\r\n unwrap: () => Promise\r\n}\r\n\r\ntype AsyncThunkActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig extends AsyncThunkConfig\r\n> = IsAny<\r\n ThunkArg,\r\n // any handling\r\n (arg: ThunkArg) => AsyncThunkAction,\r\n // unknown handling\r\n unknown extends ThunkArg\r\n ? (arg: ThunkArg) => AsyncThunkAction // argument not specified or specified as void or undefined\r\n : [ThunkArg] extends [void] | [undefined]\r\n ? () => AsyncThunkAction // argument contains void\r\n : [void] extends [ThunkArg] // make optional\r\n ? (arg?: ThunkArg) => AsyncThunkAction // argument contains undefined\r\n : [undefined] extends [ThunkArg]\r\n ? WithStrictNullChecks<\r\n // with strict nullChecks: make optional\r\n (\r\n arg?: ThunkArg\r\n ) => AsyncThunkAction,\r\n // without strict null checks this will match everything, so don't make it optional\r\n (arg: ThunkArg) => AsyncThunkAction\r\n > // default case: normal argument\r\n : (arg: ThunkArg) => AsyncThunkAction\r\n>\r\n\r\n/**\r\n * Options object for `createAsyncThunk`.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunkOptions<\r\n ThunkArg = void,\r\n ThunkApiConfig extends AsyncThunkConfig = {}\r\n> = {\r\n /**\r\n * A method to control whether the asyncThunk should be executed. Has access to the\r\n * `arg`, `api.getState()` and `api.extra` arguments.\r\n *\r\n * @returns `false` if it should be skipped\r\n */\r\n condition?(\r\n arg: ThunkArg,\r\n api: Pick, 'getState' | 'extra'>\r\n ): boolean | undefined\r\n /**\r\n * If `condition` returns `false`, the asyncThunk will be skipped.\r\n * This option allows you to control whether a `rejected` action with `meta.condition == false`\r\n * will be dispatched or not.\r\n *\r\n * @default `false`\r\n */\r\n dispatchConditionRejection?: boolean\r\n\r\n serializeError?: (x: unknown) => GetSerializedErrorType\r\n\r\n /**\r\n * A function to use when generating the `requestId` for the request sequence.\r\n *\r\n * @default `nanoid`\r\n */\r\n idGenerator?: () => string\r\n} & IsUnknown<\r\n GetPendingMeta,\r\n {\r\n /**\r\n * A method to generate additional properties to be added to `meta` of the pending action.\r\n *\r\n * Using this optional overload will not modify the types correctly, this overload is only in place to support JavaScript users.\r\n * Please use the `ThunkApiConfig` parameter `pendingMeta` to get access to a correctly typed overload\r\n */\r\n getPendingMeta?(\r\n base: {\r\n arg: ThunkArg\r\n requestId: string\r\n },\r\n api: Pick, 'getState' | 'extra'>\r\n ): GetPendingMeta\r\n },\r\n {\r\n /**\r\n * A method to generate additional properties to be added to `meta` of the pending action.\r\n */\r\n getPendingMeta(\r\n base: {\r\n arg: ThunkArg\r\n requestId: string\r\n },\r\n api: Pick, 'getState' | 'extra'>\r\n ): GetPendingMeta\r\n }\r\n>\r\n\r\nexport type AsyncThunkPendingActionCreator<\r\n ThunkArg,\r\n ThunkApiConfig = {}\r\n> = ActionCreatorWithPreparedPayload<\r\n [string, ThunkArg, GetPendingMeta?],\r\n undefined,\r\n string,\r\n never,\r\n {\r\n arg: ThunkArg\r\n requestId: string\r\n requestStatus: 'pending'\r\n } & GetPendingMeta\r\n>\r\n\r\nexport type AsyncThunkRejectedActionCreator<\r\n ThunkArg,\r\n ThunkApiConfig = {}\r\n> = ActionCreatorWithPreparedPayload<\r\n [\r\n Error | null,\r\n string,\r\n ThunkArg,\r\n GetRejectValue?,\r\n GetRejectedMeta?\r\n ],\r\n GetRejectValue | undefined,\r\n string,\r\n GetSerializedErrorType,\r\n {\r\n arg: ThunkArg\r\n requestId: string\r\n requestStatus: 'rejected'\r\n aborted: boolean\r\n condition: boolean\r\n } & (\r\n | ({ rejectedWithValue: false } & {\r\n [K in keyof GetRejectedMeta]?: undefined\r\n })\r\n | ({ rejectedWithValue: true } & GetRejectedMeta)\r\n )\r\n>\r\n\r\nexport type AsyncThunkFulfilledActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig = {}\r\n> = ActionCreatorWithPreparedPayload<\r\n [Returned, string, ThunkArg, GetFulfilledMeta?],\r\n Returned,\r\n string,\r\n never,\r\n {\r\n arg: ThunkArg\r\n requestId: string\r\n requestStatus: 'fulfilled'\r\n } & GetFulfilledMeta\r\n>\r\n\r\n/**\r\n * A type describing the return value of `createAsyncThunk`.\r\n * Might be useful for wrapping `createAsyncThunk` in custom abstractions.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunk<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig extends AsyncThunkConfig\r\n> = AsyncThunkActionCreator & {\r\n pending: AsyncThunkPendingActionCreator\r\n rejected: AsyncThunkRejectedActionCreator\r\n fulfilled: AsyncThunkFulfilledActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig\r\n >\r\n typePrefix: string\r\n}\r\n\r\n/**\r\n *\r\n * @param typePrefix\r\n * @param payloadCreator\r\n * @param options\r\n *\r\n * @public\r\n */\r\nexport function createAsyncThunk<\r\n Returned,\r\n ThunkArg = void,\r\n ThunkApiConfig extends AsyncThunkConfig = {}\r\n>(\r\n typePrefix: string,\r\n payloadCreator: AsyncThunkPayloadCreator,\r\n options?: AsyncThunkOptions\r\n): AsyncThunk {\r\n type RejectedValue = GetRejectValue\r\n type PendingMeta = GetPendingMeta\r\n type FulfilledMeta = GetFulfilledMeta\r\n type RejectedMeta = GetRejectedMeta\r\n\r\n const fulfilled: AsyncThunkFulfilledActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig\r\n > = createAction(\r\n typePrefix + '/fulfilled',\r\n (\r\n payload: Returned,\r\n requestId: string,\r\n arg: ThunkArg,\r\n meta?: FulfilledMeta\r\n ) => ({\r\n payload,\r\n meta: {\r\n ...((meta as any) || {}),\r\n arg,\r\n requestId,\r\n requestStatus: 'fulfilled' as const,\r\n },\r\n })\r\n )\r\n\r\n const pending: AsyncThunkPendingActionCreator =\r\n createAction(\r\n typePrefix + '/pending',\r\n (requestId: string, arg: ThunkArg, meta?: PendingMeta) => ({\r\n payload: undefined,\r\n meta: {\r\n ...((meta as any) || {}),\r\n arg,\r\n requestId,\r\n requestStatus: 'pending' as const,\r\n },\r\n })\r\n )\r\n\r\n const rejected: AsyncThunkRejectedActionCreator =\r\n createAction(\r\n typePrefix + '/rejected',\r\n (\r\n error: Error | null,\r\n requestId: string,\r\n arg: ThunkArg,\r\n payload?: RejectedValue,\r\n meta?: RejectedMeta\r\n ) => ({\r\n payload,\r\n error: ((options && options.serializeError) || miniSerializeError)(\r\n error || 'Rejected'\r\n ) as GetSerializedErrorType,\r\n meta: {\r\n ...((meta as any) || {}),\r\n arg,\r\n requestId,\r\n rejectedWithValue: !!payload,\r\n requestStatus: 'rejected' as const,\r\n aborted: error?.name === 'AbortError',\r\n condition: error?.name === 'ConditionError',\r\n },\r\n })\r\n )\r\n\r\n let displayedWarning = false\r\n\r\n const AC =\r\n typeof AbortController !== 'undefined'\r\n ? AbortController\r\n : class implements AbortController {\r\n signal: AbortSignal = {\r\n aborted: false,\r\n addEventListener() {},\r\n dispatchEvent() {\r\n return false\r\n },\r\n onabort() {},\r\n removeEventListener() {},\r\n }\r\n abort() {\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (!displayedWarning) {\r\n displayedWarning = true\r\n console.info(\r\n `This platform does not implement AbortController. \r\nIf you want to use the AbortController to react to \\`abort\\` events, please consider importing a polyfill like 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only'.`\r\n )\r\n }\r\n }\r\n }\r\n }\r\n\r\n function actionCreator(\r\n arg: ThunkArg\r\n ): AsyncThunkAction {\r\n return (dispatch, getState, extra) => {\r\n const requestId = (options?.idGenerator ?? nanoid)()\r\n\r\n const abortController = new AC()\r\n let abortReason: string | undefined\r\n\r\n const abortedPromise = new Promise((_, reject) =>\r\n abortController.signal.addEventListener('abort', () =>\r\n reject({ name: 'AbortError', message: abortReason || 'Aborted' })\r\n )\r\n )\r\n\r\n let started = false\r\n function abort(reason?: string) {\r\n if (started) {\r\n abortReason = reason\r\n abortController.abort()\r\n }\r\n }\r\n\r\n const promise = (async function () {\r\n let finalAction: ReturnType\r\n try {\r\n if (\r\n options &&\r\n options.condition &&\r\n options.condition(arg, { getState, extra }) === false\r\n ) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw {\r\n name: 'ConditionError',\r\n message: 'Aborted due to condition callback returning false.',\r\n }\r\n }\r\n started = true\r\n dispatch(\r\n pending(\r\n requestId,\r\n arg,\r\n options?.getPendingMeta?.({ requestId, arg }, { getState, extra })\r\n )\r\n )\r\n finalAction = await Promise.race([\r\n abortedPromise,\r\n Promise.resolve(\r\n payloadCreator(arg, {\r\n dispatch,\r\n getState,\r\n extra,\r\n requestId,\r\n signal: abortController.signal,\r\n rejectWithValue: ((\r\n value: RejectedValue,\r\n meta?: RejectedMeta\r\n ) => {\r\n return new RejectWithValue(value, meta)\r\n }) as any,\r\n fulfillWithValue: ((value: unknown, meta?: FulfilledMeta) => {\r\n return new FulfillWithMeta(value, meta)\r\n }) as any,\r\n })\r\n ).then((result) => {\r\n if (result instanceof RejectWithValue) {\r\n throw result\r\n }\r\n if (result instanceof FulfillWithMeta) {\r\n return fulfilled(result.payload, requestId, arg, result.meta)\r\n }\r\n return fulfilled(result as any, requestId, arg)\r\n }),\r\n ])\r\n } catch (err) {\r\n finalAction =\r\n err instanceof RejectWithValue\r\n ? rejected(null, requestId, arg, err.payload, err.meta)\r\n : rejected(err as any, requestId, arg)\r\n }\r\n // We dispatch the result action _after_ the catch, to avoid having any errors\r\n // here get swallowed by the try/catch block,\r\n // per https://twitter.com/dan_abramov/status/770914221638942720\r\n // and https://github.com/reduxjs/redux-toolkit/blob/e85eb17b39a2118d859f7b7746e0f3fee523e089/docs/tutorials/advanced-tutorial.md#async-error-handling-logic-in-thunks\r\n\r\n const skipDispatch =\r\n options &&\r\n !options.dispatchConditionRejection &&\r\n rejected.match(finalAction) &&\r\n (finalAction as any).meta.condition\r\n\r\n if (!skipDispatch) {\r\n dispatch(finalAction)\r\n }\r\n return finalAction\r\n })()\r\n return Object.assign(promise as Promise, {\r\n abort,\r\n requestId,\r\n arg,\r\n unwrap() {\r\n return promise.then(unwrapResult)\r\n },\r\n })\r\n }\r\n }\r\n\r\n return Object.assign(\r\n actionCreator as AsyncThunkActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig\r\n >,\r\n {\r\n pending,\r\n rejected,\r\n fulfilled,\r\n typePrefix,\r\n }\r\n )\r\n}\r\n\r\ninterface UnwrappableAction {\r\n payload: any\r\n meta?: any\r\n error?: any\r\n}\r\n\r\ntype UnwrappedActionPayload = Exclude<\r\n T,\r\n { error: any }\r\n>['payload']\r\n\r\n/**\r\n * @public\r\n */\r\nexport function unwrapResult(\r\n action: R\r\n): UnwrappedActionPayload {\r\n if (action.meta && action.meta.rejectedWithValue) {\r\n throw action.payload\r\n }\r\n if (action.error) {\r\n throw action.error\r\n }\r\n return action.payload\r\n}\r\n\r\ntype WithStrictNullChecks = undefined extends boolean\r\n ? False\r\n : True\r\n","import type { Middleware } from 'redux'\r\n\r\n/**\r\n * return True if T is `any`, otherwise return False\r\n * taken from https://github.com/joonhocho/tsdef\r\n *\r\n * @internal\r\n */\r\nexport type IsAny =\r\n // test if we are going the left AND right path in the condition\r\n true | false extends (T extends never ? true : false) ? True : False\r\n\r\n/**\r\n * return True if T is `unknown`, otherwise return False\r\n * taken from https://github.com/joonhocho/tsdef\r\n *\r\n * @internal\r\n */\r\nexport type IsUnknown = unknown extends T\r\n ? IsAny\r\n : False\r\n\r\nexport type FallbackIfUnknown = IsUnknown\r\n\r\n/**\r\n * @internal\r\n */\r\nexport type IfMaybeUndefined = [undefined] extends [P]\r\n ? True\r\n : False\r\n\r\n/**\r\n * @internal\r\n */\r\nexport type IfVoid = [void] extends [P] ? True : False\r\n\r\n/**\r\n * @internal\r\n */\r\nexport type IsEmptyObj = T extends any\r\n ? keyof T extends never\r\n ? IsUnknown>>\r\n : False\r\n : never\r\n\r\n/**\r\n * returns True if TS version is above 3.5, False if below.\r\n * uses feature detection to detect TS version >= 3.5\r\n * * versions below 3.5 will return `{}` for unresolvable interference\r\n * * versions above will return `unknown`\r\n *\r\n * @internal\r\n */\r\nexport type AtLeastTS35 = [True, False][IsUnknown<\r\n ReturnType<() => T>,\r\n 0,\r\n 1\r\n>]\r\n\r\n/**\r\n * @internal\r\n */\r\nexport type IsUnknownOrNonInferrable = AtLeastTS35<\r\n IsUnknown,\r\n IsEmptyObj>\r\n>\r\n\r\n/**\r\n * Combines all dispatch signatures of all middlewares in the array `M` into\r\n * one intersected dispatch signature.\r\n */\r\nexport type DispatchForMiddlewares = M extends ReadonlyArray\r\n ? UnionToIntersection<\r\n M[number] extends infer MiddlewareValues\r\n ? MiddlewareValues extends Middleware\r\n ? DispatchExt extends Function\r\n ? IsAny\r\n : never\r\n : never\r\n : never\r\n >\r\n : never\r\n\r\n/**\r\n * Convert a Union type `(A|B)` to an intersection type `(A&B)`\r\n */\r\nexport type UnionToIntersection = (\r\n U extends any ? (k: U) => void : never\r\n) extends (k: infer I) => void\r\n ? I\r\n : never\r\n\r\n/**\r\n * Helper type. Passes T out again, but boxes it in a way that it cannot\r\n * \"widen\" the type by accident if it is a generic that should be inferred\r\n * from elsewhere.\r\n *\r\n * @internal\r\n */\r\nexport type NoInfer = [T][T extends any ? 0 : never]\r\n\r\nexport type Omit = Pick>\r\n\r\nexport interface HasMatchFunction {\r\n match: (v: any) => v is T\r\n}\r\n\r\nexport const hasMatchFunction = (\r\n v: Matcher\r\n): v is HasMatchFunction => {\r\n return v && typeof (v as HasMatchFunction).match === 'function'\r\n}\r\n\r\n/** @public */\r\nexport type Matcher = HasMatchFunction | ((v: any) => v is T)\r\n\r\n/** @public */\r\nexport type ActionFromMatcher> = M extends Matcher<\r\n infer T\r\n>\r\n ? T\r\n : never\r\n","import type {\r\n ActionFromMatcher,\r\n Matcher,\r\n UnionToIntersection,\r\n} from './tsHelpers'\r\nimport { hasMatchFunction } from './tsHelpers'\r\nimport type {\r\n AsyncThunk,\r\n AsyncThunkFulfilledActionCreator,\r\n AsyncThunkPendingActionCreator,\r\n AsyncThunkRejectedActionCreator,\r\n} from './createAsyncThunk'\r\n\r\n/** @public */\r\nexport type ActionMatchingAnyOf<\r\n Matchers extends [Matcher, ...Matcher[]]\r\n> = ActionFromMatcher\r\n\r\n/** @public */\r\nexport type ActionMatchingAllOf<\r\n Matchers extends [Matcher, ...Matcher[]]\r\n> = UnionToIntersection>\r\n\r\nconst matches = (matcher: Matcher, action: any) => {\r\n if (hasMatchFunction(matcher)) {\r\n return matcher.match(action)\r\n } else {\r\n return matcher(action)\r\n }\r\n}\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action matches any one of the supplied type guards or action\r\n * creators.\r\n *\r\n * @param matchers The type guards or action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isAnyOf, ...Matcher[]]>(\r\n ...matchers: Matchers\r\n) {\r\n return (action: any): action is ActionMatchingAnyOf => {\r\n return matchers.some((matcher) => matches(matcher, action))\r\n }\r\n}\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action matches all of the supplied type guards or action\r\n * creators.\r\n *\r\n * @param matchers The type guards or action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isAllOf, ...Matcher[]]>(\r\n ...matchers: Matchers\r\n) {\r\n return (action: any): action is ActionMatchingAllOf => {\r\n return matchers.every((matcher) => matches(matcher, action))\r\n }\r\n}\r\n\r\n/**\r\n * @param action A redux action\r\n * @param validStatus An array of valid meta.requestStatus values\r\n *\r\n * @internal\r\n */\r\nexport function hasExpectedRequestMetadata(\r\n action: any,\r\n validStatus: readonly string[]\r\n) {\r\n if (!action || !action.meta) return false\r\n\r\n const hasValidRequestId = typeof action.meta.requestId === 'string'\r\n const hasValidRequestStatus =\r\n validStatus.indexOf(action.meta.requestStatus) > -1\r\n\r\n return hasValidRequestId && hasValidRequestStatus\r\n}\r\n\r\nfunction isAsyncThunkArray(a: [any] | AnyAsyncThunk[]): a is AnyAsyncThunk[] {\r\n return (\r\n typeof a[0] === 'function' &&\r\n 'pending' in a[0] &&\r\n 'fulfilled' in a[0] &&\r\n 'rejected' in a[0]\r\n )\r\n}\r\n\r\nexport type UnknownAsyncThunkPendingAction = ReturnType<\r\n AsyncThunkPendingActionCreator\r\n>\r\n\r\nexport type PendingActionFromAsyncThunk =\r\n ActionFromMatcher\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator, and that\r\n * the action is pending.\r\n *\r\n * @public\r\n */\r\nexport function isPending(): (\r\n action: any\r\n) => action is UnknownAsyncThunkPendingAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators,\r\n * and that the action is pending.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isPending<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (action: any) => action is PendingActionFromAsyncThunk\r\n/**\r\n * Tests if `action` is a pending thunk action\r\n * @public\r\n */\r\nexport function isPending(action: any): action is UnknownAsyncThunkPendingAction\r\nexport function isPending<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n if (asyncThunks.length === 0) {\r\n return (action: any) => hasExpectedRequestMetadata(action, ['pending'])\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isPending()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is PendingActionFromAsyncThunk => {\r\n // note: this type will be correct because we have at least 1 asyncThunk\r\n const matchers: [Matcher, ...Matcher[]] = asyncThunks.map(\r\n (asyncThunk) => asyncThunk.pending\r\n ) as any\r\n\r\n const combinedMatcher = isAnyOf(...matchers)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n\r\nexport type UnknownAsyncThunkRejectedAction = ReturnType<\r\n AsyncThunkRejectedActionCreator\r\n>\r\n\r\nexport type RejectedActionFromAsyncThunk =\r\n ActionFromMatcher\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator, and that\r\n * the action is rejected.\r\n *\r\n * @public\r\n */\r\nexport function isRejected(): (\r\n action: any\r\n) => action is UnknownAsyncThunkRejectedAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators,\r\n * and that the action is rejected.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isRejected<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (action: any) => action is RejectedActionFromAsyncThunk\r\n/**\r\n * Tests if `action` is a rejected thunk action\r\n * @public\r\n */\r\nexport function isRejected(\r\n action: any\r\n): action is UnknownAsyncThunkRejectedAction\r\nexport function isRejected<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n if (asyncThunks.length === 0) {\r\n return (action: any) => hasExpectedRequestMetadata(action, ['rejected'])\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isRejected()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is RejectedActionFromAsyncThunk => {\r\n // note: this type will be correct because we have at least 1 asyncThunk\r\n const matchers: [Matcher, ...Matcher[]] = asyncThunks.map(\r\n (asyncThunk) => asyncThunk.rejected\r\n ) as any\r\n\r\n const combinedMatcher = isAnyOf(...matchers)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n\r\nexport type UnknownAsyncThunkRejectedWithValueAction = ReturnType<\r\n AsyncThunkRejectedActionCreator\r\n>\r\n\r\nexport type RejectedWithValueActionFromAsyncThunk =\r\n ActionFromMatcher &\r\n (T extends AsyncThunk\r\n ? { payload: RejectedValue }\r\n : unknown)\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator, and that\r\n * the action is rejected with value.\r\n *\r\n * @public\r\n */\r\nexport function isRejectedWithValue(): (\r\n action: any\r\n) => action is UnknownAsyncThunkRejectedAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators,\r\n * and that the action is rejected with value.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isRejectedWithValue<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (\r\n action: any\r\n) => action is RejectedWithValueActionFromAsyncThunk\r\n/**\r\n * Tests if `action` is a rejected thunk action with value\r\n * @public\r\n */\r\nexport function isRejectedWithValue(\r\n action: any\r\n): action is UnknownAsyncThunkRejectedAction\r\nexport function isRejectedWithValue<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n const hasFlag = (action: any): action is any => {\r\n return action && action.meta && action.meta.rejectedWithValue\r\n }\r\n\r\n if (asyncThunks.length === 0) {\r\n return (action: any) => {\r\n const combinedMatcher = isAllOf(isRejected(...asyncThunks), hasFlag)\r\n\r\n return combinedMatcher(action)\r\n }\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isRejectedWithValue()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is RejectedActionFromAsyncThunk => {\r\n const combinedMatcher = isAllOf(isRejected(...asyncThunks), hasFlag)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n\r\nexport type UnknownAsyncThunkFulfilledAction = ReturnType<\r\n AsyncThunkFulfilledActionCreator\r\n>\r\n\r\nexport type FulfilledActionFromAsyncThunk =\r\n ActionFromMatcher\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator, and that\r\n * the action is fulfilled.\r\n *\r\n * @public\r\n */\r\nexport function isFulfilled(): (\r\n action: any\r\n) => action is UnknownAsyncThunkFulfilledAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators,\r\n * and that the action is fulfilled.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isFulfilled<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (action: any) => action is FulfilledActionFromAsyncThunk\r\n/**\r\n * Tests if `action` is a fulfilled thunk action\r\n * @public\r\n */\r\nexport function isFulfilled(\r\n action: any\r\n): action is UnknownAsyncThunkFulfilledAction\r\nexport function isFulfilled<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n if (asyncThunks.length === 0) {\r\n return (action: any) => hasExpectedRequestMetadata(action, ['fulfilled'])\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isFulfilled()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is FulfilledActionFromAsyncThunk => {\r\n // note: this type will be correct because we have at least 1 asyncThunk\r\n const matchers: [Matcher, ...Matcher[]] = asyncThunks.map(\r\n (asyncThunk) => asyncThunk.fulfilled\r\n ) as any\r\n\r\n const combinedMatcher = isAnyOf(...matchers)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n\r\nexport type UnknownAsyncThunkAction =\r\n | UnknownAsyncThunkPendingAction\r\n | UnknownAsyncThunkRejectedAction\r\n | UnknownAsyncThunkFulfilledAction\r\n\r\nexport type AnyAsyncThunk = {\r\n pending: { match: (action: any) => action is any }\r\n fulfilled: { match: (action: any) => action is any }\r\n rejected: { match: (action: any) => action is any }\r\n}\r\n\r\nexport type ActionsFromAsyncThunk =\r\n | ActionFromMatcher\r\n | ActionFromMatcher\r\n | ActionFromMatcher\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator.\r\n *\r\n * @public\r\n */\r\nexport function isAsyncThunkAction(): (\r\n action: any\r\n) => action is UnknownAsyncThunkAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isAsyncThunkAction<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (action: any) => action is ActionsFromAsyncThunk\r\n/**\r\n * Tests if `action` is a thunk action\r\n * @public\r\n */\r\nexport function isAsyncThunkAction(\r\n action: any\r\n): action is UnknownAsyncThunkAction\r\nexport function isAsyncThunkAction<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n if (asyncThunks.length === 0) {\r\n return (action: any) =>\r\n hasExpectedRequestMetadata(action, ['pending', 'fulfilled', 'rejected'])\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isAsyncThunkAction()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is ActionsFromAsyncThunk => {\r\n // note: this type will be correct because we have at least 1 asyncThunk\r\n const matchers: [Matcher, ...Matcher[]] = [] as any\r\n\r\n for (const asyncThunk of asyncThunks) {\r\n matchers.push(\r\n asyncThunk.pending,\r\n asyncThunk.rejected,\r\n asyncThunk.fulfilled\r\n )\r\n }\r\n\r\n const combinedMatcher = isAnyOf(...matchers)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n",null]} +diff --git a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.production.min.js b/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.production.min.js +deleted file mode 100644 +index d057fec..0000000 +--- a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.production.min.js ++++ /dev/null +@@ -1,2 +0,0 @@ +-var e=Object.defineProperty,t=Object.defineProperties,n=Object.getOwnPropertyDescriptors,r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable,c=(t,n,r)=>n in t?e(t,n,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[n]=r,a=(e,t)=>{for(var n in t||(t={}))o.call(t,n)&&c(e,n,t[n]);if(r)for(var n of r(t))i.call(t,n)&&c(e,n,t[n]);return e},s=(e,r)=>t(e,n(r));import{enableES5 as u}from"immer";export*from"redux";import{default as f,current as l,freeze as d,original as p,isDraft as m}from"immer";import{createSelector as y}from"reselect";import{current as h,isDraft as g}from"immer";import{createSelector as b}from"reselect";var O=(...e)=>{const t=b(...e);return(e,...n)=>t(g(e)?h(e):e,...n)};import{createStore as j,compose as v,applyMiddleware as w,combineReducers as E}from"redux";import{compose as S}from"redux";var A="undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(0!==arguments.length)return"object"==typeof arguments[0]?S:S.apply(null,arguments)};function x(e){if("object"!=typeof e||null===e)return!1;let t=e;for(;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}"undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION__&&window;import _ from"redux-thunk";var I=class extends Array{constructor(...e){super(...e),Object.setPrototypeOf(this,I.prototype)}static get[Symbol.species](){return I}concat(...e){return super.concat.apply(this,e)}prepend(...e){return 1===e.length&&Array.isArray(e[0])?new I(...e[0].concat(this)):new I(...e.concat(this))}};function P(e){return"object"!=typeof e||null==e||Object.isFrozen(e)}function M(e={}){return()=>e=>t=>e(t)}function C(e){const t=typeof e;return"undefined"===t||null===e||"string"===t||"boolean"===t||"number"===t||Array.isArray(e)||x(e)}function q(e,t="",n=C,r,o=[]){let i;if(!n(e))return{keyPath:t||"",value:e};if("object"!=typeof e||null===e)return!1;const c=null!=r?r(e):Object.entries(e),a=o.length>0;for(const[e,s]of c){const c=t?t+"."+e:e;if(!(a&&o.indexOf(c)>=0)){if(!n(s))return{keyPath:c,value:s};if("object"==typeof s&&(i=q(s,c,n,r,o),i))return i}}return!1}function D(e={}){return()=>e=>t=>e(t)}function k(e={}){const{thunk:t=!0,immutableCheck:n=!0,serializableCheck:r=!0}=e;let o=new I;return t&&o.push("boolean"==typeof t?_:_.withExtraArgument(t.extraArgument)),o}function R(e){const t=function(e){return k(e)},{reducer:n,middleware:r=t(),devTools:o=!0,preloadedState:i,enhancers:c}=e||{};let s;if("function"==typeof n)s=n;else{if(!x(n))throw new Error('"reducer" is a required argument, and must be a function or an object of functions that can be passed to combineReducers');s=E(n)}let u=r;"function"==typeof u&&(u=u(t));const f=w(...u);let l=v;o&&(l=A(a({trace:!1},"object"==typeof o&&o)));let d=[f];Array.isArray(c)?d=[f,...c]:"function"==typeof c&&(d=c(d));const p=l(...d);return j(s,i,p)}function T(e,t){function n(...n){if(t){let r=t(...n);if(!r)throw new Error("prepareAction did not return an object");return a(a({type:e,payload:r.payload},"meta"in r&&{meta:r.meta}),"error"in r&&{error:r.error})}return{type:e,payload:n[0]}}return n.toString=()=>`${e}`,n.type=e,n.match=t=>t.type===e,n}function V(e){return["type","payload","error","meta"].indexOf(e)>-1}function N(e){return`${e}`}import L,{isDraft as X,isDraftable as W}from"immer";function z(e){const t={},n=[];let r;const o={addCase(e,n){const r="string"==typeof e?e:e.type;if(r in t)throw new Error("addCase cannot be called with two reducers for the same action type");return t[r]=n,o},addMatcher:(e,t)=>(n.push({matcher:e,reducer:t}),o),addDefaultCase:e=>(r=e,o)};return e(o),[t,n,r]}function U(e,t,n=[],r){let[o,i,c]="function"==typeof t?z(t):[t,n,r];const a=L(e,(()=>{}));return function(e=a,t){let n=[o[t.type],...i.filter((({matcher:e})=>e(t))).map((({reducer:e})=>e))];return 0===n.filter((e=>!!e)).length&&(n=[c]),n.reduce(((e,n)=>{if(n){if(X(e)){const r=n(e,t);return void 0===r?e:r}if(W(e))return L(e,(e=>n(e,t)));{const r=n(e,t);if(void 0===r){if(null===e)return e;throw Error("A case reducer on a non-draftable value must not return undefined")}return r}}return e}),e)}}function $(e){const{name:t,initialState:n}=e;if(!t)throw new Error("`name` is a required option for createSlice");const r=e.reducers||{},[o={},i=[],c]="function"==typeof e.extraReducers?z(e.extraReducers):[e.extraReducers],s=Object.keys(r),u={},f={},l={};s.forEach((e=>{const n=r[e],o=`${t}/${e}`;let i,c;"reducer"in n?(i=n.reducer,c=n.prepare):i=n,u[e]=i,f[o]=i,l[e]=c?T(o,c):T(o)}));const d=U(n,a(a({},o),f),i,c);return{name:t,reducer:d,actions:l,caseReducers:u}}import B,{isDraft as F}from"immer";function G(e){const t=H(((t,n)=>e(n)));return function(e){return t(e,void 0)}}function H(e){return function(t,n){const r=t=>{var r;x(r=n)&&"string"==typeof r.type&&Object.keys(r).every(V)?e(n.payload,t):e(n,t)};return F(t)?(r(t),t):B(t,r)}}function J(e,t){return t(e)}function K(e){return Array.isArray(e)||(e=Object.values(e)),e}function Q(e,t,n){e=K(e);const r=[],o=[];for(const i of e){const e=J(i,t);e in n.entities?o.push({id:e,changes:i}):r.push(i)}return[r,o]}function Y(e){function t(t,n){const r=J(t,e);r in n.entities||(n.ids.push(r),n.entities[r]=t)}function n(e,n){e=K(e);for(const r of e)t(r,n)}function r(t,n){const r=J(t,e);r in n.entities||n.ids.push(r),n.entities[r]=t}function o(e,t){let n=!1;e.forEach((e=>{e in t.entities&&(delete t.entities[e],n=!0)})),n&&(t.ids=t.ids.filter((e=>e in t.entities)))}function i(t,n){const r={},o={};t.forEach((e=>{e.id in n.entities&&(o[e.id]={id:e.id,changes:a(a({},o[e.id]?o[e.id].changes:null),e.changes)})})),(t=Object.values(o)).length>0&&t.filter((t=>function(t,n,r){const o=Object.assign({},r.entities[n.id],n.changes),i=J(o,e),c=i!==n.id;return c&&(t[n.id]=i,delete r.entities[n.id]),r.entities[i]=o,c}(r,t,n))).length>0&&(n.ids=n.ids.map((e=>r[e]||e)))}function c(t,r){const[o,c]=Q(t,e,r);i(c,r),n(o,r)}return{removeAll:G((function(e){Object.assign(e,{ids:[],entities:{}})})),addOne:H(t),addMany:H(n),setOne:H(r),setMany:H((function(e,t){e=K(e);for(const n of e)r(n,t)})),setAll:H((function(e,t){e=K(e),t.ids=[],t.entities={},n(e,t)})),updateOne:H((function(e,t){return i([e],t)})),updateMany:H(i),upsertOne:H((function(e,t){return c([e],t)})),upsertMany:H(c),removeOne:H((function(e,t){return o([e],t)})),removeMany:H(o)}}function Z(e={}){const{selectId:t,sortComparer:n}=a({sortComparer:!1,selectId:e=>e.id},e),r={getInitialState:function(e={}){return Object.assign({ids:[],entities:{}},e)}},o={getSelectors:function(e){const t=e=>e.ids,n=e=>e.entities,r=O(t,n,((e,t)=>e.map((e=>t[e])))),o=(e,t)=>t,i=(e,t)=>e[t],c=O(t,(e=>e.length));if(!e)return{selectIds:t,selectEntities:n,selectAll:r,selectTotal:c,selectById:O(n,o,i)};const a=O(e,n);return{selectIds:O(e,t),selectEntities:a,selectAll:O(e,r),selectTotal:O(e,c),selectById:O(a,o,i)}}},i=n?function(e,t){const{removeOne:n,removeMany:r,removeAll:o}=Y(e);function i(t,n){const r=(t=K(t)).filter((t=>!(J(t,e)in n.entities)));0!==r.length&&u(r,n)}function c(e,t){0!==(e=K(e)).length&&u(e,t)}function a(t,n){const r=[];t.forEach((t=>function(t,n,r){if(!(n.id in r.entities))return!1;const o=Object.assign({},r.entities[n.id],n.changes),i=J(o,e);return delete r.entities[n.id],t.push(o),i!==n.id}(r,t,n))),0!==r.length&&u(r,n)}function s(t,n){const[r,o]=Q(t,e,n);a(o,n),i(r,n)}function u(n,r){n.forEach((t=>{r.entities[e(t)]=t}));const o=Object.values(r.entities);o.sort(t);const i=o.map(e),{ids:c}=r;(function(e,t){if(e.length!==t.length)return!1;for(let n=0;n{let t="",n=e;for(;n--;)t+="ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW"[64*Math.random()|0];return t},te=["name","message","stack","code"],ne=class{constructor(e,t){this.payload=e,this.meta=t}},re=class{constructor(e,t){this.payload=e,this.meta=t}},oe=e=>{if("object"==typeof e&&null!==e){const t={};for(const n of te)"string"==typeof e[n]&&(t[n]=e[n]);return t}return{message:String(e)}};function ie(e,t,n){const r=T(e+"/fulfilled",((e,t,n,r)=>({payload:e,meta:s(a({},r||{}),{arg:n,requestId:t,requestStatus:"fulfilled"})}))),o=T(e+"/pending",((e,t,n)=>({payload:void 0,meta:s(a({},n||{}),{arg:t,requestId:e,requestStatus:"pending"})}))),i=T(e+"/rejected",((e,t,r,o,i)=>({payload:o,error:(n&&n.serializeError||oe)(e||"Rejected"),meta:s(a({},i||{}),{arg:r,requestId:t,rejectedWithValue:!!o,requestStatus:"rejected",aborted:"AbortError"===(null==e?void 0:e.name),condition:"ConditionError"===(null==e?void 0:e.name)})}))),c="undefined"!=typeof AbortController?AbortController:class{constructor(){this.signal={aborted:!1,addEventListener(){},dispatchEvent:()=>!1,onabort(){},removeEventListener(){}}}abort(){}};return Object.assign((function(e){return(a,s,u)=>{var f;const l=(null!=(f=null==n?void 0:n.idGenerator)?f:ee)(),d=new c;let p;const m=new Promise(((e,t)=>d.signal.addEventListener("abort",(()=>t({name:"AbortError",message:p||"Aborted"})))));let y=!1;const h=async function(){var c;let f;try{if(n&&n.condition&&!1===n.condition(e,{getState:s,extra:u}))throw{name:"ConditionError",message:"Aborted due to condition callback returning false."};y=!0,a(o(l,e,null==(c=null==n?void 0:n.getPendingMeta)?void 0:c.call(n,{requestId:l,arg:e},{getState:s,extra:u}))),f=await Promise.race([m,Promise.resolve(t(e,{dispatch:a,getState:s,extra:u,requestId:l,signal:d.signal,rejectWithValue:(e,t)=>new ne(e,t),fulfillWithValue:(e,t)=>new re(e,t)})).then((t=>{if(t instanceof ne)throw t;return t instanceof re?r(t.payload,l,e,t.meta):r(t,l,e)}))])}catch(t){f=t instanceof ne?i(null,l,e,t.payload,t.meta):i(t,l,e)}return n&&!n.dispatchConditionRejection&&i.match(f)&&f.meta.condition||a(f),f}();return Object.assign(h,{abort:function(e){y&&(p=e,d.abort())},requestId:l,arg:e,unwrap:()=>h.then(ce)})}}),{pending:o,rejected:i,fulfilled:r,typePrefix:e})}function ce(e){if(e.meta&&e.meta.rejectedWithValue)throw e.payload;if(e.error)throw e.error;return e.payload}var ae=(e,t)=>{return(n=e)&&"function"==typeof n.match?e.match(t):e(t);var n};function se(...e){return t=>e.some((e=>ae(e,t)))}function ue(...e){return t=>e.every((e=>ae(e,t)))}function fe(e,t){if(!e||!e.meta)return!1;const n="string"==typeof e.meta.requestId,r=t.indexOf(e.meta.requestStatus)>-1;return n&&r}function le(e){return"function"==typeof e[0]&&"pending"in e[0]&&"fulfilled"in e[0]&&"rejected"in e[0]}function de(...e){return 0===e.length?e=>fe(e,["pending"]):le(e)?t=>se(...e.map((e=>e.pending)))(t):de()(e[0])}function pe(...e){return 0===e.length?e=>fe(e,["rejected"]):le(e)?t=>se(...e.map((e=>e.rejected)))(t):pe()(e[0])}function me(...e){const t=e=>e&&e.meta&&e.meta.rejectedWithValue;return 0===e.length||le(e)?n=>ue(pe(...e),t)(n):me()(e[0])}function ye(...e){return 0===e.length?e=>fe(e,["fulfilled"]):le(e)?t=>se(...e.map((e=>e.fulfilled)))(t):ye()(e[0])}function he(...e){return 0===e.length?e=>fe(e,["pending","fulfilled","rejected"]):le(e)?t=>{const n=[];for(const t of e)n.push(t.pending,t.rejected,t.fulfilled);return se(...n)(t)}:he()(e[0])}u();export{I as MiddlewareArray,R as configureStore,T as createAction,ie as createAsyncThunk,O as createDraftSafeSelector,Z as createEntityAdapter,M as createImmutableStateInvariantMiddleware,f as createNextState,U as createReducer,y as createSelector,D as createSerializableStateInvariantMiddleware,$ as createSlice,l as current,q as findNonSerializableValue,d as freeze,k as getDefaultMiddleware,N as getType,ue as isAllOf,se as isAnyOf,he as isAsyncThunkAction,m as isDraft,ye as isFulfilled,P as isImmutableDefault,de as isPending,C as isPlain,x as isPlainObject,pe as isRejected,me as isRejectedWithValue,oe as miniSerializeError,ee as nanoid,p as original,ce as unwrapResult}; +-//# sourceMappingURL=redux-toolkit.modern.production.min.js.map +\ No newline at end of file +diff --git a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.production.min.js.map b/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.production.min.js.map +deleted file mode 100644 +index 0e6e501..0000000 +--- a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.production.min.js.map ++++ /dev/null +@@ -1 +0,0 @@ +-{"version":3,"sources":["../src/index.ts","../src/createDraftSafeSelector.ts","../src/configureStore.ts","../src/devtoolsExtension.ts","../src/isPlainObject.ts","../src/getDefaultMiddleware.ts","../src/utils.ts","../src/immutableStateInvariantMiddleware.ts","../src/serializableStateInvariantMiddleware.ts","../src/createAction.ts","../src/createReducer.ts","../src/mapBuilders.ts","../src/createSlice.ts","../src/entities/state_adapter.ts","../src/entities/utils.ts","../src/entities/unsorted_state_adapter.ts","../src/entities/create_adapter.ts","../src/entities/entity_state.ts","../src/entities/state_selectors.ts","../src/entities/sorted_state_adapter.ts","../src/nanoid.ts","../src/createAsyncThunk.ts","../src/tsHelpers.ts","../src/matchers.ts"],"names":["enableES5","from","default2","current2","freeze","original","isDraft4","createSelector2","current","isDraft","createSelector","createDraftSafeSelector","args","selector","value","rest","createStore","compose2","applyMiddleware","combineReducers","compose","composeWithDevTools","window","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","arguments","length","apply","isPlainObject","proto","Object","getPrototypeOf","__REDUX_DEVTOOLS_EXTENSION__","thunkMiddleware","MiddlewareArray","Array","[object Object]","super","setPrototypeOf","this","prototype","static","Symbol","species","arr","concat","isArray","isImmutableDefault","isFrozen","createImmutableStateInvariantMiddleware","options","next","action","isPlain","val","type","findNonSerializableValue","path","isSerializable","getEntries","ignoredPaths","foundNestedSerializable","keyPath","entries","hasIgnoredPaths","key","nestedValue","nestedPath","indexOf","createSerializableStateInvariantMiddleware","getDefaultMiddleware","thunk","immutableCheck","serializableCheck","middlewareArray","push","withExtraArgument","extraArgument","configureStore","curriedGetDefaultMiddleware","reducer","middleware","devTools","preloadedState","enhancers","rootReducer","Error","finalMiddleware","middlewareEnhancer","finalCompose","__spreadValues","trace","storeEnhancers","composedEnhancer","createAction","prepareAction","actionCreator","prepared","payload","meta","error","toString","match","isValidKey","getType","createNextState","isDraft2","isDraftable","executeReducerBuilderCallback","builderCallback","actionsMap","actionMatchers","defaultCaseReducer","builder","typeOrActionCreator","addMatcher","matcher","addDefaultCase","createReducer","initialState","mapOrBuilderCallback","finalActionMatchers","finalDefaultCaseReducer","frozenInitialState","state","caseReducers","filter","map","cr","reduce","previousState","caseReducer","result","draft","createSlice","name","reducers","extraReducers","reducerNames","keys","sliceCaseReducersByName","sliceCaseReducersByType","actionCreators","forEach","reducerName","maybeReducerWithPrepare","prepareCallback","prepare","actions","createNextState2","isDraft3","createSingleArgumentStateOperator","mutator","operator","createStateOperator","_","arg","runMutator","every","selectIdValue","entity","selectId","ensureEntitiesArray","entities","values","splitAddedUpdatedEntities","newEntities","added","updated","id","changes","createUnsortedStateAdapter","addOneMutably","ids","addManyMutably","setOneMutably","removeManyMutably","didMutate","updateManyMutably","updates","newKeys","updatesPerEntity","update","assign","newKey","hasNewKey","takeNewKey","upsertManyMutably","removeAll","addOne","addMany","setOne","setMany","setAll","updateOne","updateMany","upsertOne","upsertMany","removeOne","removeMany","createEntityAdapter","sortComparer","instance","stateFactory","getInitialState","additionalState","selectorsFactory","getSelectors","selectState","selectIds","selectEntities","selectAll","selectById","selectTotal","selectGlobalizedEntities","stateAdapter","sort","models","model","merge","setManyMutably","takeUpdatedModel","allEntities","newSortedIds","a","b","i","areArraysEqual","createSortedStateAdapter","nanoid","size","Math","random","commonProperties","RejectWithValue","FulfillWithMeta","miniSerializeError","simpleError","property","message","String","createAsyncThunk","typePrefix","payloadCreator","fulfilled","requestId","__spreadProps","requestStatus","pending","rejected","serializeError","rejectedWithValue","aborted","condition","AC","AbortController","signal","dispatchEvent","dispatch","getState","extra","_a","idGenerator","abortController","abortReason","abortedPromise","Promise","reject","addEventListener","started","promise","async","_a2","finalAction","getPendingMeta","call","race","resolve","rejectWithValue","fulfillWithValue","then","err","dispatchConditionRejection","abort","reason","unwrap","unwrapResult","matches","v","isAnyOf","matchers","some","isAllOf","hasExpectedRequestMetadata","validStatus","hasValidRequestId","hasValidRequestStatus","isAsyncThunkArray","isPending","asyncThunks","asyncThunk","combinedMatcher","isRejected","isRejectedWithValue","hasFlag","isFulfilled","isAsyncThunkAction"],"mappings":"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","sourcesContent":["import { enableES5 } from 'immer'\r\nexport * from 'redux'\r\nexport {\r\n default as createNextState,\r\n current,\r\n freeze,\r\n original,\r\n isDraft,\r\n} from 'immer'\r\nexport type { Draft } from 'immer'\r\nexport { createSelector } from 'reselect'\r\nexport type {\r\n Selector,\r\n OutputParametricSelector,\r\n OutputSelector,\r\n ParametricSelector,\r\n} from 'reselect'\r\nexport { createDraftSafeSelector } from './createDraftSafeSelector'\r\nexport type { ThunkAction, ThunkDispatch } from 'redux-thunk'\r\n\r\n// We deliberately enable Immer's ES5 support, on the grounds that\r\n// we assume RTK will be used with React Native and other Proxy-less\r\n// environments. In addition, that's how Immer 4 behaved, and since\r\n// we want to ship this in an RTK minor, we should keep the same behavior.\r\nenableES5()\r\n\r\nexport {\r\n // js\r\n configureStore,\r\n} from './configureStore'\r\nexport type {\r\n // types\r\n ConfigureEnhancersCallback,\r\n ConfigureStoreOptions,\r\n EnhancedStore,\r\n} from './configureStore'\r\nexport {\r\n // js\r\n createAction,\r\n getType,\r\n} from './createAction'\r\nexport type {\r\n // types\r\n PayloadAction,\r\n PayloadActionCreator,\r\n ActionCreatorWithNonInferrablePayload,\r\n ActionCreatorWithOptionalPayload,\r\n ActionCreatorWithPayload,\r\n ActionCreatorWithoutPayload,\r\n ActionCreatorWithPreparedPayload,\r\n PrepareAction,\r\n} from './createAction'\r\nexport {\r\n // js\r\n createReducer,\r\n} from './createReducer'\r\nexport type {\r\n // types\r\n Actions,\r\n CaseReducer,\r\n CaseReducers,\r\n} from './createReducer'\r\nexport {\r\n // js\r\n createSlice,\r\n} from './createSlice'\r\n\r\nexport type {\r\n // types\r\n CreateSliceOptions,\r\n Slice,\r\n CaseReducerActions,\r\n SliceCaseReducers,\r\n ValidateSliceCaseReducers,\r\n CaseReducerWithPrepare,\r\n SliceActionCreator,\r\n} from './createSlice'\r\nexport {\r\n // js\r\n createImmutableStateInvariantMiddleware,\r\n isImmutableDefault,\r\n} from './immutableStateInvariantMiddleware'\r\nexport type {\r\n // types\r\n ImmutableStateInvariantMiddlewareOptions,\r\n} from './immutableStateInvariantMiddleware'\r\nexport {\r\n // js\r\n createSerializableStateInvariantMiddleware,\r\n findNonSerializableValue,\r\n isPlain,\r\n} from './serializableStateInvariantMiddleware'\r\nexport type {\r\n // types\r\n SerializableStateInvariantMiddlewareOptions,\r\n} from './serializableStateInvariantMiddleware'\r\nexport {\r\n // js\r\n getDefaultMiddleware,\r\n} from './getDefaultMiddleware'\r\nexport type {\r\n // types\r\n ActionReducerMapBuilder,\r\n} from './mapBuilders'\r\nexport { MiddlewareArray } from './utils'\r\n\r\nexport { createEntityAdapter } from './entities/create_adapter'\r\nexport type {\r\n Dictionary,\r\n EntityState,\r\n EntityAdapter,\r\n EntitySelectors,\r\n EntityStateAdapter,\r\n EntityId,\r\n Update,\r\n IdSelector,\r\n Comparer,\r\n} from './entities/models'\r\n\r\nexport {\r\n createAsyncThunk,\r\n unwrapResult,\r\n miniSerializeError,\r\n} from './createAsyncThunk'\r\nexport type {\r\n AsyncThunk,\r\n AsyncThunkOptions,\r\n AsyncThunkAction,\r\n AsyncThunkPayloadCreatorReturnValue,\r\n AsyncThunkPayloadCreator,\r\n SerializedError,\r\n} from './createAsyncThunk'\r\n\r\nexport {\r\n // js\r\n isAllOf,\r\n isAnyOf,\r\n isPending,\r\n isRejected,\r\n isFulfilled,\r\n isAsyncThunkAction,\r\n isRejectedWithValue,\r\n} from './matchers'\r\nexport type {\r\n // types\r\n ActionMatchingAllOf,\r\n ActionMatchingAnyOf,\r\n} from './matchers'\r\n\r\nexport { nanoid } from './nanoid'\r\n\r\nexport { default as isPlainObject } from './isPlainObject'\r\n","import { current, isDraft } from 'immer'\r\nimport { createSelector } from 'reselect'\r\n\r\n/**\r\n * \"Draft-Safe\" version of `reselect`'s `createSelector`:\r\n * If an `immer`-drafted object is passed into the resulting selector's first argument,\r\n * the selector will act on the current draft value, instead of returning a cached value\r\n * that might be possibly outdated if the draft has been modified since.\r\n * @public\r\n */\r\nexport const createDraftSafeSelector: typeof createSelector = (\r\n ...args: unknown[]\r\n) => {\r\n const selector = (createSelector as any)(...args)\r\n const wrappedSelector = (value: unknown, ...rest: unknown[]) =>\r\n selector(isDraft(value) ? current(value) : value, ...rest)\r\n return wrappedSelector as any\r\n}\r\n","import type {\r\n Reducer,\r\n ReducersMapObject,\r\n Middleware,\r\n Action,\r\n AnyAction,\r\n StoreEnhancer,\r\n Store,\r\n Dispatch,\r\n PreloadedState,\r\n CombinedState,\r\n} from 'redux'\r\nimport { createStore, compose, applyMiddleware, combineReducers } from 'redux'\r\nimport type { EnhancerOptions as DevToolsOptions } from './devtoolsExtension'\r\nimport { composeWithDevTools } from './devtoolsExtension'\r\n\r\nimport isPlainObject from './isPlainObject'\r\nimport type {\r\n ThunkMiddlewareFor,\r\n CurriedGetDefaultMiddleware,\r\n} from './getDefaultMiddleware'\r\nimport { curryGetDefaultMiddleware } from './getDefaultMiddleware'\r\nimport type { DispatchForMiddlewares, NoInfer } from './tsHelpers'\r\n\r\nconst IS_PRODUCTION = process.env.NODE_ENV === 'production'\r\n\r\n/**\r\n * Callback function type, to be used in `ConfigureStoreOptions.enhancers`\r\n *\r\n * @public\r\n */\r\nexport type ConfigureEnhancersCallback = (\r\n defaultEnhancers: readonly StoreEnhancer[]\r\n) => StoreEnhancer[]\r\n\r\n/**\r\n * Options for `configureStore()`.\r\n *\r\n * @public\r\n */\r\nexport interface ConfigureStoreOptions<\r\n S = any,\r\n A extends Action = AnyAction,\r\n M extends Middlewares = Middlewares\r\n> {\r\n /**\r\n * A single reducer function that will be used as the root reducer, or an\r\n * object of slice reducers that will be passed to `combineReducers()`.\r\n */\r\n reducer: Reducer | ReducersMapObject\r\n\r\n /**\r\n * An array of Redux middleware to install. If not supplied, defaults to\r\n * the set of middleware returned by `getDefaultMiddleware()`.\r\n */\r\n middleware?: ((getDefaultMiddleware: CurriedGetDefaultMiddleware) => M) | M\r\n\r\n /**\r\n * Whether to enable Redux DevTools integration. Defaults to `true`.\r\n *\r\n * Additional configuration can be done by passing Redux DevTools options\r\n */\r\n devTools?: boolean | DevToolsOptions\r\n\r\n /**\r\n * The initial state, same as Redux's createStore.\r\n * You may optionally specify it to hydrate the state\r\n * from the server in universal apps, or to restore a previously serialized\r\n * user session. If you use `combineReducers()` to produce the root reducer\r\n * function (either directly or indirectly by passing an object as `reducer`),\r\n * this must be an object with the same shape as the reducer map keys.\r\n */\r\n /* \r\n Not 100% correct but the best approximation we can get:\r\n - if S is a `CombinedState` applying a second `CombinedState` on it does not change anything.\r\n - if it is not, there could be two cases:\r\n - `ReducersMapObject` is being passed in. In this case, we will call `combineReducers` on it and `CombinedState` is correct\r\n - `Reducer` is being passed in. In this case, actually `CombinedState` is wrong and `S` would be correct.\r\n As we cannot distinguish between those two cases without adding another generic paramter, \r\n we just make the pragmatic assumption that the latter almost never happens.\r\n */\r\n preloadedState?: PreloadedState>>\r\n\r\n /**\r\n * The store enhancers to apply. See Redux's `createStore()`.\r\n * All enhancers will be included before the DevTools Extension enhancer.\r\n * If you need to customize the order of enhancers, supply a callback\r\n * function that will receive the original array (ie, `[applyMiddleware]`),\r\n * and should return a new array (such as `[applyMiddleware, offline]`).\r\n * If you only need to add middleware, you can use the `middleware` parameter instead.\r\n */\r\n enhancers?: StoreEnhancer[] | ConfigureEnhancersCallback\r\n}\r\n\r\ntype Middlewares = ReadonlyArray>\r\n\r\n/**\r\n * A Redux store returned by `configureStore()`. Supports dispatching\r\n * side-effectful _thunks_ in addition to plain actions.\r\n *\r\n * @public\r\n */\r\nexport interface EnhancedStore<\r\n S = any,\r\n A extends Action = AnyAction,\r\n M extends Middlewares = Middlewares\r\n> extends Store {\r\n /**\r\n * The `dispatch` method of your store, enhanced by all its middlewares.\r\n *\r\n * @inheritdoc\r\n */\r\n dispatch: DispatchForMiddlewares & Dispatch\r\n}\r\n\r\n/**\r\n * A friendly abstraction over the standard Redux `createStore()` function.\r\n *\r\n * @param config The store configuration.\r\n * @returns A configured Redux store.\r\n *\r\n * @public\r\n */\r\nexport function configureStore<\r\n S = any,\r\n A extends Action = AnyAction,\r\n M extends Middlewares = [ThunkMiddlewareFor]\r\n>(options: ConfigureStoreOptions): EnhancedStore {\r\n const curriedGetDefaultMiddleware = curryGetDefaultMiddleware()\r\n\r\n const {\r\n reducer = undefined,\r\n middleware = curriedGetDefaultMiddleware(),\r\n devTools = true,\r\n preloadedState = undefined,\r\n enhancers = undefined,\r\n } = options || {}\r\n\r\n let rootReducer: Reducer\r\n\r\n if (typeof reducer === 'function') {\r\n rootReducer = reducer\r\n } else if (isPlainObject(reducer)) {\r\n rootReducer = combineReducers(reducer)\r\n } else {\r\n throw new Error(\r\n '\"reducer\" is a required argument, and must be a function or an object of functions that can be passed to combineReducers'\r\n )\r\n }\r\n\r\n let finalMiddleware = middleware\r\n if (typeof finalMiddleware === 'function') {\r\n finalMiddleware = finalMiddleware(curriedGetDefaultMiddleware)\r\n\r\n if (!IS_PRODUCTION && !Array.isArray(finalMiddleware)) {\r\n throw new Error(\r\n 'when using a middleware builder function, an array of middleware must be returned'\r\n )\r\n }\r\n }\r\n if (\r\n !IS_PRODUCTION &&\r\n finalMiddleware.some((item) => typeof item !== 'function')\r\n ) {\r\n throw new Error(\r\n 'each middleware provided to configureStore must be a function'\r\n )\r\n }\r\n\r\n const middlewareEnhancer = applyMiddleware(...finalMiddleware)\r\n\r\n let finalCompose = compose\r\n\r\n if (devTools) {\r\n finalCompose = composeWithDevTools({\r\n // Enable capture of stack traces for dispatched Redux actions\r\n trace: !IS_PRODUCTION,\r\n ...(typeof devTools === 'object' && devTools),\r\n })\r\n }\r\n\r\n let storeEnhancers: StoreEnhancer[] = [middlewareEnhancer]\r\n\r\n if (Array.isArray(enhancers)) {\r\n storeEnhancers = [middlewareEnhancer, ...enhancers]\r\n } else if (typeof enhancers === 'function') {\r\n storeEnhancers = enhancers(storeEnhancers)\r\n }\r\n\r\n const composedEnhancer = finalCompose(...storeEnhancers) as any\r\n\r\n return createStore(rootReducer, preloadedState, composedEnhancer)\r\n}\r\n","import type { Action, ActionCreator, StoreEnhancer } from 'redux'\r\nimport { compose } from 'redux'\r\n\r\n/**\r\n * @public\r\n */\r\nexport interface EnhancerOptions {\r\n /**\r\n * the instance name to be showed on the monitor page. Default value is `document.title`.\r\n * If not specified and there's no document title, it will consist of `tabId` and `instanceId`.\r\n */\r\n name?: string\r\n /**\r\n * action creators functions to be available in the Dispatcher.\r\n */\r\n actionCreators?: ActionCreator[] | { [key: string]: ActionCreator }\r\n /**\r\n * if more than one action is dispatched in the indicated interval, all new actions will be collected and sent at once.\r\n * It is the joint between performance and speed. When set to `0`, all actions will be sent instantly.\r\n * Set it to a higher value when experiencing perf issues (also `maxAge` to a lower value).\r\n *\r\n * @default 500 ms.\r\n */\r\n latency?: number\r\n /**\r\n * (> 1) - maximum allowed actions to be stored in the history tree. The oldest actions are removed once maxAge is reached. It's critical for performance.\r\n *\r\n * @default 50\r\n */\r\n maxAge?: number\r\n /**\r\n * See detailed documentation at http://extension.remotedev.io/docs/API/Arguments.html#serialize\r\n */\r\n serialize?:\r\n | boolean\r\n | {\r\n options?:\r\n | boolean\r\n | {\r\n date?: boolean\r\n regex?: boolean\r\n undefined?: boolean\r\n error?: boolean\r\n symbol?: boolean\r\n map?: boolean\r\n set?: boolean\r\n function?: boolean | Function\r\n }\r\n replacer?: (key: string, value: unknown) => unknown\r\n reviver?: (key: string, value: unknown) => unknown\r\n immutable?: unknown\r\n refs?: unknown[]\r\n }\r\n /**\r\n * function which takes `action` object and id number as arguments, and should return `action` object back.\r\n */\r\n actionSanitizer?: (action: A, id: number) => A\r\n /**\r\n * function which takes `state` object and index as arguments, and should return `state` object back.\r\n */\r\n stateSanitizer?: (state: S, index: number) => S\r\n /**\r\n * *string or array of strings as regex* - actions types to be hidden / shown in the monitors (while passed to the reducers).\r\n * If `actionsWhitelist` specified, `actionsBlacklist` is ignored.\r\n */\r\n actionsBlacklist?: string | string[]\r\n /**\r\n * *string or array of strings as regex* - actions types to be hidden / shown in the monitors (while passed to the reducers).\r\n * If `actionsWhitelist` specified, `actionsBlacklist` is ignored.\r\n */\r\n actionsWhitelist?: string | string[]\r\n /**\r\n * called for every action before sending, takes `state` and `action` object, and returns `true` in case it allows sending the current data to the monitor.\r\n * Use it as a more advanced version of `actionsBlacklist`/`actionsWhitelist` parameters.\r\n */\r\n predicate?: (state: S, action: A) => boolean\r\n /**\r\n * if specified as `false`, it will not record the changes till clicking on `Start recording` button.\r\n * Available only for Redux enhancer, for others use `autoPause`.\r\n *\r\n * @default true\r\n */\r\n shouldRecordChanges?: boolean\r\n /**\r\n * if specified, whenever clicking on `Pause recording` button and there are actions in the history log, will add this action type.\r\n * If not specified, will commit when paused. Available only for Redux enhancer.\r\n *\r\n * @default \"@@PAUSED\"\"\r\n */\r\n pauseActionType?: string\r\n /**\r\n * auto pauses when the extension’s window is not opened, and so has zero impact on your app when not in use.\r\n * Not available for Redux enhancer (as it already does it but storing the data to be sent).\r\n *\r\n * @default false\r\n */\r\n autoPause?: boolean\r\n /**\r\n * if specified as `true`, it will not allow any non-monitor actions to be dispatched till clicking on `Unlock changes` button.\r\n * Available only for Redux enhancer.\r\n *\r\n * @default false\r\n */\r\n shouldStartLocked?: boolean\r\n /**\r\n * if set to `false`, will not recompute the states on hot reloading (or on replacing the reducers). Available only for Redux enhancer.\r\n *\r\n * @default true\r\n */\r\n shouldHotReload?: boolean\r\n /**\r\n * if specified as `true`, whenever there's an exception in reducers, the monitors will show the error message, and next actions will not be dispatched.\r\n *\r\n * @default false\r\n */\r\n shouldCatchErrors?: boolean\r\n /**\r\n * If you want to restrict the extension, specify the features you allow.\r\n * If not specified, all of the features are enabled. When set as an object, only those included as `true` will be allowed.\r\n * Note that except `true`/`false`, `import` and `export` can be set as `custom` (which is by default for Redux enhancer), meaning that the importing/exporting occurs on the client side.\r\n * Otherwise, you'll get/set the data right from the monitor part.\r\n */\r\n features?: {\r\n /**\r\n * start/pause recording of dispatched actions\r\n */\r\n pause?: boolean\r\n /**\r\n * lock/unlock dispatching actions and side effects\r\n */\r\n lock?: boolean\r\n /**\r\n * persist states on page reloading\r\n */\r\n persist?: boolean\r\n /**\r\n * export history of actions in a file\r\n */\r\n export?: boolean | 'custom'\r\n /**\r\n * import history of actions from a file\r\n */\r\n import?: boolean | 'custom'\r\n /**\r\n * jump back and forth (time travelling)\r\n */\r\n jump?: boolean\r\n /**\r\n * skip (cancel) actions\r\n */\r\n skip?: boolean\r\n /**\r\n * drag and drop actions in the history list\r\n */\r\n reorder?: boolean\r\n /**\r\n * dispatch custom actions or action creators\r\n */\r\n dispatch?: boolean\r\n /**\r\n * generate tests for the selected actions\r\n */\r\n test?: boolean\r\n }\r\n /**\r\n * Set to true or a stacktrace-returning function to record call stack traces for dispatched actions.\r\n * Defaults to false.\r\n */\r\n trace?: boolean | ((action: A) => string)\r\n /**\r\n * The maximum number of stack trace entries to record per action. Defaults to 10.\r\n */\r\n traceLimit?: number\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport const composeWithDevTools: {\r\n (options: EnhancerOptions): typeof compose\r\n (...funcs: Array>): StoreEnhancer\r\n} =\r\n typeof window !== 'undefined' &&\r\n (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\r\n ? (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\r\n : function () {\r\n if (arguments.length === 0) return undefined\r\n if (typeof arguments[0] === 'object') return compose\r\n return compose.apply(null, arguments as any as Function[])\r\n }\r\n\r\n/**\r\n * @public\r\n */\r\nexport const devToolsEnhancer: {\r\n (options: EnhancerOptions): StoreEnhancer\r\n} =\r\n typeof window !== 'undefined' && (window as any).__REDUX_DEVTOOLS_EXTENSION__\r\n ? (window as any).__REDUX_DEVTOOLS_EXTENSION__\r\n : function () {\r\n return function (noop) {\r\n return noop\r\n }\r\n }\r\n","/**\r\n * Returns true if the passed value is \"plain\" object, i.e. an object whose\r\n * prototype is the root `Object.prototype`. This includes objects created\r\n * using object literals, but not for instance for class instances.\r\n *\r\n * @param {any} value The value to inspect.\r\n * @returns {boolean} True if the argument appears to be a plain object.\r\n *\r\n * @public\r\n */\r\nexport default function isPlainObject(value: unknown): value is object {\r\n if (typeof value !== 'object' || value === null) return false\r\n\r\n let proto = value\r\n while (Object.getPrototypeOf(proto) !== null) {\r\n proto = Object.getPrototypeOf(proto)\r\n }\r\n\r\n return Object.getPrototypeOf(value) === proto\r\n}\r\n","import type { Middleware, AnyAction } from 'redux'\r\nimport type { ThunkMiddleware } from 'redux-thunk'\r\nimport thunkMiddleware from 'redux-thunk'\r\nimport type { ImmutableStateInvariantMiddlewareOptions } from './immutableStateInvariantMiddleware'\r\n/* PROD_START_REMOVE_UMD */\r\nimport { createImmutableStateInvariantMiddleware } from './immutableStateInvariantMiddleware'\r\n/* PROD_STOP_REMOVE_UMD */\r\n\r\nimport type { SerializableStateInvariantMiddlewareOptions } from './serializableStateInvariantMiddleware'\r\nimport { createSerializableStateInvariantMiddleware } from './serializableStateInvariantMiddleware'\r\nimport { MiddlewareArray } from './utils'\r\n\r\nfunction isBoolean(x: any): x is boolean {\r\n return typeof x === 'boolean'\r\n}\r\n\r\ninterface ThunkOptions {\r\n extraArgument: E\r\n}\r\n\r\ninterface GetDefaultMiddlewareOptions {\r\n thunk?: boolean | ThunkOptions\r\n immutableCheck?: boolean | ImmutableStateInvariantMiddlewareOptions\r\n serializableCheck?: boolean | SerializableStateInvariantMiddlewareOptions\r\n}\r\n\r\nexport type ThunkMiddlewareFor<\r\n S,\r\n O extends GetDefaultMiddlewareOptions = {}\r\n> = O extends {\r\n thunk: false\r\n}\r\n ? never\r\n : O extends { thunk: { extraArgument: infer E } }\r\n ? ThunkMiddleware\r\n :\r\n | ThunkMiddleware //The ThunkMiddleware with a `null` ExtraArgument is here to provide backwards-compatibility.\r\n | ThunkMiddleware\r\n\r\nexport type CurriedGetDefaultMiddleware = <\r\n O extends Partial = {\r\n thunk: true\r\n immutableCheck: true\r\n serializableCheck: true\r\n }\r\n>(\r\n options?: O\r\n) => MiddlewareArray | ThunkMiddlewareFor>\r\n\r\nexport function curryGetDefaultMiddleware<\r\n S = any\r\n>(): CurriedGetDefaultMiddleware {\r\n return function curriedGetDefaultMiddleware(options) {\r\n return getDefaultMiddleware(options)\r\n }\r\n}\r\n\r\n/**\r\n * Returns any array containing the default middleware installed by\r\n * `configureStore()`. Useful if you want to configure your store with a custom\r\n * `middleware` array but still keep the default set.\r\n *\r\n * @return The default middleware used by `configureStore()`.\r\n *\r\n * @public\r\n *\r\n * @deprecated Prefer to use the callback notation for the `middleware` option in `configureStore`\r\n * to access a pre-typed `getDefaultMiddleware` instead.\r\n */\r\nexport function getDefaultMiddleware<\r\n S = any,\r\n O extends Partial = {\r\n thunk: true\r\n immutableCheck: true\r\n serializableCheck: true\r\n }\r\n>(\r\n options: O = {} as O\r\n): MiddlewareArray | ThunkMiddlewareFor> {\r\n const {\r\n thunk = true,\r\n immutableCheck = true,\r\n serializableCheck = true,\r\n } = options\r\n\r\n let middlewareArray: Middleware<{}, S>[] = new MiddlewareArray()\r\n\r\n if (thunk) {\r\n if (isBoolean(thunk)) {\r\n middlewareArray.push(thunkMiddleware)\r\n } else {\r\n middlewareArray.push(\r\n thunkMiddleware.withExtraArgument(thunk.extraArgument)\r\n )\r\n }\r\n }\r\n\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (immutableCheck) {\r\n /* PROD_START_REMOVE_UMD */\r\n let immutableOptions: ImmutableStateInvariantMiddlewareOptions = {}\r\n\r\n if (!isBoolean(immutableCheck)) {\r\n immutableOptions = immutableCheck\r\n }\r\n\r\n middlewareArray.unshift(\r\n createImmutableStateInvariantMiddleware(immutableOptions)\r\n )\r\n /* PROD_STOP_REMOVE_UMD */\r\n }\r\n\r\n if (serializableCheck) {\r\n let serializableOptions: SerializableStateInvariantMiddlewareOptions = {}\r\n\r\n if (!isBoolean(serializableCheck)) {\r\n serializableOptions = serializableCheck\r\n }\r\n\r\n middlewareArray.push(\r\n createSerializableStateInvariantMiddleware(serializableOptions)\r\n )\r\n }\r\n }\r\n\r\n return middlewareArray as any\r\n}\r\n","import type { Middleware } from 'redux'\r\n\r\nexport function getTimeMeasureUtils(maxDelay: number, fnName: string) {\r\n let elapsed = 0\r\n return {\r\n measureTime(fn: () => T): T {\r\n const started = Date.now()\r\n try {\r\n return fn()\r\n } finally {\r\n const finished = Date.now()\r\n elapsed += finished - started\r\n }\r\n },\r\n warnIfExceeded() {\r\n if (elapsed > maxDelay) {\r\n console.warn(`${fnName} took ${elapsed}ms, which is more than the warning threshold of ${maxDelay}ms. \r\nIf your state or actions are very large, you may want to disable the middleware as it might cause too much of a slowdown in development mode. See https://redux-toolkit.js.org/api/getDefaultMiddleware for instructions.\r\nIt is disabled in production builds, so you don't need to worry about that.`)\r\n }\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport class MiddlewareArray<\r\n Middlewares extends Middleware\r\n> extends Array {\r\n constructor(arrayLength?: number)\r\n constructor(...items: Middlewares[])\r\n constructor(...args: any[]) {\r\n super(...args)\r\n Object.setPrototypeOf(this, MiddlewareArray.prototype)\r\n }\r\n\r\n static get [Symbol.species]() {\r\n return MiddlewareArray as any\r\n }\r\n\r\n concat>>(\r\n items: AdditionalMiddlewares\r\n ): MiddlewareArray\r\n\r\n concat>>(\r\n ...items: AdditionalMiddlewares\r\n ): MiddlewareArray\r\n concat(...arr: any[]) {\r\n return super.concat.apply(this, arr)\r\n }\r\n\r\n prepend>>(\r\n items: AdditionalMiddlewares\r\n ): MiddlewareArray\r\n\r\n prepend>>(\r\n ...items: AdditionalMiddlewares\r\n ): MiddlewareArray\r\n\r\n prepend(...arr: any[]) {\r\n if (arr.length === 1 && Array.isArray(arr[0])) {\r\n return new MiddlewareArray(...arr[0].concat(this))\r\n }\r\n return new MiddlewareArray(...arr.concat(this))\r\n }\r\n}\r\n","import type { Middleware } from 'redux'\r\nimport { getTimeMeasureUtils } from './utils'\r\n\r\ntype EntryProcessor = (key: string, value: any) => any\r\n\r\nconst isProduction: boolean = process.env.NODE_ENV === 'production'\r\nconst prefix: string = 'Invariant failed'\r\n\r\n// Throw an error if the condition fails\r\n// Strip out error messages for production\r\n// > Not providing an inline default argument for message as the result is smaller\r\nfunction invariant(condition: any, message?: string) {\r\n if (condition) {\r\n return\r\n }\r\n // Condition not passed\r\n\r\n // In production we strip the message but still throw\r\n if (isProduction) {\r\n throw new Error(prefix)\r\n }\r\n\r\n // When not in production we allow the message to pass through\r\n // *This block will be removed in production builds*\r\n throw new Error(`${prefix}: ${message || ''}`)\r\n}\r\n\r\nfunction stringify(\r\n obj: any,\r\n serializer?: EntryProcessor,\r\n indent?: string | number,\r\n decycler?: EntryProcessor\r\n): string {\r\n return JSON.stringify(obj, getSerialize(serializer, decycler), indent)\r\n}\r\n\r\nfunction getSerialize(\r\n serializer?: EntryProcessor,\r\n decycler?: EntryProcessor\r\n): EntryProcessor {\r\n let stack: any[] = [],\r\n keys: any[] = []\r\n\r\n if (!decycler)\r\n decycler = function (_: string, value: any) {\r\n if (stack[0] === value) return '[Circular ~]'\r\n return (\r\n '[Circular ~.' + keys.slice(0, stack.indexOf(value)).join('.') + ']'\r\n )\r\n }\r\n\r\n return function (this: any, key: string, value: any) {\r\n if (stack.length > 0) {\r\n var thisPos = stack.indexOf(this)\r\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this)\r\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key)\r\n if (~stack.indexOf(value)) value = decycler!.call(this, key, value)\r\n } else stack.push(value)\r\n\r\n return serializer == null ? value : serializer.call(this, key, value)\r\n }\r\n}\r\n\r\n/**\r\n * The default `isImmutable` function.\r\n *\r\n * @public\r\n */\r\nexport function isImmutableDefault(value: unknown): boolean {\r\n return (\r\n typeof value !== 'object' ||\r\n value === null ||\r\n typeof value === 'undefined' ||\r\n Object.isFrozen(value)\r\n )\r\n}\r\n\r\nexport function trackForMutations(\r\n isImmutable: IsImmutableFunc,\r\n ignorePaths: string[] | undefined,\r\n obj: any\r\n) {\r\n const trackedProperties = trackProperties(isImmutable, ignorePaths, obj)\r\n return {\r\n detectMutations() {\r\n return detectMutations(isImmutable, ignorePaths, trackedProperties, obj)\r\n },\r\n }\r\n}\r\n\r\ninterface TrackedProperty {\r\n value: any\r\n children: Record\r\n}\r\n\r\nfunction trackProperties(\r\n isImmutable: IsImmutableFunc,\r\n ignorePaths: IgnorePaths = [],\r\n obj: Record,\r\n path: string = ''\r\n) {\r\n const tracked: Partial = { value: obj }\r\n\r\n if (!isImmutable(obj)) {\r\n tracked.children = {}\r\n\r\n for (const key in obj) {\r\n const childPath = path ? path + '.' + key : key\r\n if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) {\r\n continue\r\n }\r\n\r\n tracked.children[key] = trackProperties(\r\n isImmutable,\r\n ignorePaths,\r\n obj[key],\r\n childPath\r\n )\r\n }\r\n }\r\n return tracked as TrackedProperty\r\n}\r\n\r\ntype IgnorePaths = readonly string[]\r\n\r\nfunction detectMutations(\r\n isImmutable: IsImmutableFunc,\r\n ignorePaths: IgnorePaths = [],\r\n trackedProperty: TrackedProperty,\r\n obj: any,\r\n sameParentRef: boolean = false,\r\n path: string = ''\r\n): { wasMutated: boolean; path?: string } {\r\n const prevObj = trackedProperty ? trackedProperty.value : undefined\r\n\r\n const sameRef = prevObj === obj\r\n\r\n if (sameParentRef && !sameRef && !Number.isNaN(obj)) {\r\n return { wasMutated: true, path }\r\n }\r\n\r\n if (isImmutable(prevObj) || isImmutable(obj)) {\r\n return { wasMutated: false }\r\n }\r\n\r\n // Gather all keys from prev (tracked) and after objs\r\n const keysToDetect: Record = {}\r\n for (let key in trackedProperty.children) {\r\n keysToDetect[key] = true\r\n }\r\n for (let key in obj) {\r\n keysToDetect[key] = true\r\n }\r\n\r\n for (let key in keysToDetect) {\r\n const childPath = path ? path + '.' + key : key\r\n if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) {\r\n continue\r\n }\r\n\r\n const result = detectMutations(\r\n isImmutable,\r\n ignorePaths,\r\n trackedProperty.children[key],\r\n obj[key],\r\n sameRef,\r\n childPath\r\n )\r\n\r\n if (result.wasMutated) {\r\n return result\r\n }\r\n }\r\n return { wasMutated: false }\r\n}\r\n\r\ntype IsImmutableFunc = (value: any) => boolean\r\n\r\n/**\r\n * Options for `createImmutableStateInvariantMiddleware()`.\r\n *\r\n * @public\r\n */\r\nexport interface ImmutableStateInvariantMiddlewareOptions {\r\n /**\r\n Callback function to check if a value is considered to be immutable.\r\n This function is applied recursively to every value contained in the state.\r\n The default implementation will return true for primitive types \r\n (like numbers, strings, booleans, null and undefined).\r\n */\r\n isImmutable?: IsImmutableFunc\r\n /** \r\n An array of dot-separated path strings that match named nodes from \r\n the root state to ignore when checking for immutability.\r\n Defaults to undefined\r\n */\r\n ignoredPaths?: string[]\r\n /** Print a warning if checks take longer than N ms. Default: 32ms */\r\n warnAfter?: number\r\n // @deprecated. Use ignoredPaths\r\n ignore?: string[]\r\n}\r\n\r\n/**\r\n * Creates a middleware that checks whether any state was mutated in between\r\n * dispatches or during a dispatch. If any mutations are detected, an error is\r\n * thrown.\r\n *\r\n * @param options Middleware options.\r\n *\r\n * @public\r\n */\r\nexport function createImmutableStateInvariantMiddleware(\r\n options: ImmutableStateInvariantMiddlewareOptions = {}\r\n): Middleware {\r\n if (process.env.NODE_ENV === 'production') {\r\n return () => (next) => (action) => next(action)\r\n }\r\n\r\n let {\r\n isImmutable = isImmutableDefault,\r\n ignoredPaths,\r\n warnAfter = 32,\r\n ignore,\r\n } = options\r\n\r\n // Alias ignore->ignoredPaths, but prefer ignoredPaths if present\r\n ignoredPaths = ignoredPaths || ignore\r\n\r\n const track = trackForMutations.bind(null, isImmutable, ignoredPaths)\r\n\r\n return ({ getState }) => {\r\n let state = getState()\r\n let tracker = track(state)\r\n\r\n let result\r\n return (next) => (action) => {\r\n const measureUtils = getTimeMeasureUtils(\r\n warnAfter,\r\n 'ImmutableStateInvariantMiddleware'\r\n )\r\n\r\n measureUtils.measureTime(() => {\r\n state = getState()\r\n\r\n result = tracker.detectMutations()\r\n // Track before potentially not meeting the invariant\r\n tracker = track(state)\r\n\r\n invariant(\r\n !result.wasMutated,\r\n `A state mutation was detected between dispatches, in the path '${\r\n result.path || ''\r\n }'. This may cause incorrect behavior. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`\r\n )\r\n })\r\n\r\n const dispatchedAction = next(action)\r\n\r\n measureUtils.measureTime(() => {\r\n state = getState()\r\n\r\n result = tracker.detectMutations()\r\n // Track before potentially not meeting the invariant\r\n tracker = track(state)\r\n\r\n result.wasMutated &&\r\n invariant(\r\n !result.wasMutated,\r\n `A state mutation was detected inside a dispatch, in the path: ${\r\n result.path || ''\r\n }. Take a look at the reducer(s) handling the action ${stringify(\r\n action\r\n )}. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`\r\n )\r\n })\r\n\r\n measureUtils.warnIfExceeded()\r\n\r\n return dispatchedAction\r\n }\r\n }\r\n}\r\n","import isPlainObject from './isPlainObject'\r\nimport type { Middleware } from 'redux'\r\nimport { getTimeMeasureUtils } from './utils'\r\n\r\n/**\r\n * Returns true if the passed value is \"plain\", i.e. a value that is either\r\n * directly JSON-serializable (boolean, number, string, array, plain object)\r\n * or `undefined`.\r\n *\r\n * @param val The value to check.\r\n *\r\n * @public\r\n */\r\nexport function isPlain(val: any) {\r\n const type = typeof val\r\n return (\r\n type === 'undefined' ||\r\n val === null ||\r\n type === 'string' ||\r\n type === 'boolean' ||\r\n type === 'number' ||\r\n Array.isArray(val) ||\r\n isPlainObject(val)\r\n )\r\n}\r\n\r\ninterface NonSerializableValue {\r\n keyPath: string\r\n value: unknown\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport function findNonSerializableValue(\r\n value: unknown,\r\n path: string = '',\r\n isSerializable: (value: unknown) => boolean = isPlain,\r\n getEntries?: (value: unknown) => [string, any][],\r\n ignoredPaths: readonly string[] = []\r\n): NonSerializableValue | false {\r\n let foundNestedSerializable: NonSerializableValue | false\r\n\r\n if (!isSerializable(value)) {\r\n return {\r\n keyPath: path || '',\r\n value: value,\r\n }\r\n }\r\n\r\n if (typeof value !== 'object' || value === null) {\r\n return false\r\n }\r\n\r\n const entries = getEntries != null ? getEntries(value) : Object.entries(value)\r\n\r\n const hasIgnoredPaths = ignoredPaths.length > 0\r\n\r\n for (const [key, nestedValue] of entries) {\r\n const nestedPath = path ? path + '.' + key : key\r\n\r\n if (hasIgnoredPaths && ignoredPaths.indexOf(nestedPath) >= 0) {\r\n continue\r\n }\r\n\r\n if (!isSerializable(nestedValue)) {\r\n return {\r\n keyPath: nestedPath,\r\n value: nestedValue,\r\n }\r\n }\r\n\r\n if (typeof nestedValue === 'object') {\r\n foundNestedSerializable = findNonSerializableValue(\r\n nestedValue,\r\n nestedPath,\r\n isSerializable,\r\n getEntries,\r\n ignoredPaths\r\n )\r\n\r\n if (foundNestedSerializable) {\r\n return foundNestedSerializable\r\n }\r\n }\r\n }\r\n\r\n return false\r\n}\r\n\r\n/**\r\n * Options for `createSerializableStateInvariantMiddleware()`.\r\n *\r\n * @public\r\n */\r\nexport interface SerializableStateInvariantMiddlewareOptions {\r\n /**\r\n * The function to check if a value is considered serializable. This\r\n * function is applied recursively to every value contained in the\r\n * state. Defaults to `isPlain()`.\r\n */\r\n isSerializable?: (value: any) => boolean\r\n /**\r\n * The function that will be used to retrieve entries from each\r\n * value. If unspecified, `Object.entries` will be used. Defaults\r\n * to `undefined`.\r\n */\r\n getEntries?: (value: any) => [string, any][]\r\n\r\n /**\r\n * An array of action types to ignore when checking for serializability.\r\n * Defaults to []\r\n */\r\n ignoredActions?: string[]\r\n\r\n /**\r\n * An array of dot-separated path strings to ignore when checking\r\n * for serializability, Defaults to ['meta.arg']\r\n */\r\n ignoredActionPaths?: string[]\r\n\r\n /**\r\n * An array of dot-separated path strings to ignore when checking\r\n * for serializability, Defaults to []\r\n */\r\n ignoredPaths?: string[]\r\n /**\r\n * Execution time warning threshold. If the middleware takes longer\r\n * than `warnAfter` ms, a warning will be displayed in the console.\r\n * Defaults to 32ms.\r\n */\r\n warnAfter?: number\r\n\r\n /**\r\n * Opt out of checking state, but continue checking actions\r\n */\r\n ignoreState?: boolean\r\n}\r\n\r\n/**\r\n * Creates a middleware that, after every state change, checks if the new\r\n * state is serializable. If a non-serializable value is found within the\r\n * state, an error is printed to the console.\r\n *\r\n * @param options Middleware options.\r\n *\r\n * @public\r\n */\r\nexport function createSerializableStateInvariantMiddleware(\r\n options: SerializableStateInvariantMiddlewareOptions = {}\r\n): Middleware {\r\n if (process.env.NODE_ENV === 'production') {\r\n return () => (next) => (action) => next(action)\r\n }\r\n const {\r\n isSerializable = isPlain,\r\n getEntries,\r\n ignoredActions = [],\r\n ignoredActionPaths = ['meta.arg', 'meta.baseQueryMeta'],\r\n ignoredPaths = [],\r\n warnAfter = 32,\r\n ignoreState = false,\r\n } = options\r\n\r\n return (storeAPI) => (next) => (action) => {\r\n if (ignoredActions.length && ignoredActions.indexOf(action.type) !== -1) {\r\n return next(action)\r\n }\r\n\r\n const measureUtils = getTimeMeasureUtils(\r\n warnAfter,\r\n 'SerializableStateInvariantMiddleware'\r\n )\r\n measureUtils.measureTime(() => {\r\n const foundActionNonSerializableValue = findNonSerializableValue(\r\n action,\r\n '',\r\n isSerializable,\r\n getEntries,\r\n ignoredActionPaths\r\n )\r\n\r\n if (foundActionNonSerializableValue) {\r\n const { keyPath, value } = foundActionNonSerializableValue\r\n\r\n console.error(\r\n `A non-serializable value was detected in an action, in the path: \\`${keyPath}\\`. Value:`,\r\n value,\r\n '\\nTake a look at the logic that dispatched this action: ',\r\n action,\r\n '\\n(See https://redux.js.org/faq/actions#why-should-type-be-a-string-or-at-least-serializable-why-should-my-action-types-be-constants)',\r\n '\\n(To allow non-serializable values see: https://redux-toolkit.js.org/usage/usage-guide#working-with-non-serializable-data)'\r\n )\r\n }\r\n })\r\n\r\n const result = next(action)\r\n\r\n if (!ignoreState) {\r\n measureUtils.measureTime(() => {\r\n const state = storeAPI.getState()\r\n\r\n const foundStateNonSerializableValue = findNonSerializableValue(\r\n state,\r\n '',\r\n isSerializable,\r\n getEntries,\r\n ignoredPaths\r\n )\r\n\r\n if (foundStateNonSerializableValue) {\r\n const { keyPath, value } = foundStateNonSerializableValue\r\n\r\n console.error(\r\n `A non-serializable value was detected in the state, in the path: \\`${keyPath}\\`. Value:`,\r\n value,\r\n `\r\nTake a look at the reducer(s) handling this action type: ${action.type}.\r\n(See https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state)`\r\n )\r\n }\r\n })\r\n\r\n measureUtils.warnIfExceeded()\r\n }\r\n\r\n return result\r\n }\r\n}\r\n","import type { Action } from 'redux'\r\nimport type {\r\n IsUnknownOrNonInferrable,\r\n IfMaybeUndefined,\r\n IfVoid,\r\n IsAny,\r\n} from './tsHelpers'\r\nimport isPlainObject from './isPlainObject'\r\n\r\n/**\r\n * An action with a string type and an associated payload. This is the\r\n * type of action returned by `createAction()` action creators.\r\n *\r\n * @template P The type of the action's payload.\r\n * @template T the type used for the action type.\r\n * @template M The type of the action's meta (optional)\r\n * @template E The type of the action's error (optional)\r\n *\r\n * @public\r\n */\r\nexport type PayloadAction<\r\n P = void,\r\n T extends string = string,\r\n M = never,\r\n E = never\r\n> = {\r\n payload: P\r\n type: T\r\n} & ([M] extends [never]\r\n ? {}\r\n : {\r\n meta: M\r\n }) &\r\n ([E] extends [never]\r\n ? {}\r\n : {\r\n error: E\r\n })\r\n\r\n/**\r\n * A \"prepare\" method to be used as the second parameter of `createAction`.\r\n * Takes any number of arguments and returns a Flux Standard Action without\r\n * type (will be added later) that *must* contain a payload (might be undefined).\r\n *\r\n * @public\r\n */\r\nexport type PrepareAction

=\r\n | ((...args: any[]) => { payload: P })\r\n | ((...args: any[]) => { payload: P; meta: any })\r\n | ((...args: any[]) => { payload: P; error: any })\r\n | ((...args: any[]) => { payload: P; meta: any; error: any })\r\n\r\n/**\r\n * Internal version of `ActionCreatorWithPreparedPayload`. Not to be used externally.\r\n *\r\n * @internal\r\n */\r\nexport type _ActionCreatorWithPreparedPayload<\r\n PA extends PrepareAction | void,\r\n T extends string = string\r\n> = PA extends PrepareAction\r\n ? ActionCreatorWithPreparedPayload<\r\n Parameters,\r\n P,\r\n T,\r\n ReturnType extends {\r\n error: infer E\r\n }\r\n ? E\r\n : never,\r\n ReturnType extends {\r\n meta: infer M\r\n }\r\n ? M\r\n : never\r\n >\r\n : void\r\n\r\n/**\r\n * Basic type for all action creators.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n */\r\ninterface BaseActionCreator {\r\n type: T\r\n match: (action: Action) => action is PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator that takes multiple arguments that are passed\r\n * to a `PrepareAction` method to create the final Action.\r\n * @typeParam Args arguments for the action creator function\r\n * @typeParam P `payload` type\r\n * @typeParam T `type` name\r\n * @typeParam E optional `error` type\r\n * @typeParam M optional `meta` type\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithPreparedPayload<\r\n Args extends unknown[],\r\n P,\r\n T extends string = string,\r\n E = never,\r\n M = never\r\n> extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} with `Args` will return\r\n * an Action with a payload of type `P` and (depending on the `PrepareAction`\r\n * method used) a `meta`- and `error` property of types `M` and `E` respectively.\r\n */\r\n (...args: Args): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator of type `T` that takes an optional payload of type `P`.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithOptionalPayload\r\n extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} with an argument will\r\n * return a {@link PayloadAction} of type `T` with a payload of `P`.\r\n * Calling it without an argument will return a PayloadAction with a payload of `undefined`.\r\n */\r\n (payload?: P): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator of type `T` that takes no payload.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithoutPayload\r\n extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} will\r\n * return a {@link PayloadAction} of type `T` with a payload of `undefined`\r\n */\r\n (): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator of type `T` that requires a payload of type P.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithPayload\r\n extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} with an argument will\r\n * return a {@link PayloadAction} of type `T` with a payload of `P`\r\n */\r\n (payload: P): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator of type `T` whose `payload` type could not be inferred. Accepts everything as `payload`.\r\n *\r\n * @inheritdoc {redux#ActionCreator}\r\n *\r\n * @public\r\n */\r\nexport interface ActionCreatorWithNonInferrablePayload<\r\n T extends string = string\r\n> extends BaseActionCreator {\r\n /**\r\n * Calling this {@link redux#ActionCreator} with an argument will\r\n * return a {@link PayloadAction} of type `T` with a payload\r\n * of exactly the type of the argument.\r\n */\r\n (payload: PT): PayloadAction\r\n}\r\n\r\n/**\r\n * An action creator that produces actions with a `payload` attribute.\r\n *\r\n * @typeParam P the `payload` type\r\n * @typeParam T the `type` of the resulting action\r\n * @typeParam PA if the resulting action is preprocessed by a `prepare` method, the signature of said method.\r\n *\r\n * @public\r\n */\r\nexport type PayloadActionCreator<\r\n P = void,\r\n T extends string = string,\r\n PA extends PrepareAction

| void = void\r\n> = IfPrepareActionMethodProvided<\r\n PA,\r\n _ActionCreatorWithPreparedPayload,\r\n // else\r\n IsAny<\r\n P,\r\n ActionCreatorWithPayload,\r\n IsUnknownOrNonInferrable<\r\n P,\r\n ActionCreatorWithNonInferrablePayload,\r\n // else\r\n IfVoid<\r\n P,\r\n ActionCreatorWithoutPayload,\r\n // else\r\n IfMaybeUndefined<\r\n P,\r\n ActionCreatorWithOptionalPayload,\r\n // else\r\n ActionCreatorWithPayload\r\n >\r\n >\r\n >\r\n >\r\n>\r\n\r\n/**\r\n * A utility function to create an action creator for the given action type\r\n * string. The action creator accepts a single argument, which will be included\r\n * in the action object as a field called payload. The action creator function\r\n * will also have its toString() overriden so that it returns the action type,\r\n * allowing it to be used in reducer logic that is looking for that action type.\r\n *\r\n * @param type The action type to use for created actions.\r\n * @param prepare (optional) a method that takes any number of arguments and returns { payload } or { payload, meta }.\r\n * If this is given, the resulting action creator will pass its arguments to this method to calculate payload & meta.\r\n *\r\n * @public\r\n */\r\nexport function createAction

(\r\n type: T\r\n): PayloadActionCreator\r\n\r\n/**\r\n * A utility function to create an action creator for the given action type\r\n * string. The action creator accepts a single argument, which will be included\r\n * in the action object as a field called payload. The action creator function\r\n * will also have its toString() overriden so that it returns the action type,\r\n * allowing it to be used in reducer logic that is looking for that action type.\r\n *\r\n * @param type The action type to use for created actions.\r\n * @param prepare (optional) a method that takes any number of arguments and returns { payload } or { payload, meta }.\r\n * If this is given, the resulting action creator will pass its arguments to this method to calculate payload & meta.\r\n *\r\n * @public\r\n */\r\nexport function createAction<\r\n PA extends PrepareAction,\r\n T extends string = string\r\n>(\r\n type: T,\r\n prepareAction: PA\r\n): PayloadActionCreator['payload'], T, PA>\r\n\r\nexport function createAction(type: string, prepareAction?: Function): any {\r\n function actionCreator(...args: any[]) {\r\n if (prepareAction) {\r\n let prepared = prepareAction(...args)\r\n if (!prepared) {\r\n throw new Error('prepareAction did not return an object')\r\n }\r\n\r\n return {\r\n type,\r\n payload: prepared.payload,\r\n ...('meta' in prepared && { meta: prepared.meta }),\r\n ...('error' in prepared && { error: prepared.error }),\r\n }\r\n }\r\n return { type, payload: args[0] }\r\n }\r\n\r\n actionCreator.toString = () => `${type}`\r\n\r\n actionCreator.type = type\r\n\r\n actionCreator.match = (action: Action): action is PayloadAction =>\r\n action.type === type\r\n\r\n return actionCreator\r\n}\r\n\r\nexport function isFSA(action: unknown): action is {\r\n type: string\r\n payload?: unknown\r\n error?: unknown\r\n meta?: unknown\r\n} {\r\n return (\r\n isPlainObject(action) &&\r\n typeof (action as any).type === 'string' &&\r\n Object.keys(action).every(isValidKey)\r\n )\r\n}\r\n\r\nfunction isValidKey(key: string) {\r\n return ['type', 'payload', 'error', 'meta'].indexOf(key) > -1\r\n}\r\n\r\n/**\r\n * Returns the action type of the actions created by the passed\r\n * `createAction()`-generated action creator (arbitrary action creators\r\n * are not supported).\r\n *\r\n * @param action The action creator whose action type to get.\r\n * @returns The action type used by the action creator.\r\n *\r\n * @public\r\n */\r\nexport function getType(\r\n actionCreator: PayloadActionCreator\r\n): T {\r\n return `${actionCreator}` as T\r\n}\r\n\r\n// helper types for more readable typings\r\n\r\ntype IfPrepareActionMethodProvided<\r\n PA extends PrepareAction | void,\r\n True,\r\n False\r\n> = PA extends (...args: any[]) => any ? True : False\r\n","import type { Draft } from 'immer'\r\nimport createNextState, { isDraft, isDraftable } from 'immer'\r\nimport type { AnyAction, Action, Reducer } from 'redux'\r\nimport type { ActionReducerMapBuilder } from './mapBuilders'\r\nimport { executeReducerBuilderCallback } from './mapBuilders'\r\nimport type { NoInfer } from './tsHelpers'\r\n\r\n/**\r\n * Defines a mapping from action types to corresponding action object shapes.\r\n *\r\n * @deprecated This should not be used manually - it is only used for internal\r\n * inference purposes and should not have any further value.\r\n * It might be removed in the future.\r\n * @public\r\n */\r\nexport type Actions = Record\r\n\r\nexport interface ActionMatcher {\r\n (action: AnyAction): action is A\r\n}\r\n\r\nexport type ActionMatcherDescription = {\r\n matcher: ActionMatcher\r\n reducer: CaseReducer>\r\n}\r\n\r\nexport type ReadonlyActionMatcherDescriptionCollection = ReadonlyArray<\r\n ActionMatcherDescription\r\n>\r\n\r\nexport type ActionMatcherDescriptionCollection = Array<\r\n ActionMatcherDescription\r\n>\r\n\r\n/**\r\n * An *case reducer* is a reducer function for a specific action type. Case\r\n * reducers can be composed to full reducers using `createReducer()`.\r\n *\r\n * Unlike a normal Redux reducer, a case reducer is never called with an\r\n * `undefined` state to determine the initial state. Instead, the initial\r\n * state is explicitly specified as an argument to `createReducer()`.\r\n *\r\n * In addition, a case reducer can choose to mutate the passed-in `state`\r\n * value directly instead of returning a new state. This does not actually\r\n * cause the store state to be mutated directly; instead, thanks to\r\n * [immer](https://github.com/mweststrate/immer), the mutations are\r\n * translated to copy operations that result in a new state.\r\n *\r\n * @public\r\n */\r\nexport type CaseReducer = (\r\n state: Draft,\r\n action: A\r\n) => S | void | Draft\r\n\r\n/**\r\n * A mapping from action types to case reducers for `createReducer()`.\r\n *\r\n * @deprecated This should not be used manually - it is only used\r\n * for internal inference purposes and using it manually\r\n * would lead to type erasure.\r\n * It might be removed in the future.\r\n * @public\r\n */\r\nexport type CaseReducers = {\r\n [T in keyof AS]: AS[T] extends Action ? CaseReducer : void\r\n}\r\n\r\n/**\r\n * A utility function that allows defining a reducer as a mapping from action\r\n * type to *case reducer* functions that handle these action types. The\r\n * reducer's initial state is passed as the first argument.\r\n *\r\n * @remarks\r\n * The body of every case reducer is implicitly wrapped with a call to\r\n * `produce()` from the [immer](https://github.com/mweststrate/immer) library.\r\n * This means that rather than returning a new state object, you can also\r\n * mutate the passed-in state object directly; these mutations will then be\r\n * automatically and efficiently translated into copies, giving you both\r\n * convenience and immutability.\r\n *\r\n * @overloadSummary\r\n * This overload accepts a callback function that receives a `builder` object as its argument.\r\n * That builder provides `addCase`, `addMatcher` and `addDefaultCase` functions that may be\r\n * called to define what actions this reducer will handle.\r\n *\r\n * @param initialState - The initial state that should be used when the reducer is called the first time.\r\n * @param builderCallback - A callback that receives a *builder* object to define\r\n * case reducers via calls to `builder.addCase(actionCreatorOrType, reducer)`.\r\n * @example\r\n```ts\r\nimport {\r\n createAction,\r\n createReducer,\r\n AnyAction,\r\n PayloadAction,\r\n} from \"@reduxjs/toolkit\";\r\n\r\nconst increment = createAction(\"increment\");\r\nconst decrement = createAction(\"decrement\");\r\n\r\nfunction isActionWithNumberPayload(\r\n action: AnyAction\r\n): action is PayloadAction {\r\n return typeof action.payload === \"number\";\r\n}\r\n\r\ncreateReducer(\r\n {\r\n counter: 0,\r\n sumOfNumberPayloads: 0,\r\n unhandledActions: 0,\r\n },\r\n (builder) => {\r\n builder\r\n .addCase(increment, (state, action) => {\r\n // action is inferred correctly here\r\n state.counter += action.payload;\r\n })\r\n // You can chain calls, or have separate `builder.addCase()` lines each time\r\n .addCase(decrement, (state, action) => {\r\n state.counter -= action.payload;\r\n })\r\n // You can apply a \"matcher function\" to incoming actions\r\n .addMatcher(isActionWithNumberPayload, (state, action) => {})\r\n // and provide a default case if no other handlers matched\r\n .addDefaultCase((state, action) => {});\r\n }\r\n);\r\n```\r\n * @public\r\n */\r\nexport function createReducer(\r\n initialState: S,\r\n builderCallback: (builder: ActionReducerMapBuilder) => void\r\n): Reducer\r\n\r\n/**\r\n * A utility function that allows defining a reducer as a mapping from action\r\n * type to *case reducer* functions that handle these action types. The\r\n * reducer's initial state is passed as the first argument.\r\n *\r\n * The body of every case reducer is implicitly wrapped with a call to\r\n * `produce()` from the [immer](https://github.com/mweststrate/immer) library.\r\n * This means that rather than returning a new state object, you can also\r\n * mutate the passed-in state object directly; these mutations will then be\r\n * automatically and efficiently translated into copies, giving you both\r\n * convenience and immutability.\r\n * \r\n * @overloadSummary\r\n * This overload accepts an object where the keys are string action types, and the values\r\n * are case reducer functions to handle those action types.\r\n *\r\n * @param initialState - The initial state that should be used when the reducer is called the first time.\r\n * @param actionsMap - An object mapping from action types to _case reducers_, each of which handles one specific action type.\r\n * @param actionMatchers - An array of matcher definitions in the form `{matcher, reducer}`.\r\n * All matching reducers will be executed in order, independently if a case reducer matched or not.\r\n * @param defaultCaseReducer - A \"default case\" reducer that is executed if no case reducer and no matcher\r\n * reducer was executed for this action.\r\n *\r\n * @example\r\n```js\r\nconst counterReducer = createReducer(0, {\r\n increment: (state, action) => state + action.payload,\r\n decrement: (state, action) => state - action.payload\r\n})\r\n```\r\n \r\n * Action creators that were generated using [`createAction`](./createAction) may be used directly as the keys here, using computed property syntax:\r\n\r\n```js\r\nconst increment = createAction('increment')\r\nconst decrement = createAction('decrement')\r\n\r\nconst counterReducer = createReducer(0, {\r\n [increment]: (state, action) => state + action.payload,\r\n [decrement.type]: (state, action) => state - action.payload\r\n})\r\n```\r\n * @public\r\n */\r\nexport function createReducer<\r\n S,\r\n CR extends CaseReducers = CaseReducers\r\n>(\r\n initialState: S,\r\n actionsMap: CR,\r\n actionMatchers?: ActionMatcherDescriptionCollection,\r\n defaultCaseReducer?: CaseReducer\r\n): Reducer\r\n\r\nexport function createReducer(\r\n initialState: S,\r\n mapOrBuilderCallback:\r\n | CaseReducers\r\n | ((builder: ActionReducerMapBuilder) => void),\r\n actionMatchers: ReadonlyActionMatcherDescriptionCollection = [],\r\n defaultCaseReducer?: CaseReducer\r\n): Reducer {\r\n let [actionsMap, finalActionMatchers, finalDefaultCaseReducer] =\r\n typeof mapOrBuilderCallback === 'function'\r\n ? executeReducerBuilderCallback(mapOrBuilderCallback)\r\n : [mapOrBuilderCallback, actionMatchers, defaultCaseReducer]\r\n\r\n const frozenInitialState = createNextState(initialState, () => {})\r\n\r\n return function (state = frozenInitialState, action): S {\r\n let caseReducers = [\r\n actionsMap[action.type],\r\n ...finalActionMatchers\r\n .filter(({ matcher }) => matcher(action))\r\n .map(({ reducer }) => reducer),\r\n ]\r\n if (caseReducers.filter((cr) => !!cr).length === 0) {\r\n caseReducers = [finalDefaultCaseReducer]\r\n }\r\n\r\n return caseReducers.reduce((previousState, caseReducer): S => {\r\n if (caseReducer) {\r\n if (isDraft(previousState)) {\r\n // If it's already a draft, we must already be inside a `createNextState` call,\r\n // likely because this is being wrapped in `createReducer`, `createSlice`, or nested\r\n // inside an existing draft. It's safe to just pass the draft to the mutator.\r\n const draft = previousState as Draft // We can assume this is already a draft\r\n const result = caseReducer(draft, action)\r\n\r\n if (typeof result === 'undefined') {\r\n return previousState\r\n }\r\n\r\n return result as S\r\n } else if (!isDraftable(previousState)) {\r\n // If state is not draftable (ex: a primitive, such as 0), we want to directly\r\n // return the caseReducer func and not wrap it with produce.\r\n const result = caseReducer(previousState as any, action)\r\n\r\n if (typeof result === 'undefined') {\r\n if (previousState === null) {\r\n return previousState\r\n }\r\n throw Error(\r\n 'A case reducer on a non-draftable value must not return undefined'\r\n )\r\n }\r\n\r\n return result as S\r\n } else {\r\n // @ts-ignore createNextState() produces an Immutable> rather\r\n // than an Immutable, and TypeScript cannot find out how to reconcile\r\n // these two types.\r\n return createNextState(previousState, (draft: Draft) => {\r\n return caseReducer(draft, action)\r\n })\r\n }\r\n }\r\n\r\n return previousState\r\n }, state)\r\n }\r\n}\r\n","import type { Action, AnyAction } from 'redux'\r\nimport type {\r\n CaseReducer,\r\n CaseReducers,\r\n ActionMatcher,\r\n ActionMatcherDescriptionCollection,\r\n} from './createReducer'\r\n\r\nexport interface TypedActionCreator {\r\n (...args: any[]): Action\r\n type: Type\r\n}\r\n\r\n/**\r\n * A builder for an action <-> reducer map.\r\n *\r\n * @public\r\n */\r\nexport interface ActionReducerMapBuilder {\r\n /**\r\n * Adds a case reducer to handle a single exact action type.\r\n * @remarks\r\n * All calls to `builder.addCase` must come before any calls to `builder.addMatcher` or `builder.addDefaultCase`.\r\n * @param actionCreator - Either a plain action type string, or an action creator generated by [`createAction`](./createAction) that can be used to determine the action type.\r\n * @param reducer - The actual case reducer function.\r\n */\r\n addCase>(\r\n actionCreator: ActionCreator,\r\n reducer: CaseReducer>\r\n ): ActionReducerMapBuilder\r\n /**\r\n * Adds a case reducer to handle a single exact action type.\r\n * @remarks\r\n * All calls to `builder.addCase` must come before any calls to `builder.addMatcher` or `builder.addDefaultCase`.\r\n * @param actionCreator - Either a plain action type string, or an action creator generated by [`createAction`](./createAction) that can be used to determine the action type.\r\n * @param reducer - The actual case reducer function.\r\n */\r\n addCase>(\r\n type: Type,\r\n reducer: CaseReducer\r\n ): ActionReducerMapBuilder\r\n\r\n /**\r\n * Allows you to match your incoming actions against your own filter function instead of only the `action.type` property.\r\n * @remarks\r\n * If multiple matcher reducers match, all of them will be executed in the order\r\n * they were defined in - even if a case reducer already matched.\r\n * All calls to `builder.addMatcher` must come after any calls to `builder.addCase` and before any calls to `builder.addDefaultCase`.\r\n * @param matcher - A matcher function. In TypeScript, this should be a [type predicate](https://www.typescriptlang.org/docs/handbook/advanced-types.html#using-type-predicates)\r\n * function\r\n * @param reducer - The actual case reducer function.\r\n *\r\n * @example\r\n```ts\r\nimport {\r\n createAction,\r\n createReducer,\r\n AsyncThunk,\r\n AnyAction,\r\n} from \"@reduxjs/toolkit\";\r\n\r\ntype GenericAsyncThunk = AsyncThunk;\r\n\r\ntype PendingAction = ReturnType;\r\ntype RejectedAction = ReturnType;\r\ntype FulfilledAction = ReturnType;\r\n\r\nconst initialState: Record = {};\r\nconst resetAction = createAction(\"reset-tracked-loading-state\");\r\n\r\nfunction isPendingAction(action: AnyAction): action is PendingAction {\r\n return action.type.endsWith(\"/pending\");\r\n}\r\n\r\nconst reducer = createReducer(initialState, (builder) => {\r\n builder\r\n .addCase(resetAction, () => initialState)\r\n // matcher can be defined outside as a type predicate function\r\n .addMatcher(isPendingAction, (state, action) => {\r\n state[action.meta.requestId] = \"pending\";\r\n })\r\n .addMatcher(\r\n // matcher can be defined inline as a type predicate function\r\n (action): action is RejectedAction => action.type.endsWith(\"/rejected\"),\r\n (state, action) => {\r\n state[action.meta.requestId] = \"rejected\";\r\n }\r\n )\r\n // matcher can just return boolean and the matcher can receive a generic argument\r\n .addMatcher(\r\n (action) => action.type.endsWith(\"/fulfilled\"),\r\n (state, action) => {\r\n state[action.meta.requestId] = \"fulfilled\";\r\n }\r\n );\r\n});\r\n```\r\n */\r\n addMatcher(\r\n matcher: ActionMatcher | ((action: AnyAction) => boolean),\r\n reducer: CaseReducer\r\n ): Omit, 'addCase'>\r\n\r\n /**\r\n * Adds a \"default case\" reducer that is executed if no case reducer and no matcher\r\n * reducer was executed for this action.\r\n * @param reducer - The fallback \"default case\" reducer function.\r\n *\r\n * @example\r\n```ts\r\nimport { createReducer } from '@reduxjs/toolkit'\r\nconst initialState = { otherActions: 0 }\r\nconst reducer = createReducer(initialState, builder => {\r\n builder\r\n // .addCase(...)\r\n // .addMatcher(...)\r\n .addDefaultCase((state, action) => {\r\n state.otherActions++\r\n })\r\n})\r\n```\r\n */\r\n addDefaultCase(reducer: CaseReducer): {}\r\n}\r\n\r\nexport function executeReducerBuilderCallback(\r\n builderCallback: (builder: ActionReducerMapBuilder) => void\r\n): [\r\n CaseReducers,\r\n ActionMatcherDescriptionCollection,\r\n CaseReducer | undefined\r\n] {\r\n const actionsMap: CaseReducers = {}\r\n const actionMatchers: ActionMatcherDescriptionCollection = []\r\n let defaultCaseReducer: CaseReducer | undefined\r\n const builder = {\r\n addCase(\r\n typeOrActionCreator: string | TypedActionCreator,\r\n reducer: CaseReducer\r\n ) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n /*\r\n to keep the definition by the user in line with actual behavior, \r\n we enforce `addCase` to always be called before calling `addMatcher`\r\n as matching cases take precedence over matchers\r\n */\r\n if (actionMatchers.length > 0) {\r\n throw new Error(\r\n '`builder.addCase` should only be called before calling `builder.addMatcher`'\r\n )\r\n }\r\n if (defaultCaseReducer) {\r\n throw new Error(\r\n '`builder.addCase` should only be called before calling `builder.addDefaultCase`'\r\n )\r\n }\r\n }\r\n const type =\r\n typeof typeOrActionCreator === 'string'\r\n ? typeOrActionCreator\r\n : typeOrActionCreator.type\r\n if (type in actionsMap) {\r\n throw new Error(\r\n 'addCase cannot be called with two reducers for the same action type'\r\n )\r\n }\r\n actionsMap[type] = reducer\r\n return builder\r\n },\r\n addMatcher(\r\n matcher: ActionMatcher,\r\n reducer: CaseReducer\r\n ) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (defaultCaseReducer) {\r\n throw new Error(\r\n '`builder.addMatcher` should only be called before calling `builder.addDefaultCase`'\r\n )\r\n }\r\n }\r\n actionMatchers.push({ matcher, reducer })\r\n return builder\r\n },\r\n addDefaultCase(reducer: CaseReducer) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (defaultCaseReducer) {\r\n throw new Error('`builder.addDefaultCase` can only be called once')\r\n }\r\n }\r\n defaultCaseReducer = reducer\r\n return builder\r\n },\r\n }\r\n builderCallback(builder)\r\n return [actionsMap, actionMatchers, defaultCaseReducer]\r\n}\r\n","import type { Reducer } from 'redux'\r\nimport type {\r\n ActionCreatorWithoutPayload,\r\n PayloadAction,\r\n PayloadActionCreator,\r\n PrepareAction,\r\n _ActionCreatorWithPreparedPayload,\r\n} from './createAction'\r\nimport { createAction } from './createAction'\r\nimport type { CaseReducer, CaseReducers } from './createReducer'\r\nimport { createReducer } from './createReducer'\r\nimport type { ActionReducerMapBuilder } from './mapBuilders'\r\nimport { executeReducerBuilderCallback } from './mapBuilders'\r\nimport type { NoInfer } from './tsHelpers'\r\n\r\n/**\r\n * An action creator attached to a slice.\r\n *\r\n * @deprecated please use PayloadActionCreator directly\r\n *\r\n * @public\r\n */\r\nexport type SliceActionCreator

= PayloadActionCreator

\r\n\r\n/**\r\n * The return value of `createSlice`\r\n *\r\n * @public\r\n */\r\nexport interface Slice<\r\n State = any,\r\n CaseReducers extends SliceCaseReducers = SliceCaseReducers,\r\n Name extends string = string\r\n> {\r\n /**\r\n * The slice name.\r\n */\r\n name: Name\r\n\r\n /**\r\n * The slice's reducer.\r\n */\r\n reducer: Reducer\r\n\r\n /**\r\n * Action creators for the types of actions that are handled by the slice\r\n * reducer.\r\n */\r\n actions: CaseReducerActions\r\n\r\n /**\r\n * The individual case reducer functions that were passed in the `reducers` parameter.\r\n * This enables reuse and testing if they were defined inline when calling `createSlice`.\r\n */\r\n caseReducers: SliceDefinedCaseReducers\r\n}\r\n\r\n/**\r\n * Options for `createSlice()`.\r\n *\r\n * @public\r\n */\r\nexport interface CreateSliceOptions<\r\n State = any,\r\n CR extends SliceCaseReducers = SliceCaseReducers,\r\n Name extends string = string\r\n> {\r\n /**\r\n * The slice's name. Used to namespace the generated action types.\r\n */\r\n name: Name\r\n\r\n /**\r\n * The initial state to be returned by the slice reducer.\r\n */\r\n initialState: State\r\n\r\n /**\r\n * A mapping from action types to action-type-specific *case reducer*\r\n * functions. For every action type, a matching action creator will be\r\n * generated using `createAction()`.\r\n */\r\n reducers: ValidateSliceCaseReducers\r\n\r\n /**\r\n * A callback that receives a *builder* object to define\r\n * case reducers via calls to `builder.addCase(actionCreatorOrType, reducer)`.\r\n * \r\n * Alternatively, a mapping from action types to action-type-specific *case reducer*\r\n * functions. These reducers should have existing action types used\r\n * as the keys, and action creators will _not_ be generated.\r\n * \r\n * @example\r\n```ts\r\nimport { createAction, createSlice, Action, AnyAction } from '@reduxjs/toolkit'\r\nconst incrementBy = createAction('incrementBy')\r\nconst decrement = createAction('decrement')\r\n\r\ninterface RejectedAction extends Action {\r\n error: Error\r\n}\r\n\r\nfunction isRejectedAction(action: AnyAction): action is RejectedAction {\r\n return action.type.endsWith('rejected')\r\n}\r\n\r\ncreateSlice({\r\n name: 'counter',\r\n initialState: 0,\r\n reducers: {},\r\n extraReducers: builder => {\r\n builder\r\n .addCase(incrementBy, (state, action) => {\r\n // action is inferred correctly here if using TS\r\n })\r\n // You can chain calls, or have separate `builder.addCase()` lines each time\r\n .addCase(decrement, (state, action) => {})\r\n // You can match a range of action types\r\n .addMatcher(\r\n isRejectedAction,\r\n // `action` will be inferred as a RejectedAction due to isRejectedAction being defined as a type guard\r\n (state, action) => {}\r\n )\r\n // and provide a default case if no other handlers matched\r\n .addDefaultCase((state, action) => {})\r\n }\r\n})\r\n```\r\n */\r\n extraReducers?:\r\n | CaseReducers, any>\r\n | ((builder: ActionReducerMapBuilder>) => void)\r\n}\r\n\r\n/**\r\n * A CaseReducer with a `prepare` method.\r\n *\r\n * @public\r\n */\r\nexport type CaseReducerWithPrepare = {\r\n reducer: CaseReducer\r\n prepare: PrepareAction\r\n}\r\n\r\n/**\r\n * The type describing a slice's `reducers` option.\r\n *\r\n * @public\r\n */\r\nexport type SliceCaseReducers = {\r\n [K: string]:\r\n | CaseReducer>\r\n | CaseReducerWithPrepare>\r\n}\r\n\r\n/**\r\n * Derives the slice's `actions` property from the `reducers` options\r\n *\r\n * @public\r\n */\r\nexport type CaseReducerActions> = {\r\n [Type in keyof CaseReducers]: CaseReducers[Type] extends { prepare: any }\r\n ? ActionCreatorForCaseReducerWithPrepare\r\n : ActionCreatorForCaseReducer\r\n}\r\n\r\n/**\r\n * Get a `PayloadActionCreator` type for a passed `CaseReducerWithPrepare`\r\n *\r\n * @internal\r\n */\r\ntype ActionCreatorForCaseReducerWithPrepare =\r\n _ActionCreatorWithPreparedPayload\r\n\r\n/**\r\n * Get a `PayloadActionCreator` type for a passed `CaseReducer`\r\n *\r\n * @internal\r\n */\r\ntype ActionCreatorForCaseReducer = CR extends (\r\n state: any,\r\n action: infer Action\r\n) => any\r\n ? Action extends { payload: infer P }\r\n ? PayloadActionCreator

\r\n : ActionCreatorWithoutPayload\r\n : ActionCreatorWithoutPayload\r\n\r\n/**\r\n * Extracts the CaseReducers out of a `reducers` object, even if they are\r\n * tested into a `CaseReducerWithPrepare`.\r\n *\r\n * @internal\r\n */\r\ntype SliceDefinedCaseReducers> = {\r\n [Type in keyof CaseReducers]: CaseReducers[Type] extends {\r\n reducer: infer Reducer\r\n }\r\n ? Reducer\r\n : CaseReducers[Type]\r\n}\r\n\r\n/**\r\n * Used on a SliceCaseReducers object.\r\n * Ensures that if a CaseReducer is a `CaseReducerWithPrepare`, that\r\n * the `reducer` and the `prepare` function use the same type of `payload`.\r\n *\r\n * Might do additional such checks in the future.\r\n *\r\n * This type is only ever useful if you want to write your own wrapper around\r\n * `createSlice`. Please don't use it otherwise!\r\n *\r\n * @public\r\n */\r\nexport type ValidateSliceCaseReducers<\r\n S,\r\n ACR extends SliceCaseReducers\r\n> = ACR &\r\n {\r\n [T in keyof ACR]: ACR[T] extends {\r\n reducer(s: S, action?: infer A): any\r\n }\r\n ? {\r\n prepare(...a: never[]): Omit\r\n }\r\n : {}\r\n }\r\n\r\nfunction getType(slice: string, actionKey: string): string {\r\n return `${slice}/${actionKey}`\r\n}\r\n\r\n/**\r\n * A function that accepts an initial state, an object full of reducer\r\n * functions, and a \"slice name\", and automatically generates\r\n * action creators and action types that correspond to the\r\n * reducers and state.\r\n *\r\n * The `reducer` argument is passed to `createReducer()`.\r\n *\r\n * @public\r\n */\r\nexport function createSlice<\r\n State,\r\n CaseReducers extends SliceCaseReducers,\r\n Name extends string = string\r\n>(\r\n options: CreateSliceOptions\r\n): Slice {\r\n const { name, initialState } = options\r\n if (!name) {\r\n throw new Error('`name` is a required option for createSlice')\r\n }\r\n const reducers = options.reducers || {}\r\n const [\r\n extraReducers = {},\r\n actionMatchers = [],\r\n defaultCaseReducer = undefined,\r\n ] =\r\n typeof options.extraReducers === 'function'\r\n ? executeReducerBuilderCallback(options.extraReducers)\r\n : [options.extraReducers]\r\n\r\n const reducerNames = Object.keys(reducers)\r\n\r\n const sliceCaseReducersByName: Record = {}\r\n const sliceCaseReducersByType: Record = {}\r\n const actionCreators: Record = {}\r\n\r\n reducerNames.forEach((reducerName) => {\r\n const maybeReducerWithPrepare = reducers[reducerName]\r\n const type = getType(name, reducerName)\r\n\r\n let caseReducer: CaseReducer\r\n let prepareCallback: PrepareAction | undefined\r\n\r\n if ('reducer' in maybeReducerWithPrepare) {\r\n caseReducer = maybeReducerWithPrepare.reducer\r\n prepareCallback = maybeReducerWithPrepare.prepare\r\n } else {\r\n caseReducer = maybeReducerWithPrepare\r\n }\r\n\r\n sliceCaseReducersByName[reducerName] = caseReducer\r\n sliceCaseReducersByType[type] = caseReducer\r\n actionCreators[reducerName] = prepareCallback\r\n ? createAction(type, prepareCallback)\r\n : createAction(type)\r\n })\r\n\r\n const finalCaseReducers = { ...extraReducers, ...sliceCaseReducersByType }\r\n const reducer = createReducer(\r\n initialState,\r\n finalCaseReducers as any,\r\n actionMatchers,\r\n defaultCaseReducer\r\n )\r\n\r\n return {\r\n name,\r\n reducer,\r\n actions: actionCreators as any,\r\n caseReducers: sliceCaseReducersByName as any,\r\n }\r\n}\r\n","import createNextState, { isDraft } from 'immer'\r\nimport type { EntityState, PreventAny } from './models'\r\nimport type { PayloadAction } from '../createAction'\r\nimport { isFSA } from '../createAction'\r\nimport { IsAny } from '../tsHelpers'\r\n\r\nexport function createSingleArgumentStateOperator(\r\n mutator: (state: EntityState) => void\r\n) {\r\n const operator = createStateOperator((_: undefined, state: EntityState) =>\r\n mutator(state)\r\n )\r\n\r\n return function operation>(\r\n state: PreventAny\r\n ): S {\r\n return operator(state as S, undefined)\r\n }\r\n}\r\n\r\nexport function createStateOperator(\r\n mutator: (arg: R, state: EntityState) => void\r\n) {\r\n return function operation>(\r\n state: S,\r\n arg: R | PayloadAction\r\n ): S {\r\n function isPayloadActionArgument(\r\n arg: R | PayloadAction\r\n ): arg is PayloadAction {\r\n return isFSA(arg)\r\n }\r\n\r\n const runMutator = (draft: EntityState) => {\r\n if (isPayloadActionArgument(arg)) {\r\n mutator(arg.payload, draft)\r\n } else {\r\n mutator(arg, draft)\r\n }\r\n }\r\n\r\n if (isDraft(state)) {\r\n // we must already be inside a `createNextState` call, likely because\r\n // this is being wrapped in `createReducer` or `createSlice`.\r\n // It's safe to just pass the draft to the mutator.\r\n runMutator(state)\r\n\r\n // since it's a draft, we'll just return it\r\n return state\r\n } else {\r\n // @ts-ignore createNextState() produces an Immutable> rather\r\n // than an Immutable, and TypeScript cannot find out how to reconcile\r\n // these two types.\r\n return createNextState(state, runMutator)\r\n }\r\n }\r\n}\r\n","import type { EntityState, IdSelector, Update, EntityId } from './models'\r\n\r\nexport function selectIdValue(entity: T, selectId: IdSelector) {\r\n const key = selectId(entity)\r\n\r\n if (process.env.NODE_ENV !== 'production' && key === undefined) {\r\n console.warn(\r\n 'The entity passed to the `selectId` implementation returned undefined.',\r\n 'You should probably provide your own `selectId` implementation.',\r\n 'The entity that was passed:',\r\n entity,\r\n 'The `selectId` implementation:',\r\n selectId.toString()\r\n )\r\n }\r\n\r\n return key\r\n}\r\n\r\nexport function ensureEntitiesArray(\r\n entities: readonly T[] | Record\r\n): readonly T[] {\r\n if (!Array.isArray(entities)) {\r\n entities = Object.values(entities)\r\n }\r\n\r\n return entities\r\n}\r\n\r\nexport function splitAddedUpdatedEntities(\r\n newEntities: readonly T[] | Record,\r\n selectId: IdSelector,\r\n state: EntityState\r\n): [T[], Update[]] {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n\r\n const added: T[] = []\r\n const updated: Update[] = []\r\n\r\n for (const entity of newEntities) {\r\n const id = selectIdValue(entity, selectId)\r\n if (id in state.entities) {\r\n updated.push({ id, changes: entity })\r\n } else {\r\n added.push(entity)\r\n }\r\n }\r\n return [added, updated]\r\n}\r\n","import type {\r\n EntityState,\r\n EntityStateAdapter,\r\n IdSelector,\r\n Update,\r\n EntityId,\r\n} from './models'\r\nimport {\r\n createStateOperator,\r\n createSingleArgumentStateOperator,\r\n} from './state_adapter'\r\nimport {\r\n selectIdValue,\r\n ensureEntitiesArray,\r\n splitAddedUpdatedEntities,\r\n} from './utils'\r\n\r\nexport function createUnsortedStateAdapter(\r\n selectId: IdSelector\r\n): EntityStateAdapter {\r\n type R = EntityState\r\n\r\n function addOneMutably(entity: T, state: R): void {\r\n const key = selectIdValue(entity, selectId)\r\n\r\n if (key in state.entities) {\r\n return\r\n }\r\n\r\n state.ids.push(key)\r\n state.entities[key] = entity\r\n }\r\n\r\n function addManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n\r\n for (const entity of newEntities) {\r\n addOneMutably(entity, state)\r\n }\r\n }\r\n\r\n function setOneMutably(entity: T, state: R): void {\r\n const key = selectIdValue(entity, selectId)\r\n if (!(key in state.entities)) {\r\n state.ids.push(key)\r\n }\r\n state.entities[key] = entity\r\n }\r\n\r\n function setManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n for (const entity of newEntities) {\r\n setOneMutably(entity, state)\r\n }\r\n }\r\n\r\n function setAllMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n\r\n state.ids = []\r\n state.entities = {}\r\n\r\n addManyMutably(newEntities, state)\r\n }\r\n\r\n function removeOneMutably(key: EntityId, state: R): void {\r\n return removeManyMutably([key], state)\r\n }\r\n\r\n function removeManyMutably(keys: readonly EntityId[], state: R): void {\r\n let didMutate = false\r\n\r\n keys.forEach((key) => {\r\n if (key in state.entities) {\r\n delete state.entities[key]\r\n didMutate = true\r\n }\r\n })\r\n\r\n if (didMutate) {\r\n state.ids = state.ids.filter((id) => id in state.entities)\r\n }\r\n }\r\n\r\n function removeAllMutably(state: R): void {\r\n Object.assign(state, {\r\n ids: [],\r\n entities: {},\r\n })\r\n }\r\n\r\n function takeNewKey(\r\n keys: { [id: string]: EntityId },\r\n update: Update,\r\n state: R\r\n ): boolean {\r\n const original = state.entities[update.id]\r\n const updated: T = Object.assign({}, original, update.changes)\r\n const newKey = selectIdValue(updated, selectId)\r\n const hasNewKey = newKey !== update.id\r\n\r\n if (hasNewKey) {\r\n keys[update.id] = newKey\r\n delete state.entities[update.id]\r\n }\r\n\r\n state.entities[newKey] = updated\r\n\r\n return hasNewKey\r\n }\r\n\r\n function updateOneMutably(update: Update, state: R): void {\r\n return updateManyMutably([update], state)\r\n }\r\n\r\n function updateManyMutably(\r\n updates: ReadonlyArray>,\r\n state: R\r\n ): void {\r\n const newKeys: { [id: string]: EntityId } = {}\r\n\r\n const updatesPerEntity: { [id: string]: Update } = {}\r\n\r\n updates.forEach((update) => {\r\n // Only apply updates to entities that currently exist\r\n if (update.id in state.entities) {\r\n // If there are multiple updates to one entity, merge them together\r\n updatesPerEntity[update.id] = {\r\n id: update.id,\r\n // Spreads ignore falsy values, so this works even if there isn't\r\n // an existing update already at this key\r\n changes: {\r\n ...(updatesPerEntity[update.id]\r\n ? updatesPerEntity[update.id].changes\r\n : null),\r\n ...update.changes,\r\n },\r\n }\r\n }\r\n })\r\n\r\n updates = Object.values(updatesPerEntity)\r\n\r\n const didMutateEntities = updates.length > 0\r\n\r\n if (didMutateEntities) {\r\n const didMutateIds =\r\n updates.filter((update) => takeNewKey(newKeys, update, state)).length >\r\n 0\r\n\r\n if (didMutateIds) {\r\n state.ids = state.ids.map((id) => newKeys[id] || id)\r\n }\r\n }\r\n }\r\n\r\n function upsertOneMutably(entity: T, state: R): void {\r\n return upsertManyMutably([entity], state)\r\n }\r\n\r\n function upsertManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n const [added, updated] = splitAddedUpdatedEntities(\r\n newEntities,\r\n selectId,\r\n state\r\n )\r\n\r\n updateManyMutably(updated, state)\r\n addManyMutably(added, state)\r\n }\r\n\r\n return {\r\n removeAll: createSingleArgumentStateOperator(removeAllMutably),\r\n addOne: createStateOperator(addOneMutably),\r\n addMany: createStateOperator(addManyMutably),\r\n setOne: createStateOperator(setOneMutably),\r\n setMany: createStateOperator(setManyMutably),\r\n setAll: createStateOperator(setAllMutably),\r\n updateOne: createStateOperator(updateOneMutably),\r\n updateMany: createStateOperator(updateManyMutably),\r\n upsertOne: createStateOperator(upsertOneMutably),\r\n upsertMany: createStateOperator(upsertManyMutably),\r\n removeOne: createStateOperator(removeOneMutably),\r\n removeMany: createStateOperator(removeManyMutably),\r\n }\r\n}\r\n","import type {\r\n EntityDefinition,\r\n Comparer,\r\n IdSelector,\r\n EntityAdapter,\r\n} from './models'\r\nimport { createInitialStateFactory } from './entity_state'\r\nimport { createSelectorsFactory } from './state_selectors'\r\nimport { createSortedStateAdapter } from './sorted_state_adapter'\r\nimport { createUnsortedStateAdapter } from './unsorted_state_adapter'\r\n\r\n/**\r\n *\r\n * @param options\r\n *\r\n * @public\r\n */\r\nexport function createEntityAdapter(\r\n options: {\r\n selectId?: IdSelector\r\n sortComparer?: false | Comparer\r\n } = {}\r\n): EntityAdapter {\r\n const { selectId, sortComparer }: EntityDefinition = {\r\n sortComparer: false,\r\n selectId: (instance: any) => instance.id,\r\n ...options,\r\n }\r\n\r\n const stateFactory = createInitialStateFactory()\r\n const selectorsFactory = createSelectorsFactory()\r\n const stateAdapter = sortComparer\r\n ? createSortedStateAdapter(selectId, sortComparer)\r\n : createUnsortedStateAdapter(selectId)\r\n\r\n return {\r\n selectId,\r\n sortComparer,\r\n ...stateFactory,\r\n ...selectorsFactory,\r\n ...stateAdapter,\r\n }\r\n}\r\n","import type { EntityState } from './models'\r\n\r\nexport function getInitialEntityState(): EntityState {\r\n return {\r\n ids: [],\r\n entities: {},\r\n }\r\n}\r\n\r\nexport function createInitialStateFactory() {\r\n function getInitialState(): EntityState\r\n function getInitialState(\r\n additionalState: S\r\n ): EntityState & S\r\n function getInitialState(additionalState: any = {}): any {\r\n return Object.assign(getInitialEntityState(), additionalState)\r\n }\r\n\r\n return { getInitialState }\r\n}\r\n","import { createDraftSafeSelector } from '../createDraftSafeSelector'\r\nimport type {\r\n EntityState,\r\n EntitySelectors,\r\n Dictionary,\r\n EntityId,\r\n} from './models'\r\n\r\nexport function createSelectorsFactory() {\r\n function getSelectors(): EntitySelectors>\r\n function getSelectors(\r\n selectState: (state: V) => EntityState\r\n ): EntitySelectors\r\n function getSelectors(\r\n selectState?: (state: any) => EntityState\r\n ): EntitySelectors {\r\n const selectIds = (state: any) => state.ids\r\n\r\n const selectEntities = (state: EntityState) => state.entities\r\n\r\n const selectAll = createDraftSafeSelector(\r\n selectIds,\r\n selectEntities,\r\n (ids: readonly T[], entities: Dictionary): any =>\r\n ids.map((id: any) => (entities as any)[id])\r\n )\r\n\r\n const selectId = (_: any, id: EntityId) => id\r\n\r\n const selectById = (entities: Dictionary, id: EntityId) => entities[id]\r\n\r\n const selectTotal = createDraftSafeSelector(selectIds, (ids) => ids.length)\r\n\r\n if (!selectState) {\r\n return {\r\n selectIds,\r\n selectEntities,\r\n selectAll,\r\n selectTotal,\r\n selectById: createDraftSafeSelector(\r\n selectEntities,\r\n selectId,\r\n selectById\r\n ),\r\n }\r\n }\r\n\r\n const selectGlobalizedEntities = createDraftSafeSelector(\r\n selectState,\r\n selectEntities\r\n )\r\n\r\n return {\r\n selectIds: createDraftSafeSelector(selectState, selectIds),\r\n selectEntities: selectGlobalizedEntities,\r\n selectAll: createDraftSafeSelector(selectState, selectAll),\r\n selectTotal: createDraftSafeSelector(selectState, selectTotal),\r\n selectById: createDraftSafeSelector(\r\n selectGlobalizedEntities,\r\n selectId,\r\n selectById\r\n ),\r\n }\r\n }\r\n\r\n return { getSelectors }\r\n}\r\n","import type {\r\n EntityState,\r\n IdSelector,\r\n Comparer,\r\n EntityStateAdapter,\r\n Update,\r\n EntityId,\r\n} from './models'\r\nimport { createStateOperator } from './state_adapter'\r\nimport { createUnsortedStateAdapter } from './unsorted_state_adapter'\r\nimport {\r\n selectIdValue,\r\n ensureEntitiesArray,\r\n splitAddedUpdatedEntities,\r\n} from './utils'\r\n\r\nexport function createSortedStateAdapter(\r\n selectId: IdSelector,\r\n sort: Comparer\r\n): EntityStateAdapter {\r\n type R = EntityState\r\n\r\n const { removeOne, removeMany, removeAll } =\r\n createUnsortedStateAdapter(selectId)\r\n\r\n function addOneMutably(entity: T, state: R): void {\r\n return addManyMutably([entity], state)\r\n }\r\n\r\n function addManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n\r\n const models = newEntities.filter(\r\n (model) => !(selectIdValue(model, selectId) in state.entities)\r\n )\r\n\r\n if (models.length !== 0) {\r\n merge(models, state)\r\n }\r\n }\r\n\r\n function setOneMutably(entity: T, state: R): void {\r\n return setManyMutably([entity], state)\r\n }\r\n\r\n function setManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n if (newEntities.length !== 0) {\r\n merge(newEntities, state)\r\n }\r\n }\r\n\r\n function setAllMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n newEntities = ensureEntitiesArray(newEntities)\r\n state.entities = {}\r\n state.ids = []\r\n\r\n addManyMutably(newEntities, state)\r\n }\r\n\r\n function updateOneMutably(update: Update, state: R): void {\r\n return updateManyMutably([update], state)\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\r\n function takeUpdatedModel(models: T[], update: Update, state: R): boolean {\r\n if (!(update.id in state.entities)) {\r\n return false\r\n }\r\n\r\n const original = state.entities[update.id]\r\n const updated = Object.assign({}, original, update.changes)\r\n const newKey = selectIdValue(updated, selectId)\r\n\r\n delete state.entities[update.id]\r\n\r\n models.push(updated)\r\n\r\n return newKey !== update.id\r\n }\r\n\r\n function updateManyMutably(\r\n updates: ReadonlyArray>,\r\n state: R\r\n ): void {\r\n const models: T[] = []\r\n\r\n updates.forEach((update) => takeUpdatedModel(models, update, state))\r\n\r\n if (models.length !== 0) {\r\n merge(models, state)\r\n }\r\n }\r\n\r\n function upsertOneMutably(entity: T, state: R): void {\r\n return upsertManyMutably([entity], state)\r\n }\r\n\r\n function upsertManyMutably(\r\n newEntities: readonly T[] | Record,\r\n state: R\r\n ): void {\r\n const [added, updated] = splitAddedUpdatedEntities(\r\n newEntities,\r\n selectId,\r\n state\r\n )\r\n\r\n updateManyMutably(updated, state)\r\n addManyMutably(added, state)\r\n }\r\n\r\n function areArraysEqual(a: readonly unknown[], b: readonly unknown[]) {\r\n if (a.length !== b.length) {\r\n return false\r\n }\r\n\r\n for (let i = 0; i < a.length && i < b.length; i++) {\r\n if (a[i] === b[i]) {\r\n continue\r\n }\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n function merge(models: readonly T[], state: R): void {\r\n // Insert/overwrite all new/updated\r\n models.forEach((model) => {\r\n state.entities[selectId(model)] = model\r\n })\r\n\r\n const allEntities = Object.values(state.entities) as T[]\r\n allEntities.sort(sort)\r\n\r\n const newSortedIds = allEntities.map(selectId)\r\n const { ids } = state\r\n\r\n if (!areArraysEqual(ids, newSortedIds)) {\r\n state.ids = newSortedIds\r\n }\r\n }\r\n\r\n return {\r\n removeOne,\r\n removeMany,\r\n removeAll,\r\n addOne: createStateOperator(addOneMutably),\r\n updateOne: createStateOperator(updateOneMutably),\r\n upsertOne: createStateOperator(upsertOneMutably),\r\n setOne: createStateOperator(setOneMutably),\r\n setMany: createStateOperator(setManyMutably),\r\n setAll: createStateOperator(setAllMutably),\r\n addMany: createStateOperator(addManyMutably),\r\n updateMany: createStateOperator(updateManyMutably),\r\n upsertMany: createStateOperator(upsertManyMutably),\r\n }\r\n}\r\n","// Borrowed from https://github.com/ai/nanoid/blob/3.0.2/non-secure/index.js\r\n// This alphabet uses `A-Za-z0-9_-` symbols. A genetic algorithm helped\r\n// optimize the gzip compression for this alphabet.\r\nlet urlAlphabet =\r\n 'ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW'\r\n\r\n/**\r\n *\r\n * @public\r\n */\r\nexport let nanoid = (size = 21) => {\r\n let id = ''\r\n // A compact alternative for `for (var i = 0; i < step; i++)`.\r\n let i = size\r\n while (i--) {\r\n // `| 0` is more compact and faster than `Math.floor()`.\r\n id += urlAlphabet[(Math.random() * 64) | 0]\r\n }\r\n return id\r\n}\r\n","import type { Dispatch, AnyAction } from 'redux'\r\nimport type {\r\n PayloadAction,\r\n ActionCreatorWithPreparedPayload,\r\n} from './createAction'\r\nimport { createAction } from './createAction'\r\nimport type { ThunkDispatch } from 'redux-thunk'\r\nimport type { FallbackIfUnknown, IsAny, IsUnknown } from './tsHelpers'\r\nimport { nanoid } from './nanoid'\r\n\r\n// @ts-ignore we need the import of these types due to a bundling issue.\r\ntype _Keep = PayloadAction | ActionCreatorWithPreparedPayload\r\n\r\nexport type BaseThunkAPI<\r\n S,\r\n E,\r\n D extends Dispatch = Dispatch,\r\n RejectedValue = undefined,\r\n RejectedMeta = unknown,\r\n FulfilledMeta = unknown\r\n> = {\r\n dispatch: D\r\n getState: () => S\r\n extra: E\r\n requestId: string\r\n signal: AbortSignal\r\n rejectWithValue: IsUnknown<\r\n RejectedMeta,\r\n (value: RejectedValue) => RejectWithValue,\r\n (\r\n value: RejectedValue,\r\n meta: RejectedMeta\r\n ) => RejectWithValue\r\n >\r\n fulfillWithValue: IsUnknown<\r\n FulfilledMeta,\r\n (\r\n value: FulfilledValue\r\n ) => FulfillWithMeta,\r\n (\r\n value: FulfilledValue,\r\n meta: FulfilledMeta\r\n ) => FulfillWithMeta\r\n >\r\n}\r\n\r\n/**\r\n * @public\r\n */\r\nexport interface SerializedError {\r\n name?: string\r\n message?: string\r\n stack?: string\r\n code?: string\r\n}\r\n\r\nconst commonProperties: Array = [\r\n 'name',\r\n 'message',\r\n 'stack',\r\n 'code',\r\n]\r\n\r\nclass RejectWithValue {\r\n /*\r\n type-only property to distinguish between RejectWithValue and FulfillWithMeta\r\n does not exist at runtime\r\n */\r\n private readonly _type!: 'RejectWithValue'\r\n constructor(\r\n public readonly payload: Payload,\r\n public readonly meta: RejectedMeta\r\n ) {}\r\n}\r\n\r\nclass FulfillWithMeta {\r\n /*\r\n type-only property to distinguish between RejectWithValue and FulfillWithMeta\r\n does not exist at runtime\r\n */\r\n private readonly _type!: 'FulfillWithMeta'\r\n constructor(\r\n public readonly payload: Payload,\r\n public readonly meta: FulfilledMeta\r\n ) {}\r\n}\r\n\r\n/**\r\n * Serializes an error into a plain object.\r\n * Reworked from https://github.com/sindresorhus/serialize-error\r\n *\r\n * @public\r\n */\r\nexport const miniSerializeError = (value: any): SerializedError => {\r\n if (typeof value === 'object' && value !== null) {\r\n const simpleError: SerializedError = {}\r\n for (const property of commonProperties) {\r\n if (typeof value[property] === 'string') {\r\n simpleError[property] = value[property]\r\n }\r\n }\r\n\r\n return simpleError\r\n }\r\n\r\n return { message: String(value) }\r\n}\r\n\r\ntype AsyncThunkConfig = {\r\n state?: unknown\r\n dispatch?: Dispatch\r\n extra?: unknown\r\n rejectValue?: unknown\r\n serializedErrorType?: unknown\r\n pendingMeta?: unknown\r\n fulfilledMeta?: unknown\r\n rejectedMeta?: unknown\r\n}\r\n\r\ntype GetState = ThunkApiConfig extends {\r\n state: infer State\r\n}\r\n ? State\r\n : unknown\r\ntype GetExtra = ThunkApiConfig extends { extra: infer Extra }\r\n ? Extra\r\n : unknown\r\ntype GetDispatch = ThunkApiConfig extends {\r\n dispatch: infer Dispatch\r\n}\r\n ? FallbackIfUnknown<\r\n Dispatch,\r\n ThunkDispatch<\r\n GetState,\r\n GetExtra,\r\n AnyAction\r\n >\r\n >\r\n : ThunkDispatch, GetExtra, AnyAction>\r\n\r\ntype GetThunkAPI = BaseThunkAPI<\r\n GetState,\r\n GetExtra,\r\n GetDispatch,\r\n GetRejectValue,\r\n GetRejectedMeta,\r\n GetFulfilledMeta\r\n>\r\n\r\ntype GetRejectValue = ThunkApiConfig extends {\r\n rejectValue: infer RejectValue\r\n}\r\n ? RejectValue\r\n : unknown\r\n\r\ntype GetPendingMeta = ThunkApiConfig extends {\r\n pendingMeta: infer PendingMeta\r\n}\r\n ? PendingMeta\r\n : unknown\r\n\r\ntype GetFulfilledMeta = ThunkApiConfig extends {\r\n fulfilledMeta: infer FulfilledMeta\r\n}\r\n ? FulfilledMeta\r\n : unknown\r\n\r\ntype GetRejectedMeta = ThunkApiConfig extends {\r\n rejectedMeta: infer RejectedMeta\r\n}\r\n ? RejectedMeta\r\n : unknown\r\n\r\ntype GetSerializedErrorType = ThunkApiConfig extends {\r\n serializedErrorType: infer GetSerializedErrorType\r\n}\r\n ? GetSerializedErrorType\r\n : SerializedError\r\n\r\ntype MaybePromise = T | Promise | (T extends any ? Promise : never)\r\n\r\n/**\r\n * A type describing the return value of the `payloadCreator` argument to `createAsyncThunk`.\r\n * Might be useful for wrapping `createAsyncThunk` in custom abstractions.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunkPayloadCreatorReturnValue<\r\n Returned,\r\n ThunkApiConfig extends AsyncThunkConfig\r\n> = MaybePromise<\r\n | IsUnknown<\r\n GetFulfilledMeta,\r\n Returned,\r\n FulfillWithMeta>\r\n >\r\n | RejectWithValue<\r\n GetRejectValue,\r\n GetRejectedMeta\r\n >\r\n>\r\n/**\r\n * A type describing the `payloadCreator` argument to `createAsyncThunk`.\r\n * Might be useful for wrapping `createAsyncThunk` in custom abstractions.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunkPayloadCreator<\r\n Returned,\r\n ThunkArg = void,\r\n ThunkApiConfig extends AsyncThunkConfig = {}\r\n> = (\r\n arg: ThunkArg,\r\n thunkAPI: GetThunkAPI\r\n) => AsyncThunkPayloadCreatorReturnValue\r\n\r\n/**\r\n * A ThunkAction created by `createAsyncThunk`.\r\n * Dispatching it returns a Promise for either a\r\n * fulfilled or rejected action.\r\n * Also, the returned value contains an `abort()` method\r\n * that allows the asyncAction to be cancelled from the outside.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunkAction<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig extends AsyncThunkConfig\r\n> = (\r\n dispatch: GetDispatch,\r\n getState: () => GetState,\r\n extra: GetExtra\r\n) => Promise<\r\n | ReturnType>\r\n | ReturnType>\r\n> & {\r\n abort: (reason?: string) => void\r\n requestId: string\r\n arg: ThunkArg\r\n unwrap: () => Promise\r\n}\r\n\r\ntype AsyncThunkActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig extends AsyncThunkConfig\r\n> = IsAny<\r\n ThunkArg,\r\n // any handling\r\n (arg: ThunkArg) => AsyncThunkAction,\r\n // unknown handling\r\n unknown extends ThunkArg\r\n ? (arg: ThunkArg) => AsyncThunkAction // argument not specified or specified as void or undefined\r\n : [ThunkArg] extends [void] | [undefined]\r\n ? () => AsyncThunkAction // argument contains void\r\n : [void] extends [ThunkArg] // make optional\r\n ? (arg?: ThunkArg) => AsyncThunkAction // argument contains undefined\r\n : [undefined] extends [ThunkArg]\r\n ? WithStrictNullChecks<\r\n // with strict nullChecks: make optional\r\n (\r\n arg?: ThunkArg\r\n ) => AsyncThunkAction,\r\n // without strict null checks this will match everything, so don't make it optional\r\n (arg: ThunkArg) => AsyncThunkAction\r\n > // default case: normal argument\r\n : (arg: ThunkArg) => AsyncThunkAction\r\n>\r\n\r\n/**\r\n * Options object for `createAsyncThunk`.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunkOptions<\r\n ThunkArg = void,\r\n ThunkApiConfig extends AsyncThunkConfig = {}\r\n> = {\r\n /**\r\n * A method to control whether the asyncThunk should be executed. Has access to the\r\n * `arg`, `api.getState()` and `api.extra` arguments.\r\n *\r\n * @returns `false` if it should be skipped\r\n */\r\n condition?(\r\n arg: ThunkArg,\r\n api: Pick, 'getState' | 'extra'>\r\n ): boolean | undefined\r\n /**\r\n * If `condition` returns `false`, the asyncThunk will be skipped.\r\n * This option allows you to control whether a `rejected` action with `meta.condition == false`\r\n * will be dispatched or not.\r\n *\r\n * @default `false`\r\n */\r\n dispatchConditionRejection?: boolean\r\n\r\n serializeError?: (x: unknown) => GetSerializedErrorType\r\n\r\n /**\r\n * A function to use when generating the `requestId` for the request sequence.\r\n *\r\n * @default `nanoid`\r\n */\r\n idGenerator?: () => string\r\n} & IsUnknown<\r\n GetPendingMeta,\r\n {\r\n /**\r\n * A method to generate additional properties to be added to `meta` of the pending action.\r\n *\r\n * Using this optional overload will not modify the types correctly, this overload is only in place to support JavaScript users.\r\n * Please use the `ThunkApiConfig` parameter `pendingMeta` to get access to a correctly typed overload\r\n */\r\n getPendingMeta?(\r\n base: {\r\n arg: ThunkArg\r\n requestId: string\r\n },\r\n api: Pick, 'getState' | 'extra'>\r\n ): GetPendingMeta\r\n },\r\n {\r\n /**\r\n * A method to generate additional properties to be added to `meta` of the pending action.\r\n */\r\n getPendingMeta(\r\n base: {\r\n arg: ThunkArg\r\n requestId: string\r\n },\r\n api: Pick, 'getState' | 'extra'>\r\n ): GetPendingMeta\r\n }\r\n>\r\n\r\nexport type AsyncThunkPendingActionCreator<\r\n ThunkArg,\r\n ThunkApiConfig = {}\r\n> = ActionCreatorWithPreparedPayload<\r\n [string, ThunkArg, GetPendingMeta?],\r\n undefined,\r\n string,\r\n never,\r\n {\r\n arg: ThunkArg\r\n requestId: string\r\n requestStatus: 'pending'\r\n } & GetPendingMeta\r\n>\r\n\r\nexport type AsyncThunkRejectedActionCreator<\r\n ThunkArg,\r\n ThunkApiConfig = {}\r\n> = ActionCreatorWithPreparedPayload<\r\n [\r\n Error | null,\r\n string,\r\n ThunkArg,\r\n GetRejectValue?,\r\n GetRejectedMeta?\r\n ],\r\n GetRejectValue | undefined,\r\n string,\r\n GetSerializedErrorType,\r\n {\r\n arg: ThunkArg\r\n requestId: string\r\n requestStatus: 'rejected'\r\n aborted: boolean\r\n condition: boolean\r\n } & (\r\n | ({ rejectedWithValue: false } & {\r\n [K in keyof GetRejectedMeta]?: undefined\r\n })\r\n | ({ rejectedWithValue: true } & GetRejectedMeta)\r\n )\r\n>\r\n\r\nexport type AsyncThunkFulfilledActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig = {}\r\n> = ActionCreatorWithPreparedPayload<\r\n [Returned, string, ThunkArg, GetFulfilledMeta?],\r\n Returned,\r\n string,\r\n never,\r\n {\r\n arg: ThunkArg\r\n requestId: string\r\n requestStatus: 'fulfilled'\r\n } & GetFulfilledMeta\r\n>\r\n\r\n/**\r\n * A type describing the return value of `createAsyncThunk`.\r\n * Might be useful for wrapping `createAsyncThunk` in custom abstractions.\r\n *\r\n * @public\r\n */\r\nexport type AsyncThunk<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig extends AsyncThunkConfig\r\n> = AsyncThunkActionCreator & {\r\n pending: AsyncThunkPendingActionCreator\r\n rejected: AsyncThunkRejectedActionCreator\r\n fulfilled: AsyncThunkFulfilledActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig\r\n >\r\n typePrefix: string\r\n}\r\n\r\n/**\r\n *\r\n * @param typePrefix\r\n * @param payloadCreator\r\n * @param options\r\n *\r\n * @public\r\n */\r\nexport function createAsyncThunk<\r\n Returned,\r\n ThunkArg = void,\r\n ThunkApiConfig extends AsyncThunkConfig = {}\r\n>(\r\n typePrefix: string,\r\n payloadCreator: AsyncThunkPayloadCreator,\r\n options?: AsyncThunkOptions\r\n): AsyncThunk {\r\n type RejectedValue = GetRejectValue\r\n type PendingMeta = GetPendingMeta\r\n type FulfilledMeta = GetFulfilledMeta\r\n type RejectedMeta = GetRejectedMeta\r\n\r\n const fulfilled: AsyncThunkFulfilledActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig\r\n > = createAction(\r\n typePrefix + '/fulfilled',\r\n (\r\n payload: Returned,\r\n requestId: string,\r\n arg: ThunkArg,\r\n meta?: FulfilledMeta\r\n ) => ({\r\n payload,\r\n meta: {\r\n ...((meta as any) || {}),\r\n arg,\r\n requestId,\r\n requestStatus: 'fulfilled' as const,\r\n },\r\n })\r\n )\r\n\r\n const pending: AsyncThunkPendingActionCreator =\r\n createAction(\r\n typePrefix + '/pending',\r\n (requestId: string, arg: ThunkArg, meta?: PendingMeta) => ({\r\n payload: undefined,\r\n meta: {\r\n ...((meta as any) || {}),\r\n arg,\r\n requestId,\r\n requestStatus: 'pending' as const,\r\n },\r\n })\r\n )\r\n\r\n const rejected: AsyncThunkRejectedActionCreator =\r\n createAction(\r\n typePrefix + '/rejected',\r\n (\r\n error: Error | null,\r\n requestId: string,\r\n arg: ThunkArg,\r\n payload?: RejectedValue,\r\n meta?: RejectedMeta\r\n ) => ({\r\n payload,\r\n error: ((options && options.serializeError) || miniSerializeError)(\r\n error || 'Rejected'\r\n ) as GetSerializedErrorType,\r\n meta: {\r\n ...((meta as any) || {}),\r\n arg,\r\n requestId,\r\n rejectedWithValue: !!payload,\r\n requestStatus: 'rejected' as const,\r\n aborted: error?.name === 'AbortError',\r\n condition: error?.name === 'ConditionError',\r\n },\r\n })\r\n )\r\n\r\n let displayedWarning = false\r\n\r\n const AC =\r\n typeof AbortController !== 'undefined'\r\n ? AbortController\r\n : class implements AbortController {\r\n signal: AbortSignal = {\r\n aborted: false,\r\n addEventListener() {},\r\n dispatchEvent() {\r\n return false\r\n },\r\n onabort() {},\r\n removeEventListener() {},\r\n }\r\n abort() {\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (!displayedWarning) {\r\n displayedWarning = true\r\n console.info(\r\n `This platform does not implement AbortController. \r\nIf you want to use the AbortController to react to \\`abort\\` events, please consider importing a polyfill like 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only'.`\r\n )\r\n }\r\n }\r\n }\r\n }\r\n\r\n function actionCreator(\r\n arg: ThunkArg\r\n ): AsyncThunkAction {\r\n return (dispatch, getState, extra) => {\r\n const requestId = (options?.idGenerator ?? nanoid)()\r\n\r\n const abortController = new AC()\r\n let abortReason: string | undefined\r\n\r\n const abortedPromise = new Promise((_, reject) =>\r\n abortController.signal.addEventListener('abort', () =>\r\n reject({ name: 'AbortError', message: abortReason || 'Aborted' })\r\n )\r\n )\r\n\r\n let started = false\r\n function abort(reason?: string) {\r\n if (started) {\r\n abortReason = reason\r\n abortController.abort()\r\n }\r\n }\r\n\r\n const promise = (async function () {\r\n let finalAction: ReturnType\r\n try {\r\n if (\r\n options &&\r\n options.condition &&\r\n options.condition(arg, { getState, extra }) === false\r\n ) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw {\r\n name: 'ConditionError',\r\n message: 'Aborted due to condition callback returning false.',\r\n }\r\n }\r\n started = true\r\n dispatch(\r\n pending(\r\n requestId,\r\n arg,\r\n options?.getPendingMeta?.({ requestId, arg }, { getState, extra })\r\n )\r\n )\r\n finalAction = await Promise.race([\r\n abortedPromise,\r\n Promise.resolve(\r\n payloadCreator(arg, {\r\n dispatch,\r\n getState,\r\n extra,\r\n requestId,\r\n signal: abortController.signal,\r\n rejectWithValue: ((\r\n value: RejectedValue,\r\n meta?: RejectedMeta\r\n ) => {\r\n return new RejectWithValue(value, meta)\r\n }) as any,\r\n fulfillWithValue: ((value: unknown, meta?: FulfilledMeta) => {\r\n return new FulfillWithMeta(value, meta)\r\n }) as any,\r\n })\r\n ).then((result) => {\r\n if (result instanceof RejectWithValue) {\r\n throw result\r\n }\r\n if (result instanceof FulfillWithMeta) {\r\n return fulfilled(result.payload, requestId, arg, result.meta)\r\n }\r\n return fulfilled(result as any, requestId, arg)\r\n }),\r\n ])\r\n } catch (err) {\r\n finalAction =\r\n err instanceof RejectWithValue\r\n ? rejected(null, requestId, arg, err.payload, err.meta)\r\n : rejected(err as any, requestId, arg)\r\n }\r\n // We dispatch the result action _after_ the catch, to avoid having any errors\r\n // here get swallowed by the try/catch block,\r\n // per https://twitter.com/dan_abramov/status/770914221638942720\r\n // and https://github.com/reduxjs/redux-toolkit/blob/e85eb17b39a2118d859f7b7746e0f3fee523e089/docs/tutorials/advanced-tutorial.md#async-error-handling-logic-in-thunks\r\n\r\n const skipDispatch =\r\n options &&\r\n !options.dispatchConditionRejection &&\r\n rejected.match(finalAction) &&\r\n (finalAction as any).meta.condition\r\n\r\n if (!skipDispatch) {\r\n dispatch(finalAction)\r\n }\r\n return finalAction\r\n })()\r\n return Object.assign(promise as Promise, {\r\n abort,\r\n requestId,\r\n arg,\r\n unwrap() {\r\n return promise.then(unwrapResult)\r\n },\r\n })\r\n }\r\n }\r\n\r\n return Object.assign(\r\n actionCreator as AsyncThunkActionCreator<\r\n Returned,\r\n ThunkArg,\r\n ThunkApiConfig\r\n >,\r\n {\r\n pending,\r\n rejected,\r\n fulfilled,\r\n typePrefix,\r\n }\r\n )\r\n}\r\n\r\ninterface UnwrappableAction {\r\n payload: any\r\n meta?: any\r\n error?: any\r\n}\r\n\r\ntype UnwrappedActionPayload = Exclude<\r\n T,\r\n { error: any }\r\n>['payload']\r\n\r\n/**\r\n * @public\r\n */\r\nexport function unwrapResult(\r\n action: R\r\n): UnwrappedActionPayload {\r\n if (action.meta && action.meta.rejectedWithValue) {\r\n throw action.payload\r\n }\r\n if (action.error) {\r\n throw action.error\r\n }\r\n return action.payload\r\n}\r\n\r\ntype WithStrictNullChecks = undefined extends boolean\r\n ? False\r\n : True\r\n","import type { Middleware } from 'redux'\r\n\r\n/**\r\n * return True if T is `any`, otherwise return False\r\n * taken from https://github.com/joonhocho/tsdef\r\n *\r\n * @internal\r\n */\r\nexport type IsAny =\r\n // test if we are going the left AND right path in the condition\r\n true | false extends (T extends never ? true : false) ? True : False\r\n\r\n/**\r\n * return True if T is `unknown`, otherwise return False\r\n * taken from https://github.com/joonhocho/tsdef\r\n *\r\n * @internal\r\n */\r\nexport type IsUnknown = unknown extends T\r\n ? IsAny\r\n : False\r\n\r\nexport type FallbackIfUnknown = IsUnknown\r\n\r\n/**\r\n * @internal\r\n */\r\nexport type IfMaybeUndefined = [undefined] extends [P]\r\n ? True\r\n : False\r\n\r\n/**\r\n * @internal\r\n */\r\nexport type IfVoid = [void] extends [P] ? True : False\r\n\r\n/**\r\n * @internal\r\n */\r\nexport type IsEmptyObj = T extends any\r\n ? keyof T extends never\r\n ? IsUnknown>>\r\n : False\r\n : never\r\n\r\n/**\r\n * returns True if TS version is above 3.5, False if below.\r\n * uses feature detection to detect TS version >= 3.5\r\n * * versions below 3.5 will return `{}` for unresolvable interference\r\n * * versions above will return `unknown`\r\n *\r\n * @internal\r\n */\r\nexport type AtLeastTS35 = [True, False][IsUnknown<\r\n ReturnType<() => T>,\r\n 0,\r\n 1\r\n>]\r\n\r\n/**\r\n * @internal\r\n */\r\nexport type IsUnknownOrNonInferrable = AtLeastTS35<\r\n IsUnknown,\r\n IsEmptyObj>\r\n>\r\n\r\n/**\r\n * Combines all dispatch signatures of all middlewares in the array `M` into\r\n * one intersected dispatch signature.\r\n */\r\nexport type DispatchForMiddlewares = M extends ReadonlyArray\r\n ? UnionToIntersection<\r\n M[number] extends infer MiddlewareValues\r\n ? MiddlewareValues extends Middleware\r\n ? DispatchExt extends Function\r\n ? IsAny\r\n : never\r\n : never\r\n : never\r\n >\r\n : never\r\n\r\n/**\r\n * Convert a Union type `(A|B)` to an intersection type `(A&B)`\r\n */\r\nexport type UnionToIntersection = (\r\n U extends any ? (k: U) => void : never\r\n) extends (k: infer I) => void\r\n ? I\r\n : never\r\n\r\n/**\r\n * Helper type. Passes T out again, but boxes it in a way that it cannot\r\n * \"widen\" the type by accident if it is a generic that should be inferred\r\n * from elsewhere.\r\n *\r\n * @internal\r\n */\r\nexport type NoInfer = [T][T extends any ? 0 : never]\r\n\r\nexport type Omit = Pick>\r\n\r\nexport interface HasMatchFunction {\r\n match: (v: any) => v is T\r\n}\r\n\r\nexport const hasMatchFunction = (\r\n v: Matcher\r\n): v is HasMatchFunction => {\r\n return v && typeof (v as HasMatchFunction).match === 'function'\r\n}\r\n\r\n/** @public */\r\nexport type Matcher = HasMatchFunction | ((v: any) => v is T)\r\n\r\n/** @public */\r\nexport type ActionFromMatcher> = M extends Matcher<\r\n infer T\r\n>\r\n ? T\r\n : never\r\n","import type {\r\n ActionFromMatcher,\r\n Matcher,\r\n UnionToIntersection,\r\n} from './tsHelpers'\r\nimport { hasMatchFunction } from './tsHelpers'\r\nimport type {\r\n AsyncThunk,\r\n AsyncThunkFulfilledActionCreator,\r\n AsyncThunkPendingActionCreator,\r\n AsyncThunkRejectedActionCreator,\r\n} from './createAsyncThunk'\r\n\r\n/** @public */\r\nexport type ActionMatchingAnyOf<\r\n Matchers extends [Matcher, ...Matcher[]]\r\n> = ActionFromMatcher\r\n\r\n/** @public */\r\nexport type ActionMatchingAllOf<\r\n Matchers extends [Matcher, ...Matcher[]]\r\n> = UnionToIntersection>\r\n\r\nconst matches = (matcher: Matcher, action: any) => {\r\n if (hasMatchFunction(matcher)) {\r\n return matcher.match(action)\r\n } else {\r\n return matcher(action)\r\n }\r\n}\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action matches any one of the supplied type guards or action\r\n * creators.\r\n *\r\n * @param matchers The type guards or action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isAnyOf, ...Matcher[]]>(\r\n ...matchers: Matchers\r\n) {\r\n return (action: any): action is ActionMatchingAnyOf => {\r\n return matchers.some((matcher) => matches(matcher, action))\r\n }\r\n}\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action matches all of the supplied type guards or action\r\n * creators.\r\n *\r\n * @param matchers The type guards or action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isAllOf, ...Matcher[]]>(\r\n ...matchers: Matchers\r\n) {\r\n return (action: any): action is ActionMatchingAllOf => {\r\n return matchers.every((matcher) => matches(matcher, action))\r\n }\r\n}\r\n\r\n/**\r\n * @param action A redux action\r\n * @param validStatus An array of valid meta.requestStatus values\r\n *\r\n * @internal\r\n */\r\nexport function hasExpectedRequestMetadata(\r\n action: any,\r\n validStatus: readonly string[]\r\n) {\r\n if (!action || !action.meta) return false\r\n\r\n const hasValidRequestId = typeof action.meta.requestId === 'string'\r\n const hasValidRequestStatus =\r\n validStatus.indexOf(action.meta.requestStatus) > -1\r\n\r\n return hasValidRequestId && hasValidRequestStatus\r\n}\r\n\r\nfunction isAsyncThunkArray(a: [any] | AnyAsyncThunk[]): a is AnyAsyncThunk[] {\r\n return (\r\n typeof a[0] === 'function' &&\r\n 'pending' in a[0] &&\r\n 'fulfilled' in a[0] &&\r\n 'rejected' in a[0]\r\n )\r\n}\r\n\r\nexport type UnknownAsyncThunkPendingAction = ReturnType<\r\n AsyncThunkPendingActionCreator\r\n>\r\n\r\nexport type PendingActionFromAsyncThunk =\r\n ActionFromMatcher\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator, and that\r\n * the action is pending.\r\n *\r\n * @public\r\n */\r\nexport function isPending(): (\r\n action: any\r\n) => action is UnknownAsyncThunkPendingAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators,\r\n * and that the action is pending.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isPending<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (action: any) => action is PendingActionFromAsyncThunk\r\n/**\r\n * Tests if `action` is a pending thunk action\r\n * @public\r\n */\r\nexport function isPending(action: any): action is UnknownAsyncThunkPendingAction\r\nexport function isPending<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n if (asyncThunks.length === 0) {\r\n return (action: any) => hasExpectedRequestMetadata(action, ['pending'])\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isPending()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is PendingActionFromAsyncThunk => {\r\n // note: this type will be correct because we have at least 1 asyncThunk\r\n const matchers: [Matcher, ...Matcher[]] = asyncThunks.map(\r\n (asyncThunk) => asyncThunk.pending\r\n ) as any\r\n\r\n const combinedMatcher = isAnyOf(...matchers)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n\r\nexport type UnknownAsyncThunkRejectedAction = ReturnType<\r\n AsyncThunkRejectedActionCreator\r\n>\r\n\r\nexport type RejectedActionFromAsyncThunk =\r\n ActionFromMatcher\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator, and that\r\n * the action is rejected.\r\n *\r\n * @public\r\n */\r\nexport function isRejected(): (\r\n action: any\r\n) => action is UnknownAsyncThunkRejectedAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators,\r\n * and that the action is rejected.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isRejected<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (action: any) => action is RejectedActionFromAsyncThunk\r\n/**\r\n * Tests if `action` is a rejected thunk action\r\n * @public\r\n */\r\nexport function isRejected(\r\n action: any\r\n): action is UnknownAsyncThunkRejectedAction\r\nexport function isRejected<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n if (asyncThunks.length === 0) {\r\n return (action: any) => hasExpectedRequestMetadata(action, ['rejected'])\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isRejected()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is RejectedActionFromAsyncThunk => {\r\n // note: this type will be correct because we have at least 1 asyncThunk\r\n const matchers: [Matcher, ...Matcher[]] = asyncThunks.map(\r\n (asyncThunk) => asyncThunk.rejected\r\n ) as any\r\n\r\n const combinedMatcher = isAnyOf(...matchers)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n\r\nexport type UnknownAsyncThunkRejectedWithValueAction = ReturnType<\r\n AsyncThunkRejectedActionCreator\r\n>\r\n\r\nexport type RejectedWithValueActionFromAsyncThunk =\r\n ActionFromMatcher &\r\n (T extends AsyncThunk\r\n ? { payload: RejectedValue }\r\n : unknown)\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator, and that\r\n * the action is rejected with value.\r\n *\r\n * @public\r\n */\r\nexport function isRejectedWithValue(): (\r\n action: any\r\n) => action is UnknownAsyncThunkRejectedAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators,\r\n * and that the action is rejected with value.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isRejectedWithValue<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (\r\n action: any\r\n) => action is RejectedWithValueActionFromAsyncThunk\r\n/**\r\n * Tests if `action` is a rejected thunk action with value\r\n * @public\r\n */\r\nexport function isRejectedWithValue(\r\n action: any\r\n): action is UnknownAsyncThunkRejectedAction\r\nexport function isRejectedWithValue<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n const hasFlag = (action: any): action is any => {\r\n return action && action.meta && action.meta.rejectedWithValue\r\n }\r\n\r\n if (asyncThunks.length === 0) {\r\n return (action: any) => {\r\n const combinedMatcher = isAllOf(isRejected(...asyncThunks), hasFlag)\r\n\r\n return combinedMatcher(action)\r\n }\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isRejectedWithValue()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is RejectedActionFromAsyncThunk => {\r\n const combinedMatcher = isAllOf(isRejected(...asyncThunks), hasFlag)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n\r\nexport type UnknownAsyncThunkFulfilledAction = ReturnType<\r\n AsyncThunkFulfilledActionCreator\r\n>\r\n\r\nexport type FulfilledActionFromAsyncThunk =\r\n ActionFromMatcher\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator, and that\r\n * the action is fulfilled.\r\n *\r\n * @public\r\n */\r\nexport function isFulfilled(): (\r\n action: any\r\n) => action is UnknownAsyncThunkFulfilledAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators,\r\n * and that the action is fulfilled.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isFulfilled<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (action: any) => action is FulfilledActionFromAsyncThunk\r\n/**\r\n * Tests if `action` is a fulfilled thunk action\r\n * @public\r\n */\r\nexport function isFulfilled(\r\n action: any\r\n): action is UnknownAsyncThunkFulfilledAction\r\nexport function isFulfilled<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n if (asyncThunks.length === 0) {\r\n return (action: any) => hasExpectedRequestMetadata(action, ['fulfilled'])\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isFulfilled()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is FulfilledActionFromAsyncThunk => {\r\n // note: this type will be correct because we have at least 1 asyncThunk\r\n const matchers: [Matcher, ...Matcher[]] = asyncThunks.map(\r\n (asyncThunk) => asyncThunk.fulfilled\r\n ) as any\r\n\r\n const combinedMatcher = isAnyOf(...matchers)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n\r\nexport type UnknownAsyncThunkAction =\r\n | UnknownAsyncThunkPendingAction\r\n | UnknownAsyncThunkRejectedAction\r\n | UnknownAsyncThunkFulfilledAction\r\n\r\nexport type AnyAsyncThunk = {\r\n pending: { match: (action: any) => action is any }\r\n fulfilled: { match: (action: any) => action is any }\r\n rejected: { match: (action: any) => action is any }\r\n}\r\n\r\nexport type ActionsFromAsyncThunk =\r\n | ActionFromMatcher\r\n | ActionFromMatcher\r\n | ActionFromMatcher\r\n\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action was created by an async thunk action creator.\r\n *\r\n * @public\r\n */\r\nexport function isAsyncThunkAction(): (\r\n action: any\r\n) => action is UnknownAsyncThunkAction\r\n/**\r\n * A higher-order function that returns a function that may be used to check\r\n * whether an action belongs to one of the provided async thunk action creators.\r\n *\r\n * @param asyncThunks (optional) The async thunk action creators to match against.\r\n *\r\n * @public\r\n */\r\nexport function isAsyncThunkAction<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(\r\n ...asyncThunks: AsyncThunks\r\n): (action: any) => action is ActionsFromAsyncThunk\r\n/**\r\n * Tests if `action` is a thunk action\r\n * @public\r\n */\r\nexport function isAsyncThunkAction(\r\n action: any\r\n): action is UnknownAsyncThunkAction\r\nexport function isAsyncThunkAction<\r\n AsyncThunks extends [AnyAsyncThunk, ...AnyAsyncThunk[]]\r\n>(...asyncThunks: AsyncThunks | [any]) {\r\n if (asyncThunks.length === 0) {\r\n return (action: any) =>\r\n hasExpectedRequestMetadata(action, ['pending', 'fulfilled', 'rejected'])\r\n }\r\n\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isAsyncThunkAction()(asyncThunks[0])\r\n }\r\n\r\n return (\r\n action: any\r\n ): action is ActionsFromAsyncThunk => {\r\n // note: this type will be correct because we have at least 1 asyncThunk\r\n const matchers: [Matcher, ...Matcher[]] = [] as any\r\n\r\n for (const asyncThunk of asyncThunks) {\r\n matchers.push(\r\n asyncThunk.pending,\r\n asyncThunk.rejected,\r\n asyncThunk.fulfilled\r\n )\r\n }\r\n\r\n const combinedMatcher = isAnyOf(...matchers)\r\n\r\n return combinedMatcher(action)\r\n }\r\n}\r\n"]} +diff --git a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.umd.js b/node_modules/@reduxjs/toolkit/dist/redux-toolkit.umd.js +deleted file mode 100644 +index ddfd2c2..0000000 +--- a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.umd.js ++++ /dev/null +@@ -1,2315 +0,0 @@ +-(function (global, factory) { +- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +- typeof define === 'function' && define.amd ? define(['exports'], factory) : +- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.RTK = {})); +-}(this, (function (exports) { 'use strict'; +- +- var __extends = (undefined && undefined.__extends) || (function () { +- var extendStatics = function (d, b) { +- extendStatics = Object.setPrototypeOf || +- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || +- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; +- return extendStatics(d, b); +- }; +- return function (d, b) { +- if (typeof b !== "function" && b !== null) +- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); +- extendStatics(d, b); +- function __() { this.constructor = d; } +- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +- }; +- })(); +- var __generator = (undefined && undefined.__generator) || function (thisArg, body) { +- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; +- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; +- function verb(n) { return function (v) { return step([n, v]); }; } +- function step(op) { +- if (f) throw new TypeError("Generator is already executing."); +- while (_) try { +- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; +- if (y = 0, t) op = [op[0] & 2, t.value]; +- switch (op[0]) { +- case 0: case 1: t = op; break; +- case 4: _.label++; return { value: op[1], done: false }; +- case 5: _.label++; y = op[1]; op = [0]; continue; +- case 7: op = _.ops.pop(); _.trys.pop(); continue; +- default: +- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } +- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } +- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } +- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } +- if (t[2]) _.ops.pop(); +- _.trys.pop(); continue; +- } +- op = body.call(thisArg, _); +- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } +- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; +- } +- }; +- var __spreadArray = (undefined && undefined.__spreadArray) || function (to, from) { +- for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) +- to[j] = from[i]; +- return to; +- }; +- var __defProp = Object.defineProperty; +- var __defProps = Object.defineProperties; +- var __getOwnPropDescs = Object.getOwnPropertyDescriptors; +- var __getOwnPropSymbols = Object.getOwnPropertySymbols; +- var __hasOwnProp = Object.prototype.hasOwnProperty; +- var __propIsEnum = Object.prototype.propertyIsEnumerable; +- var __defNormalProp = function (obj, key, value) { return key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value: value }) : obj[key] = value; }; +- var __spreadValues = function (a2, b2) { +- for (var prop in b2 || (b2 = {})) +- if (__hasOwnProp.call(b2, prop)) +- __defNormalProp(a2, prop, b2[prop]); +- if (__getOwnPropSymbols) +- for (var _b = 0, _c = __getOwnPropSymbols(b2); _b < _c.length; _b++) { +- var prop = _c[_b]; +- if (__propIsEnum.call(b2, prop)) +- __defNormalProp(a2, prop, b2[prop]); +- } +- return a2; +- }; +- var __spreadProps = function (a2, b2) { return __defProps(a2, __getOwnPropDescs(b2)); }; +- var __async = function (__this, __arguments, generator) { +- return new Promise(function (resolve, reject) { +- var fulfilled = function (value) { +- try { +- step(generator.next(value)); +- } +- catch (e2) { +- reject(e2); +- } +- }; +- var rejected = function (value) { +- try { +- step(generator.throw(value)); +- } +- catch (e2) { +- reject(e2); +- } +- }; +- var step = function (x2) { return x2.done ? resolve(x2.value) : Promise.resolve(x2.value).then(fulfilled, rejected); }; +- step((generator = generator.apply(__this, __arguments)).next()); +- }); +- }; +- // ../../node_modules/immer/dist/immer.esm.js +- function n(n2) { +- for (var t2 = arguments.length, r2 = Array(t2 > 1 ? t2 - 1 : 0), e2 = 1; e2 < t2; e2++) +- r2[e2 - 1] = arguments[e2]; +- { +- var i2 = Y[n2], o2 = i2 ? typeof i2 == "function" ? i2.apply(null, r2) : i2 : "unknown error nr: " + n2; +- throw Error("[Immer] " + o2); +- } +- } +- function t(n2) { +- return !!n2 && !!n2[Q]; +- } +- function r(n2) { +- return !!n2 && (function (n3) { +- if (!n3 || typeof n3 != "object") +- return false; +- var t2 = Object.getPrototypeOf(n3); +- if (t2 === null) +- return true; +- var r2 = Object.hasOwnProperty.call(t2, "constructor") && t2.constructor; +- return r2 === Object || typeof r2 == "function" && Function.toString.call(r2) === Z; +- }(n2) || Array.isArray(n2) || !!n2[L] || !!n2.constructor[L] || s(n2) || v(n2)); +- } +- function e(r2) { +- return t(r2) || n(23, r2), r2[Q].t; +- } +- function i(n2, t2, r2) { +- r2 === void 0 && (r2 = false), o(n2) === 0 ? (r2 ? Object.keys : nn)(n2).forEach(function (e2) { +- r2 && typeof e2 == "symbol" || t2(e2, n2[e2], n2); +- }) : n2.forEach(function (r3, e2) { +- return t2(e2, r3, n2); +- }); +- } +- function o(n2) { +- var t2 = n2[Q]; +- return t2 ? t2.i > 3 ? t2.i - 4 : t2.i : Array.isArray(n2) ? 1 : s(n2) ? 2 : v(n2) ? 3 : 0; +- } +- function u(n2, t2) { +- return o(n2) === 2 ? n2.has(t2) : Object.prototype.hasOwnProperty.call(n2, t2); +- } +- function a(n2, t2) { +- return o(n2) === 2 ? n2.get(t2) : n2[t2]; +- } +- function f(n2, t2, r2) { +- var e2 = o(n2); +- e2 === 2 ? n2.set(t2, r2) : e2 === 3 ? (n2.delete(t2), n2.add(r2)) : n2[t2] = r2; +- } +- function c(n2, t2) { +- return n2 === t2 ? n2 !== 0 || 1 / n2 == 1 / t2 : n2 != n2 && t2 != t2; +- } +- function s(n2) { +- return X && n2 instanceof Map; +- } +- function v(n2) { +- return q && n2 instanceof Set; +- } +- function p(n2) { +- return n2.o || n2.t; +- } +- function l(n2) { +- if (Array.isArray(n2)) +- return Array.prototype.slice.call(n2); +- var t2 = tn(n2); +- delete t2[Q]; +- for (var r2 = nn(t2), e2 = 0; e2 < r2.length; e2++) { +- var i2 = r2[e2], o2 = t2[i2]; +- o2.writable === false && (o2.writable = true, o2.configurable = true), (o2.get || o2.set) && (t2[i2] = { configurable: true, writable: true, enumerable: o2.enumerable, value: n2[i2] }); +- } +- return Object.create(Object.getPrototypeOf(n2), t2); +- } +- function d(n2, e2) { +- return e2 === void 0 && (e2 = false), y(n2) || t(n2) || !r(n2) ? n2 : (o(n2) > 1 && (n2.set = n2.add = n2.clear = n2.delete = h), Object.freeze(n2), e2 && i(n2, function (n3, t2) { +- return d(t2, true); +- }, true), n2); +- } +- function h() { +- n(2); +- } +- function y(n2) { +- return n2 == null || typeof n2 != "object" || Object.isFrozen(n2); +- } +- function b(t2) { +- var r2 = rn[t2]; +- return r2 || n(18, t2), r2; +- } +- function m(n2, t2) { +- rn[n2] || (rn[n2] = t2); +- } +- function _() { +- return U || n(0), U; +- } +- function j(n2, t2) { +- t2 && (b("Patches"), n2.u = [], n2.s = [], n2.v = t2); +- } +- function O(n2) { +- g(n2), n2.p.forEach(S), n2.p = null; +- } +- function g(n2) { +- n2 === U && (U = n2.l); +- } +- function w(n2) { +- return U = { p: [], l: U, h: n2, m: true, _: 0 }; +- } +- function S(n2) { +- var t2 = n2[Q]; +- t2.i === 0 || t2.i === 1 ? t2.j() : t2.O = true; +- } +- function P(t2, e2) { +- e2._ = e2.p.length; +- var i2 = e2.p[0], o2 = t2 !== void 0 && t2 !== i2; +- return e2.h.g || b("ES5").S(e2, t2, o2), o2 ? (i2[Q].P && (O(e2), n(4)), r(t2) && (t2 = M(e2, t2), e2.l || x(e2, t2)), e2.u && b("Patches").M(i2[Q], t2, e2.u, e2.s)) : t2 = M(e2, i2, []), O(e2), e2.u && e2.v(e2.u, e2.s), t2 !== H ? t2 : void 0; +- } +- function M(n2, t2, r2) { +- if (y(t2)) +- return t2; +- var e2 = t2[Q]; +- if (!e2) +- return i(t2, function (i2, o3) { +- return A(n2, e2, t2, i2, o3, r2); +- }, true), t2; +- if (e2.A !== n2) +- return t2; +- if (!e2.P) +- return x(n2, e2.t, true), e2.t; +- if (!e2.I) { +- e2.I = true, e2.A._--; +- var o2 = e2.i === 4 || e2.i === 5 ? e2.o = l(e2.k) : e2.o; +- i(e2.i === 3 ? new Set(o2) : o2, function (t3, i2) { +- return A(n2, e2, o2, t3, i2, r2); +- }), x(n2, o2, false), r2 && n2.u && b("Patches").R(e2, r2, n2.u, n2.s); +- } +- return e2.o; +- } +- function A(e2, i2, o2, a2, c2, s2) { +- if (c2 === o2 && n(5), t(c2)) { +- var v2 = M(e2, c2, s2 && i2 && i2.i !== 3 && !u(i2.D, a2) ? s2.concat(a2) : void 0); +- if (f(o2, a2, v2), !t(v2)) +- return; +- e2.m = false; +- } +- if (r(c2) && !y(c2)) { +- if (!e2.h.F && e2._ < 1) +- return; +- M(e2, c2), i2 && i2.A.l || x(e2, c2); +- } +- } +- function x(n2, t2, r2) { +- r2 === void 0 && (r2 = false), n2.h.F && n2.m && d(t2, r2); +- } +- function z(n2, t2) { +- var r2 = n2[Q]; +- return (r2 ? p(r2) : n2)[t2]; +- } +- function I(n2, t2) { +- if (t2 in n2) +- for (var r2 = Object.getPrototypeOf(n2); r2;) { +- var e2 = Object.getOwnPropertyDescriptor(r2, t2); +- if (e2) +- return e2; +- r2 = Object.getPrototypeOf(r2); +- } +- } +- function k(n2) { +- n2.P || (n2.P = true, n2.l && k(n2.l)); +- } +- function E(n2) { +- n2.o || (n2.o = l(n2.t)); +- } +- function R(n2, t2, r2) { +- var e2 = s(t2) ? b("MapSet").N(t2, r2) : v(t2) ? b("MapSet").T(t2, r2) : n2.g ? function (n3, t3) { +- var r3 = Array.isArray(n3), e3 = { i: r3 ? 1 : 0, A: t3 ? t3.A : _(), P: false, I: false, D: {}, l: t3, t: n3, k: null, o: null, j: null, C: false }, i2 = e3, o2 = en; +- r3 && (i2 = [e3], o2 = on); +- var u2 = Proxy.revocable(i2, o2), a2 = u2.revoke, f2 = u2.proxy; +- return e3.k = f2, e3.j = a2, f2; +- }(t2, r2) : b("ES5").J(t2, r2); +- return (r2 ? r2.A : _()).p.push(e2), e2; +- } +- function D(e2) { +- return t(e2) || n(22, e2), function n2(t2) { +- if (!r(t2)) +- return t2; +- var e3, u2 = t2[Q], c2 = o(t2); +- if (u2) { +- if (!u2.P && (u2.i < 4 || !b("ES5").K(u2))) +- return u2.t; +- u2.I = true, e3 = F(t2, c2), u2.I = false; +- } +- else +- e3 = F(t2, c2); +- return i(e3, function (t3, r2) { +- u2 && a(u2.t, t3) === r2 || f(e3, t3, n2(r2)); +- }), c2 === 3 ? new Set(e3) : e3; +- }(e2); +- } +- function F(n2, t2) { +- switch (t2) { +- case 2: +- return new Map(n2); +- case 3: +- return Array.from(n2); +- } +- return l(n2); +- } +- function N() { +- function r2(n2, t2) { +- var r3 = s2[n2]; +- return r3 ? r3.enumerable = t2 : s2[n2] = r3 = { configurable: true, enumerable: t2, get: function () { +- var t3 = this[Q]; +- return f2(t3), en.get(t3, n2); +- }, set: function (t3) { +- var r4 = this[Q]; +- f2(r4), en.set(r4, n2, t3); +- } }, r3; +- } +- function e2(n2) { +- for (var t2 = n2.length - 1; t2 >= 0; t2--) { +- var r3 = n2[t2][Q]; +- if (!r3.P) +- switch (r3.i) { +- case 5: +- a2(r3) && k(r3); +- break; +- case 4: +- o2(r3) && k(r3); +- } +- } +- } +- function o2(n2) { +- for (var t2 = n2.t, r3 = n2.k, e3 = nn(r3), i2 = e3.length - 1; i2 >= 0; i2--) { +- var o3 = e3[i2]; +- if (o3 !== Q) { +- var a3 = t2[o3]; +- if (a3 === void 0 && !u(t2, o3)) +- return true; +- var f3 = r3[o3], s3 = f3 && f3[Q]; +- if (s3 ? s3.t !== a3 : !c(f3, a3)) +- return true; +- } +- } +- var v2 = !!t2[Q]; +- return e3.length !== nn(t2).length + (v2 ? 0 : 1); +- } +- function a2(n2) { +- var t2 = n2.k; +- if (t2.length !== n2.t.length) +- return true; +- var r3 = Object.getOwnPropertyDescriptor(t2, t2.length - 1); +- return !(!r3 || r3.get); +- } +- function f2(t2) { +- t2.O && n(3, JSON.stringify(p(t2))); +- } +- var s2 = {}; +- m("ES5", { J: function (n2, t2) { +- var e3 = Array.isArray(n2), i2 = function (n3, t3) { +- if (n3) { +- for (var e4 = Array(t3.length), i3 = 0; i3 < t3.length; i3++) +- Object.defineProperty(e4, "" + i3, r2(i3, true)); +- return e4; +- } +- var o4 = tn(t3); +- delete o4[Q]; +- for (var u2 = nn(o4), a3 = 0; a3 < u2.length; a3++) { +- var f3 = u2[a3]; +- o4[f3] = r2(f3, n3 || !!o4[f3].enumerable); +- } +- return Object.create(Object.getPrototypeOf(t3), o4); +- }(e3, n2), o3 = { i: e3 ? 5 : 4, A: t2 ? t2.A : _(), P: false, I: false, D: {}, l: t2, t: n2, k: i2, o: null, O: false, C: false }; +- return Object.defineProperty(i2, Q, { value: o3, writable: true }), i2; +- }, S: function (n2, r3, o3) { +- o3 ? t(r3) && r3[Q].A === n2 && e2(n2.p) : (n2.u && function n3(t2) { +- if (t2 && typeof t2 == "object") { +- var r4 = t2[Q]; +- if (r4) { +- var e3 = r4.t, o4 = r4.k, f3 = r4.D, c2 = r4.i; +- if (c2 === 4) +- i(o4, function (t3) { +- t3 !== Q && (e3[t3] !== void 0 || u(e3, t3) ? f3[t3] || n3(o4[t3]) : (f3[t3] = true, k(r4))); +- }), i(e3, function (n4) { +- o4[n4] !== void 0 || u(o4, n4) || (f3[n4] = false, k(r4)); +- }); +- else if (c2 === 5) { +- if (a2(r4) && (k(r4), f3.length = true), o4.length < e3.length) +- for (var s3 = o4.length; s3 < e3.length; s3++) +- f3[s3] = false; +- else +- for (var v2 = e3.length; v2 < o4.length; v2++) +- f3[v2] = true; +- for (var p2 = Math.min(o4.length, e3.length), l2 = 0; l2 < p2; l2++) +- f3[l2] === void 0 && n3(o4[l2]); +- } +- } +- } +- }(n2.p[0]), e2(n2.p)); +- }, K: function (n2) { +- return n2.i === 4 ? o2(n2) : a2(n2); +- } }); +- } +- var G; +- var U; +- var W = typeof Symbol != "undefined" && typeof Symbol("x") == "symbol"; +- var X = typeof Map != "undefined"; +- var q = typeof Set != "undefined"; +- var B = typeof Proxy != "undefined" && Proxy.revocable !== void 0 && typeof Reflect != "undefined"; +- var H = W ? Symbol.for("immer-nothing") : ((G = {})["immer-nothing"] = true, G); +- var L = W ? Symbol.for("immer-draftable") : "__$immer_draftable"; +- var Q = W ? Symbol.for("immer-state") : "__$immer_state"; +- var Y = { 0: "Illegal state", 1: "Immer drafts cannot have computed properties", 2: "This object has been frozen and should not be mutated", 3: function (n2) { +- return "Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? " + n2; +- }, 4: "An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.", 5: "Immer forbids circular references", 6: "The first or second argument to `produce` must be a function", 7: "The third argument to `produce` must be a function or undefined", 8: "First argument to `createDraft` must be a plain object, an array, or an immerable object", 9: "First argument to `finishDraft` must be a draft returned by `createDraft`", 10: "The given draft is already finalized", 11: "Object.defineProperty() cannot be used on an Immer draft", 12: "Object.setPrototypeOf() cannot be used on an Immer draft", 13: "Immer only supports deleting array indices", 14: "Immer only supports setting array indices and the 'length' property", 15: function (n2) { +- return "Cannot apply patch, path doesn't resolve: " + n2; +- }, 16: 'Sets cannot have "replace" patches.', 17: function (n2) { +- return "Unsupported patch operation: " + n2; +- }, 18: function (n2) { +- return "The plugin for '" + n2 + "' has not been loaded into Immer. To enable the plugin, import and call `enable" + n2 + "()` when initializing your application."; +- }, 20: "Cannot use proxies if Proxy, Proxy.revocable or Reflect are not available", 21: function (n2) { +- return "produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '" + n2 + "'"; +- }, 22: function (n2) { +- return "'current' expects a draft, got: " + n2; +- }, 23: function (n2) { +- return "'original' expects a draft, got: " + n2; +- }, 24: "Patching reserved attributes like __proto__, prototype and constructor is not allowed" }; +- var Z = "" + Object.prototype.constructor; +- var nn = typeof Reflect != "undefined" && Reflect.ownKeys ? Reflect.ownKeys : Object.getOwnPropertySymbols !== void 0 ? function (n2) { +- return Object.getOwnPropertyNames(n2).concat(Object.getOwnPropertySymbols(n2)); +- } : Object.getOwnPropertyNames; +- var tn = Object.getOwnPropertyDescriptors || function (n2) { +- var t2 = {}; +- return nn(n2).forEach(function (r2) { +- t2[r2] = Object.getOwnPropertyDescriptor(n2, r2); +- }), t2; +- }; +- var rn = {}; +- var en = { get: function (n2, t2) { +- if (t2 === Q) +- return n2; +- var e2 = p(n2); +- if (!u(e2, t2)) +- return function (n3, t3, r2) { +- var e3, i3 = I(t3, r2); +- return i3 ? "value" in i3 ? i3.value : (e3 = i3.get) === null || e3 === void 0 ? void 0 : e3.call(n3.k) : void 0; +- }(n2, e2, t2); +- var i2 = e2[t2]; +- return n2.I || !r(i2) ? i2 : i2 === z(n2.t, t2) ? (E(n2), n2.o[t2] = R(n2.A.h, i2, n2)) : i2; +- }, has: function (n2, t2) { +- return t2 in p(n2); +- }, ownKeys: function (n2) { +- return Reflect.ownKeys(p(n2)); +- }, set: function (n2, t2, r2) { +- var e2 = I(p(n2), t2); +- if (e2 == null ? void 0 : e2.set) +- return e2.set.call(n2.k, r2), true; +- if (!n2.P) { +- var i2 = z(p(n2), t2), o2 = i2 == null ? void 0 : i2[Q]; +- if (o2 && o2.t === r2) +- return n2.o[t2] = r2, n2.D[t2] = false, true; +- if (c(r2, i2) && (r2 !== void 0 || u(n2.t, t2))) +- return true; +- E(n2), k(n2); +- } +- return n2.o[t2] === r2 && typeof r2 != "number" && (r2 !== void 0 || t2 in n2.o) || (n2.o[t2] = r2, n2.D[t2] = true, true); +- }, deleteProperty: function (n2, t2) { +- return z(n2.t, t2) !== void 0 || t2 in n2.t ? (n2.D[t2] = false, E(n2), k(n2)) : delete n2.D[t2], n2.o && delete n2.o[t2], true; +- }, getOwnPropertyDescriptor: function (n2, t2) { +- var r2 = p(n2), e2 = Reflect.getOwnPropertyDescriptor(r2, t2); +- return e2 ? { writable: true, configurable: n2.i !== 1 || t2 !== "length", enumerable: e2.enumerable, value: r2[t2] } : e2; +- }, defineProperty: function () { +- n(11); +- }, getPrototypeOf: function (n2) { +- return Object.getPrototypeOf(n2.t); +- }, setPrototypeOf: function () { +- n(12); +- } }; +- var on = {}; +- i(en, function (n2, t2) { +- on[n2] = function () { +- return arguments[0] = arguments[0][0], t2.apply(this, arguments); +- }; +- }), on.deleteProperty = function (t2, r2) { +- return isNaN(parseInt(r2)) && n(13), en.deleteProperty.call(this, t2[0], r2); +- }, on.set = function (t2, r2, e2) { +- return r2 !== "length" && isNaN(parseInt(r2)) && n(14), en.set.call(this, t2[0], r2, e2, t2[0]); +- }; +- var un = function () { +- function e2(t2) { +- var e3 = this; +- this.g = B, this.F = true, this.produce = function (t3, i3, o2) { +- if (typeof t3 == "function" && typeof i3 != "function") { +- var u2 = i3; +- i3 = t3; +- var a2 = e3; +- return function (n2) { +- var t4 = this; +- n2 === void 0 && (n2 = u2); +- for (var r2 = arguments.length, e4 = Array(r2 > 1 ? r2 - 1 : 0), o3 = 1; o3 < r2; o3++) +- e4[o3 - 1] = arguments[o3]; +- return a2.produce(n2, function (n3) { +- var r3; +- return (r3 = i3).call.apply(r3, [t4, n3].concat(e4)); +- }); +- }; +- } +- var f2; +- if (typeof i3 != "function" && n(6), o2 !== void 0 && typeof o2 != "function" && n(7), r(t3)) { +- var c2 = w(e3), s2 = R(e3, t3, void 0), v2 = true; +- try { +- f2 = i3(s2), v2 = false; +- } +- finally { +- v2 ? O(c2) : g(c2); +- } +- return typeof Promise != "undefined" && f2 instanceof Promise ? f2.then(function (n2) { +- return j(c2, o2), P(n2, c2); +- }, function (n2) { +- throw O(c2), n2; +- }) : (j(c2, o2), P(f2, c2)); +- } +- if (!t3 || typeof t3 != "object") { +- if ((f2 = i3(t3)) === H) +- return; +- return f2 === void 0 && (f2 = t3), e3.F && d(f2, true), f2; +- } +- n(21, t3); +- }, this.produceWithPatches = function (n2, t3) { +- return typeof n2 == "function" ? function (t4) { +- for (var r3 = arguments.length, i4 = Array(r3 > 1 ? r3 - 1 : 0), o2 = 1; o2 < r3; o2++) +- i4[o2 - 1] = arguments[o2]; +- return e3.produceWithPatches(t4, function (t5) { +- return n2.apply(void 0, [t5].concat(i4)); +- }); +- } : [e3.produce(n2, t3, function (n3, t4) { +- r2 = n3, i3 = t4; +- }), r2, i3]; +- var r2, i3; +- }, typeof (t2 == null ? void 0 : t2.useProxies) == "boolean" && this.setUseProxies(t2.useProxies), typeof (t2 == null ? void 0 : t2.autoFreeze) == "boolean" && this.setAutoFreeze(t2.autoFreeze); +- } +- var i2 = e2.prototype; +- return i2.createDraft = function (e3) { +- r(e3) || n(8), t(e3) && (e3 = D(e3)); +- var i3 = w(this), o2 = R(this, e3, void 0); +- return o2[Q].C = true, g(i3), o2; +- }, i2.finishDraft = function (t2, r2) { +- var e3 = t2 && t2[Q]; +- e3 && e3.C || n(9), e3.I && n(10); +- var i3 = e3.A; +- return j(i3, r2), P(void 0, i3); +- }, i2.setAutoFreeze = function (n2) { +- this.F = n2; +- }, i2.setUseProxies = function (t2) { +- t2 && !B && n(20), this.g = t2; +- }, i2.applyPatches = function (n2, r2) { +- var e3; +- for (e3 = r2.length - 1; e3 >= 0; e3--) { +- var i3 = r2[e3]; +- if (i3.path.length === 0 && i3.op === "replace") { +- n2 = i3.value; +- break; +- } +- } +- var o2 = b("Patches").$; +- return t(n2) ? o2(n2, r2) : this.produce(n2, function (n3) { +- return o2(n3, r2.slice(e3 + 1)); +- }); +- }, e2; +- }(); +- var an = new un(); +- var fn = an.produce; +- an.produceWithPatches.bind(an); +- an.setAutoFreeze.bind(an); +- an.setUseProxies.bind(an); +- an.applyPatches.bind(an); +- an.createDraft.bind(an); +- an.finishDraft.bind(an); +- var immer_esm_default = fn; +- // ../../node_modules/@babel/runtime/helpers/esm/defineProperty.js +- function _defineProperty(obj, key, value) { +- if (key in obj) { +- Object.defineProperty(obj, key, { +- value: value, +- enumerable: true, +- configurable: true, +- writable: true +- }); +- } +- else { +- obj[key] = value; +- } +- return obj; +- } +- // ../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js +- function ownKeys(object, enumerableOnly) { +- var keys = Object.keys(object); +- if (Object.getOwnPropertySymbols) { +- var symbols = Object.getOwnPropertySymbols(object); +- if (enumerableOnly) { +- symbols = symbols.filter(function (sym) { +- return Object.getOwnPropertyDescriptor(object, sym).enumerable; +- }); +- } +- keys.push.apply(keys, symbols); +- } +- return keys; +- } +- function _objectSpread2(target) { +- for (var i2 = 1; i2 < arguments.length; i2++) { +- var source = arguments[i2] != null ? arguments[i2] : {}; +- if (i2 % 2) { +- ownKeys(Object(source), true).forEach(function (key) { +- _defineProperty(target, key, source[key]); +- }); +- } +- else if (Object.getOwnPropertyDescriptors) { +- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); +- } +- else { +- ownKeys(Object(source)).forEach(function (key) { +- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); +- }); +- } +- } +- return target; +- } +- // ../../node_modules/redux/es/redux.js +- var $$observable = function () { +- return typeof Symbol === "function" && Symbol.observable || "@@observable"; +- }(); +- var randomString = function randomString2() { +- return Math.random().toString(36).substring(7).split("").join("."); +- }; +- var ActionTypes = { +- INIT: "@@redux/INIT" + randomString(), +- REPLACE: "@@redux/REPLACE" + randomString(), +- PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() { +- return "@@redux/PROBE_UNKNOWN_ACTION" + randomString(); +- } +- }; +- function isPlainObject(obj) { +- if (typeof obj !== "object" || obj === null) +- return false; +- var proto = obj; +- while (Object.getPrototypeOf(proto) !== null) { +- proto = Object.getPrototypeOf(proto); +- } +- return Object.getPrototypeOf(obj) === proto; +- } +- function kindOf(val) { +- var typeOfVal = typeof val; +- { +- var miniKindOf = function (val2) { +- if (val2 === void 0) +- return "undefined"; +- if (val2 === null) +- return "null"; +- var type = typeof val2; +- switch (type) { +- case "boolean": +- case "string": +- case "number": +- case "symbol": +- case "function": { +- return type; +- } +- } +- if (Array.isArray(val2)) +- return "array"; +- if (isDate_1(val2)) +- return "date"; +- if (isError_1(val2)) +- return "error"; +- var constructorName = ctorName_1(val2); +- switch (constructorName) { +- case "Symbol": +- case "Promise": +- case "WeakMap": +- case "WeakSet": +- case "Map": +- case "Set": +- return constructorName; +- } +- return type.slice(8, -1).toLowerCase().replace(/\s/g, ""); +- }, ctorName_1 = function (val2) { +- return typeof val2.constructor === "function" ? val2.constructor.name : null; +- }, isError_1 = function (val2) { +- return val2 instanceof Error || typeof val2.message === "string" && val2.constructor && typeof val2.constructor.stackTraceLimit === "number"; +- }, isDate_1 = function (val2) { +- if (val2 instanceof Date) +- return true; +- return typeof val2.toDateString === "function" && typeof val2.getDate === "function" && typeof val2.setDate === "function"; +- }; +- typeOfVal = miniKindOf(val); +- } +- return typeOfVal; +- } +- function createStore(reducer, preloadedState, enhancer) { +- var _ref2; +- if (typeof preloadedState === "function" && typeof enhancer === "function" || typeof enhancer === "function" && typeof arguments[3] === "function") { +- throw new Error("It looks like you are passing several store enhancers to createStore(). This is not supported. Instead, compose them together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example."); +- } +- if (typeof preloadedState === "function" && typeof enhancer === "undefined") { +- enhancer = preloadedState; +- preloadedState = void 0; +- } +- if (typeof enhancer !== "undefined") { +- if (typeof enhancer !== "function") { +- throw new Error("Expected the enhancer to be a function. Instead, received: '" + kindOf(enhancer) + "'"); +- } +- return enhancer(createStore)(reducer, preloadedState); +- } +- if (typeof reducer !== "function") { +- throw new Error("Expected the root reducer to be a function. Instead, received: '" + kindOf(reducer) + "'"); +- } +- var currentReducer = reducer; +- var currentState = preloadedState; +- var currentListeners = []; +- var nextListeners = currentListeners; +- var isDispatching = false; +- function ensureCanMutateNextListeners() { +- if (nextListeners === currentListeners) { +- nextListeners = currentListeners.slice(); +- } +- } +- function getState() { +- if (isDispatching) { +- throw new Error("You may not call store.getState() while the reducer is executing. The reducer has already received the state as an argument. Pass it down from the top reducer instead of reading it from the store."); +- } +- return currentState; +- } +- function subscribe(listener) { +- if (typeof listener !== "function") { +- throw new Error("Expected the listener to be a function. Instead, received: '" + kindOf(listener) + "'"); +- } +- if (isDispatching) { +- throw new Error("You may not call store.subscribe() while the reducer is executing. If you would like to be notified after the store has been updated, subscribe from a component and invoke store.getState() in the callback to access the latest state. See https://redux.js.org/api/store#subscribelistener for more details."); +- } +- var isSubscribed = true; +- ensureCanMutateNextListeners(); +- nextListeners.push(listener); +- return function unsubscribe() { +- if (!isSubscribed) { +- return; +- } +- if (isDispatching) { +- throw new Error("You may not unsubscribe from a store listener while the reducer is executing. See https://redux.js.org/api/store#subscribelistener for more details."); +- } +- isSubscribed = false; +- ensureCanMutateNextListeners(); +- var index = nextListeners.indexOf(listener); +- nextListeners.splice(index, 1); +- currentListeners = null; +- }; +- } +- function dispatch(action) { +- if (!isPlainObject(action)) { +- throw new Error("Actions must be plain objects. Instead, the actual type was: '" + kindOf(action) + "'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples."); +- } +- if (typeof action.type === "undefined") { +- throw new Error('Actions may not have an undefined "type" property. You may have misspelled an action type string constant.'); +- } +- if (isDispatching) { +- throw new Error("Reducers may not dispatch actions."); +- } +- try { +- isDispatching = true; +- currentState = currentReducer(currentState, action); +- } +- finally { +- isDispatching = false; +- } +- var listeners = currentListeners = nextListeners; +- for (var i2 = 0; i2 < listeners.length; i2++) { +- var listener = listeners[i2]; +- listener(); +- } +- return action; +- } +- function replaceReducer(nextReducer) { +- if (typeof nextReducer !== "function") { +- throw new Error("Expected the nextReducer to be a function. Instead, received: '" + kindOf(nextReducer)); +- } +- currentReducer = nextReducer; +- dispatch({ +- type: ActionTypes.REPLACE +- }); +- } +- function observable() { +- var _ref; +- var outerSubscribe = subscribe; +- return _ref = { +- subscribe: function subscribe2(observer) { +- if (typeof observer !== "object" || observer === null) { +- throw new Error("Expected the observer to be an object. Instead, received: '" + kindOf(observer) + "'"); +- } +- function observeState() { +- if (observer.next) { +- observer.next(getState()); +- } +- } +- observeState(); +- var unsubscribe = outerSubscribe(observeState); +- return { +- unsubscribe: unsubscribe +- }; +- } +- }, _ref[$$observable] = function () { +- return this; +- }, _ref; +- } +- dispatch({ +- type: ActionTypes.INIT +- }); +- return _ref2 = { +- dispatch: dispatch, +- subscribe: subscribe, +- getState: getState, +- replaceReducer: replaceReducer +- }, _ref2[$$observable] = observable, _ref2; +- } +- function warning(message) { +- if (typeof console !== "undefined" && typeof console.error === "function") { +- console.error(message); +- } +- try { +- throw new Error(message); +- } +- catch (e2) { +- } +- } +- function getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) { +- var reducerKeys = Object.keys(reducers); +- var argumentName = action && action.type === ActionTypes.INIT ? "preloadedState argument passed to createStore" : "previous state received by the reducer"; +- if (reducerKeys.length === 0) { +- return "Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers."; +- } +- if (!isPlainObject(inputState)) { +- return "The " + argumentName + ' has unexpected type of "' + kindOf(inputState) + '". Expected argument to be an object with the following ' + ('keys: "' + reducerKeys.join('", "') + '"'); +- } +- var unexpectedKeys = Object.keys(inputState).filter(function (key) { +- return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key]; +- }); +- unexpectedKeys.forEach(function (key) { +- unexpectedKeyCache[key] = true; +- }); +- if (action && action.type === ActionTypes.REPLACE) +- return; +- if (unexpectedKeys.length > 0) { +- return "Unexpected " + (unexpectedKeys.length > 1 ? "keys" : "key") + " " + ('"' + unexpectedKeys.join('", "') + '" found in ' + argumentName + ". ") + "Expected to find one of the known reducer keys instead: " + ('"' + reducerKeys.join('", "') + '". Unexpected keys will be ignored.'); +- } +- } +- function assertReducerShape(reducers) { +- Object.keys(reducers).forEach(function (key) { +- var reducer = reducers[key]; +- var initialState = reducer(void 0, { +- type: ActionTypes.INIT +- }); +- if (typeof initialState === "undefined") { +- throw new Error('The slice reducer for key "' + key + "\" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined."); +- } +- if (typeof reducer(void 0, { +- type: ActionTypes.PROBE_UNKNOWN_ACTION() +- }) === "undefined") { +- throw new Error('The slice reducer for key "' + key + '" returned undefined when probed with a random type. ' + ("Don't try to handle '" + ActionTypes.INIT + "' or other actions in \"redux/*\" ") + "namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined, but can be null."); +- } +- }); +- } +- function combineReducers(reducers) { +- var reducerKeys = Object.keys(reducers); +- var finalReducers = {}; +- for (var i2 = 0; i2 < reducerKeys.length; i2++) { +- var key = reducerKeys[i2]; +- { +- if (typeof reducers[key] === "undefined") { +- warning('No reducer provided for key "' + key + '"'); +- } +- } +- if (typeof reducers[key] === "function") { +- finalReducers[key] = reducers[key]; +- } +- } +- var finalReducerKeys = Object.keys(finalReducers); +- var unexpectedKeyCache; +- { +- unexpectedKeyCache = {}; +- } +- var shapeAssertionError; +- try { +- assertReducerShape(finalReducers); +- } +- catch (e2) { +- shapeAssertionError = e2; +- } +- return function combination(state, action) { +- if (state === void 0) { +- state = {}; +- } +- if (shapeAssertionError) { +- throw shapeAssertionError; +- } +- { +- var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache); +- if (warningMessage) { +- warning(warningMessage); +- } +- } +- var hasChanged = false; +- var nextState = {}; +- for (var _i = 0; _i < finalReducerKeys.length; _i++) { +- var _key = finalReducerKeys[_i]; +- var reducer = finalReducers[_key]; +- var previousStateForKey = state[_key]; +- var nextStateForKey = reducer(previousStateForKey, action); +- if (typeof nextStateForKey === "undefined") { +- var actionType = action && action.type; +- throw new Error("When called with an action of type " + (actionType ? '"' + String(actionType) + '"' : "(unknown type)") + ', the slice reducer for key "' + _key + '" returned undefined. To ignore an action, you must explicitly return the previous state. If you want this reducer to hold no value, you can return null instead of undefined.'); +- } +- nextState[_key] = nextStateForKey; +- hasChanged = hasChanged || nextStateForKey !== previousStateForKey; +- } +- hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length; +- return hasChanged ? nextState : state; +- }; +- } +- function bindActionCreator(actionCreator, dispatch) { +- return function () { +- return dispatch(actionCreator.apply(this, arguments)); +- }; +- } +- function bindActionCreators(actionCreators, dispatch) { +- if (typeof actionCreators === "function") { +- return bindActionCreator(actionCreators, dispatch); +- } +- if (typeof actionCreators !== "object" || actionCreators === null) { +- throw new Error("bindActionCreators expected an object or a function, but instead received: '" + kindOf(actionCreators) + "'. Did you write \"import ActionCreators from\" instead of \"import * as ActionCreators from\"?"); +- } +- var boundActionCreators = {}; +- for (var key in actionCreators) { +- var actionCreator = actionCreators[key]; +- if (typeof actionCreator === "function") { +- boundActionCreators[key] = bindActionCreator(actionCreator, dispatch); +- } +- } +- return boundActionCreators; +- } +- function compose() { +- for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) { +- funcs[_key] = arguments[_key]; +- } +- if (funcs.length === 0) { +- return function (arg) { +- return arg; +- }; +- } +- if (funcs.length === 1) { +- return funcs[0]; +- } +- return funcs.reduce(function (a2, b2) { +- return function () { +- return a2(b2.apply(void 0, arguments)); +- }; +- }); +- } +- function applyMiddleware() { +- for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) { +- middlewares[_key] = arguments[_key]; +- } +- return function (createStore2) { +- return function () { +- var store = createStore2.apply(void 0, arguments); +- var _dispatch = function dispatch() { +- throw new Error("Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch."); +- }; +- var middlewareAPI = { +- getState: store.getState, +- dispatch: function dispatch() { +- return _dispatch.apply(void 0, arguments); +- } +- }; +- var chain = middlewares.map(function (middleware) { +- return middleware(middlewareAPI); +- }); +- _dispatch = compose.apply(void 0, chain)(store.dispatch); +- return _objectSpread2(_objectSpread2({}, store), {}, { +- dispatch: _dispatch +- }); +- }; +- }; +- } +- function isCrushed() { +- } +- if (typeof isCrushed.name === "string" && isCrushed.name !== "isCrushed") { +- warning('You are currently using minified code outside of NODE_ENV === "production". This means that you are running a slower development build of Redux. You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify or setting mode to production in webpack (https://webpack.js.org/concepts/mode/) to ensure you have the correct code for your production build.'); +- } +- // ../../node_modules/reselect/es/index.js +- function defaultEqualityCheck(a2, b2) { +- return a2 === b2; +- } +- function areArgumentsShallowlyEqual(equalityCheck, prev, next) { +- if (prev === null || next === null || prev.length !== next.length) { +- return false; +- } +- var length = prev.length; +- for (var i2 = 0; i2 < length; i2++) { +- if (!equalityCheck(prev[i2], next[i2])) { +- return false; +- } +- } +- return true; +- } +- function defaultMemoize(func) { +- var equalityCheck = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : defaultEqualityCheck; +- var lastArgs = null; +- var lastResult = null; +- return function () { +- if (!areArgumentsShallowlyEqual(equalityCheck, lastArgs, arguments)) { +- lastResult = func.apply(null, arguments); +- } +- lastArgs = arguments; +- return lastResult; +- }; +- } +- function getDependencies(funcs) { +- var dependencies = Array.isArray(funcs[0]) ? funcs[0] : funcs; +- if (!dependencies.every(function (dep) { +- return typeof dep === "function"; +- })) { +- var dependencyTypes = dependencies.map(function (dep) { +- return typeof dep; +- }).join(", "); +- throw new Error("Selector creators expect all input-selectors to be functions, " + ("instead received the following types: [" + dependencyTypes + "]")); +- } +- return dependencies; +- } +- function createSelectorCreator(memoize) { +- for (var _len = arguments.length, memoizeOptions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { +- memoizeOptions[_key - 1] = arguments[_key]; +- } +- return function () { +- for (var _len2 = arguments.length, funcs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { +- funcs[_key2] = arguments[_key2]; +- } +- var recomputations = 0; +- var resultFunc = funcs.pop(); +- var dependencies = getDependencies(funcs); +- var memoizedResultFunc = memoize.apply(void 0, [function () { +- recomputations++; +- return resultFunc.apply(null, arguments); +- }].concat(memoizeOptions)); +- var selector = memoize(function () { +- var params = []; +- var length = dependencies.length; +- for (var i2 = 0; i2 < length; i2++) { +- params.push(dependencies[i2].apply(null, arguments)); +- } +- return memoizedResultFunc.apply(null, params); +- }); +- selector.resultFunc = resultFunc; +- selector.dependencies = dependencies; +- selector.recomputations = function () { +- return recomputations; +- }; +- selector.resetRecomputations = function () { +- return recomputations = 0; +- }; +- return selector; +- }; +- } +- var createSelector = createSelectorCreator(defaultMemoize); +- // src/createDraftSafeSelector.ts +- var createDraftSafeSelector = function () { +- var args = []; +- for (var _b = 0; _b < arguments.length; _b++) { +- args[_b] = arguments[_b]; +- } +- var selector = createSelector.apply(void 0, args); +- var wrappedSelector = function (value) { +- var rest = []; +- for (var _b = 1; _b < arguments.length; _b++) { +- rest[_b - 1] = arguments[_b]; +- } +- return selector.apply(void 0, __spreadArray([t(value) ? D(value) : value], rest)); +- }; +- return wrappedSelector; +- }; +- // src/devtoolsExtension.ts +- var composeWithDevTools = typeof window !== "undefined" && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : function () { +- if (arguments.length === 0) +- return void 0; +- if (typeof arguments[0] === "object") +- return compose; +- return compose.apply(null, arguments); +- }; +- // src/isPlainObject.ts +- function isPlainObject2(value) { +- if (typeof value !== "object" || value === null) +- return false; +- var proto = value; +- while (Object.getPrototypeOf(proto) !== null) { +- proto = Object.getPrototypeOf(proto); +- } +- return Object.getPrototypeOf(value) === proto; +- } +- // ../../node_modules/redux-thunk/es/index.js +- function createThunkMiddleware(extraArgument) { +- return function (_ref) { +- var dispatch = _ref.dispatch, getState = _ref.getState; +- return function (next) { +- return function (action) { +- if (typeof action === "function") { +- return action(dispatch, getState, extraArgument); +- } +- return next(action); +- }; +- }; +- }; +- } +- var thunk = createThunkMiddleware(); +- thunk.withExtraArgument = createThunkMiddleware; +- var es_default = thunk; +- // src/utils.ts +- function getTimeMeasureUtils(maxDelay, fnName) { +- var elapsed = 0; +- return { +- measureTime: function (fn2) { +- var started = Date.now(); +- try { +- return fn2(); +- } +- finally { +- var finished = Date.now(); +- elapsed += finished - started; +- } +- }, +- warnIfExceeded: function () { +- if (elapsed > maxDelay) { +- console.warn(fnName + " took " + elapsed + "ms, which is more than the warning threshold of " + maxDelay + "ms. \nIf your state or actions are very large, you may want to disable the middleware as it might cause too much of a slowdown in development mode. See https://redux-toolkit.js.org/api/getDefaultMiddleware for instructions.\nIt is disabled in production builds, so you don't need to worry about that."); +- } +- } +- }; +- } +- var MiddlewareArray = /** @class */ (function (_super) { +- __extends(MiddlewareArray, _super); +- function MiddlewareArray() { +- var args = []; +- for (var _b = 0; _b < arguments.length; _b++) { +- args[_b] = arguments[_b]; +- } +- var _this = _super.apply(this, args) || this; +- Object.setPrototypeOf(_this, MiddlewareArray.prototype); +- return _this; +- } +- Object.defineProperty(MiddlewareArray, Symbol.species, { +- get: function () { +- return MiddlewareArray; +- }, +- enumerable: false, +- configurable: true +- }); +- MiddlewareArray.prototype.concat = function () { +- var arr = []; +- for (var _b = 0; _b < arguments.length; _b++) { +- arr[_b] = arguments[_b]; +- } +- return _super.prototype.concat.apply(this, arr); +- }; +- MiddlewareArray.prototype.prepend = function () { +- var arr = []; +- for (var _b = 0; _b < arguments.length; _b++) { +- arr[_b] = arguments[_b]; +- } +- if (arr.length === 1 && Array.isArray(arr[0])) { +- return new (MiddlewareArray.bind.apply(MiddlewareArray, __spreadArray([void 0], arr[0].concat(this))))(); +- } +- return new (MiddlewareArray.bind.apply(MiddlewareArray, __spreadArray([void 0], arr.concat(this))))(); +- }; +- return MiddlewareArray; +- }(Array)); +- var prefix = "Invariant failed"; +- function invariant(condition, message) { +- if (condition) { +- return; +- } +- throw new Error(prefix + ": " + (message || "")); +- } +- function stringify(obj, serializer, indent, decycler) { +- return JSON.stringify(obj, getSerialize(serializer, decycler), indent); +- } +- function getSerialize(serializer, decycler) { +- var stack = [], keys = []; +- if (!decycler) +- decycler = function (_2, value) { +- if (stack[0] === value) +- return "[Circular ~]"; +- return "[Circular ~." + keys.slice(0, stack.indexOf(value)).join(".") + "]"; +- }; +- return function (key, value) { +- if (stack.length > 0) { +- var thisPos = stack.indexOf(this); +- ~thisPos ? stack.splice(thisPos + 1) : stack.push(this); +- ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key); +- if (~stack.indexOf(value)) +- value = decycler.call(this, key, value); +- } +- else +- stack.push(value); +- return serializer == null ? value : serializer.call(this, key, value); +- }; +- } +- function isImmutableDefault(value) { +- return typeof value !== "object" || value === null || typeof value === "undefined" || Object.isFrozen(value); +- } +- function trackForMutations(isImmutable, ignorePaths, obj) { +- var trackedProperties = trackProperties(isImmutable, ignorePaths, obj); +- return { +- detectMutations: function () { +- return detectMutations(isImmutable, ignorePaths, trackedProperties, obj); +- } +- }; +- } +- function trackProperties(isImmutable, ignorePaths, obj, path) { +- if (ignorePaths === void 0) { ignorePaths = []; } +- if (path === void 0) { path = ""; } +- var tracked = { value: obj }; +- if (!isImmutable(obj)) { +- tracked.children = {}; +- for (var key in obj) { +- var childPath = path ? path + "." + key : key; +- if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) { +- continue; +- } +- tracked.children[key] = trackProperties(isImmutable, ignorePaths, obj[key], childPath); +- } +- } +- return tracked; +- } +- function detectMutations(isImmutable, ignorePaths, trackedProperty, obj, sameParentRef, path) { +- if (ignorePaths === void 0) { ignorePaths = []; } +- if (sameParentRef === void 0) { sameParentRef = false; } +- if (path === void 0) { path = ""; } +- var prevObj = trackedProperty ? trackedProperty.value : void 0; +- var sameRef = prevObj === obj; +- if (sameParentRef && !sameRef && !Number.isNaN(obj)) { +- return { wasMutated: true, path: path }; +- } +- if (isImmutable(prevObj) || isImmutable(obj)) { +- return { wasMutated: false }; +- } +- var keysToDetect = {}; +- for (var key in trackedProperty.children) { +- keysToDetect[key] = true; +- } +- for (var key in obj) { +- keysToDetect[key] = true; +- } +- for (var key in keysToDetect) { +- var childPath = path ? path + "." + key : key; +- if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) { +- continue; +- } +- var result = detectMutations(isImmutable, ignorePaths, trackedProperty.children[key], obj[key], sameRef, childPath); +- if (result.wasMutated) { +- return result; +- } +- } +- return { wasMutated: false }; +- } +- function createImmutableStateInvariantMiddleware(options) { +- if (options === void 0) { options = {}; } +- var _b = options.isImmutable, isImmutable = _b === void 0 ? isImmutableDefault : _b, ignoredPaths = options.ignoredPaths, _c = options.warnAfter, warnAfter = _c === void 0 ? 32 : _c, ignore = options.ignore; +- ignoredPaths = ignoredPaths || ignore; +- var track = trackForMutations.bind(null, isImmutable, ignoredPaths); +- return function (_b) { +- var getState = _b.getState; +- var state = getState(); +- var tracker = track(state); +- var result; +- return function (next) { return function (action) { +- var measureUtils = getTimeMeasureUtils(warnAfter, "ImmutableStateInvariantMiddleware"); +- measureUtils.measureTime(function () { +- state = getState(); +- result = tracker.detectMutations(); +- tracker = track(state); +- invariant(!result.wasMutated, "A state mutation was detected between dispatches, in the path '" + (result.path || "") + "'. This may cause incorrect behavior. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)"); +- }); +- var dispatchedAction = next(action); +- measureUtils.measureTime(function () { +- state = getState(); +- result = tracker.detectMutations(); +- tracker = track(state); +- result.wasMutated && invariant(!result.wasMutated, "A state mutation was detected inside a dispatch, in the path: " + (result.path || "") + ". Take a look at the reducer(s) handling the action " + stringify(action) + ". (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)"); +- }); +- measureUtils.warnIfExceeded(); +- return dispatchedAction; +- }; }; +- }; +- } +- // src/serializableStateInvariantMiddleware.ts +- function isPlain(val) { +- var type = typeof val; +- return type === "undefined" || val === null || type === "string" || type === "boolean" || type === "number" || Array.isArray(val) || isPlainObject2(val); +- } +- function findNonSerializableValue(value, path, isSerializable, getEntries, ignoredPaths) { +- if (path === void 0) { path = ""; } +- if (isSerializable === void 0) { isSerializable = isPlain; } +- if (ignoredPaths === void 0) { ignoredPaths = []; } +- var foundNestedSerializable; +- if (!isSerializable(value)) { +- return { +- keyPath: path || "", +- value: value +- }; +- } +- if (typeof value !== "object" || value === null) { +- return false; +- } +- var entries = getEntries != null ? getEntries(value) : Object.entries(value); +- var hasIgnoredPaths = ignoredPaths.length > 0; +- for (var _b = 0, entries_1 = entries; _b < entries_1.length; _b++) { +- var _c = entries_1[_b], key = _c[0], nestedValue = _c[1]; +- var nestedPath = path ? path + "." + key : key; +- if (hasIgnoredPaths && ignoredPaths.indexOf(nestedPath) >= 0) { +- continue; +- } +- if (!isSerializable(nestedValue)) { +- return { +- keyPath: nestedPath, +- value: nestedValue +- }; +- } +- if (typeof nestedValue === "object") { +- foundNestedSerializable = findNonSerializableValue(nestedValue, nestedPath, isSerializable, getEntries, ignoredPaths); +- if (foundNestedSerializable) { +- return foundNestedSerializable; +- } +- } +- } +- return false; +- } +- function createSerializableStateInvariantMiddleware(options) { +- if (options === void 0) { options = {}; } +- var _b = options.isSerializable, isSerializable = _b === void 0 ? isPlain : _b, getEntries = options.getEntries, _c = options.ignoredActions, ignoredActions = _c === void 0 ? [] : _c, _d = options.ignoredActionPaths, ignoredActionPaths = _d === void 0 ? ["meta.arg", "meta.baseQueryMeta"] : _d, _e = options.ignoredPaths, ignoredPaths = _e === void 0 ? [] : _e, _f = options.warnAfter, warnAfter = _f === void 0 ? 32 : _f, _g = options.ignoreState, ignoreState = _g === void 0 ? false : _g; +- return function (storeAPI) { return function (next) { return function (action) { +- if (ignoredActions.length && ignoredActions.indexOf(action.type) !== -1) { +- return next(action); +- } +- var measureUtils = getTimeMeasureUtils(warnAfter, "SerializableStateInvariantMiddleware"); +- measureUtils.measureTime(function () { +- var foundActionNonSerializableValue = findNonSerializableValue(action, "", isSerializable, getEntries, ignoredActionPaths); +- if (foundActionNonSerializableValue) { +- var keyPath = foundActionNonSerializableValue.keyPath, value = foundActionNonSerializableValue.value; +- console.error("A non-serializable value was detected in an action, in the path: `" + keyPath + "`. Value:", value, "\nTake a look at the logic that dispatched this action: ", action, "\n(See https://redux.js.org/faq/actions#why-should-type-be-a-string-or-at-least-serializable-why-should-my-action-types-be-constants)", "\n(To allow non-serializable values see: https://redux-toolkit.js.org/usage/usage-guide#working-with-non-serializable-data)"); +- } +- }); +- var result = next(action); +- if (!ignoreState) { +- measureUtils.measureTime(function () { +- var state = storeAPI.getState(); +- var foundStateNonSerializableValue = findNonSerializableValue(state, "", isSerializable, getEntries, ignoredPaths); +- if (foundStateNonSerializableValue) { +- var keyPath = foundStateNonSerializableValue.keyPath, value = foundStateNonSerializableValue.value; +- console.error("A non-serializable value was detected in the state, in the path: `" + keyPath + "`. Value:", value, "\nTake a look at the reducer(s) handling this action type: " + action.type + ".\n(See https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state)"); +- } +- }); +- measureUtils.warnIfExceeded(); +- } +- return result; +- }; }; }; +- } +- // src/getDefaultMiddleware.ts +- function isBoolean(x2) { +- return typeof x2 === "boolean"; +- } +- function curryGetDefaultMiddleware() { +- return function curriedGetDefaultMiddleware(options) { +- return getDefaultMiddleware(options); +- }; +- } +- function getDefaultMiddleware(options) { +- if (options === void 0) { options = {}; } +- var _b = options.thunk, thunk2 = _b === void 0 ? true : _b, _c = options.immutableCheck, immutableCheck = _c === void 0 ? true : _c, _d = options.serializableCheck, serializableCheck = _d === void 0 ? true : _d; +- var middlewareArray = new MiddlewareArray(); +- if (thunk2) { +- if (isBoolean(thunk2)) { +- middlewareArray.push(es_default); +- } +- else { +- middlewareArray.push(es_default.withExtraArgument(thunk2.extraArgument)); +- } +- } +- { +- if (immutableCheck) { +- var immutableOptions = {}; +- if (!isBoolean(immutableCheck)) { +- immutableOptions = immutableCheck; +- } +- middlewareArray.unshift(createImmutableStateInvariantMiddleware(immutableOptions)); +- } +- if (serializableCheck) { +- var serializableOptions = {}; +- if (!isBoolean(serializableCheck)) { +- serializableOptions = serializableCheck; +- } +- middlewareArray.push(createSerializableStateInvariantMiddleware(serializableOptions)); +- } +- } +- return middlewareArray; +- } +- // src/configureStore.ts +- var IS_PRODUCTION = false; +- function configureStore(options) { +- var curriedGetDefaultMiddleware = curryGetDefaultMiddleware(); +- var _b = options || {}, _c = _b.reducer, reducer = _c === void 0 ? void 0 : _c, _d = _b.middleware, middleware = _d === void 0 ? curriedGetDefaultMiddleware() : _d, _e = _b.devTools, devTools = _e === void 0 ? true : _e, _f = _b.preloadedState, preloadedState = _f === void 0 ? void 0 : _f, _g = _b.enhancers, enhancers = _g === void 0 ? void 0 : _g; +- var rootReducer; +- if (typeof reducer === "function") { +- rootReducer = reducer; +- } +- else if (isPlainObject2(reducer)) { +- rootReducer = combineReducers(reducer); +- } +- else { +- throw new Error('"reducer" is a required argument, and must be a function or an object of functions that can be passed to combineReducers'); +- } +- var finalMiddleware = middleware; +- if (typeof finalMiddleware === "function") { +- finalMiddleware = finalMiddleware(curriedGetDefaultMiddleware); +- if (!Array.isArray(finalMiddleware)) { +- throw new Error("when using a middleware builder function, an array of middleware must be returned"); +- } +- } +- if (finalMiddleware.some(function (item) { return typeof item !== "function"; })) { +- throw new Error("each middleware provided to configureStore must be a function"); +- } +- var middlewareEnhancer = applyMiddleware.apply(void 0, finalMiddleware); +- var finalCompose = compose; +- if (devTools) { +- finalCompose = composeWithDevTools(__spreadValues({ +- trace: !IS_PRODUCTION +- }, typeof devTools === "object" && devTools)); +- } +- var storeEnhancers = [middlewareEnhancer]; +- if (Array.isArray(enhancers)) { +- storeEnhancers = __spreadArray([middlewareEnhancer], enhancers); +- } +- else if (typeof enhancers === "function") { +- storeEnhancers = enhancers(storeEnhancers); +- } +- var composedEnhancer = finalCompose.apply(void 0, storeEnhancers); +- return createStore(rootReducer, preloadedState, composedEnhancer); +- } +- // src/createAction.ts +- function createAction(type, prepareAction) { +- function actionCreator() { +- var args = []; +- for (var _b = 0; _b < arguments.length; _b++) { +- args[_b] = arguments[_b]; +- } +- if (prepareAction) { +- var prepared = prepareAction.apply(void 0, args); +- if (!prepared) { +- throw new Error("prepareAction did not return an object"); +- } +- return __spreadValues(__spreadValues({ +- type: type, +- payload: prepared.payload +- }, "meta" in prepared && { meta: prepared.meta }), "error" in prepared && { error: prepared.error }); +- } +- return { type: type, payload: args[0] }; +- } +- actionCreator.toString = function () { return "" + type; }; +- actionCreator.type = type; +- actionCreator.match = function (action) { return action.type === type; }; +- return actionCreator; +- } +- function isFSA(action) { +- return isPlainObject2(action) && typeof action.type === "string" && Object.keys(action).every(isValidKey); +- } +- function isValidKey(key) { +- return ["type", "payload", "error", "meta"].indexOf(key) > -1; +- } +- function getType(actionCreator) { +- return "" + actionCreator; +- } +- // src/mapBuilders.ts +- function executeReducerBuilderCallback(builderCallback) { +- var actionsMap = {}; +- var actionMatchers = []; +- var defaultCaseReducer; +- var builder = { +- addCase: function (typeOrActionCreator, reducer) { +- { +- if (actionMatchers.length > 0) { +- throw new Error("`builder.addCase` should only be called before calling `builder.addMatcher`"); +- } +- if (defaultCaseReducer) { +- throw new Error("`builder.addCase` should only be called before calling `builder.addDefaultCase`"); +- } +- } +- var type = typeof typeOrActionCreator === "string" ? typeOrActionCreator : typeOrActionCreator.type; +- if (type in actionsMap) { +- throw new Error("addCase cannot be called with two reducers for the same action type"); +- } +- actionsMap[type] = reducer; +- return builder; +- }, +- addMatcher: function (matcher, reducer) { +- { +- if (defaultCaseReducer) { +- throw new Error("`builder.addMatcher` should only be called before calling `builder.addDefaultCase`"); +- } +- } +- actionMatchers.push({ matcher: matcher, reducer: reducer }); +- return builder; +- }, +- addDefaultCase: function (reducer) { +- { +- if (defaultCaseReducer) { +- throw new Error("`builder.addDefaultCase` can only be called once"); +- } +- } +- defaultCaseReducer = reducer; +- return builder; +- } +- }; +- builderCallback(builder); +- return [actionsMap, actionMatchers, defaultCaseReducer]; +- } +- // src/createReducer.ts +- function createReducer(initialState, mapOrBuilderCallback, actionMatchers, defaultCaseReducer) { +- if (actionMatchers === void 0) { actionMatchers = []; } +- var _b = typeof mapOrBuilderCallback === "function" ? executeReducerBuilderCallback(mapOrBuilderCallback) : [mapOrBuilderCallback, actionMatchers, defaultCaseReducer], actionsMap = _b[0], finalActionMatchers = _b[1], finalDefaultCaseReducer = _b[2]; +- var frozenInitialState = immer_esm_default(initialState, function () { +- }); +- return function (state, action) { +- if (state === void 0) { state = frozenInitialState; } +- var caseReducers = __spreadArray([ +- actionsMap[action.type] +- ], finalActionMatchers.filter(function (_b) { +- var matcher = _b.matcher; +- return matcher(action); +- }).map(function (_b) { +- var reducer = _b.reducer; +- return reducer; +- })); +- if (caseReducers.filter(function (cr) { return !!cr; }).length === 0) { +- caseReducers = [finalDefaultCaseReducer]; +- } +- return caseReducers.reduce(function (previousState, caseReducer) { +- if (caseReducer) { +- if (t(previousState)) { +- var draft = previousState; +- var result = caseReducer(draft, action); +- if (typeof result === "undefined") { +- return previousState; +- } +- return result; +- } +- else if (!r(previousState)) { +- var result = caseReducer(previousState, action); +- if (typeof result === "undefined") { +- if (previousState === null) { +- return previousState; +- } +- throw Error("A case reducer on a non-draftable value must not return undefined"); +- } +- return result; +- } +- else { +- return immer_esm_default(previousState, function (draft) { +- return caseReducer(draft, action); +- }); +- } +- } +- return previousState; +- }, state); +- }; +- } +- // src/createSlice.ts +- function getType2(slice, actionKey) { +- return slice + "/" + actionKey; +- } +- function createSlice(options) { +- var name = options.name, initialState = options.initialState; +- if (!name) { +- throw new Error("`name` is a required option for createSlice"); +- } +- var reducers = options.reducers || {}; +- var _b = typeof options.extraReducers === "function" ? executeReducerBuilderCallback(options.extraReducers) : [options.extraReducers], _c = _b[0], extraReducers = _c === void 0 ? {} : _c, _d = _b[1], actionMatchers = _d === void 0 ? [] : _d, _e = _b[2], defaultCaseReducer = _e === void 0 ? void 0 : _e; +- var reducerNames = Object.keys(reducers); +- var sliceCaseReducersByName = {}; +- var sliceCaseReducersByType = {}; +- var actionCreators = {}; +- reducerNames.forEach(function (reducerName) { +- var maybeReducerWithPrepare = reducers[reducerName]; +- var type = getType2(name, reducerName); +- var caseReducer; +- var prepareCallback; +- if ("reducer" in maybeReducerWithPrepare) { +- caseReducer = maybeReducerWithPrepare.reducer; +- prepareCallback = maybeReducerWithPrepare.prepare; +- } +- else { +- caseReducer = maybeReducerWithPrepare; +- } +- sliceCaseReducersByName[reducerName] = caseReducer; +- sliceCaseReducersByType[type] = caseReducer; +- actionCreators[reducerName] = prepareCallback ? createAction(type, prepareCallback) : createAction(type); +- }); +- var finalCaseReducers = __spreadValues(__spreadValues({}, extraReducers), sliceCaseReducersByType); +- var reducer = createReducer(initialState, finalCaseReducers, actionMatchers, defaultCaseReducer); +- return { +- name: name, +- reducer: reducer, +- actions: actionCreators, +- caseReducers: sliceCaseReducersByName +- }; +- } +- // src/entities/entity_state.ts +- function getInitialEntityState() { +- return { +- ids: [], +- entities: {} +- }; +- } +- function createInitialStateFactory() { +- function getInitialState(additionalState) { +- if (additionalState === void 0) { additionalState = {}; } +- return Object.assign(getInitialEntityState(), additionalState); +- } +- return { getInitialState: getInitialState }; +- } +- // src/entities/state_selectors.ts +- function createSelectorsFactory() { +- function getSelectors(selectState) { +- var selectIds = function (state) { return state.ids; }; +- var selectEntities = function (state) { return state.entities; }; +- var selectAll = createDraftSafeSelector(selectIds, selectEntities, function (ids, entities) { return ids.map(function (id) { return entities[id]; }); }); +- var selectId = function (_2, id) { return id; }; +- var selectById = function (entities, id) { return entities[id]; }; +- var selectTotal = createDraftSafeSelector(selectIds, function (ids) { return ids.length; }); +- if (!selectState) { +- return { +- selectIds: selectIds, +- selectEntities: selectEntities, +- selectAll: selectAll, +- selectTotal: selectTotal, +- selectById: createDraftSafeSelector(selectEntities, selectId, selectById) +- }; +- } +- var selectGlobalizedEntities = createDraftSafeSelector(selectState, selectEntities); +- return { +- selectIds: createDraftSafeSelector(selectState, selectIds), +- selectEntities: selectGlobalizedEntities, +- selectAll: createDraftSafeSelector(selectState, selectAll), +- selectTotal: createDraftSafeSelector(selectState, selectTotal), +- selectById: createDraftSafeSelector(selectGlobalizedEntities, selectId, selectById) +- }; +- } +- return { getSelectors: getSelectors }; +- } +- // src/entities/state_adapter.ts +- function createSingleArgumentStateOperator(mutator) { +- var operator = createStateOperator(function (_2, state) { return mutator(state); }); +- return function operation(state) { +- return operator(state, void 0); +- }; +- } +- function createStateOperator(mutator) { +- return function operation(state, arg) { +- function isPayloadActionArgument(arg2) { +- return isFSA(arg2); +- } +- var runMutator = function (draft) { +- if (isPayloadActionArgument(arg)) { +- mutator(arg.payload, draft); +- } +- else { +- mutator(arg, draft); +- } +- }; +- if (t(state)) { +- runMutator(state); +- return state; +- } +- else { +- return immer_esm_default(state, runMutator); +- } +- }; +- } +- // src/entities/utils.ts +- function selectIdValue(entity, selectId) { +- var key = selectId(entity); +- if (key === void 0) { +- console.warn("The entity passed to the `selectId` implementation returned undefined.", "You should probably provide your own `selectId` implementation.", "The entity that was passed:", entity, "The `selectId` implementation:", selectId.toString()); +- } +- return key; +- } +- function ensureEntitiesArray(entities) { +- if (!Array.isArray(entities)) { +- entities = Object.values(entities); +- } +- return entities; +- } +- function splitAddedUpdatedEntities(newEntities, selectId, state) { +- newEntities = ensureEntitiesArray(newEntities); +- var added = []; +- var updated = []; +- for (var _b = 0, newEntities_1 = newEntities; _b < newEntities_1.length; _b++) { +- var entity = newEntities_1[_b]; +- var id = selectIdValue(entity, selectId); +- if (id in state.entities) { +- updated.push({ id: id, changes: entity }); +- } +- else { +- added.push(entity); +- } +- } +- return [added, updated]; +- } +- // src/entities/unsorted_state_adapter.ts +- function createUnsortedStateAdapter(selectId) { +- function addOneMutably(entity, state) { +- var key = selectIdValue(entity, selectId); +- if (key in state.entities) { +- return; +- } +- state.ids.push(key); +- state.entities[key] = entity; +- } +- function addManyMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- for (var _b = 0, newEntities_2 = newEntities; _b < newEntities_2.length; _b++) { +- var entity = newEntities_2[_b]; +- addOneMutably(entity, state); +- } +- } +- function setOneMutably(entity, state) { +- var key = selectIdValue(entity, selectId); +- if (!(key in state.entities)) { +- state.ids.push(key); +- } +- state.entities[key] = entity; +- } +- function setManyMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- for (var _b = 0, newEntities_3 = newEntities; _b < newEntities_3.length; _b++) { +- var entity = newEntities_3[_b]; +- setOneMutably(entity, state); +- } +- } +- function setAllMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- state.ids = []; +- state.entities = {}; +- addManyMutably(newEntities, state); +- } +- function removeOneMutably(key, state) { +- return removeManyMutably([key], state); +- } +- function removeManyMutably(keys, state) { +- var didMutate = false; +- keys.forEach(function (key) { +- if (key in state.entities) { +- delete state.entities[key]; +- didMutate = true; +- } +- }); +- if (didMutate) { +- state.ids = state.ids.filter(function (id) { return id in state.entities; }); +- } +- } +- function removeAllMutably(state) { +- Object.assign(state, { +- ids: [], +- entities: {} +- }); +- } +- function takeNewKey(keys, update, state) { +- var original = state.entities[update.id]; +- var updated = Object.assign({}, original, update.changes); +- var newKey = selectIdValue(updated, selectId); +- var hasNewKey = newKey !== update.id; +- if (hasNewKey) { +- keys[update.id] = newKey; +- delete state.entities[update.id]; +- } +- state.entities[newKey] = updated; +- return hasNewKey; +- } +- function updateOneMutably(update, state) { +- return updateManyMutably([update], state); +- } +- function updateManyMutably(updates, state) { +- var newKeys = {}; +- var updatesPerEntity = {}; +- updates.forEach(function (update) { +- if (update.id in state.entities) { +- updatesPerEntity[update.id] = { +- id: update.id, +- changes: __spreadValues(__spreadValues({}, updatesPerEntity[update.id] ? updatesPerEntity[update.id].changes : null), update.changes) +- }; +- } +- }); +- updates = Object.values(updatesPerEntity); +- var didMutateEntities = updates.length > 0; +- if (didMutateEntities) { +- var didMutateIds = updates.filter(function (update) { return takeNewKey(newKeys, update, state); }).length > 0; +- if (didMutateIds) { +- state.ids = state.ids.map(function (id) { return newKeys[id] || id; }); +- } +- } +- } +- function upsertOneMutably(entity, state) { +- return upsertManyMutably([entity], state); +- } +- function upsertManyMutably(newEntities, state) { +- var _b = splitAddedUpdatedEntities(newEntities, selectId, state), added = _b[0], updated = _b[1]; +- updateManyMutably(updated, state); +- addManyMutably(added, state); +- } +- return { +- removeAll: createSingleArgumentStateOperator(removeAllMutably), +- addOne: createStateOperator(addOneMutably), +- addMany: createStateOperator(addManyMutably), +- setOne: createStateOperator(setOneMutably), +- setMany: createStateOperator(setManyMutably), +- setAll: createStateOperator(setAllMutably), +- updateOne: createStateOperator(updateOneMutably), +- updateMany: createStateOperator(updateManyMutably), +- upsertOne: createStateOperator(upsertOneMutably), +- upsertMany: createStateOperator(upsertManyMutably), +- removeOne: createStateOperator(removeOneMutably), +- removeMany: createStateOperator(removeManyMutably) +- }; +- } +- // src/entities/sorted_state_adapter.ts +- function createSortedStateAdapter(selectId, sort) { +- var _b = createUnsortedStateAdapter(selectId), removeOne = _b.removeOne, removeMany = _b.removeMany, removeAll = _b.removeAll; +- function addOneMutably(entity, state) { +- return addManyMutably([entity], state); +- } +- function addManyMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- var models = newEntities.filter(function (model) { return !(selectIdValue(model, selectId) in state.entities); }); +- if (models.length !== 0) { +- merge(models, state); +- } +- } +- function setOneMutably(entity, state) { +- return setManyMutably([entity], state); +- } +- function setManyMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- if (newEntities.length !== 0) { +- merge(newEntities, state); +- } +- } +- function setAllMutably(newEntities, state) { +- newEntities = ensureEntitiesArray(newEntities); +- state.entities = {}; +- state.ids = []; +- addManyMutably(newEntities, state); +- } +- function updateOneMutably(update, state) { +- return updateManyMutably([update], state); +- } +- function takeUpdatedModel(models, update, state) { +- if (!(update.id in state.entities)) { +- return false; +- } +- var original = state.entities[update.id]; +- var updated = Object.assign({}, original, update.changes); +- var newKey = selectIdValue(updated, selectId); +- delete state.entities[update.id]; +- models.push(updated); +- return newKey !== update.id; +- } +- function updateManyMutably(updates, state) { +- var models = []; +- updates.forEach(function (update) { return takeUpdatedModel(models, update, state); }); +- if (models.length !== 0) { +- merge(models, state); +- } +- } +- function upsertOneMutably(entity, state) { +- return upsertManyMutably([entity], state); +- } +- function upsertManyMutably(newEntities, state) { +- var _b = splitAddedUpdatedEntities(newEntities, selectId, state), added = _b[0], updated = _b[1]; +- updateManyMutably(updated, state); +- addManyMutably(added, state); +- } +- function areArraysEqual(a2, b2) { +- if (a2.length !== b2.length) { +- return false; +- } +- for (var i2 = 0; i2 < a2.length && i2 < b2.length; i2++) { +- if (a2[i2] === b2[i2]) { +- continue; +- } +- return false; +- } +- return true; +- } +- function merge(models, state) { +- models.forEach(function (model) { +- state.entities[selectId(model)] = model; +- }); +- var allEntities = Object.values(state.entities); +- allEntities.sort(sort); +- var newSortedIds = allEntities.map(selectId); +- var ids = state.ids; +- if (!areArraysEqual(ids, newSortedIds)) { +- state.ids = newSortedIds; +- } +- } +- return { +- removeOne: removeOne, +- removeMany: removeMany, +- removeAll: removeAll, +- addOne: createStateOperator(addOneMutably), +- updateOne: createStateOperator(updateOneMutably), +- upsertOne: createStateOperator(upsertOneMutably), +- setOne: createStateOperator(setOneMutably), +- setMany: createStateOperator(setManyMutably), +- setAll: createStateOperator(setAllMutably), +- addMany: createStateOperator(addManyMutably), +- updateMany: createStateOperator(updateManyMutably), +- upsertMany: createStateOperator(upsertManyMutably) +- }; +- } +- // src/entities/create_adapter.ts +- function createEntityAdapter(options) { +- if (options === void 0) { options = {}; } +- var _b = __spreadValues({ +- sortComparer: false, +- selectId: function (instance) { return instance.id; } +- }, options), selectId = _b.selectId, sortComparer = _b.sortComparer; +- var stateFactory = createInitialStateFactory(); +- var selectorsFactory = createSelectorsFactory(); +- var stateAdapter = sortComparer ? createSortedStateAdapter(selectId, sortComparer) : createUnsortedStateAdapter(selectId); +- return __spreadValues(__spreadValues(__spreadValues({ +- selectId: selectId, +- sortComparer: sortComparer +- }, stateFactory), selectorsFactory), stateAdapter); +- } +- // src/nanoid.ts +- var urlAlphabet = "ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW"; +- var nanoid = function (size) { +- if (size === void 0) { size = 21; } +- var id = ""; +- var i2 = size; +- while (i2--) { +- id += urlAlphabet[Math.random() * 64 | 0]; +- } +- return id; +- }; +- // src/createAsyncThunk.ts +- var commonProperties = [ +- "name", +- "message", +- "stack", +- "code" +- ]; +- var RejectWithValue = /** @class */ (function () { +- function RejectWithValue(payload, meta) { +- this.payload = payload; +- this.meta = meta; +- } +- return RejectWithValue; +- }()); +- var FulfillWithMeta = /** @class */ (function () { +- function FulfillWithMeta(payload, meta) { +- this.payload = payload; +- this.meta = meta; +- } +- return FulfillWithMeta; +- }()); +- var miniSerializeError = function (value) { +- if (typeof value === "object" && value !== null) { +- var simpleError = {}; +- for (var _b = 0, commonProperties_1 = commonProperties; _b < commonProperties_1.length; _b++) { +- var property = commonProperties_1[_b]; +- if (typeof value[property] === "string") { +- simpleError[property] = value[property]; +- } +- } +- return simpleError; +- } +- return { message: String(value) }; +- }; +- function createAsyncThunk(typePrefix, payloadCreator, options) { +- var fulfilled = createAction(typePrefix + "/fulfilled", function (payload, requestId, arg, meta) { return ({ +- payload: payload, +- meta: __spreadProps(__spreadValues({}, meta || {}), { +- arg: arg, +- requestId: requestId, +- requestStatus: "fulfilled" +- }) +- }); }); +- var pending = createAction(typePrefix + "/pending", function (requestId, arg, meta) { return ({ +- payload: void 0, +- meta: __spreadProps(__spreadValues({}, meta || {}), { +- arg: arg, +- requestId: requestId, +- requestStatus: "pending" +- }) +- }); }); +- var rejected = createAction(typePrefix + "/rejected", function (error, requestId, arg, payload, meta) { return ({ +- payload: payload, +- error: (options && options.serializeError || miniSerializeError)(error || "Rejected"), +- meta: __spreadProps(__spreadValues({}, meta || {}), { +- arg: arg, +- requestId: requestId, +- rejectedWithValue: !!payload, +- requestStatus: "rejected", +- aborted: (error == null ? void 0 : error.name) === "AbortError", +- condition: (error == null ? void 0 : error.name) === "ConditionError" +- }) +- }); }); +- var displayedWarning = false; +- var AC = typeof AbortController !== "undefined" ? AbortController : /** @class */ (function () { +- function class_1() { +- this.signal = { +- aborted: false, +- addEventListener: function () { +- }, +- dispatchEvent: function () { +- return false; +- }, +- onabort: function () { +- }, +- removeEventListener: function () { +- } +- }; +- } +- class_1.prototype.abort = function () { +- { +- if (!displayedWarning) { +- displayedWarning = true; +- console.info("This platform does not implement AbortController. \nIf you want to use the AbortController to react to `abort` events, please consider importing a polyfill like 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only'."); +- } +- } +- }; +- return class_1; +- }()); +- function actionCreator(arg) { +- return function (dispatch, getState, extra) { +- var _a; +- var requestId = ((_a = options == null ? void 0 : options.idGenerator) != null ? _a : nanoid)(); +- var abortController = new AC(); +- var abortReason; +- var abortedPromise = new Promise(function (_2, reject) { return abortController.signal.addEventListener("abort", function () { return reject({ name: "AbortError", message: abortReason || "Aborted" }); }); }); +- var started = false; +- function abort(reason) { +- if (started) { +- abortReason = reason; +- abortController.abort(); +- } +- } +- var promise = function () { +- return __async(this, null, function () { +- var _a2, finalAction, err_1, skipDispatch; +- return __generator(this, function (_b) { +- switch (_b.label) { +- case 0: +- _b.trys.push([0, 2, , 3]); +- if (options && options.condition && options.condition(arg, { getState: getState, extra: extra }) === false) { +- throw { +- name: "ConditionError", +- message: "Aborted due to condition callback returning false." +- }; +- } +- started = true; +- dispatch(pending(requestId, arg, (_a2 = options == null ? void 0 : options.getPendingMeta) == null ? void 0 : _a2.call(options, { requestId: requestId, arg: arg }, { getState: getState, extra: extra }))); +- return [4 /*yield*/, Promise.race([ +- abortedPromise, +- Promise.resolve(payloadCreator(arg, { +- dispatch: dispatch, +- getState: getState, +- extra: extra, +- requestId: requestId, +- signal: abortController.signal, +- rejectWithValue: function (value, meta) { +- return new RejectWithValue(value, meta); +- }, +- fulfillWithValue: function (value, meta) { +- return new FulfillWithMeta(value, meta); +- } +- })).then(function (result) { +- if (result instanceof RejectWithValue) { +- throw result; +- } +- if (result instanceof FulfillWithMeta) { +- return fulfilled(result.payload, requestId, arg, result.meta); +- } +- return fulfilled(result, requestId, arg); +- }) +- ])]; +- case 1: +- finalAction = _b.sent(); +- return [3 /*break*/, 3]; +- case 2: +- err_1 = _b.sent(); +- finalAction = err_1 instanceof RejectWithValue ? rejected(null, requestId, arg, err_1.payload, err_1.meta) : rejected(err_1, requestId, arg); +- return [3 /*break*/, 3]; +- case 3: +- skipDispatch = options && !options.dispatchConditionRejection && rejected.match(finalAction) && finalAction.meta.condition; +- if (!skipDispatch) { +- dispatch(finalAction); +- } +- return [2 /*return*/, finalAction]; +- } +- }); +- }); +- }(); +- return Object.assign(promise, { +- abort: abort, +- requestId: requestId, +- arg: arg, +- unwrap: function () { +- return promise.then(unwrapResult); +- } +- }); +- }; +- } +- return Object.assign(actionCreator, { +- pending: pending, +- rejected: rejected, +- fulfilled: fulfilled, +- typePrefix: typePrefix +- }); +- } +- function unwrapResult(action) { +- if (action.meta && action.meta.rejectedWithValue) { +- throw action.payload; +- } +- if (action.error) { +- throw action.error; +- } +- return action.payload; +- } +- // src/tsHelpers.ts +- var hasMatchFunction = function (v2) { +- return v2 && typeof v2.match === "function"; +- }; +- // src/matchers.ts +- var matches = function (matcher, action) { +- if (hasMatchFunction(matcher)) { +- return matcher.match(action); +- } +- else { +- return matcher(action); +- } +- }; +- function isAnyOf() { +- var matchers = []; +- for (var _b = 0; _b < arguments.length; _b++) { +- matchers[_b] = arguments[_b]; +- } +- return function (action) { +- return matchers.some(function (matcher) { return matches(matcher, action); }); +- }; +- } +- function isAllOf() { +- var matchers = []; +- for (var _b = 0; _b < arguments.length; _b++) { +- matchers[_b] = arguments[_b]; +- } +- return function (action) { +- return matchers.every(function (matcher) { return matches(matcher, action); }); +- }; +- } +- function hasExpectedRequestMetadata(action, validStatus) { +- if (!action || !action.meta) +- return false; +- var hasValidRequestId = typeof action.meta.requestId === "string"; +- var hasValidRequestStatus = validStatus.indexOf(action.meta.requestStatus) > -1; +- return hasValidRequestId && hasValidRequestStatus; +- } +- function isAsyncThunkArray(a2) { +- return typeof a2[0] === "function" && "pending" in a2[0] && "fulfilled" in a2[0] && "rejected" in a2[0]; +- } +- function isPending() { +- var asyncThunks = []; +- for (var _b = 0; _b < arguments.length; _b++) { +- asyncThunks[_b] = arguments[_b]; +- } +- if (asyncThunks.length === 0) { +- return function (action) { return hasExpectedRequestMetadata(action, ["pending"]); }; +- } +- if (!isAsyncThunkArray(asyncThunks)) { +- return isPending()(asyncThunks[0]); +- } +- return function (action) { +- var matchers = asyncThunks.map(function (asyncThunk) { return asyncThunk.pending; }); +- var combinedMatcher = isAnyOf.apply(void 0, matchers); +- return combinedMatcher(action); +- }; +- } +- function isRejected() { +- var asyncThunks = []; +- for (var _b = 0; _b < arguments.length; _b++) { +- asyncThunks[_b] = arguments[_b]; +- } +- if (asyncThunks.length === 0) { +- return function (action) { return hasExpectedRequestMetadata(action, ["rejected"]); }; +- } +- if (!isAsyncThunkArray(asyncThunks)) { +- return isRejected()(asyncThunks[0]); +- } +- return function (action) { +- var matchers = asyncThunks.map(function (asyncThunk) { return asyncThunk.rejected; }); +- var combinedMatcher = isAnyOf.apply(void 0, matchers); +- return combinedMatcher(action); +- }; +- } +- function isRejectedWithValue() { +- var asyncThunks = []; +- for (var _b = 0; _b < arguments.length; _b++) { +- asyncThunks[_b] = arguments[_b]; +- } +- var hasFlag = function (action) { +- return action && action.meta && action.meta.rejectedWithValue; +- }; +- if (asyncThunks.length === 0) { +- return function (action) { +- var combinedMatcher = isAllOf(isRejected.apply(void 0, asyncThunks), hasFlag); +- return combinedMatcher(action); +- }; +- } +- if (!isAsyncThunkArray(asyncThunks)) { +- return isRejectedWithValue()(asyncThunks[0]); +- } +- return function (action) { +- var combinedMatcher = isAllOf(isRejected.apply(void 0, asyncThunks), hasFlag); +- return combinedMatcher(action); +- }; +- } +- function isFulfilled() { +- var asyncThunks = []; +- for (var _b = 0; _b < arguments.length; _b++) { +- asyncThunks[_b] = arguments[_b]; +- } +- if (asyncThunks.length === 0) { +- return function (action) { return hasExpectedRequestMetadata(action, ["fulfilled"]); }; +- } +- if (!isAsyncThunkArray(asyncThunks)) { +- return isFulfilled()(asyncThunks[0]); +- } +- return function (action) { +- var matchers = asyncThunks.map(function (asyncThunk) { return asyncThunk.fulfilled; }); +- var combinedMatcher = isAnyOf.apply(void 0, matchers); +- return combinedMatcher(action); +- }; +- } +- function isAsyncThunkAction() { +- var asyncThunks = []; +- for (var _b = 0; _b < arguments.length; _b++) { +- asyncThunks[_b] = arguments[_b]; +- } +- if (asyncThunks.length === 0) { +- return function (action) { return hasExpectedRequestMetadata(action, ["pending", "fulfilled", "rejected"]); }; +- } +- if (!isAsyncThunkArray(asyncThunks)) { +- return isAsyncThunkAction()(asyncThunks[0]); +- } +- return function (action) { +- var matchers = []; +- for (var _b = 0, asyncThunks_1 = asyncThunks; _b < asyncThunks_1.length; _b++) { +- var asyncThunk = asyncThunks_1[_b]; +- matchers.push(asyncThunk.pending, asyncThunk.rejected, asyncThunk.fulfilled); +- } +- var combinedMatcher = isAnyOf.apply(void 0, matchers); +- return combinedMatcher(action); +- }; +- } +- // src/index.ts +- N(); +- +- exports.MiddlewareArray = MiddlewareArray; +- exports.__DO_NOT_USE__ActionTypes = ActionTypes; +- exports.applyMiddleware = applyMiddleware; +- exports.bindActionCreators = bindActionCreators; +- exports.combineReducers = combineReducers; +- exports.compose = compose; +- exports.configureStore = configureStore; +- exports.createAction = createAction; +- exports.createAsyncThunk = createAsyncThunk; +- exports.createDraftSafeSelector = createDraftSafeSelector; +- exports.createEntityAdapter = createEntityAdapter; +- exports.createImmutableStateInvariantMiddleware = createImmutableStateInvariantMiddleware; +- exports.createNextState = immer_esm_default; +- exports.createReducer = createReducer; +- exports.createSelector = createSelector; +- exports.createSerializableStateInvariantMiddleware = createSerializableStateInvariantMiddleware; +- exports.createSlice = createSlice; +- exports.createStore = createStore; +- exports.current = D; +- exports.findNonSerializableValue = findNonSerializableValue; +- exports.freeze = d; +- exports.getDefaultMiddleware = getDefaultMiddleware; +- exports.getType = getType; +- exports.isAllOf = isAllOf; +- exports.isAnyOf = isAnyOf; +- exports.isAsyncThunkAction = isAsyncThunkAction; +- exports.isDraft = t; +- exports.isFulfilled = isFulfilled; +- exports.isImmutableDefault = isImmutableDefault; +- exports.isPending = isPending; +- exports.isPlain = isPlain; +- exports.isPlainObject = isPlainObject2; +- exports.isRejected = isRejected; +- exports.isRejectedWithValue = isRejectedWithValue; +- exports.miniSerializeError = miniSerializeError; +- exports.nanoid = nanoid; +- exports.original = e; +- exports.unwrapResult = unwrapResult; +- +- Object.defineProperty(exports, '__esModule', { value: true }); +- +-}))); +-//# sourceMappingURL=redux-toolkit.umd.js.map +diff --git a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.umd.js.map b/node_modules/@reduxjs/toolkit/dist/redux-toolkit.umd.js.map +deleted file mode 100644 +index 93dd946..0000000 +--- a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.umd.js.map ++++ /dev/null +@@ -1 +0,0 @@ +-{"version":3,"file":"redux-toolkit.umd.js","sources":["redux-toolkit.umd.js"],"sourcesContent":["var __extends = (this && this.__extends) || (function () {\r\n var extendStatics = function (d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n };\r\n return function (d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nvar __generator = (this && this.__generator) || function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n};\r\nvar __spreadArray = (this && this.__spreadArray) || function (to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n};\r\nvar __defProp = Object.defineProperty;\r\nvar __defProps = Object.defineProperties;\r\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\r\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\r\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\r\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\r\nvar __defNormalProp = function (obj, key, value) { return key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value: value }) : obj[key] = value; };\r\nvar __spreadValues = function (a2, b2) {\r\n for (var prop in b2 || (b2 = {}))\r\n if (__hasOwnProp.call(b2, prop))\r\n __defNormalProp(a2, prop, b2[prop]);\r\n if (__getOwnPropSymbols)\r\n for (var _b = 0, _c = __getOwnPropSymbols(b2); _b < _c.length; _b++) {\r\n var prop = _c[_b];\r\n if (__propIsEnum.call(b2, prop))\r\n __defNormalProp(a2, prop, b2[prop]);\r\n }\r\n return a2;\r\n};\r\nvar __spreadProps = function (a2, b2) { return __defProps(a2, __getOwnPropDescs(b2)); };\r\nvar __async = function (__this, __arguments, generator) {\r\n return new Promise(function (resolve, reject) {\r\n var fulfilled = function (value) {\r\n try {\r\n step(generator.next(value));\r\n }\r\n catch (e2) {\r\n reject(e2);\r\n }\r\n };\r\n var rejected = function (value) {\r\n try {\r\n step(generator.throw(value));\r\n }\r\n catch (e2) {\r\n reject(e2);\r\n }\r\n };\r\n var step = function (x2) { return x2.done ? resolve(x2.value) : Promise.resolve(x2.value).then(fulfilled, rejected); };\r\n step((generator = generator.apply(__this, __arguments)).next());\r\n });\r\n};\r\n// ../../node_modules/immer/dist/immer.esm.js\r\nfunction n(n2) {\r\n for (var t2 = arguments.length, r2 = Array(t2 > 1 ? t2 - 1 : 0), e2 = 1; e2 < t2; e2++)\r\n r2[e2 - 1] = arguments[e2];\r\n if (true) {\r\n var i2 = Y[n2], o2 = i2 ? typeof i2 == \"function\" ? i2.apply(null, r2) : i2 : \"unknown error nr: \" + n2;\r\n throw Error(\"[Immer] \" + o2);\r\n }\r\n throw Error(\"[Immer] minified error nr: \" + n2 + (r2.length ? \" \" + r2.map(function (n3) {\r\n return \"'\" + n3 + \"'\";\r\n }).join(\",\") : \"\") + \". Find the full error at: https://bit.ly/3cXEKWf\");\r\n}\r\nfunction t(n2) {\r\n return !!n2 && !!n2[Q];\r\n}\r\nfunction r(n2) {\r\n return !!n2 && (function (n3) {\r\n if (!n3 || typeof n3 != \"object\")\r\n return false;\r\n var t2 = Object.getPrototypeOf(n3);\r\n if (t2 === null)\r\n return true;\r\n var r2 = Object.hasOwnProperty.call(t2, \"constructor\") && t2.constructor;\r\n return r2 === Object || typeof r2 == \"function\" && Function.toString.call(r2) === Z;\r\n }(n2) || Array.isArray(n2) || !!n2[L] || !!n2.constructor[L] || s(n2) || v(n2));\r\n}\r\nfunction e(r2) {\r\n return t(r2) || n(23, r2), r2[Q].t;\r\n}\r\nfunction i(n2, t2, r2) {\r\n r2 === void 0 && (r2 = false), o(n2) === 0 ? (r2 ? Object.keys : nn)(n2).forEach(function (e2) {\r\n r2 && typeof e2 == \"symbol\" || t2(e2, n2[e2], n2);\r\n }) : n2.forEach(function (r3, e2) {\r\n return t2(e2, r3, n2);\r\n });\r\n}\r\nfunction o(n2) {\r\n var t2 = n2[Q];\r\n return t2 ? t2.i > 3 ? t2.i - 4 : t2.i : Array.isArray(n2) ? 1 : s(n2) ? 2 : v(n2) ? 3 : 0;\r\n}\r\nfunction u(n2, t2) {\r\n return o(n2) === 2 ? n2.has(t2) : Object.prototype.hasOwnProperty.call(n2, t2);\r\n}\r\nfunction a(n2, t2) {\r\n return o(n2) === 2 ? n2.get(t2) : n2[t2];\r\n}\r\nfunction f(n2, t2, r2) {\r\n var e2 = o(n2);\r\n e2 === 2 ? n2.set(t2, r2) : e2 === 3 ? (n2.delete(t2), n2.add(r2)) : n2[t2] = r2;\r\n}\r\nfunction c(n2, t2) {\r\n return n2 === t2 ? n2 !== 0 || 1 / n2 == 1 / t2 : n2 != n2 && t2 != t2;\r\n}\r\nfunction s(n2) {\r\n return X && n2 instanceof Map;\r\n}\r\nfunction v(n2) {\r\n return q && n2 instanceof Set;\r\n}\r\nfunction p(n2) {\r\n return n2.o || n2.t;\r\n}\r\nfunction l(n2) {\r\n if (Array.isArray(n2))\r\n return Array.prototype.slice.call(n2);\r\n var t2 = tn(n2);\r\n delete t2[Q];\r\n for (var r2 = nn(t2), e2 = 0; e2 < r2.length; e2++) {\r\n var i2 = r2[e2], o2 = t2[i2];\r\n o2.writable === false && (o2.writable = true, o2.configurable = true), (o2.get || o2.set) && (t2[i2] = { configurable: true, writable: true, enumerable: o2.enumerable, value: n2[i2] });\r\n }\r\n return Object.create(Object.getPrototypeOf(n2), t2);\r\n}\r\nfunction d(n2, e2) {\r\n return e2 === void 0 && (e2 = false), y(n2) || t(n2) || !r(n2) ? n2 : (o(n2) > 1 && (n2.set = n2.add = n2.clear = n2.delete = h), Object.freeze(n2), e2 && i(n2, function (n3, t2) {\r\n return d(t2, true);\r\n }, true), n2);\r\n}\r\nfunction h() {\r\n n(2);\r\n}\r\nfunction y(n2) {\r\n return n2 == null || typeof n2 != \"object\" || Object.isFrozen(n2);\r\n}\r\nfunction b(t2) {\r\n var r2 = rn[t2];\r\n return r2 || n(18, t2), r2;\r\n}\r\nfunction m(n2, t2) {\r\n rn[n2] || (rn[n2] = t2);\r\n}\r\nfunction _() {\r\n return U || n(0), U;\r\n}\r\nfunction j(n2, t2) {\r\n t2 && (b(\"Patches\"), n2.u = [], n2.s = [], n2.v = t2);\r\n}\r\nfunction O(n2) {\r\n g(n2), n2.p.forEach(S), n2.p = null;\r\n}\r\nfunction g(n2) {\r\n n2 === U && (U = n2.l);\r\n}\r\nfunction w(n2) {\r\n return U = { p: [], l: U, h: n2, m: true, _: 0 };\r\n}\r\nfunction S(n2) {\r\n var t2 = n2[Q];\r\n t2.i === 0 || t2.i === 1 ? t2.j() : t2.O = true;\r\n}\r\nfunction P(t2, e2) {\r\n e2._ = e2.p.length;\r\n var i2 = e2.p[0], o2 = t2 !== void 0 && t2 !== i2;\r\n return e2.h.g || b(\"ES5\").S(e2, t2, o2), o2 ? (i2[Q].P && (O(e2), n(4)), r(t2) && (t2 = M(e2, t2), e2.l || x(e2, t2)), e2.u && b(\"Patches\").M(i2[Q], t2, e2.u, e2.s)) : t2 = M(e2, i2, []), O(e2), e2.u && e2.v(e2.u, e2.s), t2 !== H ? t2 : void 0;\r\n}\r\nfunction M(n2, t2, r2) {\r\n if (y(t2))\r\n return t2;\r\n var e2 = t2[Q];\r\n if (!e2)\r\n return i(t2, function (i2, o3) {\r\n return A(n2, e2, t2, i2, o3, r2);\r\n }, true), t2;\r\n if (e2.A !== n2)\r\n return t2;\r\n if (!e2.P)\r\n return x(n2, e2.t, true), e2.t;\r\n if (!e2.I) {\r\n e2.I = true, e2.A._--;\r\n var o2 = e2.i === 4 || e2.i === 5 ? e2.o = l(e2.k) : e2.o;\r\n i(e2.i === 3 ? new Set(o2) : o2, function (t3, i2) {\r\n return A(n2, e2, o2, t3, i2, r2);\r\n }), x(n2, o2, false), r2 && n2.u && b(\"Patches\").R(e2, r2, n2.u, n2.s);\r\n }\r\n return e2.o;\r\n}\r\nfunction A(e2, i2, o2, a2, c2, s2) {\r\n if (c2 === o2 && n(5), t(c2)) {\r\n var v2 = M(e2, c2, s2 && i2 && i2.i !== 3 && !u(i2.D, a2) ? s2.concat(a2) : void 0);\r\n if (f(o2, a2, v2), !t(v2))\r\n return;\r\n e2.m = false;\r\n }\r\n if (r(c2) && !y(c2)) {\r\n if (!e2.h.F && e2._ < 1)\r\n return;\r\n M(e2, c2), i2 && i2.A.l || x(e2, c2);\r\n }\r\n}\r\nfunction x(n2, t2, r2) {\r\n r2 === void 0 && (r2 = false), n2.h.F && n2.m && d(t2, r2);\r\n}\r\nfunction z(n2, t2) {\r\n var r2 = n2[Q];\r\n return (r2 ? p(r2) : n2)[t2];\r\n}\r\nfunction I(n2, t2) {\r\n if (t2 in n2)\r\n for (var r2 = Object.getPrototypeOf(n2); r2;) {\r\n var e2 = Object.getOwnPropertyDescriptor(r2, t2);\r\n if (e2)\r\n return e2;\r\n r2 = Object.getPrototypeOf(r2);\r\n }\r\n}\r\nfunction k(n2) {\r\n n2.P || (n2.P = true, n2.l && k(n2.l));\r\n}\r\nfunction E(n2) {\r\n n2.o || (n2.o = l(n2.t));\r\n}\r\nfunction R(n2, t2, r2) {\r\n var e2 = s(t2) ? b(\"MapSet\").N(t2, r2) : v(t2) ? b(\"MapSet\").T(t2, r2) : n2.g ? function (n3, t3) {\r\n var r3 = Array.isArray(n3), e3 = { i: r3 ? 1 : 0, A: t3 ? t3.A : _(), P: false, I: false, D: {}, l: t3, t: n3, k: null, o: null, j: null, C: false }, i2 = e3, o2 = en;\r\n r3 && (i2 = [e3], o2 = on);\r\n var u2 = Proxy.revocable(i2, o2), a2 = u2.revoke, f2 = u2.proxy;\r\n return e3.k = f2, e3.j = a2, f2;\r\n }(t2, r2) : b(\"ES5\").J(t2, r2);\r\n return (r2 ? r2.A : _()).p.push(e2), e2;\r\n}\r\nfunction D(e2) {\r\n return t(e2) || n(22, e2), function n2(t2) {\r\n if (!r(t2))\r\n return t2;\r\n var e3, u2 = t2[Q], c2 = o(t2);\r\n if (u2) {\r\n if (!u2.P && (u2.i < 4 || !b(\"ES5\").K(u2)))\r\n return u2.t;\r\n u2.I = true, e3 = F(t2, c2), u2.I = false;\r\n }\r\n else\r\n e3 = F(t2, c2);\r\n return i(e3, function (t3, r2) {\r\n u2 && a(u2.t, t3) === r2 || f(e3, t3, n2(r2));\r\n }), c2 === 3 ? new Set(e3) : e3;\r\n }(e2);\r\n}\r\nfunction F(n2, t2) {\r\n switch (t2) {\r\n case 2:\r\n return new Map(n2);\r\n case 3:\r\n return Array.from(n2);\r\n }\r\n return l(n2);\r\n}\r\nfunction N() {\r\n function r2(n2, t2) {\r\n var r3 = s2[n2];\r\n return r3 ? r3.enumerable = t2 : s2[n2] = r3 = { configurable: true, enumerable: t2, get: function () {\r\n var t3 = this[Q];\r\n return f2(t3), en.get(t3, n2);\r\n }, set: function (t3) {\r\n var r4 = this[Q];\r\n f2(r4), en.set(r4, n2, t3);\r\n } }, r3;\r\n }\r\n function e2(n2) {\r\n for (var t2 = n2.length - 1; t2 >= 0; t2--) {\r\n var r3 = n2[t2][Q];\r\n if (!r3.P)\r\n switch (r3.i) {\r\n case 5:\r\n a2(r3) && k(r3);\r\n break;\r\n case 4:\r\n o2(r3) && k(r3);\r\n }\r\n }\r\n }\r\n function o2(n2) {\r\n for (var t2 = n2.t, r3 = n2.k, e3 = nn(r3), i2 = e3.length - 1; i2 >= 0; i2--) {\r\n var o3 = e3[i2];\r\n if (o3 !== Q) {\r\n var a3 = t2[o3];\r\n if (a3 === void 0 && !u(t2, o3))\r\n return true;\r\n var f3 = r3[o3], s3 = f3 && f3[Q];\r\n if (s3 ? s3.t !== a3 : !c(f3, a3))\r\n return true;\r\n }\r\n }\r\n var v2 = !!t2[Q];\r\n return e3.length !== nn(t2).length + (v2 ? 0 : 1);\r\n }\r\n function a2(n2) {\r\n var t2 = n2.k;\r\n if (t2.length !== n2.t.length)\r\n return true;\r\n var r3 = Object.getOwnPropertyDescriptor(t2, t2.length - 1);\r\n return !(!r3 || r3.get);\r\n }\r\n function f2(t2) {\r\n t2.O && n(3, JSON.stringify(p(t2)));\r\n }\r\n var s2 = {};\r\n m(\"ES5\", { J: function (n2, t2) {\r\n var e3 = Array.isArray(n2), i2 = function (n3, t3) {\r\n if (n3) {\r\n for (var e4 = Array(t3.length), i3 = 0; i3 < t3.length; i3++)\r\n Object.defineProperty(e4, \"\" + i3, r2(i3, true));\r\n return e4;\r\n }\r\n var o4 = tn(t3);\r\n delete o4[Q];\r\n for (var u2 = nn(o4), a3 = 0; a3 < u2.length; a3++) {\r\n var f3 = u2[a3];\r\n o4[f3] = r2(f3, n3 || !!o4[f3].enumerable);\r\n }\r\n return Object.create(Object.getPrototypeOf(t3), o4);\r\n }(e3, n2), o3 = { i: e3 ? 5 : 4, A: t2 ? t2.A : _(), P: false, I: false, D: {}, l: t2, t: n2, k: i2, o: null, O: false, C: false };\r\n return Object.defineProperty(i2, Q, { value: o3, writable: true }), i2;\r\n }, S: function (n2, r3, o3) {\r\n o3 ? t(r3) && r3[Q].A === n2 && e2(n2.p) : (n2.u && function n3(t2) {\r\n if (t2 && typeof t2 == \"object\") {\r\n var r4 = t2[Q];\r\n if (r4) {\r\n var e3 = r4.t, o4 = r4.k, f3 = r4.D, c2 = r4.i;\r\n if (c2 === 4)\r\n i(o4, function (t3) {\r\n t3 !== Q && (e3[t3] !== void 0 || u(e3, t3) ? f3[t3] || n3(o4[t3]) : (f3[t3] = true, k(r4)));\r\n }), i(e3, function (n4) {\r\n o4[n4] !== void 0 || u(o4, n4) || (f3[n4] = false, k(r4));\r\n });\r\n else if (c2 === 5) {\r\n if (a2(r4) && (k(r4), f3.length = true), o4.length < e3.length)\r\n for (var s3 = o4.length; s3 < e3.length; s3++)\r\n f3[s3] = false;\r\n else\r\n for (var v2 = e3.length; v2 < o4.length; v2++)\r\n f3[v2] = true;\r\n for (var p2 = Math.min(o4.length, e3.length), l2 = 0; l2 < p2; l2++)\r\n f3[l2] === void 0 && n3(o4[l2]);\r\n }\r\n }\r\n }\r\n }(n2.p[0]), e2(n2.p));\r\n }, K: function (n2) {\r\n return n2.i === 4 ? o2(n2) : a2(n2);\r\n } });\r\n}\r\nvar G;\r\nvar U;\r\nvar W = typeof Symbol != \"undefined\" && typeof Symbol(\"x\") == \"symbol\";\r\nvar X = typeof Map != \"undefined\";\r\nvar q = typeof Set != \"undefined\";\r\nvar B = typeof Proxy != \"undefined\" && Proxy.revocable !== void 0 && typeof Reflect != \"undefined\";\r\nvar H = W ? Symbol.for(\"immer-nothing\") : ((G = {})[\"immer-nothing\"] = true, G);\r\nvar L = W ? Symbol.for(\"immer-draftable\") : \"__$immer_draftable\";\r\nvar Q = W ? Symbol.for(\"immer-state\") : \"__$immer_state\";\r\nvar V = typeof Symbol != \"undefined\" && Symbol.iterator || \"@@iterator\";\r\nvar Y = { 0: \"Illegal state\", 1: \"Immer drafts cannot have computed properties\", 2: \"This object has been frozen and should not be mutated\", 3: function (n2) {\r\n return \"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? \" + n2;\r\n }, 4: \"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.\", 5: \"Immer forbids circular references\", 6: \"The first or second argument to `produce` must be a function\", 7: \"The third argument to `produce` must be a function or undefined\", 8: \"First argument to `createDraft` must be a plain object, an array, or an immerable object\", 9: \"First argument to `finishDraft` must be a draft returned by `createDraft`\", 10: \"The given draft is already finalized\", 11: \"Object.defineProperty() cannot be used on an Immer draft\", 12: \"Object.setPrototypeOf() cannot be used on an Immer draft\", 13: \"Immer only supports deleting array indices\", 14: \"Immer only supports setting array indices and the 'length' property\", 15: function (n2) {\r\n return \"Cannot apply patch, path doesn't resolve: \" + n2;\r\n }, 16: 'Sets cannot have \"replace\" patches.', 17: function (n2) {\r\n return \"Unsupported patch operation: \" + n2;\r\n }, 18: function (n2) {\r\n return \"The plugin for '\" + n2 + \"' has not been loaded into Immer. To enable the plugin, import and call `enable\" + n2 + \"()` when initializing your application.\";\r\n }, 20: \"Cannot use proxies if Proxy, Proxy.revocable or Reflect are not available\", 21: function (n2) {\r\n return \"produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '\" + n2 + \"'\";\r\n }, 22: function (n2) {\r\n return \"'current' expects a draft, got: \" + n2;\r\n }, 23: function (n2) {\r\n return \"'original' expects a draft, got: \" + n2;\r\n }, 24: \"Patching reserved attributes like __proto__, prototype and constructor is not allowed\" };\r\nvar Z = \"\" + Object.prototype.constructor;\r\nvar nn = typeof Reflect != \"undefined\" && Reflect.ownKeys ? Reflect.ownKeys : Object.getOwnPropertySymbols !== void 0 ? function (n2) {\r\n return Object.getOwnPropertyNames(n2).concat(Object.getOwnPropertySymbols(n2));\r\n} : Object.getOwnPropertyNames;\r\nvar tn = Object.getOwnPropertyDescriptors || function (n2) {\r\n var t2 = {};\r\n return nn(n2).forEach(function (r2) {\r\n t2[r2] = Object.getOwnPropertyDescriptor(n2, r2);\r\n }), t2;\r\n};\r\nvar rn = {};\r\nvar en = { get: function (n2, t2) {\r\n if (t2 === Q)\r\n return n2;\r\n var e2 = p(n2);\r\n if (!u(e2, t2))\r\n return function (n3, t3, r2) {\r\n var e3, i3 = I(t3, r2);\r\n return i3 ? \"value\" in i3 ? i3.value : (e3 = i3.get) === null || e3 === void 0 ? void 0 : e3.call(n3.k) : void 0;\r\n }(n2, e2, t2);\r\n var i2 = e2[t2];\r\n return n2.I || !r(i2) ? i2 : i2 === z(n2.t, t2) ? (E(n2), n2.o[t2] = R(n2.A.h, i2, n2)) : i2;\r\n }, has: function (n2, t2) {\r\n return t2 in p(n2);\r\n }, ownKeys: function (n2) {\r\n return Reflect.ownKeys(p(n2));\r\n }, set: function (n2, t2, r2) {\r\n var e2 = I(p(n2), t2);\r\n if (e2 == null ? void 0 : e2.set)\r\n return e2.set.call(n2.k, r2), true;\r\n if (!n2.P) {\r\n var i2 = z(p(n2), t2), o2 = i2 == null ? void 0 : i2[Q];\r\n if (o2 && o2.t === r2)\r\n return n2.o[t2] = r2, n2.D[t2] = false, true;\r\n if (c(r2, i2) && (r2 !== void 0 || u(n2.t, t2)))\r\n return true;\r\n E(n2), k(n2);\r\n }\r\n return n2.o[t2] === r2 && typeof r2 != \"number\" && (r2 !== void 0 || t2 in n2.o) || (n2.o[t2] = r2, n2.D[t2] = true, true);\r\n }, deleteProperty: function (n2, t2) {\r\n return z(n2.t, t2) !== void 0 || t2 in n2.t ? (n2.D[t2] = false, E(n2), k(n2)) : delete n2.D[t2], n2.o && delete n2.o[t2], true;\r\n }, getOwnPropertyDescriptor: function (n2, t2) {\r\n var r2 = p(n2), e2 = Reflect.getOwnPropertyDescriptor(r2, t2);\r\n return e2 ? { writable: true, configurable: n2.i !== 1 || t2 !== \"length\", enumerable: e2.enumerable, value: r2[t2] } : e2;\r\n }, defineProperty: function () {\r\n n(11);\r\n }, getPrototypeOf: function (n2) {\r\n return Object.getPrototypeOf(n2.t);\r\n }, setPrototypeOf: function () {\r\n n(12);\r\n } };\r\nvar on = {};\r\ni(en, function (n2, t2) {\r\n on[n2] = function () {\r\n return arguments[0] = arguments[0][0], t2.apply(this, arguments);\r\n };\r\n}), on.deleteProperty = function (t2, r2) {\r\n return isNaN(parseInt(r2)) && n(13), en.deleteProperty.call(this, t2[0], r2);\r\n}, on.set = function (t2, r2, e2) {\r\n return r2 !== \"length\" && isNaN(parseInt(r2)) && n(14), en.set.call(this, t2[0], r2, e2, t2[0]);\r\n};\r\nvar un = function () {\r\n function e2(t2) {\r\n var e3 = this;\r\n this.g = B, this.F = true, this.produce = function (t3, i3, o2) {\r\n if (typeof t3 == \"function\" && typeof i3 != \"function\") {\r\n var u2 = i3;\r\n i3 = t3;\r\n var a2 = e3;\r\n return function (n2) {\r\n var t4 = this;\r\n n2 === void 0 && (n2 = u2);\r\n for (var r2 = arguments.length, e4 = Array(r2 > 1 ? r2 - 1 : 0), o3 = 1; o3 < r2; o3++)\r\n e4[o3 - 1] = arguments[o3];\r\n return a2.produce(n2, function (n3) {\r\n var r3;\r\n return (r3 = i3).call.apply(r3, [t4, n3].concat(e4));\r\n });\r\n };\r\n }\r\n var f2;\r\n if (typeof i3 != \"function\" && n(6), o2 !== void 0 && typeof o2 != \"function\" && n(7), r(t3)) {\r\n var c2 = w(e3), s2 = R(e3, t3, void 0), v2 = true;\r\n try {\r\n f2 = i3(s2), v2 = false;\r\n }\r\n finally {\r\n v2 ? O(c2) : g(c2);\r\n }\r\n return typeof Promise != \"undefined\" && f2 instanceof Promise ? f2.then(function (n2) {\r\n return j(c2, o2), P(n2, c2);\r\n }, function (n2) {\r\n throw O(c2), n2;\r\n }) : (j(c2, o2), P(f2, c2));\r\n }\r\n if (!t3 || typeof t3 != \"object\") {\r\n if ((f2 = i3(t3)) === H)\r\n return;\r\n return f2 === void 0 && (f2 = t3), e3.F && d(f2, true), f2;\r\n }\r\n n(21, t3);\r\n }, this.produceWithPatches = function (n2, t3) {\r\n return typeof n2 == \"function\" ? function (t4) {\r\n for (var r3 = arguments.length, i4 = Array(r3 > 1 ? r3 - 1 : 0), o2 = 1; o2 < r3; o2++)\r\n i4[o2 - 1] = arguments[o2];\r\n return e3.produceWithPatches(t4, function (t5) {\r\n return n2.apply(void 0, [t5].concat(i4));\r\n });\r\n } : [e3.produce(n2, t3, function (n3, t4) {\r\n r2 = n3, i3 = t4;\r\n }), r2, i3];\r\n var r2, i3;\r\n }, typeof (t2 == null ? void 0 : t2.useProxies) == \"boolean\" && this.setUseProxies(t2.useProxies), typeof (t2 == null ? void 0 : t2.autoFreeze) == \"boolean\" && this.setAutoFreeze(t2.autoFreeze);\r\n }\r\n var i2 = e2.prototype;\r\n return i2.createDraft = function (e3) {\r\n r(e3) || n(8), t(e3) && (e3 = D(e3));\r\n var i3 = w(this), o2 = R(this, e3, void 0);\r\n return o2[Q].C = true, g(i3), o2;\r\n }, i2.finishDraft = function (t2, r2) {\r\n var e3 = t2 && t2[Q];\r\n e3 && e3.C || n(9), e3.I && n(10);\r\n var i3 = e3.A;\r\n return j(i3, r2), P(void 0, i3);\r\n }, i2.setAutoFreeze = function (n2) {\r\n this.F = n2;\r\n }, i2.setUseProxies = function (t2) {\r\n t2 && !B && n(20), this.g = t2;\r\n }, i2.applyPatches = function (n2, r2) {\r\n var e3;\r\n for (e3 = r2.length - 1; e3 >= 0; e3--) {\r\n var i3 = r2[e3];\r\n if (i3.path.length === 0 && i3.op === \"replace\") {\r\n n2 = i3.value;\r\n break;\r\n }\r\n }\r\n var o2 = b(\"Patches\").$;\r\n return t(n2) ? o2(n2, r2) : this.produce(n2, function (n3) {\r\n return o2(n3, r2.slice(e3 + 1));\r\n });\r\n }, e2;\r\n}();\r\nvar an = new un();\r\nvar fn = an.produce;\r\nvar cn = an.produceWithPatches.bind(an);\r\nvar sn = an.setAutoFreeze.bind(an);\r\nvar vn = an.setUseProxies.bind(an);\r\nvar pn = an.applyPatches.bind(an);\r\nvar ln = an.createDraft.bind(an);\r\nvar dn = an.finishDraft.bind(an);\r\nvar immer_esm_default = fn;\r\n// ../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\r\nfunction _defineProperty(obj, key, value) {\r\n if (key in obj) {\r\n Object.defineProperty(obj, key, {\r\n value: value,\r\n enumerable: true,\r\n configurable: true,\r\n writable: true\r\n });\r\n }\r\n else {\r\n obj[key] = value;\r\n }\r\n return obj;\r\n}\r\n// ../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js\r\nfunction ownKeys(object, enumerableOnly) {\r\n var keys = Object.keys(object);\r\n if (Object.getOwnPropertySymbols) {\r\n var symbols = Object.getOwnPropertySymbols(object);\r\n if (enumerableOnly) {\r\n symbols = symbols.filter(function (sym) {\r\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\r\n });\r\n }\r\n keys.push.apply(keys, symbols);\r\n }\r\n return keys;\r\n}\r\nfunction _objectSpread2(target) {\r\n for (var i2 = 1; i2 < arguments.length; i2++) {\r\n var source = arguments[i2] != null ? arguments[i2] : {};\r\n if (i2 % 2) {\r\n ownKeys(Object(source), true).forEach(function (key) {\r\n _defineProperty(target, key, source[key]);\r\n });\r\n }\r\n else if (Object.getOwnPropertyDescriptors) {\r\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\r\n }\r\n else {\r\n ownKeys(Object(source)).forEach(function (key) {\r\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\r\n });\r\n }\r\n }\r\n return target;\r\n}\r\n// ../../node_modules/redux/es/redux.js\r\nvar $$observable = function () {\r\n return typeof Symbol === \"function\" && Symbol.observable || \"@@observable\";\r\n}();\r\nvar randomString = function randomString2() {\r\n return Math.random().toString(36).substring(7).split(\"\").join(\".\");\r\n};\r\nvar ActionTypes = {\r\n INIT: \"@@redux/INIT\" + randomString(),\r\n REPLACE: \"@@redux/REPLACE\" + randomString(),\r\n PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() {\r\n return \"@@redux/PROBE_UNKNOWN_ACTION\" + randomString();\r\n }\r\n};\r\nfunction isPlainObject(obj) {\r\n if (typeof obj !== \"object\" || obj === null)\r\n return false;\r\n var proto = obj;\r\n while (Object.getPrototypeOf(proto) !== null) {\r\n proto = Object.getPrototypeOf(proto);\r\n }\r\n return Object.getPrototypeOf(obj) === proto;\r\n}\r\nfunction kindOf(val) {\r\n var typeOfVal = typeof val;\r\n if (true) {\r\n var miniKindOf = function (val2) {\r\n if (val2 === void 0)\r\n return \"undefined\";\r\n if (val2 === null)\r\n return \"null\";\r\n var type = typeof val2;\r\n switch (type) {\r\n case \"boolean\":\r\n case \"string\":\r\n case \"number\":\r\n case \"symbol\":\r\n case \"function\": {\r\n return type;\r\n }\r\n }\r\n if (Array.isArray(val2))\r\n return \"array\";\r\n if (isDate_1(val2))\r\n return \"date\";\r\n if (isError_1(val2))\r\n return \"error\";\r\n var constructorName = ctorName_1(val2);\r\n switch (constructorName) {\r\n case \"Symbol\":\r\n case \"Promise\":\r\n case \"WeakMap\":\r\n case \"WeakSet\":\r\n case \"Map\":\r\n case \"Set\":\r\n return constructorName;\r\n }\r\n return type.slice(8, -1).toLowerCase().replace(/\\s/g, \"\");\r\n }, ctorName_1 = function (val2) {\r\n return typeof val2.constructor === \"function\" ? val2.constructor.name : null;\r\n }, isError_1 = function (val2) {\r\n return val2 instanceof Error || typeof val2.message === \"string\" && val2.constructor && typeof val2.constructor.stackTraceLimit === \"number\";\r\n }, isDate_1 = function (val2) {\r\n if (val2 instanceof Date)\r\n return true;\r\n return typeof val2.toDateString === \"function\" && typeof val2.getDate === \"function\" && typeof val2.setDate === \"function\";\r\n };\r\n typeOfVal = miniKindOf(val);\r\n }\r\n return typeOfVal;\r\n}\r\nfunction createStore(reducer, preloadedState, enhancer) {\r\n var _ref2;\r\n if (typeof preloadedState === \"function\" && typeof enhancer === \"function\" || typeof enhancer === \"function\" && typeof arguments[3] === \"function\") {\r\n throw new Error(false ? formatProdErrorMessage(0) : \"It looks like you are passing several store enhancers to createStore(). This is not supported. Instead, compose them together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.\");\r\n }\r\n if (typeof preloadedState === \"function\" && typeof enhancer === \"undefined\") {\r\n enhancer = preloadedState;\r\n preloadedState = void 0;\r\n }\r\n if (typeof enhancer !== \"undefined\") {\r\n if (typeof enhancer !== \"function\") {\r\n throw new Error(false ? formatProdErrorMessage(1) : \"Expected the enhancer to be a function. Instead, received: '\" + kindOf(enhancer) + \"'\");\r\n }\r\n return enhancer(createStore)(reducer, preloadedState);\r\n }\r\n if (typeof reducer !== \"function\") {\r\n throw new Error(false ? formatProdErrorMessage(2) : \"Expected the root reducer to be a function. Instead, received: '\" + kindOf(reducer) + \"'\");\r\n }\r\n var currentReducer = reducer;\r\n var currentState = preloadedState;\r\n var currentListeners = [];\r\n var nextListeners = currentListeners;\r\n var isDispatching = false;\r\n function ensureCanMutateNextListeners() {\r\n if (nextListeners === currentListeners) {\r\n nextListeners = currentListeners.slice();\r\n }\r\n }\r\n function getState() {\r\n if (isDispatching) {\r\n throw new Error(false ? formatProdErrorMessage(3) : \"You may not call store.getState() while the reducer is executing. The reducer has already received the state as an argument. Pass it down from the top reducer instead of reading it from the store.\");\r\n }\r\n return currentState;\r\n }\r\n function subscribe(listener) {\r\n if (typeof listener !== \"function\") {\r\n throw new Error(false ? formatProdErrorMessage(4) : \"Expected the listener to be a function. Instead, received: '\" + kindOf(listener) + \"'\");\r\n }\r\n if (isDispatching) {\r\n throw new Error(false ? formatProdErrorMessage(5) : \"You may not call store.subscribe() while the reducer is executing. If you would like to be notified after the store has been updated, subscribe from a component and invoke store.getState() in the callback to access the latest state. See https://redux.js.org/api/store#subscribelistener for more details.\");\r\n }\r\n var isSubscribed = true;\r\n ensureCanMutateNextListeners();\r\n nextListeners.push(listener);\r\n return function unsubscribe() {\r\n if (!isSubscribed) {\r\n return;\r\n }\r\n if (isDispatching) {\r\n throw new Error(false ? formatProdErrorMessage(6) : \"You may not unsubscribe from a store listener while the reducer is executing. See https://redux.js.org/api/store#subscribelistener for more details.\");\r\n }\r\n isSubscribed = false;\r\n ensureCanMutateNextListeners();\r\n var index = nextListeners.indexOf(listener);\r\n nextListeners.splice(index, 1);\r\n currentListeners = null;\r\n };\r\n }\r\n function dispatch(action) {\r\n if (!isPlainObject(action)) {\r\n throw new Error(false ? formatProdErrorMessage(7) : \"Actions must be plain objects. Instead, the actual type was: '\" + kindOf(action) + \"'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.\");\r\n }\r\n if (typeof action.type === \"undefined\") {\r\n throw new Error(false ? formatProdErrorMessage(8) : 'Actions may not have an undefined \"type\" property. You may have misspelled an action type string constant.');\r\n }\r\n if (isDispatching) {\r\n throw new Error(false ? formatProdErrorMessage(9) : \"Reducers may not dispatch actions.\");\r\n }\r\n try {\r\n isDispatching = true;\r\n currentState = currentReducer(currentState, action);\r\n }\r\n finally {\r\n isDispatching = false;\r\n }\r\n var listeners = currentListeners = nextListeners;\r\n for (var i2 = 0; i2 < listeners.length; i2++) {\r\n var listener = listeners[i2];\r\n listener();\r\n }\r\n return action;\r\n }\r\n function replaceReducer(nextReducer) {\r\n if (typeof nextReducer !== \"function\") {\r\n throw new Error(false ? formatProdErrorMessage(10) : \"Expected the nextReducer to be a function. Instead, received: '\" + kindOf(nextReducer));\r\n }\r\n currentReducer = nextReducer;\r\n dispatch({\r\n type: ActionTypes.REPLACE\r\n });\r\n }\r\n function observable() {\r\n var _ref;\r\n var outerSubscribe = subscribe;\r\n return _ref = {\r\n subscribe: function subscribe2(observer) {\r\n if (typeof observer !== \"object\" || observer === null) {\r\n throw new Error(false ? formatProdErrorMessage(11) : \"Expected the observer to be an object. Instead, received: '\" + kindOf(observer) + \"'\");\r\n }\r\n function observeState() {\r\n if (observer.next) {\r\n observer.next(getState());\r\n }\r\n }\r\n observeState();\r\n var unsubscribe = outerSubscribe(observeState);\r\n return {\r\n unsubscribe: unsubscribe\r\n };\r\n }\r\n }, _ref[$$observable] = function () {\r\n return this;\r\n }, _ref;\r\n }\r\n dispatch({\r\n type: ActionTypes.INIT\r\n });\r\n return _ref2 = {\r\n dispatch: dispatch,\r\n subscribe: subscribe,\r\n getState: getState,\r\n replaceReducer: replaceReducer\r\n }, _ref2[$$observable] = observable, _ref2;\r\n}\r\nfunction warning(message) {\r\n if (typeof console !== \"undefined\" && typeof console.error === \"function\") {\r\n console.error(message);\r\n }\r\n try {\r\n throw new Error(message);\r\n }\r\n catch (e2) {\r\n }\r\n}\r\nfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\r\n var reducerKeys = Object.keys(reducers);\r\n var argumentName = action && action.type === ActionTypes.INIT ? \"preloadedState argument passed to createStore\" : \"previous state received by the reducer\";\r\n if (reducerKeys.length === 0) {\r\n return \"Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.\";\r\n }\r\n if (!isPlainObject(inputState)) {\r\n return \"The \" + argumentName + ' has unexpected type of \"' + kindOf(inputState) + '\". Expected argument to be an object with the following ' + ('keys: \"' + reducerKeys.join('\", \"') + '\"');\r\n }\r\n var unexpectedKeys = Object.keys(inputState).filter(function (key) {\r\n return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];\r\n });\r\n unexpectedKeys.forEach(function (key) {\r\n unexpectedKeyCache[key] = true;\r\n });\r\n if (action && action.type === ActionTypes.REPLACE)\r\n return;\r\n if (unexpectedKeys.length > 0) {\r\n return \"Unexpected \" + (unexpectedKeys.length > 1 ? \"keys\" : \"key\") + \" \" + ('\"' + unexpectedKeys.join('\", \"') + '\" found in ' + argumentName + \". \") + \"Expected to find one of the known reducer keys instead: \" + ('\"' + reducerKeys.join('\", \"') + '\". Unexpected keys will be ignored.');\r\n }\r\n}\r\nfunction assertReducerShape(reducers) {\r\n Object.keys(reducers).forEach(function (key) {\r\n var reducer = reducers[key];\r\n var initialState = reducer(void 0, {\r\n type: ActionTypes.INIT\r\n });\r\n if (typeof initialState === \"undefined\") {\r\n throw new Error(false ? formatProdErrorMessage(12) : 'The slice reducer for key \"' + key + \"\\\" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.\");\r\n }\r\n if (typeof reducer(void 0, {\r\n type: ActionTypes.PROBE_UNKNOWN_ACTION()\r\n }) === \"undefined\") {\r\n throw new Error(false ? formatProdErrorMessage(13) : 'The slice reducer for key \"' + key + '\" returned undefined when probed with a random type. ' + (\"Don't try to handle '\" + ActionTypes.INIT + \"' or other actions in \\\"redux/*\\\" \") + \"namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined, but can be null.\");\r\n }\r\n });\r\n}\r\nfunction combineReducers(reducers) {\r\n var reducerKeys = Object.keys(reducers);\r\n var finalReducers = {};\r\n for (var i2 = 0; i2 < reducerKeys.length; i2++) {\r\n var key = reducerKeys[i2];\r\n if (true) {\r\n if (typeof reducers[key] === \"undefined\") {\r\n warning('No reducer provided for key \"' + key + '\"');\r\n }\r\n }\r\n if (typeof reducers[key] === \"function\") {\r\n finalReducers[key] = reducers[key];\r\n }\r\n }\r\n var finalReducerKeys = Object.keys(finalReducers);\r\n var unexpectedKeyCache;\r\n if (true) {\r\n unexpectedKeyCache = {};\r\n }\r\n var shapeAssertionError;\r\n try {\r\n assertReducerShape(finalReducers);\r\n }\r\n catch (e2) {\r\n shapeAssertionError = e2;\r\n }\r\n return function combination(state, action) {\r\n if (state === void 0) {\r\n state = {};\r\n }\r\n if (shapeAssertionError) {\r\n throw shapeAssertionError;\r\n }\r\n if (true) {\r\n var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);\r\n if (warningMessage) {\r\n warning(warningMessage);\r\n }\r\n }\r\n var hasChanged = false;\r\n var nextState = {};\r\n for (var _i = 0; _i < finalReducerKeys.length; _i++) {\r\n var _key = finalReducerKeys[_i];\r\n var reducer = finalReducers[_key];\r\n var previousStateForKey = state[_key];\r\n var nextStateForKey = reducer(previousStateForKey, action);\r\n if (typeof nextStateForKey === \"undefined\") {\r\n var actionType = action && action.type;\r\n throw new Error(false ? formatProdErrorMessage(14) : \"When called with an action of type \" + (actionType ? '\"' + String(actionType) + '\"' : \"(unknown type)\") + ', the slice reducer for key \"' + _key + '\" returned undefined. To ignore an action, you must explicitly return the previous state. If you want this reducer to hold no value, you can return null instead of undefined.');\r\n }\r\n nextState[_key] = nextStateForKey;\r\n hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\r\n }\r\n hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;\r\n return hasChanged ? nextState : state;\r\n };\r\n}\r\nfunction bindActionCreator(actionCreator, dispatch) {\r\n return function () {\r\n return dispatch(actionCreator.apply(this, arguments));\r\n };\r\n}\r\nfunction bindActionCreators(actionCreators, dispatch) {\r\n if (typeof actionCreators === \"function\") {\r\n return bindActionCreator(actionCreators, dispatch);\r\n }\r\n if (typeof actionCreators !== \"object\" || actionCreators === null) {\r\n throw new Error(false ? formatProdErrorMessage(16) : \"bindActionCreators expected an object or a function, but instead received: '\" + kindOf(actionCreators) + \"'. Did you write \\\"import ActionCreators from\\\" instead of \\\"import * as ActionCreators from\\\"?\");\r\n }\r\n var boundActionCreators = {};\r\n for (var key in actionCreators) {\r\n var actionCreator = actionCreators[key];\r\n if (typeof actionCreator === \"function\") {\r\n boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\r\n }\r\n }\r\n return boundActionCreators;\r\n}\r\nfunction compose() {\r\n for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\r\n funcs[_key] = arguments[_key];\r\n }\r\n if (funcs.length === 0) {\r\n return function (arg) {\r\n return arg;\r\n };\r\n }\r\n if (funcs.length === 1) {\r\n return funcs[0];\r\n }\r\n return funcs.reduce(function (a2, b2) {\r\n return function () {\r\n return a2(b2.apply(void 0, arguments));\r\n };\r\n });\r\n}\r\nfunction applyMiddleware() {\r\n for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) {\r\n middlewares[_key] = arguments[_key];\r\n }\r\n return function (createStore2) {\r\n return function () {\r\n var store = createStore2.apply(void 0, arguments);\r\n var _dispatch = function dispatch() {\r\n throw new Error(false ? formatProdErrorMessage(15) : \"Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch.\");\r\n };\r\n var middlewareAPI = {\r\n getState: store.getState,\r\n dispatch: function dispatch() {\r\n return _dispatch.apply(void 0, arguments);\r\n }\r\n };\r\n var chain = middlewares.map(function (middleware) {\r\n return middleware(middlewareAPI);\r\n });\r\n _dispatch = compose.apply(void 0, chain)(store.dispatch);\r\n return _objectSpread2(_objectSpread2({}, store), {}, {\r\n dispatch: _dispatch\r\n });\r\n };\r\n };\r\n}\r\nfunction isCrushed() {\r\n}\r\nif (typeof isCrushed.name === \"string\" && isCrushed.name !== \"isCrushed\") {\r\n warning('You are currently using minified code outside of NODE_ENV === \"production\". This means that you are running a slower development build of Redux. You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify or setting mode to production in webpack (https://webpack.js.org/concepts/mode/) to ensure you have the correct code for your production build.');\r\n}\r\n// ../../node_modules/reselect/es/index.js\r\nfunction defaultEqualityCheck(a2, b2) {\r\n return a2 === b2;\r\n}\r\nfunction areArgumentsShallowlyEqual(equalityCheck, prev, next) {\r\n if (prev === null || next === null || prev.length !== next.length) {\r\n return false;\r\n }\r\n var length = prev.length;\r\n for (var i2 = 0; i2 < length; i2++) {\r\n if (!equalityCheck(prev[i2], next[i2])) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction defaultMemoize(func) {\r\n var equalityCheck = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : defaultEqualityCheck;\r\n var lastArgs = null;\r\n var lastResult = null;\r\n return function () {\r\n if (!areArgumentsShallowlyEqual(equalityCheck, lastArgs, arguments)) {\r\n lastResult = func.apply(null, arguments);\r\n }\r\n lastArgs = arguments;\r\n return lastResult;\r\n };\r\n}\r\nfunction getDependencies(funcs) {\r\n var dependencies = Array.isArray(funcs[0]) ? funcs[0] : funcs;\r\n if (!dependencies.every(function (dep) {\r\n return typeof dep === \"function\";\r\n })) {\r\n var dependencyTypes = dependencies.map(function (dep) {\r\n return typeof dep;\r\n }).join(\", \");\r\n throw new Error(\"Selector creators expect all input-selectors to be functions, \" + (\"instead received the following types: [\" + dependencyTypes + \"]\"));\r\n }\r\n return dependencies;\r\n}\r\nfunction createSelectorCreator(memoize) {\r\n for (var _len = arguments.length, memoizeOptions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\r\n memoizeOptions[_key - 1] = arguments[_key];\r\n }\r\n return function () {\r\n for (var _len2 = arguments.length, funcs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\r\n funcs[_key2] = arguments[_key2];\r\n }\r\n var recomputations = 0;\r\n var resultFunc = funcs.pop();\r\n var dependencies = getDependencies(funcs);\r\n var memoizedResultFunc = memoize.apply(void 0, [function () {\r\n recomputations++;\r\n return resultFunc.apply(null, arguments);\r\n }].concat(memoizeOptions));\r\n var selector = memoize(function () {\r\n var params = [];\r\n var length = dependencies.length;\r\n for (var i2 = 0; i2 < length; i2++) {\r\n params.push(dependencies[i2].apply(null, arguments));\r\n }\r\n return memoizedResultFunc.apply(null, params);\r\n });\r\n selector.resultFunc = resultFunc;\r\n selector.dependencies = dependencies;\r\n selector.recomputations = function () {\r\n return recomputations;\r\n };\r\n selector.resetRecomputations = function () {\r\n return recomputations = 0;\r\n };\r\n return selector;\r\n };\r\n}\r\nvar createSelector = createSelectorCreator(defaultMemoize);\r\n// src/createDraftSafeSelector.ts\r\nvar createDraftSafeSelector = function () {\r\n var args = [];\r\n for (var _b = 0; _b < arguments.length; _b++) {\r\n args[_b] = arguments[_b];\r\n }\r\n var selector = createSelector.apply(void 0, args);\r\n var wrappedSelector = function (value) {\r\n var rest = [];\r\n for (var _b = 1; _b < arguments.length; _b++) {\r\n rest[_b - 1] = arguments[_b];\r\n }\r\n return selector.apply(void 0, __spreadArray([t(value) ? D(value) : value], rest));\r\n };\r\n return wrappedSelector;\r\n};\r\n// src/devtoolsExtension.ts\r\nvar composeWithDevTools = typeof window !== \"undefined\" && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : function () {\r\n if (arguments.length === 0)\r\n return void 0;\r\n if (typeof arguments[0] === \"object\")\r\n return compose;\r\n return compose.apply(null, arguments);\r\n};\r\nvar devToolsEnhancer = typeof window !== \"undefined\" && window.__REDUX_DEVTOOLS_EXTENSION__ ? window.__REDUX_DEVTOOLS_EXTENSION__ : function () {\r\n return function (noop) {\r\n return noop;\r\n };\r\n};\r\n// src/isPlainObject.ts\r\nfunction isPlainObject2(value) {\r\n if (typeof value !== \"object\" || value === null)\r\n return false;\r\n var proto = value;\r\n while (Object.getPrototypeOf(proto) !== null) {\r\n proto = Object.getPrototypeOf(proto);\r\n }\r\n return Object.getPrototypeOf(value) === proto;\r\n}\r\n// ../../node_modules/redux-thunk/es/index.js\r\nfunction createThunkMiddleware(extraArgument) {\r\n return function (_ref) {\r\n var dispatch = _ref.dispatch, getState = _ref.getState;\r\n return function (next) {\r\n return function (action) {\r\n if (typeof action === \"function\") {\r\n return action(dispatch, getState, extraArgument);\r\n }\r\n return next(action);\r\n };\r\n };\r\n };\r\n}\r\nvar thunk = createThunkMiddleware();\r\nthunk.withExtraArgument = createThunkMiddleware;\r\nvar es_default = thunk;\r\n// src/utils.ts\r\nfunction getTimeMeasureUtils(maxDelay, fnName) {\r\n var elapsed = 0;\r\n return {\r\n measureTime: function (fn2) {\r\n var started = Date.now();\r\n try {\r\n return fn2();\r\n }\r\n finally {\r\n var finished = Date.now();\r\n elapsed += finished - started;\r\n }\r\n },\r\n warnIfExceeded: function () {\r\n if (elapsed > maxDelay) {\r\n console.warn(fnName + \" took \" + elapsed + \"ms, which is more than the warning threshold of \" + maxDelay + \"ms. \\nIf your state or actions are very large, you may want to disable the middleware as it might cause too much of a slowdown in development mode. See https://redux-toolkit.js.org/api/getDefaultMiddleware for instructions.\\nIt is disabled in production builds, so you don't need to worry about that.\");\r\n }\r\n }\r\n };\r\n}\r\nvar MiddlewareArray = /** @class */ (function (_super) {\r\n __extends(MiddlewareArray, _super);\r\n function MiddlewareArray() {\r\n var args = [];\r\n for (var _b = 0; _b < arguments.length; _b++) {\r\n args[_b] = arguments[_b];\r\n }\r\n var _this = _super.apply(this, args) || this;\r\n Object.setPrototypeOf(_this, MiddlewareArray.prototype);\r\n return _this;\r\n }\r\n Object.defineProperty(MiddlewareArray, Symbol.species, {\r\n get: function () {\r\n return MiddlewareArray;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n MiddlewareArray.prototype.concat = function () {\r\n var arr = [];\r\n for (var _b = 0; _b < arguments.length; _b++) {\r\n arr[_b] = arguments[_b];\r\n }\r\n return _super.prototype.concat.apply(this, arr);\r\n };\r\n MiddlewareArray.prototype.prepend = function () {\r\n var arr = [];\r\n for (var _b = 0; _b < arguments.length; _b++) {\r\n arr[_b] = arguments[_b];\r\n }\r\n if (arr.length === 1 && Array.isArray(arr[0])) {\r\n return new (MiddlewareArray.bind.apply(MiddlewareArray, __spreadArray([void 0], arr[0].concat(this))))();\r\n }\r\n return new (MiddlewareArray.bind.apply(MiddlewareArray, __spreadArray([void 0], arr.concat(this))))();\r\n };\r\n return MiddlewareArray;\r\n}(Array));\r\n// src/immutableStateInvariantMiddleware.ts\r\nvar isProduction = false;\r\nvar prefix = \"Invariant failed\";\r\nfunction invariant(condition, message) {\r\n if (condition) {\r\n return;\r\n }\r\n if (isProduction) {\r\n throw new Error(prefix);\r\n }\r\n throw new Error(prefix + \": \" + (message || \"\"));\r\n}\r\nfunction stringify(obj, serializer, indent, decycler) {\r\n return JSON.stringify(obj, getSerialize(serializer, decycler), indent);\r\n}\r\nfunction getSerialize(serializer, decycler) {\r\n var stack = [], keys = [];\r\n if (!decycler)\r\n decycler = function (_2, value) {\r\n if (stack[0] === value)\r\n return \"[Circular ~]\";\r\n return \"[Circular ~.\" + keys.slice(0, stack.indexOf(value)).join(\".\") + \"]\";\r\n };\r\n return function (key, value) {\r\n if (stack.length > 0) {\r\n var thisPos = stack.indexOf(this);\r\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\r\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\r\n if (~stack.indexOf(value))\r\n value = decycler.call(this, key, value);\r\n }\r\n else\r\n stack.push(value);\r\n return serializer == null ? value : serializer.call(this, key, value);\r\n };\r\n}\r\nfunction isImmutableDefault(value) {\r\n return typeof value !== \"object\" || value === null || typeof value === \"undefined\" || Object.isFrozen(value);\r\n}\r\nfunction trackForMutations(isImmutable, ignorePaths, obj) {\r\n var trackedProperties = trackProperties(isImmutable, ignorePaths, obj);\r\n return {\r\n detectMutations: function () {\r\n return detectMutations(isImmutable, ignorePaths, trackedProperties, obj);\r\n }\r\n };\r\n}\r\nfunction trackProperties(isImmutable, ignorePaths, obj, path) {\r\n if (ignorePaths === void 0) { ignorePaths = []; }\r\n if (path === void 0) { path = \"\"; }\r\n var tracked = { value: obj };\r\n if (!isImmutable(obj)) {\r\n tracked.children = {};\r\n for (var key in obj) {\r\n var childPath = path ? path + \".\" + key : key;\r\n if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) {\r\n continue;\r\n }\r\n tracked.children[key] = trackProperties(isImmutable, ignorePaths, obj[key], childPath);\r\n }\r\n }\r\n return tracked;\r\n}\r\nfunction detectMutations(isImmutable, ignorePaths, trackedProperty, obj, sameParentRef, path) {\r\n if (ignorePaths === void 0) { ignorePaths = []; }\r\n if (sameParentRef === void 0) { sameParentRef = false; }\r\n if (path === void 0) { path = \"\"; }\r\n var prevObj = trackedProperty ? trackedProperty.value : void 0;\r\n var sameRef = prevObj === obj;\r\n if (sameParentRef && !sameRef && !Number.isNaN(obj)) {\r\n return { wasMutated: true, path: path };\r\n }\r\n if (isImmutable(prevObj) || isImmutable(obj)) {\r\n return { wasMutated: false };\r\n }\r\n var keysToDetect = {};\r\n for (var key in trackedProperty.children) {\r\n keysToDetect[key] = true;\r\n }\r\n for (var key in obj) {\r\n keysToDetect[key] = true;\r\n }\r\n for (var key in keysToDetect) {\r\n var childPath = path ? path + \".\" + key : key;\r\n if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) {\r\n continue;\r\n }\r\n var result = detectMutations(isImmutable, ignorePaths, trackedProperty.children[key], obj[key], sameRef, childPath);\r\n if (result.wasMutated) {\r\n return result;\r\n }\r\n }\r\n return { wasMutated: false };\r\n}\r\nfunction createImmutableStateInvariantMiddleware(options) {\r\n if (options === void 0) { options = {}; }\r\n if (false) {\r\n return function () { return function (next) { return function (action) { return next(action); }; }; };\r\n }\r\n var _b = options.isImmutable, isImmutable = _b === void 0 ? isImmutableDefault : _b, ignoredPaths = options.ignoredPaths, _c = options.warnAfter, warnAfter = _c === void 0 ? 32 : _c, ignore = options.ignore;\r\n ignoredPaths = ignoredPaths || ignore;\r\n var track = trackForMutations.bind(null, isImmutable, ignoredPaths);\r\n return function (_b) {\r\n var getState = _b.getState;\r\n var state = getState();\r\n var tracker = track(state);\r\n var result;\r\n return function (next) { return function (action) {\r\n var measureUtils = getTimeMeasureUtils(warnAfter, \"ImmutableStateInvariantMiddleware\");\r\n measureUtils.measureTime(function () {\r\n state = getState();\r\n result = tracker.detectMutations();\r\n tracker = track(state);\r\n invariant(!result.wasMutated, \"A state mutation was detected between dispatches, in the path '\" + (result.path || \"\") + \"'. This may cause incorrect behavior. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)\");\r\n });\r\n var dispatchedAction = next(action);\r\n measureUtils.measureTime(function () {\r\n state = getState();\r\n result = tracker.detectMutations();\r\n tracker = track(state);\r\n result.wasMutated && invariant(!result.wasMutated, \"A state mutation was detected inside a dispatch, in the path: \" + (result.path || \"\") + \". Take a look at the reducer(s) handling the action \" + stringify(action) + \". (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)\");\r\n });\r\n measureUtils.warnIfExceeded();\r\n return dispatchedAction;\r\n }; };\r\n };\r\n}\r\n// src/serializableStateInvariantMiddleware.ts\r\nfunction isPlain(val) {\r\n var type = typeof val;\r\n return type === \"undefined\" || val === null || type === \"string\" || type === \"boolean\" || type === \"number\" || Array.isArray(val) || isPlainObject2(val);\r\n}\r\nfunction findNonSerializableValue(value, path, isSerializable, getEntries, ignoredPaths) {\r\n if (path === void 0) { path = \"\"; }\r\n if (isSerializable === void 0) { isSerializable = isPlain; }\r\n if (ignoredPaths === void 0) { ignoredPaths = []; }\r\n var foundNestedSerializable;\r\n if (!isSerializable(value)) {\r\n return {\r\n keyPath: path || \"\",\r\n value: value\r\n };\r\n }\r\n if (typeof value !== \"object\" || value === null) {\r\n return false;\r\n }\r\n var entries = getEntries != null ? getEntries(value) : Object.entries(value);\r\n var hasIgnoredPaths = ignoredPaths.length > 0;\r\n for (var _b = 0, entries_1 = entries; _b < entries_1.length; _b++) {\r\n var _c = entries_1[_b], key = _c[0], nestedValue = _c[1];\r\n var nestedPath = path ? path + \".\" + key : key;\r\n if (hasIgnoredPaths && ignoredPaths.indexOf(nestedPath) >= 0) {\r\n continue;\r\n }\r\n if (!isSerializable(nestedValue)) {\r\n return {\r\n keyPath: nestedPath,\r\n value: nestedValue\r\n };\r\n }\r\n if (typeof nestedValue === \"object\") {\r\n foundNestedSerializable = findNonSerializableValue(nestedValue, nestedPath, isSerializable, getEntries, ignoredPaths);\r\n if (foundNestedSerializable) {\r\n return foundNestedSerializable;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\nfunction createSerializableStateInvariantMiddleware(options) {\r\n if (options === void 0) { options = {}; }\r\n if (false) {\r\n return function () { return function (next) { return function (action) { return next(action); }; }; };\r\n }\r\n var _b = options.isSerializable, isSerializable = _b === void 0 ? isPlain : _b, getEntries = options.getEntries, _c = options.ignoredActions, ignoredActions = _c === void 0 ? [] : _c, _d = options.ignoredActionPaths, ignoredActionPaths = _d === void 0 ? [\"meta.arg\", \"meta.baseQueryMeta\"] : _d, _e = options.ignoredPaths, ignoredPaths = _e === void 0 ? [] : _e, _f = options.warnAfter, warnAfter = _f === void 0 ? 32 : _f, _g = options.ignoreState, ignoreState = _g === void 0 ? false : _g;\r\n return function (storeAPI) { return function (next) { return function (action) {\r\n if (ignoredActions.length && ignoredActions.indexOf(action.type) !== -1) {\r\n return next(action);\r\n }\r\n var measureUtils = getTimeMeasureUtils(warnAfter, \"SerializableStateInvariantMiddleware\");\r\n measureUtils.measureTime(function () {\r\n var foundActionNonSerializableValue = findNonSerializableValue(action, \"\", isSerializable, getEntries, ignoredActionPaths);\r\n if (foundActionNonSerializableValue) {\r\n var keyPath = foundActionNonSerializableValue.keyPath, value = foundActionNonSerializableValue.value;\r\n console.error(\"A non-serializable value was detected in an action, in the path: `\" + keyPath + \"`. Value:\", value, \"\\nTake a look at the logic that dispatched this action: \", action, \"\\n(See https://redux.js.org/faq/actions#why-should-type-be-a-string-or-at-least-serializable-why-should-my-action-types-be-constants)\", \"\\n(To allow non-serializable values see: https://redux-toolkit.js.org/usage/usage-guide#working-with-non-serializable-data)\");\r\n }\r\n });\r\n var result = next(action);\r\n if (!ignoreState) {\r\n measureUtils.measureTime(function () {\r\n var state = storeAPI.getState();\r\n var foundStateNonSerializableValue = findNonSerializableValue(state, \"\", isSerializable, getEntries, ignoredPaths);\r\n if (foundStateNonSerializableValue) {\r\n var keyPath = foundStateNonSerializableValue.keyPath, value = foundStateNonSerializableValue.value;\r\n console.error(\"A non-serializable value was detected in the state, in the path: `\" + keyPath + \"`. Value:\", value, \"\\nTake a look at the reducer(s) handling this action type: \" + action.type + \".\\n(See https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state)\");\r\n }\r\n });\r\n measureUtils.warnIfExceeded();\r\n }\r\n return result;\r\n }; }; };\r\n}\r\n// src/getDefaultMiddleware.ts\r\nfunction isBoolean(x2) {\r\n return typeof x2 === \"boolean\";\r\n}\r\nfunction curryGetDefaultMiddleware() {\r\n return function curriedGetDefaultMiddleware(options) {\r\n return getDefaultMiddleware(options);\r\n };\r\n}\r\nfunction getDefaultMiddleware(options) {\r\n if (options === void 0) { options = {}; }\r\n var _b = options.thunk, thunk2 = _b === void 0 ? true : _b, _c = options.immutableCheck, immutableCheck = _c === void 0 ? true : _c, _d = options.serializableCheck, serializableCheck = _d === void 0 ? true : _d;\r\n var middlewareArray = new MiddlewareArray();\r\n if (thunk2) {\r\n if (isBoolean(thunk2)) {\r\n middlewareArray.push(es_default);\r\n }\r\n else {\r\n middlewareArray.push(es_default.withExtraArgument(thunk2.extraArgument));\r\n }\r\n }\r\n if (true) {\r\n if (immutableCheck) {\r\n var immutableOptions = {};\r\n if (!isBoolean(immutableCheck)) {\r\n immutableOptions = immutableCheck;\r\n }\r\n middlewareArray.unshift(createImmutableStateInvariantMiddleware(immutableOptions));\r\n }\r\n if (serializableCheck) {\r\n var serializableOptions = {};\r\n if (!isBoolean(serializableCheck)) {\r\n serializableOptions = serializableCheck;\r\n }\r\n middlewareArray.push(createSerializableStateInvariantMiddleware(serializableOptions));\r\n }\r\n }\r\n return middlewareArray;\r\n}\r\n// src/configureStore.ts\r\nvar IS_PRODUCTION = false;\r\nfunction configureStore(options) {\r\n var curriedGetDefaultMiddleware = curryGetDefaultMiddleware();\r\n var _b = options || {}, _c = _b.reducer, reducer = _c === void 0 ? void 0 : _c, _d = _b.middleware, middleware = _d === void 0 ? curriedGetDefaultMiddleware() : _d, _e = _b.devTools, devTools = _e === void 0 ? true : _e, _f = _b.preloadedState, preloadedState = _f === void 0 ? void 0 : _f, _g = _b.enhancers, enhancers = _g === void 0 ? void 0 : _g;\r\n var rootReducer;\r\n if (typeof reducer === \"function\") {\r\n rootReducer = reducer;\r\n }\r\n else if (isPlainObject2(reducer)) {\r\n rootReducer = combineReducers(reducer);\r\n }\r\n else {\r\n throw new Error('\"reducer\" is a required argument, and must be a function or an object of functions that can be passed to combineReducers');\r\n }\r\n var finalMiddleware = middleware;\r\n if (typeof finalMiddleware === \"function\") {\r\n finalMiddleware = finalMiddleware(curriedGetDefaultMiddleware);\r\n if (!IS_PRODUCTION && !Array.isArray(finalMiddleware)) {\r\n throw new Error(\"when using a middleware builder function, an array of middleware must be returned\");\r\n }\r\n }\r\n if (!IS_PRODUCTION && finalMiddleware.some(function (item) { return typeof item !== \"function\"; })) {\r\n throw new Error(\"each middleware provided to configureStore must be a function\");\r\n }\r\n var middlewareEnhancer = applyMiddleware.apply(void 0, finalMiddleware);\r\n var finalCompose = compose;\r\n if (devTools) {\r\n finalCompose = composeWithDevTools(__spreadValues({\r\n trace: !IS_PRODUCTION\r\n }, typeof devTools === \"object\" && devTools));\r\n }\r\n var storeEnhancers = [middlewareEnhancer];\r\n if (Array.isArray(enhancers)) {\r\n storeEnhancers = __spreadArray([middlewareEnhancer], enhancers);\r\n }\r\n else if (typeof enhancers === \"function\") {\r\n storeEnhancers = enhancers(storeEnhancers);\r\n }\r\n var composedEnhancer = finalCompose.apply(void 0, storeEnhancers);\r\n return createStore(rootReducer, preloadedState, composedEnhancer);\r\n}\r\n// src/createAction.ts\r\nfunction createAction(type, prepareAction) {\r\n function actionCreator() {\r\n var args = [];\r\n for (var _b = 0; _b < arguments.length; _b++) {\r\n args[_b] = arguments[_b];\r\n }\r\n if (prepareAction) {\r\n var prepared = prepareAction.apply(void 0, args);\r\n if (!prepared) {\r\n throw new Error(\"prepareAction did not return an object\");\r\n }\r\n return __spreadValues(__spreadValues({\r\n type: type,\r\n payload: prepared.payload\r\n }, \"meta\" in prepared && { meta: prepared.meta }), \"error\" in prepared && { error: prepared.error });\r\n }\r\n return { type: type, payload: args[0] };\r\n }\r\n actionCreator.toString = function () { return \"\" + type; };\r\n actionCreator.type = type;\r\n actionCreator.match = function (action) { return action.type === type; };\r\n return actionCreator;\r\n}\r\nfunction isFSA(action) {\r\n return isPlainObject2(action) && typeof action.type === \"string\" && Object.keys(action).every(isValidKey);\r\n}\r\nfunction isValidKey(key) {\r\n return [\"type\", \"payload\", \"error\", \"meta\"].indexOf(key) > -1;\r\n}\r\nfunction getType(actionCreator) {\r\n return \"\" + actionCreator;\r\n}\r\n// src/mapBuilders.ts\r\nfunction executeReducerBuilderCallback(builderCallback) {\r\n var actionsMap = {};\r\n var actionMatchers = [];\r\n var defaultCaseReducer;\r\n var builder = {\r\n addCase: function (typeOrActionCreator, reducer) {\r\n if (true) {\r\n if (actionMatchers.length > 0) {\r\n throw new Error(\"`builder.addCase` should only be called before calling `builder.addMatcher`\");\r\n }\r\n if (defaultCaseReducer) {\r\n throw new Error(\"`builder.addCase` should only be called before calling `builder.addDefaultCase`\");\r\n }\r\n }\r\n var type = typeof typeOrActionCreator === \"string\" ? typeOrActionCreator : typeOrActionCreator.type;\r\n if (type in actionsMap) {\r\n throw new Error(\"addCase cannot be called with two reducers for the same action type\");\r\n }\r\n actionsMap[type] = reducer;\r\n return builder;\r\n },\r\n addMatcher: function (matcher, reducer) {\r\n if (true) {\r\n if (defaultCaseReducer) {\r\n throw new Error(\"`builder.addMatcher` should only be called before calling `builder.addDefaultCase`\");\r\n }\r\n }\r\n actionMatchers.push({ matcher: matcher, reducer: reducer });\r\n return builder;\r\n },\r\n addDefaultCase: function (reducer) {\r\n if (true) {\r\n if (defaultCaseReducer) {\r\n throw new Error(\"`builder.addDefaultCase` can only be called once\");\r\n }\r\n }\r\n defaultCaseReducer = reducer;\r\n return builder;\r\n }\r\n };\r\n builderCallback(builder);\r\n return [actionsMap, actionMatchers, defaultCaseReducer];\r\n}\r\n// src/createReducer.ts\r\nfunction createReducer(initialState, mapOrBuilderCallback, actionMatchers, defaultCaseReducer) {\r\n if (actionMatchers === void 0) { actionMatchers = []; }\r\n var _b = typeof mapOrBuilderCallback === \"function\" ? executeReducerBuilderCallback(mapOrBuilderCallback) : [mapOrBuilderCallback, actionMatchers, defaultCaseReducer], actionsMap = _b[0], finalActionMatchers = _b[1], finalDefaultCaseReducer = _b[2];\r\n var frozenInitialState = immer_esm_default(initialState, function () {\r\n });\r\n return function (state, action) {\r\n if (state === void 0) { state = frozenInitialState; }\r\n var caseReducers = __spreadArray([\r\n actionsMap[action.type]\r\n ], finalActionMatchers.filter(function (_b) {\r\n var matcher = _b.matcher;\r\n return matcher(action);\r\n }).map(function (_b) {\r\n var reducer = _b.reducer;\r\n return reducer;\r\n }));\r\n if (caseReducers.filter(function (cr) { return !!cr; }).length === 0) {\r\n caseReducers = [finalDefaultCaseReducer];\r\n }\r\n return caseReducers.reduce(function (previousState, caseReducer) {\r\n if (caseReducer) {\r\n if (t(previousState)) {\r\n var draft = previousState;\r\n var result = caseReducer(draft, action);\r\n if (typeof result === \"undefined\") {\r\n return previousState;\r\n }\r\n return result;\r\n }\r\n else if (!r(previousState)) {\r\n var result = caseReducer(previousState, action);\r\n if (typeof result === \"undefined\") {\r\n if (previousState === null) {\r\n return previousState;\r\n }\r\n throw Error(\"A case reducer on a non-draftable value must not return undefined\");\r\n }\r\n return result;\r\n }\r\n else {\r\n return immer_esm_default(previousState, function (draft) {\r\n return caseReducer(draft, action);\r\n });\r\n }\r\n }\r\n return previousState;\r\n }, state);\r\n };\r\n}\r\n// src/createSlice.ts\r\nfunction getType2(slice, actionKey) {\r\n return slice + \"/\" + actionKey;\r\n}\r\nfunction createSlice(options) {\r\n var name = options.name, initialState = options.initialState;\r\n if (!name) {\r\n throw new Error(\"`name` is a required option for createSlice\");\r\n }\r\n var reducers = options.reducers || {};\r\n var _b = typeof options.extraReducers === \"function\" ? executeReducerBuilderCallback(options.extraReducers) : [options.extraReducers], _c = _b[0], extraReducers = _c === void 0 ? {} : _c, _d = _b[1], actionMatchers = _d === void 0 ? [] : _d, _e = _b[2], defaultCaseReducer = _e === void 0 ? void 0 : _e;\r\n var reducerNames = Object.keys(reducers);\r\n var sliceCaseReducersByName = {};\r\n var sliceCaseReducersByType = {};\r\n var actionCreators = {};\r\n reducerNames.forEach(function (reducerName) {\r\n var maybeReducerWithPrepare = reducers[reducerName];\r\n var type = getType2(name, reducerName);\r\n var caseReducer;\r\n var prepareCallback;\r\n if (\"reducer\" in maybeReducerWithPrepare) {\r\n caseReducer = maybeReducerWithPrepare.reducer;\r\n prepareCallback = maybeReducerWithPrepare.prepare;\r\n }\r\n else {\r\n caseReducer = maybeReducerWithPrepare;\r\n }\r\n sliceCaseReducersByName[reducerName] = caseReducer;\r\n sliceCaseReducersByType[type] = caseReducer;\r\n actionCreators[reducerName] = prepareCallback ? createAction(type, prepareCallback) : createAction(type);\r\n });\r\n var finalCaseReducers = __spreadValues(__spreadValues({}, extraReducers), sliceCaseReducersByType);\r\n var reducer = createReducer(initialState, finalCaseReducers, actionMatchers, defaultCaseReducer);\r\n return {\r\n name: name,\r\n reducer: reducer,\r\n actions: actionCreators,\r\n caseReducers: sliceCaseReducersByName\r\n };\r\n}\r\n// src/entities/entity_state.ts\r\nfunction getInitialEntityState() {\r\n return {\r\n ids: [],\r\n entities: {}\r\n };\r\n}\r\nfunction createInitialStateFactory() {\r\n function getInitialState(additionalState) {\r\n if (additionalState === void 0) { additionalState = {}; }\r\n return Object.assign(getInitialEntityState(), additionalState);\r\n }\r\n return { getInitialState: getInitialState };\r\n}\r\n// src/entities/state_selectors.ts\r\nfunction createSelectorsFactory() {\r\n function getSelectors(selectState) {\r\n var selectIds = function (state) { return state.ids; };\r\n var selectEntities = function (state) { return state.entities; };\r\n var selectAll = createDraftSafeSelector(selectIds, selectEntities, function (ids, entities) { return ids.map(function (id) { return entities[id]; }); });\r\n var selectId = function (_2, id) { return id; };\r\n var selectById = function (entities, id) { return entities[id]; };\r\n var selectTotal = createDraftSafeSelector(selectIds, function (ids) { return ids.length; });\r\n if (!selectState) {\r\n return {\r\n selectIds: selectIds,\r\n selectEntities: selectEntities,\r\n selectAll: selectAll,\r\n selectTotal: selectTotal,\r\n selectById: createDraftSafeSelector(selectEntities, selectId, selectById)\r\n };\r\n }\r\n var selectGlobalizedEntities = createDraftSafeSelector(selectState, selectEntities);\r\n return {\r\n selectIds: createDraftSafeSelector(selectState, selectIds),\r\n selectEntities: selectGlobalizedEntities,\r\n selectAll: createDraftSafeSelector(selectState, selectAll),\r\n selectTotal: createDraftSafeSelector(selectState, selectTotal),\r\n selectById: createDraftSafeSelector(selectGlobalizedEntities, selectId, selectById)\r\n };\r\n }\r\n return { getSelectors: getSelectors };\r\n}\r\n// src/entities/state_adapter.ts\r\nfunction createSingleArgumentStateOperator(mutator) {\r\n var operator = createStateOperator(function (_2, state) { return mutator(state); });\r\n return function operation(state) {\r\n return operator(state, void 0);\r\n };\r\n}\r\nfunction createStateOperator(mutator) {\r\n return function operation(state, arg) {\r\n function isPayloadActionArgument(arg2) {\r\n return isFSA(arg2);\r\n }\r\n var runMutator = function (draft) {\r\n if (isPayloadActionArgument(arg)) {\r\n mutator(arg.payload, draft);\r\n }\r\n else {\r\n mutator(arg, draft);\r\n }\r\n };\r\n if (t(state)) {\r\n runMutator(state);\r\n return state;\r\n }\r\n else {\r\n return immer_esm_default(state, runMutator);\r\n }\r\n };\r\n}\r\n// src/entities/utils.ts\r\nfunction selectIdValue(entity, selectId) {\r\n var key = selectId(entity);\r\n if (key === void 0) {\r\n console.warn(\"The entity passed to the `selectId` implementation returned undefined.\", \"You should probably provide your own `selectId` implementation.\", \"The entity that was passed:\", entity, \"The `selectId` implementation:\", selectId.toString());\r\n }\r\n return key;\r\n}\r\nfunction ensureEntitiesArray(entities) {\r\n if (!Array.isArray(entities)) {\r\n entities = Object.values(entities);\r\n }\r\n return entities;\r\n}\r\nfunction splitAddedUpdatedEntities(newEntities, selectId, state) {\r\n newEntities = ensureEntitiesArray(newEntities);\r\n var added = [];\r\n var updated = [];\r\n for (var _b = 0, newEntities_1 = newEntities; _b < newEntities_1.length; _b++) {\r\n var entity = newEntities_1[_b];\r\n var id = selectIdValue(entity, selectId);\r\n if (id in state.entities) {\r\n updated.push({ id: id, changes: entity });\r\n }\r\n else {\r\n added.push(entity);\r\n }\r\n }\r\n return [added, updated];\r\n}\r\n// src/entities/unsorted_state_adapter.ts\r\nfunction createUnsortedStateAdapter(selectId) {\r\n function addOneMutably(entity, state) {\r\n var key = selectIdValue(entity, selectId);\r\n if (key in state.entities) {\r\n return;\r\n }\r\n state.ids.push(key);\r\n state.entities[key] = entity;\r\n }\r\n function addManyMutably(newEntities, state) {\r\n newEntities = ensureEntitiesArray(newEntities);\r\n for (var _b = 0, newEntities_2 = newEntities; _b < newEntities_2.length; _b++) {\r\n var entity = newEntities_2[_b];\r\n addOneMutably(entity, state);\r\n }\r\n }\r\n function setOneMutably(entity, state) {\r\n var key = selectIdValue(entity, selectId);\r\n if (!(key in state.entities)) {\r\n state.ids.push(key);\r\n }\r\n state.entities[key] = entity;\r\n }\r\n function setManyMutably(newEntities, state) {\r\n newEntities = ensureEntitiesArray(newEntities);\r\n for (var _b = 0, newEntities_3 = newEntities; _b < newEntities_3.length; _b++) {\r\n var entity = newEntities_3[_b];\r\n setOneMutably(entity, state);\r\n }\r\n }\r\n function setAllMutably(newEntities, state) {\r\n newEntities = ensureEntitiesArray(newEntities);\r\n state.ids = [];\r\n state.entities = {};\r\n addManyMutably(newEntities, state);\r\n }\r\n function removeOneMutably(key, state) {\r\n return removeManyMutably([key], state);\r\n }\r\n function removeManyMutably(keys, state) {\r\n var didMutate = false;\r\n keys.forEach(function (key) {\r\n if (key in state.entities) {\r\n delete state.entities[key];\r\n didMutate = true;\r\n }\r\n });\r\n if (didMutate) {\r\n state.ids = state.ids.filter(function (id) { return id in state.entities; });\r\n }\r\n }\r\n function removeAllMutably(state) {\r\n Object.assign(state, {\r\n ids: [],\r\n entities: {}\r\n });\r\n }\r\n function takeNewKey(keys, update, state) {\r\n var original = state.entities[update.id];\r\n var updated = Object.assign({}, original, update.changes);\r\n var newKey = selectIdValue(updated, selectId);\r\n var hasNewKey = newKey !== update.id;\r\n if (hasNewKey) {\r\n keys[update.id] = newKey;\r\n delete state.entities[update.id];\r\n }\r\n state.entities[newKey] = updated;\r\n return hasNewKey;\r\n }\r\n function updateOneMutably(update, state) {\r\n return updateManyMutably([update], state);\r\n }\r\n function updateManyMutably(updates, state) {\r\n var newKeys = {};\r\n var updatesPerEntity = {};\r\n updates.forEach(function (update) {\r\n if (update.id in state.entities) {\r\n updatesPerEntity[update.id] = {\r\n id: update.id,\r\n changes: __spreadValues(__spreadValues({}, updatesPerEntity[update.id] ? updatesPerEntity[update.id].changes : null), update.changes)\r\n };\r\n }\r\n });\r\n updates = Object.values(updatesPerEntity);\r\n var didMutateEntities = updates.length > 0;\r\n if (didMutateEntities) {\r\n var didMutateIds = updates.filter(function (update) { return takeNewKey(newKeys, update, state); }).length > 0;\r\n if (didMutateIds) {\r\n state.ids = state.ids.map(function (id) { return newKeys[id] || id; });\r\n }\r\n }\r\n }\r\n function upsertOneMutably(entity, state) {\r\n return upsertManyMutably([entity], state);\r\n }\r\n function upsertManyMutably(newEntities, state) {\r\n var _b = splitAddedUpdatedEntities(newEntities, selectId, state), added = _b[0], updated = _b[1];\r\n updateManyMutably(updated, state);\r\n addManyMutably(added, state);\r\n }\r\n return {\r\n removeAll: createSingleArgumentStateOperator(removeAllMutably),\r\n addOne: createStateOperator(addOneMutably),\r\n addMany: createStateOperator(addManyMutably),\r\n setOne: createStateOperator(setOneMutably),\r\n setMany: createStateOperator(setManyMutably),\r\n setAll: createStateOperator(setAllMutably),\r\n updateOne: createStateOperator(updateOneMutably),\r\n updateMany: createStateOperator(updateManyMutably),\r\n upsertOne: createStateOperator(upsertOneMutably),\r\n upsertMany: createStateOperator(upsertManyMutably),\r\n removeOne: createStateOperator(removeOneMutably),\r\n removeMany: createStateOperator(removeManyMutably)\r\n };\r\n}\r\n// src/entities/sorted_state_adapter.ts\r\nfunction createSortedStateAdapter(selectId, sort) {\r\n var _b = createUnsortedStateAdapter(selectId), removeOne = _b.removeOne, removeMany = _b.removeMany, removeAll = _b.removeAll;\r\n function addOneMutably(entity, state) {\r\n return addManyMutably([entity], state);\r\n }\r\n function addManyMutably(newEntities, state) {\r\n newEntities = ensureEntitiesArray(newEntities);\r\n var models = newEntities.filter(function (model) { return !(selectIdValue(model, selectId) in state.entities); });\r\n if (models.length !== 0) {\r\n merge(models, state);\r\n }\r\n }\r\n function setOneMutably(entity, state) {\r\n return setManyMutably([entity], state);\r\n }\r\n function setManyMutably(newEntities, state) {\r\n newEntities = ensureEntitiesArray(newEntities);\r\n if (newEntities.length !== 0) {\r\n merge(newEntities, state);\r\n }\r\n }\r\n function setAllMutably(newEntities, state) {\r\n newEntities = ensureEntitiesArray(newEntities);\r\n state.entities = {};\r\n state.ids = [];\r\n addManyMutably(newEntities, state);\r\n }\r\n function updateOneMutably(update, state) {\r\n return updateManyMutably([update], state);\r\n }\r\n function takeUpdatedModel(models, update, state) {\r\n if (!(update.id in state.entities)) {\r\n return false;\r\n }\r\n var original = state.entities[update.id];\r\n var updated = Object.assign({}, original, update.changes);\r\n var newKey = selectIdValue(updated, selectId);\r\n delete state.entities[update.id];\r\n models.push(updated);\r\n return newKey !== update.id;\r\n }\r\n function updateManyMutably(updates, state) {\r\n var models = [];\r\n updates.forEach(function (update) { return takeUpdatedModel(models, update, state); });\r\n if (models.length !== 0) {\r\n merge(models, state);\r\n }\r\n }\r\n function upsertOneMutably(entity, state) {\r\n return upsertManyMutably([entity], state);\r\n }\r\n function upsertManyMutably(newEntities, state) {\r\n var _b = splitAddedUpdatedEntities(newEntities, selectId, state), added = _b[0], updated = _b[1];\r\n updateManyMutably(updated, state);\r\n addManyMutably(added, state);\r\n }\r\n function areArraysEqual(a2, b2) {\r\n if (a2.length !== b2.length) {\r\n return false;\r\n }\r\n for (var i2 = 0; i2 < a2.length && i2 < b2.length; i2++) {\r\n if (a2[i2] === b2[i2]) {\r\n continue;\r\n }\r\n return false;\r\n }\r\n return true;\r\n }\r\n function merge(models, state) {\r\n models.forEach(function (model) {\r\n state.entities[selectId(model)] = model;\r\n });\r\n var allEntities = Object.values(state.entities);\r\n allEntities.sort(sort);\r\n var newSortedIds = allEntities.map(selectId);\r\n var ids = state.ids;\r\n if (!areArraysEqual(ids, newSortedIds)) {\r\n state.ids = newSortedIds;\r\n }\r\n }\r\n return {\r\n removeOne: removeOne,\r\n removeMany: removeMany,\r\n removeAll: removeAll,\r\n addOne: createStateOperator(addOneMutably),\r\n updateOne: createStateOperator(updateOneMutably),\r\n upsertOne: createStateOperator(upsertOneMutably),\r\n setOne: createStateOperator(setOneMutably),\r\n setMany: createStateOperator(setManyMutably),\r\n setAll: createStateOperator(setAllMutably),\r\n addMany: createStateOperator(addManyMutably),\r\n updateMany: createStateOperator(updateManyMutably),\r\n upsertMany: createStateOperator(upsertManyMutably)\r\n };\r\n}\r\n// src/entities/create_adapter.ts\r\nfunction createEntityAdapter(options) {\r\n if (options === void 0) { options = {}; }\r\n var _b = __spreadValues({\r\n sortComparer: false,\r\n selectId: function (instance) { return instance.id; }\r\n }, options), selectId = _b.selectId, sortComparer = _b.sortComparer;\r\n var stateFactory = createInitialStateFactory();\r\n var selectorsFactory = createSelectorsFactory();\r\n var stateAdapter = sortComparer ? createSortedStateAdapter(selectId, sortComparer) : createUnsortedStateAdapter(selectId);\r\n return __spreadValues(__spreadValues(__spreadValues({\r\n selectId: selectId,\r\n sortComparer: sortComparer\r\n }, stateFactory), selectorsFactory), stateAdapter);\r\n}\r\n// src/nanoid.ts\r\nvar urlAlphabet = \"ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW\";\r\nvar nanoid = function (size) {\r\n if (size === void 0) { size = 21; }\r\n var id = \"\";\r\n var i2 = size;\r\n while (i2--) {\r\n id += urlAlphabet[Math.random() * 64 | 0];\r\n }\r\n return id;\r\n};\r\n// src/createAsyncThunk.ts\r\nvar commonProperties = [\r\n \"name\",\r\n \"message\",\r\n \"stack\",\r\n \"code\"\r\n];\r\nvar RejectWithValue = /** @class */ (function () {\r\n function RejectWithValue(payload, meta) {\r\n this.payload = payload;\r\n this.meta = meta;\r\n }\r\n return RejectWithValue;\r\n}());\r\nvar FulfillWithMeta = /** @class */ (function () {\r\n function FulfillWithMeta(payload, meta) {\r\n this.payload = payload;\r\n this.meta = meta;\r\n }\r\n return FulfillWithMeta;\r\n}());\r\nvar miniSerializeError = function (value) {\r\n if (typeof value === \"object\" && value !== null) {\r\n var simpleError = {};\r\n for (var _b = 0, commonProperties_1 = commonProperties; _b < commonProperties_1.length; _b++) {\r\n var property = commonProperties_1[_b];\r\n if (typeof value[property] === \"string\") {\r\n simpleError[property] = value[property];\r\n }\r\n }\r\n return simpleError;\r\n }\r\n return { message: String(value) };\r\n};\r\nfunction createAsyncThunk(typePrefix, payloadCreator, options) {\r\n var fulfilled = createAction(typePrefix + \"/fulfilled\", function (payload, requestId, arg, meta) { return ({\r\n payload: payload,\r\n meta: __spreadProps(__spreadValues({}, meta || {}), {\r\n arg: arg,\r\n requestId: requestId,\r\n requestStatus: \"fulfilled\"\r\n })\r\n }); });\r\n var pending = createAction(typePrefix + \"/pending\", function (requestId, arg, meta) { return ({\r\n payload: void 0,\r\n meta: __spreadProps(__spreadValues({}, meta || {}), {\r\n arg: arg,\r\n requestId: requestId,\r\n requestStatus: \"pending\"\r\n })\r\n }); });\r\n var rejected = createAction(typePrefix + \"/rejected\", function (error, requestId, arg, payload, meta) { return ({\r\n payload: payload,\r\n error: (options && options.serializeError || miniSerializeError)(error || \"Rejected\"),\r\n meta: __spreadProps(__spreadValues({}, meta || {}), {\r\n arg: arg,\r\n requestId: requestId,\r\n rejectedWithValue: !!payload,\r\n requestStatus: \"rejected\",\r\n aborted: (error == null ? void 0 : error.name) === \"AbortError\",\r\n condition: (error == null ? void 0 : error.name) === \"ConditionError\"\r\n })\r\n }); });\r\n var displayedWarning = false;\r\n var AC = typeof AbortController !== \"undefined\" ? AbortController : /** @class */ (function () {\r\n function class_1() {\r\n this.signal = {\r\n aborted: false,\r\n addEventListener: function () {\r\n },\r\n dispatchEvent: function () {\r\n return false;\r\n },\r\n onabort: function () {\r\n },\r\n removeEventListener: function () {\r\n }\r\n };\r\n }\r\n class_1.prototype.abort = function () {\r\n if (true) {\r\n if (!displayedWarning) {\r\n displayedWarning = true;\r\n console.info(\"This platform does not implement AbortController. \\nIf you want to use the AbortController to react to `abort` events, please consider importing a polyfill like 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only'.\");\r\n }\r\n }\r\n };\r\n return class_1;\r\n }());\r\n function actionCreator(arg) {\r\n return function (dispatch, getState, extra) {\r\n var _a;\r\n var requestId = ((_a = options == null ? void 0 : options.idGenerator) != null ? _a : nanoid)();\r\n var abortController = new AC();\r\n var abortReason;\r\n var abortedPromise = new Promise(function (_2, reject) { return abortController.signal.addEventListener(\"abort\", function () { return reject({ name: \"AbortError\", message: abortReason || \"Aborted\" }); }); });\r\n var started = false;\r\n function abort(reason) {\r\n if (started) {\r\n abortReason = reason;\r\n abortController.abort();\r\n }\r\n }\r\n var promise = function () {\r\n return __async(this, null, function () {\r\n var _a2, finalAction, err_1, skipDispatch;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n _b.trys.push([0, 2, , 3]);\r\n if (options && options.condition && options.condition(arg, { getState: getState, extra: extra }) === false) {\r\n throw {\r\n name: \"ConditionError\",\r\n message: \"Aborted due to condition callback returning false.\"\r\n };\r\n }\r\n started = true;\r\n dispatch(pending(requestId, arg, (_a2 = options == null ? void 0 : options.getPendingMeta) == null ? void 0 : _a2.call(options, { requestId: requestId, arg: arg }, { getState: getState, extra: extra })));\r\n return [4 /*yield*/, Promise.race([\r\n abortedPromise,\r\n Promise.resolve(payloadCreator(arg, {\r\n dispatch: dispatch,\r\n getState: getState,\r\n extra: extra,\r\n requestId: requestId,\r\n signal: abortController.signal,\r\n rejectWithValue: function (value, meta) {\r\n return new RejectWithValue(value, meta);\r\n },\r\n fulfillWithValue: function (value, meta) {\r\n return new FulfillWithMeta(value, meta);\r\n }\r\n })).then(function (result) {\r\n if (result instanceof RejectWithValue) {\r\n throw result;\r\n }\r\n if (result instanceof FulfillWithMeta) {\r\n return fulfilled(result.payload, requestId, arg, result.meta);\r\n }\r\n return fulfilled(result, requestId, arg);\r\n })\r\n ])];\r\n case 1:\r\n finalAction = _b.sent();\r\n return [3 /*break*/, 3];\r\n case 2:\r\n err_1 = _b.sent();\r\n finalAction = err_1 instanceof RejectWithValue ? rejected(null, requestId, arg, err_1.payload, err_1.meta) : rejected(err_1, requestId, arg);\r\n return [3 /*break*/, 3];\r\n case 3:\r\n skipDispatch = options && !options.dispatchConditionRejection && rejected.match(finalAction) && finalAction.meta.condition;\r\n if (!skipDispatch) {\r\n dispatch(finalAction);\r\n }\r\n return [2 /*return*/, finalAction];\r\n }\r\n });\r\n });\r\n }();\r\n return Object.assign(promise, {\r\n abort: abort,\r\n requestId: requestId,\r\n arg: arg,\r\n unwrap: function () {\r\n return promise.then(unwrapResult);\r\n }\r\n });\r\n };\r\n }\r\n return Object.assign(actionCreator, {\r\n pending: pending,\r\n rejected: rejected,\r\n fulfilled: fulfilled,\r\n typePrefix: typePrefix\r\n });\r\n}\r\nfunction unwrapResult(action) {\r\n if (action.meta && action.meta.rejectedWithValue) {\r\n throw action.payload;\r\n }\r\n if (action.error) {\r\n throw action.error;\r\n }\r\n return action.payload;\r\n}\r\n// src/tsHelpers.ts\r\nvar hasMatchFunction = function (v2) {\r\n return v2 && typeof v2.match === \"function\";\r\n};\r\n// src/matchers.ts\r\nvar matches = function (matcher, action) {\r\n if (hasMatchFunction(matcher)) {\r\n return matcher.match(action);\r\n }\r\n else {\r\n return matcher(action);\r\n }\r\n};\r\nfunction isAnyOf() {\r\n var matchers = [];\r\n for (var _b = 0; _b < arguments.length; _b++) {\r\n matchers[_b] = arguments[_b];\r\n }\r\n return function (action) {\r\n return matchers.some(function (matcher) { return matches(matcher, action); });\r\n };\r\n}\r\nfunction isAllOf() {\r\n var matchers = [];\r\n for (var _b = 0; _b < arguments.length; _b++) {\r\n matchers[_b] = arguments[_b];\r\n }\r\n return function (action) {\r\n return matchers.every(function (matcher) { return matches(matcher, action); });\r\n };\r\n}\r\nfunction hasExpectedRequestMetadata(action, validStatus) {\r\n if (!action || !action.meta)\r\n return false;\r\n var hasValidRequestId = typeof action.meta.requestId === \"string\";\r\n var hasValidRequestStatus = validStatus.indexOf(action.meta.requestStatus) > -1;\r\n return hasValidRequestId && hasValidRequestStatus;\r\n}\r\nfunction isAsyncThunkArray(a2) {\r\n return typeof a2[0] === \"function\" && \"pending\" in a2[0] && \"fulfilled\" in a2[0] && \"rejected\" in a2[0];\r\n}\r\nfunction isPending() {\r\n var asyncThunks = [];\r\n for (var _b = 0; _b < arguments.length; _b++) {\r\n asyncThunks[_b] = arguments[_b];\r\n }\r\n if (asyncThunks.length === 0) {\r\n return function (action) { return hasExpectedRequestMetadata(action, [\"pending\"]); };\r\n }\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isPending()(asyncThunks[0]);\r\n }\r\n return function (action) {\r\n var matchers = asyncThunks.map(function (asyncThunk) { return asyncThunk.pending; });\r\n var combinedMatcher = isAnyOf.apply(void 0, matchers);\r\n return combinedMatcher(action);\r\n };\r\n}\r\nfunction isRejected() {\r\n var asyncThunks = [];\r\n for (var _b = 0; _b < arguments.length; _b++) {\r\n asyncThunks[_b] = arguments[_b];\r\n }\r\n if (asyncThunks.length === 0) {\r\n return function (action) { return hasExpectedRequestMetadata(action, [\"rejected\"]); };\r\n }\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isRejected()(asyncThunks[0]);\r\n }\r\n return function (action) {\r\n var matchers = asyncThunks.map(function (asyncThunk) { return asyncThunk.rejected; });\r\n var combinedMatcher = isAnyOf.apply(void 0, matchers);\r\n return combinedMatcher(action);\r\n };\r\n}\r\nfunction isRejectedWithValue() {\r\n var asyncThunks = [];\r\n for (var _b = 0; _b < arguments.length; _b++) {\r\n asyncThunks[_b] = arguments[_b];\r\n }\r\n var hasFlag = function (action) {\r\n return action && action.meta && action.meta.rejectedWithValue;\r\n };\r\n if (asyncThunks.length === 0) {\r\n return function (action) {\r\n var combinedMatcher = isAllOf(isRejected.apply(void 0, asyncThunks), hasFlag);\r\n return combinedMatcher(action);\r\n };\r\n }\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isRejectedWithValue()(asyncThunks[0]);\r\n }\r\n return function (action) {\r\n var combinedMatcher = isAllOf(isRejected.apply(void 0, asyncThunks), hasFlag);\r\n return combinedMatcher(action);\r\n };\r\n}\r\nfunction isFulfilled() {\r\n var asyncThunks = [];\r\n for (var _b = 0; _b < arguments.length; _b++) {\r\n asyncThunks[_b] = arguments[_b];\r\n }\r\n if (asyncThunks.length === 0) {\r\n return function (action) { return hasExpectedRequestMetadata(action, [\"fulfilled\"]); };\r\n }\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isFulfilled()(asyncThunks[0]);\r\n }\r\n return function (action) {\r\n var matchers = asyncThunks.map(function (asyncThunk) { return asyncThunk.fulfilled; });\r\n var combinedMatcher = isAnyOf.apply(void 0, matchers);\r\n return combinedMatcher(action);\r\n };\r\n}\r\nfunction isAsyncThunkAction() {\r\n var asyncThunks = [];\r\n for (var _b = 0; _b < arguments.length; _b++) {\r\n asyncThunks[_b] = arguments[_b];\r\n }\r\n if (asyncThunks.length === 0) {\r\n return function (action) { return hasExpectedRequestMetadata(action, [\"pending\", \"fulfilled\", \"rejected\"]); };\r\n }\r\n if (!isAsyncThunkArray(asyncThunks)) {\r\n return isAsyncThunkAction()(asyncThunks[0]);\r\n }\r\n return function (action) {\r\n var matchers = [];\r\n for (var _b = 0, asyncThunks_1 = asyncThunks; _b < asyncThunks_1.length; _b++) {\r\n var asyncThunk = asyncThunks_1[_b];\r\n matchers.push(asyncThunk.pending, asyncThunk.rejected, asyncThunk.fulfilled);\r\n }\r\n var combinedMatcher = isAnyOf.apply(void 0, matchers);\r\n return combinedMatcher(action);\r\n };\r\n}\r\n// src/index.ts\r\nN();\r\nexport { MiddlewareArray, ActionTypes as __DO_NOT_USE__ActionTypes, applyMiddleware, bindActionCreators, combineReducers, compose, configureStore, createAction, createAsyncThunk, createDraftSafeSelector, createEntityAdapter, createImmutableStateInvariantMiddleware, immer_esm_default as createNextState, createReducer, createSelector, createSerializableStateInvariantMiddleware, createSlice, createStore, D as current, findNonSerializableValue, d as freeze, getDefaultMiddleware, getType, isAllOf, isAnyOf, isAsyncThunkAction, t as isDraft, isFulfilled, isImmutableDefault, isPending, isPlain, isPlainObject2 as isPlainObject, isRejected, isRejectedWithValue, miniSerializeError, nanoid, e as original, unwrapResult };\r\n//# sourceMappingURL=redux-toolkit.umd.js.map"],"names":["this"],"mappings":"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"} +\ No newline at end of file +diff --git a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.umd.min.js b/node_modules/@reduxjs/toolkit/dist/redux-toolkit.umd.min.js +deleted file mode 100644 +index ff4e60b..0000000 +--- a/node_modules/@reduxjs/toolkit/dist/redux-toolkit.umd.min.js ++++ /dev/null +@@ -1,51 +0,0 @@ +-(function (global, factory) { +- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +- typeof define === 'function' && define.amd ? define(['exports'], factory) : +- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.RTK = {})); +-}(this, (function (exports) { 'use strict'; +- +- var t,e,n,r=undefined&&undefined.__extends||(t=function(e,n){return (t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e;}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);})(e,n)},function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=e;}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r);}),o=undefined&&undefined.__generator||function(t,e){var n,r,o,i,u={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:f(0),throw:f(1),return:f(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function f(i){return function(f){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;u;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return u.label++,{value:i[1],done:!1};case 5:u.label++,r=i[1],i=[0];continue;case 7:i=u.ops.pop(),u.trys.pop();continue;default:if(!((o=(o=u.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){u=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]1?e-1:0),r=1;r3?e.i-4:e.i:Array.isArray(t)?1:E(t)?2:A(t)?3:0}function w(t,e){return 2===m(t)?t.has(e):Object.prototype.hasOwnProperty.call(t,e)}function j(t,e,n){var r=m(t);2===r?t.set(e,n):3===r?(t.delete(e),t.add(n)):t[e]=n;}function P(t,e){return t===e?0!==t||1/t==1/e:t!=t&&e!=e}function E(t){return H&&t instanceof Map}function A(t){return Q&&t instanceof Set}function S(t){return t.o||t.t}function _(t){if(Array.isArray(t))return Array.prototype.slice.call(t);var e=ot(t);delete e[et];for(var n=rt(e),r=0;r1&&(t.set=t.add=t.clear=t.delete=I),Object.freeze(t),e&&O(t,(function(t,e){return x(e,!0)}),!0)),t}function I(){y(2);}function D(t){return null==t||"object"!=typeof t||Object.isFrozen(t)}function k(t){var e=it[t];return e||y(18,t),e}function N(){return n}function R(t,e){e&&(k("Patches"),t.u=[],t.s=[],t.v=e);}function M(t){C(t),t.p.forEach(F),t.p=null;}function C(t){t===n&&(n=t.l);}function T(t){return n={p:[],l:n,h:t,m:!0,_:0}}function F(t){var e=t[et];0===e.i||1===e.i?e.j():e.O=!0;}function q(t,e){e._=e.p.length;var n=e.p[0],r=void 0!==t&&t!==n;return e.h.g||k("ES5").S(e,t,r),r?(n[et].P&&(M(e),y(4)),g(t)&&(t=W(e,t),e.l||K(e,t)),e.u&&k("Patches").M(n[et],t,e.u,e.s)):t=W(e,n,[]),M(e),e.u&&e.v(e.u,e.s),t!==Z?t:void 0}function W(t,e,n){if(D(e))return e;var r=e[et];if(!r)return O(e,(function(o,i){return z(t,r,e,o,i,n)}),!0),e;if(r.A!==t)return e;if(!r.P)return K(t,r.t,!0),r.t;if(!r.I){r.I=!0,r.A._--;var o=4===r.i||5===r.i?r.o=_(r.k):r.o;O(3===r.i?new Set(o):o,(function(e,i){return z(t,r,o,e,i,n)})),K(t,o,!1),n&&t.u&&k("Patches").R(r,n,t.u,t.s);}return r.o}function z(t,e,n,r,o,i){if(h(o)){var u=W(t,o,i&&e&&3!==e.i&&!w(e.D,r)?i.concat(r):void 0);if(j(n,r,u),!h(u))return;t.m=!1;}if(g(o)&&!D(o)){if(!t.h.F&&t._<1)return;W(t,o),e&&e.A.l||K(t,o);}}function K(t,e,n){void 0===n&&(n=!1),t.h.F&&t.m&&x(e,n);}function U(t,e){var n=t[et];return (n?S(n):t)[e]}function L(t,e){if(e in t)for(var n=Object.getPrototypeOf(t);n;){var r=Object.getOwnPropertyDescriptor(n,e);if(r)return r;n=Object.getPrototypeOf(n);}}function V(t){t.P||(t.P=!0,t.l&&V(t.l));}function X(t){t.o||(t.o=_(t.t));}function B(t,e,n){var r=E(e)?k("MapSet").N(e,n):A(e)?k("MapSet").T(e,n):t.g?function(t,e){var n=Array.isArray(t),r={i:n?1:0,A:e?e.A:N(),P:!1,I:!1,D:{},l:e,t:t,k:null,o:null,j:null,C:!1},o=r,i=ut;n&&(o=[r],i=ft);var u=Proxy.revocable(o,i),f=u.revoke,c=u.proxy;return r.k=c,r.j=f,c}(e,n):k("ES5").J(e,n);return (n?n.A:N()).p.push(r),r}function G(t){return h(t)||y(22,t),function t(e){if(!g(e))return e;var n,r=e[et],o=m(e);if(r){if(!r.P&&(r.i<4||!k("ES5").K(r)))return r.t;r.I=!0,n=J(e,o),r.I=!1;}else n=J(e,o);return O(n,(function(e,o){r&&function(t,e){return 2===m(t)?t.get(e):t[e]}(r.t,e)===o||j(n,e,t(o));})),3===o?new Set(n):n}(t)}function J(t,e){switch(e){case 2:return new Map(t);case 3:return Array.from(t)}return _(t)}var $="undefined"!=typeof Symbol&&"symbol"==typeof Symbol("x"),H="undefined"!=typeof Map,Q="undefined"!=typeof Set,Y="undefined"!=typeof Proxy&&void 0!==Proxy.revocable&&"undefined"!=typeof Reflect,Z=$?Symbol.for("immer-nothing"):((e={})["immer-nothing"]=!0,e),tt=$?Symbol.for("immer-draftable"):"__$immer_draftable",et=$?Symbol.for("immer-state"):"__$immer_state",nt=(""+Object.prototype.constructor),rt="undefined"!=typeof Reflect&&Reflect.ownKeys?Reflect.ownKeys:void 0!==Object.getOwnPropertySymbols?function(t){return Object.getOwnPropertyNames(t).concat(Object.getOwnPropertySymbols(t))}:Object.getOwnPropertyNames,ot=Object.getOwnPropertyDescriptors||function(t){var e={};return rt(t).forEach((function(n){e[n]=Object.getOwnPropertyDescriptor(t,n);})),e},it={},ut={get:function(t,e){if(e===et)return t;var n,r,o,i=S(t);if(!w(i,e))return n=t,(o=L(i,e))?"value"in o?o.value:null===(r=o.get)||void 0===r?void 0:r.call(n.k):void 0;var u=i[e];return t.I||!g(u)?u:u===U(t.t,e)?(X(t),t.o[e]=B(t.A.h,u,t)):u},has:function(t,e){return e in S(t)},ownKeys:function(t){return Reflect.ownKeys(S(t))},set:function(t,e,n){var r=L(S(t),e);if(null==r?void 0:r.set)return r.set.call(t.k,n),!0;if(!t.P){var o=U(S(t),e),i=null==o?void 0:o[et];if(i&&i.t===n)return t.o[e]=n,t.D[e]=!1,!0;if(P(n,o)&&(void 0!==n||w(t.t,e)))return !0;X(t),V(t);}return t.o[e]===n&&"number"!=typeof n&&(void 0!==n||e in t.o)||(t.o[e]=n,t.D[e]=!0,!0)},deleteProperty:function(t,e){return void 0!==U(t.t,e)||e in t.t?(t.D[e]=!1,X(t),V(t)):delete t.D[e],t.o&&delete t.o[e],!0},getOwnPropertyDescriptor:function(t,e){var n=S(t),r=Reflect.getOwnPropertyDescriptor(n,e);return r?{writable:!0,configurable:1!==t.i||"length"!==e,enumerable:r.enumerable,value:n[e]}:r},defineProperty:function(){y(11);},getPrototypeOf:function(t){return Object.getPrototypeOf(t.t)},setPrototypeOf:function(){y(12);}},ft={};O(ut,(function(t,e){ft[t]=function(){return arguments[0]=arguments[0][0],e.apply(this,arguments)};})),ft.deleteProperty=function(t,e){return ut.deleteProperty.call(this,t[0],e)},ft.set=function(t,e,n){return ut.set.call(this,t[0],e,n,t[0])};var ct=new(function(){function t(t){var e=this;this.g=Y,this.F=!0,this.produce=function(t,n,r){if("function"==typeof t&&"function"!=typeof n){var o=n;n=t;var i=e;return function(t){var e=this;void 0===t&&(t=o);for(var r=arguments.length,u=Array(r>1?r-1:0),f=1;f1?r-1:0),i=1;i=0;n--){var r=e[n];if(0===r.path.length&&"replace"===r.op){t=r.value;break}}var o=k("Patches").$;return h(t)?o(t,e):this.produce(t,(function(t){return o(t,e.slice(n+1))}))},t}()),at=ct.produce,lt=(ct.produceWithPatches.bind(ct),ct.setAutoFreeze.bind(ct),ct.setUseProxies.bind(ct),ct.applyPatches.bind(ct),ct.createDraft.bind(ct),ct.finishDraft.bind(ct),at);function st(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function pt(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r);}return n}function dt(t){for(var e=1;e1?e-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:At,n=null,r=null;return function(){return St(e,n,arguments)||(r=t.apply(null,arguments)),n=arguments,r}})),It=function(){for(var t=[],e=0;e",value:t};if("object"!=typeof t||null===t)return !1;for(var u=null!=r?r(t):Object.entries(t),f=o.length>0,c=0,a=u;c=0)){if(!n(p))return {keyPath:d,value:p};if("object"==typeof p&&(i=Ft(p,d,n,r,o)))return i}}return !1}function qt(t){return function(){return function(t){return function(e){return t(e)}}}}function Wt(t){void 0===t&&(t={});var e=t.thunk,n=void 0===e||e,r=new Ct;return n&&r.push("boolean"==typeof n?Mt:Mt.withExtraArgument(n.extraArgument)),r}function zt(t){var e,n=function(t){return Wt(t)},r=t||{},o=r.reducer,u=void 0===o?void 0:o,f=r.middleware,c=void 0===f?n():f,a=r.devTools,l=void 0===a||a,s=r.preloadedState,p=void 0===s?void 0:s,v=r.enhancers,y=void 0===v?void 0:v;if("function"==typeof u)e=u;else {if(!kt(u))throw new Error('"reducer" is a required argument, and must be a function or an object of functions that can be passed to combineReducers');e=mt(u);}var h=c;"function"==typeof h&&(h=h(n));var g=Et.apply(void 0,h),b=Pt;l&&(b=Dt(d({trace:!1},"object"==typeof l&&l)));var O=[g];return Array.isArray(y)?O=i([g],y):"function"==typeof y&&(O=y(O)),Ot(e,p,b.apply(void 0,O))}function Kt(t,e){function n(){for(var n=[],r=0;r-1}function Lt(t){return ""+t}function Vt(t){var e,n={},r=[],o={addCase:function(t,e){var r="string"==typeof t?t:t.type;if(r in n)throw new Error("addCase cannot be called with two reducers for the same action type");return n[r]=e,o},addMatcher:function(t,e){return r.push({matcher:t,reducer:e}),o},addDefaultCase:function(t){return e=t,o}};return t(o),[n,r,e]}function Xt(t,e,n,r){void 0===n&&(n=[]);var o="function"==typeof e?Vt(e):[e,n,r],u=o[0],f=o[1],c=o[2],a=lt(t,(function(){}));return function(t,e){void 0===t&&(t=a);var n=i([u[e.type]],f.filter((function(t){return (0, t.matcher)(e)})).map((function(t){return t.reducer})));return 0===n.filter((function(t){return !!t})).length&&(n=[c]),n.reduce((function(t,n){if(n){var r;if(h(t))return void 0===(r=n(t,e))?t:r;if(g(t))return lt(t,(function(t){return n(t,e)}));if(void 0===(r=n(t,e))){if(null===t)return t;throw Error("A case reducer on a non-draftable value must not return undefined")}return r}return t}),t)}}function Bt(t){var e=t.name,n=t.initialState;if(!e)throw new Error("`name` is a required option for createSlice");var r=t.reducers||{},o="function"==typeof t.extraReducers?Vt(t.extraReducers):[t.extraReducers],i=o[0],u=void 0===i?{}:i,f=o[1],c=void 0===f?[]:f,a=o[2],l=void 0===a?void 0:a,s=Object.keys(r),p={},v={},y={};s.forEach((function(t){var n,o,i=r[t],u=e+"/"+t;"reducer"in i?(n=i.reducer,o=i.prepare):n=i,p[t]=n,v[u]=n,y[t]=o?Kt(u,o):Kt(u);}));var h=Xt(n,d(d({},u),v),c,l);return {name:e,reducer:h,actions:y,caseReducers:p}}function Gt(t){return "object"!=typeof t||null==t||Object.isFrozen(t)}function Jt(t){return function(){return function(t){return function(e){return t(e)}}}}function $t(t){return function(e,n){var r=function(e){var r;kt(r=n)&&"string"==typeof r.type&&Object.keys(r).every(Ut)?t(n.payload,e):t(n,e);};return h(e)?(r(e),e):lt(e,r)}}function Ht(t,e){return e(t)}function Qt(t){return Array.isArray(t)||(t=Object.values(t)),t}function Yt(t,e,n){for(var r=[],o=[],i=0,u=t=Qt(t);i0&&e.filter((function(e){return function(e,n,r){var o=Object.assign({},r.entities[n.id],n.changes),i=Ht(o,t),u=i!==n.id;return u&&(e[n.id]=i,delete r.entities[n.id]),r.entities[i]=o,u}(r,e,n)})).length>0&&(n.ids=n.ids.map((function(t){return r[t]||t})));}function u(e,r){var o=Yt(e,t,r),u=o[0];i(o[1],r),n(u,r);}return {removeAll:(f=function(t){Object.assign(t,{ids:[],entities:{}});},c=$t((function(t,e){return f(e)})),function(t){return c(t,void 0)}),addOne:$t(e),addMany:$t(n),setOne:$t(r),setMany:$t((function(t,e){for(var n=0,o=t=Qt(t);n-1;return n&&r}function pe(t){return "function"==typeof t[0]&&"pending"in t[0]&&"fulfilled"in t[0]&&"rejected"in t[0]}function de(){for(var t=[],e=0;e=0;e--){var o=t[e][et];if(!o.P)switch(o.i){case 5:r(o)&&V(o);break;case 4:n(o)&&V(o);}}}function n(t){for(var e=t.t,n=t.k,r=rt(n),o=r.length-1;o>=0;o--){var i=r[o];if(i!==et){var u=e[i];if(void 0===u&&!w(e,i))return !0;var f=n[i],c=f&&f[et];if(c?c.t!==u:!P(f,u))return !0}}var a=!!e[et];return r.length!==rt(e).length+(a?0:1)}function r(t){var e=t.k;if(e.length!==t.t.length)return !0;var n=Object.getOwnPropertyDescriptor(e,e.length-1);return !(!n||n.get)}var o={};it.ES5||(it.ES5={J:function(e,n){var r=Array.isArray(e),o=function(e,n){if(e){for(var r=Array(n.length),o=0;o0&&o[o.length-1])||6!==i[0]&&2!==i[0])){u=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]1?e-1:0),r=1;r3?e.i-4:e.i:Array.isArray(t)?1:E(t)?2:A(t)?3:0}function w(t,e){return 2===m(t)?t.has(e):Object.prototype.hasOwnProperty.call(t,e)}function j(t,e,n){var r=m(t);2===r?t.set(e,n):3===r?(t.delete(e),t.add(n)):t[e]=n}function P(t,e){return t===e?0!==t||1/t==1/e:t!=t&&e!=e}function E(t){return H&&t instanceof Map}function A(t){return Q&&t instanceof Set}function S(t){return t.o||t.t}function _(t){if(Array.isArray(t))return Array.prototype.slice.call(t);var e=ot(t);delete e[et];for(var n=rt(e),r=0;r1&&(t.set=t.add=t.clear=t.delete=I),Object.freeze(t),e&&O(t,(function(t,e){return x(e,!0)}),!0)),t}function I(){y(2)}function D(t){return null==t||\"object\"!=typeof t||Object.isFrozen(t)}function k(t){var e=it[t];return e||y(18,t),e}function N(){return n}function R(t,e){e&&(k(\"Patches\"),t.u=[],t.s=[],t.v=e)}function M(t){C(t),t.p.forEach(F),t.p=null}function C(t){t===n&&(n=t.l)}function T(t){return n={p:[],l:n,h:t,m:!0,_:0}}function F(t){var e=t[et];0===e.i||1===e.i?e.j():e.O=!0}function q(t,e){e._=e.p.length;var n=e.p[0],r=void 0!==t&&t!==n;return e.h.g||k(\"ES5\").S(e,t,r),r?(n[et].P&&(M(e),y(4)),g(t)&&(t=W(e,t),e.l||K(e,t)),e.u&&k(\"Patches\").M(n[et],t,e.u,e.s)):t=W(e,n,[]),M(e),e.u&&e.v(e.u,e.s),t!==Z?t:void 0}function W(t,e,n){if(D(e))return e;var r=e[et];if(!r)return O(e,(function(o,i){return z(t,r,e,o,i,n)}),!0),e;if(r.A!==t)return e;if(!r.P)return K(t,r.t,!0),r.t;if(!r.I){r.I=!0,r.A._--;var o=4===r.i||5===r.i?r.o=_(r.k):r.o;O(3===r.i?new Set(o):o,(function(e,i){return z(t,r,o,e,i,n)})),K(t,o,!1),n&&t.u&&k(\"Patches\").R(r,n,t.u,t.s)}return r.o}function z(t,e,n,r,o,i){if(h(o)){var u=W(t,o,i&&e&&3!==e.i&&!w(e.D,r)?i.concat(r):void 0);if(j(n,r,u),!h(u))return;t.m=!1}if(g(o)&&!D(o)){if(!t.h.F&&t._<1)return;W(t,o),e&&e.A.l||K(t,o)}}function K(t,e,n){void 0===n&&(n=!1),t.h.F&&t.m&&x(e,n)}function U(t,e){var n=t[et];return(n?S(n):t)[e]}function L(t,e){if(e in t)for(var n=Object.getPrototypeOf(t);n;){var r=Object.getOwnPropertyDescriptor(n,e);if(r)return r;n=Object.getPrototypeOf(n)}}function V(t){t.P||(t.P=!0,t.l&&V(t.l))}function X(t){t.o||(t.o=_(t.t))}function B(t,e,n){var r=E(e)?k(\"MapSet\").N(e,n):A(e)?k(\"MapSet\").T(e,n):t.g?function(t,e){var n=Array.isArray(t),r={i:n?1:0,A:e?e.A:N(),P:!1,I:!1,D:{},l:e,t:t,k:null,o:null,j:null,C:!1},o=r,i=ut;n&&(o=[r],i=ft);var u=Proxy.revocable(o,i),f=u.revoke,c=u.proxy;return r.k=c,r.j=f,c}(e,n):k(\"ES5\").J(e,n);return(n?n.A:N()).p.push(r),r}function G(t){return h(t)||y(22,t),function t(e){if(!g(e))return e;var n,r=e[et],o=m(e);if(r){if(!r.P&&(r.i<4||!k(\"ES5\").K(r)))return r.t;r.I=!0,n=J(e,o),r.I=!1}else n=J(e,o);return O(n,(function(e,o){r&&function(t,e){return 2===m(t)?t.get(e):t[e]}(r.t,e)===o||j(n,e,t(o))})),3===o?new Set(n):n}(t)}function J(t,e){switch(e){case 2:return new Map(t);case 3:return Array.from(t)}return _(t)}var $=\"undefined\"!=typeof Symbol&&\"symbol\"==typeof Symbol(\"x\"),H=\"undefined\"!=typeof Map,Q=\"undefined\"!=typeof Set,Y=\"undefined\"!=typeof Proxy&&void 0!==Proxy.revocable&&\"undefined\"!=typeof Reflect,Z=$?Symbol.for(\"immer-nothing\"):((e={})[\"immer-nothing\"]=!0,e),tt=$?Symbol.for(\"immer-draftable\"):\"__$immer_draftable\",et=$?Symbol.for(\"immer-state\"):\"__$immer_state\",nt=(\"undefined\"!=typeof Symbol&&Symbol,\"\"+Object.prototype.constructor),rt=\"undefined\"!=typeof Reflect&&Reflect.ownKeys?Reflect.ownKeys:void 0!==Object.getOwnPropertySymbols?function(t){return Object.getOwnPropertyNames(t).concat(Object.getOwnPropertySymbols(t))}:Object.getOwnPropertyNames,ot=Object.getOwnPropertyDescriptors||function(t){var e={};return rt(t).forEach((function(n){e[n]=Object.getOwnPropertyDescriptor(t,n)})),e},it={},ut={get:function(t,e){if(e===et)return t;var n,r,o,i=S(t);if(!w(i,e))return n=t,(o=L(i,e))?\"value\"in o?o.value:null===(r=o.get)||void 0===r?void 0:r.call(n.k):void 0;var u=i[e];return t.I||!g(u)?u:u===U(t.t,e)?(X(t),t.o[e]=B(t.A.h,u,t)):u},has:function(t,e){return e in S(t)},ownKeys:function(t){return Reflect.ownKeys(S(t))},set:function(t,e,n){var r=L(S(t),e);if(null==r?void 0:r.set)return r.set.call(t.k,n),!0;if(!t.P){var o=U(S(t),e),i=null==o?void 0:o[et];if(i&&i.t===n)return t.o[e]=n,t.D[e]=!1,!0;if(P(n,o)&&(void 0!==n||w(t.t,e)))return!0;X(t),V(t)}return t.o[e]===n&&\"number\"!=typeof n&&(void 0!==n||e in t.o)||(t.o[e]=n,t.D[e]=!0,!0)},deleteProperty:function(t,e){return void 0!==U(t.t,e)||e in t.t?(t.D[e]=!1,X(t),V(t)):delete t.D[e],t.o&&delete t.o[e],!0},getOwnPropertyDescriptor:function(t,e){var n=S(t),r=Reflect.getOwnPropertyDescriptor(n,e);return r?{writable:!0,configurable:1!==t.i||\"length\"!==e,enumerable:r.enumerable,value:n[e]}:r},defineProperty:function(){y(11)},getPrototypeOf:function(t){return Object.getPrototypeOf(t.t)},setPrototypeOf:function(){y(12)}},ft={};O(ut,(function(t,e){ft[t]=function(){return arguments[0]=arguments[0][0],e.apply(this,arguments)}})),ft.deleteProperty=function(t,e){return ut.deleteProperty.call(this,t[0],e)},ft.set=function(t,e,n){return ut.set.call(this,t[0],e,n,t[0])};var ct=new(function(){function t(t){var e=this;this.g=Y,this.F=!0,this.produce=function(t,n,r){if(\"function\"==typeof t&&\"function\"!=typeof n){var o=n;n=t;var i=e;return function(t){var e=this;void 0===t&&(t=o);for(var r=arguments.length,u=Array(r>1?r-1:0),f=1;f1?r-1:0),i=1;i=0;n--){var r=e[n];if(0===r.path.length&&\"replace\"===r.op){t=r.value;break}}var o=k(\"Patches\").$;return h(t)?o(t,e):this.produce(t,(function(t){return o(t,e.slice(n+1))}))},t}()),at=ct.produce,lt=(ct.produceWithPatches.bind(ct),ct.setAutoFreeze.bind(ct),ct.setUseProxies.bind(ct),ct.applyPatches.bind(ct),ct.createDraft.bind(ct),ct.finishDraft.bind(ct),at);function st(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function pt(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function dt(t){for(var e=1;e1?e-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:At,n=null,r=null;return function(){return St(e,n,arguments)||(r=t.apply(null,arguments)),n=arguments,r}})),It=function(){for(var t=[],e=0;e\",value:t};if(\"object\"!=typeof t||null===t)return!1;for(var u=null!=r?r(t):Object.entries(t),f=o.length>0,c=0,a=u;c=0)){if(!n(p))return{keyPath:d,value:p};if(\"object\"==typeof p&&(i=Ft(p,d,n,r,o)))return i}}return!1}function qt(t){return void 0===t&&(t={}),function(){return function(t){return function(e){return t(e)}}}}function Wt(t){void 0===t&&(t={});var e=t.thunk,n=void 0===e||e,r=new Ct;return n&&r.push(\"boolean\"==typeof n?Mt:Mt.withExtraArgument(n.extraArgument)),r}function zt(t){var e,n=function(t){return Wt(t)},r=t||{},o=r.reducer,u=void 0===o?void 0:o,f=r.middleware,c=void 0===f?n():f,a=r.devTools,l=void 0===a||a,s=r.preloadedState,p=void 0===s?void 0:s,v=r.enhancers,y=void 0===v?void 0:v;if(\"function\"==typeof u)e=u;else{if(!kt(u))throw new Error('\"reducer\" is a required argument, and must be a function or an object of functions that can be passed to combineReducers');e=mt(u)}var h=c;\"function\"==typeof h&&(h=h(n));var g=Et.apply(void 0,h),b=Pt;l&&(b=Dt(d({trace:!1},\"object\"==typeof l&&l)));var O=[g];return Array.isArray(y)?O=i([g],y):\"function\"==typeof y&&(O=y(O)),Ot(e,p,b.apply(void 0,O))}function Kt(t,e){function n(){for(var n=[],r=0;r-1}function Lt(t){return\"\"+t}function Vt(t){var e,n={},r=[],o={addCase:function(t,e){var r=\"string\"==typeof t?t:t.type;if(r in n)throw new Error(\"addCase cannot be called with two reducers for the same action type\");return n[r]=e,o},addMatcher:function(t,e){return r.push({matcher:t,reducer:e}),o},addDefaultCase:function(t){return e=t,o}};return t(o),[n,r,e]}function Xt(t,e,n,r){void 0===n&&(n=[]);var o=\"function\"==typeof e?Vt(e):[e,n,r],u=o[0],f=o[1],c=o[2],a=lt(t,(function(){}));return function(t,e){void 0===t&&(t=a);var n=i([u[e.type]],f.filter((function(t){return(0,t.matcher)(e)})).map((function(t){return t.reducer})));return 0===n.filter((function(t){return!!t})).length&&(n=[c]),n.reduce((function(t,n){if(n){var r;if(h(t))return void 0===(r=n(t,e))?t:r;if(g(t))return lt(t,(function(t){return n(t,e)}));if(void 0===(r=n(t,e))){if(null===t)return t;throw Error(\"A case reducer on a non-draftable value must not return undefined\")}return r}return t}),t)}}function Bt(t){var e=t.name,n=t.initialState;if(!e)throw new Error(\"`name` is a required option for createSlice\");var r=t.reducers||{},o=\"function\"==typeof t.extraReducers?Vt(t.extraReducers):[t.extraReducers],i=o[0],u=void 0===i?{}:i,f=o[1],c=void 0===f?[]:f,a=o[2],l=void 0===a?void 0:a,s=Object.keys(r),p={},v={},y={};s.forEach((function(t){var n,o,i=r[t],u=e+\"/\"+t;\"reducer\"in i?(n=i.reducer,o=i.prepare):n=i,p[t]=n,v[u]=n,y[t]=o?Kt(u,o):Kt(u)}));var h=Xt(n,d(d({},u),v),c,l);return{name:e,reducer:h,actions:y,caseReducers:p}}function Gt(t){return\"object\"!=typeof t||null==t||Object.isFrozen(t)}function Jt(t){return void 0===t&&(t={}),function(){return function(t){return function(e){return t(e)}}}}function $t(t){return function(e,n){var r=function(e){var r;kt(r=n)&&\"string\"==typeof r.type&&Object.keys(r).every(Ut)?t(n.payload,e):t(n,e)};return h(e)?(r(e),e):lt(e,r)}}function Ht(t,e){return e(t)}function Qt(t){return Array.isArray(t)||(t=Object.values(t)),t}function Yt(t,e,n){for(var r=[],o=[],i=0,u=t=Qt(t);i0&&e.filter((function(e){return function(e,n,r){var o=Object.assign({},r.entities[n.id],n.changes),i=Ht(o,t),u=i!==n.id;return u&&(e[n.id]=i,delete r.entities[n.id]),r.entities[i]=o,u}(r,e,n)})).length>0&&(n.ids=n.ids.map((function(t){return r[t]||t})))}function u(e,r){var o=Yt(e,t,r),u=o[0];i(o[1],r),n(u,r)}return{removeAll:(f=function(t){Object.assign(t,{ids:[],entities:{}})},c=$t((function(t,e){return f(e)})),function(t){return c(t,void 0)}),addOne:$t(e),addMany:$t(n),setOne:$t(r),setMany:$t((function(t,e){for(var n=0,o=t=Qt(t);n-1;return n&&r}function pe(t){return\"function\"==typeof t[0]&&\"pending\"in t[0]&&\"fulfilled\"in t[0]&&\"rejected\"in t[0]}function de(){for(var t=[],e=0;e=0;e--){var o=t[e][et];if(!o.P)switch(o.i){case 5:r(o)&&V(o);break;case 4:n(o)&&V(o)}}}function n(t){for(var e=t.t,n=t.k,r=rt(n),o=r.length-1;o>=0;o--){var i=r[o];if(i!==et){var u=e[i];if(void 0===u&&!w(e,i))return!0;var f=n[i],c=f&&f[et];if(c?c.t!==u:!P(f,u))return!0}}var a=!!e[et];return r.length!==rt(e).length+(a?0:1)}function r(t){var e=t.k;if(e.length!==t.t.length)return!0;var n=Object.getOwnPropertyDescriptor(e,e.length-1);return!(!n||n.get)}var o={};it.ES5||(it.ES5={J:function(e,n){var r=Array.isArray(e),o=function(e,n){if(e){for(var r=Array(n.length),o=0;o Date: Tue, 2 Nov 2021 05:53:12 -0230 Subject: [PATCH 35/97] Ensure exchange rate is stringified before passing to bignumber in confirm-token-transaction component (#12550) --- .../confirm-token-transaction-base.component.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ui/pages/confirm-token-transaction-base/confirm-token-transaction-base.component.js b/ui/pages/confirm-token-transaction-base/confirm-token-transaction-base.component.js index 90180b23e..83c08928e 100644 --- a/ui/pages/confirm-token-transaction-base/confirm-token-transaction-base.component.js +++ b/ui/pages/confirm-token-transaction-base/confirm-token-transaction-base.component.js @@ -35,7 +35,9 @@ export default function ConfirmTokenTransactionBase({ } const decimalEthValue = new BigNumber(tokenAmount) - .times(new BigNumber(contractExchangeRate)) + .times( + new BigNumber(contractExchangeRate ? String(contractExchangeRate) : 0), + ) .toFixed(); return getWeiHexFromDecimalValue({ From e902b931c34187a243edb112c8cbe01691d57a5c Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Tue, 2 Nov 2021 15:55:15 -0230 Subject: [PATCH 36/97] Update the 3D beta logo (#12497) The 3D beta logo has been updated to match this demo: https://metamask.github.io/logo/beta/index.html --- app/build-types/beta/beta-mascot.json | 719 ++++++++++++++++++++++---- 1 file changed, 606 insertions(+), 113 deletions(-) diff --git a/app/build-types/beta/beta-mascot.json b/app/build-types/beta/beta-mascot.json index 5f922a57e..4db57f543 100644 --- a/app/build-types/beta/beta-mascot.json +++ b/app/build-types/beta/beta-mascot.json @@ -1,28 +1,78 @@ { "chunks": [ { - "color": [0, 0, 0], "faces": [ - [11, 12, 13], - [36, 15, 37], - [37, 38, 36], - [31, 39, 22], - [22, 21, 31], - [31, 15, 36], - [36, 39, 31], - [64, 65, 66], - [75, 69, 26], - [26, 80, 75], - [75, 80, 38], - [38, 37, 75], - [38, 80, 39], - [39, 36, 38], - [39, 80, 26], - [26, 22, 39] - ] + [0, 1, 2], + [2, 3, 0], + [4, 5, 2], + [6, 3, 2], + [2, 5, 6], + [7, 8, 9], + [10, 3, 6], + [10, 50, 7], + [7, 3, 10], + [7, 9, 3], + [49, 0, 9], + [3, 9, 0], + [2, 1, 4] + ], + "name": "left ear", + "gradient": "left-ear-gradient" + }, + { + "faces": [ + [53, 54, 55], + [55, 56, 53], + [57, 56, 55], + [58, 59, 55], + [55, 54, 58], + [60, 61, 62], + [63, 58, 54], + [63, 60, 89], + [60, 63, 54], + [60, 54, 61], + [88, 61, 53], + [54, 53, 61], + [55, 59, 57] + ], + "name": "right ear", + "gradient": "right-ear-gradient" + }, + { + "color": [22, 22, 22], + "faces": [[11, 12, 13]], + "name": "left eye" + }, + { + "color": [22, 22, 22], + "faces": [[64, 65, 66]], + "name": "right eye" + }, + { + "faces": [ + [14, 15, 11], + [11, 16, 14] + ], + "name": "left inner eye", + "gradient": "left-inner-eye-gradient" + }, + { + "faces": [[17, 12, 18]], + "name": "left outer eye", + "gradient": "left-outer-eye-gradient" + }, + { + "faces": [[41, 64, 37]], + "name": "right lower inner eye", + "gradient": "right-inner-eye-gradient" + }, + { + "faces": [[67, 68, 66]], + "name": "right outer eye", + "gradient": "right-outer-eye-gradient" }, { - "color": [236, 229, 220], + "color": [192, 173, 158], "faces": [ [19, 20, 21], [21, 22, 19], @@ -34,9 +84,6 @@ [23, 28, 29], [23, 29, 30], [25, 23, 30], - [21, 20, 24], - [24, 31, 21], - [24, 25, 30], [29, 51, 52], [52, 30, 29], [27, 26, 69], @@ -47,126 +94,180 @@ [51, 74, 72], [52, 51, 72], [73, 52, 72], - [69, 71, 70], - [71, 69, 75], - [52, 73, 71], [19, 27, 74], [74, 28, 19], [51, 29, 28], [28, 74, 51], [74, 27, 72], [28, 23, 19] - ] + ], + "name": "lower chin" }, { - "color": [119, 228, 171], + "color": [215, 193, 179], "faces": [ - [5, 4, 35], - [57, 59, 79] - ] + [21, 20, 24], + [24, 31, 21] + ], + "name": "left lower snout" }, { - "color": [80, 157, 116], + "color": [215, 193, 179], "faces": [ - [4, 5, 2], - [2, 5, 6], - [57, 56, 55], - [58, 59, 55], - [2, 1, 4], - [55, 59, 57] - ] + [69, 71, 70], + [71, 69, 75] + ], + "name": "right lower snout" + }, + { + "faces": [[31, 24, 18]], + "name": "left upper snout", + "gradient": "left-upper-snout-gradient" }, { - "color": [67, 127, 95], "faces": [ - [0, 1, 2], - [2, 3, 0], - [6, 3, 2], - [7, 8, 9], - [10, 3, 6], - [10, 50, 7], - [7, 3, 10], - [7, 9, 3], - [49, 0, 9], - [3, 9, 0], - [53, 54, 55], - [55, 56, 53], - [55, 54, 58], - [60, 61, 62], - [63, 58, 54], - [63, 60, 89], - [60, 63, 54], - [60, 54, 61], - [88, 61, 53], - [54, 53, 61] - ] + [6, 5, 16], + [16, 17, 6] + ], + "name": "left forehead", + "gradient": "left-forehead-gradient" }, { - "color": [119, 228, 207], "faces": [ - [59, 5, 35], - [35, 79, 59] - ] + [24, 32, 33], + [33, 34, 24] + ], + "name": "left lower cheek", + "gradient": "left-lower-cheek-gradient" + }, + { + "faces": [[5, 4, 35]], + "name": "left top ear", + "gradient": "left-top-ear-gradient" + }, + { + "faces": [[75, 68, 71]], + "name": "right upper snout", + "gradient": "right-upper-snout-gradient" }, { - "color": [163, 230, 235], "faces": [ - [14, 15, 11], - [11, 16, 14], + [58, 67, 40], + [40, 59, 58] + ], + "name": "right forhead", + "gradient": "right-forehead-gradient" + }, + { + "faces": [ + [71, 76, 77], + [77, 78, 71] + ], + "name": "right lower cheek", + "gradient": "right-lower-cheek-gradient" + }, + { + "faces": [[24, 34, 18]], + "name": "left middle cheek", + "gradient": "left-middle-cheek-gradient" + }, + { + "color": [35, 151, 119], + "faces": [ [16, 13, 12], + [12, 17, 16], + [13, 16, 11] + ], + "name": "left above eye" + }, + { + "faces": [[71, 68, 76]], + "name": "right middle cheek", + "gradient": "right-middle-cheek-gradient" + }, + { + "color": [35, 151, 119], + "faces": [ + [40, 67, 66], + [66, 65, 40], + [65, 64, 40] + ], + "name": "right above eye" + }, + { + "color": [22, 22, 22], + "faces": [ + [36, 15, 37], + [37, 38, 36], + [31, 39, 22], + [22, 21, 31], + [31, 15, 36], + [36, 39, 31], + [75, 69, 26], + [26, 80, 75], + [75, 80, 38], + [38, 37, 75], + [38, 80, 39], + [39, 36, 38], + [39, 80, 26], + [26, 22, 39] + ], + "name": "nose" + }, + { + "faces": [ [17, 33, 10], [17, 18, 34], [34, 33, 17], - [11, 15, 31], - [18, 12, 11], - [41, 64, 37], - [64, 41, 40], - [66, 65, 40], - [67, 63, 77], - [67, 77, 76], - [76, 68, 67], - [75, 37, 64], - [68, 64, 66] - ] + [10, 6, 17] + ], + "name": "left upper cheek", + "gradient": "left-upper-cheek-gradient" }, { - "color": [204, 237, 236], "faces": [ - [10, 6, 17], + [11, 15, 31], [31, 18, 11], + [18, 12, 11] + ], + "name": "left below eye", + "gradient": "left-below-eye-gradient" + }, + { + "faces": [ [14, 16, 40], [40, 41, 14], - [63, 67, 58], - [64, 68, 75], + [59, 5, 35], + [35, 79, 59], [14, 41, 37], [37, 15, 14], [5, 59, 40], [40, 16, 5] - ] + ], + "name": "forehead", + "gradient": "forehead-gradient" }, { - "color": [207, 248, 247], "faces": [ - [6, 5, 16], - [16, 17, 6], - [12, 17, 16], - [58, 67, 40], - [40, 59, 58], - [40, 67, 66] - ] + [67, 63, 77], + [67, 77, 76], + [76, 68, 67], + [63, 67, 58] + ], + "name": "right upper cheek", + "gradient": "right-upper-cheek-gradient" }, { - "color": [127, 185, 228], "faces": [ - [33, 34, 24], - [71, 76, 77] - ] + [64, 68, 75], + [75, 37, 64], + [68, 64, 66] + ], + "name": "right below eye", + "gradient": "right-below-eye-gradient" }, { - "color": [119, 200, 228], "faces": [ - [31, 24, 18], - [24, 34, 18], [35, 4, 42], [4, 1, 42], [42, 43, 44], @@ -174,6 +275,7 @@ [45, 43, 42], [42, 10, 45], [30, 32, 24], + [24, 25, 30], [30, 33, 32], [33, 30, 10], [44, 43, 46], @@ -189,8 +291,6 @@ [1, 0, 42], [42, 9, 8], [42, 49, 9], - [75, 68, 71], - [71, 68, 76], [79, 81, 57], [57, 81, 56], [82, 79, 35], @@ -201,6 +301,7 @@ [81, 83, 84], [44, 46, 85], [85, 82, 44], + [52, 73, 71], [71, 78, 52], [52, 78, 77], [77, 63, 52], @@ -223,25 +324,417 @@ [85, 46, 47], [48, 30, 52], [52, 87, 48] - ] + ], + "name": "back", + "gradient": "back-gradient" }, { - "color": [95, 167, 211], - "faces": [ - [24, 32, 33], - [77, 78, 71] - ] + "faces": [[57, 59, 79]], + "name": "right top ear", + "gradient": "right-top-ear-gradient" }, { - "color": [119, 222, 228], - "faces": [ - [17, 12, 18], - [13, 16, 11], - [67, 68, 66], - [65, 64, 40] - ] + "faces": [[64, 41, 40]], + "name": "right inner upper eye", + "gradient": "right-inner-eye-gradient" } ], + "gradients": { + "forehead-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#23FE4A" + }, + { + "offset": 1, + "stop-color": "#BAD8EF" + } + ], + "x1": "50%", + "y1": "20.232164948453608%", + "x2": "50%", + "y2": "74.87123711340206%", + "gradientUnits": "userSpaceOnUse" + }, + "right-upper-cheek-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#20B475" + }, + { + "offset": 1, + "stop-color": "#70BDCE" + } + ], + "x1": "77.19501199040768%", + "y1": "44.68123711340206%", + "x2": "77.19501199040768%", + "y2": "68.2861855670103%", + "gradientUnits": "userSpaceOnUse" + }, + "left-upper-cheek-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#20B475" + }, + { + "offset": 1, + "stop-color": "#70BDCE" + } + ], + "x1": "22.820719424460435%", + "y1": "44.68123711340206%", + "x2": "22.820719424460435%", + "y2": "68.2861855670103%", + "gradientUnits": "userSpaceOnUse" + }, + "right-below-eye-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#85BBE1" + }, + { + "offset": 1, + "stop-color": "#7CCACA" + } + ], + "x1": "54.34676258992806%", + "y1": "68.26917525773197%", + "x2": "65.3001438848921%", + "y2": "68.26917525773197%", + "gradientUnits": "userSpaceOnUse" + }, + "left-below-eye-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#7CCACA" + }, + { + "offset": 1, + "stop-color": "#85BBE1" + } + ], + "x1": "34.731223021582736%", + "y1": "68.26917525773197%", + "x2": "45.65323741007194%", + "y2": "68.26917525773197%", + "gradientUnits": "userSpaceOnUse" + }, + "right-ear-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#074F1E" + }, + { + "offset": 0.4286, + "stop-color": "#05541C" + }, + { + "offset": 0.62, + "stop-color": "#006A13" + }, + { + "offset": 1, + "stop-color": "#007514" + } + ], + "x1": "61.443549160671466%", + "y1": "44.51773195876289%", + "x2": "93.802206235012%", + "y2": "24.439072164948456%", + "gradientUnits": "userSpaceOnUse" + }, + "left-ear-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#074F1E" + }, + { + "offset": 0.4286, + "stop-color": "#05541C" + }, + { + "offset": 0.62, + "stop-color": "#006A13" + }, + { + "offset": 1, + "stop-color": "#007514" + } + ], + "x1": "32.7432134292566%", + "y1": "44.33329896907217%", + "x2": "4.853390887290168%", + "y2": "19.18181443298969%", + "gradientUnits": "userSpaceOnUse" + }, + "left-outer-eye-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#43C3A2" + }, + { + "offset": 1, + "stop-color": "#4FAFC0" + }, + { + "offset": 1, + "stop-color": "#4FAFC0" + } + ], + "x1": "27.575539568345324%", + "y1": "60.519278350515464%", + "x2": "34.982350119904076%", + "y2": "60.519278350515464%", + "gradientUnits": "userSpaceOnUse" + }, + "right-outer-eye-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#4FAFC0" + }, + { + "offset": 1, + "stop-color": "#43C3A2" + } + ], + "x1": "65.01764988009592%", + "y1": "60.519278350515464%", + "x2": "72.42446043165468%", + "y2": "60.519278350515464%", + "gradientUnits": "userSpaceOnUse" + }, + "right-lower-cheek-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#59ADCB" + }, + { + "offset": 1, + "stop-color": "#436CC8" + } + ], + "x1": "77.93247002398083%", + "y1": "68.15113402061857%", + "x2": "77.93247002398083%", + "y2": "86.82577319587631%", + "gradientUnits": "userSpaceOnUse" + }, + "left-lower-cheek-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#59ADCB" + }, + { + "offset": 1, + "stop-color": "#436CC8" + } + ], + "x1": "22.083165467625896%", + "y1": "68.15113402061857%", + "x2": "22.083165467625896%", + "y2": "86.82577319587631%", + "gradientUnits": "userSpaceOnUse" + }, + "left-top-ear-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#0ED54A" + }, + { + "offset": 1, + "stop-color": "#0ED54A" + } + ], + "x1": "13.954513189448441%", + "y1": "22.055670103092787%", + "x2": "44.146762589928066%", + "y2": "22.055670103092787%", + "gradientUnits": "userSpaceOnUse" + }, + "right-top-ear-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#0ED54A" + }, + { + "offset": 1, + "stop-color": "#11EB36" + } + ], + "x1": "55.85333333333334%", + "y1": "22.055670103092787%", + "x2": "86.04556354916068%", + "y2": "22.055670103092787%", + "gradientUnits": "userSpaceOnUse" + }, + "left-forehead-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#15DC5D" + }, + { + "offset": 1, + "stop-color": "#48CA9F" + } + ], + "x1": "36.3947242206235%", + "y1": "34.11144329896908%", + "x2": "36.3947242206235%", + "y2": "53.59649484536083%", + "gradientUnits": "userSpaceOnUse" + }, + "right-forehead-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#15DC5D" + }, + { + "offset": 1, + "stop-color": "#48CA9F" + } + ], + "x1": "63.6052757793765%", + "y1": "34.11144329896908%", + "x2": "63.6052757793765%", + "y2": "53.59649484536083%", + "gradientUnits": "userSpaceOnUse" + }, + "left-upper-snout-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#54A8CF" + }, + { + "offset": 1, + "stop-color": "#5393E3" + } + ], + "x1": "38.829736211031175%", + "y1": "68.28865979381443%", + "x2": "38.829736211031175%", + "y2": "81.55670103092784%", + "gradientUnits": "userSpaceOnUse" + }, + "right-upper-snout-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#54A8CF" + }, + { + "offset": 1, + "stop-color": "#5393E3" + } + ], + "x1": "61.17026378896883%", + "y1": "68.28865979381443%", + "x2": "61.17026378896883%", + "y2": "81.55670103092784%", + "gradientUnits": "userSpaceOnUse" + }, + "right-middle-cheek-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#32819D" + }, + { + "offset": 0.3363, + "stop-color": "#447DCD" + } + ], + "x1": "69.9137649880096%", + "y1": "51.063505154639174%", + "x2": "69.9137649880096%", + "y2": "85.81041237113402%", + "gradientUnits": "userSpaceOnUse" + }, + "left-middle-cheek-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#32819D" + }, + { + "offset": 0.3363, + "stop-color": "#447DCD" + } + ], + "x1": "30.086330935251798%", + "y1": "68.15092783505153%", + "x2": "30.086330935251798%", + "y2": "81.55752577319588%", + "gradientUnits": "userSpaceOnUse" + }, + "right-inner-eye-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#53A9CB" + }, + { + "offset": 1, + "stop-color": "#44C0A6" + } + ], + "x1": "55.38244604316547%", + "y1": "74.87123711340206%", + "x2": "55.38244604316547%", + "y2": "53.59659793814433%", + "gradientUnits": "userSpaceOnUse" + }, + "left-inner-eye-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#53A9CB" + }, + { + "offset": 1, + "stop-color": "#44C0A6" + } + ], + "x1": "43.58177458033573%", + "y1": "64.2339175257732%", + "x2": "45.65323741007194%", + "y2": "64.2339175257732%", + "gradientUnits": "userSpaceOnUse" + }, + "back-gradient": { + "type": "linear", + "stops": [ + { + "stop-color": "#27FC4E" + }, + { + "offset": 1, + "stop-color": "#446FC9" + } + ], + "x1": "50%", + "y1": "0%", + "x2": "50%", + "y2": "100%", + "gradientUnits": "userSpaceOnUse" + } + }, "positions": [ [111.024597, 52.604599, 46.225899], [114.025002, 87.673302, 58.9818], From 95e3be4a85fdfc328e9365811f5972d99c7c0e48 Mon Sep 17 00:00:00 2001 From: Olusegun Akintayo Date: Wed, 3 Nov 2021 02:15:05 +0400 Subject: [PATCH 37/97] UX improvements to the "Permission Request" section on the approve screen (#12553) * UX improvements to the "Permission Request" section on the approve screen Signed-off-by: Akintayo A. Olusegun * Fix locales. Signed-off-by: Akintayo A. Olusegun * Check that hidden elements are hidden in test Signed-off-by: Akintayo A. Olusegun * Lint fixes Signed-off-by: Akintayo A. Olusegun --- app/_locales/en/messages.json | 15 ++++---- app/_locales/es/messages.json | 6 ---- app/_locales/es_419/messages.json | 6 ---- app/_locales/hi/messages.json | 6 ---- app/_locales/id/messages.json | 6 ---- app/_locales/it/messages.json | 6 ---- app/_locales/ja/messages.json | 6 ---- app/_locales/ko/messages.json | 6 ---- app/_locales/ph/messages.json | 6 ---- app/_locales/pt_BR/messages.json | 6 ---- app/_locales/ru/messages.json | 6 ---- app/_locales/tl/messages.json | 6 ---- app/_locales/vi/messages.json | 6 ---- app/_locales/zh_CN/messages.json | 6 ---- ui/helpers/utils/transactions.util.js | 2 +- .../confirm-approve-content.component.js | 36 +++++++++++++++---- .../confirm-approve-content.component.test.js | 10 ++++++ 17 files changed, 50 insertions(+), 91 deletions(-) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 8fce3223d..7142a2241 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -159,9 +159,6 @@ "amount": { "message": "Amount" }, - "amountWithColon": { - "message": "Amount:" - }, "appDescription": { "message": "An Ethereum Wallet in your Browser", "description": "The description of the application" @@ -189,6 +186,9 @@ "approved": { "message": "Approved" }, + "approvedAmountWithColon": { + "message": "Approved Amount:" + }, "asset": { "message": "Asset" }, @@ -1058,6 +1058,9 @@ "goerli": { "message": "Goerli Test Network" }, + "grantedToWithColon": { + "message": "Granted To:" + }, "happyToSeeYou": { "message": "We’re happy to see you." }, @@ -1791,6 +1794,9 @@ "permissionCheckedIconDescription": { "message": "You have approved this permission" }, + "permissionRequest": { + "message": "Permission Request" + }, "permissionUncheckedIconDescription": { "message": "You have not approved this permission" }, @@ -2730,9 +2736,6 @@ "message": "To: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "toWithColon": { - "message": "To:" - }, "token": { "message": "Token" }, diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index 8f1f68bb8..1170442e8 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -140,9 +140,6 @@ "amount": { "message": "Importe" }, - "amountWithColon": { - "message": "Importe:" - }, "appDescription": { "message": "Una cartera de Ethereum en el explorador", "description": "The description of the application" @@ -2191,9 +2188,6 @@ "message": "Para: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "toWithColon": { - "message": "Para:" - }, "token": { "message": "Token" }, diff --git a/app/_locales/es_419/messages.json b/app/_locales/es_419/messages.json index 8f1f68bb8..1170442e8 100644 --- a/app/_locales/es_419/messages.json +++ b/app/_locales/es_419/messages.json @@ -140,9 +140,6 @@ "amount": { "message": "Importe" }, - "amountWithColon": { - "message": "Importe:" - }, "appDescription": { "message": "Una cartera de Ethereum en el explorador", "description": "The description of the application" @@ -2191,9 +2188,6 @@ "message": "Para: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "toWithColon": { - "message": "Para:" - }, "token": { "message": "Token" }, diff --git a/app/_locales/hi/messages.json b/app/_locales/hi/messages.json index ab50c5328..653ca8a45 100644 --- a/app/_locales/hi/messages.json +++ b/app/_locales/hi/messages.json @@ -140,9 +140,6 @@ "amount": { "message": "राशि" }, - "amountWithColon": { - "message": "राशि:" - }, "appDescription": { "message": "आपके ब्राउज़र में एक Ethereum वॉलेट", "description": "The description of the application" @@ -2191,9 +2188,6 @@ "message": "प्रति: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "toWithColon": { - "message": "प्रति:" - }, "token": { "message": "टोकन" }, diff --git a/app/_locales/id/messages.json b/app/_locales/id/messages.json index 8bca3cece..cbc3f52b6 100644 --- a/app/_locales/id/messages.json +++ b/app/_locales/id/messages.json @@ -140,9 +140,6 @@ "amount": { "message": "Jumlah" }, - "amountWithColon": { - "message": "Jumlah:" - }, "appDescription": { "message": "Dompet Ethereum di Browser Anda", "description": "The description of the application" @@ -2191,9 +2188,6 @@ "message": "Untuk: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "toWithColon": { - "message": "Untuk:" - }, "token": { "message": "Token" }, diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json index e04653899..8d58326c1 100644 --- a/app/_locales/it/messages.json +++ b/app/_locales/it/messages.json @@ -113,9 +113,6 @@ "amount": { "message": "Importo" }, - "amountWithColon": { - "message": "Importo:" - }, "appDescription": { "message": "Ethereum Browser Extension", "description": "The description of the application" @@ -1783,9 +1780,6 @@ "message": "A: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "toWithColon": { - "message": "To:" - }, "token": { "message": "Token" }, diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json index 8d9c10434..5d7b12c1e 100644 --- a/app/_locales/ja/messages.json +++ b/app/_locales/ja/messages.json @@ -140,9 +140,6 @@ "amount": { "message": "金額" }, - "amountWithColon": { - "message": "金額:" - }, "appDescription": { "message": "ブラウザーにあるイーサリアム ウォレット", "description": "The description of the application" @@ -2191,9 +2188,6 @@ "message": "移動先:$1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "toWithColon": { - "message": "移動先:" - }, "token": { "message": "トークン" }, diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index ac4b5c7ab..d2592d873 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -140,9 +140,6 @@ "amount": { "message": "금액" }, - "amountWithColon": { - "message": "금액:" - }, "appDescription": { "message": "브라우저의 이더리움 지갑", "description": "The description of the application" @@ -2191,9 +2188,6 @@ "message": "수신: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "toWithColon": { - "message": "수신:" - }, "token": { "message": "토큰" }, diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json index 2b5843d0a..173e3a729 100644 --- a/app/_locales/ph/messages.json +++ b/app/_locales/ph/messages.json @@ -140,9 +140,6 @@ "amount": { "message": "Halaga" }, - "amountWithColon": { - "message": "Halaga:" - }, "appDescription": { "message": "Ethereum Wallet sa iyong Browser", "description": "The description of the application" @@ -2191,9 +2188,6 @@ "message": "Para kay/sa: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "toWithColon": { - "message": "Para kay/sa:" - }, "token": { "message": "Token" }, diff --git a/app/_locales/pt_BR/messages.json b/app/_locales/pt_BR/messages.json index a2a193242..cf20e2d67 100644 --- a/app/_locales/pt_BR/messages.json +++ b/app/_locales/pt_BR/messages.json @@ -140,9 +140,6 @@ "amount": { "message": "Valor" }, - "amountWithColon": { - "message": "Valor:" - }, "appDescription": { "message": "Uma carteira do Ethereum no seu navegador", "description": "The description of the application" @@ -2191,9 +2188,6 @@ "message": "Até: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "toWithColon": { - "message": "Até:" - }, "token": { "message": "Token" }, diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json index 92aa6dcf9..1f8c23a86 100644 --- a/app/_locales/ru/messages.json +++ b/app/_locales/ru/messages.json @@ -140,9 +140,6 @@ "amount": { "message": "Сумма" }, - "amountWithColon": { - "message": "Сумма:" - }, "appDescription": { "message": "Кошелек Ethereum в вашем браузере", "description": "The description of the application" @@ -2191,9 +2188,6 @@ "message": "Адресат $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "toWithColon": { - "message": "Адресат" - }, "token": { "message": "Токен" }, diff --git a/app/_locales/tl/messages.json b/app/_locales/tl/messages.json index 24f8fbf84..a7c38bc26 100644 --- a/app/_locales/tl/messages.json +++ b/app/_locales/tl/messages.json @@ -107,9 +107,6 @@ "amount": { "message": "Halaga" }, - "amountWithColon": { - "message": "Halaga:" - }, "appDescription": { "message": "Ethereum Wallet sa iyong Browser", "description": "The description of the application" @@ -1739,9 +1736,6 @@ "message": "Para kay/sa: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "toWithColon": { - "message": "Para kay/sa:" - }, "token": { "message": "Token" }, diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json index 685072a32..514843de4 100644 --- a/app/_locales/vi/messages.json +++ b/app/_locales/vi/messages.json @@ -140,9 +140,6 @@ "amount": { "message": "Số tiền" }, - "amountWithColon": { - "message": "Số tiền:" - }, "appDescription": { "message": "Ví Ethereum trên trình duyệt của bạn", "description": "The description of the application" @@ -2191,9 +2188,6 @@ "message": "Đến: $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "toWithColon": { - "message": "Đến:" - }, "token": { "message": "Token" }, diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index e75d509ab..fc01dbd06 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -113,9 +113,6 @@ "amount": { "message": "数额" }, - "amountWithColon": { - "message": "数额:" - }, "appDescription": { "message": "以太坊浏览器插件", "description": "The description of the application" @@ -1763,9 +1760,6 @@ "message": "至:$1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, - "toWithColon": { - "message": "至:" - }, "token": { "message": "代币" }, diff --git a/ui/helpers/utils/transactions.util.js b/ui/helpers/utils/transactions.util.js index 17a27c81a..0613159bc 100644 --- a/ui/helpers/utils/transactions.util.js +++ b/ui/helpers/utils/transactions.util.js @@ -145,7 +145,7 @@ export function getLatestSubmittedTxWithNonce( } export async function isSmartContractAddress(address) { - const { isContractCode } = readAddressAsContract(global.eth, address); + const { isContractCode } = await readAddressAsContract(global.eth, address); return isContractCode; } diff --git a/ui/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.js b/ui/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.js index 393b70b5e..5ef9171f8 100644 --- a/ui/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.js +++ b/ui/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.js @@ -147,8 +147,11 @@ export default class ConfirmApproveContent extends Component { tokenSymbol, origin, toAddress, + isContract, } = this.props; - + const displayedAddress = isContract + ? `${t('contract')} (${addressSummary(toAddress)})` + : addressSummary(toAddress); return (

@@ -156,7 +159,7 @@ export default class ConfirmApproveContent extends Component {
- {t('amountWithColon')} + {t('approvedAmountWithColon')}
{`${Number(customTokenAmount || tokenAmount)} ${tokenSymbol}`} @@ -164,10 +167,31 @@ export default class ConfirmApproveContent extends Component {
- {t('toWithColon')} + {t('grantedToWithColon')} +
+
+ {`${displayedAddress}`}
- {addressSummary(toAddress)} +
@@ -396,7 +420,7 @@ export default class ConfirmApproveContent extends Component {
{this.renderApproveContentCard({ symbol: , - title: 'Transaction Fee', + title: t('transactionFee'), showEdit: true, onEditClick: showCustomizeGasModal, content: this.renderTransactionDetailsContent(), @@ -468,7 +492,7 @@ export default class ConfirmApproveContent extends Component {
{this.renderApproveContentCard({ symbol: , - title: 'Permission', + title: t('permissionRequest'), content: this.renderPermissionContent(), showEdit: true, onEditClick: () => diff --git a/ui/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.test.js b/ui/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.test.js index bd65c1bcb..ab3b94b20 100644 --- a/ui/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.test.js +++ b/ui/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.test.js @@ -70,5 +70,15 @@ describe('ConfirmApproveContent Component', () => { expect(queryByText('2')).toBeInTheDocument(); fireEvent.click(editButtons[1]); expect(props.showCustomizeNonceModal).toHaveBeenCalledTimes(1); + + const showHideTxDetails = getByText('View full transaction details'); + expect(queryByText('Permission Request')).not.toBeInTheDocument(); + expect(queryByText('Approved Amount:')).not.toBeInTheDocument(); + expect(queryByText('Granted To:')).not.toBeInTheDocument(); + fireEvent.click(showHideTxDetails); + expect(getByText('Permission Request')).toBeInTheDocument(); + expect(getByText('Approved Amount:')).toBeInTheDocument(); + expect(getByText('Granted To:')).toBeInTheDocument(); + expect(getByText('0x9bc5...fef4')).toBeInTheDocument(); }); }); From 1298a8cdc6144cec9b7cce9d30985a4c57861aab Mon Sep 17 00:00:00 2001 From: kumavis Date: Tue, 2 Nov 2021 16:41:33 -0700 Subject: [PATCH 38/97] deps - update sentry (#12561) --- package.json | 4 +-- yarn.lock | 96 ++++++++++++++++++++++++++-------------------------- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/package.json b/package.json index 5553a9651..ae0677a48 100644 --- a/package.json +++ b/package.json @@ -115,8 +115,8 @@ "@metamask/providers": "^8.1.1", "@popperjs/core": "^2.4.0", "@reduxjs/toolkit": "^1.6.2", - "@sentry/browser": "^5.26.0", - "@sentry/integrations": "^5.26.0", + "@sentry/browser": "^6.0.0", + "@sentry/integrations": "^6.0.0", "@zxing/library": "^0.8.0", "analytics-node": "^3.4.0-beta.3", "await-semaphore": "^0.1.1", diff --git a/yarn.lock b/yarn.lock index 4cd6fd695..ebc7e2267 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3927,14 +3927,14 @@ component-type "^1.2.1" join-component "^1.1.0" -"@sentry/browser@^5.26.0": - version "5.26.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.26.0.tgz#e90a197fb94c5f26c8e05d6a539c118f33c7d598" - integrity sha512-52kNVpy10Zd3gJRGFkhnOQvr80WJg7+XBqjMOE0//Akh4PfvEK3IqmAjVqysz6aHdruwTTivKF4ZoAxL/pA7Rg== - dependencies: - "@sentry/core" "5.26.0" - "@sentry/types" "5.26.0" - "@sentry/utils" "5.26.0" +"@sentry/browser@^6.0.0": + version "6.13.3" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.13.3.tgz#d4511791b1e484ad48785eba3bce291fdf115c1e" + integrity sha512-jwlpsk2/u1cofvfYsjmqcnx50JJtf/T6HTgdW+ih8+rqWC5ABEZf4IiB/H+KAyjJ3wVzCOugMq5irL83XDCfqQ== + dependencies: + "@sentry/core" "6.13.3" + "@sentry/types" "6.13.3" + "@sentry/utils" "6.13.3" tslib "^1.9.3" "@sentry/cli@^1.58.0": @@ -3948,56 +3948,56 @@ progress "^2.0.3" proxy-from-env "^1.1.0" -"@sentry/core@5.26.0": - version "5.26.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.26.0.tgz#9b5fe4de8a869d733ebcc77f5ec9c619f8717a51" - integrity sha512-Ubrw7K52orTVsaxpz8Su40FPXugKipoQC+zPrXcH+JIMB+o18kutF81Ae4WzuUqLfP7YB91eAlRrP608zw0EXA== +"@sentry/core@6.13.3": + version "6.13.3" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.13.3.tgz#5cbbb995128e793ebebcbf1d3b7514e0e5e8b221" + integrity sha512-obm3SjgCk8A7nB37b2AU1eq1q7gMoJRrGMv9VRIyfcG0Wlz/5lJ9O3ohUk+YZaaVfZMxXn6hFtsBiOWmlv7IIA== dependencies: - "@sentry/hub" "5.26.0" - "@sentry/minimal" "5.26.0" - "@sentry/types" "5.26.0" - "@sentry/utils" "5.26.0" + "@sentry/hub" "6.13.3" + "@sentry/minimal" "6.13.3" + "@sentry/types" "6.13.3" + "@sentry/utils" "6.13.3" tslib "^1.9.3" -"@sentry/hub@5.26.0": - version "5.26.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.26.0.tgz#b2bbd8128cd5915f2ee59cbc29fff30272d74ec5" - integrity sha512-lAYeWvvhGYS6eQ5d0VEojw0juxGc3v4aAu8VLvMKWcZ1jXD13Bhc46u9Nvf4qAY6BAQsJDQcpEZLpzJu1bk1Qw== +"@sentry/hub@6.13.3": + version "6.13.3" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.13.3.tgz#cc09623a69b5343315fdb61c7fdd0be74b72299f" + integrity sha512-eYppBVqvhs5cvm33snW2sxfcw6G20/74RbBn+E4WDo15hozis89kU7ZCJDOPkXuag3v1h9igns/kM6PNBb41dw== dependencies: - "@sentry/types" "5.26.0" - "@sentry/utils" "5.26.0" + "@sentry/types" "6.13.3" + "@sentry/utils" "6.13.3" tslib "^1.9.3" -"@sentry/integrations@^5.26.0": - version "5.26.0" - resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-5.26.0.tgz#cf90005359862c5b1df4df0f1ce8be5e56c9e1ad" - integrity sha512-XBMPm3wWW+3EJvWFHdVcl0PSWjjNEzmQxjjWeMv9vLWAC1zhS8gcpk/LyDIFWojJBzhASD8f1mLv2ZdKZtA1ZQ== +"@sentry/integrations@^6.0.0": + version "6.13.3" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-6.13.3.tgz#9d80229de6e815c53fa52ca2422a0d13820b8d4e" + integrity sha512-iC8LkbBTxlRo9FNxRqFfEm85FrELltc3E9gFsFSBkCnf7S/3nDCDW+mJX92KpRk97Wqid6/JwlXttKz8lsdF2A== dependencies: - "@sentry/types" "5.26.0" - "@sentry/utils" "5.26.0" - localforage "1.8.1" + "@sentry/types" "6.13.3" + "@sentry/utils" "6.13.3" + localforage "^1.8.1" tslib "^1.9.3" -"@sentry/minimal@5.26.0": - version "5.26.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.26.0.tgz#851dea3644153ed3ac4837fa8ed5661d94e7a313" - integrity sha512-mdFo3FYaI1W3KEd8EHATYx8mDOZIxeoUhcBLlH7Iej6rKvdM7p8GoECrmHPU1l6sCCPtBuz66QT5YeXc7WILsA== +"@sentry/minimal@6.13.3": + version "6.13.3" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.13.3.tgz#a675a79bcc830142e4f95e6198a2efde2cd3901e" + integrity sha512-63MlYYRni3fs5Bh8XBAfVZ+ctDdWg0fapSTP1ydIC37fKvbE+5zhyUqwrEKBIiclEApg1VKX7bkKxVdu/vsFdw== dependencies: - "@sentry/hub" "5.26.0" - "@sentry/types" "5.26.0" + "@sentry/hub" "6.13.3" + "@sentry/types" "6.13.3" tslib "^1.9.3" -"@sentry/types@5.26.0": - version "5.26.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.26.0.tgz#b0cbacb0b24cd86620fb296b46cf7277bb004a3e" - integrity sha512-ugpa1ePOhK55pjsyutAsa2tiJVQEyGYCaOXzaheg/3+EvhMdoW+owiZ8wupfvPhtZFIU3+FPOVz0d5k9K5d1rw== +"@sentry/types@6.13.3": + version "6.13.3" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.13.3.tgz#63ad5b6735b0dfd90b3a256a9f8e77b93f0f66b2" + integrity sha512-Vrz5CdhaTRSvCQjSyIFIaV9PodjAVFkzJkTRxyY7P77RcegMsRSsG1yzlvCtA99zG9+e6MfoJOgbOCwuZids5A== -"@sentry/utils@5.26.0": - version "5.26.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.26.0.tgz#09a3d01d91747f38f796cafeb24f8fd86e4fa05f" - integrity sha512-F2gnHIAWbjiowcAgxz3VpKxY/NQ39NTujEd/NPnRTWlRynLFg3bAV+UvZFXljhYJeN3b/zRlScNDcpCWTrtZGw== +"@sentry/utils@6.13.3": + version "6.13.3" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.13.3.tgz#188754d40afe693c3fcae410f9322531588a9926" + integrity sha512-zYFuFH3MaYtBZTeJ4Yajg7pDf0pM3MWs3+9k5my9Fd+eqNcl7dYQYJbT9gyC0HXK1QI4CAMNNlHNl4YXhF91ag== dependencies: - "@sentry/types" "5.26.0" + "@sentry/types" "6.13.3" tslib "^1.9.3" "@sindresorhus/is@^0.14.0": @@ -19457,10 +19457,10 @@ locale-currency@0.0.1: resolved "https://registry.yarnpkg.com/locale-currency/-/locale-currency-0.0.1.tgz#c9e15a22ff575b4b4bb947a4bf92ac236bd1fe9b" integrity sha1-yeFaIv9XW0tLuUekv5KsI2vR/ps= -localforage@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.8.1.tgz#f6c0a24b41ab33b10e4dc84342dd696f6f3e3433" - integrity sha512-azSSJJfc7h4bVpi0PGi+SmLQKJl2/8NErI+LhJsrORNikMZnhaQ7rv9fHj+ofwgSHrKRlsDCL/639a6nECIKuQ== +localforage@^1.8.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" + integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== dependencies: lie "3.1.1" From 5f0fd9d1c25050fcb60b10469906f15d2b109aac Mon Sep 17 00:00:00 2001 From: Erik Marks <25517051+rekmarks@users.noreply.github.com> Date: Tue, 2 Nov 2021 17:01:01 -0700 Subject: [PATCH 39/97] Add lockdown e2e test (#12562) This PR adds an e2e test to ensure that the background and UI environments are locked down. It reuses the logic from the `protect-intrinsics.test.js`, and runs in both Chrome and Firefox. --- .eslintrc.js | 4 +- test/e2e/tests/lockdown.spec.js | 89 +++++++++++++++++++++ test/e2e/webdriver/driver.js | 5 ++ test/helpers/protect-intrinsics-helpers.js | 81 +++++++++++++++++++ test/unit-global/protect-intrinsics.test.js | 69 ++-------------- 5 files changed, 184 insertions(+), 64 deletions(-) create mode 100644 test/e2e/tests/lockdown.spec.js create mode 100644 test/helpers/protect-intrinsics-helpers.js diff --git a/.eslintrc.js b/.eslintrc.js index a62366c17..17b766601 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -191,9 +191,10 @@ module.exports = { 'app/scripts/lockdown-more.js', 'development/**/*.js', 'test/e2e/**/*.js', - 'test/lib/wait-until-called.js', 'test/env.js', 'test/setup.js', + 'test/helpers/protect-intrinsics-helpers.js', + 'test/lib/wait-until-called.js', 'jest.config.js', ], parserOptions: { @@ -204,6 +205,7 @@ module.exports = { files: [ 'app/scripts/lockdown-run.js', 'app/scripts/lockdown-more.js', + 'test/helpers/protect-intrinsics-helpers.js', 'test/unit-global/protect-intrinsics.test.js', ], globals: { diff --git a/test/e2e/tests/lockdown.spec.js b/test/e2e/tests/lockdown.spec.js new file mode 100644 index 000000000..a1d0db969 --- /dev/null +++ b/test/e2e/tests/lockdown.spec.js @@ -0,0 +1,89 @@ +const { strict: assert } = require('assert'); +const { Browser } = require('selenium-webdriver'); +const { + getGlobalProperties, + testIntrinsic, +} = require('../../helpers/protect-intrinsics-helpers'); +const { withFixtures } = require('../helpers'); +const { PAGES } = require('../webdriver/driver'); + +const isFirefox = process.env.SELENIUM_BROWSER === Browser.FIREFOX; + +/** + * This script iterates over all named intrinsics and tests that they are locked + * down per ses/lockdown. + * + * We set globalThis to window in Firefox because the test fails otherwise. + * We believe this is due to some Selenium-related shenanigans. In the browser, + * this behavior is not a problem. + */ +const lockdownTestScript = ` +${isFirefox ? 'globalThis = window;' : ''} + +const assert = { + equal: (value, comparison, message) => { + if (value !== comparison) { + throw new Error(message || 'not equal'); + } + }, + ok: (value, message) => { + if (!value) { + throw new Error(message || 'not ok'); + } + }, +}; + +${getGlobalProperties.toString()} + +${testIntrinsic.toString()} + +try { + getGlobalProperties().forEach((propertyName) => { + console.log('Testing intrinsic:', propertyName); + testIntrinsic(propertyName); + }) + console.log('Lockdown test successful!'); + return true; +} catch (error) { + console.log('Lockdown test failed.', error); + return false; +} +`; + +describe('lockdown', function () { + const ganacheOptions = { + accounts: [ + { + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: 25000000000000000000, + }, + ], + }; + + it('the UI and background environments are locked down', async function () { + await withFixtures( + { + // The fixtures used here is arbitrary. Any fixture would do. + fixtures: 'imported-account', + ganacheOptions, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(PAGES.HOME); + assert.equal( + await driver.executeScript(lockdownTestScript), + true, + 'The UI environment should be locked down.', + ); + + await driver.navigate(PAGES.BACKGROUND); + assert.equal( + await driver.executeScript(lockdownTestScript), + true, + 'The background environment should be locked down.', + ); + }, + ); + }); +}); diff --git a/test/e2e/webdriver/driver.js b/test/e2e/webdriver/driver.js index ad8430794..501feeaef 100644 --- a/test/e2e/webdriver/driver.js +++ b/test/e2e/webdriver/driver.js @@ -49,6 +49,10 @@ class Driver { }; } + async executeScript(script, ...args) { + return this.driver.executeScript(script, args); + } + buildLocator(locator) { if (typeof locator === 'string') { // If locator is a string we assume its a css selector @@ -388,6 +392,7 @@ function collectMetrics() { } Driver.PAGES = { + BACKGROUND: 'background', HOME: 'home', NOTIFICATION: 'notification', POPUP: 'popup', diff --git a/test/helpers/protect-intrinsics-helpers.js b/test/helpers/protect-intrinsics-helpers.js new file mode 100644 index 000000000..d3e046e08 --- /dev/null +++ b/test/helpers/protect-intrinsics-helpers.js @@ -0,0 +1,81 @@ +const { strict: assert } = require('assert'); + +module.exports = { + getGlobalProperties, + testIntrinsic, +}; + +/** + * Gets the global intrinsic property names in a locked down environemnt. + * + * @returns {Set} All global intrinsic property names. + */ +function getGlobalProperties() { + // These are Agoric inventions, and we don't care about them. + const ignoreList = new Set([ + 'Compartment', + 'HandledPromise', + 'StaticModuleRecord', + ]); + + const namedIntrinsics = Reflect.ownKeys(new Compartment().globalThis); + + return new Set( + [ + // Added to global scope by ses/dist/lockdown.cjs. + ...namedIntrinsics, + + // TODO: Also include the named platform globals + // This grabs every enumerable property on globalThis. + // ...Object.keys(globalThis), + ].filter((propertyName) => !ignoreList.has(propertyName)), + ); +} + +/** + * Performs a number of assertions on the specified intrinsic property to + * ensure that the environment is locked down properly. + * Throws if any assertion fails. + * + * @param {string} propertyName - The name of the intrinsic property to test. + */ +function testIntrinsic(propertyName) { + const descriptor = Reflect.getOwnPropertyDescriptor(globalThis, propertyName); + + assert.ok( + descriptor, + `globalThis["${propertyName}"] should have a descriptor`, + ); + + // As long as Object.isFrozen is the true Object.isFrozen, the object + // it is called with cannot lie about being frozen. + const value = globalThis[propertyName]; + if (value !== globalThis) { + assert.equal( + Object.isFrozen(value), + true, + `value of universal property globalThis["${propertyName}"] should be frozen`, + ); + } + + // The writability of properties with accessors cannot be modified. + if ('set' in descriptor || 'get' in descriptor) { + assert.equal( + descriptor.configurable, + false, + `globalThis["${propertyName}"] should be non-configurable`, + ); + } else { + assert.equal( + descriptor.configurable, + false, + `globalThis["${propertyName}"] should be non-configurable`, + ); + + assert.equal( + descriptor.writable, + false, + `globalThis["${propertyName}"] should be non-writable`, + ); + } +} diff --git a/test/unit-global/protect-intrinsics.test.js b/test/unit-global/protect-intrinsics.test.js index 3958d7762..c3cd02a29 100644 --- a/test/unit-global/protect-intrinsics.test.js +++ b/test/unit-global/protect-intrinsics.test.js @@ -1,72 +1,15 @@ import 'ses/lockdown'; import '../../app/scripts/lockdown-run'; import '../../app/scripts/lockdown-more'; -import { strict as assert } from 'assert'; - -// These are Agoric inventions, and we don't care about them. -const ignoreList = new Set([ - 'Compartment', - 'HandledPromise', - 'StaticModuleRecord', -]); +import { + getGlobalProperties, + testIntrinsic, +} from '../helpers/protect-intrinsics-helpers'; describe('non-modifiable intrinsics', function () { - const namedIntrinsics = Reflect.ownKeys(new Compartment().globalThis); - - const globalProperties = new Set( - [ - // Added to global scope by ses/dist/lockdown.cjs. - ...namedIntrinsics, - - // TODO: Also include the named platform globals - // This grabs every enumerable property on globalThis. - // ...Object.keys(globalThis), - ].filter((propertyName) => !ignoreList.has(propertyName)), - ); - - globalProperties.forEach((propertyName) => { + getGlobalProperties().forEach((propertyName) => { it(`intrinsic globalThis["${propertyName}"]`, function () { - const descriptor = Reflect.getOwnPropertyDescriptor( - globalThis, - propertyName, - ); - - assert.ok( - descriptor, - `globalThis["${propertyName}"] should have a descriptor`, - ); - - // As long as Object.isFrozen is the true Object.isFrozen, the object - // it is called with cannot lie about being frozen. - const value = globalThis[propertyName]; - if (value !== globalThis) { - assert.equal( - Object.isFrozen(value), - true, - `value of universal property globalThis["${propertyName}"] should be frozen`, - ); - } - - // The writability of properties with accessors cannot be modified. - if ('set' in descriptor || 'get' in descriptor) { - assert.equal( - descriptor.configurable, - false, - `globalThis["${propertyName}"] should be non-configurable`, - ); - } else { - assert.equal( - descriptor.configurable, - false, - `globalThis["${propertyName}"] should be non-configurable`, - ); - - assert.equal( - descriptor.writable, - false, - `globalThis["${propertyName}"] should be non-writable`, - ); - } + testIntrinsic(propertyName); }); }); }); From 64e45c801de9dbe526dce6a583cdc1cb3f5461c0 Mon Sep 17 00:00:00 2001 From: VSaric <92527393+VSaric@users.noreply.github.com> Date: Wed, 3 Nov 2021 16:13:31 +0100 Subject: [PATCH 40/97] Warn the user of insufficient funds when approving a token (#12496) * Warn the user of insufficient funds (ETH for gas) when approving a token * Fixing code lines while run yarn lint:fix * Fixing test-e2e-chrome * Fixing e2e tests * Create shouldDisplayWarning variable --- .../confirm-page-container.component.js | 9 +++++++++ .../confirm-approve/confirm-approve-content/index.scss | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/ui/components/app/confirm-page-container/confirm-page-container.component.js b/ui/components/app/confirm-page-container/confirm-page-container.component.js index 397fc7ff0..dff2cc5aa 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container.component.js @@ -4,6 +4,7 @@ import SenderToRecipient from '../../ui/sender-to-recipient'; import { PageContainerFooter } from '../../ui/page-container'; import EditGasPopover from '../edit-gas-popover'; import { EDIT_GAS_MODES } from '../../../../shared/constants/gas'; +import ErrorMessage from '../../ui/error-message'; import Dialog from '../../ui/dialog'; import { ConfirmPageContainerHeader, @@ -124,6 +125,9 @@ export default class ConfirmPageContainer extends Component { const showAddToAddressDialog = !contact.name && toAddress && !isOwnedAccount && !hideSenderToRecipient; + const shouldDisplayWarning = + contentComponent && disabled && (errorKey || errorMessage); + return (
)} + {shouldDisplayWarning && ( +
+ +
+ )} {contentComponent && ( Date: Wed, 3 Nov 2021 16:26:25 +0100 Subject: [PATCH 41/97] Fix/ux papercuts transaction details issue #12295 (#12401) * transaction details - update ui * update lint scss * update sender & recipient name ui --- .../transaction-list-item-details/index.scss | 7 +------ .../transaction-list-item-details.component.js | 4 ++-- ui/components/ui/popover/index.scss | 2 +- .../ui/sender-to-recipient/index.scss | 18 ++++++++++-------- .../sender-to-recipient.component.js | 5 +---- 5 files changed, 15 insertions(+), 21 deletions(-) diff --git a/ui/components/app/transaction-list-item-details/index.scss b/ui/components/app/transaction-list-item-details/index.scss index 27a64f2e9..a0f95f470 100644 --- a/ui/components/app/transaction-list-item-details/index.scss +++ b/ui/components/app/transaction-list-item-details/index.scss @@ -6,11 +6,6 @@ align-items: center; } - &__body { - background: #fafbfc; - padding: 8px 16px; - } - &__header-buttons { display: flex; flex-direction: row; @@ -41,6 +36,7 @@ &__cards-container { display: flex; flex-direction: column; + padding: 8px 16px; } &__transaction-breakdown { @@ -53,6 +49,5 @@ &__transaction-activity-log { flex: 2; min-width: 0; - padding-left: 12px; } } diff --git a/ui/components/app/transaction-list-item-details/transaction-list-item-details.component.js b/ui/components/app/transaction-list-item-details/transaction-list-item-details.component.js index a940cfcaa..335859aa3 100644 --- a/ui/components/app/transaction-list-item-details/transaction-list-item-details.component.js +++ b/ui/components/app/transaction-list-item-details/transaction-list-item-details.component.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import copyToClipboard from 'copy-to-clipboard'; import { getBlockExplorerLink } from '@metamask/etherscan-link'; import SenderToRecipient from '../../ui/sender-to-recipient'; -import { FLAT_VARIANT } from '../../ui/sender-to-recipient/sender-to-recipient.constants'; +import { DEFAULT_VARIANT } from '../../ui/sender-to-recipient/sender-to-recipient.constants'; import TransactionActivityLog from '../transaction-activity-log'; import TransactionBreakdown from '../transaction-breakdown'; import Button from '../../ui/button'; @@ -215,7 +215,7 @@ export default class TransactionListItemDetails extends PureComponent {
{addressOnly ? ( - {`${t('from')}: ${ - senderName || shortenAddress(checksummedSenderAddress) - }`} + {`${senderName || shortenAddress(checksummedSenderAddress)}`} ) : ( senderName @@ -144,7 +142,6 @@ function RecipientWithAddress({ onHidden={() => setAddressCopied(false)} >
- {addressOnly ? `${t('to')}: ` : ''} {addressOnly ? recipientNickname || recipientEns || From 401c8ee7b279689ed525162ef40b2493a8cb8231 Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Wed, 3 Nov 2021 13:53:13 -0230 Subject: [PATCH 42/97] Ensure ledger transport preference is set on import (#12557) --- app/scripts/metamask-controller.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index e0813fcff..2010ce69f 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -1317,6 +1317,13 @@ export default class MetamaskController extends EventEmitter { accounts = await keyringController.getAccounts(); } + // This must be set as soon as possible to communicate to the + // keyring's iframe and have the setting initialized properly + // Optimistically called to not block Metamask login due to + // Ledger Keyring GitHub downtime + const transportPreference = this.preferencesController.getLedgerTransportPreference(); + this.setLedgerTransportPreference(transportPreference); + // set new identities this.preferencesController.setAddresses(accounts); this.selectFirstIdentity(); From 96f9f89911e4bf42c12f74356677a8231db687b4 Mon Sep 17 00:00:00 2001 From: ryanml Date: Wed, 3 Nov 2021 10:06:03 -0700 Subject: [PATCH 43/97] Revert "Revert "Connect Ledger via WebHID (#12411)"" This reverts commit 1c011b66aa2935045be45c491e8692d68220da39. --- app/_locales/en/messages.json | 54 +++++-- app/_locales/es/messages.json | 6 - app/_locales/es_419/messages.json | 6 - app/_locales/hi/messages.json | 6 - app/_locales/id/messages.json | 6 - app/_locales/ja/messages.json | 6 - app/_locales/ko/messages.json | 6 - app/_locales/ph/messages.json | 6 - app/_locales/pt_BR/messages.json | 6 - app/_locales/ru/messages.json | 6 - app/_locales/vi/messages.json | 6 - app/scripts/controllers/preferences.js | 25 +-- app/scripts/metamask-controller.js | 23 +-- app/scripts/migrations/066.js | 37 +++++ app/scripts/migrations/066.test.js | 116 +++++++++++++ app/scripts/migrations/index.js | 2 + app/scripts/platforms/extension.js | 11 +- package.json | 2 +- shared/constants/hardware-wallets.js | 17 ++ .../app/ledger-instruction-field/index.js | 1 + .../ledger-instruction-field.js | 153 ++++++++++++++++++ .../signature-request-original.component.js | 10 ++ .../signature-request-original.container.js | 16 +- .../signature-request-footer.component.js | 5 +- .../signature-request.component.js | 17 +- .../signature-request.container.js | 28 +++- ui/ducks/app/app.js | 16 ++ ui/ducks/metamask/metamask.js | 60 ++++++- .../confirm-approve-content.component.js | 13 ++ .../confirm-approve-content/index.scss | 5 + ui/pages/confirm-approve/confirm-approve.js | 17 +- .../confirm-transaction-base.component.js | 60 ++----- .../confirm-transaction-base.container.js | 30 ++-- .../create-account/connect-hardware/index.js | 17 +- .../connect-hardware/select-hardware.js | 5 +- .../select-hardware.stories.js | 5 +- .../advanced-tab/advanced-tab.component.js | 81 ++++++++-- .../advanced-tab.component.test.js | 5 +- .../advanced-tab/advanced-tab.container.js | 8 +- ui/pages/settings/index.scss | 7 + ui/selectors/selectors.js | 33 ++-- ui/store/actionConstants.js | 4 + ui/store/actions.js | 26 ++- yarn.lock | 8 +- 44 files changed, 768 insertions(+), 209 deletions(-) create mode 100644 app/scripts/migrations/066.js create mode 100644 app/scripts/migrations/066.test.js create mode 100644 ui/components/app/ledger-instruction-field/index.js create mode 100644 ui/components/app/ledger-instruction-field/ledger-instruction-field.js diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 50c923b3f..cbc845506 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -345,6 +345,10 @@ "chromeRequiredForHardwareWallets": { "message": "You need to use MetaMask on Google Chrome in order to connect to your Hardware Wallet." }, + "clickToConnectLedgerViaWebHID": { + "message": "Click here to connect your Ledger via WebHID", + "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" + }, "clickToRevealSeed": { "message": "Click here to reveal secret words" }, @@ -1251,36 +1255,42 @@ "ledgerAccountRestriction": { "message": "You need to make use your last account before you can add a new one." }, - "ledgerLiveAdvancedSetting": { - "message": "Use Ledger Live" - }, - "ledgerLiveAdvancedSettingDescription": { - "message": "The new Ledger Live bridge allows you to more easily use your Ledger. Only available in Chrome." - }, - "ledgerLiveApp": { - "message": "Ledger Live App" - }, - "ledgerLiveDialogHeader": { + "ledgerConnectionInstructionHeader": { "message": "Prior to clicking confirm:" }, - "ledgerLiveDialogStepFour": { + "ledgerConnectionInstructionStepFour": { "message": "Enable \"smart contract data\" or \"blind signing\" on your Ledger device" }, - "ledgerLiveDialogStepOne": { + "ledgerConnectionInstructionStepOne": { "message": "Enable Use Ledger Live under Settings > Advanced" }, - "ledgerLiveDialogStepThree": { + "ledgerConnectionInstructionStepThree": { "message": "Plug in your Ledger device and select the Ethereum app" }, - "ledgerLiveDialogStepTwo": { + "ledgerConnectionInstructionStepTwo": { "message": "Open and unlock Ledger Live App" }, + "ledgerConnectionPreferenceDescription": { + "message": "Customize how you connect your Ledger to MetaMask. $1 is recommended, but other options are available. Read more here: $2", + "description": "A description that appears above a dropdown where users can select between up to three options - Ledger Live, U2F or WebHID - depending on what is supported in their browser. $1 is the recommended browser option, it will be either WebHID or U2f. $2 is a link to an article where users can learn more, but will be the translation of the learnMore message." + }, + "ledgerLive": { + "message": "Ledger Live", + "description": "The name of a desktop app that can be used with your ledger device. We can also use it to connect a users Ledger device to MetaMask." + }, + "ledgerLiveApp": { + "message": "Ledger Live App" + }, "ledgerLocked": { "message": "Cannot connect to Ledger device. Please make sure your device is unlocked and Ethereum app is opened." }, "ledgerTimeout": { "message": "Ledger Live is taking too long to respond or connection timeout. Make sure Ledger Live app is opened and your device is unlocked." }, + "ledgerWebHIDNotConnectedErrorMessage": { + "message": "The ledger device was not connected. If you wish to connect your Ledger, please click 'Continue' again and approve HID connection", + "description": "An error message shown to the user during the hardware connect flow." + }, "letsGoSetUp": { "message": "Yes, let’s get set up!" }, @@ -1710,6 +1720,10 @@ "onlyConnectTrust": { "message": "Only connect with sites you trust." }, + "openFullScreenForLedgerWebHid": { + "message": "Open MetaMask in full screen to connect your ledger via WebHID.", + "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." + }, "optional": { "message": "Optional" }, @@ -1772,6 +1786,10 @@ "message": "+ $1 more", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, + "preferredLedgerConnectionType": { + "message": "Preferred Ledger Connection Type", + "description": "A header for a dropdown in the advanced section of settings. Appears above the ledgerConnectionPreferenceDescription message" + }, "prev": { "message": "Prev" }, @@ -2817,6 +2835,10 @@ "typePassword": { "message": "Type your MetaMask password" }, + "u2f": { + "message": "U2F", + "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." + }, "unapproved": { "message": "Unapproved" }, @@ -2958,6 +2980,10 @@ "message": "We noticed that the current website tried to use the removed window.web3 API. If the site appears to be broken, please click $1 for more information.", "description": "$1 is a clickable link." }, + "webhid": { + "message": "WebHID", + "description": "Refers to a interface for connecting external devices to the browser. Used for connecting ledger to the browser. Read more here https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API" + }, "welcome": { "message": "Welcome to MetaMask" }, diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index f98631f54..63d07557d 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -1004,12 +1004,6 @@ "ledgerAccountRestriction": { "message": "Debe usar su última cuenta antes de poder agregar una nueva." }, - "ledgerLiveAdvancedSetting": { - "message": "Utilizar Ledger Live" - }, - "ledgerLiveAdvancedSettingDescription": { - "message": "El nuevo puente Ledger Live le permite utilizar su Ledger de forma más sencilla. Disponible solo en Google Chrome." - }, "ledgerLiveApp": { "message": "Aplicación de Ledger Live" }, diff --git a/app/_locales/es_419/messages.json b/app/_locales/es_419/messages.json index f98631f54..63d07557d 100644 --- a/app/_locales/es_419/messages.json +++ b/app/_locales/es_419/messages.json @@ -1004,12 +1004,6 @@ "ledgerAccountRestriction": { "message": "Debe usar su última cuenta antes de poder agregar una nueva." }, - "ledgerLiveAdvancedSetting": { - "message": "Utilizar Ledger Live" - }, - "ledgerLiveAdvancedSettingDescription": { - "message": "El nuevo puente Ledger Live le permite utilizar su Ledger de forma más sencilla. Disponible solo en Google Chrome." - }, "ledgerLiveApp": { "message": "Aplicación de Ledger Live" }, diff --git a/app/_locales/hi/messages.json b/app/_locales/hi/messages.json index 18147a08b..217bdeca4 100644 --- a/app/_locales/hi/messages.json +++ b/app/_locales/hi/messages.json @@ -1004,12 +1004,6 @@ "ledgerAccountRestriction": { "message": "नया खाता जोड़ने से पहले आपको अपने अंतिम खाते का उपयोग करना होगा।" }, - "ledgerLiveAdvancedSetting": { - "message": "Ledger Live का उपयोग करें" - }, - "ledgerLiveAdvancedSettingDescription": { - "message": "नया Ledger Live ब्रिज आपको अपने लेजर का अधिक आसानी से उपयोग करने की अनुमति देता है। केवल Chrome में उपलब्ध है।" - }, "ledgerLiveApp": { "message": "Ledger Live ऐप" }, diff --git a/app/_locales/id/messages.json b/app/_locales/id/messages.json index 529c98ed1..915ebf125 100644 --- a/app/_locales/id/messages.json +++ b/app/_locales/id/messages.json @@ -1004,12 +1004,6 @@ "ledgerAccountRestriction": { "message": "Anda perlu memanfaatkan akun terakhir Anda sebelum menambahkan yang baru." }, - "ledgerLiveAdvancedSetting": { - "message": "Gunakan Ledger Live" - }, - "ledgerLiveAdvancedSettingDescription": { - "message": "Jembatan Ledger Live baru memungkinkan Anda untuk menggunakan Ledger Anda dengan lebih mudah. Hanya tersedia di Chrome." - }, "ledgerLiveApp": { "message": "Aplikasi Ledger Live" }, diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json index f9e1d125a..a3af48c46 100644 --- a/app/_locales/ja/messages.json +++ b/app/_locales/ja/messages.json @@ -1004,12 +1004,6 @@ "ledgerAccountRestriction": { "message": "新しいアカウントを追加するには、その前に最後のアカウントを使用する必要があります。" }, - "ledgerLiveAdvancedSetting": { - "message": "レジャー ライブを使用" - }, - "ledgerLiveAdvancedSettingDescription": { - "message": "新しいレジャー ライブのブリッジを使用すると、レジャーをより簡単に使用できます。Chrome でのみ利用可能。" - }, "ledgerLiveApp": { "message": "レジャー ライブのアプリ" }, diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index 96ad9f3fa..9ba61d76e 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -1004,12 +1004,6 @@ "ledgerAccountRestriction": { "message": "새 계정을 추가하려면 먼저 마지막 계정을 사용해야 합니다." }, - "ledgerLiveAdvancedSetting": { - "message": "Ledger Live 사용하기" - }, - "ledgerLiveAdvancedSettingDescription": { - "message": "새로운 Ledger Live 브리지를 통해 Ledger를 더 쉽게 사용할 수 있습니다. Chrome에서만 사용 가능합니다." - }, "ledgerLiveApp": { "message": "Ledger Live 앱" }, diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json index d42c1aa80..c7d40dd55 100644 --- a/app/_locales/ph/messages.json +++ b/app/_locales/ph/messages.json @@ -1004,12 +1004,6 @@ "ledgerAccountRestriction": { "message": "Kailangan mong gamitin ang huli mong account bago ka magdagdag ng panibago." }, - "ledgerLiveAdvancedSetting": { - "message": "Gamitin ang Ledger Live" - }, - "ledgerLiveAdvancedSettingDescription": { - "message": "Binibigyang-daan ka ng bagong Ledger Live bridge na mas madaling magamit ang iyong Ledger. Available lang sa Chrome." - }, "ledgerLiveApp": { "message": "Ledger Live App" }, diff --git a/app/_locales/pt_BR/messages.json b/app/_locales/pt_BR/messages.json index 9e326c99f..40bde73d3 100644 --- a/app/_locales/pt_BR/messages.json +++ b/app/_locales/pt_BR/messages.json @@ -1004,12 +1004,6 @@ "ledgerAccountRestriction": { "message": "Você precisa usar sua última conta antes de adicionar uma nova." }, - "ledgerLiveAdvancedSetting": { - "message": "Usar Ledger Live" - }, - "ledgerLiveAdvancedSettingDescription": { - "message": "A nova ponte do Ledger Live permite utilizar seu Ledger mais facilmente. Disponível somente no Chrome." - }, "ledgerLiveApp": { "message": "Aplicativo Ledger Live" }, diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json index 054f5e100..881ee1042 100644 --- a/app/_locales/ru/messages.json +++ b/app/_locales/ru/messages.json @@ -1004,12 +1004,6 @@ "ledgerAccountRestriction": { "message": "Вам необходимо использовать свой последний счет, прежде чем вы сможете добавить новый." }, - "ledgerLiveAdvancedSetting": { - "message": "Использовать Ledger Live" - }, - "ledgerLiveAdvancedSettingDescription": { - "message": "Новое решение Ledger Live Bridge упрощает использование Ledger. Доступно только в Chrome." - }, "ledgerLiveApp": { "message": "Приложение Ledger Live" }, diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json index 56ed93266..a1f78fa6d 100644 --- a/app/_locales/vi/messages.json +++ b/app/_locales/vi/messages.json @@ -1004,12 +1004,6 @@ "ledgerAccountRestriction": { "message": "Bạn cần sử dụng tài khoản gần đây nhất thì mới có thể thêm một tài khoản mới." }, - "ledgerLiveAdvancedSetting": { - "message": "Dùng Ledger Live" - }, - "ledgerLiveAdvancedSettingDescription": { - "message": "Cầu Ledger Live mới cho phép bạn dùng Ledger dễ dàng hơn. Chỉ có trong Chrome." - }, "ledgerLiveApp": { "message": "Ứng dụng Ledger Live" }, diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index 7f5d59ba6..41630cce3 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -5,6 +5,7 @@ import { ethers } from 'ethers'; import log from 'loglevel'; import { NETWORK_TYPE_TO_ID_MAP } from '../../../shared/constants/network'; import { isPrefixedFormattedHexString } from '../../../shared/modules/network.utils'; +import { LEDGER_TRANSPORT_TYPES } from '../../../shared/constants/hardware-wallets'; import { NETWORK_EVENTS } from './network'; export default class PreferencesController { @@ -58,7 +59,9 @@ export default class PreferencesController { // ENS decentralized website resolution ipfsGateway: 'dweb.link', infuraBlocked: null, - useLedgerLive: false, + ledgerTransportType: window.navigator.hid + ? LEDGER_TRANSPORT_TYPES.WEBHID + : LEDGER_TRANSPORT_TYPES.U2F, ...opts.initState, }; @@ -516,21 +519,21 @@ export default class PreferencesController { } /** - * A setter for the `useLedgerLive` property - * @param {bool} useLedgerLive - Value for ledger live support - * @returns {Promise} A promise of the update to useLedgerLive + * A setter for the `useWebHid` property + * @param {string} ledgerTransportType - Either 'ledgerLive', 'webhid' or 'u2f' + * @returns {string} The transport type that was set. */ - async setLedgerLivePreference(useLedgerLive) { - this.store.updateState({ useLedgerLive }); - return useLedgerLive; + setLedgerTransportPreference(ledgerTransportType) { + this.store.updateState({ ledgerTransportType }); + return ledgerTransportType; } /** - * A getter for the `useLedgerLive` property - * @returns {boolean} User preference of using Ledger Live + * A getter for the `ledgerTransportType` property + * @returns {boolean} User preference of using WebHid to connect Ledger */ - getLedgerLivePreference() { - return this.store.getState().useLedgerLive; + getLedgerTransportPreference() { + return this.store.getState().ledgerTransportType; } /** diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index f28c16bf3..e0813fcff 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -841,7 +841,10 @@ export default class MetamaskController extends EventEmitter { this.unlockHardwareWalletAccount, this, ), - setLedgerLivePreference: nodeify(this.setLedgerLivePreference, this), + setLedgerTransportPreference: nodeify( + this.setLedgerTransportPreference, + this, + ), // mobile fetchInfoToSync: nodeify(this.fetchInfoToSync, this), @@ -1480,9 +1483,9 @@ export default class MetamaskController extends EventEmitter { // keyring's iframe and have the setting initialized properly // Optimistically called to not block Metamask login due to // Ledger Keyring GitHub downtime - this.setLedgerLivePreference( - this.preferencesController.getLedgerLivePreference(), - ); + const transportPreference = this.preferencesController.getLedgerTransportPreference(); + + this.setLedgerTransportPreference(transportPreference); return this.keyringController.fullUpdate(); } @@ -2984,16 +2987,18 @@ export default class MetamaskController extends EventEmitter { * Sets the Ledger Live preference to use for Ledger hardware wallet support * @param {bool} bool - the value representing if the users wants to use Ledger Live */ - async setLedgerLivePreference(bool) { - const currentValue = this.preferencesController.getLedgerLivePreference(); - this.preferencesController.setLedgerLivePreference(bool); + async setLedgerTransportPreference(transportType) { + const currentValue = this.preferencesController.getLedgerTransportPreference(); + const newValue = this.preferencesController.setLedgerTransportPreference( + transportType, + ); const keyring = await this.getKeyringForDevice('ledger'); if (keyring?.updateTransportMethod) { - return keyring.updateTransportMethod(bool).catch((e) => { + return keyring.updateTransportMethod(newValue).catch((e) => { // If there was an error updating the transport, we should // fall back to the original value - this.preferencesController.setLedgerLivePreference(currentValue); + this.preferencesController.setLedgerTransportPreference(currentValue); throw e; }); } diff --git a/app/scripts/migrations/066.js b/app/scripts/migrations/066.js new file mode 100644 index 000000000..31c109ba7 --- /dev/null +++ b/app/scripts/migrations/066.js @@ -0,0 +1,37 @@ +import { cloneDeep } from 'lodash'; +import { LEDGER_TRANSPORT_TYPES } from '../../../shared/constants/hardware-wallets'; + +const version = 66; + +/** + * Changes the useLedgerLive boolean property to the ledgerTransportType enum + */ +export default { + version, + async migrate(originalVersionedData) { + const versionedData = cloneDeep(originalVersionedData); + versionedData.meta.version = version; + const state = versionedData.data; + const newState = transformState(state); + versionedData.data = newState; + return versionedData; + }, +}; + +function transformState(state) { + const defaultTransportType = window.navigator.hid + ? LEDGER_TRANSPORT_TYPES.WEBHID + : LEDGER_TRANSPORT_TYPES.U2F; + const useLedgerLive = Boolean(state.PreferencesController?.useLedgerLive); + const newState = { + ...state, + PreferencesController: { + ...state?.PreferencesController, + ledgerTransportType: useLedgerLive + ? LEDGER_TRANSPORT_TYPES.LIVE + : defaultTransportType, + }, + }; + delete newState.PreferencesController.useLedgerLive; + return newState; +} diff --git a/app/scripts/migrations/066.test.js b/app/scripts/migrations/066.test.js new file mode 100644 index 000000000..24af0ba45 --- /dev/null +++ b/app/scripts/migrations/066.test.js @@ -0,0 +1,116 @@ +import { LEDGER_TRANSPORT_TYPES } from '../../../shared/constants/hardware-wallets'; +import migration66 from './066'; + +describe('migration #66', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('should update the version metadata', async () => { + const oldStorage = { + meta: { + version: 65, + }, + data: {}, + }; + + const newStorage = await migration66.migrate(oldStorage); + expect(newStorage.meta).toStrictEqual({ + version: 66, + }); + }); + + it('should set ledgerTransportType to `u2f` if no preferences controller exists and webhid is not available', async () => { + const oldStorage = { + meta: {}, + data: {}, + }; + + const newStorage = await migration66.migrate(oldStorage); + expect( + newStorage.data.PreferencesController.ledgerTransportType, + ).toStrictEqual(LEDGER_TRANSPORT_TYPES.U2F); + }); + + it('should set ledgerTransportType to `u2f` if no useLedgerLive property exists and webhid is not available', async () => { + const oldStorage = { + meta: {}, + data: { + PreferencesController: {}, + }, + }; + + const newStorage = await migration66.migrate(oldStorage); + expect( + newStorage.data.PreferencesController.ledgerTransportType, + ).toStrictEqual(LEDGER_TRANSPORT_TYPES.U2F); + }); + + it('should set ledgerTransportType to `u2f` if useLedgerLive is false and webhid is not available', async () => { + const oldStorage = { + meta: {}, + data: { + PreferencesController: { + useLedgerLive: false, + }, + }, + }; + + const newStorage = await migration66.migrate(oldStorage); + expect( + newStorage.data.PreferencesController.ledgerTransportType, + ).toStrictEqual(LEDGER_TRANSPORT_TYPES.U2F); + }); + + it('should set ledgerTransportType to `webhid` if useLedgerLive is false and webhid is available', async () => { + const oldStorage = { + meta: {}, + data: { + PreferencesController: { + useLedgerLive: false, + }, + }, + }; + jest + .spyOn(window, 'navigator', 'get') + .mockImplementation(() => ({ hid: true })); + const newStorage = await migration66.migrate(oldStorage); + expect( + newStorage.data.PreferencesController.ledgerTransportType, + ).toStrictEqual(LEDGER_TRANSPORT_TYPES.WEBHID); + }); + + it('should set ledgerTransportType to `ledgerLive` if useLedgerLive is true', async () => { + const oldStorage = { + meta: {}, + data: { + PreferencesController: { + useLedgerLive: true, + }, + }, + }; + + const newStorage = await migration66.migrate(oldStorage); + expect( + newStorage.data.PreferencesController.ledgerTransportType, + ).toStrictEqual('ledgerLive'); + }); + + it('should not change ledgerTransportType if useLedgerLive is true and webhid is available', async () => { + const oldStorage = { + meta: {}, + data: { + PreferencesController: { + useLedgerLive: true, + }, + }, + }; + jest + .spyOn(window, 'navigator', 'get') + .mockImplementation(() => ({ hid: true })); + const newStorage = await migration66.migrate(oldStorage); + expect( + newStorage.data.PreferencesController.ledgerTransportType, + ).toStrictEqual(LEDGER_TRANSPORT_TYPES.LIVE); + }); +}); diff --git a/app/scripts/migrations/index.js b/app/scripts/migrations/index.js index 6ca02a881..7baf840e3 100644 --- a/app/scripts/migrations/index.js +++ b/app/scripts/migrations/index.js @@ -69,6 +69,7 @@ import m062 from './062'; import m063 from './063'; import m064 from './064'; import m065 from './065'; +import m066 from './066'; const migrations = [ m002, @@ -135,6 +136,7 @@ const migrations = [ m063, m064, m065, + m066, ]; export default migrations; diff --git a/app/scripts/platforms/extension.js b/app/scripts/platforms/extension.js index 145e04c88..eeaea008d 100644 --- a/app/scripts/platforms/extension.js +++ b/app/scripts/platforms/extension.js @@ -111,7 +111,11 @@ export default class ExtensionPlatform { return version; } - openExtensionInBrowser(route = null, queryString = null) { + openExtensionInBrowser( + route = null, + queryString = null, + keepWindowOpen = false, + ) { let extensionURL = extension.runtime.getURL('home.html'); if (queryString) { @@ -122,7 +126,10 @@ export default class ExtensionPlatform { extensionURL += `#${route}`; } this.openTab({ url: extensionURL }); - if (getEnvironmentType() !== ENVIRONMENT_TYPE_BACKGROUND) { + if ( + getEnvironmentType() !== ENVIRONMENT_TYPE_BACKGROUND && + !keepWindowOpen + ) { window.close(); } } diff --git a/package.json b/package.json index 9059f6338..92d3e5002 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@material-ui/core": "^4.11.0", "@metamask/contract-metadata": "^1.28.0", "@metamask/controllers": "^17.0.0", - "@metamask/eth-ledger-bridge-keyring": "^0.7.0", + "@metamask/eth-ledger-bridge-keyring": "^0.9.0", "@metamask/eth-token-tracker": "^3.0.1", "@metamask/etherscan-link": "^2.1.0", "@metamask/jazzicon": "^2.0.0", diff --git a/shared/constants/hardware-wallets.js b/shared/constants/hardware-wallets.js index 880efb5b2..e780555fc 100644 --- a/shared/constants/hardware-wallets.js +++ b/shared/constants/hardware-wallets.js @@ -7,3 +7,20 @@ export const KEYRING_TYPES = { LEDGER: 'Ledger Hardware', TREZOR: 'Trezor Hardware', }; + +/** + * Used for setting the users preference for ledger transport type + */ +export const LEDGER_TRANSPORT_TYPES = { + LIVE: 'ledgerLive', + WEBHID: 'webhid', + U2F: 'u2f', +}; + +export const LEDGER_USB_VENDOR_ID = '0x2c97'; + +export const WEBHID_CONNECTED_STATUSES = { + CONNECTED: 'connected', + NOT_CONNECTED: 'notConnected', + UNKNOWN: 'unknown', +}; diff --git a/ui/components/app/ledger-instruction-field/index.js b/ui/components/app/ledger-instruction-field/index.js new file mode 100644 index 000000000..a4ae8131f --- /dev/null +++ b/ui/components/app/ledger-instruction-field/index.js @@ -0,0 +1 @@ +export { default } from './ledger-instruction-field'; diff --git a/ui/components/app/ledger-instruction-field/ledger-instruction-field.js b/ui/components/app/ledger-instruction-field/ledger-instruction-field.js new file mode 100644 index 000000000..960b6ca07 --- /dev/null +++ b/ui/components/app/ledger-instruction-field/ledger-instruction-field.js @@ -0,0 +1,153 @@ +import React, { useEffect } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import PropTypes from 'prop-types'; +import { + LEDGER_TRANSPORT_TYPES, + LEDGER_USB_VENDOR_ID, + WEBHID_CONNECTED_STATUSES, +} from '../../../../shared/constants/hardware-wallets'; +import { + PLATFORM_FIREFOX, + ENVIRONMENT_TYPE_FULLSCREEN, +} from '../../../../shared/constants/app'; + +import { + setLedgerWebHidConnectedStatus, + getLedgerWebHidConnectedStatus, +} from '../../../ducks/app/app'; + +import Typography from '../../ui/typography/typography'; +import Button from '../../ui/button'; +import { useI18nContext } from '../../../hooks/useI18nContext'; +import { + COLORS, + FONT_WEIGHT, + TYPOGRAPHY, +} from '../../../helpers/constants/design-system'; +import Dialog from '../../ui/dialog'; +import { + getPlatform, + getEnvironmentType, +} from '../../../../app/scripts/lib/util'; +import { getLedgerTransportType } from '../../../ducks/metamask/metamask'; + +const renderInstructionStep = (text, show = true, color = COLORS.PRIMARY3) => { + return ( + show && ( + + {text} + + ) + ); +}; + +export default function LedgerInstructionField({ showDataInstruction }) { + const t = useI18nContext(); + const dispatch = useDispatch(); + + const webHidConnectedStatus = useSelector(getLedgerWebHidConnectedStatus); + const ledgerTransportType = useSelector(getLedgerTransportType); + const environmentType = getEnvironmentType(); + const environmentTypeIsFullScreen = + environmentType === ENVIRONMENT_TYPE_FULLSCREEN; + + useEffect(() => { + const initialConnectedDeviceCheck = async () => { + if ( + ledgerTransportType === LEDGER_TRANSPORT_TYPES.WEBHID && + webHidConnectedStatus !== WEBHID_CONNECTED_STATUSES.CONNECTED + ) { + const devices = await window.navigator.hid.getDevices(); + const webHidIsConnected = devices.some( + (device) => device.vendorId === Number(LEDGER_USB_VENDOR_ID), + ); + dispatch( + setLedgerWebHidConnectedStatus( + webHidIsConnected + ? WEBHID_CONNECTED_STATUSES.CONNECTED + : WEBHID_CONNECTED_STATUSES.NOT_CONNECTED, + ), + ); + } + }; + initialConnectedDeviceCheck(); + }, [dispatch, ledgerTransportType, webHidConnectedStatus]); + + const usingLedgerLive = ledgerTransportType === LEDGER_TRANSPORT_TYPES.LIVE; + const usingWebHID = ledgerTransportType === LEDGER_TRANSPORT_TYPES.WEBHID; + + const isFirefox = getPlatform() === PLATFORM_FIREFOX; + + return ( +
+
+ +
+ {renderInstructionStep(t('ledgerConnectionInstructionHeader'))} + {renderInstructionStep( + `- ${t('ledgerConnectionInstructionStepOne')}`, + !isFirefox && usingLedgerLive, + )} + {renderInstructionStep( + `- ${t('ledgerConnectionInstructionStepTwo')}`, + !isFirefox && usingLedgerLive, + )} + {renderInstructionStep( + `- ${t('ledgerConnectionInstructionStepThree')}`, + )} + {renderInstructionStep( + `- ${t('ledgerConnectionInstructionStepFour')}`, + showDataInstruction, + )} + {renderInstructionStep( + + + , + usingWebHID && + webHidConnectedStatus === + WEBHID_CONNECTED_STATUSES.NOT_CONNECTED, + COLORS.SECONDARY1, + )} +
+
+
+
+ ); +} + +LedgerInstructionField.propTypes = { + showDataInstruction: PropTypes.bool, +}; diff --git a/ui/components/app/signature-request-original/signature-request-original.component.js b/ui/components/app/signature-request-original/signature-request-original.component.js index ec3baf497..a8233fc98 100644 --- a/ui/components/app/signature-request-original/signature-request-original.component.js +++ b/ui/components/app/signature-request-original/signature-request-original.component.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { stripHexPrefix } from 'ethereumjs-util'; import classnames from 'classnames'; import { ObjectInspector } from 'react-inspector'; +import LedgerInstructionField from '../ledger-instruction-field'; import { ENVIRONMENT_TYPE_NOTIFICATION, @@ -36,6 +37,8 @@ export default class SignatureRequestOriginal extends Component { sign: PropTypes.func.isRequired, txData: PropTypes.object.isRequired, domainMetadata: PropTypes.object, + hardwareWalletRequiresConnection: PropTypes.bool, + isLedgerWallet: PropTypes.bool, }; state = { @@ -286,6 +289,7 @@ export default class SignatureRequestOriginal extends Component { mostRecentOverviewPage, sign, txData: { type }, + hardwareWalletRequiresConnection, } = this.props; const { metricsEvent, t } = this.context; @@ -319,6 +323,7 @@ export default class SignatureRequestOriginal extends Component { type="primary" large className="request-signature__footer__sign-button" + disabled={hardwareWalletRequiresConnection} onClick={async (event) => { this._removeBeforeUnload(); await sign(event); @@ -347,6 +352,11 @@ export default class SignatureRequestOriginal extends Component {
{this.renderHeader()} {this.renderBody()} + {this.props.isLedgerWallet ? ( +
+ +
+ ) : null} {this.renderFooter()}
); diff --git a/ui/components/app/signature-request-original/signature-request-original.container.js b/ui/components/app/signature-request-original/signature-request-original.container.js index f6181cc5b..82f313bd4 100644 --- a/ui/components/app/signature-request-original/signature-request-original.container.js +++ b/ui/components/app/signature-request-original/signature-request-original.container.js @@ -8,18 +8,32 @@ import { accountsWithSendEtherInfoSelector, conversionRateSelector, getDomainMetadata, + doesAddressRequireLedgerHidConnection, } from '../../../selectors'; import { getAccountByAddress } from '../../../helpers/utils/util'; import { clearConfirmTransaction } from '../../../ducks/confirm-transaction/confirm-transaction.duck'; import { getMostRecentOverviewPage } from '../../../ducks/history/history'; +import { isAddressLedger } from '../../../ducks/metamask/metamask'; import SignatureRequestOriginal from './signature-request-original.component'; -function mapStateToProps(state) { +function mapStateToProps(state, ownProps) { + const { + msgParams: { from }, + } = ownProps.txData; + + const hardwareWalletRequiresConnection = doesAddressRequireLedgerHidConnection( + state, + from, + ); + const isLedgerWallet = isAddressLedger(state, from); + return { requester: null, requesterAddress: null, conversionRate: conversionRateSelector(state), mostRecentOverviewPage: getMostRecentOverviewPage(state), + hardwareWalletRequiresConnection, + isLedgerWallet, // not passed to component allAccounts: accountsWithSendEtherInfoSelector(state), domainMetadata: getDomainMetadata(state), diff --git a/ui/components/app/signature-request/signature-request-footer/signature-request-footer.component.js b/ui/components/app/signature-request/signature-request-footer/signature-request-footer.component.js index 0ca254079..37df2a177 100644 --- a/ui/components/app/signature-request/signature-request-footer/signature-request-footer.component.js +++ b/ui/components/app/signature-request/signature-request-footer/signature-request-footer.component.js @@ -6,6 +6,7 @@ export default class SignatureRequestFooter extends PureComponent { static propTypes = { cancelAction: PropTypes.func.isRequired, signAction: PropTypes.func.isRequired, + disabled: PropTypes.boolean, }; static contextTypes = { @@ -13,13 +14,13 @@ export default class SignatureRequestFooter extends PureComponent { }; render() { - const { cancelAction, signAction } = this.props; + const { cancelAction, signAction, disabled = false } = this.props; return (
-
diff --git a/ui/components/app/signature-request/signature-request.component.js b/ui/components/app/signature-request/signature-request.component.js index 3f460b4c2..73d28ec26 100644 --- a/ui/components/app/signature-request/signature-request.component.js +++ b/ui/components/app/signature-request/signature-request.component.js @@ -2,6 +2,7 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import { getEnvironmentType } from '../../../../app/scripts/lib/util'; import Identicon from '../../ui/identicon'; +import LedgerInstructionField from '../ledger-instruction-field'; import Header from './signature-request-header'; import Footer from './signature-request-footer'; import Message from './signature-request-message'; @@ -15,10 +16,11 @@ export default class SignatureRequest extends PureComponent { balance: PropTypes.string, name: PropTypes.string, }).isRequired, - + isLedgerWallet: PropTypes.bool, clearConfirmTransaction: PropTypes.func.isRequired, cancel: PropTypes.func.isRequired, sign: PropTypes.func.isRequired, + hardwareWalletRequiresConnection: PropTypes.func.isRequired, }; static contextTypes = { @@ -69,6 +71,8 @@ export default class SignatureRequest extends PureComponent { }, cancel, sign, + isLedgerWallet, + hardwareWalletRequiresConnection, } = this.props; const { address: fromAddress } = fromAccount; const { message, domain = {} } = JSON.parse(data); @@ -128,8 +132,17 @@ export default class SignatureRequest extends PureComponent { {this.formatWallet(fromAddress)}
+ {isLedgerWallet ? ( +
+ +
+ ) : null} -
+
); } diff --git a/ui/components/app/signature-request/signature-request.container.js b/ui/components/app/signature-request/signature-request.container.js index 2d3546720..292bbbf73 100644 --- a/ui/components/app/signature-request/signature-request.container.js +++ b/ui/components/app/signature-request/signature-request.container.js @@ -1,12 +1,28 @@ import { connect } from 'react-redux'; import { clearConfirmTransaction } from '../../../ducks/confirm-transaction/confirm-transaction.duck'; -import { accountsWithSendEtherInfoSelector } from '../../../selectors'; +import { + accountsWithSendEtherInfoSelector, + doesAddressRequireLedgerHidConnection, +} from '../../../selectors'; +import { isAddressLedger } from '../../../ducks/metamask/metamask'; import { getAccountByAddress } from '../../../helpers/utils/util'; import { MESSAGE_TYPE } from '../../../../shared/constants/app'; import SignatureRequest from './signature-request.component'; -function mapStateToProps(state) { +function mapStateToProps(state, ownProps) { + const { txData } = ownProps; + const { + msgParams: { from }, + } = txData; + const hardwareWalletRequiresConnection = doesAddressRequireLedgerHidConnection( + state, + from, + ); + const isLedgerWallet = isAddressLedger(state, from); + return { + isLedgerWallet, + hardwareWalletRequiresConnection, // not forwarded to component allAccounts: accountsWithSendEtherInfoSelector(state), }; @@ -19,7 +35,11 @@ function mapDispatchToProps(dispatch) { } function mergeProps(stateProps, dispatchProps, ownProps) { - const { allAccounts } = stateProps; + const { + allAccounts, + isLedgerWallet, + hardwareWalletRequiresConnection, + } = stateProps; const { signPersonalMessage, signTypedMessage, @@ -58,6 +78,8 @@ function mergeProps(stateProps, dispatchProps, ownProps) { txData, cancel, sign, + isLedgerWallet, + hardwareWalletRequiresConnection, }; } diff --git a/ui/ducks/app/app.js b/ui/ducks/app/app.js index 15d32f32a..517b72471 100644 --- a/ui/ducks/app/app.js +++ b/ui/ducks/app/app.js @@ -1,3 +1,4 @@ +import { WEBHID_CONNECTED_STATUSES } from '../../../shared/constants/hardware-wallets'; import * as actionConstants from '../../store/actionConstants'; // actionConstants @@ -48,6 +49,7 @@ export default function reduceApp(state = {}, action) { testKey: null, }, gasLoadingAnimationIsShowing: false, + ledgerWebHidConnectedStatus: WEBHID_CONNECTED_STATUSES.UNKNOWN, ...state, }; @@ -340,6 +342,12 @@ export default function reduceApp(state = {}, action) { gasLoadingAnimationIsShowing: action.value, }; + case actionConstants.SET_WEBHID_CONNECTED_STATUS: + return { + ...appState, + ledgerWebHidConnectedStatus: action.value, + }; + default: return appState; } @@ -363,6 +371,10 @@ export function toggleGasLoadingAnimation(value) { return { type: actionConstants.TOGGLE_GAS_LOADING_ANIMATION, value }; } +export function setLedgerWebHidConnectedStatus(value) { + return { type: actionConstants.SET_WEBHID_CONNECTED_STATUS, value }; +} + // Selectors export function getQrCodeData(state) { return state.appState.qrCodeData; @@ -371,3 +383,7 @@ export function getQrCodeData(state) { export function getGasLoadingAnimationIsShowing(state) { return state.appState.gasLoadingAnimationIsShowing; } + +export function getLedgerWebHidConnectedStatus(state) { + return state.appState.ledgerWebHidConnectedStatus; +} diff --git a/ui/ducks/metamask/metamask.js b/ui/ducks/metamask/metamask.js index e1314d5c2..452acbd60 100644 --- a/ui/ducks/metamask/metamask.js +++ b/ui/ducks/metamask/metamask.js @@ -1,4 +1,4 @@ -import { addHexPrefix, isHexString } from 'ethereumjs-util'; +import { addHexPrefix, isHexString, stripHexPrefix } from 'ethereumjs-util'; import * as actionConstants from '../../store/actionConstants'; import { ALERT_TYPES } from '../../../shared/constants/alerts'; import { NETWORK_TYPE_RPC } from '../../../shared/constants/network'; @@ -10,7 +10,9 @@ import { import { updateTransaction } from '../../store/actions'; import { setCustomGasLimit, setCustomGasPrice } from '../gas/gas.duck'; import { decGWEIToHexWEI } from '../../helpers/utils/conversions.util'; +import { isEqualCaseInsensitive } from '../../helpers/utils/util'; import { GAS_ESTIMATE_TYPES } from '../../../shared/constants/gas'; +import { KEYRING_TYPES } from '../../../shared/constants/hardware-wallets'; export default function reduceMetamask(state = {}, action) { const metamaskState = { @@ -340,3 +342,59 @@ export function getIsUnlocked(state) { export function getSeedPhraseBackedUp(state) { return state.metamask.seedPhraseBackedUp; } + +/** + * Given the redux state object and an address, finds a keyring that contains that address, if one exists + * + * @param {Object} state - the redux state object + * @param {string} address - the address to search for among the keyring addresses + * @returns {Object|undefined} The keyring which contains the passed address, or undefined + */ +export function findKeyringForAddress(state, address) { + const keyring = state.metamask.keyrings.find((kr) => { + return kr.accounts.some((account) => { + return ( + isEqualCaseInsensitive(account, addHexPrefix(address)) || + isEqualCaseInsensitive(account, stripHexPrefix(address)) + ); + }); + }); + + return keyring; +} + +/** + * Given the redux state object, returns the users preferred ledger transport type + * + * @param {Object} state - the redux state object + * @returns {string} The users preferred ledger transport type. One of'ledgerLive', 'webhid' or 'u2f' + */ +export function getLedgerTransportType(state) { + return state.metamask.ledgerTransportType; +} + +/** + * Given the redux state object and an address, returns a boolean indicating whether the passed address is part of a Ledger keyring + * + * @param {Object} state - the redux state object + * @param {string} address - the address to search for among all keyring addresses + * @returns {boolean} true if the passed address is part of a ledger keyring, and false otherwise + */ +export function isAddressLedger(state, address) { + const keyring = findKeyringForAddress(state, address); + + return keyring?.type === KEYRING_TYPES.LEDGER; +} + +/** + * Given the redux state object, returns a boolean indicating whether the user has any Ledger accounts added to MetaMask (i.e. Ledger keyrings + * in state) + * + * @param {Object} state - the redux state object + * @returns {boolean} true if the user has a Ledger account and false otherwise + */ +export function doesUserHaveALedgerAccount(state) { + return state.metamask.keyrings.some((kr) => { + return kr.type === KEYRING_TYPES.LEDGER; + }); +} diff --git a/ui/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.js b/ui/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.js index d589eb4c6..40f8e13de 100644 --- a/ui/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.js +++ b/ui/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.js @@ -14,6 +14,7 @@ import { } from '../../../helpers/constants/design-system'; import Box from '../../../components/ui/box'; import Button from '../../../components/ui/button'; +import LedgerInstructionField from '../../../components/app/ledger-instruction-field'; export default class ConfirmApproveContent extends Component { static contextTypes = { @@ -44,6 +45,8 @@ export default class ConfirmApproveContent extends Component { nextNonce: PropTypes.number, showCustomizeNonceModal: PropTypes.func, warning: PropTypes.string, + txData: PropTypes.object, + ledgerWalletRequiredHidConnection: PropTypes.bool, }; state = { @@ -238,6 +241,8 @@ export default class ConfirmApproveContent extends Component { tokenBalance, useNonceField, warning, + txData, + ledgerWalletRequiredHidConnection, } = this.props; const { showFullTxDetails } = this.state; @@ -346,6 +351,14 @@ export default class ConfirmApproveContent extends Component { })}
+ {ledgerWalletRequiredHidConnection ? ( +
+ +
+ ) : null} + {showFullTxDetails ? (
diff --git a/ui/pages/confirm-approve/confirm-approve-content/index.scss b/ui/pages/confirm-approve/confirm-approve-content/index.scss index d005811af..b74a1350d 100644 --- a/ui/pages/confirm-approve/confirm-approve-content/index.scss +++ b/ui/pages/confirm-approve/confirm-approve-content/index.scss @@ -161,6 +161,11 @@ } } + &__ledger-instruction-wrapper { + padding-left: 10px; + padding-right: 10px; + } + &__transaction-details-content { display: flex; flex-flow: row; diff --git a/ui/pages/confirm-approve/confirm-approve.js b/ui/pages/confirm-approve/confirm-approve.js index 64b3cc5c2..32792e8ed 100644 --- a/ui/pages/confirm-approve/confirm-approve.js +++ b/ui/pages/confirm-approve/confirm-approve.js @@ -24,6 +24,7 @@ import { getUseNonceField, getCustomNonceValue, getNextSuggestedNonce, + doesAddressRequireLedgerHidConnection, } from '../../selectors'; import { useApproveTransaction } from '../../hooks/useApproveTransaction'; @@ -35,12 +36,18 @@ import { isEqualCaseInsensitive } from '../../helpers/utils/util'; import { getCustomTxParamsData } from './confirm-approve.util'; import ConfirmApproveContent from './confirm-approve-content'; +const doesAddressRequireLedgerHidConnectionByFromAddress = (address) => ( + state, +) => { + return doesAddressRequireLedgerHidConnection(state, address); +}; + export default function ConfirmApprove() { const dispatch = useDispatch(); const { id: paramsTransactionId } = useParams(); const { id: transactionId, - txParams: { to: tokenAddress, data } = {}, + txParams: { to: tokenAddress, data, from } = {}, } = useSelector(txDataSelector); const currentCurrency = useSelector(getCurrentCurrency); @@ -52,6 +59,10 @@ export default function ConfirmApprove() { const nextNonce = useSelector(getNextSuggestedNonce); const customNonceValue = useSelector(getCustomNonceValue); + const ledgerWalletRequiredHidConnection = useSelector( + doesAddressRequireLedgerHidConnectionByFromAddress(from), + ); + const transaction = currentNetworkTxList.find( ({ id }) => id === (Number(paramsTransactionId) || transactionId), @@ -207,6 +218,10 @@ export default function ConfirmApprove() { ) } warning={submitWarning} + txData={transaction} + ledgerWalletRequiredHidConnection={ + ledgerWalletRequiredHidConnection + } /> {showCustomizeGasPopover && ( ) : null; - const renderLedgerLiveStep = (text, show = true) => { - return ( - show && ( - - {text} - - ) - ); - }; - - const ledgerInstructionField = showLedgerSteps ? ( -
-
- -
- {renderLedgerLiveStep(t('ledgerLiveDialogHeader'))} - {renderLedgerLiveStep( - `- ${t('ledgerLiveDialogStepOne')}`, - !isFirefox, - )} - {renderLedgerLiveStep( - `- ${t('ledgerLiveDialogStepTwo')}`, - !isFirefox, - )} - {renderLedgerLiveStep(`- ${t('ledgerLiveDialogStepThree')}`)} - {renderLedgerLiveStep( - `- ${t('ledgerLiveDialogStepFour')}`, - Boolean(txData.txParams?.data), - )} -
-
-
-
- ) : null; - return (
{nonceField} - {ledgerInstructionField} + {showLedgerSteps ? ( + + ) : null}
); } @@ -916,6 +878,7 @@ export default class ConfirmTransactionBase extends Component { gasIsLoading, gasFeeIsCustom, nativeCurrency, + hardwareWalletRequiresConnection, } = this.props; const { submitting, @@ -981,7 +944,12 @@ export default class ConfirmTransactionBase extends Component { lastTx={lastTx} ofText={ofText} requestsWaitingText={requestsWaitingText} - disabled={!valid || submitting || (gasIsLoading && !gasFeeIsCustom)} + disabled={ + !valid || + submitting || + hardwareWalletRequiresConnection || + (gasIsLoading && !gasFeeIsCustom) + } onEdit={() => this.handleEdit()} onCancelAll={() => this.handleCancelAll()} onCancel={() => this.handleCancel()} diff --git a/ui/pages/confirm-transaction-base/confirm-transaction-base.container.js b/ui/pages/confirm-transaction-base/confirm-transaction-base.container.js index 6309ffd57..dfaa57a57 100644 --- a/ui/pages/confirm-transaction-base/confirm-transaction-base.container.js +++ b/ui/pages/confirm-transaction-base/confirm-transaction-base.container.js @@ -28,24 +28,24 @@ import { getShouldShowFiat, checkNetworkAndAccountSupports1559, getPreferences, - getHardwareWalletType, + doesAddressRequireLedgerHidConnection, getUseTokenDetection, getTokenList, } from '../../selectors'; import { getMostRecentOverviewPage } from '../../ducks/history/history'; import { - transactionMatchesNetwork, - txParamsAreDappSuggested, -} from '../../../shared/modules/transaction.utils'; -import { KEYRING_TYPES } from '../../../shared/constants/hardware-wallets'; -import { getPlatform } from '../../../app/scripts/lib/util'; -import { PLATFORM_FIREFOX } from '../../../shared/constants/app'; -import { toChecksumHexAddress } from '../../../shared/modules/hexstring-utils'; -import { + isAddressLedger, updateTransactionGasFees, getIsGasEstimatesLoading, getNativeCurrency, } from '../../ducks/metamask/metamask'; + +import { + transactionMatchesNetwork, + txParamsAreDappSuggested, +} from '../../../shared/modules/transaction.utils'; +import { toChecksumHexAddress } from '../../../shared/modules/hexstring-utils'; + import { getGasLoadingAnimationIsShowing } from '../../ducks/app/app'; import { isLegacyTransaction } from '../../helpers/utils/transactions.util'; import ConfirmTransactionBase from './confirm-transaction-base.component'; @@ -170,10 +170,14 @@ const mapStateToProps = (state, ownProps) => { const gasFeeIsCustom = fullTxData.userFeeLevel === 'custom' || txParamsAreDappSuggested(fullTxData); - const showLedgerSteps = getHardwareWalletType(state) === KEYRING_TYPES.LEDGER; - const isFirefox = getPlatform() === PLATFORM_FIREFOX; + const fromAddressIsLedger = isAddressLedger(state, fromAddress); const nativeCurrency = getNativeCurrency(state); + const hardwareWalletRequiresConnection = doesAddressRequireLedgerHidConnection( + state, + fromAddress, + ); + return { balance, fromAddress, @@ -219,9 +223,9 @@ const mapStateToProps = (state, ownProps) => { maxPriorityFeePerGas: gasEstimationObject.maxPriorityFeePerGas, baseFeePerGas: gasEstimationObject.baseFeePerGas, gasFeeIsCustom, - showLedgerSteps, - isFirefox, + showLedgerSteps: fromAddressIsLedger, nativeCurrency, + hardwareWalletRequiresConnection, }; }; diff --git a/ui/pages/create-account/connect-hardware/index.js b/ui/pages/create-account/connect-hardware/index.js index 501618727..66082de07 100644 --- a/ui/pages/create-account/connect-hardware/index.js +++ b/ui/pages/create-account/connect-hardware/index.js @@ -11,6 +11,7 @@ import { import { formatBalance } from '../../../helpers/utils/util'; import { getMostRecentOverviewPage } from '../../../ducks/history/history'; import { SECOND } from '../../../../shared/constants/time'; +import { LEDGER_TRANSPORT_TYPES } from '../../../../shared/constants/hardware-wallets'; import SelectHardware from './select-hardware'; import AccountList from './account-list'; @@ -26,6 +27,10 @@ const HD_PATHS = [ ]; class ConnectHardwareForm extends Component { + static contextTypes = { + t: PropTypes.func, + }; + state = { error: null, selectedAccounts: [], @@ -106,7 +111,7 @@ class ConnectHardwareForm extends Component { getPage = (device, page, hdPath) => { this.props - .connectHardware(device, page, hdPath) + .connectHardware(device, page, hdPath, this.context.t) .then((accounts) => { if (accounts.length) { // If we just loaded the accounts for the first time @@ -262,7 +267,7 @@ class ConnectHardwareForm extends Component { ); } @@ -313,7 +318,7 @@ ConnectHardwareForm.propTypes = { connectedAccounts: PropTypes.array.isRequired, defaultHdPaths: PropTypes.object, mostRecentOverviewPage: PropTypes.string.isRequired, - useLedgerLive: PropTypes.bool.isRequired, + ledgerTransportType: PropTypes.oneOf(Object.values(LEDGER_TRANSPORT_TYPES)), }; const mapStateToProps = (state) => ({ @@ -323,7 +328,7 @@ const mapStateToProps = (state) => ({ connectedAccounts: getMetaMaskAccountsConnected(state), defaultHdPaths: state.appState.defaultHdPaths, mostRecentOverviewPage: getMostRecentOverviewPage(state), - useLedgerLive: state.metamask.useLedgerLive, + ledgerTransportType: state.metamask.ledgerTransportType, }); const mapDispatchToProps = (dispatch) => { @@ -331,8 +336,8 @@ const mapDispatchToProps = (dispatch) => { setHardwareWalletDefaultHdPath: ({ device, path }) => { return dispatch(actions.setHardwareWalletDefaultHdPath({ device, path })); }, - connectHardware: (deviceName, page, hdPath) => { - return dispatch(actions.connectHardware(deviceName, page, hdPath)); + connectHardware: (deviceName, page, hdPath, t) => { + return dispatch(actions.connectHardware(deviceName, page, hdPath, t)); }, checkHardwareStatus: (deviceName, hdPath) => { return dispatch(actions.checkHardwareStatus(deviceName, hdPath)); diff --git a/ui/pages/create-account/connect-hardware/select-hardware.js b/ui/pages/create-account/connect-hardware/select-hardware.js index 852857222..6b711b176 100644 --- a/ui/pages/create-account/connect-hardware/select-hardware.js +++ b/ui/pages/create-account/connect-hardware/select-hardware.js @@ -2,6 +2,7 @@ import classnames from 'classnames'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; import Button from '../../../components/ui/button'; +import { LEDGER_TRANSPORT_TYPES } from '../../../../shared/constants/hardware-wallets'; export default class SelectHardware extends Component { static contextTypes = { @@ -11,7 +12,7 @@ export default class SelectHardware extends Component { static propTypes = { connectToHardwareWallet: PropTypes.func.isRequired, browserSupported: PropTypes.bool.isRequired, - useLedgerLive: PropTypes.bool.isRequired, + ledgerTransportType: PropTypes.oneOf(Object.values(LEDGER_TRANSPORT_TYPES)), }; state = { @@ -136,7 +137,7 @@ export default class SelectHardware extends Component { renderLedgerTutorialSteps() { const steps = []; - if (this.props.useLedgerLive) { + if (this.props.ledgerTransportType === LEDGER_TRANSPORT_TYPES.LIVE) { steps.push({ title: this.context.t('step1LedgerWallet'), message: this.context.t('step1LedgerWalletMsg', [ diff --git a/ui/pages/create-account/connect-hardware/select-hardware.stories.js b/ui/pages/create-account/connect-hardware/select-hardware.stories.js index 2748c87ad..b9d78b8d0 100644 --- a/ui/pages/create-account/connect-hardware/select-hardware.stories.js +++ b/ui/pages/create-account/connect-hardware/select-hardware.stories.js @@ -1,5 +1,6 @@ import React from 'react'; import { action } from '@storybook/addon-actions'; +import { LEDGER_TRANSPORT_TYPES } from '../../../../shared/constants/hardware-wallets'; import SelectHardware from './select-hardware'; export default { @@ -14,7 +15,7 @@ export const SelectHardwareComponent = () => { connectToHardwareWallet={(selectedDevice) => action(`Continue connect to ${selectedDevice}`)() } - useLedgerLive + ledgerTransportType={LEDGER_TRANSPORT_TYPES.LIVE} /> ); }; @@ -23,7 +24,7 @@ export const BrowserNotSupported = () => { undefined} - useLedgerLive + ledgerTransportType={LEDGER_TRANSPORT_TYPES.LIVE} /> ); }; diff --git a/ui/pages/settings/advanced-tab/advanced-tab.component.js b/ui/pages/settings/advanced-tab/advanced-tab.component.js index 110c0fe4c..b3b70aa79 100644 --- a/ui/pages/settings/advanced-tab/advanced-tab.component.js +++ b/ui/pages/settings/advanced-tab/advanced-tab.component.js @@ -6,9 +6,12 @@ import ToggleButton from '../../../components/ui/toggle-button'; import TextField from '../../../components/ui/text-field'; import Button from '../../../components/ui/button'; import { MOBILE_SYNC_ROUTE } from '../../../helpers/constants/routes'; +import Dropdown from '../../../components/ui/dropdown'; -import { getPlatform } from '../../../../app/scripts/lib/util'; -import { PLATFORM_FIREFOX } from '../../../../shared/constants/app'; +import { + LEDGER_TRANSPORT_TYPES, + LEDGER_USB_VENDOR_ID, +} from '../../../../shared/constants/hardware-wallets'; export default class AdvancedTab extends PureComponent { static contextTypes = { @@ -36,10 +39,11 @@ export default class AdvancedTab extends PureComponent { threeBoxDisabled: PropTypes.bool.isRequired, setIpfsGateway: PropTypes.func.isRequired, ipfsGateway: PropTypes.string.isRequired, - useLedgerLive: PropTypes.bool.isRequired, + ledgerTransportType: PropTypes.oneOf(Object.values(LEDGER_TRANSPORT_TYPES)), setLedgerLivePreference: PropTypes.func.isRequired, setDismissSeedBackUpReminder: PropTypes.func.isRequired, dismissSeedBackUpReminder: PropTypes.bool.isRequired, + userHasALedgerAccount: PropTypes.bool.isRequired, }; state = { @@ -393,24 +397,77 @@ export default class AdvancedTab extends PureComponent { renderLedgerLiveControl() { const { t } = this.context; - const { useLedgerLive, setLedgerLivePreference } = this.props; + const { + ledgerTransportType, + setLedgerLivePreference, + userHasALedgerAccount, + } = this.props; + + const LEDGER_TRANSPORT_NAMES = { + LIVE: t('ledgerLive'), + WEBHID: t('webhid'), + U2F: t('u2f'), + }; + + const transportTypeOptions = [ + { + name: LEDGER_TRANSPORT_NAMES.LIVE, + value: LEDGER_TRANSPORT_TYPES.LIVE, + }, + { + name: LEDGER_TRANSPORT_NAMES.U2F, + value: LEDGER_TRANSPORT_TYPES.U2F, + }, + ]; + + if (window.navigator.hid) { + transportTypeOptions.push({ + name: LEDGER_TRANSPORT_NAMES.WEBHID, + value: LEDGER_TRANSPORT_TYPES.WEBHID, + }); + } + + const recommendedLedgerOption = window.navigator.hid + ? LEDGER_TRANSPORT_NAMES.WEBHID + : LEDGER_TRANSPORT_NAMES.U2F; return (
- {t('ledgerLiveAdvancedSetting')} + {t('preferredLedgerConnectionType')}
- {t('ledgerLiveAdvancedSettingDescription')} + {t('ledgerConnectionPreferenceDescription', [ + recommendedLedgerOption, + , + ])}
- setLedgerLivePreference(!value)} - offLabel={t('off')} - onLabel={t('on')} - disabled={getPlatform() === PLATFORM_FIREFOX} + { + setLedgerLivePreference(transportType); + if ( + transportType === LEDGER_TRANSPORT_TYPES.WEBHID && + userHasALedgerAccount + ) { + await window.navigator.hid.requestDevice({ + filters: [{ vendorId: LEDGER_USB_VENDOR_ID }], + }); + } + }} />
diff --git a/ui/pages/settings/advanced-tab/advanced-tab.component.test.js b/ui/pages/settings/advanced-tab/advanced-tab.component.test.js index eb78d3c21..e403bf4aa 100644 --- a/ui/pages/settings/advanced-tab/advanced-tab.component.test.js +++ b/ui/pages/settings/advanced-tab/advanced-tab.component.test.js @@ -2,6 +2,7 @@ import React from 'react'; import sinon from 'sinon'; import { shallow } from 'enzyme'; import TextField from '../../../components/ui/text-field'; +import { LEDGER_TRANSPORT_TYPES } from '../../../../shared/constants/hardware-wallets'; import AdvancedTab from './advanced-tab.component'; describe('AdvancedTab Component', () => { @@ -15,7 +16,7 @@ describe('AdvancedTab Component', () => { setThreeBoxSyncingPermission={() => undefined} threeBoxDisabled threeBoxSyncingAllowed={false} - useLedgerLive={false} + ledgerTransportType={LEDGER_TRANSPORT_TYPES.U2F} setLedgerLivePreference={() => undefined} setDismissSeedBackUpReminder={() => undefined} dismissSeedBackUpReminder={false} @@ -41,7 +42,7 @@ describe('AdvancedTab Component', () => { setThreeBoxSyncingPermission={() => undefined} threeBoxDisabled threeBoxSyncingAllowed={false} - useLedgerLive={false} + ledgerTransportType={LEDGER_TRANSPORT_TYPES.U2F} setLedgerLivePreference={() => undefined} setDismissSeedBackUpReminder={() => undefined} dismissSeedBackUpReminder={false} diff --git a/ui/pages/settings/advanced-tab/advanced-tab.container.js b/ui/pages/settings/advanced-tab/advanced-tab.container.js index 3ea88dc8d..434ca2444 100644 --- a/ui/pages/settings/advanced-tab/advanced-tab.container.js +++ b/ui/pages/settings/advanced-tab/advanced-tab.container.js @@ -15,6 +15,7 @@ import { setDismissSeedBackUpReminder, } from '../../../store/actions'; import { getPreferences } from '../../../selectors'; +import { doesUserHaveALedgerAccount } from '../../../ducks/metamask/metamask'; import AdvancedTab from './advanced-tab.component'; export const mapStateToProps = (state) => { @@ -28,11 +29,13 @@ export const mapStateToProps = (state) => { threeBoxDisabled, useNonceField, ipfsGateway, - useLedgerLive, + ledgerTransportType, dismissSeedBackUpReminder, } = metamask; const { showFiatInTestnets, autoLockTimeLimit } = getPreferences(state); + const userHasALedgerAccount = doesUserHaveALedgerAccount(state); + return { warning, sendHexData, @@ -43,8 +46,9 @@ export const mapStateToProps = (state) => { threeBoxDisabled, useNonceField, ipfsGateway, - useLedgerLive, + ledgerTransportType, dismissSeedBackUpReminder, + userHasALedgerAccount, }; }; diff --git a/ui/pages/settings/index.scss b/ui/pages/settings/index.scss index a77436eb9..2f178e7ef 100644 --- a/ui/pages/settings/index.scss +++ b/ui/pages/settings/index.scss @@ -233,6 +233,13 @@ margin-left: 1.875rem; } + &__inline-link { + @include H6; + + display: initial; + padding: 0; + } + &--selected { .settings-page { &__content { diff --git a/ui/selectors/selectors.js b/ui/selectors/selectors.js index b283e3a61..688d72f00 100644 --- a/ui/selectors/selectors.js +++ b/ui/selectors/selectors.js @@ -1,4 +1,3 @@ -import { stripHexPrefix } from 'ethereumjs-util'; import { createSelector } from 'reselect'; import { addHexPrefix } from '../../app/scripts/lib/util'; import { @@ -8,7 +7,11 @@ import { NETWORK_TYPE_RPC, NATIVE_CURRENCY_TOKEN_IMAGE_MAP, } from '../../shared/constants/network'; -import { KEYRING_TYPES } from '../../shared/constants/hardware-wallets'; +import { + KEYRING_TYPES, + WEBHID_CONNECTED_STATUSES, + LEDGER_TRANSPORT_TYPES, +} from '../../shared/constants/hardware-wallets'; import { SWAPS_CHAINID_DEFAULT_TOKEN_MAP, @@ -36,7 +39,11 @@ import { getConversionRate, isNotEIP1559Network, isEIP1559Network, + getLedgerTransportType, + isAddressLedger, + findKeyringForAddress, } from '../ducks/metamask/metamask'; +import { getLedgerWebHidConnectedStatus } from '../ducks/app/app'; /** * One of the only remaining valid uses of selecting the network subkey of the @@ -77,14 +84,7 @@ export function getCurrentKeyring(state) { return null; } - const simpleAddress = stripHexPrefix(identity.address).toLowerCase(); - - const keyring = state.metamask.keyrings.find((kr) => { - return ( - kr.accounts.includes(simpleAddress) || - kr.accounts.includes(identity.address) - ); - }); + const keyring = findKeyringForAddress(state, identity.address); return keyring; } @@ -646,3 +646,16 @@ export function getUseTokenDetection(state) { export function getTokenList(state) { return state.metamask.tokenList; } + +export function doesAddressRequireLedgerHidConnection(state, address) { + const addressIsLedger = isAddressLedger(state, address); + const transportTypePreferenceIsWebHID = + getLedgerTransportType(state) === LEDGER_TRANSPORT_TYPES.WEBHID; + const webHidIsNotConnected = + getLedgerWebHidConnectedStatus(state) !== + WEBHID_CONNECTED_STATUSES.CONNECTED; + + return ( + addressIsLedger && transportTypePreferenceIsWebHID && webHidIsNotConnected + ); +} diff --git a/ui/store/actionConstants.js b/ui/store/actionConstants.js index 82ad8afcf..5f70a4304 100644 --- a/ui/store/actionConstants.js +++ b/ui/store/actionConstants.js @@ -77,6 +77,10 @@ export const COMPLETE_ONBOARDING = 'COMPLETE_ONBOARDING'; export const SET_MOUSE_USER_STATE = 'SET_MOUSE_USER_STATE'; +// Ledger + +export const SET_WEBHID_CONNECTED_STATUS = 'SET_WEBHID_CONNECTED_STATUS'; + // Network export const SET_PENDING_TOKENS = 'SET_PENDING_TOKENS'; export const CLEAR_PENDING_TOKENS = 'CLEAR_PENDING_TOKENS'; diff --git a/ui/store/actions.js b/ui/store/actions.js index a1705cc54..e94779498 100644 --- a/ui/store/actions.js +++ b/ui/store/actions.js @@ -28,6 +28,10 @@ import { computeEstimatedGasLimit, resetSendState } from '../ducks/send'; import { switchedToUnconnectedAccount } from '../ducks/alerts/unconnected-account'; import { getUnconnectedAccountAlertEnabledness } from '../ducks/metamask/metamask'; import { toChecksumHexAddress } from '../../shared/modules/hexstring-utils'; +import { + LEDGER_TRANSPORT_TYPES, + LEDGER_USB_VENDOR_ID, +} from '../../shared/constants/hardware-wallets'; import * as actionConstants from './actionConstants'; let background = null; @@ -395,15 +399,31 @@ export function forgetDevice(deviceName) { }; } -export function connectHardware(deviceName, page, hdPath) { +export function connectHardware(deviceName, page, hdPath, t) { log.debug(`background.connectHardware`, deviceName, page, hdPath); - return async (dispatch) => { + return async (dispatch, getState) => { dispatch( showLoadingIndication(`Looking for your ${capitalize(deviceName)}...`), ); let accounts; try { + const { ledgerTransportType } = getState().metamask; + if ( + deviceName === 'ledger' && + ledgerTransportType === LEDGER_TRANSPORT_TYPES.WEBHID + ) { + const connectedDevices = await window.navigator.hid.requestDevice({ + filters: [{ vendorId: LEDGER_USB_VENDOR_ID }], + }); + const userApprovedWebHidConnection = connectedDevices.some( + (device) => device.vendorId === Number(LEDGER_USB_VENDOR_ID), + ); + if (!userApprovedWebHidConnection) { + throw new Error(t('ledgerWebHIDNotConnectedErrorMessage')); + } + } + accounts = await promisifiedBackground.connectHardware( deviceName, page, @@ -2745,7 +2765,7 @@ export function getCurrentWindowTab() { export function setLedgerLivePreference(value) { return async (dispatch) => { dispatch(showLoadingIndication()); - await promisifiedBackground.setLedgerLivePreference(value); + await promisifiedBackground.setLedgerTransportPreference(value); dispatch(hideLoadingIndication()); }; } diff --git a/yarn.lock b/yarn.lock index 384eba031..9e1b5695b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2821,10 +2821,10 @@ resolved "https://registry.yarnpkg.com/@metamask/eslint-config/-/eslint-config-6.0.0.tgz#ec53e8ab278073e882411ed89705bc7d06b78c81" integrity sha512-LyakGYGwM8UQOGhwWa+5erAI1hXuiTgf/y7USzOomX6H9KiuY09IAUYnPh7ToPG2sedD2F48UF1bUm8yvCoZOw== -"@metamask/eth-ledger-bridge-keyring@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@metamask/eth-ledger-bridge-keyring/-/eth-ledger-bridge-keyring-0.7.0.tgz#7d80e1e3dfab91ba2b6a1a2a5e352320e948b568" - integrity sha512-0UOEb/c3/fkatDK+se3gOHaGQ0RTRLbG5DqsoeowZ/JcO4wcMxBhOiIgOY4domOqUTekKKVPNC7Pc0mHpM9sAQ== +"@metamask/eth-ledger-bridge-keyring@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@metamask/eth-ledger-bridge-keyring/-/eth-ledger-bridge-keyring-0.9.0.tgz#42e98e7dfeaaa08e7c9ceff261facddd7320df80" + integrity sha512-EuNKvodbdJxQPzr+zAE5TE1iKUzuIRWKeVaYoYwpi18RjjtSQMKmZcb3VXY8hmQu+Fj4Ld/ujj22qSYjYAjtPg== dependencies: "@ethereumjs/tx" "^3.2.0" eth-sig-util "^2.0.0" From baa4eb2d82429ba0a5c2a871448214318ffb5816 Mon Sep 17 00:00:00 2001 From: Hassan Malik <41640681+hmalik88@users.noreply.github.com> Date: Wed, 3 Nov 2021 15:03:54 -0400 Subject: [PATCH 44/97] Remove hexdata field from token send (#12565) * added acccess to asset from state, updated SendHexDataRow display logic * fixed invalid propType and updated tests * updated logic and tests to only disable hex data field for TOKEN (ERC-20) types --- .../send-content/send-content.component.js | 7 ++++++- .../send-content.component.test.js | 18 ++++++++++++++++++ .../send-content/send-content.container.js | 2 ++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/ui/pages/send/send-content/send-content.component.js b/ui/pages/send/send-content/send-content.component.js index 6ed0cb02a..fd44a1c41 100644 --- a/ui/pages/send/send-content/send-content.component.js +++ b/ui/pages/send/send-content/send-content.component.js @@ -9,6 +9,7 @@ import { UNSENDABLE_ASSET_ERROR_KEY, INSUFFICIENT_FUNDS_FOR_GAS_ERROR_KEY, } from '../../../helpers/constants/error-keys'; +import { ASSET_TYPES } from '../../../ducks/send'; import SendAmountRow from './send-amount-row'; import SendHexDataRow from './send-hex-data-row'; import SendAssetRow from './send-asset-row'; @@ -32,6 +33,7 @@ export default class SendContent extends Component { noGasPrice: PropTypes.bool, networkOrAccountNotSupports1559: PropTypes.bool, getIsBalanceInsufficient: PropTypes.bool, + asset: PropTypes.object, }; render() { @@ -44,6 +46,7 @@ export default class SendContent extends Component { isAssetSendable, networkOrAccountNotSupports1559, getIsBalanceInsufficient, + asset, } = this.props; let gasError; @@ -51,6 +54,8 @@ export default class SendContent extends Component { else if (noGasPrice) gasError = GAS_PRICE_FETCH_FAILURE_ERROR_KEY; else if (getIsBalanceInsufficient) gasError = INSUFFICIENT_FUNDS_FOR_GAS_ERROR_KEY; + const showHexData = + this.props.showHexData && asset.type !== ASSET_TYPES.TOKEN; return ( @@ -68,7 +73,7 @@ export default class SendContent extends Component { {networkOrAccountNotSupports1559 ? : null} - {this.props.showHexData ? : null} + {showHexData ? : null}
); diff --git a/ui/pages/send/send-content/send-content.component.test.js b/ui/pages/send/send-content/send-content.component.test.js index cee97b54b..7b06b50e3 100644 --- a/ui/pages/send/send-content/send-content.component.test.js +++ b/ui/pages/send/send-content/send-content.component.test.js @@ -15,6 +15,7 @@ describe('SendContent Component', () => { showHexData: true, gasIsExcessive: false, networkAndAccountSupports1559: true, + asset: { type: 'NATIVE' }, }; beforeEach(() => { @@ -73,6 +74,23 @@ describe('SendContent Component', () => { expect(wrapper.find(SendHexDataRow)).toHaveLength(0); }); + it('should not render the SendHexDataRow if the asset type is TOKEN (ERC-20)', () => { + wrapper.setProps({ asset: { type: 'TOKEN' } }); + const PageContainerContentChild = wrapper + .find(PageContainerContent) + .children(); + expect(PageContainerContentChild.childAt(0).is(Dialog)).toStrictEqual( + true, + ); + expect( + PageContainerContentChild.childAt(1).is(SendAssetRow), + ).toStrictEqual(true); + expect( + PageContainerContentChild.childAt(2).is(SendAmountRow), + ).toStrictEqual(true); + expect(wrapper.find(SendHexDataRow)).toHaveLength(0); + }); + it('should not render the Dialog if contact has a name', () => { wrapper.setProps({ showHexData: false, diff --git a/ui/pages/send/send-content/send-content.container.js b/ui/pages/send/send-content/send-content.container.js index 16824b0d4..e5d1c62b9 100644 --- a/ui/pages/send/send-content/send-content.container.js +++ b/ui/pages/send/send-content/send-content.container.js @@ -10,6 +10,7 @@ import { getIsAssetSendable, getIsBalanceInsufficient, getSendTo, + getSendAsset, } from '../../../ducks/send'; import * as actions from '../../../store/actions'; @@ -33,6 +34,7 @@ function mapStateToProps(state) { state, ), getIsBalanceInsufficient: getIsBalanceInsufficient(state), + asset: getSendAsset(state), }; } From 3e0d602d2201ded7bfe35ba883e4df5fe4165bac Mon Sep 17 00:00:00 2001 From: David Walsh Date: Wed, 3 Nov 2021 15:28:29 -0500 Subject: [PATCH 45/97] Fix fllWidth proptype error (#12555) --- ui/pages/unlock-page/unlock-page.component.js | 1 - 1 file changed, 1 deletion(-) diff --git a/ui/pages/unlock-page/unlock-page.component.js b/ui/pages/unlock-page/unlock-page.component.js index 907cda27c..f7323d4c4 100644 --- a/ui/pages/unlock-page/unlock-page.component.js +++ b/ui/pages/unlock-page/unlock-page.component.js @@ -123,7 +123,6 @@ export default class UnlockPage extends Component { type="submit" style={style} disabled={!this.state.password} - fullWidth variant="contained" size="large" onClick={this.handleSubmit} From 958535d5df49701c3cc2fdd1f1b458ebbe2e367b Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Wed, 3 Nov 2021 20:05:39 -0230 Subject: [PATCH 46/97] Ledger WebHID What's New popup (#12501) * Add notification for ledger live users about how they can switch to WebHID * Add action button so that users can go right to settings from the what's new popup * Fix * Add notification 8 to e2e fixtures * Lint fix * Update ledger webhid notification wording * Update app/_locales/en/messages.json * Update ui/selectors/selectors.js --- app/_locales/en/messages.json | 16 ++++++++++++++++ shared/notifications/index.js | 16 ++++++++++++++++ test/e2e/fixtures/address-entry/state.json | 3 +++ test/e2e/fixtures/connected-state/state.json | 3 +++ test/e2e/fixtures/custom-rpc/state.json | 3 +++ test/e2e/fixtures/custom-token/state.json | 6 +++++- test/e2e/fixtures/import-ui/state.json | 3 +++ test/e2e/fixtures/imported-account/state.json | 3 +++ test/e2e/fixtures/localization/state.json | 3 +++ test/e2e/fixtures/metrics-enabled/state.json | 3 +++ .../fixtures/navigate-transactions/state.json | 3 +++ test/e2e/fixtures/send-edit/state.json | 3 +++ test/e2e/fixtures/threebox-enabled/state.json | 3 +++ .../app/whats-new-popup/whats-new-popup.js | 9 ++++++++- ui/selectors/selectors.js | 9 ++++++++- 15 files changed, 83 insertions(+), 3 deletions(-) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 7142a2241..f4d146626 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -1666,6 +1666,22 @@ "message": "Ledger firmware update", "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." }, + "notifications8ActionText": { + "message": "Go to Advanced Settings", + "description": "Description on an action button that appears in the What's New popup. Tells the user that if they click it, they will go to our Advanced Settings page." + }, + "notifications8DescriptionOne": { + "message": "As of MetaMask v10.4.0, you no longer need Ledger Live to connect your Ledger device to MetaMask.", + "description": "Description of a notification in the 'See What's New' popup. Describes changes for how Ledger Live is no longer needed to connect the device." + }, + "notifications8DescriptionTwo": { + "message": "For an easier and more stable ledger experience, go to the Advanced tab of settings and switch the 'Preferred Ledger Connection Type' to 'WebHID'.", + "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." + }, + "notifications8Title": { + "message": "Ledger connection improvement", + "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users that there is an improvement in how they can connect their device." + }, "ofTextNofM": { "message": "of" }, diff --git a/shared/notifications/index.js b/shared/notifications/index.js index da7c2f410..bad25a791 100644 --- a/shared/notifications/index.js +++ b/shared/notifications/index.js @@ -34,6 +34,10 @@ export const UI_NOTIFICATIONS = { id: 7, date: '2021-09-17', }, + 8: { + id: 8, + date: '2021-11-01', + }, }; export const getTranslatedUINoficiations = (t, locale) => { @@ -97,5 +101,17 @@ export const getTranslatedUINoficiations = (t, locale) => { new Date(UI_NOTIFICATIONS[7].date), ), }, + 8: { + ...UI_NOTIFICATIONS[8], + title: t('notifications8Title'), + description: [ + t('notifications8DescriptionOne'), + t('notifications8DescriptionTwo'), + ], + date: new Intl.DateTimeFormat(formattedLocale).format( + new Date(UI_NOTIFICATIONS[8].date), + ), + actionText: t('notifications8ActionText'), + }, }; }; diff --git a/test/e2e/fixtures/address-entry/state.json b/test/e2e/fixtures/address-entry/state.json index c17fd7e0c..59da933e5 100644 --- a/test/e2e/fixtures/address-entry/state.json +++ b/test/e2e/fixtures/address-entry/state.json @@ -63,6 +63,9 @@ }, "6": { "isShown": true + }, + "8": { + "isShown": true } } }, diff --git a/test/e2e/fixtures/connected-state/state.json b/test/e2e/fixtures/connected-state/state.json index 5d3d2f68e..ccc9ab82d 100644 --- a/test/e2e/fixtures/connected-state/state.json +++ b/test/e2e/fixtures/connected-state/state.json @@ -53,6 +53,9 @@ }, "6": { "isShown": true + }, + "8": { + "isShown": true } } }, diff --git a/test/e2e/fixtures/custom-rpc/state.json b/test/e2e/fixtures/custom-rpc/state.json index 54d6bb4a8..43319cd60 100644 --- a/test/e2e/fixtures/custom-rpc/state.json +++ b/test/e2e/fixtures/custom-rpc/state.json @@ -49,6 +49,9 @@ }, "6": { "isShown": true + }, + "8": { + "isShown": true } } }, diff --git a/test/e2e/fixtures/custom-token/state.json b/test/e2e/fixtures/custom-token/state.json index 15a708f82..158ab303b 100644 --- a/test/e2e/fixtures/custom-token/state.json +++ b/test/e2e/fixtures/custom-token/state.json @@ -67,7 +67,11 @@ } }, "NotificationController": { - "notifications": {} + "notifications": { + "8": { + "isShown": true + } + } }, "OnboardingController": { "onboardingTabs": {}, diff --git a/test/e2e/fixtures/import-ui/state.json b/test/e2e/fixtures/import-ui/state.json index 9f5cb4459..75aa4e7da 100644 --- a/test/e2e/fixtures/import-ui/state.json +++ b/test/e2e/fixtures/import-ui/state.json @@ -104,6 +104,9 @@ }, "6": { "isShown": true + }, + "8": { + "isShown": true } } }, diff --git a/test/e2e/fixtures/imported-account/state.json b/test/e2e/fixtures/imported-account/state.json index 42f5a7a54..449f6018b 100644 --- a/test/e2e/fixtures/imported-account/state.json +++ b/test/e2e/fixtures/imported-account/state.json @@ -49,6 +49,9 @@ }, "6": { "isShown": true + }, + "8": { + "isShown": true } } }, diff --git a/test/e2e/fixtures/localization/state.json b/test/e2e/fixtures/localization/state.json index 73a3b97b2..952a3a502 100644 --- a/test/e2e/fixtures/localization/state.json +++ b/test/e2e/fixtures/localization/state.json @@ -49,6 +49,9 @@ }, "6": { "isShown": true + }, + "8": { + "isShown": true } } }, diff --git a/test/e2e/fixtures/metrics-enabled/state.json b/test/e2e/fixtures/metrics-enabled/state.json index 67cbf9977..3b272611e 100644 --- a/test/e2e/fixtures/metrics-enabled/state.json +++ b/test/e2e/fixtures/metrics-enabled/state.json @@ -53,6 +53,9 @@ }, "6": { "isShown": true + }, + "8": { + "isShown": true } } }, diff --git a/test/e2e/fixtures/navigate-transactions/state.json b/test/e2e/fixtures/navigate-transactions/state.json index 3f08971b0..ff0d8a05d 100644 --- a/test/e2e/fixtures/navigate-transactions/state.json +++ b/test/e2e/fixtures/navigate-transactions/state.json @@ -49,6 +49,9 @@ }, "6": { "isShown": true + }, + "8": { + "isShown": true } } }, diff --git a/test/e2e/fixtures/send-edit/state.json b/test/e2e/fixtures/send-edit/state.json index 79efbaed2..8392faac9 100644 --- a/test/e2e/fixtures/send-edit/state.json +++ b/test/e2e/fixtures/send-edit/state.json @@ -50,6 +50,9 @@ }, "6": { "isShown": true + }, + "8": { + "isShown": true } } }, diff --git a/test/e2e/fixtures/threebox-enabled/state.json b/test/e2e/fixtures/threebox-enabled/state.json index abad9782b..565e8a122 100644 --- a/test/e2e/fixtures/threebox-enabled/state.json +++ b/test/e2e/fixtures/threebox-enabled/state.json @@ -60,6 +60,9 @@ }, "6": { "isShown": true + }, + "8": { + "isShown": true } } }, diff --git a/ui/components/app/whats-new-popup/whats-new-popup.js b/ui/components/app/whats-new-popup/whats-new-popup.js index 06233371a..51b425b4c 100644 --- a/ui/components/app/whats-new-popup/whats-new-popup.js +++ b/ui/components/app/whats-new-popup/whats-new-popup.js @@ -12,7 +12,10 @@ import Typography from '../../ui/typography'; import { updateViewedNotifications } from '../../../store/actions'; import { getTranslatedUINoficiations } from '../../../../shared/notifications'; import { getSortedNotificationsToShow } from '../../../selectors'; -import { BUILD_QUOTE_ROUTE } from '../../../helpers/constants/routes'; +import { + BUILD_QUOTE_ROUTE, + ADVANCED_ROUTE, +} from '../../../helpers/constants/routes'; import { TYPOGRAPHY } from '../../../helpers/constants/design-system'; function getActionFunctionById(id, history) { @@ -38,6 +41,10 @@ function getActionFunctionById(id, history) { url: 'https://metamask.zendesk.com/hc/en-us/articles/360060826432', }); }, + 8: () => { + updateViewedNotifications({ 8: true }); + history.push(ADVANCED_ROUTE); + }, }; return actionFunctions[id]; diff --git a/ui/selectors/selectors.js b/ui/selectors/selectors.js index dec951328..d046bf885 100644 --- a/ui/selectors/selectors.js +++ b/ui/selectors/selectors.js @@ -575,7 +575,13 @@ export function getShowWhatsNewPopup(state) { * @param {Object} state * @returns {Object} */ -function getAllowedNotificationIds() { +function getAllowedNotificationIds(state) { + const currentKeyring = getCurrentKeyring(state); + const currentKeyringIsLedger = currentKeyring?.type === KEYRING_TYPES.LEDGER; + const supportsWebHid = window.navigator.hid !== undefined; + const currentlyUsingLedgerLive = + getLedgerTransportType(state) === LEDGER_TRANSPORT_TYPES.LIVE; + return { 1: false, 2: false, @@ -584,6 +590,7 @@ function getAllowedNotificationIds() { 5: false, 6: false, 7: false, + 8: supportsWebHid && currentKeyringIsLedger && currentlyUsingLedgerLive, }; } From 59054519badad1fdcd423f36d318c63311c2b02c Mon Sep 17 00:00:00 2001 From: igorms-cons <89637087+igorms-cons@users.noreply.github.com> Date: Thu, 4 Nov 2021 07:58:32 +0100 Subject: [PATCH 47/97] Show account name & full address in send view - issue #12346 (#12415) * account name & address in send view UI update & fix * update scss in send modal view * send account address - refacto func --- ui/ducks/send/send.js | 7 ++++--- ui/ducks/send/send.test.js | 3 +++ .../add-recipient/ens-input.component.js | 5 ++--- ui/pages/send/send.scss | 17 ++++++++--------- ui/pages/settings/settings.container.js | 4 ++-- ui/selectors/selectors.js | 9 ++++++--- 6 files changed, 25 insertions(+), 20 deletions(-) diff --git a/ui/ducks/send/send.js b/ui/ducks/send/send.js index 86f385747..690092173 100644 --- a/ui/ducks/send/send.js +++ b/ui/ducks/send/send.js @@ -40,6 +40,7 @@ import { checkNetworkAndAccountSupports1559, getUseTokenDetection, getTokenList, + getAddressBookEntryOrAccountName, } from '../../selectors'; import { disconnectGasFeeEstimatePoller, @@ -1444,12 +1445,12 @@ export function useMyAccountsForRecipientSearch() { export function updateRecipient({ address, nickname }) { return async (dispatch, getState) => { const state = getState(); - const nicknameFromAddressBook = - getAddressBookEntry(state, address)?.name ?? ''; + const nicknameFromAddressBookEntryOrAccountName = + getAddressBookEntryOrAccountName(state, address) ?? ''; await dispatch( actions.updateRecipient({ address, - nickname: nickname || nicknameFromAddressBook, + nickname: nickname || nicknameFromAddressBookEntryOrAccountName, }), ); await dispatch(computeEstimatedGasLimit()); diff --git a/ui/ducks/send/send.test.js b/ui/ducks/send/send.test.js index 9e272b9b3..aa7f7e25c 100644 --- a/ui/ducks/send/send.test.js +++ b/ui/ducks/send/send.test.js @@ -1626,6 +1626,7 @@ describe('Send Slice', () => { const updateRecipientState = { metamask: { addressBook: {}, + identities: {}, provider: { chainId: '0x1', }, @@ -1740,6 +1741,7 @@ describe('Send Slice', () => { const tokenState = { metamask: { addressBook: {}, + identities: {}, blockGasLimit: '', selectedAddress: '', provider: { @@ -1794,6 +1796,7 @@ describe('Send Slice', () => { const updateRecipientState = { metamask: { addressBook: {}, + identities: {}, provider: { chainId: '', }, diff --git a/ui/pages/send/send-content/add-recipient/ens-input.component.js b/ui/pages/send/send-content/add-recipient/ens-input.component.js index 5747d4044..de0332078 100644 --- a/ui/pages/send/send-content/add-recipient/ens-input.component.js +++ b/ui/pages/send/send-content/add-recipient/ens-input.component.js @@ -2,7 +2,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; -import { ellipsify } from '../../send.utils'; import { isValidDomainName } from '../../../../helpers/utils/util'; import { isBurnAddress, @@ -106,9 +105,9 @@ export default class EnsInput extends Component { <>
- {selectedName || ellipsify(selectedAddress)} + {selectedName || selectedAddress}
- {selectedName && ( + {selectedName !== selectedAddress && (
{selectedAddress}
diff --git a/ui/pages/send/send.scss b/ui/pages/send/send.scss index c47b21fe5..6b3df6db9 100644 --- a/ui/pages/send/send.scss +++ b/ui/pages/send/send.scss @@ -180,17 +180,13 @@ &__status-icon { @extend %bg-contain; - background-image: url("/images/search-black.svg"); + background-image: url('/images/search-black.svg'); width: 1.125rem; height: 1.125rem; margin: 0.25rem 0.5rem 0.25rem 0.25rem; - &--error { - - } - &--valid { - background-image: url("/images/check-green-solid.svg"); + background-image: url('/images/check-green-solid.svg'); } } @@ -213,7 +209,7 @@ cursor: pointer; &--erase { - background-image: url("/images/close-gray.svg"); + background-image: url('/images/close-gray.svg'); background-color: unset; width: 0.75rem; height: 0.75rem; @@ -221,7 +217,7 @@ } &--qrcode { - background-image: url("/images/qr-blue.svg"); + background-image: url('/images/qr-blue.svg'); background-color: unset; width: 1.5rem; height: 1.5rem; @@ -234,7 +230,7 @@ .ens-input__wrapper { &__status-icon { - background-image: url("/images/check-green-solid.svg"); + background-image: url('/images/check-green-solid.svg'); } &__input { @@ -253,6 +249,9 @@ @include H6; @extend %ellipsify; + + word-wrap: break-word; + white-space: inherit !important; } &__subtitle { diff --git a/ui/pages/settings/settings.container.js b/ui/pages/settings/settings.container.js index ce81cb769..c973e78f3 100644 --- a/ui/pages/settings/settings.container.js +++ b/ui/pages/settings/settings.container.js @@ -1,7 +1,7 @@ import { compose } from 'redux'; import { connect } from 'react-redux'; import { withRouter } from 'react-router-dom'; -import { getAddressBookEntryName } from '../../selectors'; +import { getAddressBookEntryOrAccountName } from '../../selectors'; import { ENVIRONMENT_TYPE_POPUP } from '../../../shared/constants/app'; import { getEnvironmentType } from '../../../app/scripts/lib/util'; import { getMostRecentOverviewPage } from '../../ducks/history/history'; @@ -72,7 +72,7 @@ const mapStateToProps = (state, ownProps) => { let initialBreadCrumbRoute; let initialBreadCrumbKey; - const addressName = getAddressBookEntryName( + const addressName = getAddressBookEntryOrAccountName( state, !isBurnAddress(pathNameTail) && isValidHexAddress(pathNameTail, { mixedCaseUseChecksum: true }) diff --git a/ui/selectors/selectors.js b/ui/selectors/selectors.js index d046bf885..9db1c3704 100644 --- a/ui/selectors/selectors.js +++ b/ui/selectors/selectors.js @@ -303,10 +303,13 @@ export function getAddressBookEntry(state, address) { return entry; } -export function getAddressBookEntryName(state, address) { +export function getAddressBookEntryOrAccountName(state, address) { const entry = - getAddressBookEntry(state, address) || state.metamask.identities[address]; - return entry && entry.name !== '' ? entry.name : shortenAddress(address); + getAddressBookEntry(state, address) || + Object.values(state.metamask.identities).find((identity) => + isEqualCaseInsensitive(identity.address, toChecksumHexAddress(address)), + ); + return entry && entry.name !== '' ? entry.name : address; } export function accountsWithSendEtherInfoSelector(state) { From f98b21e750db8e2c12d2b97220409d18cc085f0b Mon Sep 17 00:00:00 2001 From: VSaric <92527393+VSaric@users.noreply.github.com> Date: Thu, 4 Nov 2021 07:58:50 +0100 Subject: [PATCH 48/97] Heading on contact details view in popup should say "Details" instead of contact name (#12380) * Change contact details view in popup to show "Details" instead of contact's name * Changed contact details view in popup --- ui/pages/settings/settings.component.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/pages/settings/settings.component.js b/ui/pages/settings/settings.component.js index 3c94b67da..4790c0913 100644 --- a/ui/pages/settings/settings.component.js +++ b/ui/pages/settings/settings.component.js @@ -101,7 +101,7 @@ class SettingsPage extends PureComponent { let titleText; if (isPopup && addressName) { - titleText = addressName; + titleText = t('details'); } else if (pathnameI18nKey && isPopup) { titleText = t(pathnameI18nKey); } else { From 843bb6e0470b6740af7ff9fc92e277dd2ac5c63d Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Thu, 4 Nov 2021 15:49:53 -0230 Subject: [PATCH 49/97] Check if ledger was successfully able to establish transport on confirm screen mount (#12535) * Check if ledger was successfully able to establish transport on mount of confirm screens * Update ledger message/action if transport creation was blocked by existing connection * TEMP: point eth-ledger-bridge-keyring to commite, REMOVE BEFORE MERGE * Update eth-ledger-bridge-keyring to v0.10.0 --- app/_locales/en/messages.json | 3 + app/scripts/metamask-controller.js | 9 +++ package.json | 2 +- shared/constants/hardware-wallets.js | 7 +++ .../ledger-instruction-field.js | 61 ++++++++++++++++++- ui/ducks/app/app.js | 20 +++++- ui/selectors/selectors.js | 13 +++- ui/store/actionConstants.js | 1 + ui/store/actions.js | 4 ++ yarn.lock | 8 +-- 10 files changed, 119 insertions(+), 9 deletions(-) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index f4d146626..70c00f8de 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -1264,6 +1264,9 @@ "ledgerAccountRestriction": { "message": "You need to make use your last account before you can add a new one." }, + "ledgerConnectionInstructionCloseOtherApps": { + "message": "Close any other software connected to your device and then click here to refresh." + }, "ledgerConnectionInstructionHeader": { "message": "Prior to clicking confirm:" }, diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 2010ce69f..40832c0bc 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -845,6 +845,10 @@ export default class MetamaskController extends EventEmitter { this.setLedgerTransportPreference, this, ), + attemptLedgerTransportCreation: nodeify( + this.attemptLedgerTransportCreation, + this, + ), // mobile fetchInfoToSync: nodeify(this.fetchInfoToSync, this), @@ -1556,6 +1560,11 @@ export default class MetamaskController extends EventEmitter { return keyring; } + async attemptLedgerTransportCreation() { + const keyring = await this.getKeyringForDevice('ledger'); + return await keyring.attemptMakeApp(); + } + /** * Fetch account list from a trezor device. * diff --git a/package.json b/package.json index bacb7ef16..2a25204ae 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@material-ui/core": "^4.11.0", "@metamask/contract-metadata": "^1.28.0", "@metamask/controllers": "^17.0.0", - "@metamask/eth-ledger-bridge-keyring": "^0.9.0", + "@metamask/eth-ledger-bridge-keyring": "^0.10.0", "@metamask/eth-token-tracker": "^3.0.1", "@metamask/etherscan-link": "^2.1.0", "@metamask/jazzicon": "^2.0.0", diff --git a/shared/constants/hardware-wallets.js b/shared/constants/hardware-wallets.js index e780555fc..705754fe7 100644 --- a/shared/constants/hardware-wallets.js +++ b/shared/constants/hardware-wallets.js @@ -24,3 +24,10 @@ export const WEBHID_CONNECTED_STATUSES = { NOT_CONNECTED: 'notConnected', UNKNOWN: 'unknown', }; + +export const TRANSPORT_STATES = { + NONE: 'NONE', + VERIFIED: 'VERIFIED', + DEVICE_OPEN_FAILURE: 'DEVICE_OPEN_FAILURE', + UNKNOWN_FAILURE: 'UNKNOWN_FAILURE', +}; diff --git a/ui/components/app/ledger-instruction-field/ledger-instruction-field.js b/ui/components/app/ledger-instruction-field/ledger-instruction-field.js index 960b6ca07..287db2c8e 100644 --- a/ui/components/app/ledger-instruction-field/ledger-instruction-field.js +++ b/ui/components/app/ledger-instruction-field/ledger-instruction-field.js @@ -5,6 +5,7 @@ import { LEDGER_TRANSPORT_TYPES, LEDGER_USB_VENDOR_ID, WEBHID_CONNECTED_STATUSES, + TRANSPORT_STATES, } from '../../../../shared/constants/hardware-wallets'; import { PLATFORM_FIREFOX, @@ -14,6 +15,8 @@ import { import { setLedgerWebHidConnectedStatus, getLedgerWebHidConnectedStatus, + setLedgerTransportStatus, + getLedgerTransportStatus, } from '../../../ducks/app/app'; import Typography from '../../ui/typography/typography'; @@ -30,6 +33,7 @@ import { getEnvironmentType, } from '../../../../app/scripts/lib/util'; import { getLedgerTransportType } from '../../../ducks/metamask/metamask'; +import { attemptLedgerTransportCreation } from '../../../store/actions'; const renderInstructionStep = (text, show = true, color = COLORS.PRIMARY3) => { return ( @@ -52,6 +56,7 @@ export default function LedgerInstructionField({ showDataInstruction }) { const webHidConnectedStatus = useSelector(getLedgerWebHidConnectedStatus); const ledgerTransportType = useSelector(getLedgerTransportType); + const transportStatus = useSelector(getLedgerTransportStatus); const environmentType = getEnvironmentType(); const environmentTypeIsFullScreen = environmentType === ENVIRONMENT_TYPE_FULLSCREEN; @@ -75,8 +80,45 @@ export default function LedgerInstructionField({ showDataInstruction }) { ); } }; + const determineTransportStatus = async () => { + if ( + ledgerTransportType === LEDGER_TRANSPORT_TYPES.WEBHID && + webHidConnectedStatus === WEBHID_CONNECTED_STATUSES.CONNECTED && + transportStatus === TRANSPORT_STATES.NONE + ) { + try { + const transportedCreated = await attemptLedgerTransportCreation(); + dispatch( + setLedgerTransportStatus( + transportedCreated + ? TRANSPORT_STATES.VERIFIED + : TRANSPORT_STATES.UNKNOWN_FAILURE, + ), + ); + } catch (e) { + if (e.message.match('Failed to open the device')) { + dispatch( + setLedgerTransportStatus(TRANSPORT_STATES.DEVICE_OPEN_FAILURE), + ); + } else if (e.message.match('the device is already open')) { + dispatch(setLedgerTransportStatus(TRANSPORT_STATES.VERIFIED)); + } else { + dispatch( + setLedgerTransportStatus(TRANSPORT_STATES.UNKNOWN_FAILURE), + ); + } + } + } + }; + determineTransportStatus(); initialConnectedDeviceCheck(); - }, [dispatch, ledgerTransportType, webHidConnectedStatus]); + }, [dispatch, ledgerTransportType, webHidConnectedStatus, transportStatus]); + + useEffect(() => { + return () => { + dispatch(setLedgerTransportStatus(TRANSPORT_STATES.NONE)); + }; + }, [dispatch]); const usingLedgerLive = ledgerTransportType === LEDGER_TRANSPORT_TYPES.LIVE; const usingWebHID = ledgerTransportType === LEDGER_TRANSPORT_TYPES.WEBHID; @@ -104,6 +146,23 @@ export default function LedgerInstructionField({ showDataInstruction }) { `- ${t('ledgerConnectionInstructionStepFour')}`, showDataInstruction, )} + {renderInstructionStep( + + + , + transportStatus === TRANSPORT_STATES.DEVICE_OPEN_FAILURE, + )} {renderInstructionStep(
- -
-
-
- ); - } - - renderNetworkForm() { - const { t } = this.context; - const { viewOnly, isCurrentRpcTarget } = this.props; - const { - networkName, - rpcUrl, - chainId = '', - ticker, - blockExplorerUrl, - } = this.state; - - const deletable = !isCurrentRpcTarget && !viewOnly; - - const isSubmitDisabled = - this.hasErrors() || - this.isSubmitting() || - this.stateIsUnchanged() || - !rpcUrl || - !chainId; - - return ( -
- {this.renderFormTextField({ - className: 'networks-tab__network-form-row', - fieldKey: 'networkName', - textFieldId: 'network-name', - onChange: this.setStateWithValue('networkName'), - value: networkName, - })} - {this.renderFormTextField({ - className: 'networks-tab__network-form-row', - fieldKey: 'rpcUrl', - textFieldId: 'rpc-url', - onChange: this.setStateWithValue('rpcUrl', this.validateUrlRpcUrl), - value: rpcUrl, - })} - {this.renderFormTextField({ - className: 'networks-tab__network-form-row', - fieldKey: 'chainId', - textFieldId: 'chainId', - onChange: this.setStateWithValue( - 'chainId', - this.validateChainIdOnChange.bind(this, rpcUrl), - ), - value: chainId, - tooltipText: viewOnly ? null : t('networkSettingsChainIdDescription'), - })} - {this.renderFormTextField({ - className: 'networks-tab__network-form-row', - fieldKey: 'symbol', - textFieldId: 'network-ticker', - onChange: this.setStateWithValue('ticker'), - value: ticker, - optionalTextFieldKey: 'optionalCurrencySymbol', - })} - {this.renderFormTextField({ - className: 'networks-tab__network-form-row', - fieldKey: 'blockExplorerUrl', - textFieldId: 'block-explorer-url', - onChange: this.setStateWithValue( - 'blockExplorerUrl', - this.validateBlockExplorerURL, - ), - value: blockExplorerUrl, - optionalTextFieldKey: 'optionalBlockExplorerUrl', - })} -
- {!viewOnly && ( - <> - {deletable && ( - - )} - - - - )} -
-
- ); - } - - render() { - const { addNewNetwork } = this.props; - return addNewNetwork - ? this.renderAddNetworkForm() - : this.renderNetworkForm(); - } -} diff --git a/ui/pages/settings/networks-tab/networks-form/index.js b/ui/pages/settings/networks-tab/networks-form/index.js new file mode 100644 index 000000000..b91c8a5e0 --- /dev/null +++ b/ui/pages/settings/networks-tab/networks-form/index.js @@ -0,0 +1 @@ +export { default } from './networks-form'; diff --git a/ui/pages/settings/networks-tab/networks-form/networks-form.js b/ui/pages/settings/networks-tab/networks-form/networks-form.js new file mode 100644 index 000000000..5f73af7e7 --- /dev/null +++ b/ui/pages/settings/networks-tab/networks-form/networks-form.js @@ -0,0 +1,575 @@ +import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { useHistory } from 'react-router-dom'; +import { useDispatch } from 'react-redux'; +import PropTypes from 'prop-types'; +import validUrl from 'valid-url'; +import log from 'loglevel'; +import classnames from 'classnames'; +import { useI18nContext } from '../../../../hooks/useI18nContext'; +import { + isPrefixedFormattedHexString, + isSafeChainId, +} from '../../../../../shared/modules/network.utils'; +import { jsonRpcRequest } from '../../../../../shared/modules/rpc.utils'; +import ActionableMessage from '../../../../components/ui/actionable-message'; +import Button from '../../../../components/ui/button'; +import FormField from '../../../../components/ui/form-field'; +import { decimalToHex } from '../../../../helpers/utils/conversions.util'; +import { + setSelectedSettingsRpcUrl, + updateAndSetCustomRpc, + editRpc, + showModal, + setNewNetworkAdded, +} from '../../../../store/actions'; +import { + DEFAULT_ROUTE, + NETWORKS_ROUTE, +} from '../../../../helpers/constants/routes'; + +/** + * Attempts to convert the given chainId to a decimal string, for display + * purposes. + * + * Should be called with the props chainId whenever it is used to set the + * component's state. + * + * @param {unknown} chainId - The chainId to convert. + * @returns {string} The props chainId in decimal, or the original value if + * it can't be converted. + */ +const getDisplayChainId = (chainId) => { + if (!chainId || typeof chainId !== 'string' || !chainId.startsWith('0x')) { + return chainId; + } + return parseInt(chainId, 16).toString(10); +}; + +/** + * Prefixes a given id with '0x' if the prefix does not exist + * + * @param {string} chainId - The chainId to prefix + * @returns {string} The chainId, prefixed with '0x' + */ +const prefixChainId = (chainId) => { + let prefixedChainId = chainId; + if (!chainId.startsWith('0x')) { + prefixedChainId = `0x${parseInt(chainId, 10).toString(16)}`; + } + return prefixedChainId; +}; + +const isValidWhenAppended = (url) => { + const appendedRpc = `http://${url}`; + return validUrl.isWebUri(appendedRpc) && !url.match(/^https?:\/\/$/u); +}; + +const NetworksForm = ({ + addNewNetwork, + isCurrentRpcTarget, + networksToRender, + selectedNetwork, +}) => { + const t = useI18nContext(); + const history = useHistory(); + const dispatch = useDispatch(); + const { label, labelKey, viewOnly, rpcPrefs } = selectedNetwork; + const selectedNetworkName = label || (labelKey && t(labelKey)); + const [networkName, setNetworkName] = useState(selectedNetworkName || ''); + const [rpcUrl, setRpcUrl] = useState(selectedNetwork?.rpcUrl || ''); + const [chainId, setChainId] = useState(selectedNetwork?.chainId || ''); + const [ticker, setTicker] = useState(selectedNetwork?.ticker || ''); + const [blockExplorerUrl, setBlockExplorerUrl] = useState( + selectedNetwork?.blockExplorerUrl || '', + ); + const [errors, setErrors] = useState({}); + const [isSubmitting, setIsSubmitting] = useState(false); + + const resetForm = useCallback(() => { + setNetworkName(selectedNetworkName || ''); + setRpcUrl(selectedNetwork.rpcUrl); + setChainId(getDisplayChainId(selectedNetwork.chainId)); + setTicker(selectedNetwork?.ticker); + setBlockExplorerUrl(selectedNetwork?.blockExplorerUrl); + setErrors({}); + setIsSubmitting(false); + }, [selectedNetwork, selectedNetworkName]); + + const stateIsUnchanged = () => { + // These added conditions are in case the saved chainId is invalid, which + // was possible in versions <8.1 of the extension. + // Basically, we always want to be able to overwrite an invalid chain ID. + const chainIdIsUnchanged = + typeof selectedNetwork.chainId === 'string' && + selectedNetwork.chainId.toLowerCase().startsWith('0x') && + chainId === getDisplayChainId(selectedNetwork.chainId); + return ( + rpcUrl === selectedNetwork.rpcUrl && + chainIdIsUnchanged && + ticker === selectedNetwork.ticker && + networkName === selectedNetworkName && + blockExplorerUrl === selectedNetwork.blockExplorerUrl + ); + }; + + const prevAddNewNetwork = useRef(); + const prevNetworkName = useRef(); + const prevChainId = useRef(); + const prevRpcUrl = useRef(); + const prevTicker = useRef(); + const prevBlockExplorerUrl = useRef(); + useEffect(() => { + if (!prevAddNewNetwork.current && addNewNetwork) { + setNetworkName(''); + setRpcUrl(''); + setChainId(''); + setTicker(''); + setBlockExplorerUrl(''); + setErrors({}); + setIsSubmitting(false); + } else if ( + prevNetworkName.current !== selectedNetworkName || + prevRpcUrl.current !== selectedNetwork.rpcUrl || + prevChainId.current !== selectedNetwork.chainId || + prevTicker.current !== selectedNetwork.ticker || + prevBlockExplorerUrl.current !== selectedNetwork.blockExplorerUrl + ) { + resetForm(selectedNetwork); + } + }, [ + selectedNetwork, + selectedNetworkName, + addNewNetwork, + setNetworkName, + setRpcUrl, + setChainId, + setTicker, + setBlockExplorerUrl, + setErrors, + setIsSubmitting, + resetForm, + ]); + + useEffect(() => { + return () => { + setNetworkName(''); + setRpcUrl(''); + setChainId(''); + setTicker(''); + setBlockExplorerUrl(''); + setErrors({}); + dispatch(setSelectedSettingsRpcUrl('')); + }; + }, [ + setNetworkName, + setRpcUrl, + setChainId, + setTicker, + setBlockExplorerUrl, + setErrors, + dispatch, + ]); + + const setErrorTo = (errorKey, errorVal) => { + setErrors({ ...errors, [errorKey]: errorVal }); + }; + + const setErrorEmpty = (errorKey) => { + setErrors({ + ...errors, + [errorKey]: { + msg: '', + key: '', + }, + }); + }; + + const hasError = (errorKey, errorKeyVal) => { + return errors[errorKey]?.key === errorKeyVal; + }; + + const hasErrors = () => { + return Object.keys(errors).some((key) => { + const error = errors[key]; + // Do not factor in duplicate chain id error for submission disabling + if (key === 'chainId' && error.key === 'chainIdExistsErrorMsg') { + return false; + } + return error.key && error.msg; + }); + }; + + const validateChainIdOnChange = (chainArg = '') => { + const formChainId = chainArg.trim(); + let errorKey = ''; + let errorMessage = ''; + let radix = 10; + let hexChainId = formChainId; + + if (!hexChainId.startsWith('0x')) { + try { + hexChainId = `0x${decimalToHex(hexChainId)}`; + } catch (err) { + setErrorTo('chainId', { + key: 'invalidHexNumber', + msg: t('invalidHexNumber'), + }); + return; + } + } + + const [matchingChainId] = networksToRender.filter( + (e) => e.chainId === hexChainId && e.rpcUrl !== rpcUrl, + ); + + if (formChainId === '') { + setErrorEmpty('chainId'); + return; + } else if (matchingChainId) { + errorKey = 'chainIdExistsErrorMsg'; + errorMessage = t('chainIdExistsErrorMsg', [ + matchingChainId.label ?? matchingChainId.labelKey, + ]); + } else if (formChainId.startsWith('0x')) { + radix = 16; + if (!/^0x[0-9a-f]+$/iu.test(formChainId)) { + errorKey = 'invalidHexNumber'; + errorMessage = t('invalidHexNumber'); + } else if (!isPrefixedFormattedHexString(formChainId)) { + errorMessage = t('invalidHexNumberLeadingZeros'); + } + } else if (!/^[0-9]+$/u.test(formChainId)) { + errorKey = 'invalidNumber'; + errorMessage = t('invalidNumber'); + } else if (formChainId.startsWith('0')) { + errorKey = 'invalidNumberLeadingZeros'; + errorMessage = t('invalidNumberLeadingZeros'); + } else if (!isSafeChainId(parseInt(formChainId, radix))) { + errorKey = 'invalidChainIdTooBig'; + errorMessage = t('invalidChainIdTooBig'); + } + + setErrorTo('chainId', { + key: errorKey, + msg: errorMessage, + }); + }; + + /** + * Validates the chain ID by checking it against the `eth_chainId` return + * value from the given RPC URL. + * Assumes that all strings are non-empty and correctly formatted. + * + * @param {string} formChainId - Non-empty, hex or decimal number string from + * the form. + * @param {string} parsedChainId - The parsed, hex string chain ID. + * @param {string} formRpcUrl - The RPC URL from the form. + */ + const validateChainIdOnSubmit = async ( + formChainId, + parsedChainId, + formRpcUrl, + ) => { + let errorKey; + let errorMessage; + let endpointChainId; + let providerError; + + try { + endpointChainId = await jsonRpcRequest(formRpcUrl, 'eth_chainId'); + } catch (err) { + log.warn('Failed to fetch the chainId from the endpoint.', err); + providerError = err; + } + + if (providerError || typeof endpointChainId !== 'string') { + errorKey = 'failedToFetchChainId'; + errorMessage = t('failedToFetchChainId'); + } else if (parsedChainId !== endpointChainId) { + // Here, we are in an error state. The endpoint should always return a + // hexadecimal string. If the user entered a decimal string, we attempt + // to convert the endpoint's return value to decimal before rendering it + // in an error message in the form. + if (!formChainId.startsWith('0x')) { + try { + endpointChainId = parseInt(endpointChainId, 16).toString(10); + } catch (err) { + log.warn( + 'Failed to convert endpoint chain ID to decimal', + endpointChainId, + ); + } + } + + errorKey = 'endpointReturnedDifferentChainId'; + errorMessage = t('endpointReturnedDifferentChainId', [ + endpointChainId.length <= 12 + ? endpointChainId + : `${endpointChainId.slice(0, 9)}...`, + ]); + } + + if (errorKey) { + setErrorTo('chainId', { + key: errorKey, + msg: errorMessage, + }); + return false; + } + + setErrorEmpty('chainId'); + return true; + }; + + const validateBlockExplorerURL = (url) => { + if (!validUrl.isWebUri(url) && url !== '') { + let errorKey; + let errorMessage; + + if (isValidWhenAppended(url)) { + errorKey = 'urlErrorMsg'; + errorMessage = t('urlErrorMsg'); + } else { + errorKey = 'invalidBlockExplorerURL'; + errorMessage = t('invalidBlockExplorerURL'); + } + + setErrorTo('blockExplorerUrl', { + key: errorKey, + msg: errorMessage, + }); + } else { + setErrorEmpty('blockExplorerUrl'); + } + }; + + const validateUrlRpcUrl = (url) => { + const isValidUrl = validUrl.isWebUri(url); + const chainIdFetchFailed = hasError('chainId', 'failedToFetchChainId'); + const [matchingRPCUrl] = networksToRender.filter((e) => e.rpcUrl === url); + + if (!isValidUrl && url !== '') { + let errorKey; + let errorMessage; + if (isValidWhenAppended(url)) { + errorKey = 'urlErrorMsg'; + errorMessage = t('urlErrorMsg'); + } else { + errorKey = 'invalidRPC'; + errorMessage = t('invalidRPC'); + } + setErrorTo('rpcUrl', { + key: errorKey, + msg: errorMessage, + }); + } else if (matchingRPCUrl) { + setErrorTo('rpcUrl', { + key: 'urlExistsErrorMsg', + msg: t('urlExistsErrorMsg', [ + matchingRPCUrl.label ?? matchingRPCUrl.labelKey, + ]), + }); + } else { + setErrorEmpty('rpcUrl'); + } + + // Re-validate the chain id if it could not be found with previous rpc url + if (chainId && isValidUrl && chainIdFetchFailed) { + const formChainId = chainId.trim().toLowerCase(); + const prefixedChainId = prefixChainId(formChainId); + validateChainIdOnSubmit(formChainId, prefixedChainId, url); + } + }; + + const onSubmit = async () => { + setIsSubmitting(true); + try { + const formChainId = chainId.trim().toLowerCase(); + const prefixedChainId = prefixChainId(formChainId); + + if ( + !(await validateChainIdOnSubmit(formChainId, prefixedChainId, rpcUrl)) + ) { + setIsSubmitting(false); + return; + } + + // After this point, isSubmitting will be reset in componentDidUpdate + if (selectedNetwork.rpcUrl && rpcUrl !== selectedNetwork.rpcUrl) { + await dispatch( + editRpc( + selectedNetwork.rpcUrl, + rpcUrl, + prefixedChainId, + ticker, + networkName, + { + ...rpcPrefs, + blockExplorerUrl: blockExplorerUrl || rpcPrefs.blockExplorerUrl, + }, + ), + ); + } else { + await dispatch( + updateAndSetCustomRpc(rpcUrl, prefixedChainId, ticker, networkName, { + ...rpcPrefs, + blockExplorerUrl: blockExplorerUrl || rpcPrefs?.blockExplorerUrl, + }), + ); + } + + if (addNewNetwork) { + dispatch(setNewNetworkAdded(networkName)); + history.push(DEFAULT_ROUTE); + } + } catch (error) { + setIsSubmitting(false); + throw error; + } + }; + + const onCancel = () => { + if (addNewNetwork) { + dispatch(setSelectedSettingsRpcUrl('')); + history.push(NETWORKS_ROUTE); + } else { + resetForm(); + } + }; + + const onDelete = () => { + dispatch( + showModal({ + name: 'CONFIRM_DELETE_NETWORK', + target: selectedNetwork.rpcUrl, + onConfirm: () => { + resetForm(); + dispatch(setSelectedSettingsRpcUrl('')); + history.push(NETWORKS_ROUTE); + }, + }), + ); + }; + const deletable = !isCurrentRpcTarget && !viewOnly && !addNewNetwork; + const stateUnchanged = stateIsUnchanged(); + const isSubmitDisabled = + hasErrors() || isSubmitting || stateUnchanged || !rpcUrl || !chainId; + + return ( +
+ {addNewNetwork ? ( + + ) : null} +
+ + { + setRpcUrl(value); + validateUrlRpcUrl(value); + }} + titleText={t('rpcUrl')} + value={rpcUrl} + disabled={viewOnly} + /> + { + setChainId(value); + validateChainIdOnChange(value); + }} + titleText={t('chainId')} + value={chainId} + disabled={viewOnly} + tooltipText={viewOnly ? null : t('networkSettingsChainIdDescription')} + /> + + { + setBlockExplorerUrl(value); + validateBlockExplorerURL(value); + }} + titleText={t('blockExplorerUrl')} + titleUnit={t('optionalWithParanthesis')} + value={blockExplorerUrl} + disabled={viewOnly} + /> +
+
+ {!viewOnly && ( + <> + {deletable && ( + + )} + + + + )} +
+
+ ); +}; + +NetworksForm.propTypes = { + addNewNetwork: PropTypes.bool, + isCurrentRpcTarget: PropTypes.bool, + networksToRender: PropTypes.array.isRequired, + selectedNetwork: PropTypes.object, +}; + +NetworksForm.defaultProps = { + selectedNetwork: {}, +}; + +export default NetworksForm; diff --git a/ui/pages/settings/networks-tab/network-form/network-form.component.test.js b/ui/pages/settings/networks-tab/networks-form/networks-form.test.js similarity index 51% rename from ui/pages/settings/networks-tab/network-form/network-form.component.test.js rename to ui/pages/settings/networks-tab/networks-form/networks-form.test.js index cbe5fc225..611716f02 100644 --- a/ui/pages/settings/networks-tab/network-form/network-form.component.test.js +++ b/ui/pages/settings/networks-tab/networks-form/networks-form.test.js @@ -3,11 +3,11 @@ import configureMockStore from 'redux-mock-store'; import { fireEvent } from '@testing-library/react'; import { renderWithProvider } from '../../../../../test/jest/rendering'; import { defaultNetworksData } from '../networks-tab.constants'; -import NetworkForm from '.'; +import NetworksForm from '.'; const renderComponent = (props) => { const store = configureMockStore([])({ metamask: {} }); - return renderWithProvider(, store); + return renderWithProvider(, store); }; const defaultNetworks = defaultNetworksData.map((network) => ({ @@ -16,41 +16,39 @@ const defaultNetworks = defaultNetworksData.map((network) => ({ })); const propNewNetwork = { - onClear: () => undefined, - setRpcTarget: () => undefined, networksToRender: defaultNetworks, - onAddNetwork: () => undefined, - setNewNetworkAdded: () => undefined, addNewNetwork: true, }; const propNetworkDisplay = { - editRpc: () => undefined, - showConfirmDeleteNetworkModal: () => undefined, - rpcUrl: 'http://localhost:8545', - chainId: '1337', - ticker: 'ETH', - viewOnly: false, - networkName: 'LocalHost', - onClear: () => undefined, - setRpcTarget: () => undefined, + selectedNetwork: { + rpcUrl: 'http://localhost:8545', + chainId: '1337', + ticker: 'ETH', + label: 'LocalHost', + blockExplorerUrl: '', + viewOnly: false, + rpcPrefs: {}, + }, isCurrentRpcTarget: false, - blockExplorerUrl: '', - rpcPrefs: {}, networksToRender: defaultNetworks, - onAddNetwork: () => undefined, - setNewNetworkAdded: () => undefined, addNewNetwork: false, }; describe('NetworkForm Component', () => { it('should render Add new network form correctly', () => { - const { queryByText } = renderComponent(propNewNetwork); + const { queryByText, queryAllByText } = renderComponent(propNewNetwork); + expect( + queryByText( + 'A malicious network provider can lie about the state of the blockchain and record your network activity. Only add custom networks you trust.', + ), + ).toBeInTheDocument(); expect(queryByText('Network Name')).toBeInTheDocument(); expect(queryByText('New RPC URL')).toBeInTheDocument(); expect(queryByText('Chain ID')).toBeInTheDocument(); - expect(queryByText('Currency Symbol (optional)')).toBeInTheDocument(); - expect(queryByText('Block Explorer URL (optional)')).toBeInTheDocument(); + expect(queryByText('Currency Symbol')).toBeInTheDocument(); + expect(queryByText('Block Explorer URL')).toBeInTheDocument(); + expect(queryAllByText('(Optional)')).toHaveLength(2); expect(queryByText('Cancel')).toBeInTheDocument(); expect(queryByText('Save')).toBeInTheDocument(); }); @@ -62,35 +60,50 @@ describe('NetworkForm Component', () => { expect(queryByText('Network Name')).toBeInTheDocument(); expect(queryByText('New RPC URL')).toBeInTheDocument(); expect(queryByText('Chain ID')).toBeInTheDocument(); - expect(queryByText('Currency Symbol (optional)')).toBeInTheDocument(); - expect(queryByText('Block Explorer URL (optional)')).toBeInTheDocument(); + expect(queryByText('Currency Symbol')).toBeInTheDocument(); + expect(queryByText('Block Explorer URL')).toBeInTheDocument(); expect(queryByText('Delete')).toBeInTheDocument(); expect(queryByText('Cancel')).toBeInTheDocument(); expect(queryByText('Save')).toBeInTheDocument(); expect( - getByDisplayValue(propNetworkDisplay.networkName), + getByDisplayValue(propNetworkDisplay.selectedNetwork.label), + ).toBeInTheDocument(); + expect( + getByDisplayValue(propNetworkDisplay.selectedNetwork.rpcUrl), + ).toBeInTheDocument(); + expect( + getByDisplayValue(propNetworkDisplay.selectedNetwork.chainId), ).toBeInTheDocument(); - expect(getByDisplayValue(propNetworkDisplay.rpcUrl)).toBeInTheDocument(); - expect(getByDisplayValue(propNetworkDisplay.chainId)).toBeInTheDocument(); - expect(getByDisplayValue(propNetworkDisplay.ticker)).toBeInTheDocument(); expect( - getByDisplayValue(propNetworkDisplay.blockExplorerUrl), + getByDisplayValue(propNetworkDisplay.selectedNetwork.ticker), ).toBeInTheDocument(); - fireEvent.change(getByDisplayValue(propNetworkDisplay.networkName), { - target: { value: 'LocalHost 8545' }, - }); + expect( + getByDisplayValue(propNetworkDisplay.selectedNetwork.blockExplorerUrl), + ).toBeInTheDocument(); + fireEvent.change( + getByDisplayValue(propNetworkDisplay.selectedNetwork.label), + { + target: { value: 'LocalHost 8545' }, + }, + ); expect(getByDisplayValue('LocalHost 8545')).toBeInTheDocument(); - fireEvent.change(getByDisplayValue(propNetworkDisplay.chainId), { - target: { value: '1' }, - }); + fireEvent.change( + getByDisplayValue(propNetworkDisplay.selectedNetwork.chainId), + { + target: { value: '1' }, + }, + ); expect( queryByText('This Chain ID is currently used by the mainnet network.'), ).toBeInTheDocument(); - fireEvent.change(getByDisplayValue(propNetworkDisplay.rpcUrl), { - target: { value: 'test' }, - }); + fireEvent.change( + getByDisplayValue(propNetworkDisplay.selectedNetwork.rpcUrl), + { + target: { value: 'test' }, + }, + ); expect( queryByText('URLs require the appropriate HTTP/HTTPS prefix.'), ).toBeInTheDocument(); diff --git a/ui/pages/settings/networks-tab/networks-list-item/index.js b/ui/pages/settings/networks-tab/networks-list-item/index.js new file mode 100644 index 000000000..e4911213c --- /dev/null +++ b/ui/pages/settings/networks-tab/networks-list-item/index.js @@ -0,0 +1 @@ +export { default } from './networks-list-item'; diff --git a/ui/pages/settings/networks-tab/networks-list-item/networks-list-item.js b/ui/pages/settings/networks-tab/networks-list-item/networks-list-item.js new file mode 100644 index 000000000..378afe584 --- /dev/null +++ b/ui/pages/settings/networks-tab/networks-list-item/networks-list-item.js @@ -0,0 +1,81 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; +import { useDispatch, useSelector } from 'react-redux'; +import { useHistory } from 'react-router-dom'; +import { useI18nContext } from '../../../../hooks/useI18nContext'; +import { NETWORK_TYPE_RPC } from '../../../../../shared/constants/network'; +import { SIZES } from '../../../../helpers/constants/design-system'; +import ColorIndicator from '../../../../components/ui/color-indicator'; +import LockIcon from '../../../../components/ui/lock-icon'; +import { NETWORKS_FORM_ROUTE } from '../../../../helpers/constants/routes'; +import { setSelectedSettingsRpcUrl } from '../../../../store/actions'; +import { getEnvironmentType } from '../../../../../app/scripts/lib/util'; +import { ENVIRONMENT_TYPE_FULLSCREEN } from '../../../../../shared/constants/app'; +import { getProvider } from '../../../../selectors'; + +const NetworksListItem = ({ network, networkIsSelected, selectedRpcUrl }) => { + const t = useI18nContext(); + const history = useHistory(); + const dispatch = useDispatch(); + const environmentType = getEnvironmentType(); + const isFullScreen = environmentType === ENVIRONMENT_TYPE_FULLSCREEN; + const provider = useSelector(getProvider); + const { + label, + labelKey, + rpcUrl, + providerType: currentProviderType, + } = network; + + const listItemNetworkIsSelected = selectedRpcUrl && selectedRpcUrl === rpcUrl; + const listItemUrlIsProviderUrl = rpcUrl === provider.rpcUrl; + const listItemTypeIsProviderNonRpcType = + provider.type !== NETWORK_TYPE_RPC && currentProviderType === provider.type; + const listItemNetworkIsCurrentProvider = + !networkIsSelected && + (listItemUrlIsProviderUrl || listItemTypeIsProviderNonRpcType); + const displayNetworkListItemAsSelected = + listItemNetworkIsSelected || listItemNetworkIsCurrentProvider; + + return ( +
{ + dispatch(setSelectedSettingsRpcUrl(rpcUrl)); + if (!isFullScreen) { + history.push(NETWORKS_FORM_ROUTE); + } + }} + > + +
+ {label || t(labelKey)} + {currentProviderType !== NETWORK_TYPE_RPC && ( + + )} +
+
+
+ ); +}; + +NetworksListItem.propTypes = { + network: PropTypes.object.isRequired, + networkIsSelected: PropTypes.bool, + selectedRpcUrl: PropTypes.string, +}; + +export default NetworksListItem; diff --git a/ui/pages/settings/networks-tab/networks-list-item/networks-list-item.test.js b/ui/pages/settings/networks-tab/networks-list-item/networks-list-item.test.js new file mode 100644 index 000000000..975a86458 --- /dev/null +++ b/ui/pages/settings/networks-tab/networks-list-item/networks-list-item.test.js @@ -0,0 +1,51 @@ +import React from 'react'; +import configureMockStore from 'redux-mock-store'; +import { renderWithProvider } from '../../../../../test/jest/rendering'; +import { defaultNetworksData } from '../networks-tab.constants'; +import NetworksListItem from '.'; + +const mockState = { + metamask: { + provider: { + chainId: '0x4', + nickname: '', + rpcPrefs: {}, + rpcUrl: 'https://rinkeby.infura.io/v3/undefined', + ticker: 'ETH', + type: 'rinkeby', + }, + }, +}; + +const renderComponent = (props) => { + const store = configureMockStore([])(mockState); + return renderWithProvider(, store); +}; + +const defaultNetworks = defaultNetworksData.map((network) => ({ + ...network, + viewOnly: true, +})); + +const MainnetProps = { + network: defaultNetworks[0], + networkIsSelected: false, + selectedRpcUrl: 'http://localhost:8545', +}; +const testNetProps = { + network: defaultNetworks[1], + networkIsSelected: false, + selectedRpcUrl: 'http://localhost:8545', +}; + +describe('NetworksListItem Component', () => { + it('should render a Mainnet network item correctly', () => { + const { queryByText } = renderComponent(MainnetProps); + expect(queryByText('Ethereum Mainnet')).toBeInTheDocument(); + }); + + it('should render a test network item correctly', () => { + const { queryByText } = renderComponent(testNetProps); + expect(queryByText('Ropsten Test Network')).toBeInTheDocument(); + }); +}); diff --git a/ui/pages/settings/networks-tab/networks-list/index.js b/ui/pages/settings/networks-tab/networks-list/index.js new file mode 100644 index 000000000..bc1690fac --- /dev/null +++ b/ui/pages/settings/networks-tab/networks-list/index.js @@ -0,0 +1 @@ +export { default } from './networks-list'; diff --git a/ui/pages/settings/networks-tab/networks-list/networks-list.js b/ui/pages/settings/networks-tab/networks-list/networks-list.js new file mode 100644 index 000000000..26be55938 --- /dev/null +++ b/ui/pages/settings/networks-tab/networks-list/networks-list.js @@ -0,0 +1,38 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; +import NetworksListItem from '../networks-list-item'; + +const NetworksList = ({ + networkIsSelected, + networksToRender, + networkDefaultedToProvider, + selectedRpcUrl, +}) => { + return ( +
+ {networksToRender.map((network) => ( + + ))} +
+ ); +}; + +NetworksList.propTypes = { + networkDefaultedToProvider: PropTypes.bool, + networkIsSelected: PropTypes.bool, + networksToRender: PropTypes.arrayOf(PropTypes.object).isRequired, + selectedRpcUrl: PropTypes.string, +}; + +export default NetworksList; diff --git a/ui/pages/settings/networks-tab/networks-list/networks-list.test.js b/ui/pages/settings/networks-tab/networks-list/networks-list.test.js new file mode 100644 index 000000000..fcb04e7be --- /dev/null +++ b/ui/pages/settings/networks-tab/networks-list/networks-list.test.js @@ -0,0 +1,47 @@ +import React from 'react'; +import configureMockStore from 'redux-mock-store'; +import { renderWithProvider } from '../../../../../test/jest/rendering'; +import { defaultNetworksData } from '../networks-tab.constants'; +import NetworksList from '.'; + +const mockState = { + metamask: { + provider: { + chainId: '0x4', + nickname: '', + rpcPrefs: {}, + rpcUrl: 'https://rinkeby.infura.io/v3/undefined', + ticker: 'ETH', + type: 'rinkeby', + }, + }, +}; + +const renderComponent = (props) => { + const store = configureMockStore([])(mockState); + return renderWithProvider(, store); +}; + +const defaultNetworks = defaultNetworksData.map((network) => ({ + ...network, + viewOnly: true, +})); + +const props = { + networkDefaultedToProvider: false, + networkIsSelected: false, + networksToRender: defaultNetworks, + selectedRpcUrl: 'http://localhost:8545', +}; + +describe('NetworksList Component', () => { + it('should render a list of networks correctly', () => { + const { queryByText } = renderComponent(props); + + expect(queryByText('Ethereum Mainnet')).toBeInTheDocument(); + expect(queryByText('Ropsten Test Network')).toBeInTheDocument(); + expect(queryByText('Rinkeby Test Network')).toBeInTheDocument(); + expect(queryByText('Goerli Test Network')).toBeInTheDocument(); + expect(queryByText('Kovan Test Network')).toBeInTheDocument(); + }); +}); diff --git a/ui/pages/settings/networks-tab/networks-tab-content/index.js b/ui/pages/settings/networks-tab/networks-tab-content/index.js new file mode 100644 index 000000000..960698aac --- /dev/null +++ b/ui/pages/settings/networks-tab/networks-tab-content/index.js @@ -0,0 +1 @@ +export { default } from './networks-tab-content'; diff --git a/ui/pages/settings/networks-tab/networks-tab-content/networks-tab-content.js b/ui/pages/settings/networks-tab/networks-tab-content/networks-tab-content.js new file mode 100644 index 000000000..313bc0ff5 --- /dev/null +++ b/ui/pages/settings/networks-tab/networks-tab-content/networks-tab-content.js @@ -0,0 +1,43 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { useSelector } from 'react-redux'; +import NetworksForm from '../networks-form'; +import NetworksList from '../networks-list'; +import { getProvider } from '../../../../selectors'; + +const NetworksTabContent = ({ + networkDefaultedToProvider, + networkIsSelected, + networksToRender, + selectedNetwork, + shouldRenderNetworkForm, +}) => { + const provider = useSelector(getProvider); + + return ( + <> + + {shouldRenderNetworkForm ? ( + + ) : null} + + ); +}; +NetworksTabContent.propTypes = { + networkDefaultedToProvider: PropTypes.bool, + networkIsSelected: PropTypes.bool, + networksToRender: PropTypes.arrayOf(PropTypes.object).isRequired, + selectedNetwork: PropTypes.object, + shouldRenderNetworkForm: PropTypes.bool.isRequired, +}; + +export default NetworksTabContent; diff --git a/ui/pages/settings/networks-tab/networks-tab-content/networks-tab-content.test.js b/ui/pages/settings/networks-tab/networks-tab-content/networks-tab-content.test.js new file mode 100644 index 000000000..7239b744a --- /dev/null +++ b/ui/pages/settings/networks-tab/networks-tab-content/networks-tab-content.test.js @@ -0,0 +1,92 @@ +import React from 'react'; +import configureMockStore from 'redux-mock-store'; +import { fireEvent } from '@testing-library/react'; +import { renderWithProvider } from '../../../../../test/jest/rendering'; +import { defaultNetworksData } from '../networks-tab.constants'; +import NetworksTabContent from '.'; + +const mockState = { + metamask: { + provider: { + chainId: '0x539', + nickname: '', + rpcPrefs: {}, + rpcUrl: 'http://localhost:8545', + ticker: 'ETH', + type: 'localhost', + }, + }, +}; + +const renderComponent = (props) => { + const store = configureMockStore([])(mockState); + return renderWithProvider(, store); +}; + +const defaultNetworks = defaultNetworksData.map((network) => ({ + ...network, + viewOnly: true, +})); + +const props = { + networkDefaultedToProvider: false, + networkIsSelected: true, + networksToRender: defaultNetworks, + selectedNetwork: { + rpcUrl: 'http://localhost:8545', + chainId: '1337', + ticker: 'ETH', + label: 'LocalHost', + blockExplorerUrl: '', + viewOnly: false, + rpcPrefs: {}, + }, + shouldRenderNetworkForm: true, +}; + +describe('NetworksTabContent Component', () => { + it('should render networks tab content correctly', () => { + const { queryByText, getByDisplayValue } = renderComponent(props); + + expect(queryByText('Ethereum Mainnet')).toBeInTheDocument(); + expect(queryByText('Ropsten Test Network')).toBeInTheDocument(); + expect(queryByText('Rinkeby Test Network')).toBeInTheDocument(); + expect(queryByText('Goerli Test Network')).toBeInTheDocument(); + expect(queryByText('Kovan Test Network')).toBeInTheDocument(); + + expect(queryByText('Network Name')).toBeInTheDocument(); + expect(queryByText('New RPC URL')).toBeInTheDocument(); + expect(queryByText('Chain ID')).toBeInTheDocument(); + expect(queryByText('Currency Symbol')).toBeInTheDocument(); + expect(queryByText('Block Explorer URL')).toBeInTheDocument(); + expect(queryByText('Cancel')).toBeInTheDocument(); + expect(queryByText('Save')).toBeInTheDocument(); + + expect(getByDisplayValue(props.selectedNetwork.label)).toBeInTheDocument(); + expect(getByDisplayValue(props.selectedNetwork.rpcUrl)).toBeInTheDocument(); + expect( + getByDisplayValue(props.selectedNetwork.chainId), + ).toBeInTheDocument(); + expect(getByDisplayValue(props.selectedNetwork.ticker)).toBeInTheDocument(); + expect( + getByDisplayValue(props.selectedNetwork.blockExplorerUrl), + ).toBeInTheDocument(); + fireEvent.change(getByDisplayValue(props.selectedNetwork.label), { + target: { value: 'LocalHost 8545' }, + }); + expect(getByDisplayValue('LocalHost 8545')).toBeInTheDocument(); + fireEvent.change(getByDisplayValue(props.selectedNetwork.chainId), { + target: { value: '1' }, + }); + expect( + queryByText('This Chain ID is currently used by the mainnet network.'), + ).toBeInTheDocument(); + + fireEvent.change(getByDisplayValue(props.selectedNetwork.rpcUrl), { + target: { value: 'test' }, + }); + expect( + queryByText('URLs require the appropriate HTTP/HTTPS prefix.'), + ).toBeInTheDocument(); + }); +}); diff --git a/ui/pages/settings/networks-tab/networks-tab-subheader/index.js b/ui/pages/settings/networks-tab/networks-tab-subheader/index.js new file mode 100644 index 000000000..a097baaa1 --- /dev/null +++ b/ui/pages/settings/networks-tab/networks-tab-subheader/index.js @@ -0,0 +1 @@ +export { default } from './networks-tab-subheader'; diff --git a/ui/pages/settings/networks-tab/networks-tab-subheader/networks-tab-subheader.js b/ui/pages/settings/networks-tab/networks-tab-subheader/networks-tab-subheader.js new file mode 100644 index 000000000..1420e3082 --- /dev/null +++ b/ui/pages/settings/networks-tab/networks-tab-subheader/networks-tab-subheader.js @@ -0,0 +1,39 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { useHistory } from 'react-router-dom'; +import { useI18nContext } from '../../../../hooks/useI18nContext'; +import { ADD_NETWORK_ROUTE } from '../../../../helpers/constants/routes'; +import Button from '../../../../components/ui/button'; + +const NetworksFormSubheader = ({ addNewNetwork }) => { + const t = useI18nContext(); + const history = useHistory(); + return addNewNetwork ? ( +
+ {t('networks')} + {' > '} +
{t('addANetwork')}
+
+ ) : ( +
+ {t('networks')} +
+ +
+
+ ); +}; + +NetworksFormSubheader.propTypes = { + addNewNetwork: PropTypes.bool.isRequired, +}; + +export default NetworksFormSubheader; diff --git a/ui/pages/settings/networks-tab/networks-tab-subheader/networks-tab-subheader.test.js b/ui/pages/settings/networks-tab/networks-tab-subheader/networks-tab-subheader.test.js new file mode 100644 index 000000000..099261049 --- /dev/null +++ b/ui/pages/settings/networks-tab/networks-tab-subheader/networks-tab-subheader.test.js @@ -0,0 +1,46 @@ +import React from 'react'; +import configureMockStore from 'redux-mock-store'; +import { renderWithProvider } from '../../../../../test/jest/rendering'; +import NetworksTabSubheader from '.'; + +const mockState = { + metamask: { + provider: { + chainId: '0x539', + nickname: '', + rpcPrefs: {}, + rpcUrl: 'http://localhost:8545', + ticker: 'ETH', + type: 'localhost', + }, + frequentRpcListDetail: [], + }, + appState: { + networksTabSelectedRpcUrl: 'http://localhost:8545', + }, +}; + +const renderComponent = (props) => { + const store = configureMockStore([])(mockState); + return renderWithProvider(, store); +}; + +describe('NetworksTabSubheader Component', () => { + it('should render network subheader correctly', () => { + const { queryByText, getByRole } = renderComponent({ + addNewNetwork: false, + }); + + expect(queryByText('Networks')).toBeInTheDocument(); + expect(queryByText('Add a network')).toBeInTheDocument(); + expect(getByRole('button', { text: 'Add a network' })).toBeDefined(); + }); + it('should render add network form subheader correctly', () => { + const { queryByText } = renderComponent({ + addNewNetwork: true, + }); + expect(queryByText('Networks')).toBeInTheDocument(); + expect(queryByText('>')).toBeInTheDocument(); + expect(queryByText('Add a network')).toBeInTheDocument(); + }); +}); diff --git a/ui/pages/settings/networks-tab/networks-tab.component.js b/ui/pages/settings/networks-tab/networks-tab.component.js deleted file mode 100644 index 6a9c9bc17..000000000 --- a/ui/pages/settings/networks-tab/networks-tab.component.js +++ /dev/null @@ -1,259 +0,0 @@ -import React, { PureComponent } from 'react'; -import PropTypes from 'prop-types'; -import classnames from 'classnames'; -import { NETWORK_TYPE_RPC } from '../../../../shared/constants/network'; -import Button from '../../../components/ui/button'; -import LockIcon from '../../../components/ui/lock-icon'; -import { - NETWORKS_ROUTE, - NETWORKS_FORM_ROUTE, - DEFAULT_ROUTE, - ADD_NETWORK_ROUTE, -} from '../../../helpers/constants/routes'; -import ColorIndicator from '../../../components/ui/color-indicator'; -import { SIZES } from '../../../helpers/constants/design-system'; -import NetworkForm from './network-form'; - -export default class NetworksTab extends PureComponent { - static contextTypes = { - t: PropTypes.func.isRequired, - metricsEvent: PropTypes.func.isRequired, - }; - - static propTypes = { - editRpc: PropTypes.func.isRequired, - location: PropTypes.object.isRequired, - networkIsSelected: PropTypes.bool, - networksToRender: PropTypes.arrayOf(PropTypes.object).isRequired, - selectedNetwork: PropTypes.object, - setRpcTarget: PropTypes.func.isRequired, - setSelectedSettingsRpcUrl: PropTypes.func.isRequired, - showConfirmDeleteNetworkModal: PropTypes.func.isRequired, - providerUrl: PropTypes.string, - providerType: PropTypes.string, - networkDefaultedToProvider: PropTypes.bool, - history: PropTypes.object.isRequired, - shouldRenderNetworkForm: PropTypes.bool.isRequired, - isFullScreen: PropTypes.bool.isRequired, - setNewNetworkAdded: PropTypes.func.isRequired, - addNewNetwork: PropTypes.bool, - }; - - componentWillUnmount() { - this.props.setSelectedSettingsRpcUrl(''); - } - - isCurrentPath(pathname) { - return this.props.location.pathname === pathname; - } - - renderSubHeader() { - const { history } = this.props; - - return ( -
- - {this.context.t('networks')} - -
- -
-
- ); - } - - renderNetworkListItem(network, selectRpcUrl) { - const { - setSelectedSettingsRpcUrl, - networkIsSelected, - providerUrl, - providerType, - history, - isFullScreen, - } = this.props; - const { - label, - labelKey, - rpcUrl, - providerType: currentProviderType, - } = network; - - const listItemNetworkIsSelected = selectRpcUrl && selectRpcUrl === rpcUrl; - const listItemUrlIsProviderUrl = rpcUrl === providerUrl; - const listItemTypeIsProviderNonRpcType = - providerType !== NETWORK_TYPE_RPC && currentProviderType === providerType; - const listItemNetworkIsCurrentProvider = - !networkIsSelected && - (listItemUrlIsProviderUrl || listItemTypeIsProviderNonRpcType); - const displayNetworkListItemAsSelected = - listItemNetworkIsSelected || listItemNetworkIsCurrentProvider; - - return ( -
{ - setSelectedSettingsRpcUrl(rpcUrl); - if (!isFullScreen) { - history.push(NETWORKS_FORM_ROUTE); - } - }} - > - -
- {label || this.context.t(labelKey)} - {currentProviderType !== NETWORK_TYPE_RPC && ( - - )} -
-
-
- ); - } - - renderNetworksList() { - const { - networksToRender, - selectedNetwork, - networkIsSelected, - networkDefaultedToProvider, - } = this.props; - - return ( -
- {networksToRender.map((network) => - this.renderNetworkListItem(network, selectedNetwork.rpcUrl), - )} -
- ); - } - - renderNetworksTabContent() { - const { t } = this.context; - const { - setRpcTarget, - showConfirmDeleteNetworkModal, - setSelectedSettingsRpcUrl, - selectedNetwork: { - labelKey, - label, - rpcUrl, - chainId, - ticker, - viewOnly, - rpcPrefs, - blockExplorerUrl, - }, - editRpc, - providerUrl, - networksToRender, - history, - isFullScreen, - shouldRenderNetworkForm, - } = this.props; - - return ( - <> - {this.renderNetworksList()} - {shouldRenderNetworkForm ? ( - { - setSelectedSettingsRpcUrl(''); - if (shouldUpdateHistory) { - history.push(NETWORKS_ROUTE); - } - }} - showConfirmDeleteNetworkModal={showConfirmDeleteNetworkModal} - viewOnly={viewOnly} - isCurrentRpcTarget={providerUrl === rpcUrl} - rpcPrefs={rpcPrefs} - blockExplorerUrl={blockExplorerUrl} - isFullScreen={isFullScreen} - /> - ) : null} - - ); - } - - render() { - const { - history, - isFullScreen, - shouldRenderNetworkForm, - setRpcTarget, - networksToRender, - setNewNetworkAdded, - selectedNetwork: { rpcPrefs }, - addNewNetwork, - } = this.props; - return addNewNetwork ? ( - { - if (shouldUpdateHistory) { - history.push(NETWORKS_ROUTE); - } - }} - onAddNetwork={() => { - history.push(DEFAULT_ROUTE); - }} - rpcPrefs={rpcPrefs} - networksToRender={networksToRender} - setNewNetworkAdded={setNewNetworkAdded} - addNewNetwork={addNewNetwork} - /> - ) : ( -
- {isFullScreen ? this.renderSubHeader() : null} -
- {this.renderNetworksTabContent()} - {!isFullScreen && !shouldRenderNetworkForm ? ( -
- -
- ) : null} -
-
- ); - } -} diff --git a/ui/pages/settings/networks-tab/networks-tab.container.js b/ui/pages/settings/networks-tab/networks-tab.container.js deleted file mode 100644 index 7aaf5b55f..000000000 --- a/ui/pages/settings/networks-tab/networks-tab.container.js +++ /dev/null @@ -1,117 +0,0 @@ -import { compose } from 'redux'; -import { connect } from 'react-redux'; -import { withRouter } from 'react-router-dom'; -import { - setSelectedSettingsRpcUrl, - updateAndSetCustomRpc, - displayWarning, - editRpc, - showModal, - setNewNetworkAdded, -} from '../../../store/actions'; -import { - ADD_NETWORK_ROUTE, - NETWORKS_FORM_ROUTE, -} from '../../../helpers/constants/routes'; -import { ENVIRONMENT_TYPE_FULLSCREEN } from '../../../../shared/constants/app'; -import { NETWORK_TYPE_RPC } from '../../../../shared/constants/network'; -import { getEnvironmentType } from '../../../../app/scripts/lib/util'; -import NetworksTab from './networks-tab.component'; -import { defaultNetworksData } from './networks-tab.constants'; - -const defaultNetworks = defaultNetworksData.map((network) => ({ - ...network, - viewOnly: true, -})); - -const mapStateToProps = (state, ownProps) => { - const { - location: { pathname }, - } = ownProps; - - const environmentType = getEnvironmentType(); - const isFullScreen = environmentType === ENVIRONMENT_TYPE_FULLSCREEN; - const shouldRenderNetworkForm = - isFullScreen || Boolean(pathname.match(NETWORKS_FORM_ROUTE)); - const addNewNetwork = Boolean(pathname.match(ADD_NETWORK_ROUTE)); - - const { frequentRpcListDetail, provider } = state.metamask; - const { networksTabSelectedRpcUrl } = state.appState; - const frequentRpcNetworkListDetails = frequentRpcListDetail.map((rpc) => { - return { - label: rpc.nickname, - iconColor: '#6A737D', - providerType: NETWORK_TYPE_RPC, - rpcUrl: rpc.rpcUrl, - chainId: rpc.chainId, - ticker: rpc.ticker, - blockExplorerUrl: rpc.rpcPrefs?.blockExplorerUrl || '', - }; - }); - - const networksToRender = [ - ...defaultNetworks, - ...frequentRpcNetworkListDetails, - ]; - let selectedNetwork = - networksToRender.find( - (network) => network.rpcUrl === networksTabSelectedRpcUrl, - ) || {}; - const networkIsSelected = Boolean(selectedNetwork.rpcUrl); - - let networkDefaultedToProvider = false; - if (!networkIsSelected) { - selectedNetwork = - networksToRender.find((network) => { - return ( - network.rpcUrl === provider.rpcUrl || - (network.providerType !== NETWORK_TYPE_RPC && - network.providerType === provider.type) - ); - }) || {}; - networkDefaultedToProvider = true; - } - - return { - selectedNetwork, - networksToRender, - networkIsSelected, - providerType: provider.type, - providerUrl: provider.rpcUrl, - networkDefaultedToProvider, - isFullScreen, - shouldRenderNetworkForm, - addNewNetwork, - }; -}; - -const mapDispatchToProps = (dispatch) => { - return { - setSelectedSettingsRpcUrl: (newRpcUrl) => - dispatch(setSelectedSettingsRpcUrl(newRpcUrl)), - setRpcTarget: (newRpc, chainId, ticker, nickname, rpcPrefs) => { - return dispatch( - updateAndSetCustomRpc(newRpc, chainId, ticker, nickname, rpcPrefs), - ); - }, - showConfirmDeleteNetworkModal: ({ target, onConfirm }) => { - return dispatch( - showModal({ name: 'CONFIRM_DELETE_NETWORK', target, onConfirm }), - ); - }, - displayWarning: (warning) => dispatch(displayWarning(warning)), - editRpc: (oldRpc, newRpc, chainId, ticker, nickname, rpcPrefs) => { - return dispatch( - editRpc(oldRpc, newRpc, chainId, ticker, nickname, rpcPrefs), - ); - }, - setNewNetworkAdded: (newNetwork) => { - dispatch(setNewNetworkAdded(newNetwork)); - }, - }; -}; - -export default compose( - withRouter, - connect(mapStateToProps, mapDispatchToProps), -)(NetworksTab); diff --git a/ui/pages/settings/networks-tab/networks-tab.js b/ui/pages/settings/networks-tab/networks-tab.js new file mode 100644 index 000000000..fed8adea5 --- /dev/null +++ b/ui/pages/settings/networks-tab/networks-tab.js @@ -0,0 +1,129 @@ +import React, { useEffect } from 'react'; +import PropTypes from 'prop-types'; +import { useLocation } from 'react-router-dom'; +import { useDispatch, useSelector } from 'react-redux'; +import { useI18nContext } from '../../../hooks/useI18nContext'; +import { + ADD_NETWORK_ROUTE, + NETWORKS_FORM_ROUTE, +} from '../../../helpers/constants/routes'; +import { setSelectedSettingsRpcUrl } from '../../../store/actions'; +import Button from '../../../components/ui/button'; +import { getEnvironmentType } from '../../../../app/scripts/lib/util'; +import { ENVIRONMENT_TYPE_FULLSCREEN } from '../../../../shared/constants/app'; +import { + getFrequentRpcListDetail, + getNetworksTabSelectedRpcUrl, + getProvider, +} from '../../../selectors'; +import { NETWORK_TYPE_RPC } from '../../../../shared/constants/network'; +import { defaultNetworksData } from './networks-tab.constants'; +import NetworksTabContent from './networks-tab-content'; +import NetworksForm from './networks-form'; +import NetworksFormSubheader from './networks-tab-subheader'; + +const defaultNetworks = defaultNetworksData.map((network) => ({ + ...network, + viewOnly: true, +})); + +const NetworksTab = ({ addNewNetwork }) => { + const t = useI18nContext(); + const dispatch = useDispatch(); + const { pathname } = useLocation(); + + const environmentType = getEnvironmentType(); + const isFullScreen = environmentType === ENVIRONMENT_TYPE_FULLSCREEN; + const shouldRenderNetworkForm = + isFullScreen || Boolean(pathname.match(NETWORKS_FORM_ROUTE)); + + const frequentRpcListDetail = useSelector(getFrequentRpcListDetail); + const provider = useSelector(getProvider); + const networksTabSelectedRpcUrl = useSelector(getNetworksTabSelectedRpcUrl); + + const frequentRpcNetworkListDetails = frequentRpcListDetail.map((rpc) => { + return { + label: rpc.nickname, + iconColor: '#6A737D', + providerType: NETWORK_TYPE_RPC, + rpcUrl: rpc.rpcUrl, + chainId: rpc.chainId, + ticker: rpc.ticker, + blockExplorerUrl: rpc.rpcPrefs?.blockExplorerUrl || '', + }; + }); + + const networksToRender = [ + ...defaultNetworks, + ...frequentRpcNetworkListDetails, + ]; + let selectedNetwork = + networksToRender.find( + (network) => network.rpcUrl === networksTabSelectedRpcUrl, + ) || {}; + const networkIsSelected = Boolean(selectedNetwork.rpcUrl); + + let networkDefaultedToProvider = false; + if (!networkIsSelected) { + selectedNetwork = + networksToRender.find((network) => { + return ( + network.rpcUrl === provider.rpcUrl || + (network.providerType !== NETWORK_TYPE_RPC && + network.providerType === provider.type) + ); + }) || {}; + networkDefaultedToProvider = true; + } + + useEffect(() => { + return () => { + dispatch(setSelectedSettingsRpcUrl('')); + }; + }, [dispatch]); + + return ( +
+ {isFullScreen ? ( + + ) : null} +
+ {addNewNetwork ? ( + + ) : ( + <> + + {!isFullScreen && !shouldRenderNetworkForm ? ( +
+ +
+ ) : null} + + )} +
+
+ ); +}; + +NetworksTab.propTypes = { + addNewNetwork: PropTypes.bool, +}; +export default NetworksTab; diff --git a/ui/pages/settings/networks-tab/networks-tab.test.js b/ui/pages/settings/networks-tab/networks-tab.test.js new file mode 100644 index 000000000..2c5d96002 --- /dev/null +++ b/ui/pages/settings/networks-tab/networks-tab.test.js @@ -0,0 +1,53 @@ +import React from 'react'; +import configureMockStore from 'redux-mock-store'; +import { renderWithProvider } from '../../../../test/jest/rendering'; +import NetworksTab from '.'; + +const mockState = { + metamask: { + provider: { + chainId: '0x539', + nickname: '', + rpcPrefs: {}, + rpcUrl: 'http://localhost:8545', + ticker: 'ETH', + type: 'localhost', + }, + frequentRpcListDetail: [], + }, + appState: { + networksTabSelectedRpcUrl: 'http://localhost:8545', + }, +}; + +const renderComponent = (props) => { + const store = configureMockStore([])(mockState); + return renderWithProvider(, store); +}; + +describe('NetworksTab Component', () => { + it('should render networks tab content correctly', () => { + const { queryByText } = renderComponent({ + addNewNetwork: false, + }); + + expect(queryByText('Ethereum Mainnet')).toBeInTheDocument(); + expect(queryByText('Ropsten Test Network')).toBeInTheDocument(); + expect(queryByText('Rinkeby Test Network')).toBeInTheDocument(); + expect(queryByText('Goerli Test Network')).toBeInTheDocument(); + expect(queryByText('Kovan Test Network')).toBeInTheDocument(); + expect(queryByText('Add Network')).toBeInTheDocument(); + }); + it('should render add network form correctly', () => { + const { queryByText } = renderComponent({ + addNewNetwork: true, + }); + expect(queryByText('Network Name')).toBeInTheDocument(); + expect(queryByText('New RPC URL')).toBeInTheDocument(); + expect(queryByText('Chain ID')).toBeInTheDocument(); + expect(queryByText('Currency Symbol')).toBeInTheDocument(); + expect(queryByText('Block Explorer URL')).toBeInTheDocument(); + expect(queryByText('Cancel')).toBeInTheDocument(); + expect(queryByText('Save')).toBeInTheDocument(); + }); +}); diff --git a/ui/pages/settings/settings.component.js b/ui/pages/settings/settings.component.js index 4790c0913..00ed38505 100644 --- a/ui/pages/settings/settings.component.js +++ b/ui/pages/settings/settings.component.js @@ -231,7 +231,11 @@ class SettingsPage extends PureComponent { - + } + /> diff --git a/ui/selectors/selectors.js b/ui/selectors/selectors.js index 380153f27..287774040 100644 --- a/ui/selectors/selectors.js +++ b/ui/selectors/selectors.js @@ -688,3 +688,15 @@ export function doesAddressRequireLedgerHidConnection(state, address) { export function getNewNetworkAdded(state) { return state.appState.newNetworkAdded; } + +export function getNetworksTabSelectedRpcUrl(state) { + return state.appState.networksTabSelectedRpcUrl; +} + +export function getProvider(state) { + return state.metamask.provider; +} + +export function getFrequentRpcListDetail(state) { + return state.metamask.frequentRpcListDetail; +} From 6d786a7bbf2b22fe19dbb42918c2ad3842503dab Mon Sep 17 00:00:00 2001 From: dragana8 <92531782+dragana8@users.noreply.github.com> Date: Fri, 5 Nov 2021 10:12:23 +0100 Subject: [PATCH 55/97] hide eth amount (#12435) fix review updates moved logic to upper component --- .../confirm-page-container-content.component.js | 3 +++ .../confirm-page-container-summary.component.js | 11 ++++++++--- .../confirm-page-container.component.js | 7 +++++++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js index 509e4ebee..574967420 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js @@ -35,6 +35,7 @@ export default class ConfirmPageContainerContent extends Component { disabled: PropTypes.bool, unapprovedTxCount: PropTypes.number, rejectNText: PropTypes.string, + hideTitle: PropTypes.boolean, }; renderContent() { @@ -89,6 +90,7 @@ export default class ConfirmPageContainerContent extends Component { rejectNText, origin, ethGasPriceWarning, + hideTitle, } = this.props; return ( @@ -110,6 +112,7 @@ export default class ConfirmPageContainerContent extends Component { identiconAddress={identiconAddress} nonce={nonce} origin={origin} + hideTitle={hideTitle} /> {this.renderContent()} {(errorKey || errorMessage) && ( diff --git a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js index 25ab144a0..1ae028115 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js @@ -1,3 +1,4 @@ +/* eslint-disable no-negated-condition */ import React from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; @@ -14,6 +15,7 @@ const ConfirmPageContainerSummary = (props) => { identiconAddress, nonce, origin, + hideTitle, } = props; return ( @@ -37,9 +39,11 @@ const ConfirmPageContainerSummary = (props) => { address={identiconAddress} /> )} -
- {titleComponent || title} -
+ {!hideTitle ? ( +
+ {titleComponent || title} +
+ ) : null}
{hideSubtitle || (
@@ -60,6 +64,7 @@ ConfirmPageContainerSummary.propTypes = { identiconAddress: PropTypes.string, nonce: PropTypes.string, origin: PropTypes.string.isRequired, + hideTitle: PropTypes.boolean, }; export default ConfirmPageContainerSummary; diff --git a/ui/components/app/confirm-page-container/confirm-page-container.component.js b/ui/components/app/confirm-page-container/confirm-page-container.component.js index dff2cc5aa..7a4eb0e10 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container.component.js @@ -5,6 +5,7 @@ import { PageContainerFooter } from '../../ui/page-container'; import EditGasPopover from '../edit-gas-popover'; import { EDIT_GAS_MODES } from '../../../../shared/constants/gas'; import ErrorMessage from '../../ui/error-message'; +import { TRANSACTION_TYPES } from '../../../../shared/constants/transaction'; import Dialog from '../../ui/dialog'; import { ConfirmPageContainerHeader, @@ -128,6 +129,11 @@ export default class ConfirmPageContainer extends Component { const shouldDisplayWarning = contentComponent && disabled && (errorKey || errorMessage); + const hideTitle = + (currentTransaction.type === TRANSACTION_TYPES.CONTRACT_INTERACTION || + currentTransaction.type === TRANSACTION_TYPES.DEPLOY_CONTRACT) && + currentTransaction.txParams?.value === '0x0'; + return (
)} {shouldDisplayWarning && ( From 65984291b6a4c3d44b73844994c8a214116c1d81 Mon Sep 17 00:00:00 2001 From: VSaric <92527393+VSaric@users.noreply.github.com> Date: Fri, 5 Nov 2021 15:52:03 +0100 Subject: [PATCH 56/97] Changed ETH decimal values to have 8 places for sending (#12437) * Changed ETH decimal values to have 8 places for sending * Fixing unit tests * Fixing test-lint --- .../transaction-breakdown.test.js | 4 ++-- .../ui/currency-input/currency-input.component.js | 4 ++-- .../currency-input/currency-input.component.test.js | 12 +++++++----- ui/hooks/useUserPreferencedCurrency.js | 2 +- ui/hooks/useUserPreferencedCurrency.test.js | 4 ++-- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/ui/components/app/transaction-breakdown/transaction-breakdown.test.js b/ui/components/app/transaction-breakdown/transaction-breakdown.test.js index 6fec2e3ca..f1f9645eb 100644 --- a/ui/components/app/transaction-breakdown/transaction-breakdown.test.js +++ b/ui/components/app/transaction-breakdown/transaction-breakdown.test.js @@ -51,7 +51,7 @@ describe('TransactionBreakdown', () => { ['Amount', '-0.01 ETH'], ['Gas Limit (units)', '46890'], ['Gas price', '2.467043803'], - ['Total', '0.010116ETH'], + ['Total', '0.01011568ETH'], ]); }); }); @@ -90,7 +90,7 @@ describe('TransactionBreakdown', () => { ['Priority Fee (GWEI)', '2.467043796'], ['Total Gas Fee', '0.000077ETH'], ['Max Fee Per Gas', '0.000000003ETH'], - ['Total', '0.010077ETH'], + ['Total', '0.01007712ETH'], ]); }); }); diff --git a/ui/components/ui/currency-input/currency-input.component.js b/ui/components/ui/currency-input/currency-input.component.js index e953d3090..8c6276f34 100644 --- a/ui/components/ui/currency-input/currency-input.component.js +++ b/ui/components/ui/currency-input/currency-input.component.js @@ -69,7 +69,7 @@ export default class CurrencyInput extends PureComponent { : getValueFromWeiHex({ value: hexValue, toCurrency: ETH, - numberOfDecimals: 6, + numberOfDecimals: 8, }); return Number(decimalValueString) || 0; @@ -134,7 +134,7 @@ export default class CurrencyInput extends PureComponent { if (this.shouldUseFiat()) { // Display ETH currency = nativeCurrency || ETH; - numberOfDecimals = 6; + numberOfDecimals = 8; } else { // Display Fiat currency = currentCurrency; diff --git a/ui/components/ui/currency-input/currency-input.component.test.js b/ui/components/ui/currency-input/currency-input.component.test.js index 7092b73dd..840871cb3 100644 --- a/ui/components/ui/currency-input/currency-input.component.test.js +++ b/ui/components/ui/currency-input/currency-input.component.test.js @@ -120,7 +120,7 @@ describe('CurrencyInput Component', () => { expect(wrapper.find('.unit-input__suffix').text()).toStrictEqual('USD'); expect(wrapper.find('.unit-input__input').props().value).toStrictEqual(1); expect(wrapper.find('.currency-display-component').text()).toStrictEqual( - '0.004328ETH', + '0.00432788ETH', ); }); @@ -159,14 +159,16 @@ describe('CurrencyInput Component', () => { .find(CurrencyInput) .at(0) .instance(); - expect(currencyInputInstance.state.decimalValue).toStrictEqual(0.004328); + expect(currencyInputInstance.state.decimalValue).toStrictEqual( + 0.00432788, + ); expect(currencyInputInstance.state.hexValue).toStrictEqual( 'f602f2234d0ea', ); expect(wrapper.find('.unit-input__suffix')).toHaveLength(1); expect(wrapper.find('.unit-input__suffix').text()).toStrictEqual('ETH'); expect(wrapper.find('.unit-input__input').props().value).toStrictEqual( - 0.004328, + 0.00432788, ); expect( wrapper.find('.currency-input__conversion-component').text(), @@ -274,7 +276,7 @@ describe('CurrencyInput Component', () => { expect(handleChangeSpy.callCount).toStrictEqual(1); expect(handleChangeSpy.calledWith('f602f2234d0ea')).toStrictEqual(true); expect(wrapper.find('.currency-display-component').text()).toStrictEqual( - '0.004328ETH', + '0.00432788ETH', ); expect(currencyInputInstance.state.decimalValue).toStrictEqual(1); expect(currencyInputInstance.state.hexValue).toStrictEqual( @@ -375,7 +377,7 @@ describe('CurrencyInput Component', () => { const swap = wrapper.find('.currency-input__swap-component'); swap.simulate('click'); expect(wrapper.find('.currency-display-component').text()).toStrictEqual( - '0.004328ETH', + '0.00432788ETH', ); }); }); diff --git a/ui/hooks/useUserPreferencedCurrency.js b/ui/hooks/useUserPreferencedCurrency.js index c41195345..a4716e43f 100644 --- a/ui/hooks/useUserPreferencedCurrency.js +++ b/ui/hooks/useUserPreferencedCurrency.js @@ -49,7 +49,7 @@ export function useUserPreferencedCurrency(type, opts = {}) { ) { // Display ETH currency = nativeCurrency || ETH; - numberOfDecimals = opts.numberOfDecimals || opts.ethNumberOfDecimals || 6; + numberOfDecimals = opts.numberOfDecimals || opts.ethNumberOfDecimals || 8; } else if ( (type === SECONDARY && useNativeCurrencyAsPrimaryCurrency) || (type === PRIMARY && !useNativeCurrencyAsPrimaryCurrency) diff --git a/ui/hooks/useUserPreferencedCurrency.test.js b/ui/hooks/useUserPreferencedCurrency.test.js index 62030b7e3..32f987340 100644 --- a/ui/hooks/useUserPreferencedCurrency.test.js +++ b/ui/hooks/useUserPreferencedCurrency.test.js @@ -20,7 +20,7 @@ const tests = [ }, result: { currency: 'ETH', - numberOfDecimals: 6, + numberOfDecimals: 8, }, }, { @@ -82,7 +82,7 @@ const tests = [ }, result: { currency: 'ETH', - numberOfDecimals: 6, + numberOfDecimals: 8, }, }, { From c0f0e1cfc43e09d15226350d16b0addafd2c65ba Mon Sep 17 00:00:00 2001 From: PeterYinusa <53189696+PeterYinusa@users.noreply.github.com> Date: Fri, 5 Nov 2021 15:52:24 +0000 Subject: [PATCH 57/97] update chromedriver to v95 (#12603) --- .circleci/scripts/chrome-install.sh | 4 ++-- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.circleci/scripts/chrome-install.sh b/.circleci/scripts/chrome-install.sh index fd20877f8..ccf458111 100755 --- a/.circleci/scripts/chrome-install.sh +++ b/.circleci/scripts/chrome-install.sh @@ -5,12 +5,12 @@ set -u set -o pipefail # To get the latest version, see -CHROME_VERSION='93.0.4577.63-1' +CHROME_VERSION='95.0.4638.69-1' CHROME_BINARY="google-chrome-stable_${CHROME_VERSION}_amd64.deb" CHROME_BINARY_URL="https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/${CHROME_BINARY}" # To retrieve this checksum, run the `wget` and `shasum` commands below -CHROME_BINARY_SHA512SUM='4102ba417b41820da68b7e8e12018ed2268f30e0210f8f227aeeabf6bd9265dd95ad206993d5626ac1c70a07185fd3ed4eef8a71ee2f5b0770015302c0d26f58' +CHROME_BINARY_SHA512SUM='f07d16ec0a41120c40064d030e9e5240ed740b9b24c50eaede7b9bfd9a9678821c0252b40bfcd57e933a708b08d761482c3be5b3006eee605c41f5dc9e21f456' wget -O "${CHROME_BINARY}" -t 5 "${CHROME_BINARY_URL}" diff --git a/package.json b/package.json index 2a25204ae..557c2c0c4 100644 --- a/package.json +++ b/package.json @@ -250,7 +250,7 @@ "brfs": "^2.0.2", "browserify": "^16.5.1", "chalk": "^3.0.0", - "chromedriver": "^93.0.1", + "chromedriver": "^95.0.0", "concurrently": "^5.2.0", "copy-webpack-plugin": "^6.0.3", "cross-spawn": "^7.0.3", diff --git a/yarn.lock b/yarn.lock index 4a6398d32..86e161470 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9060,10 +9060,10 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" -chromedriver@^93.0.1: - version "93.0.1" - resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-93.0.1.tgz#3ed1f7baa98a754fc1788c42ac8e4bb1ab27db32" - integrity sha512-KDzbW34CvQLF5aTkm3b5VdlTrvdIt4wEpCzT2p4XJIQWQZEPco5pNce7Lu9UqZQGkhQ4mpZt4Ky6NKVyIS2N8A== +chromedriver@^95.0.0: + version "95.0.0" + resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-95.0.0.tgz#ecf854cac6df5137a651dcc132edf55612d3db7f" + integrity sha512-HwSg7S0ZZYsHTjULwxFHrrUqEpz1+ljDudJM3eOquvqD5QKnR5pSe/GlBTY9UU2tVFRYz8bEHYC4Y8qxciQiLQ== dependencies: "@testim/chrome-version" "^1.0.7" axios "^0.21.2" From e6ae6e09b8201191aa1af53123798d202dbb5494 Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Fri, 5 Nov 2021 13:43:29 -0230 Subject: [PATCH 58/97] Ensure proper transport type is set before attempting to connect ledger wallet (#12594) * Ensure proper transport type is set before attempting to connect ledger wallet * Fix unit tests --- app/scripts/metamask-controller.js | 10 ++++++++++ ui/store/actions.js | 4 ++++ ui/store/actions.test.js | 4 ++++ 3 files changed, 18 insertions(+) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 40832c0bc..106317bdd 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -849,6 +849,10 @@ export default class MetamaskController extends EventEmitter { this.attemptLedgerTransportCreation, this, ), + establishLedgerTransportPreference: nodeify( + this.establishLedgerTransportPreference, + this, + ), // mobile fetchInfoToSync: nodeify(this.fetchInfoToSync, this), @@ -1252,6 +1256,7 @@ export default class MetamaskController extends EventEmitter { this.preferencesController.setAddresses(addresses); this.selectFirstIdentity(); } + return vault; } finally { releaseLock(); @@ -1565,6 +1570,11 @@ export default class MetamaskController extends EventEmitter { return await keyring.attemptMakeApp(); } + async establishLedgerTransportPreference() { + const transportPreference = this.preferencesController.getLedgerTransportPreference(); + return await this.setLedgerTransportPreference(transportPreference); + } + /** * Fetch account list from a trezor device. * diff --git a/ui/store/actions.js b/ui/store/actions.js index fe2d94f38..b3841fbc8 100644 --- a/ui/store/actions.js +++ b/ui/store/actions.js @@ -409,6 +409,10 @@ export function connectHardware(deviceName, page, hdPath, t) { let accounts; try { const { ledgerTransportType } = getState().metamask; + + if (deviceName === 'ledger') { + await promisifiedBackground.establishLedgerTransportPreference(); + } if ( deviceName === 'ledger' && ledgerTransportType === LEDGER_TRANSPORT_TYPES.WEBHID diff --git a/ui/store/actions.test.js b/ui/store/actions.test.js index 7e803c284..90f524895 100644 --- a/ui/store/actions.test.js +++ b/ui/store/actions.test.js @@ -548,6 +548,8 @@ describe('Actions', () => { (_, __, ___, cb) => cb(), ); + background.establishLedgerTransportPreference.callsFake((cb) => cb()); + actions._setBackgroundConnection(background); await store.dispatch( @@ -563,6 +565,8 @@ describe('Actions', () => { cb(new Error('error')), ); + background.establishLedgerTransportPreference.callsFake((cb) => cb()); + actions._setBackgroundConnection(background); const expectedActions = [ From 3dfc1cc5f61febb2f111af444ff41d65ddf4f4bf Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Fri, 5 Nov 2021 22:53:15 +0530 Subject: [PATCH 59/97] Edit transaction screen changes for EIP-1559 V2 (#12493) Edit transaction screen changes for EIP-1559 V2 --- app/_locales/en/messages.json | 6 + development/build/scripts.js | 2 + .../app/gas-timing/gas-timing.component.js | 8 + .../app/transaction-detail-item/index.scss | 19 ++ .../app/transaction-detail/index.scss | 18 -- .../ui/i18n-value/i18n-value.component.js | 15 ++ ui/components/ui/i18n-value/index.js | 1 + ui/components/ui/typography/typography.js | 3 + ui/components/ui/typography/typography.scss | 6 + ui/css/design-system/attributes.scss | 1 + .../confirm-transaction-base.component.js | 233 ++++++++++-------- .../gas-details-item/gas-details-item.js | 136 ++++++++++ .../gas-details-item/gas-details-item.scss | 17 ++ .../gas-details-item/gas-details-item.test.js | 41 +++ .../gas-details-item/index.js | 1 + ui/pages/pages.scss | 1 + 16 files changed, 384 insertions(+), 124 deletions(-) create mode 100644 ui/components/ui/i18n-value/i18n-value.component.js create mode 100644 ui/components/ui/i18n-value/index.js create mode 100644 ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.js create mode 100644 ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.scss create mode 100644 ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.test.js create mode 100644 ui/pages/confirm-transaction-base/gas-details-item/index.js diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 99c03131a..a61d51e17 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -2800,6 +2800,12 @@ "transactionDetailGasHeading": { "message": "Estimated gas fee" }, + "transactionDetailGasHeadingV2": { + "message": "Gas" + }, + "transactionDetailGasInfoV2": { + "message": "estimated" + }, "transactionDetailGasTooltipConversion": { "message": "Learn more about gas fees" }, diff --git a/development/build/scripts.js b/development/build/scripts.js index d8a22251e..cc916cf68 100644 --- a/development/build/scripts.js +++ b/development/build/scripts.js @@ -34,6 +34,7 @@ const metamaskrc = require('rc')('metamask', { INFURA_PROD_PROJECT_ID: process.env.INFURA_PROD_PROJECT_ID, ONBOARDING_V2: process.env.ONBOARDING_V2, COLLECTIBLES_V1: process.env.COLLECTIBLES_V1, + EIP_1559_V2: process.env.EIP_1559_V2, SEGMENT_HOST: process.env.SEGMENT_HOST, SEGMENT_WRITE_KEY: process.env.SEGMENT_WRITE_KEY, SEGMENT_BETA_WRITE_KEY: process.env.SEGMENT_BETA_WRITE_KEY, @@ -758,6 +759,7 @@ function getEnvironmentVariables({ buildType, devMode, testing }) { SWAPS_USE_DEV_APIS: process.env.SWAPS_USE_DEV_APIS === '1', ONBOARDING_V2: metamaskrc.ONBOARDING_V2 === '1', COLLECTIBLES_V1: metamaskrc.COLLECTIBLES_V1 === '1', + EIP_1559_V2: metamaskrc.EIP_1559_V2 === '1', }; } diff --git a/ui/components/app/gas-timing/gas-timing.component.js b/ui/components/app/gas-timing/gas-timing.component.js index 95e5bc24a..972805ffb 100644 --- a/ui/components/app/gas-timing/gas-timing.component.js +++ b/ui/components/app/gas-timing/gas-timing.component.js @@ -27,6 +27,8 @@ import { GAS_FORM_ERRORS } from '../../../helpers/constants/gas'; // Once we reach this second threshold, we switch to minutes as a unit const SECOND_CUTOFF = 90; +// eslint-disable-next-line prefer-destructuring +const EIP_1559_V2 = process.env.EIP_1559_V2; // Shows "seconds" as unit of time if under SECOND_CUTOFF, otherwise "minutes" const toHumanReadableTime = (milliseconds = 1, t) => { @@ -164,6 +166,12 @@ export default function GasTiming({ toHumanReadableTime(Number(customEstimatedTime?.upperTimeBound), t), ]); } + } + // code below needs to cleaned-up once EIP_1559_V2 flag is removed + else if (EIP_1559_V2) { + text = t('gasTimingNegative', [ + toHumanReadableTime(low.maxWaitTimeEstimate, t), + ]); } else { text = ( <> diff --git a/ui/components/app/transaction-detail-item/index.scss b/ui/components/app/transaction-detail-item/index.scss index a2dc8e4cd..8d6c1bcd7 100644 --- a/ui/components/app/transaction-detail-item/index.scss +++ b/ui/components/app/transaction-detail-item/index.scss @@ -1,5 +1,7 @@ .transaction-detail-item { color: $ui-4; + padding: 20px 0; + border-bottom: 1px solid $ui-3; &__row { display: flex; @@ -36,4 +38,21 @@ .currency-display-component { display: inline; } + + &:first-of-type { + padding-top: 0; + } + + &:last-of-type { + margin-bottom: 20px; + } + + &:first-child { + padding-top: 0; + } + + &:last-child { + padding-bottom: 0; + border-bottom: 0; + } } diff --git a/ui/components/app/transaction-detail/index.scss b/ui/components/app/transaction-detail/index.scss index 13c2601c8..cba477119 100644 --- a/ui/components/app/transaction-detail/index.scss +++ b/ui/components/app/transaction-detail/index.scss @@ -15,22 +15,4 @@ text-transform: uppercase; } } - - &-rows &-item:first-child { - padding-top: 0; - } - - &-item { - padding: 20px 0; - border-bottom: 1px solid $ui-3; - - &:first-child { - padding-top: 0; - } - - &:last-child { - padding-bottom: 0; - border-bottom: 0; - } - } } diff --git a/ui/components/ui/i18n-value/i18n-value.component.js b/ui/components/ui/i18n-value/i18n-value.component.js new file mode 100644 index 000000000..d321df7e9 --- /dev/null +++ b/ui/components/ui/i18n-value/i18n-value.component.js @@ -0,0 +1,15 @@ +import PropTypes from 'prop-types'; + +import { useI18nContext } from '../../../hooks/useI18nContext'; + +const I18nValue = ({ messageKey, options }) => { + const t = useI18nContext(); + return t(messageKey, options); +}; + +I18nValue.propTypes = { + messageKey: PropTypes.string.isRequired, + options: PropTypes.array, +}; + +export default I18nValue; diff --git a/ui/components/ui/i18n-value/index.js b/ui/components/ui/i18n-value/index.js new file mode 100644 index 000000000..190d57ab0 --- /dev/null +++ b/ui/components/ui/i18n-value/index.js @@ -0,0 +1 @@ +export { default } from './i18n-value.component'; diff --git a/ui/components/ui/typography/typography.js b/ui/components/ui/typography/typography.js index 02f9a3015..0af48e699 100644 --- a/ui/components/ui/typography/typography.js +++ b/ui/components/ui/typography/typography.js @@ -20,6 +20,7 @@ export default function Typography({ children, fontWeight = 'normal', fontStyle = 'normal', + fontSize, align, boxProps = {}, margin = [1, 0], @@ -33,6 +34,7 @@ export default function Typography({ { [`typography--align-${align}`]: Boolean(align), [`typography--color-${color}`]: Boolean(color), + [`typography--size-${fontSize}`]: Boolean(fontSize), }, ); @@ -67,6 +69,7 @@ Typography.propTypes = { margin: MultipleSizes, fontWeight: PropTypes.oneOf(Object.values(FONT_WEIGHT)), fontStyle: PropTypes.oneOf(Object.values(FONT_STYLE)), + fontSize: PropTypes.string, tag: PropTypes.oneOf([ 'p', 'h1', diff --git a/ui/components/ui/typography/typography.scss b/ui/components/ui/typography/typography.scss index 612bfc1cc..c92fc6eb2 100644 --- a/ui/components/ui/typography/typography.scss +++ b/ui/components/ui/typography/typography.scss @@ -32,6 +32,12 @@ } } + @each $size in design-system.$font-size { + &--size-#{$size} { + font-size: $size; + } + } + @each $alignment in design-system.$text-align { &--align-#{$alignment} { text-align: $alignment; diff --git a/ui/css/design-system/attributes.scss b/ui/css/design-system/attributes.scss index e9f03e053..8b920b7eb 100644 --- a/ui/css/design-system/attributes.scss +++ b/ui/css/design-system/attributes.scss @@ -82,3 +82,4 @@ $display: block, grid, flex, inline-block, inline-grid, inline-flex, list-item; $text-align: left, right, center, justify, end; $font-weight: bold, normal, 100, 200, 300, 400, 500, 600, 700, 800, 900; $font-style: normal, italic, oblique; +$font-size: 12px; diff --git a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js index aa0482d7b..122efb895 100644 --- a/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js +++ b/ui/pages/confirm-transaction-base/confirm-transaction-base.component.js @@ -52,6 +52,11 @@ import { import Typography from '../../components/ui/typography/typography'; import { MIN_GAS_LIMIT_DEC } from '../send/send.constants'; +import GasDetailsItem from './gas-details-item'; + +// eslint-disable-next-line prefer-destructuring +const EIP_1559_V2 = process.env.EIP_1559_V2; + const renderHeartBeatIfNotInTest = () => process.env.IN_TEST === 'true' ? null : ; @@ -408,114 +413,130 @@ export default class ConfirmTransactionBase extends Component { this.handleEditGas()} rows={[ - - {t('transactionDetailGasHeading')} - - - - - ) : ( - <> - {t('transactionDetailGasHeading')} - -

- {t('transactionDetailGasTooltipIntro', [ - isMainnet ? t('networkNameEthereum') : '', - ])} -

-

{t('transactionDetailGasTooltipExplanation')}

-

- - {t('transactionDetailGasTooltipConversion')} - -

- - } - position="top" - > - -
- - ) - } - detailTitleColor={COLORS.BLACK} - detailText={ -
- {renderHeartBeatIfNotInTest()} - -
- } - detailTotal={ -
- {renderHeartBeatIfNotInTest()} - -
- } - subText={t('editGasSubTextFee', [ - - {t('editGasSubTextFeeLabel')} - , -
- {renderHeartBeatIfNotInTest()} - -
, - ])} - subTitle={ - <> - {txData.dappSuggestedGasFees ? ( - - {t('transactionDetailDappGasMoreInfo')} - + EIP_1559_V2 ? ( + + ) : ( + + {t('transactionDetailGasHeading')} + + + + ) : ( - '' - )} - {supportsEIP1559 && ( - + {t('transactionDetailGasHeading')} + +

+ {t('transactionDetailGasTooltipIntro', [ + isMainnet ? t('networkNameEthereum') : '', + ])} +

+

{t('transactionDetailGasTooltipExplanation')}

+

+ + {t('transactionDetailGasTooltipConversion')} + +

+ + } + position="top" + > + +
+ + ) + } + detailTitleColor={COLORS.BLACK} + detailText={ +
+ {renderHeartBeatIfNotInTest()} + - )} - - } - />, +
+ } + detailTotal={ +
+ {renderHeartBeatIfNotInTest()} + +
+ } + subText={t('editGasSubTextFee', [ + + {t('editGasSubTextFeeLabel')} + , +
+ {renderHeartBeatIfNotInTest()} + +
, + ])} + subTitle={ + <> + {txData.dappSuggestedGasFees ? ( + + {t('transactionDetailDappGasMoreInfo')} + + ) : ( + '' + )} + {supportsEIP1559 && ( + + )} + + } + /> + ), + process.env.IN_TEST === 'true' ? null : ; + +const GasDetailItem = ({ + hexMaximumTransactionFee, + hexMinimumTransactionFee, + isMainnet, + maxFeePerGas, + maxPriorityFeePerGas, + supportsEIP1559, + txData, + useNativeCurrencyAsPrimaryCurrency, +}) => { + const t = useI18nContext(); + return ( + + + + + + () + + + + {t('transactionDetailGasTooltipIntro', [ + isMainnet ? t('networkNameEthereum') : '', + ])} + + + {t('transactionDetailGasTooltipExplanation')} + + + + {t('transactionDetailGasTooltipConversion')} + + + + } + position="top" + /> + + } + detailTitleColor={COLORS.BLACK} + detailText={ +
+ + +
+ } + detailTotal={ +
+ + +
+ } + subText={t('editGasSubTextFee', [ + + + + +
+ + +
+
, + ])} + subTitle={ + supportsEIP1559 && ( + + ) + } + /> + ); +}; + +GasDetailItem.propTypes = { + hexMaximumTransactionFee: PropTypes.string, + hexMinimumTransactionFee: PropTypes.string, + isMainnet: PropTypes.bool, + maxFeePerGas: PropTypes.string, + maxPriorityFeePerGas: PropTypes.string, + supportsEIP1559: PropTypes.bool, + txData: PropTypes.object, + useNativeCurrencyAsPrimaryCurrency: PropTypes.bool, +}; + +export default GasDetailItem; diff --git a/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.scss b/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.scss new file mode 100644 index 000000000..47d38af1f --- /dev/null +++ b/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.scss @@ -0,0 +1,17 @@ +.gas-details-item { + &__estimate { + font-weight: 400; + font-style: italic; + font-size: 12px; + color: $Grey-500; + line-height: inherit; + } + + &__gasfee-label { + font-weight: bold; + } + + &__currency-container { + position: relative; + } +} diff --git a/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.test.js b/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.test.js new file mode 100644 index 000000000..f94b70bbd --- /dev/null +++ b/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.test.js @@ -0,0 +1,41 @@ +import React from 'react'; +import { screen } from '@testing-library/react'; + +import { ETH } from '../../../helpers/constants/common'; +import { renderWithProvider } from '../../../../test/jest'; +import configureStore from '../../../store/store'; + +import GasDetailsItem from './gas-details-item'; + +const render = (props) => { + const store = configureStore({ + metamask: { + nativeCurrency: ETH, + preferences: { + useNativeCurrencyAsPrimaryCurrency: true, + }, + provider: {}, + }, + }); + + return renderWithProvider(, store); +}; + +describe('GasDetailsItem', () => { + it('should render label', () => { + render(); + expect(screen.queryByText('Gas')).toBeInTheDocument(); + expect(screen.queryByText('(estimated)')).toBeInTheDocument(); + expect(screen.queryByText('Max fee:')).toBeInTheDocument(); + }); + + it('should render gas fee details', () => { + render({ + hexMinimumTransactionFee: '0x1ca62a4f7800', + hexMaximumTransactionFee: '0x290ee75e3d900', + }); + expect(screen.queryAllByText('0.000031')).toHaveLength(2); + expect(screen.queryByText('ETH')).toBeInTheDocument(); + expect(screen.queryByText('0.000722')).toBeInTheDocument(); + }); +}); diff --git a/ui/pages/confirm-transaction-base/gas-details-item/index.js b/ui/pages/confirm-transaction-base/gas-details-item/index.js new file mode 100644 index 000000000..f6bacdbeb --- /dev/null +++ b/ui/pages/confirm-transaction-base/gas-details-item/index.js @@ -0,0 +1 @@ +export { default } from './gas-details-item'; diff --git a/ui/pages/pages.scss b/ui/pages/pages.scss index 300bdcf4a..df9de3f4e 100644 --- a/ui/pages/pages.scss +++ b/ui/pages/pages.scss @@ -5,6 +5,7 @@ @import 'confirm-approve/index'; @import 'confirm-decrypt-message/confirm-decrypt-message'; @import 'confirm-encryption-public-key/confirm-encryption-public-key'; +@import 'confirm-transaction-base/gas-details-item/gas-details-item'; @import 'confirmation/confirmation'; @import 'connected-sites/index'; @import 'connected-accounts/index'; From 4757eed2f653d2de856a970d90a8c54fecea893f Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Sat, 6 Nov 2021 00:50:27 +0530 Subject: [PATCH 60/97] Fix build (#12606) --- .../gas-details-item/gas-details-item.test.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.test.js b/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.test.js index f94b70bbd..e7551408c 100644 --- a/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.test.js +++ b/ui/pages/confirm-transaction-base/gas-details-item/gas-details-item.test.js @@ -27,15 +27,6 @@ describe('GasDetailsItem', () => { expect(screen.queryByText('Gas')).toBeInTheDocument(); expect(screen.queryByText('(estimated)')).toBeInTheDocument(); expect(screen.queryByText('Max fee:')).toBeInTheDocument(); - }); - - it('should render gas fee details', () => { - render({ - hexMinimumTransactionFee: '0x1ca62a4f7800', - hexMaximumTransactionFee: '0x290ee75e3d900', - }); - expect(screen.queryAllByText('0.000031')).toHaveLength(2); expect(screen.queryByText('ETH')).toBeInTheDocument(); - expect(screen.queryByText('0.000722')).toBeInTheDocument(); }); }); From a6d0f379ad0c87169faad963f3b17867ca77fd59 Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Fri, 5 Nov 2021 18:02:53 -0230 Subject: [PATCH 61/97] Add Ledger connection flow warning message for failed to connect device error (#12604) --- app/_locales/en/messages.json | 3 +++ ui/store/actions.js | 16 ++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index a61d51e17..48f516bc5 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -1286,6 +1286,9 @@ "message": "Customize how you connect your Ledger to MetaMask. $1 is recommended, but other options are available. Read more here: $2", "description": "A description that appears above a dropdown where users can select between up to three options - Ledger Live, U2F or WebHID - depending on what is supported in their browser. $1 is the recommended browser option, it will be either WebHID or U2f. $2 is a link to an article where users can learn more, but will be the translation of the learnMore message." }, + "ledgerDeviceOpenFailureMessage": { + "message": "The Ledger device failed to open. Your Ledger might be connected to other software. Please close Ledger Live or other applications connected to your Ledger device, and try to connect again." + }, "ledgerLive": { "message": "Ledger Live", "description": "The name of a desktop app that can be used with your ledger device. We can also use it to connect a users Ledger device to MetaMask." diff --git a/ui/store/actions.js b/ui/store/actions.js index b3841fbc8..e23781079 100644 --- a/ui/store/actions.js +++ b/ui/store/actions.js @@ -402,14 +402,14 @@ export function forgetDevice(deviceName) { export function connectHardware(deviceName, page, hdPath, t) { log.debug(`background.connectHardware`, deviceName, page, hdPath); return async (dispatch, getState) => { + const { ledgerTransportType } = getState().metamask; + dispatch( showLoadingIndication(`Looking for your ${capitalize(deviceName)}...`), ); let accounts; try { - const { ledgerTransportType } = getState().metamask; - if (deviceName === 'ledger') { await promisifiedBackground.establishLedgerTransportPreference(); } @@ -435,8 +435,16 @@ export function connectHardware(deviceName, page, hdPath, t) { ); } catch (error) { log.error(error); - dispatch(displayWarning(error.message)); - throw error; + if ( + deviceName === 'ledger' && + ledgerTransportType === LEDGER_TRANSPORT_TYPES.WEBHID && + error.message.match('Failed to open the device') + ) { + dispatch(displayWarning(t('ledgerDeviceOpenFailureMessage'))); + } else { + dispatch(displayWarning(error.message)); + throw error; + } } finally { dispatch(hideLoadingIndication()); } From 042bd84c871a99c7966bb473dfcef571fb58a7ab Mon Sep 17 00:00:00 2001 From: David Walsh Date: Fri, 5 Nov 2021 16:18:07 -0500 Subject: [PATCH 62/97] Minor code cleanup of _viewOnEtherscan (#12609) --- app/scripts/platforms/extension.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/scripts/platforms/extension.js b/app/scripts/platforms/extension.js index eeaea008d..4f7705a95 100644 --- a/app/scripts/platforms/extension.js +++ b/app/scripts/platforms/extension.js @@ -262,9 +262,9 @@ export default class ExtensionPlatform { } } - _viewOnEtherscan(txId) { - if (txId.startsWith('https://')) { - extension.tabs.create({ url: txId }); + _viewOnEtherscan(url) { + if (url.startsWith('https://')) { + extension.tabs.create({ url }); } } } From ea0192df7b85c1a91618db96daccade0124037b7 Mon Sep 17 00:00:00 2001 From: hupfis Date: Fri, 5 Nov 2021 22:19:56 +0100 Subject: [PATCH 63/97] Update German translations (#12547) --- app/_locales/de/messages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json index 6acf58149..6a9d2a4f1 100644 --- a/app/_locales/de/messages.json +++ b/app/_locales/de/messages.json @@ -688,7 +688,7 @@ "message": "Datenschutzrichtlinie" }, "privateKeyWarning": { - "message": "Warnung: Niemals jemanden deinen Private Key mitteilen. Jeder der im Besitz deines Private Keys ist, kann jegliches Guthaben deines Accounts stehlen." + "message": "Warnung: Niemals jemandem deinen Private Key mitteilen. Jeder der im Besitz deines Private Keys ist, kann jegliches Guthaben deines Accounts stehlen." }, "privateNetwork": { "message": "Privates Netzwerk" @@ -955,7 +955,7 @@ "message": "Hierdurch werden ein neues Wallet und eine mnemonische Phrase erzeugt" }, "tips": { - "message": "Trinkgelder" + "message": "Tipps" }, "to": { "message": "An" From accfd0b049341ccd47a56da9e760bb698db1a3b6 Mon Sep 17 00:00:00 2001 From: ryanml Date: Fri, 5 Nov 2021 14:23:28 -0700 Subject: [PATCH 64/97] Updating default collectibles tab view (#12575) --- app/_locales/en/messages.json | 8 +- app/images/diamond.png | Bin 2725 -> 0 bytes app/images/no-nfts.svg | 10 +++ .../collectibles-list.component.js | 81 +++++++++--------- 4 files changed, 53 insertions(+), 46 deletions(-) delete mode 100644 app/images/diamond.png create mode 100644 app/images/no-nfts.svg diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 48f516bc5..d1f2af8dd 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -1439,6 +1439,9 @@ "message": "verify the network details", "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." }, + "missingNFT": { + "message": "Don't see your NFT?" + }, "missingToken": { "message": "Don't see your token?" }, @@ -1573,10 +1576,7 @@ "message": "No Conversion Rate Available" }, "noNFTs": { - "message": "No NFTs to show" - }, - "noNFTsDetails": { - "message": "Your NFTs will show up here. If you don't see your NFT, try importing manually." + "message": "No NFTs yet" }, "noThanks": { "message": "No Thanks" diff --git a/app/images/diamond.png b/app/images/diamond.png deleted file mode 100644 index 5c04fae081c412500550f65890f589520b66609e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2725 zcma);`9Bkm1ID*pIVU#_g{Hj(}JHziU$Ay@WU-(4u9zJM^>jf|M=YP z^tnIa4zWap0|30j{}m8WTq^OW1cp0Um;oAx!E1j4`#n<|Qvjejm-on%0|4OBhr>*r zqJit~{*H18v96~DgE@=c=$aSf*KKLA2+Glkt=6cc^9K0|xiU%ZRMLr(Ec$?rqj=cNCU3T=h9J!);MVNK} z{$tGi9lD6VR21Y@@Y>F7JcTXA3_o$@!K&Uuhv;-O;pCv`Il3gyN%e6+C%v+J-qwa@ zA9`lF{KunjQRKBzB~W>T=AA*5YM0+6kjEXeTw^z48(4P(L;OCu{d)B@qhnT!^&6YD zHI5h`UslA>fBdLp5~tU=iwR(KG;#am#hI%H7h(pGNaR=WR_KEVR~pp*ajZ9X*goJn ziNiLG?9HE_o1H)7oc6MgoHh8Oh1qy)Srm^zh^%M{SEZE|7K+cz>e*#*RS}lPX`zuM zAhmiWA~ez*(q8wS*5{omU^^U1A^W3Z9x5tbuNApPshycOd~OY~(B1tUeiwD5+w=T0 zIWC_P*M;5rJj26rbSG56AeS~Xf3Ax?ONlae-3)Xd}9w|{Z)*rAuIR_ zU?%ORq}R^(J)=2e1$aDa$hSEx+PvT*3WLFMg}@A=$Yj6x;9|~aEV^FHv;o#_LGvec zU`%*@LpG~PzFYTI(!o)7`tL;A%Ck1;$NE?Uy5>sZWJE;JJfO(TNLl}$GuzfhXQ{Zj zSeL+!m_$4-p#Bo&jb(>(Ba^%0qcs;g}@BFv>hZL~O z1f?rZSEz1+vH~1|vhNE+!eUJ=l#VXc1>KFLFwMcKGGkDgMTOPPp2p0-NMcqOaHVXT zAwqb&L^#w@vBa_5e5$X067*CicR<7zAX6`{=K?7vc$sQw-`X$gNg~xr549w)9w56y z&J8xlXh`{o6x@&m5K%M+#^z-@)X-3`|6)xuJH^^qk1R-NJu^u86>VVsRX4I@ZhR#` z{$0sNS@6lb6{@(epI1cDObRJK*O66{VQYw5JvoEzJb$vizfgnp3ml?y7RHfs?~Mkx zUZuA`#!%MqUmoheI^Mm3wk^2N+D1AZY8l5EjNNS2P7!97L_Q#X+fzpu2;oEWx&GBC*GGWga!`Ny8HjcT z?1`AK3Psg?xSYBqEbWw$*d4sgrP2*keI$AaucN-1n==cAA7HU^RKMMWAD`oHc}V?^ z7Kln-Sa}iED^dn>q;G!(S8vQ%lizeK|JmRGpJ}ug`Jv|4hwkmtt(P{ zAC%kLH=o;S1y1{U1uWn|_AKsN+>VU_h&erI>K)uHxUjgqd;bQN>*zQj8>N*EieKVu zbADTb*W>(cW0Kk)V*%xB^ls zUEeu8Y3VpRy5Qg^7BcMq8k_w%sV!;We7eZSV5C_J;uVbvPUVbnt|C*CfBpJF4GVfw zyaby~*qrtgWGfi4)>bZv?ckW_W$=D>IW@QcZpD-eFXs;yo}jJM}w!05DE zp#sQR9U92)EpP6_p|(C=+ABUOs$`eQATa` zdy)-4rdW3oTOzjv)mNE8lrgoMI_b3kAYR4z{Xp%`2hNuI+{v zdm9F{3*qxx@<(>q)e{Ow0-BY3U#Y1_JeO{g3>qy5^+>ZN-sH+i{^t0`6D=LyX$&4| zD=gsGV(3()fOD%$PMMZRW0>FaArSN!AZ1Tf1m+5@E#h^X1E2BjNJG5bNEn)#fKUVG z@3M@_&jVvEt0-t3_`Go)*XfLb*HR5>%#F*_RLRv4P`v!q#<0lW8R4Uk=-zo*5RwqN z;>)?-j2lBs3e@OMMKilQQvUT}Q#mHovr=Wxp`aUQ36Ze&=FdP3UbvoV>qP0Y7}n6T(r2<+V^_CaB9q`K$dHUU7%rHw_cd#Gk(pl& z;_`Xpzqh-5;TdD?;XvVls7{bi{m71=V+47&_3dNjh#JI;<+JZdOKcxvdm7PMdxjiV zlLU55rB}1bZuh&LCFMYdiklE0z{rdY!xR@ S{rK}L0q|=#VU1>Yll}v31UVc4 diff --git a/app/images/no-nfts.svg b/app/images/no-nfts.svg new file mode 100644 index 000000000..220eb4790 --- /dev/null +++ b/app/images/no-nfts.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/ui/components/app/collectibles-list/collectibles-list.component.js b/ui/components/app/collectibles-list/collectibles-list.component.js index b0c0161c7..4fde98023 100644 --- a/ui/components/app/collectibles-list/collectibles-list.component.js +++ b/ui/components/app/collectibles-list/collectibles-list.component.js @@ -7,72 +7,69 @@ import { COLORS, TYPOGRAPHY, TEXT_ALIGN, - BLOCK_SIZES, JUSTIFY_CONTENT, FLEX_DIRECTION, + FONT_WEIGHT, } from '../../../helpers/constants/design-system'; import { useI18nContext } from '../../../hooks/useI18nContext'; -import { getEnvironmentType } from '../../../../app/scripts/lib/util'; -import { ENVIRONMENT_TYPE_POPUP } from '../../../../shared/constants/app'; export default function CollectiblesList({ onAddNFT }) { const collectibles = []; const t = useI18nContext(); - const blockSizes = { - copy: - getEnvironmentType() === ENVIRONMENT_TYPE_POPUP - ? BLOCK_SIZES.TWO_THIRDS - : BLOCK_SIZES.ONE_THIRD, - button: - getEnvironmentType() === ENVIRONMENT_TYPE_POPUP - ? BLOCK_SIZES.HALF - : BLOCK_SIZES.ONE_FIFTH, - }; return (
{collectibles.length > 0 ? ( {JSON.stringify(collectibles)} ) : ( - + - + - - {t('noNFTs')} - - - - - {t('noNFTsDetails')} - - - - - - - - - + + {t('noNFTs')} + + + + {t('missingNFT')} + + + )}
From 2822379bdc8ffe9077553fab3bc76faa3d777fc1 Mon Sep 17 00:00:00 2001 From: David Walsh Date: Fri, 5 Nov 2021 19:28:44 -0500 Subject: [PATCH 65/97] Improve browser detection code (#12456) * Improve browser detection code * Add unit tests for platform detection * Add test * Use key check instead of object presence --- app/scripts/lib/util.js | 27 ++++++++-------- app/scripts/lib/util.test.js | 63 ++++++++++++++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 16 deletions(-) diff --git a/app/scripts/lib/util.js b/app/scripts/lib/util.js index 9467218ca..c5c35a7d5 100644 --- a/app/scripts/lib/util.js +++ b/app/scripts/lib/util.js @@ -56,21 +56,20 @@ const getEnvironmentType = (url = window.location.href) => * @returns {string} the platform ENUM * */ -const getPlatform = (_) => { - const ua = window.navigator.userAgent; - if (ua.search('Firefox') === -1) { - if (window && window.chrome && window.chrome.ipcRenderer) { - return PLATFORM_BRAVE; - } - if (ua.search('Edge') !== -1) { - return PLATFORM_EDGE; - } - if (ua.search('OPR') !== -1) { - return PLATFORM_OPERA; - } - return PLATFORM_CHROME; +const getPlatform = () => { + const { navigator } = window; + const { userAgent } = navigator; + + if (userAgent.includes('Firefox')) { + return PLATFORM_FIREFOX; + } else if ('brave' in navigator) { + return PLATFORM_BRAVE; + } else if (userAgent.includes('Edg/')) { + return PLATFORM_EDGE; + } else if (userAgent.includes('OPR')) { + return PLATFORM_OPERA; } - return PLATFORM_FIREFOX; + return PLATFORM_CHROME; }; /** diff --git a/app/scripts/lib/util.test.js b/app/scripts/lib/util.test.js index f21c10d5e..d25949bc4 100644 --- a/app/scripts/lib/util.test.js +++ b/app/scripts/lib/util.test.js @@ -1,13 +1,17 @@ import { strict as assert } from 'assert'; +import sinon from 'sinon'; import { isPrefixedFormattedHexString } from '../../../shared/modules/network.utils'; - import { ENVIRONMENT_TYPE_POPUP, ENVIRONMENT_TYPE_NOTIFICATION, ENVIRONMENT_TYPE_FULLSCREEN, ENVIRONMENT_TYPE_BACKGROUND, + PLATFORM_FIREFOX, + PLATFORM_OPERA, + PLATFORM_CHROME, + PLATFORM_EDGE, } from '../../../shared/constants/app'; -import { getEnvironmentType } from './util'; +import { getEnvironmentType, getPlatform } from './util'; describe('app utils', function () { describe('getEnvironmentType', function () { @@ -151,4 +155,59 @@ describe('app utils', function () { ); }); }); + + describe('getPlatform', function () { + const setBrowserSpecificWindow = (browser) => { + switch (browser) { + case 'firefox': { + sinon.stub(window, 'navigator').value({ + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:95.0) Gecko/20100101 Firefox/95.0', + }); + break; + } + case 'edge': { + sinon.stub(window, 'navigator').value({ + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30', + }); + break; + } + case 'opera': { + sinon.stub(window, 'navigator').value({ + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36 OPR/80.0.4170.63', + }); + break; + } + default: { + sinon.stub(window, 'navigator').value({ + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36', + }); + break; + } + } + }; + + it('should detect Firefox', function () { + setBrowserSpecificWindow('firefox'); + assert.equal(getPlatform(), PLATFORM_FIREFOX); + }); + + it('should detect Edge', function () { + setBrowserSpecificWindow('edge'); + assert.equal(getPlatform(), PLATFORM_EDGE); + }); + + it('should detect Opera', function () { + setBrowserSpecificWindow('opera'); + assert.equal(getPlatform(), PLATFORM_OPERA); + }); + + it('should detect Chrome', function () { + setBrowserSpecificWindow('chrome'); + assert.equal(getPlatform(), PLATFORM_CHROME); + }); + }); }); From 17b64e94fcad7914414510a7b33a23ab85f14237 Mon Sep 17 00:00:00 2001 From: David Walsh Date: Fri, 5 Nov 2021 19:59:23 -0500 Subject: [PATCH 66/97] Use gas recommendation constants throughout app (#12461) --- app/scripts/controllers/transactions/index.js | 8 +++--- .../controllers/transactions/index.test.js | 25 +++++++++++-------- .../controllers/transactions/lib/util.test.js | 9 ++++--- shared/constants/gas.js | 5 ++++ .../edit-gas-display.component.js | 3 ++- .../edit-gas-popover.component.js | 20 ++++++++++----- .../edit-gas-popover.stories.js | 18 +++++++------ .../ui/radio-group/radio-group.stories.js | 13 +++++++--- ui/hooks/gasFeeInput/useGasFeeInputs.js | 8 ++++-- ui/hooks/gasFeeInput/useGasFeeInputs.test.js | 25 ++++++++++++------- ui/hooks/gasFeeInput/useGasPriceInput.js | 7 ++++-- ui/hooks/gasFeeInput/useGasPriceInput.test.js | 18 +++++++------ .../gasFeeInput/useMaxFeePerGasInput.test.js | 16 +++++++----- .../useMaxPriorityFeePerGasInput.test.js | 14 +++++++---- ui/hooks/gasFeeInput/utils.js | 8 ++++-- .../confirm-transaction-base.container.js | 3 ++- .../send/send-footer/send-footer.container.js | 3 ++- ...swaps-gas-customization-modal.component.js | 5 ++-- .../view-quote/view-quote-price-difference.js | 3 ++- .../view-quote-price-difference.test.js | 15 +++++------ ui/pages/swaps/view-quote/view-quote.js | 22 ++++++++++------ ui/selectors/confirm-transaction.js | 10 +++++--- 22 files changed, 166 insertions(+), 92 deletions(-) diff --git a/app/scripts/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js index 4c95556ee..74eacc396 100644 --- a/app/scripts/controllers/transactions/index.js +++ b/app/scripts/controllers/transactions/index.js @@ -30,6 +30,8 @@ import { METAMASK_CONTROLLER_EVENTS } from '../../metamask-controller'; import { GAS_LIMITS, GAS_ESTIMATE_TYPES, + GAS_RECOMMENDATIONS, + CUSTOM_GAS_ESTIMATE, } from '../../../../shared/constants/gas'; import { decGWEIToHexWEI } from '../../../../shared/modules/conversion.utils'; import { @@ -435,7 +437,7 @@ export default class TransactionController extends EventEmitter { ) { txMeta.txParams.maxFeePerGas = txMeta.txParams.gasPrice; txMeta.txParams.maxPriorityFeePerGas = txMeta.txParams.gasPrice; - txMeta.userFeeLevel = 'custom'; + txMeta.userFeeLevel = CUSTOM_GAS_ESTIMATE; } else { if ( (defaultMaxFeePerGas && @@ -444,9 +446,9 @@ export default class TransactionController extends EventEmitter { !txMeta.txParams.maxPriorityFeePerGas) || txMeta.origin === 'metamask' ) { - txMeta.userFeeLevel = 'medium'; + txMeta.userFeeLevel = GAS_RECOMMENDATIONS.MEDIUM; } else { - txMeta.userFeeLevel = 'custom'; + txMeta.userFeeLevel = CUSTOM_GAS_ESTIMATE; } if (defaultMaxFeePerGas && !txMeta.txParams.maxFeePerGas) { diff --git a/app/scripts/controllers/transactions/index.test.js b/app/scripts/controllers/transactions/index.test.js index a343fe1ed..dbf7ca9d8 100644 --- a/app/scripts/controllers/transactions/index.test.js +++ b/app/scripts/controllers/transactions/index.test.js @@ -16,7 +16,10 @@ import { } from '../../../../shared/constants/transaction'; import { SECOND } from '../../../../shared/constants/time'; -import { GAS_ESTIMATE_TYPES } from '../../../../shared/constants/gas'; +import { + GAS_ESTIMATE_TYPES, + GAS_RECOMMENDATIONS, +} from '../../../../shared/constants/gas'; import { METAMASK_CONTROLLER_EVENTS } from '../../metamask-controller'; import TransactionController, { TRANSACTION_EVENTS } from '.'; @@ -1001,8 +1004,8 @@ describe('Transaction Controller', function () { to: '0xB09d8505E1F4EF1CeA089D47094f5DD3464083d4', gas: '0x5209', gasPrice: '0xa', - estimateSuggested: 'medium', - estimateUsed: 'high', + estimateSuggested: GAS_RECOMMENDATIONS.MEDIUM, + estimateUsed: GAS_RECOMMENDATIONS.HIGH, }; txController.txStateManager._addTransactionsToState([ { @@ -1702,8 +1705,8 @@ describe('Transaction Controller', function () { maxPriorityFeePerGas: '0x77359400', gas: '0x7b0d', nonce: '0x4b', - estimateSuggested: 'medium', - estimateUsed: 'high', + estimateSuggested: GAS_RECOMMENDATIONS.MEDIUM, + estimateUsed: GAS_RECOMMENDATIONS.HIGH, }, type: TRANSACTION_TYPES.SIMPLE_SEND, origin: 'other', @@ -1730,8 +1733,8 @@ describe('Transaction Controller', function () { first_seen: 1624408066355, transaction_envelope_type: 'fee-market', status: 'unapproved', - estimate_suggested: 'medium', - estimate_used: 'high', + estimate_suggested: GAS_RECOMMENDATIONS.MEDIUM, + estimate_used: GAS_RECOMMENDATIONS.HIGH, }, }; @@ -1804,14 +1807,14 @@ describe('Transaction Controller', function () { const params = { max_fee_per_gas: '0x77359400', max_priority_fee_per_gas: '0x77359400', - estimate_suggested: 'medium', - estimate_used: 'high', + estimate_suggested: GAS_RECOMMENDATIONS.MEDIUM, + estimate_used: GAS_RECOMMENDATIONS.HIGH, }; const expectedParams = { max_fee_per_gas: '2', max_priority_fee_per_gas: '2', - estimate_suggested: 'medium', - estimate_used: 'high', + estimate_suggested: GAS_RECOMMENDATIONS.MEDIUM, + estimate_used: GAS_RECOMMENDATIONS.HIGH, }; const result = txController._getGasValuesInGWEI(params); assert.deepEqual(result, expectedParams); diff --git a/app/scripts/controllers/transactions/lib/util.test.js b/app/scripts/controllers/transactions/lib/util.test.js index b5b94d5fc..6c162ef4e 100644 --- a/app/scripts/controllers/transactions/lib/util.test.js +++ b/app/scripts/controllers/transactions/lib/util.test.js @@ -1,6 +1,7 @@ import { strict as assert } from 'assert'; import { TRANSACTION_ENVELOPE_TYPES } from '../../../../../shared/constants/transaction'; import { BURN_ADDRESS } from '../../../../../shared/modules/hexstring-utils'; +import { GAS_RECOMMENDATIONS } from '../../../../../shared/constants/gas'; import * as txUtils from './util'; describe('txUtils', function () { @@ -323,8 +324,8 @@ describe('txUtils', function () { gasPrice: '1', maxFeePerGas: '1', maxPriorityFeePerGas: '1', - estimateSuggested: 'medium', - estimateUsed: 'high', + estimateSuggested: GAS_RECOMMENDATIONS.MEDIUM, + estimateUsed: GAS_RECOMMENDATIONS.HIGH, type: '1', }; @@ -382,12 +383,12 @@ describe('txUtils', function () { assert.equal( normalizedTxParams.estimateSuggested, - 'medium', + GAS_RECOMMENDATIONS.MEDIUM, 'estimateSuggested should be the string originally provided', ); assert.equal( normalizedTxParams.estimateUsed, - 'high', + GAS_RECOMMENDATIONS.HIGH, 'estimateSuggested should be the string originally provided', ); }); diff --git a/shared/constants/gas.js b/shared/constants/gas.js index ebae444a4..1c0bc8ae7 100644 --- a/shared/constants/gas.js +++ b/shared/constants/gas.js @@ -30,6 +30,11 @@ export const GAS_RECOMMENDATIONS = { HIGH: 'high', }; +/** + * Represents the user customizing their gas preference + */ +export const CUSTOM_GAS_ESTIMATE = 'custom'; + /** * These represent the different edit modes presented in the UI */ diff --git a/ui/components/app/edit-gas-display/edit-gas-display.component.js b/ui/components/app/edit-gas-display/edit-gas-display.component.js index e7b7da25e..99e7e17f6 100644 --- a/ui/components/app/edit-gas-display/edit-gas-display.component.js +++ b/ui/components/app/edit-gas-display/edit-gas-display.component.js @@ -6,6 +6,7 @@ import { GAS_RECOMMENDATIONS, EDIT_GAS_MODES, GAS_ESTIMATE_TYPES, + CUSTOM_GAS_ESTIMATE, } from '../../../../shared/constants/gas'; import Button from '../../ui/button'; @@ -84,7 +85,7 @@ export default function EditGasDisplay({ ); const [showAdvancedForm, setShowAdvancedForm] = useState( - !estimateToUse || estimateToUse === 'custom' || !supportsEIP1559, + !estimateToUse || estimateToUse === CUSTOM_GAS_ESTIMATE || !supportsEIP1559, ); const [hideRadioButtons, setHideRadioButtons] = useState( showAdvancedInlineGasIfPossible, diff --git a/ui/components/app/edit-gas-popover/edit-gas-popover.component.js b/ui/components/app/edit-gas-popover/edit-gas-popover.component.js index e9ab37249..60b73d170 100644 --- a/ui/components/app/edit-gas-popover/edit-gas-popover.component.js +++ b/ui/components/app/edit-gas-popover/edit-gas-popover.component.js @@ -4,7 +4,12 @@ import { useDispatch, useSelector } from 'react-redux'; import { useGasFeeInputs } from '../../../hooks/gasFeeInput/useGasFeeInputs'; import { getGasLoadingAnimationIsShowing } from '../../../ducks/app/app'; import { txParamsAreDappSuggested } from '../../../../shared/modules/transaction.utils'; -import { EDIT_GAS_MODES, GAS_LIMITS } from '../../../../shared/constants/gas'; +import { + EDIT_GAS_MODES, + GAS_LIMITS, + GAS_RECOMMENDATIONS, + CUSTOM_GAS_ESTIMATE, +} from '../../../../shared/constants/gas'; import { decGWEIToHexWEI, @@ -35,7 +40,7 @@ export default function EditGasPopover({ popoverTitle = '', confirmButtonText = '', editGasDisplayProps = {}, - defaultEstimateToUse = 'medium', + defaultEstimateToUse = GAS_RECOMMENDATIONS.MEDIUM, transaction, mode, onClose, @@ -70,7 +75,7 @@ export default function EditGasPopover({ if (mode === EDIT_GAS_MODES.SPEED_UP || mode === EDIT_GAS_MODES.CANCEL) { updatedTransaction = { ...transaction, - userFeeLevel: 'custom', + userFeeLevel: CUSTOM_GAS_ESTIMATE, txParams: { ...transaction.txParams, ...updatedCustomGasSettings, @@ -112,7 +117,8 @@ export default function EditGasPopover({ ); const txParamsHaveBeenCustomized = - estimateToUse === 'custom' || txParamsAreDappSuggested(updatedTransaction); + estimateToUse === CUSTOM_GAS_ESTIMATE || + txParamsAreDappSuggested(updatedTransaction); /** * Temporary placeholder, this should be managed by the parent component but @@ -157,7 +163,7 @@ export default function EditGasPopover({ const updatedTxMeta = { ...updatedTransaction, - userFeeLevel: estimateToUse || 'custom', + userFeeLevel: estimateToUse || CUSTOM_GAS_ESTIMATE, txParams: { ...cleanTransactionParams, ...newGasSettings, @@ -185,7 +191,9 @@ export default function EditGasPopover({ case EDIT_GAS_MODES.SWAPS: // This popover component should only be used for the "FEE_MARKET" type in Swaps. if (supportsEIP1559) { - dispatch(updateSwapsUserFeeLevel(estimateToUse || 'custom')); + dispatch( + updateSwapsUserFeeLevel(estimateToUse || CUSTOM_GAS_ESTIMATE), + ); dispatch(updateCustomSwapsEIP1559GasParams(newGasSettings)); } break; diff --git a/ui/components/app/edit-gas-popover/edit-gas-popover.stories.js b/ui/components/app/edit-gas-popover/edit-gas-popover.stories.js index b18d834be..cf26bdb1c 100644 --- a/ui/components/app/edit-gas-popover/edit-gas-popover.stories.js +++ b/ui/components/app/edit-gas-popover/edit-gas-popover.stories.js @@ -5,7 +5,11 @@ import { boolean } from '@storybook/addon-knobs'; import { decGWEIToHexWEI } from '../../../helpers/utils/conversions.util'; import configureStore from '../../../store/store'; import testData from '../../../../.storybook/test-data'; -import { EDIT_GAS_MODES } from '../../../../shared/constants/gas'; +import { + EDIT_GAS_MODES, + GAS_RECOMMENDATIONS, +} from '../../../../shared/constants/gas'; + import EditGasPopover from '.'; const store = configureStore(testData); @@ -21,7 +25,7 @@ export const Basic = () => {
{ gasPrice: '0x5600', }, }} - defaultEstimateToUse="high" + defaultEstimateToUse={GAS_RECOMMENDATIONS.HIGH} mode={EDIT_GAS_MODES.SWAPS} confirmButtonText="Submit" onClose={() => action(`Close Edit Gas Popover`)()} @@ -45,7 +49,7 @@ export const BasicWithDifferentButtonText = () => { { gasPrice: '0x5600', }, }} - defaultEstimateToUse="high" + defaultEstimateToUse={GAS_RECOMMENDATIONS.HIGH} mode={EDIT_GAS_MODES.SWAPS} onClose={() => action(`Close Edit Gas Popover`)()} minimumGasLimit="5700" @@ -70,7 +74,7 @@ export const EducationalContentFlow = () => { showEducationButton: boolean('Show Education Button', true), }} transaction={{ - userFeeLevel: 'medium', + userFeeLevel: GAS_RECOMMENDATIONS.MEDIUM, txParams: { maxFeePerGas: decGWEIToHexWEI('10000'), maxPriorityFeePerGas: '0x5600', @@ -78,7 +82,7 @@ export const EducationalContentFlow = () => { gasPrice: '0x5600', }, }} - defaultEstimateToUse="high" + defaultEstimateToUse={GAS_RECOMMENDATIONS.HIGH} mode={EDIT_GAS_MODES.SWAPS} confirmButtonText="Submit" onClose={() => action(`Close Edit Gas Popover`)()} diff --git a/ui/components/ui/radio-group/radio-group.stories.js b/ui/components/ui/radio-group/radio-group.stories.js index d14435301..c614e7bad 100644 --- a/ui/components/ui/radio-group/radio-group.stories.js +++ b/ui/components/ui/radio-group/radio-group.stories.js @@ -1,4 +1,5 @@ import React from 'react'; +import { GAS_RECOMMENDATIONS } from '../../../../shared/constants/gas'; import RadioGroup from '.'; export default { @@ -12,11 +13,15 @@ export const radioGroup = () => {
); diff --git a/ui/hooks/gasFeeInput/useGasFeeInputs.js b/ui/hooks/gasFeeInput/useGasFeeInputs.js index 25f6d5c76..e67bd031f 100644 --- a/ui/hooks/gasFeeInput/useGasFeeInputs.js +++ b/ui/hooks/gasFeeInput/useGasFeeInputs.js @@ -4,6 +4,10 @@ import { useSelector } from 'react-redux'; import { getAdvancedInlineGasShown } from '../../selectors'; import { hexToDecimal } from '../../helpers/utils/conversions.util'; import { GAS_FORM_ERRORS } from '../../helpers/constants/gas'; +import { + GAS_RECOMMENDATIONS, + CUSTOM_GAS_ESTIMATE, +} from '../../../shared/constants/gas'; import { useGasFeeEstimates } from '../useGasFeeEstimates'; import { useGasFeeErrors } from './useGasFeeErrors'; @@ -58,7 +62,7 @@ import { useGasEstimates } from './useGasEstimates'; * ).GasEstimates} - gas fee input state and the GasFeeEstimates object */ export function useGasFeeInputs( - defaultEstimateToUse = 'medium', + defaultEstimateToUse = GAS_RECOMMENDATIONS.MEDIUM, transaction, minimumGasLimit = '0x5208', editGasMode, @@ -199,7 +203,7 @@ export function useGasFeeInputs( ); const onManualChange = useCallback(() => { - setInternalEstimateToUse('custom'); + setInternalEstimateToUse(CUSTOM_GAS_ESTIMATE); handleGasLimitOutOfBoundError(); // Restore existing values setGasPrice(gasPrice); diff --git a/ui/hooks/gasFeeInput/useGasFeeInputs.test.js b/ui/hooks/gasFeeInput/useGasFeeInputs.test.js index 277812185..5127c61b7 100644 --- a/ui/hooks/gasFeeInput/useGasFeeInputs.test.js +++ b/ui/hooks/gasFeeInput/useGasFeeInputs.test.js @@ -1,6 +1,10 @@ import { act, renderHook } from '@testing-library/react-hooks'; import { useSelector } from 'react-redux'; import { TRANSACTION_ENVELOPE_TYPES } from '../../../shared/constants/transaction'; +import { + GAS_RECOMMENDATIONS, + CUSTOM_GAS_ESTIMATE, +} from '../../../shared/constants/gas'; import { ETH, PRIMARY } from '../../helpers/constants/common'; @@ -116,7 +120,7 @@ describe('useGasFeeInputs', () => { it('returns gasPrice appropriately, and "0" for EIP1559 fields', () => { const { result } = renderHook(() => - useGasFeeInputs('medium', { + useGasFeeInputs(GAS_RECOMMENDATIONS.MEDIUM, { txParams: { value: '3782DACE9D90000', gasLimit: '0x5028', @@ -167,7 +171,10 @@ describe('useGasFeeInputs', () => { }), ); const { result } = renderHook(() => - useGasFeeInputs(null, { txParams: {}, userFeeLevel: 'medium' }), + useGasFeeInputs(null, { + txParams: {}, + userFeeLevel: GAS_RECOMMENDATIONS.MEDIUM, + }), ); expect(result.current.maxFeePerGas).toBe( FEE_MARKET_ESTIMATE_RETURN_VALUE.gasFeeEstimates.medium @@ -226,7 +233,7 @@ describe('useGasFeeInputs', () => { it('should return true', () => { const { result } = renderHook(() => useGasFeeInputs(null, { - userFeeLevel: 'medium', + userFeeLevel: GAS_RECOMMENDATIONS.MEDIUM, txParams: { gas: '0x5208' }, }), ); @@ -242,14 +249,14 @@ describe('useGasFeeInputs', () => { it('should change estimateToUse value', () => { const { result } = renderHook(() => useGasFeeInputs(null, { - userFeeLevel: 'medium', + userFeeLevel: GAS_RECOMMENDATIONS.MEDIUM, txParams: { gas: '0x5208' }, }), ); act(() => { - result.current.setEstimateToUse('high'); + result.current.setEstimateToUse(GAS_RECOMMENDATIONS.HIGH); }); - expect(result.current.estimateToUse).toBe('high'); + expect(result.current.estimateToUse).toBe(GAS_RECOMMENDATIONS.HIGH); expect(result.current.maxFeePerGas).toBe( FEE_MARKET_ESTIMATE_RETURN_VALUE.gasFeeEstimates.high .suggestedMaxFeePerGas, @@ -269,7 +276,7 @@ describe('useGasFeeInputs', () => { it('should change estimateToUse value to custom', () => { const { result } = renderHook(() => useGasFeeInputs(null, { - userFeeLevel: 'medium', + userFeeLevel: GAS_RECOMMENDATIONS.MEDIUM, txParams: { gas: '0x5208' }, }), ); @@ -278,7 +285,7 @@ describe('useGasFeeInputs', () => { result.current.setMaxFeePerGas('100'); result.current.setMaxPriorityFeePerGas('10'); }); - expect(result.current.estimateToUse).toBe('custom'); + expect(result.current.estimateToUse).toBe(CUSTOM_GAS_ESTIMATE); expect(result.current.maxFeePerGas).toBe('100'); expect(result.current.maxPriorityFeePerGas).toBe('10'); }); @@ -298,7 +305,7 @@ describe('useGasFeeInputs', () => { it('does not return fiat values', () => { const { result } = renderHook(() => useGasFeeInputs(null, { - userFeeLevel: 'medium', + userFeeLevel: GAS_RECOMMENDATIONS.MEDIUM, txParams: { gas: '0x5208' }, }), ); diff --git a/ui/hooks/gasFeeInput/useGasPriceInput.js b/ui/hooks/gasFeeInput/useGasPriceInput.js index 2e278da00..acc12207e 100644 --- a/ui/hooks/gasFeeInput/useGasPriceInput.js +++ b/ui/hooks/gasFeeInput/useGasPriceInput.js @@ -1,7 +1,10 @@ import { useState } from 'react'; import { isEqual } from 'lodash'; -import { GAS_ESTIMATE_TYPES } from '../../../shared/constants/gas'; +import { + GAS_ESTIMATE_TYPES, + CUSTOM_GAS_ESTIMATE, +} from '../../../shared/constants/gas'; import { hexWEIToDecGWEI } from '../../helpers/utils/conversions.util'; import { isLegacyTransaction } from '../../helpers/utils/transactions.util'; @@ -30,7 +33,7 @@ export function useGasPriceInput({ transaction, }) { const [gasPriceHasBeenManuallySet, setGasPriceHasBeenManuallySet] = useState( - transaction?.userFeeLevel === 'custom', + transaction?.userFeeLevel === CUSTOM_GAS_ESTIMATE, ); const [gasPrice, setGasPrice] = useState(() => { diff --git a/ui/hooks/gasFeeInput/useGasPriceInput.test.js b/ui/hooks/gasFeeInput/useGasPriceInput.test.js index 9514f969a..9f1d27431 100644 --- a/ui/hooks/gasFeeInput/useGasPriceInput.test.js +++ b/ui/hooks/gasFeeInput/useGasPriceInput.test.js @@ -1,5 +1,9 @@ import { act, renderHook } from '@testing-library/react-hooks'; +import { + GAS_RECOMMENDATIONS, + CUSTOM_GAS_ESTIMATE, +} from '../../../shared/constants/gas'; import { FEE_MARKET_ESTIMATE_RETURN_VALUE, LEGACY_GAS_ESTIMATE_RETURN_VALUE, @@ -30,7 +34,7 @@ describe('useGasPriceInput', () => { const { result } = renderHook(() => useGasPriceInput({ transaction: { - userFeeLevel: 'custom', + userFeeLevel: CUSTOM_GAS_ESTIMATE, txParams: { gasPrice: '0x5028' }, }, }), @@ -42,9 +46,9 @@ describe('useGasPriceInput', () => { configure(); const { result } = renderHook(() => useGasPriceInput({ - estimateToUse: 'high', + estimateToUse: GAS_RECOMMENDATIONS.HIGH, transaction: { - userFeeLevel: 'high', + userFeeLevel: GAS_RECOMMENDATIONS.HIGH, txParams: { gasPrice: '0x5028' }, }, ...LEGACY_GAS_ESTIMATE_RETURN_VALUE, @@ -56,7 +60,7 @@ describe('useGasPriceInput', () => { it('if no gasPrice is provided returns default estimate for legacy transaction', () => { const { result } = renderHook(() => useGasPriceInput({ - estimateToUse: 'medium', + estimateToUse: GAS_RECOMMENDATIONS.MEDIUM, ...LEGACY_GAS_ESTIMATE_RETURN_VALUE, }), ); @@ -66,7 +70,7 @@ describe('useGasPriceInput', () => { it('for legacy transaction if estimateToUse is high and no gasPrice is provided returns high estimate value', () => { const { result } = renderHook(() => useGasPriceInput({ - estimateToUse: 'high', + estimateToUse: GAS_RECOMMENDATIONS.HIGH, ...LEGACY_GAS_ESTIMATE_RETURN_VALUE, }), ); @@ -76,7 +80,7 @@ describe('useGasPriceInput', () => { it('returns 0 if gasPrice is not present in transaction and estimates are also not legacy', () => { const { result } = renderHook(() => useGasPriceInput({ - estimateToUse: 'medium', + estimateToUse: GAS_RECOMMENDATIONS.MEDIUM, ...FEE_MARKET_ESTIMATE_RETURN_VALUE, }), ); @@ -85,7 +89,7 @@ describe('useGasPriceInput', () => { it('returns gasPrice set by user if gasPriceHasBeenManuallySet is true', () => { const { result } = renderHook(() => - useGasPriceInput({ estimateToUse: 'medium' }), + useGasPriceInput({ estimateToUse: GAS_RECOMMENDATIONS.MEDIUM }), ); act(() => { result.current.setGasPriceHasBeenManuallySet(true); diff --git a/ui/hooks/gasFeeInput/useMaxFeePerGasInput.test.js b/ui/hooks/gasFeeInput/useMaxFeePerGasInput.test.js index d51c57c0e..318e9d7e9 100644 --- a/ui/hooks/gasFeeInput/useMaxFeePerGasInput.test.js +++ b/ui/hooks/gasFeeInput/useMaxFeePerGasInput.test.js @@ -3,6 +3,10 @@ import { act, renderHook } from '@testing-library/react-hooks'; import { getMaximumGasTotalInHexWei } from '../../../shared/modules/gas.utils'; import { decimalToHex } from '../../helpers/utils/conversions.util'; +import { + GAS_RECOMMENDATIONS, + CUSTOM_GAS_ESTIMATE, +} from '../../../shared/constants/gas'; import { FEE_MARKET_ESTIMATE_RETURN_VALUE, @@ -31,9 +35,9 @@ const renderUseMaxFeePerGasInputHook = (props) => renderHook(() => useMaxFeePerGasInput({ gasLimit: '21000', - estimateToUse: 'medium', + estimateToUse: GAS_RECOMMENDATIONS.MEDIUM, transaction: { - userFeeLevel: 'custom', + userFeeLevel: CUSTOM_GAS_ESTIMATE, txParams: { maxFeePerGas: '0x5028' }, }, ...FEE_MARKET_ESTIMATE_RETURN_VALUE, @@ -55,7 +59,7 @@ describe('useMaxFeePerGasInput', () => { it('returns gasPrice values from transaction if transaction.userFeeLevel is custom and maxFeePerGas is not provided', () => { const { result } = renderUseMaxFeePerGasInputHook({ transaction: { - userFeeLevel: 'custom', + userFeeLevel: CUSTOM_GAS_ESTIMATE, txParams: { gasPrice: '0x5028' }, }, }); @@ -64,9 +68,9 @@ describe('useMaxFeePerGasInput', () => { it('does not returns maxFeePerGas values from transaction if transaction.userFeeLevel is not custom', () => { const { result } = renderUseMaxFeePerGasInputHook({ - estimateToUse: 'high', + estimateToUse: GAS_RECOMMENDATIONS.HIGH, transaction: { - userFeeLevel: 'high', + userFeeLevel: GAS_RECOMMENDATIONS.HIGH, txParams: { maxFeePerGas: '0x5028' }, }, }); @@ -79,7 +83,7 @@ describe('useMaxFeePerGasInput', () => { it('if no maxFeePerGas is provided by user or in transaction it returns value from fee market estimate', () => { const { result } = renderUseMaxFeePerGasInputHook({ transaction: { - userFeeLevel: 'high', + userFeeLevel: GAS_RECOMMENDATIONS.HIGH, txParams: {}, }, }); diff --git a/ui/hooks/gasFeeInput/useMaxPriorityFeePerGasInput.test.js b/ui/hooks/gasFeeInput/useMaxPriorityFeePerGasInput.test.js index 4539a2363..5601ef98a 100644 --- a/ui/hooks/gasFeeInput/useMaxPriorityFeePerGasInput.test.js +++ b/ui/hooks/gasFeeInput/useMaxPriorityFeePerGasInput.test.js @@ -1,6 +1,10 @@ import { useSelector } from 'react-redux'; import { act, renderHook } from '@testing-library/react-hooks'; +import { + GAS_RECOMMENDATIONS, + CUSTOM_GAS_ESTIMATE, +} from '../../../shared/constants/gas'; import { FEE_MARKET_ESTIMATE_RETURN_VALUE, LEGACY_GAS_ESTIMATE_RETURN_VALUE, @@ -28,9 +32,9 @@ const renderUseMaxPriorityFeePerGasInputHook = (props) => { return renderHook(() => useMaxPriorityFeePerGasInput({ gasLimit: '21000', - estimateToUse: 'medium', + estimateToUse: GAS_RECOMMENDATIONS.MEDIUM, transaction: { - userFeeLevel: 'custom', + userFeeLevel: CUSTOM_GAS_ESTIMATE, txParams: { maxPriorityFeePerGas: '0x5028' }, }, ...FEE_MARKET_ESTIMATE_RETURN_VALUE, @@ -56,7 +60,7 @@ describe('useMaxPriorityFeePerGasInput', () => { it('returns maxFeePerGas values from transaction if transaction.userFeeLevel is custom and maxPriorityFeePerGas is not provided', () => { const { result } = renderUseMaxPriorityFeePerGasInputHook({ transaction: { - userFeeLevel: 'custom', + userFeeLevel: CUSTOM_GAS_ESTIMATE, txParams: { maxFeePerGas: '0x5028' }, }, }); @@ -65,9 +69,9 @@ describe('useMaxPriorityFeePerGasInput', () => { it('does not returns maxPriorityFeePerGas values from transaction if transaction.userFeeLevel is not custom', () => { const { result } = renderUseMaxPriorityFeePerGasInputHook({ - estimateToUse: 'high', + estimateToUse: GAS_RECOMMENDATIONS.HIGH, transaction: { - userFeeLevel: 'high', + userFeeLevel: GAS_RECOMMENDATIONS.HIGH, txParams: { maxPriorityFeePerGas: '0x5028' }, }, }); diff --git a/ui/hooks/gasFeeInput/utils.js b/ui/hooks/gasFeeInput/utils.js index ce8b76ac7..3c27f6416 100644 --- a/ui/hooks/gasFeeInput/utils.js +++ b/ui/hooks/gasFeeInput/utils.js @@ -1,4 +1,7 @@ -import { GAS_ESTIMATE_TYPES } from '../../../shared/constants/gas'; +import { + GAS_ESTIMATE_TYPES, + CUSTOM_GAS_ESTIMATE, +} from '../../../shared/constants/gas'; export function getGasFeeEstimate( field, @@ -14,4 +17,5 @@ export function getGasFeeEstimate( } export const feeParamsAreCustom = (transaction) => - !transaction?.userFeeLevel || transaction?.userFeeLevel === 'custom'; + !transaction?.userFeeLevel || + transaction?.userFeeLevel === CUSTOM_GAS_ESTIMATE; diff --git a/ui/pages/confirm-transaction-base/confirm-transaction-base.container.js b/ui/pages/confirm-transaction-base/confirm-transaction-base.container.js index dfaa57a57..5ba1a215f 100644 --- a/ui/pages/confirm-transaction-base/confirm-transaction-base.container.js +++ b/ui/pages/confirm-transaction-base/confirm-transaction-base.container.js @@ -48,6 +48,7 @@ import { toChecksumHexAddress } from '../../../shared/modules/hexstring-utils'; import { getGasLoadingAnimationIsShowing } from '../../ducks/app/app'; import { isLegacyTransaction } from '../../helpers/utils/transactions.util'; +import { CUSTOM_GAS_ESTIMATE } from '../../../shared/constants/gas'; import ConfirmTransactionBase from './confirm-transaction-base.component'; let customNonceValue = ''; @@ -168,7 +169,7 @@ const mapStateToProps = (state, ownProps) => { const noGasPrice = !supportsEIP1559 && getNoGasPriceFetched(state); const { useNativeCurrencyAsPrimaryCurrency } = getPreferences(state); const gasFeeIsCustom = - fullTxData.userFeeLevel === 'custom' || + fullTxData.userFeeLevel === CUSTOM_GAS_ESTIMATE || txParamsAreDappSuggested(fullTxData); const fromAddressIsLedger = isAddressLedger(state, fromAddress); const nativeCurrency = getNativeCurrency(state); diff --git a/ui/pages/send/send-footer/send-footer.container.js b/ui/pages/send/send-footer/send-footer.container.js index eba93e5d7..3ec6ddbc1 100644 --- a/ui/pages/send/send-footer/send-footer.container.js +++ b/ui/pages/send/send-footer/send-footer.container.js @@ -17,6 +17,7 @@ import { import { getMostRecentOverviewPage } from '../../../ducks/history/history'; import { addHexPrefix } from '../../../../app/scripts/lib/util'; import { getSendToAccounts } from '../../../ducks/metamask/metamask'; +import { CUSTOM_GAS_ESTIMATE } from '../../../../shared/constants/gas'; import SendFooter from './send-footer.component'; export default connect(mapStateToProps, mapDispatchToProps)(SendFooter); @@ -39,7 +40,7 @@ function mapStateToProps(state) { const gasEstimateType = activeButtonIndex >= 0 ? gasButtonInfo[activeButtonIndex].gasEstimateType - : 'custom'; + : CUSTOM_GAS_ESTIMATE; return { disabled: isSendFormInvalid(state), diff --git a/ui/pages/swaps/swaps-gas-customization-modal/swaps-gas-customization-modal.component.js b/ui/pages/swaps/swaps-gas-customization-modal/swaps-gas-customization-modal.component.js index dc3c32285..d0f21cfe0 100644 --- a/ui/pages/swaps/swaps-gas-customization-modal/swaps-gas-customization-modal.component.js +++ b/ui/pages/swaps/swaps-gas-customization-modal/swaps-gas-customization-modal.component.js @@ -7,6 +7,7 @@ import { sumHexWEIsToUnformattedFiat } from '../../../helpers/utils/conversions. import AdvancedGasInputs from '../../../components/app/gas-customization/advanced-gas-inputs'; import BasicTabContent from '../../../components/app/gas-customization/gas-modal-page-container/basic-tab-content'; import { GAS_ESTIMATE_TYPES } from '../../../helpers/constants/common'; +import { CUSTOM_GAS_ESTIMATE } from '../../../../shared/constants/gas'; export default class GasModalPageContainer extends Component { static contextTypes = { @@ -99,11 +100,11 @@ export default class GasModalPageContainer extends Component {
{ - this.setState({ gasSpeedType: 'custom' }); + this.setState({ gasSpeedType: CUSTOM_GAS_ESTIMATE }); setSwapsCustomizationModalPrice(updatedPrice); }} updateCustomGasLimit={(updatedLimit) => { - this.setState({ gasSpeedType: 'custom' }); + this.setState({ gasSpeedType: CUSTOM_GAS_ESTIMATE }); setSwapsCustomizationModalLimit(updatedLimit); }} customGasPrice={customGasPrice} diff --git a/ui/pages/swaps/view-quote/view-quote-price-difference.js b/ui/pages/swaps/view-quote/view-quote-price-difference.js index af73963e1..343083ce5 100644 --- a/ui/pages/swaps/view-quote/view-quote-price-difference.js +++ b/ui/pages/swaps/view-quote/view-quote-price-difference.js @@ -11,6 +11,7 @@ import { JUSTIFY_CONTENT, DISPLAY, } from '../../../helpers/constants/design-system'; +import { GAS_RECOMMENDATIONS } from '../../../../shared/constants/gas'; export default function ViewQuotePriceDifference(props) { const { @@ -35,7 +36,7 @@ export default function ViewQuotePriceDifference(props) { // A calculation error signals we cannot determine dollar value priceDifferenceTitle = t('swapPriceUnavailableTitle'); priceDifferenceMessage = t('swapPriceUnavailableDescription'); - priceDifferenceClass = 'high'; + priceDifferenceClass = GAS_RECOMMENDATIONS.HIGH; priceDifferenceAcknowledgementText = t('tooltipApproveButton'); } else { priceDifferenceTitle = t('swapPriceDifferenceTitle', [ diff --git a/ui/pages/swaps/view-quote/view-quote-price-difference.test.js b/ui/pages/swaps/view-quote/view-quote-price-difference.test.js index cd94ab4a0..085cb8ea2 100644 --- a/ui/pages/swaps/view-quote/view-quote-price-difference.test.js +++ b/ui/pages/swaps/view-quote/view-quote-price-difference.test.js @@ -3,6 +3,7 @@ import { shallow } from 'enzyme'; import { Provider } from 'react-redux'; import configureMockStore from 'redux-mock-store'; import { NETWORK_TYPE_RPC } from '../../../../shared/constants/network'; +import { GAS_RECOMMENDATIONS } from '../../../../shared/constants/gas'; import ViewQuotePriceDifference from './view-quote-price-difference'; describe('View Price Quote Difference', () => { @@ -48,7 +49,7 @@ describe('View Price Quote Difference', () => { priceSlippage: { ratio: 1.007876641534847, calculationError: '', - bucket: 'low', + bucket: GAS_RECOMMENDATIONS.LOW, sourceAmountInETH: 1, destinationAmountInETH: 0.9921849150875727, }, @@ -113,7 +114,7 @@ describe('View Price Quote Difference', () => { it('does not render when the item is in the low bucket', () => { const props = { ...DEFAULT_PROPS }; - props.usedQuote.priceSlippage.bucket = 'low'; + props.usedQuote.priceSlippage.bucket = GAS_RECOMMENDATIONS.LOW; renderComponent(props); const wrappingDiv = component.find( @@ -124,18 +125,18 @@ describe('View Price Quote Difference', () => { it('displays an error when in medium bucket', () => { const props = { ...DEFAULT_PROPS }; - props.usedQuote.priceSlippage.bucket = 'medium'; + props.usedQuote.priceSlippage.bucket = GAS_RECOMMENDATIONS.MEDIUM; renderComponent(props); - expect(component.html()).toContain('medium'); + expect(component.html()).toContain(GAS_RECOMMENDATIONS.MEDIUM); }); it('displays an error when in high bucket', () => { const props = { ...DEFAULT_PROPS }; - props.usedQuote.priceSlippage.bucket = 'high'; + props.usedQuote.priceSlippage.bucket = GAS_RECOMMENDATIONS.HIGH; renderComponent(props); - expect(component.html()).toContain('high'); + expect(component.html()).toContain(GAS_RECOMMENDATIONS.HIGH); }); it('displays a fiat error when calculationError is present', () => { @@ -144,6 +145,6 @@ describe('View Price Quote Difference', () => { 'Could not determine price.'; renderComponent(props); - expect(component.html()).toContain('high'); + expect(component.html()).toContain(GAS_RECOMMENDATIONS.HIGH); }); }); diff --git a/ui/pages/swaps/view-quote/view-quote.js b/ui/pages/swaps/view-quote/view-quote.js index f64fc185b..7ec692c80 100644 --- a/ui/pages/swaps/view-quote/view-quote.js +++ b/ui/pages/swaps/view-quote/view-quote.js @@ -93,7 +93,10 @@ import { } from '../swaps.util'; import { useTokenTracker } from '../../../hooks/useTokenTracker'; import { QUOTES_EXPIRED_ERROR } from '../../../../shared/constants/swaps'; -import { EDIT_GAS_MODES } from '../../../../shared/constants/gas'; +import { + EDIT_GAS_MODES, + GAS_RECOMMENDATIONS, +} from '../../../../shared/constants/gas'; import CountdownTimer from '../countdown-timer'; import SwapsFooter from '../swaps-footer'; import ViewQuotePriceDifference from './view-quote-price-difference'; @@ -117,7 +120,10 @@ export default function ViewQuote() { acknowledgedPriceDifference, setAcknowledgedPriceDifference, ] = useState(false); - const priceDifferenceRiskyBuckets = ['high', 'medium']; + const priceDifferenceRiskyBuckets = [ + GAS_RECOMMENDATIONS.HIGH, + GAS_RECOMMENDATIONS.MEDIUM, + ]; const routeState = useSelector(getBackgroundSwapRouteState); const quotes = useSelector(getQuotes, isEqual); @@ -163,8 +169,8 @@ export default function ViewQuote() { if (networkAndAccountSupports1559) { // For Swaps we want to get 'high' estimations by default. // eslint-disable-next-line react-hooks/rules-of-hooks - gasFeeInputs = useGasFeeInputs('high', { - userFeeLevel: swapsUserFeeLevel || 'high', + gasFeeInputs = useGasFeeInputs(GAS_RECOMMENDATIONS.HIGH, { + userFeeLevel: swapsUserFeeLevel || GAS_RECOMMENDATIONS.HIGH, }); } @@ -592,8 +598,8 @@ export default function ViewQuote() { useEffect(() => { if ( acknowledgedPriceDifference && - lastPriceDifferenceBucket === 'medium' && - priceSlippageBucket === 'high' + lastPriceDifferenceBucket === GAS_RECOMMENDATIONS.MEDIUM && + priceSlippageBucket === GAS_RECOMMENDATIONS.HIGH ) { setAcknowledgedPriceDifference(false); } @@ -695,7 +701,7 @@ export default function ViewQuote() { {showEditGasPopover && networkAndAccountSupports1559 && ( Date: Sun, 7 Nov 2021 21:07:15 -0330 Subject: [PATCH 67/97] Throw, and not just display, ledgerDeviceOpenFailureMessage on failed to open device error in ledger connect flow (#12613) --- ui/store/actions.js | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/store/actions.js b/ui/store/actions.js index e23781079..ac489f467 100644 --- a/ui/store/actions.js +++ b/ui/store/actions.js @@ -441,6 +441,7 @@ export function connectHardware(deviceName, page, hdPath, t) { error.message.match('Failed to open the device') ) { dispatch(displayWarning(t('ledgerDeviceOpenFailureMessage'))); + throw new Error(t('ledgerDeviceOpenFailureMessage')); } else { dispatch(displayWarning(error.message)); throw error; From 722c4e5b636eb0cc6ae9593ba3f2b8088cdc4b4a Mon Sep 17 00:00:00 2001 From: Alex Miller Date: Mon, 8 Nov 2021 08:48:41 -0600 Subject: [PATCH 68/97] Support for GridPlus Lattice1 hardware wallet (#12053) * GridPlus: Adds support for GridPlus Lattice1 hardware wallet * Fixes issue with switching hardware HD path The main `Select HD Path` piece of the account selection component was not properly hooked up to the state manager (`onPathChange`) and the extra `Popover` component was being used instead. I'm not sure what the origin of this is, but I don't see why the Popover is needed at all. I have remove it and hooked `onPathChange` directly into the HD path selector dropdown. This was an issue that nearly every Lattice user who had come from Ledger has contacted us about. * GridPlus: Addresses QA issues * Adds Lattice tutorial + image * Cleans up connectivity issues (see: https://github.com/GridPlus/eth-lattice-keyring/pull/16) * GridPlus: Adds Firefox support To connect to the Lattice you need to open a new tab/window and get login data from it. We were not able to do this for Firefox because we relied on the `window` API. This is now fixed. See corresponding changes: * `eth-lattice-keyring`: https://github.com/GridPlus/eth-lattice-keyring/pull/17 * Lattice connector: https://github.com/GridPlus/wallet-web/pull/152 * GridPlus: Adds missing error path for Firefox See: https://github.com/GridPlus/eth-lattice-keyring/commit/242a93f559943c324eeb5e0c0a952e14ed9ae6fd --- app/_locales/am/messages.json | 3 - app/_locales/ar/messages.json | 3 - app/_locales/bg/messages.json | 3 - app/_locales/bn/messages.json | 3 - app/_locales/ca/messages.json | 3 - app/_locales/da/messages.json | 3 - app/_locales/de/messages.json | 3 - app/_locales/el/messages.json | 3 - app/_locales/en/messages.json | 22 +- app/_locales/es/messages.json | 13 - app/_locales/es_419/messages.json | 13 - app/_locales/et/messages.json | 3 - app/_locales/fa/messages.json | 3 - app/_locales/fi/messages.json | 3 - app/_locales/fil/messages.json | 3 - app/_locales/fr/messages.json | 3 - app/_locales/he/messages.json | 3 - app/_locales/hi/messages.json | 13 - app/_locales/hr/messages.json | 3 - app/_locales/ht/messages.json | 3 - app/_locales/hu/messages.json | 3 - app/_locales/id/messages.json | 13 - app/_locales/it/messages.json | 3 - app/_locales/ja/messages.json | 13 - app/_locales/kn/messages.json | 3 - app/_locales/ko/messages.json | 13 - app/_locales/lt/messages.json | 3 - app/_locales/lv/messages.json | 3 - app/_locales/ms/messages.json | 3 - app/_locales/no/messages.json | 3 - app/_locales/ph/messages.json | 13 - app/_locales/pl/messages.json | 3 - app/_locales/pt_BR/messages.json | 13 - app/_locales/ro/messages.json | 3 - app/_locales/ru/messages.json | 13 - app/_locales/sk/messages.json | 3 - app/_locales/sl/messages.json | 3 - app/_locales/sr/messages.json | 3 - app/_locales/sv/messages.json | 3 - app/_locales/sw/messages.json | 3 - app/_locales/tl/messages.json | 3 - app/_locales/uk/messages.json | 3 - app/_locales/vi/messages.json | 13 - app/_locales/zh_CN/messages.json | 3 - app/images/connect-lattice.svg | 18 + app/images/lattice-logo.png | Bin 0 -> 27102 bytes app/manifest/_base.json | 1 + app/scripts/metamask-controller.js | 23 +- development/states/navigate-txs.json | 320 ++++++++++++++++++ package.json | 2 + shared/constants/hardware-wallets.js | 1 + .../account-menu/account-menu.component.js | 1 + ui/ducks/app/app.js | 1 + ui/ducks/app/app.test.js | 1 + .../connect-hardware/account-list.js | 61 +--- .../create-account/connect-hardware/index.js | 24 +- .../connect-hardware/select-hardware.js | 65 ++++ ui/selectors/selectors.js | 1 + yarn.lock | 204 ++++++++++- 59 files changed, 661 insertions(+), 313 deletions(-) create mode 100644 app/images/connect-lattice.svg create mode 100644 app/images/lattice-logo.png create mode 100644 development/states/navigate-txs.json diff --git a/app/_locales/am/messages.json b/app/_locales/am/messages.json index 124a4d294..4c4b6732c 100644 --- a/app/_locales/am/messages.json +++ b/app/_locales/am/messages.json @@ -844,9 +844,6 @@ "selectAnAccount": { "message": "መለያ ይምረጡ" }, - "selectAnAccountHelp": { - "message": "መለያውን በ MetaMask ለማየት ይምረጡ" - }, "selectEachPhrase": { "message": "እባክዎ እያንዳንዱን ሐረግ በመምረጥ ትክክለኛነቱን ያረጋግጡ።" }, diff --git a/app/_locales/ar/messages.json b/app/_locales/ar/messages.json index 78750b0d2..4dbec586e 100644 --- a/app/_locales/ar/messages.json +++ b/app/_locales/ar/messages.json @@ -840,9 +840,6 @@ "selectAnAccount": { "message": "قم بتحديد حساب" }, - "selectAnAccountHelp": { - "message": "حدد الحساب لعرضه في MetaMask" - }, "selectEachPhrase": { "message": "يُرجى تحديد كل عبارة للتأكد من صحتها." }, diff --git a/app/_locales/bg/messages.json b/app/_locales/bg/messages.json index 79c0fc2d6..4105c3729 100644 --- a/app/_locales/bg/messages.json +++ b/app/_locales/bg/messages.json @@ -843,9 +843,6 @@ "selectAnAccount": { "message": "Изберете акаунт" }, - "selectAnAccountHelp": { - "message": "Изберете акаунта за преглед в MetaMask" - }, "selectEachPhrase": { "message": "Моля, изберете всяка фраза, за да се уверите, че е правилна." }, diff --git a/app/_locales/bn/messages.json b/app/_locales/bn/messages.json index ed0cf5418..1e3996595 100644 --- a/app/_locales/bn/messages.json +++ b/app/_locales/bn/messages.json @@ -847,9 +847,6 @@ "selectAnAccount": { "message": "একটি অ্যাকাউন্ট নির্বাচন করুন" }, - "selectAnAccountHelp": { - "message": "MetaMask এ দেখতে অ্যাকাউন্টটি নির্বাচন করুন" - }, "selectEachPhrase": { "message": "ফ্রেজগুলি সঠিক তা নিশ্চিত করতে অনুগ্রহ করে প্রতিটি ফ্রেজ নির্বাচন করুন।" }, diff --git a/app/_locales/ca/messages.json b/app/_locales/ca/messages.json index 971ab3a80..0d910f560 100644 --- a/app/_locales/ca/messages.json +++ b/app/_locales/ca/messages.json @@ -825,9 +825,6 @@ "selectAnAccount": { "message": "Selecciona un Compte" }, - "selectAnAccountHelp": { - "message": "Selecciona el compte que vols veure a MetaMask" - }, "selectEachPhrase": { "message": "Si us plau selecciona cada frase per a assegurar-te que és correcta." }, diff --git a/app/_locales/da/messages.json b/app/_locales/da/messages.json index c6451cc4e..c333d6692 100644 --- a/app/_locales/da/messages.json +++ b/app/_locales/da/messages.json @@ -828,9 +828,6 @@ "selectAnAccount": { "message": "Vælg en Konto" }, - "selectAnAccountHelp": { - "message": "Vælg kontoen der skal vises i MetaMask" - }, "selectEachPhrase": { "message": "Vælg venligst hver sætning, for at sikre at de er korrekte." }, diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json index 6a9d2a4f1..fdd26afb6 100644 --- a/app/_locales/de/messages.json +++ b/app/_locales/de/messages.json @@ -819,9 +819,6 @@ "selectAnAccount": { "message": "Ein Konto auswählen" }, - "selectAnAccountHelp": { - "message": "Wählen Sie das Konto aus, das in MetaMask angezeigt werden soll." - }, "selectEachPhrase": { "message": "Bitte wählen Sie jede Phrase aus, um sicherzustellen, dass sie korrekt ist." }, diff --git a/app/_locales/el/messages.json b/app/_locales/el/messages.json index 30013f869..02871aad7 100644 --- a/app/_locales/el/messages.json +++ b/app/_locales/el/messages.json @@ -844,9 +844,6 @@ "selectAnAccount": { "message": "Επιλέξτε Λογαριασμό" }, - "selectAnAccountHelp": { - "message": "Επιλέξτε τον λογαριασμό για προβολή στο MetaMask" - }, "selectEachPhrase": { "message": "Παρακαλούμε επιλέξτε κάθε φράση, για να βεβαιωθείτε ότι είναι σωστή." }, diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index d1f2af8dd..144ddd140 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -2123,13 +2123,6 @@ "selectAnAccountAlreadyConnected": { "message": "This account has already been connected to MetaMask" }, - "selectAnAccountHelp": { - "message": "Select an account to view in MetaMask." - }, - "selectAnAccountHelpDirections": { - "message": "Don't see your account? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "Please select each phrase in order to make sure it is correct." }, @@ -2137,7 +2130,7 @@ "message": "Select HD Path" }, "selectPathHelp": { - "message": "If you don't see your existing Ledger accounts below, try switching paths to \"Legacy (MEW / MyCrypto)\"" + "message": "If you don't see the accounts you expect, try switching the HD path." }, "selectType": { "message": "Select Type" @@ -2310,6 +2303,13 @@ "statusNotConnected": { "message": "Not connected" }, + "step1LatticeWallet": { + "message": "Make sure your Lattice1 is ready to connect" + }, + "step1LatticeWalletMsg": { + "message": "You can connect MetaMask to your Lattice1 device once it is set up and online. Unlock your device and have your Device ID ready. For more on using hardware wallets, $1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, "step1LedgerWallet": { "message": "Download Ledger app" }, @@ -2673,12 +2673,6 @@ "switchEthereumChainConfirmationTitle": { "message": "Allow this site to switch the network?" }, - "switchLedgerPaths": { - "message": "Switch Ledger paths" - }, - "switchLedgerPathsText": { - "message": "Select the Ledger path to view other accounts" - }, "switchNetwork": { "message": "Switch network" }, diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index 12de76b70..1b86785f9 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "Esta cuenta ya se conectó a MetaMask." }, - "selectAnAccountHelp": { - "message": "Seleccione una cuenta para verla en MetaMask." - }, - "selectAnAccountHelpDirections": { - "message": "¿No ve su cuenta? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "Seleccione cada frase para garantizar que sea correcta." }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "¿Le permite a este sitio cambiar la red?" }, - "switchLedgerPaths": { - "message": "Cambiar rutas de acceso al Ledger" - }, - "switchLedgerPathsText": { - "message": "Seleccione la ruta de acceso al Ledger para ver otras cuentas" - }, "switchNetwork": { "message": "Cambiar red" }, diff --git a/app/_locales/es_419/messages.json b/app/_locales/es_419/messages.json index 12de76b70..1b86785f9 100644 --- a/app/_locales/es_419/messages.json +++ b/app/_locales/es_419/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "Esta cuenta ya se conectó a MetaMask." }, - "selectAnAccountHelp": { - "message": "Seleccione una cuenta para verla en MetaMask." - }, - "selectAnAccountHelpDirections": { - "message": "¿No ve su cuenta? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "Seleccione cada frase para garantizar que sea correcta." }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "¿Le permite a este sitio cambiar la red?" }, - "switchLedgerPaths": { - "message": "Cambiar rutas de acceso al Ledger" - }, - "switchLedgerPathsText": { - "message": "Seleccione la ruta de acceso al Ledger para ver otras cuentas" - }, "switchNetwork": { "message": "Cambiar red" }, diff --git a/app/_locales/et/messages.json b/app/_locales/et/messages.json index f7159d6f1..9201b35d8 100644 --- a/app/_locales/et/messages.json +++ b/app/_locales/et/messages.json @@ -837,9 +837,6 @@ "selectAnAccount": { "message": "Valige konto" }, - "selectAnAccountHelp": { - "message": "Valige konto, mida MetaMaskis vaadata" - }, "selectEachPhrase": { "message": "Valige iga fraas, veendumaks, et see on õige." }, diff --git a/app/_locales/fa/messages.json b/app/_locales/fa/messages.json index c4c6fc786..28563b100 100644 --- a/app/_locales/fa/messages.json +++ b/app/_locales/fa/messages.json @@ -847,9 +847,6 @@ "selectAnAccount": { "message": "یک حساب را انتخاب کنید" }, - "selectAnAccountHelp": { - "message": "برای مشاهده MetaMask حساب را انتخاب نمایید" - }, "selectEachPhrase": { "message": "لطفًا جهت اطمینان از درستی، هر عبارت را انتخاب کنید." }, diff --git a/app/_locales/fi/messages.json b/app/_locales/fi/messages.json index bb7b53c72..a702aa641 100644 --- a/app/_locales/fi/messages.json +++ b/app/_locales/fi/messages.json @@ -844,9 +844,6 @@ "selectAnAccount": { "message": "Valitse tili" }, - "selectAnAccountHelp": { - "message": "Valitse MetaMaskissa näytettävä tili" - }, "selectEachPhrase": { "message": "Ole hyvä ja valitse jokainen teksti järjestyksessä varmistaaksesi, että se on oikein." }, diff --git a/app/_locales/fil/messages.json b/app/_locales/fil/messages.json index f6f51b82d..ed799f2c9 100644 --- a/app/_locales/fil/messages.json +++ b/app/_locales/fil/messages.json @@ -768,9 +768,6 @@ "selectAnAccount": { "message": "Pumili ng Account" }, - "selectAnAccountHelp": { - "message": "Piliin ang account na titingnan sa MetaMask" - }, "selectEachPhrase": { "message": "Pakipili ang bawat parirala para tiyaking tama ito." }, diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json index 4cac23cb8..3e8cf75db 100644 --- a/app/_locales/fr/messages.json +++ b/app/_locales/fr/messages.json @@ -829,9 +829,6 @@ "selectAnAccount": { "message": "Selectionner un compte" }, - "selectAnAccountHelp": { - "message": "Selectionner le compte à afficher dans MetaMask" - }, "selectEachPhrase": { "message": "Veuillez sélectionner chaque phrase afin de vous assurer qu'elle est correcte." }, diff --git a/app/_locales/he/messages.json b/app/_locales/he/messages.json index 8a6fd5d6d..97db0dcbc 100644 --- a/app/_locales/he/messages.json +++ b/app/_locales/he/messages.json @@ -841,9 +841,6 @@ "selectAnAccount": { "message": "בחר חשבון" }, - "selectAnAccountHelp": { - "message": "בחר את החשבון לצפייה ב- MetaMask" - }, "selectEachPhrase": { "message": "נא לבחור כל צירוף מילים כדי להבטיח שהוא נכון." }, diff --git a/app/_locales/hi/messages.json b/app/_locales/hi/messages.json index 08b76a2c9..c6d1f5883 100644 --- a/app/_locales/hi/messages.json +++ b/app/_locales/hi/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "यह खाता पहले ही MetaMask से जुड़ा हुआ है" }, - "selectAnAccountHelp": { - "message": "MetaMask में देखने के लिए खाते का चयन करें।" - }, - "selectAnAccountHelpDirections": { - "message": "अपना खाता नहीं देख पा रहे हैं? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "कृपया प्रत्येक वाक्यांश का चयन करें, ताकि यह सुनिश्चित हो सके कि यह सही है।" }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "इस साइट को नेटवर्क स्विच करने की अनुमति दें?" }, - "switchLedgerPaths": { - "message": "Ledger पथ स्विच करें" - }, - "switchLedgerPathsText": { - "message": "अन्य खाते देखने के लिए Ledger पथ का चयन करें" - }, "switchNetwork": { "message": "नेटवर्क स्विच करें" }, diff --git a/app/_locales/hr/messages.json b/app/_locales/hr/messages.json index 570e642d2..ea8631342 100644 --- a/app/_locales/hr/messages.json +++ b/app/_locales/hr/messages.json @@ -840,9 +840,6 @@ "selectAnAccount": { "message": "Odaberi račun" }, - "selectAnAccountHelp": { - "message": "Odaberi račun za prikaz u usluzi MetaMask" - }, "selectEachPhrase": { "message": "Odaberite svaku rečenicu kako biste provjerili je li točna." }, diff --git a/app/_locales/ht/messages.json b/app/_locales/ht/messages.json index d37b2913a..db29eb579 100644 --- a/app/_locales/ht/messages.json +++ b/app/_locales/ht/messages.json @@ -528,9 +528,6 @@ "selectAnAccount": { "message": "Chwazi yon kont" }, - "selectAnAccountHelp": { - "message": "Chwazi kont pou wè nan MetaMask" - }, "selectHdPath": { "message": "Chwazi chemen HD" }, diff --git a/app/_locales/hu/messages.json b/app/_locales/hu/messages.json index f1b0a0456..9de326c18 100644 --- a/app/_locales/hu/messages.json +++ b/app/_locales/hu/messages.json @@ -840,9 +840,6 @@ "selectAnAccount": { "message": "Válasszon fiókot" }, - "selectAnAccountHelp": { - "message": "Válássza ki a MetaMask-ban megtekinteni kívánt fiókot" - }, "selectEachPhrase": { "message": "Kérjük, válassza ki az egyes mondatokat, hogy meggyőződjön azok helyességéről. " }, diff --git a/app/_locales/id/messages.json b/app/_locales/id/messages.json index 3496aca1d..c5ab406b9 100644 --- a/app/_locales/id/messages.json +++ b/app/_locales/id/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "Akun ini sudah terhubung ke MetaMask." }, - "selectAnAccountHelp": { - "message": "Pilih akun untuk dilihat di MetaMask." - }, - "selectAnAccountHelpDirections": { - "message": "Tidak melihat akun Anda? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "Pilih masing-masing frasa untuk memastikan kebenarannya." }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "Izinkan situs ini untuk beralih jaringan?" }, - "switchLedgerPaths": { - "message": "Beralih jalur Ledger" - }, - "switchLedgerPathsText": { - "message": "Pilih jalur Ledger untuk melihat akun lain" - }, "switchNetwork": { "message": "Beralih jaringan" }, diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json index b8830425b..5e5015007 100644 --- a/app/_locales/it/messages.json +++ b/app/_locales/it/messages.json @@ -1309,9 +1309,6 @@ "selectAnAccount": { "message": "Seleziona un Account" }, - "selectAnAccountHelp": { - "message": "Selezione l'account da visualizzare in MetaMask" - }, "selectEachPhrase": { "message": "Per favore seleziona ogni frase in ordine per assicurarti che sia corretta." }, diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json index 6cb26cfc7..2135f0dc0 100644 --- a/app/_locales/ja/messages.json +++ b/app/_locales/ja/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "このアカウントはすでに MetaMask に接続されています" }, - "selectAnAccountHelp": { - "message": "MetaMask で表示するアカウントを選択します。" - }, - "selectAnAccountHelpDirections": { - "message": "アカウントが表示されません。$1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "各フレーズを選択して、各フレーズが正しいことを確認してください。" }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "このサイトのネットワーク変更を許可しますか?" }, - "switchLedgerPaths": { - "message": "レジャー パスの切り替え" - }, - "switchLedgerPathsText": { - "message": "レジャー パスを選択して他のアカウントを表示します" - }, "switchNetwork": { "message": "ネットワークの切り替え" }, diff --git a/app/_locales/kn/messages.json b/app/_locales/kn/messages.json index 8ead6e999..80c171ece 100644 --- a/app/_locales/kn/messages.json +++ b/app/_locales/kn/messages.json @@ -847,9 +847,6 @@ "selectAnAccount": { "message": "ಖಾತೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ" }, - "selectAnAccountHelp": { - "message": "MetaMask ನಲ್ಲಿ ವೀಕ್ಷಿಸಲು ಖಾತೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ" - }, "selectEachPhrase": { "message": "ಅದು ಸರಿಯಾಗಿದೆಯೆ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ದಯವಿಟ್ಟು ಪ್ರತಿ ಫ್ರೇಸ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ." }, diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index cc2cf9d4a..6228d5088 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "이 계정은 이미 MetaMask와 연결되어 있습니다." }, - "selectAnAccountHelp": { - "message": "MetaMask에서 확인할 계정을 선택하십시오." - }, - "selectAnAccountHelpDirections": { - "message": "계정을 찾을 수 없습니까? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "각 구문을 선택하여 구문이 올바른지 확인하세요." }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "이 사이트가 네트워크를 전환하도록 허용하시겠어요?" }, - "switchLedgerPaths": { - "message": "Ledger 경로 전환" - }, - "switchLedgerPathsText": { - "message": "다른 계정을 보려면 Ledger 경로를 선택하세요." - }, "switchNetwork": { "message": "네트워크 전환" }, diff --git a/app/_locales/lt/messages.json b/app/_locales/lt/messages.json index de0fd2500..2e35d171a 100644 --- a/app/_locales/lt/messages.json +++ b/app/_locales/lt/messages.json @@ -847,9 +847,6 @@ "selectAnAccount": { "message": "Pasirinkite paskyrą" }, - "selectAnAccountHelp": { - "message": "Pasirinkite paskyrą peržiūrėti „MetaMask“" - }, "selectEachPhrase": { "message": "Pasirinkite kiekvieną frazę, kad patikrintumėte, ar ji tinkama" }, diff --git a/app/_locales/lv/messages.json b/app/_locales/lv/messages.json index fe1ecb510..bbee7c62a 100644 --- a/app/_locales/lv/messages.json +++ b/app/_locales/lv/messages.json @@ -843,9 +843,6 @@ "selectAnAccount": { "message": "Atlasiet kontu" }, - "selectAnAccountHelp": { - "message": "Atlasiet kontu, ko skatīt MetaMask" - }, "selectEachPhrase": { "message": "Lūdzu, atlasiet katru frāzi, lai pārliecinātos par tās pareizību." }, diff --git a/app/_locales/ms/messages.json b/app/_locales/ms/messages.json index 526db5f84..196f3a16f 100644 --- a/app/_locales/ms/messages.json +++ b/app/_locales/ms/messages.json @@ -824,9 +824,6 @@ "selectAnAccount": { "message": "Pilih Akaun" }, - "selectAnAccountHelp": { - "message": "Pilih akaun untuk dilihat dalam MetaMask" - }, "selectEachPhrase": { "message": "Sila pilih setiap ungkapan untuk memastikan ia betul." }, diff --git a/app/_locales/no/messages.json b/app/_locales/no/messages.json index 8b2fc2b2d..3c00c6fb3 100644 --- a/app/_locales/no/messages.json +++ b/app/_locales/no/messages.json @@ -831,9 +831,6 @@ "selectAnAccount": { "message": "Velg en konto" }, - "selectAnAccountHelp": { - "message": "Velg konto for å vise i MetaMask" - }, "selectEachPhrase": { "message": "Velg hver frase for å kontrollere at den er riktig." }, diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json index 516fa983f..767b6815c 100644 --- a/app/_locales/ph/messages.json +++ b/app/_locales/ph/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "Nakakonekta na ang account na ito sa MetaMask" }, - "selectAnAccountHelp": { - "message": "Pumili ng account na titingnan sa MetaMask." - }, - "selectAnAccountHelpDirections": { - "message": "Hindi makita ang iyong account? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "Pakipili ang bawat phrase para matiyak na tama ito." }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "Payagang palitan ng site na ito ang network?" }, - "switchLedgerPaths": { - "message": "Magpalit ng path ng Ledger" - }, - "switchLedgerPathsText": { - "message": "Piliin ang path ng Ledger para tingnan ang iba pang account" - }, "switchNetwork": { "message": "Lumipat ng network" }, diff --git a/app/_locales/pl/messages.json b/app/_locales/pl/messages.json index 08614b20a..cd955c838 100644 --- a/app/_locales/pl/messages.json +++ b/app/_locales/pl/messages.json @@ -841,9 +841,6 @@ "selectAnAccount": { "message": "Wybierz konto" }, - "selectAnAccountHelp": { - "message": "Wybierz konto do przeglądania w MetaMask" - }, "selectEachPhrase": { "message": "Wybierz każdą frazę, aby upewnić się, że jest poprawna." }, diff --git a/app/_locales/pt_BR/messages.json b/app/_locales/pt_BR/messages.json index d852678f1..be2683be2 100644 --- a/app/_locales/pt_BR/messages.json +++ b/app/_locales/pt_BR/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "Esta conta já foi conectada ao MetaMask" }, - "selectAnAccountHelp": { - "message": "Selecione uma conta a ser exibida no MetaMask." - }, - "selectAnAccountHelpDirections": { - "message": "Não está vendo sua conta? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "Selecione cada frase para garantir que esteja correta." }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "Permitir que este site mude a rede?" }, - "switchLedgerPaths": { - "message": "Mudar caminhos do Ledger" - }, - "switchLedgerPathsText": { - "message": "Selecione o caminho do Ledger para ver outras contas" - }, "switchNetwork": { "message": "Trocar de rede" }, diff --git a/app/_locales/ro/messages.json b/app/_locales/ro/messages.json index 6325adc51..06cafb9b3 100644 --- a/app/_locales/ro/messages.json +++ b/app/_locales/ro/messages.json @@ -834,9 +834,6 @@ "selectAnAccount": { "message": "Selectați un cont" }, - "selectAnAccountHelp": { - "message": "Selectați contul de vizualizat în MetaMask" - }, "selectEachPhrase": { "message": "Vă rugăm să selectați fiecare expresie pentru a vă asigura că este corectă." }, diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json index 8b180409d..4246ecf35 100644 --- a/app/_locales/ru/messages.json +++ b/app/_locales/ru/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "Этот счет уже подключен к MetaMask" }, - "selectAnAccountHelp": { - "message": "Выберите счет для просмотра в MetaMask." - }, - "selectAnAccountHelpDirections": { - "message": "Не видите свой счет? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "Выберите каждую фразу, чтобы убедиться, что она верна." }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "Разрешить этому сайту переключить сеть?" }, - "switchLedgerPaths": { - "message": "Переключить пути Ledger" - }, - "switchLedgerPathsText": { - "message": "Выберите путь Ledger для просмотра других счетов" - }, "switchNetwork": { "message": "Переключить сеть" }, diff --git a/app/_locales/sk/messages.json b/app/_locales/sk/messages.json index e632b1bb4..65026b424 100644 --- a/app/_locales/sk/messages.json +++ b/app/_locales/sk/messages.json @@ -810,9 +810,6 @@ "selectAnAccount": { "message": "Vybrať účet" }, - "selectAnAccountHelp": { - "message": "Vyberte účet, ktorý chcete zobraziť v MetaMask" - }, "selectEachPhrase": { "message": "Vyberte každú frázu, aby ste sa uistili, že je správna." }, diff --git a/app/_locales/sl/messages.json b/app/_locales/sl/messages.json index 73b6f0d14..7b0363c17 100644 --- a/app/_locales/sl/messages.json +++ b/app/_locales/sl/messages.json @@ -835,9 +835,6 @@ "selectAnAccount": { "message": "Izberi račun" }, - "selectAnAccountHelp": { - "message": "Izberi račun za prikaz v MetaMask" - }, "selectEachPhrase": { "message": "Izberite vsako geslo ter se prepričajte, da je pravilno." }, diff --git a/app/_locales/sr/messages.json b/app/_locales/sr/messages.json index 3f04839a9..f991c8580 100644 --- a/app/_locales/sr/messages.json +++ b/app/_locales/sr/messages.json @@ -838,9 +838,6 @@ "selectAnAccount": { "message": "Izaberite nalog" }, - "selectAnAccountHelp": { - "message": "Izaberite nalog za prikaz u MetaMask-u" - }, "selectEachPhrase": { "message": "Molimo vas izaberite svaki izraz kako biste proverili da je tačan." }, diff --git a/app/_locales/sv/messages.json b/app/_locales/sv/messages.json index 32a4b6f46..5e7e0fe5c 100644 --- a/app/_locales/sv/messages.json +++ b/app/_locales/sv/messages.json @@ -831,9 +831,6 @@ "selectAnAccount": { "message": "Välj ett konto" }, - "selectAnAccountHelp": { - "message": "Välj konto att visa i MetaMask" - }, "selectEachPhrase": { "message": "Välj varje fras för att säkerställa att den är korrekt." }, diff --git a/app/_locales/sw/messages.json b/app/_locales/sw/messages.json index fe20d1ca5..84db61de5 100644 --- a/app/_locales/sw/messages.json +++ b/app/_locales/sw/messages.json @@ -825,9 +825,6 @@ "selectAnAccount": { "message": "Chagua Akaunti" }, - "selectAnAccountHelp": { - "message": "Chagua akaunti kuangalia kwenye MetaMask" - }, "selectEachPhrase": { "message": "Tafadhali chagua kila kirai ili kuhakikisha kuwa hii ni sahihi." }, diff --git a/app/_locales/tl/messages.json b/app/_locales/tl/messages.json index 1ba4dd9aa..ae5632d42 100644 --- a/app/_locales/tl/messages.json +++ b/app/_locales/tl/messages.json @@ -1300,9 +1300,6 @@ "selectAnAccount": { "message": "Pumili ng Account" }, - "selectAnAccountHelp": { - "message": "Piliin ang account na titingnan sa MetaMask" - }, "selectEachPhrase": { "message": "Pakipili ang bawat phrase para matiyak na tama ito." }, diff --git a/app/_locales/uk/messages.json b/app/_locales/uk/messages.json index 198532739..3aaa3b09b 100644 --- a/app/_locales/uk/messages.json +++ b/app/_locales/uk/messages.json @@ -847,9 +847,6 @@ "selectAnAccount": { "message": "Виберіть обліковий запис" }, - "selectAnAccountHelp": { - "message": "Оберіть обліковий запис для перегляду в MetaMask" - }, "selectEachPhrase": { "message": "Виберіть кожну фразу, щоб переконатися, що вона правильна." }, diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json index 6e1753d7a..9eac3134e 100644 --- a/app/_locales/vi/messages.json +++ b/app/_locales/vi/messages.json @@ -1619,13 +1619,6 @@ "selectAnAccountAlreadyConnected": { "message": "Tài khoản này đã được kết nối với MetaMask" }, - "selectAnAccountHelp": { - "message": "Chọn một tài khoản để xem trong MetaMask." - }, - "selectAnAccountHelpDirections": { - "message": "Bạn không thấy tài khoản của mình? $1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, "selectEachPhrase": { "message": "Vui lòng chọn từng cụm mật khẩu theo thứ tự để đảm bảo sự chính xác." }, @@ -2106,12 +2099,6 @@ "switchEthereumChainConfirmationTitle": { "message": "Cho phép trang web này chuyển mạng?" }, - "switchLedgerPaths": { - "message": "Chuyển đường dẫn Ledger" - }, - "switchLedgerPathsText": { - "message": "Chọn đường dẫn Ledger để xem các tài khoản khác" - }, "switchNetwork": { "message": "Chuyển mạng" }, diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index 3dca7499c..22b102426 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -1303,9 +1303,6 @@ "selectAnAccount": { "message": "选择一个账户" }, - "selectAnAccountHelp": { - "message": "选择在 MetaMask 中查看的账户" - }, "selectEachPhrase": { "message": "请选择每个单词,以确保其正确性。" }, diff --git a/app/images/connect-lattice.svg b/app/images/connect-lattice.svg new file mode 100644 index 000000000..b58f5845a --- /dev/null +++ b/app/images/connect-lattice.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/images/lattice-logo.png b/app/images/lattice-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0100aba0f5e5f81f89e9bbfc6f4fd3748d35c19e GIT binary patch literal 27102 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 B=X(GE literal 0 HcmV?d00001 diff --git a/app/manifest/_base.json b/app/manifest/_base.json index e4f55da26..bc63ce27d 100644 --- a/app/manifest/_base.json +++ b/app/manifest/_base.json @@ -66,6 +66,7 @@ "clipboardWrite", "http://localhost:8545/", "https://*.infura.io/", + "https://wallet.gridplus.io/*", "activeTab", "webRequest", "*://*.eth/", diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 106317bdd..9ac44bee4 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -14,6 +14,7 @@ import { stripHexPrefix } from 'ethereumjs-util'; import log from 'loglevel'; import TrezorKeyring from 'eth-trezor-keyring'; import LedgerBridgeKeyring from '@metamask/eth-ledger-bridge-keyring'; +import LatticeKeyring from 'eth-lattice-keyring'; import EthQuery from 'eth-query'; import nanoid from 'nanoid'; import { @@ -370,7 +371,11 @@ export default class MetamaskController extends EventEmitter { await opts.openPopup(); }); - const additionalKeyrings = [TrezorKeyring, LedgerBridgeKeyring]; + const additionalKeyrings = [ + TrezorKeyring, + LedgerBridgeKeyring, + LatticeKeyring, + ]; this.keyringController = new KeyringController({ keyringTypes: additionalKeyrings, initState: initState.KeyringController, @@ -1445,6 +1450,7 @@ export default class MetamaskController extends EventEmitter { .map((address) => toChecksumHexAddress(address)), ledger: [], trezor: [], + lattice: [], }; // transactions @@ -1545,6 +1551,9 @@ export default class MetamaskController extends EventEmitter { case 'ledger': keyringName = LedgerBridgeKeyring.type; break; + case 'lattice': + keyringName = LatticeKeyring.type; + break; default: throw new Error( 'MetamaskController:getKeyringForDevice - Unknown device', @@ -1559,7 +1568,9 @@ export default class MetamaskController extends EventEmitter { if (hdPath && keyring.setHdPath) { keyring.setHdPath(hdPath); } - + if (deviceName === 'lattice') { + keyring.appName = 'MetaMask'; + } keyring.network = this.networkController.getProviderConfig().type; return keyring; @@ -2047,6 +2058,14 @@ export default class MetamaskController extends EventEmitter { }); } + case KEYRING_TYPES.LATTICE: { + return new Promise((_, reject) => { + reject( + new Error('Lattice does not support eth_getEncryptionPublicKey.'), + ); + }); + } + default: { const promise = this.encryptionPublicKeyManager.addUnapprovedMessageAsync( msgParams, diff --git a/development/states/navigate-txs.json b/development/states/navigate-txs.json new file mode 100644 index 000000000..18281fd35 --- /dev/null +++ b/development/states/navigate-txs.json @@ -0,0 +1,320 @@ +{ + "appState": { + "shouldClose": false, + "menuOpen": false, + "modal": { + "open": false, + "modalState": { + "name": null, + "props": {} + }, + "previousModalState": { + "name": null + } + }, + "sidebar": { + "isOpen": false, + "transitionName": "", + "type": "" + }, + "alertOpen": false, + "alertMessage": null, + "qrCodeData": null, + "networkDropdownOpen": false, + "currentView": { + "name": "confTx", + "context": 0 + }, + "accountDetail": { + "subview": "transactions" + }, + "transForward": false, + "isLoading": false, + "warning": null, + "buyView": {}, + "isMouseUser": true, + "gasIsLoading": false, + "networkNonce": "0x92", + "defaultHdPaths": { + "trezor": "m/44'/60'/0'/0", + "ledger": "m/44'/60'/0'/0/0", + "lattice": "m/44'/60'/0'/0" + } + }, + "confirmTransaction": { + "txData": { + "estimatedGas": "0x38f53", + "gasLimitSpecified": true, + "gasPriceSpecified": false, + "history": [], + "id": 2389644572638774, + "loadingDefaults": false, + "metamaskNetworkId": "4", + "origin": "remix.ethereum.org", + "status": "unapproved", + "time": 1538844223352, + "txParams": { + "data": "0x608060405234801561001057600080fd5b506102a7806100206000396000f30060806040526004361061004b5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663d13319c48114610050578063dfb29935146100da575b600080fd5b34801561005c57600080fd5b50610065610135565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561009f578181015183820152602001610087565b50505050905090810190601f1680156100cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100e657600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101339436949293602493928401919081908401838280828437509497506101cc9650505050505050565b005b60008054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101c15780601f10610196576101008083540402835291602001916101c1565b820191906000526020600020905b8154815290600101906020018083116101a457829003601f168201915b505050505090505b90565b80516101df9060009060208401906101e3565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061022457805160ff1916838001178555610251565b82800160010185558215610251579182015b82811115610251578251825591602001919060010190610236565b5061025d929150610261565b5090565b6101c991905b8082111561025d57600081556001016102675600a165627a7a72305820cf4282c534b8f2faad947d592afa109b907e4e6b2f52335b361b69c24fedb9580029", + "from": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "gas": "0x38f53", + "gasPrice": "0x3b9aca00", + "value": "0x0" + }, + "type": "standard" + }, + "tokenData": {}, + "methodData": {}, + "tokenProps": { + "tokenDecimals": "", + "tokenSymbol": "" + }, + "fiatTransactionAmount": "0", + "fiatTransactionFee": "0.05", + "fiatTransactionTotal": "0.05", + "ethTransactionAmount": "0", + "ethTransactionFee": "0.000233", + "ethTransactionTotal": "0.000233", + "hexGasTotal": "0xd42f28057e00", + "nonce": "", + "toSmartContract": false, + "fetchingData": false + }, + "localeMessages": {}, + "metamask": { + "isInitialized": true, + "isUnlocked": true, + "isAccountMenuOpen": false, + "isPopup": false, + "rpcTarget": "https://rawtestrpc.metamask.io/", + "identities": { + "0x8cf82b5aa41ff2282427be151dd328568684007a": { + "address": "0x8cf82b5aa41ff2282427be151dd328568684007a", + "name": "Account 3" + }, + "0xbe1a00e10ec68b154adb84e8119167146a71c9a2": { + "address": "0xbe1a00e10ec68b154adb84e8119167146a71c9a2", + "name": "Account 2" + }, + "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2": { + "address": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "name": "Account 1" + } + }, + "unapprovedTxs": { + "2389644572638771": { + "estimatedGas": "0x8544", + "gasLimitSpecified": true, + "gasPriceSpecified": true, + "history": [], + "id": 2389644572638771, + "loadingDefaults": false, + "metamaskNetworkId": "4", + "origin": "MetaMask", + "status": "unapproved", + "time": 1538844175144, + "txParams": { + "data": "0xa9059cbb000000000000000000000000be1a00e10ec68b154adb84e8119167146a71c9a20000000000000000000000000000000000000000000000000000000000000000", + "from": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "gas": "0x8544", + "gasPrice": "0x3b9aca00", + "to": "0xe0b7927c4af23765cb51314a0e0521a9645f0e2a", + "value": "0x0" + }, + "type": "standard" + }, + "2389644572638772": { + "estimatedGas": "0x5208", + "gasLimitSpecified": true, + "gasPriceSpecified": true, + "history": [], + "id": 2389644572638772, + "loadingDefaults": false, + "metamaskNetworkId": "4", + "origin": "MetaMask", + "status": "unapproved", + "time": 1538844178492, + "txParams": { + "from": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "gas": "0x5208", + "gasPrice": "0x3b9aca00", + "to": "0xbe1a00e10ec68b154adb84e8119167146a71c9a2", + "value": "0x0" + }, + "type": "standard" + }, + "2389644572638773": { + "estimatedGas": { + "length": 1, + "negative": 0, + "red": null, + "words": [34061, null] + }, + "gasLimitSpecified": false, + "gasPriceSpecified": true, + "history": [], + "id": 2389644572638773, + "loadingDefaults": false, + "metamaskNetworkId": "4", + "origin": "localhost", + "status": "unapproved", + "time": 1538844204724, + "txParams": { + "data": "0xdfb29935000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000155468697320697320746865206970667320686173680000000000000000000000", + "from": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "gas": "0xc793", + "gasPrice": "0x3b9aca00", + "to": "0xb7ec370c889b3b48ec537e0b2c887faedceb254a", + "value": "0x0" + }, + "type": "standard" + }, + "2389644572638774": { + "estimatedGas": "0x38f53", + "gasLimitSpecified": true, + "gasPriceSpecified": false, + "history": [], + "id": 2389644572638774, + "loadingDefaults": false, + "metamaskNetworkId": "4", + "origin": "remix.ethereum.org", + "status": "unapproved", + "time": 1538844223352, + "txParams": { + "data": "0x608060405234801561001057600080fd5b506102a7806100206000396000f30060806040526004361061004b5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663d13319c48114610050578063dfb29935146100da575b600080fd5b34801561005c57600080fd5b50610065610135565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561009f578181015183820152602001610087565b50505050905090810190601f1680156100cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100e657600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101339436949293602493928401919081908401838280828437509497506101cc9650505050505050565b005b60008054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101c15780601f10610196576101008083540402835291602001916101c1565b820191906000526020600020905b8154815290600101906020018083116101a457829003601f168201915b505050505090505b90565b80516101df9060009060208401906101e3565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061022457805160ff1916838001178555610251565b82800160010185558215610251579182015b82811115610251578251825591602001919060010190610236565b5061025d929150610261565b5090565b6101c991905b8082111561025d57600081556001016102675600a165627a7a72305820cf4282c534b8f2faad947d592afa109b907e4e6b2f52335b361b69c24fedb9580029", + "from": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "gas": "0x38f53", + "gasPrice": "0x3b9aca00", + "value": "0x0" + }, + "type": "standard" + } + }, + "noActiveNotices": true, + "frequentRpcList": [], + "addressBook": [], + "selectedTokenAddress": null, + "contractExchangeRates": {}, + "tokenExchangeRates": {}, + "tokens": [ + { + "address": "0xe0b7927c4af23765cb51314a0e0521a9645f0e2a", + "decimals": 9, + "symbol": "DGD" + } + ], + "pendingTokens": {}, + "send": { + "gasLimit": null, + "gasPrice": null, + "gasTotal": null, + "tokenBalance": null, + "from": "", + "to": "", + "amount": "0x0", + "memo": "", + "errors": {}, + "editingTransactionId": null, + "forceGasMin": null + }, + "coinOptions": {}, + "useBlockie": false, + "featureFlags": { + "betaUI": true, + "skipAnnounceBetaUI": true + }, + "isRevealingSeedWords": false, + "welcomeScreenSeen": false, + "currentLocale": "en", + "preferences": { + "useETHAsPrimaryCurrency": true + }, + "provider": { + "type": "rinkeby" + }, + "network": "4", + "accounts": { + "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2": { + "address": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "balance": "0x36aabfb2a0190c00" + }, + "0xbe1a00e10ec68b154adb84e8119167146a71c9a2": { + "address": "0xbe1a00e10ec68b154adb84e8119167146a71c9a2", + "balance": "0x7b3ef08c294a000" + }, + "0x8cf82b5aa41ff2282427be151dd328568684007a": { + "address": "0x8cf82b5aa41ff2282427be151dd328568684007a", + "balance": "0x0" + } + }, + "currentBlockGasLimit": "0x731e25", + "selectedAddressTxList": [], + "unapprovedMsgs": {}, + "unapprovedMsgCount": 0, + "unapprovedPersonalMsgs": {}, + "unapprovedPersonalMsgCount": 0, + "unapprovedTypedMessages": {}, + "unapprovedTypedMessagesCount": 0, + "keyringTypes": [ + "Simple Key Pair", + "HD Key Tree", + "Trezor Hardware", + "Ledger Hardware", + "Lattice Hardware" + ], + "keyrings": [ + { + "type": "HD Key Tree", + "accounts": [ + "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "0xbe1a00e10ec68b154adb84e8119167146a71c9a2", + "0x8cf82b5aa41ff2282427be151dd328568684007a" + ] + } + ], + "currentAccountTab": "history", + "accountTokens": { + "0x8cf82b5aa41ff2282427be151dd328568684007a": {}, + "0xbe1a00e10ec68b154adb84e8119167146a71c9a2": {}, + "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2": { + "rinkeby": [ + { + "address": "0xe0b7927c4af23765cb51314a0e0521a9645f0e2a", + "decimals": 9, + "symbol": "DGD" + }, + { + "address": "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359", + "decimals": 18, + "symbol": "DAI" + } + ] + } + }, + "assetImages": { + "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359": null, + "0xe0b7927c4af23765cb51314a0e0521a9645f0e2a": null + }, + "suggestedTokens": {}, + "lostIdentities": {}, + "seedWords": null, + "forgottenPassword": false, + "selectedAddress": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", + "recentBlocks": [], + "currentCurrency": "usd", + "conversionRate": 225.23, + "conversionDate": 1538859376, + "shapeShiftTxList": [], + "infuraNetworkStatus": { + "kovan": "ok", + "mainnet": "ok", + "rinkeby": "ok", + "ropsten": "ok", + "goerli": "ok" + } + }, + "send": { + "toDropdownOpen": false, + "errors": {}, + "warnings": {} + } +} diff --git a/package.json b/package.json index 557c2c0c4..b84c39af4 100644 --- a/package.json +++ b/package.json @@ -137,6 +137,7 @@ "eth-json-rpc-middleware": "^6.0.0", "eth-keyring-controller": "^6.2.0", "eth-method-registry": "^2.0.0", + "eth-lattice-keyring": "^0.3.0", "eth-query": "^2.1.2", "eth-rpc-errors": "^4.0.2", "eth-sig-util": "^3.0.0", @@ -347,6 +348,7 @@ }, "lavamoat": { "allowScripts": { + "gridplus-sdk": false, "chromedriver": true, "geckodriver": true, "@sentry/cli": true, diff --git a/shared/constants/hardware-wallets.js b/shared/constants/hardware-wallets.js index 705754fe7..f32306472 100644 --- a/shared/constants/hardware-wallets.js +++ b/shared/constants/hardware-wallets.js @@ -6,6 +6,7 @@ export const KEYRING_TYPES = { LEDGER: 'Ledger Hardware', TREZOR: 'Trezor Hardware', + LATTICE: 'Lattice Hardware', }; /** diff --git a/ui/components/app/account-menu/account-menu.component.js b/ui/components/app/account-menu/account-menu.component.js index 19188fbc2..f72077777 100644 --- a/ui/components/app/account-menu/account-menu.component.js +++ b/ui/components/app/account-menu/account-menu.component.js @@ -238,6 +238,7 @@ export default class AccountMenu extends Component { switch (type) { case KEYRING_TYPES.TREZOR: case KEYRING_TYPES.LEDGER: + case KEYRING_TYPES.LATTICE: label = t('hardware'); break; case 'Simple Key Pair': diff --git a/ui/ducks/app/app.js b/ui/ducks/app/app.js index ab5621299..2baa2f53d 100644 --- a/ui/ducks/app/app.js +++ b/ui/ducks/app/app.js @@ -38,6 +38,7 @@ export default function reduceApp(state = {}, action) { defaultHdPaths: { trezor: `m/44'/60'/0'/0`, ledger: `m/44'/60'/0'/0/0`, + lattice: `m/44'/60'/0'/0`, }, networksTabSelectedRpcUrl: '', loadingMethodData: false, diff --git a/ui/ducks/app/app.test.js b/ui/ducks/app/app.test.js index e88ac1b9b..c71a539e0 100644 --- a/ui/ducks/app/app.test.js +++ b/ui/ducks/app/app.test.js @@ -255,6 +255,7 @@ describe('App State', () => { const hdPaths = { trezor: "m/44'/60'/0'/0", ledger: "m/44'/60'/0'", + lattice: "m/44'/60'/0'/0", }; const state = reduceApp(metamaskState, { type: actions.SET_HARDWARE_WALLET_DEFAULT_HD_PATH, diff --git a/ui/pages/create-account/connect-hardware/account-list.js b/ui/pages/create-account/connect-hardware/account-list.js index f0b8d14d9..caf7ff580 100644 --- a/ui/pages/create-account/connect-hardware/account-list.js +++ b/ui/pages/create-account/connect-hardware/account-list.js @@ -5,13 +5,11 @@ import { getAccountLink } from '@metamask/etherscan-link'; import Button from '../../../components/ui/button'; import Checkbox from '../../../components/ui/check-box'; import Dropdown from '../../../components/ui/dropdown'; -import Popover from '../../../components/ui/popover'; import { getURLHostName } from '../../../helpers/utils/util'; class AccountList extends Component { state = { - showPopover: false, pathValue: null, }; @@ -33,7 +31,7 @@ class AccountList extends Component { } renderHdPathSelector() { - const { selectedPath, hdPaths } = this.props; + const { device, selectedPath, hdPaths, onPathChange } = this.props; const { pathValue } = this.state; return ( @@ -45,10 +43,11 @@ class AccountList extends Component {
{ this.setPath(value); + onPathChange(value); }} />
@@ -61,26 +60,18 @@ class AccountList extends Component { } renderHeader() { + const { device } = this.props; + const shouldShowHDPaths = + device.toLowerCase() === 'ledger' || device.toLowerCase() === 'lattice'; return (

{this.context.t('selectAnAccount')}

+ {shouldShowHDPaths ? this.renderHdPathSelector() : null}

{this.context.t('selectAnAccount')}

-

- {this.context.t('selectAnAccountHelp')} - {this.context.t('selectAnAccountHelpDirections', [ - , - ])} -

); } @@ -228,44 +219,7 @@ class AccountList extends Component { ); } - renderSelectPathPopover() { - const { pathValue } = this.state; - const { onPathChange } = this.props; - - const footer = ( -
- - -
- ); - - return ( - - {this.renderHdPathSelector()} - - ); - } - render() { - const { showPopover } = this.state; return (
{this.renderHeader()} @@ -273,7 +227,6 @@ class AccountList extends Component { {this.renderPagination()} {this.renderButtons()} {this.renderForgetDevice()} - {showPopover ? this.renderSelectPathPopover() : null}
); } diff --git a/ui/pages/create-account/connect-hardware/index.js b/ui/pages/create-account/connect-hardware/index.js index 66082de07..6b6c3bab5 100644 --- a/ui/pages/create-account/connect-hardware/index.js +++ b/ui/pages/create-account/connect-hardware/index.js @@ -20,12 +20,32 @@ const U2F_ERROR = 'U2F'; const LEDGER_LIVE_PATH = `m/44'/60'/0'/0/0`; const MEW_PATH = `m/44'/60'/0'`; const BIP44_PATH = `m/44'/60'/0'/0`; -const HD_PATHS = [ +const LEDGER_HD_PATHS = [ { name: 'Ledger Live', value: LEDGER_LIVE_PATH }, { name: 'Legacy (MEW / MyCrypto)', value: MEW_PATH }, { name: `BIP44 Standard (e.g. MetaMask, Trezor)`, value: BIP44_PATH }, ]; +const LATTICE_STANDARD_BIP44_PATH = `m/44'/60'/0'/0/x`; +const LATTICE_LEDGER_LIVE_PATH = `m/44'/60'/x'/0/0`; +const LATTICE_MEW_PATH = `m/44'/60'/0'/x`; +const LATTICE_HD_PATHS = [ + { + name: `Standard (${LATTICE_STANDARD_BIP44_PATH})`, + value: LATTICE_STANDARD_BIP44_PATH, + }, + { + name: `Ledger Live (${LATTICE_LEDGER_LIVE_PATH})`, + value: LATTICE_LEDGER_LIVE_PATH, + }, + { name: `Ledger Legacy (${LATTICE_MEW_PATH})`, value: LATTICE_MEW_PATH }, +]; + +const HD_PATHS = { + ledger: LEDGER_HD_PATHS, + lattice: LATTICE_HD_PATHS, +}; + class ConnectHardwareForm extends Component { static contextTypes = { t: PropTypes.func, @@ -56,7 +76,7 @@ class ConnectHardwareForm extends Component { } async checkIfUnlocked() { - for (const device of ['trezor', 'ledger']) { + for (const device of ['trezor', 'ledger', 'lattice']) { const path = this.props.defaultHdPaths[device]; const unlocked = await this.props.checkHardwareStatus(device, path); if (unlocked) { diff --git a/ui/pages/create-account/connect-hardware/select-hardware.js b/ui/pages/create-account/connect-hardware/select-hardware.js index 6b711b176..3f7e6cbe8 100644 --- a/ui/pages/create-account/connect-hardware/select-hardware.js +++ b/ui/pages/create-account/connect-hardware/select-hardware.js @@ -43,6 +43,23 @@ export default class SelectHardware extends Component { ); } + renderConnectToLatticeButton() { + return ( + + ); + } + renderConnectToLedgerButton() { return (
+ ) : null}
{this.renderNetworkEntry('mainnet')} {this.renderCustomRpcList(rpcListDetail, this.props.provider)} - {shouldShowTestNetworks && ( - <> - {this.renderNetworkEntry('ropsten')} - {this.renderNetworkEntry('kovan')} - {this.renderNetworkEntry('rinkeby')} - {this.renderNetworkEntry('goerli')} - {this.renderNetworkEntry('localhost')} - - )} +
+ {this.renderNetworkEntry('ropsten')} + {this.renderNetworkEntry('kovan')} + {this.renderNetworkEntry('rinkeby')} + {this.renderNetworkEntry('goerli')} + {this.renderNetworkEntry('localhost')} +
{this.renderAddCustomButton()} diff --git a/ui/css/itcss/components/network.scss b/ui/css/itcss/components/network.scss index 8f0130956..f7355fc1b 100644 --- a/ui/css/itcss/components/network.scss +++ b/ui/css/itcss/components/network.scss @@ -135,6 +135,12 @@ background-color: $scorpion; } +.network-dropdown-testnets { + &--no-visibility { + visibility: hidden; + } +} + .network-dropdown-title { @include H4; @@ -150,6 +156,25 @@ min-height: 36px; width: 265px; color: $dusty-gray; + + &--link { + color: $white; + cursor: pointer; + font-weight: bold; + text-decoration: underline; + + &:hover { + color: $white; + } + } + + &--close { + color: $white; + background: inherit; + position: absolute; + top: 64px; + right: 10px; + } } .network-caret { diff --git a/ui/ducks/app/app.js b/ui/ducks/app/app.js index 2baa2f53d..e7b4c2c9f 100644 --- a/ui/ducks/app/app.js +++ b/ui/ducks/app/app.js @@ -55,6 +55,7 @@ export default function reduceApp(state = {}, action) { ledgerWebHidConnectedStatus: WEBHID_CONNECTED_STATUSES.UNKNOWN, ledgerTransportStatus: TRANSPORT_STATES.NONE, newNetworkAdded: '', + showTestnetMessageInDropdown: true, ...state, }; @@ -72,6 +73,12 @@ export default function reduceApp(state = {}, action) { networkDropdownOpen: false, }; + case actionConstants.HIDE_TESTNET_MESSAGE: + return { + ...appState, + showTestnetMessageInDropdown: false, + }; + // alert methods case actionConstants.ALERT_OPEN: return { diff --git a/ui/ducks/app/app.test.js b/ui/ducks/app/app.test.js index c71a539e0..2ad0222d5 100644 --- a/ui/ducks/app/app.test.js +++ b/ui/ducks/app/app.test.js @@ -38,6 +38,16 @@ describe('App State', () => { expect(newState.networkDropdownOpen).toStrictEqual(false); }); + it('sets showTestnetMessageInDropdown dropdown to false', () => { + const testnetMessage = { showTestnetMessageInDropdown: true }; + const state = { ...metamaskState, ...testnetMessage }; + const newState = reduceApp(state, { + type: actions.HIDE_TESTNET_MESSAGE, + }); + + expect(newState.showTestnetMessageInDropdown).toStrictEqual(false); + }); + it('opens alert', () => { const state = reduceApp(metamaskState, { type: actions.ALERT_OPEN, diff --git a/ui/store/actionConstants.js b/ui/store/actionConstants.js index 81683dcb4..57e40f4bd 100644 --- a/ui/store/actionConstants.js +++ b/ui/store/actionConstants.js @@ -9,6 +9,8 @@ export const QR_CODE_DETECTED = 'UI_QR_CODE_DETECTED'; // network dropdown open export const NETWORK_DROPDOWN_OPEN = 'UI_NETWORK_DROPDOWN_OPEN'; export const NETWORK_DROPDOWN_CLOSE = 'UI_NETWORK_DROPDOWN_CLOSE'; +// network dropdown +export const HIDE_TESTNET_MESSAGE = 'HIDE_TESTNET_MESSAGE'; // remote state export const UPDATE_METAMASK_STATE = 'UPDATE_METAMASK_STATE'; export const SELECTED_ADDRESS_CHANGED = 'SELECTED_ADDRESS_CHANGED'; diff --git a/ui/store/actions.js b/ui/store/actions.js index 7a1a06ed7..c12b0072f 100644 --- a/ui/store/actions.js +++ b/ui/store/actions.js @@ -1658,6 +1658,12 @@ export function hideNetworkDropdown() { }; } +export function hideTestNetMessage() { + return { + type: actionConstants.HIDE_TESTNET_MESSAGE, + }; +} + export function showModal(payload) { return { type: actionConstants.MODAL_OPEN, From 05aa19a05d279681d5a0f8b3aa8d5d03f004be1d Mon Sep 17 00:00:00 2001 From: ryanml Date: Mon, 8 Nov 2021 14:55:49 -0700 Subject: [PATCH 72/97] Replacing instances of 'testnets' with 'test networks' (#12626) --- app/_locales/en/messages.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 542c0135a..f97b24f9b 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -113,7 +113,7 @@ "message": "Advanced Options" }, "advancedSettingsDescription": { - "message": "Access developer features, download State Logs, Reset Account, setup testnets and custom RPC" + "message": "Access developer features, download State Logs, Reset Account, setup test networks and custom RPC" }, "affirmAgree": { "message": "I Agree" @@ -594,7 +594,7 @@ "message": "Decrypt request" }, "defaultNetwork": { - "message": "The default network for Ether transactions is Mainnet. You can also $1 testnets $2.", + "message": "The default network for Ether transactions is Mainnet. You can also $1 test networks $2.", "description": "$1 is the 'enable' or 'disable' key, depending on whether the display of test networks is enabled or not. $2 is a clickable link with text defined by the 'here' key. The link will open to the advanced settings where users can enable the display of test networks in the network dropdown." }, "delete": { @@ -2187,10 +2187,10 @@ "message": "Select this to show gas price and limit controls directly on the send and confirm screens." }, "showFiatConversionInTestnets": { - "message": "Show Conversion on Testnets" + "message": "Show Conversion on test networks" }, "showFiatConversionInTestnetsDescription": { - "message": "Select this to show fiat conversion on Testnets" + "message": "Select this to show fiat conversion on test networks" }, "showHexData": { "message": "Show Hex Data" From 2c410f534d2b8ed9685210528fbe455b8692e9c4 Mon Sep 17 00:00:00 2001 From: igorms-cons <89637087+igorms-cons@users.noreply.github.com> Date: Tue, 9 Nov 2021 11:58:21 +0100 Subject: [PATCH 73/97] Fix/ux papercuts account details issue #12292 (#12399) * account details - updating ui * account details - updating ui - version 2 * update qr-code scss in details account view * account detail screen - create local eng label * account detail update copy state --- app/_locales/en/messages.json | 3 ++ .../account-details-modal.component.js | 4 +-- .../modals/account-details-modal/index.scss | 4 +-- ui/components/app/modals/modal.js | 2 +- ui/components/ui/qr-code/index.scss | 35 +++++++++++++++++-- ui/components/ui/qr-code/qr-code.js | 24 ++++++++++++- ui/css/design-system/colors.scss | 2 ++ 7 files changed, 65 insertions(+), 9 deletions(-) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index f97b24f9b..15fb036c8 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -901,6 +901,9 @@ "etherscanView": { "message": "View account on Etherscan" }, + "etherscanViewOn": { + "message": "View on Etherscan" + }, "expandView": { "message": "Expand view" }, diff --git a/ui/components/app/modals/account-details-modal/account-details-modal.component.js b/ui/components/app/modals/account-details-modal/account-details-modal.component.js index 858fc5999..1df675a01 100644 --- a/ui/components/app/modals/account-details-modal/account-details-modal.component.js +++ b/ui/components/app/modals/account-details-modal/account-details-modal.component.js @@ -84,9 +84,7 @@ export default class AccountDetailsModal extends Component { ? this.context.t('blockExplorerView', [ getURLHostName(rpcPrefs.blockExplorerUrl), ]) - : this.context.t('viewOnEtherscan', [ - this.context.t('blockExplorerAccountAction'), - ])} + : this.context.t('etherscanViewOn')} {exportPrivateKeyFeatureEnabled ? ( diff --git a/ui/components/app/modals/account-details-modal/index.scss b/ui/components/app/modals/account-details-modal/index.scss index ecab51311..3eedab80c 100644 --- a/ui/components/app/modals/account-details-modal/index.scss +++ b/ui/components/app/modals/account-details-modal/index.scss @@ -8,13 +8,13 @@ & &__button { margin-top: 17px; padding: 10px 22px; - width: 286px; + width: 284px; } &__divider { width: 100%; height: 1px; - margin: 19px 0 8px 0; + margin: 16px 0 8px 0; background-color: $alto; } diff --git a/ui/components/app/modals/modal.js b/ui/components/app/modals/modal.js index 16a5d4807..c31cba238 100644 --- a/ui/components/app/modals/modal.js +++ b/ui/components/app/modals/modal.js @@ -64,7 +64,7 @@ const accountModalStyle = { margin: '0 auto', }, laptopModalStyle: { - width: '360px', + width: '335px', // top: 'calc(33% + 45px)', boxShadow: 'rgba(0, 0, 0, 0.15) 0px 2px 2px 2px', borderRadius: '4px', diff --git a/ui/components/ui/qr-code/index.scss b/ui/components/ui/qr-code/index.scss index c228ffeda..03ba8fc08 100644 --- a/ui/components/ui/qr-code/index.scss +++ b/ui/components/ui/qr-code/index.scss @@ -25,10 +25,41 @@ margin-bottom: 9px; } + &__address-container { + display: flex; + justify-content: center; + + &__tooltip-wrapper { + width: 100%; + } + + &:hover { + cursor: pointer; + + .qr-code__copy-icon__svg { + fill: $primary-1; + } + } + } + &__address { @include H7; - background-color: $ui-1; - padding: 12px; + background-color: $Grey-000; + width: 76%; + padding: 8px 12px; + word-break: break-all; + text-align: center; + } + + &__copy-icon { + height: 13px; + padding: 17px 0; + position: absolute; + right: 24px; + + &__svg { + fill: $ui-5; + } } } diff --git a/ui/components/ui/qr-code/qr-code.js b/ui/components/ui/qr-code/qr-code.js index 89ce505ab..69921e260 100644 --- a/ui/components/ui/qr-code/qr-code.js +++ b/ui/components/ui/qr-code/qr-code.js @@ -3,7 +3,11 @@ import React from 'react'; import qrCode from 'qrcode-generator'; import { connect } from 'react-redux'; import { isHexPrefixed } from 'ethereumjs-util'; +import { useCopyToClipboard } from '../../../hooks/useCopyToClipboard'; import { toChecksumHexAddress } from '../../../../shared/modules/hexstring-utils'; +import Tooltip from '../tooltip'; +import CopyIcon from '../icon/copy-icon.component'; +import { useI18nContext } from '../../../hooks/useI18nContext'; export default connect(mapStateToProps)(QrCodeView); @@ -22,6 +26,8 @@ function QrCodeView(props) { const address = `${ isHexPrefixed(data) ? 'ethereum:' : '' }${toChecksumHexAddress(data)}`; + const [copied, handleCopy] = useCopyToClipboard(); + const t = useI18nContext(); const qrImage = qrCode(4, 'M'); qrImage.addData(address); qrImage.make(); @@ -50,7 +56,23 @@ function QrCodeView(props) { __html: qrImage.createTableTag(4), }} /> -
{toChecksumHexAddress(data)}
+ +
{ + handleCopy(toChecksumHexAddress(data)); + }} + > +
{toChecksumHexAddress(data)}
+
+ +
+
+
); } diff --git a/ui/css/design-system/colors.scss b/ui/css/design-system/colors.scss index bda23ce09..d76de5ef6 100644 --- a/ui/css/design-system/colors.scss +++ b/ui/css/design-system/colors.scss @@ -103,6 +103,7 @@ $ui-1: #f2f3f4; $ui-2: #d6d9dc; $ui-3: #bbc0c5; $ui-4: #6a737d; +$ui-5: #c4c4c4; $mainnet: #29b6af; $ropsten: #ff4a8d; @@ -116,6 +117,7 @@ $color-map: ( 'ui-2': $ui-2, 'ui-3': $ui-3, 'ui-4': $ui-4, + 'ui-5': $ui-5, 'white': $ui-white, 'black': $ui-black, 'grey': $ui-grey, From a49a40fbbb695e01c8bbbeb7d3330090209a5ed2 Mon Sep 17 00:00:00 2001 From: Jyoti Puri Date: Wed, 10 Nov 2021 07:37:10 +0530 Subject: [PATCH 74/97] Adding GasFee context (#12530) Adding GasFee context --- .../confirm-page-container-container.test.js | 10 + .../confirm-page-container.component.js | 185 +++++++++--------- ui/contexts/gasFee.js | 37 ++++ ui/hooks/gasFeeInput/useGasFeeErrors.js | 7 +- ui/hooks/gasFeeInput/useGasFeeInputs.js | 3 +- 5 files changed, 148 insertions(+), 94 deletions(-) create mode 100644 ui/contexts/gasFee.js diff --git a/ui/components/app/confirm-page-container/confirm-page-container-container.test.js b/ui/components/app/confirm-page-container/confirm-page-container-container.test.js index 9ddf77de8..fc0a5f669 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-container.test.js +++ b/ui/components/app/confirm-page-container/confirm-page-container-container.test.js @@ -10,6 +10,14 @@ import ConfirmPageContainer, { ConfirmPageContainerNavigation, } from '.'; +jest.mock('../../../store/actions', () => ({ + disconnectGasFeeEstimatePoller: jest.fn(), + getGasFeeEstimatesAndStartPolling: jest + .fn() + .mockImplementation(() => Promise.resolve()), + addPollingTokenToAppState: jest.fn(), +})); + describe('Confirm Page Container Container Test', () => { let wrapper; @@ -31,6 +39,8 @@ describe('Confirm Page Container Container Test', () => { selectedAddress: '0xd8f6a2ffb0fc5952d16c9768b71cfd35b6399aa5', addressBook: [], chainId: 'test', + identities: [], + featureFlags: {}, }, }; diff --git a/ui/components/app/confirm-page-container/confirm-page-container.component.js b/ui/components/app/confirm-page-container/confirm-page-container.component.js index 7a4eb0e10..117318e3d 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container.component.js @@ -4,6 +4,7 @@ import SenderToRecipient from '../../ui/sender-to-recipient'; import { PageContainerFooter } from '../../ui/page-container'; import EditGasPopover from '../edit-gas-popover'; import { EDIT_GAS_MODES } from '../../../../shared/constants/gas'; +import { GasFeeContextProvider } from '../../../contexts/gasFee'; import ErrorMessage from '../../ui/error-message'; import { TRANSACTION_TYPES } from '../../../../shared/constants/transaction'; import Dialog from '../../ui/dialog'; @@ -135,102 +136,104 @@ export default class ConfirmPageContainer extends Component { currentTransaction.txParams?.value === '0x0'; return ( -
- onNextTx(txId)} - firstTx={firstTx} - lastTx={lastTx} - ofText={ofText} - requestsWaitingText={requestsWaitingText} - /> - onEdit()} - showAccountInHeader={showAccountInHeader} - accountAddress={fromAddress} - > - {hideSenderToRecipient ? null : ( - +
+ onNextTx(txId)} + firstTx={firstTx} + lastTx={lastTx} + ofText={ofText} + requestsWaitingText={requestsWaitingText} + /> + onEdit()} + showAccountInHeader={showAccountInHeader} + accountAddress={fromAddress} + > + {hideSenderToRecipient ? null : ( + + )} + +
+ {showAddToAddressDialog && ( + showAddToAddressBookModal()} + > + {this.context.t('newAccountDetectedDialogMessage')} + + )} +
+ {contentComponent || ( + )} - -
- {showAddToAddressDialog && ( - showAddToAddressBookModal()} + {shouldDisplayWarning && ( +
+ +
+ )} + {contentComponent && ( + - {this.context.t('newAccountDetectedDialogMessage')} -
+ {unapprovedTxCount > 1 && ( + + {this.context.t('rejectTxsN', [unapprovedTxCount])} + + )} + + )} + {editingGas && ( + )}
- {contentComponent || ( - - )} - {shouldDisplayWarning && ( -
- -
- )} - {contentComponent && ( - - {unapprovedTxCount > 1 && ( - - {this.context.t('rejectTxsN', [unapprovedTxCount])} - - )} - - )} - {editingGas && ( - - )} -
+ ); } } diff --git a/ui/contexts/gasFee.js b/ui/contexts/gasFee.js new file mode 100644 index 000000000..c7fe7f092 --- /dev/null +++ b/ui/contexts/gasFee.js @@ -0,0 +1,37 @@ +import React, { createContext, useContext } from 'react'; +import PropTypes from 'prop-types'; +import { useGasFeeInputs } from '../hooks/gasFeeInput/useGasFeeInputs'; + +export const GasFeeContext = createContext({}); + +export const GasFeeContextProvider = ({ + children, + defaultEstimateToUse, + transaction, + minimumGasLimit, + editGasMode, +}) => { + const gasFeeDetails = useGasFeeInputs( + defaultEstimateToUse, + transaction, + minimumGasLimit, + editGasMode, + ); + return ( + + {children} + + ); +}; + +export function useGasFeeContext() { + return useContext(GasFeeContext); +} + +GasFeeContextProvider.propTypes = { + children: PropTypes.node.isRequired, + defaultEstimateToUse: PropTypes.string, + transaction: PropTypes.object.isRequired, + minimumGasLimit: PropTypes.string, + editGasMode: PropTypes.string, +}; diff --git a/ui/hooks/gasFeeInput/useGasFeeErrors.js b/ui/hooks/gasFeeInput/useGasFeeErrors.js index d477087d0..0300feec0 100644 --- a/ui/hooks/gasFeeInput/useGasFeeErrors.js +++ b/ui/hooks/gasFeeInput/useGasFeeErrors.js @@ -130,7 +130,10 @@ const getMaxFeeWarning = ( return undefined; }; -const getBalanceError = (minimumCostInHexWei, transaction, ethBalance) => { +const hasBalanceError = (minimumCostInHexWei, transaction, ethBalance) => { + if (minimumCostInHexWei === undefined || ethBalance === undefined) { + return false; + } const minimumTxCostInHexWei = addHexes( minimumCostInHexWei, transaction?.txParams?.value || '0x0', @@ -247,7 +250,7 @@ export function useGasFeeErrors({ ); const { balance: ethBalance } = useSelector(getSelectedAccount); - const balanceError = getBalanceError( + const balanceError = hasBalanceError( minimumCostInHexWei, transaction, ethBalance, diff --git a/ui/hooks/gasFeeInput/useGasFeeInputs.js b/ui/hooks/gasFeeInput/useGasFeeInputs.js index e67bd031f..80d18df98 100644 --- a/ui/hooks/gasFeeInput/useGasFeeInputs.js +++ b/ui/hooks/gasFeeInput/useGasFeeInputs.js @@ -3,6 +3,7 @@ import { useSelector } from 'react-redux'; import { getAdvancedInlineGasShown } from '../../selectors'; import { hexToDecimal } from '../../helpers/utils/conversions.util'; +import { EDIT_GAS_MODES } from '../../../shared/constants/gas'; import { GAS_FORM_ERRORS } from '../../helpers/constants/gas'; import { GAS_RECOMMENDATIONS, @@ -65,7 +66,7 @@ export function useGasFeeInputs( defaultEstimateToUse = GAS_RECOMMENDATIONS.MEDIUM, transaction, minimumGasLimit = '0x5208', - editGasMode, + editGasMode = EDIT_GAS_MODES.MODIFY_IN_PLACE, ) { // We need the gas estimates from the GasFeeController in the background. // Calling this hooks initiates polling for new gas estimates and returns the From a13d8583a091299c09f8b06eb72372857119248c Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Wed, 10 Nov 2021 06:30:42 -0330 Subject: [PATCH 75/97] Fix flaky account removal e2e test (#12607) * Add delay to fix flaky account removal e2e test * Await for element to update instead of awaiting an arbitrary delay * Update test/e2e/tests/from-import-ui.spec.js Co-authored-by: Mark Stacey * code formatting * Remove redundant code Co-authored-by: Mark Stacey Co-authored-by: PeterYinusa --- test/e2e/tests/from-import-ui.spec.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/test/e2e/tests/from-import-ui.spec.js b/test/e2e/tests/from-import-ui.spec.js index 0bd3b683a..5c0e0c8ee 100644 --- a/test/e2e/tests/from-import-ui.spec.js +++ b/test/e2e/tests/from-import-ui.spec.js @@ -233,10 +233,15 @@ describe('Metamask Import UI', function () { // should remove the account await driver.clickElement({ text: 'Remove', tag: 'button' }); - const currentActiveAccountName = await driver.findElement( - '.selected-account__name', + // Wait until selected account switches away from removed account to first account + await driver.waitForSelector( + { + css: '.selected-account__name', + text: 'Account 1', + }, + { timeout: 10000 }, ); - assert.equal(await currentActiveAccountName.getText(), 'Account 1'); + await driver.delay(regularDelayMs); await driver.clickElement('.account-menu__icon'); From ab2aca2c0802a1223e976add7a4e3cf0997b96ec Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Wed, 10 Nov 2021 10:54:17 -0330 Subject: [PATCH 76/97] Fix lint errors (#12645) These lint errors were accidentally introduced recently as a result of merging #12530 and #12461 --- ui/hooks/gasFeeInput/useGasFeeInputs.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ui/hooks/gasFeeInput/useGasFeeInputs.js b/ui/hooks/gasFeeInput/useGasFeeInputs.js index 80d18df98..96ad40f73 100644 --- a/ui/hooks/gasFeeInput/useGasFeeInputs.js +++ b/ui/hooks/gasFeeInput/useGasFeeInputs.js @@ -3,12 +3,13 @@ import { useSelector } from 'react-redux'; import { getAdvancedInlineGasShown } from '../../selectors'; import { hexToDecimal } from '../../helpers/utils/conversions.util'; -import { EDIT_GAS_MODES } from '../../../shared/constants/gas'; -import { GAS_FORM_ERRORS } from '../../helpers/constants/gas'; import { + EDIT_GAS_MODES, GAS_RECOMMENDATIONS, CUSTOM_GAS_ESTIMATE, } from '../../../shared/constants/gas'; +import { GAS_FORM_ERRORS } from '../../helpers/constants/gas'; + import { useGasFeeEstimates } from '../useGasFeeEstimates'; import { useGasFeeErrors } from './useGasFeeErrors'; From dc19e1d5f63bf17442eddc59ae2ee65d1c442c6a Mon Sep 17 00:00:00 2001 From: PeterYinusa <53189696+PeterYinusa@users.noreply.github.com> Date: Wed, 10 Nov 2021 17:27:10 +0000 Subject: [PATCH 77/97] Onboarding v2 e2e test (#12628) * add data-testid's * import wallet test * create wallet test * fix lint issues --- test/e2e/tests/from-import-ui.spec.js | 84 ++++++--- test/e2e/tests/metamask-responsive-ui.spec.js | 176 ++++++++++++------ ui/components/ui/chip/chip-with-input.js | 3 + ui/components/ui/chip/chip.js | 3 + ui/components/ui/form-field/form-field.js | 3 + .../create-password/create-password.js | 8 + .../creation-successful.js | 8 +- .../onboarding-flow/import-srp/import-srp.js | 2 + .../metametrics/metametrics.js | 12 +- .../pin-extension/pin-extension.js | 3 + .../confirm-recovery-phrase.js | 1 + .../recovery-phrase/recovery-phrase-chips.js | 8 +- .../recovery-phrase/review-recovery-phrase.js | 2 + .../secure-your-wallet/secure-your-wallet.js | 9 +- .../skip-srp-backup-popover.js | 1 + ui/pages/onboarding-flow/welcome/welcome.js | 12 +- 16 files changed, 243 insertions(+), 92 deletions(-) diff --git a/test/e2e/tests/from-import-ui.spec.js b/test/e2e/tests/from-import-ui.spec.js index 5c0e0c8ee..a83a9bbbb 100644 --- a/test/e2e/tests/from-import-ui.spec.js +++ b/test/e2e/tests/from-import-ui.spec.js @@ -27,38 +27,72 @@ describe('Metamask Import UI', function () { async ({ driver }) => { await driver.navigate(); - // clicks the continue button on the welcome screen - await driver.findElement('.welcome-page__header'); - await driver.clickElement({ - text: enLocaleMessages.getStarted.message, - tag: 'button', - }); + if (process.env.ONBOARDING_V2 === '1') { + // welcome + await driver.clickElement('[data-testid="onboarding-import-wallet"]'); - // clicks the "Import Wallet" option - await driver.clickElement({ text: 'Import wallet', tag: 'button' }); + // metrics + await driver.clickElement('[data-testid="metametrics-no-thanks"]'); - // clicks the "No thanks" option on the metametrics opt-in screen - await driver.clickElement('.btn-secondary'); + // import with recovery phrase + await driver.fill('[data-testid="import-srp-text"]', testSeedPhrase); + await driver.clickElement('[data-testid="import-srp-confirm"]'); - // Import Secret Recovery Phrase - await driver.fill( - 'input[placeholder="Paste Secret Recovery Phrase from clipboard"]', - testSeedPhrase, - ); + // create password + await driver.fill( + '[data-testid="create-password-new"]', + 'correct horse battery staple', + ); + await driver.fill( + '[data-testid="create-password-confirm"]', + 'correct horse battery staple', + ); + await driver.clickElement('[data-testid="create-password-terms"]'); + await driver.clickElement('[data-testid="create-password-import"]'); + + // complete + await driver.clickElement('[data-testid="onboarding-complete-done"]'); + + // pin extension + await driver.clickElement('[data-testid="pin-extension-next"]'); + await driver.clickElement('[data-testid="pin-extension-done"]'); + } else { + // clicks the continue button on the welcome screen + await driver.findElement('.welcome-page__header'); + await driver.clickElement({ + text: enLocaleMessages.getStarted.message, + tag: 'button', + }); + + // clicks the "Import Wallet" option + await driver.clickElement({ text: 'Import wallet', tag: 'button' }); + + // clicks the "No thanks" option on the metametrics opt-in screen + await driver.clickElement('.btn-secondary'); + + // Import Secret Recovery Phrase + await driver.fill( + 'input[placeholder="Paste Secret Recovery Phrase from clipboard"]', + testSeedPhrase, + ); - await driver.fill('#password', 'correct horse battery staple'); - await driver.fill('#confirm-password', 'correct horse battery staple'); + await driver.fill('#password', 'correct horse battery staple'); + await driver.fill( + '#confirm-password', + 'correct horse battery staple', + ); - await driver.clickElement('.first-time-flow__terms'); + await driver.clickElement('.first-time-flow__terms'); - await driver.clickElement({ text: 'Import', tag: 'button' }); + await driver.clickElement({ text: 'Import', tag: 'button' }); - // clicks through the success screen - await driver.findElement({ text: 'Congratulations', tag: 'div' }); - await driver.clickElement({ - text: enLocaleMessages.endOfFlowMessage10.message, - tag: 'button', - }); + // clicks through the success screen + await driver.findElement({ text: 'Congratulations', tag: 'div' }); + await driver.clickElement({ + text: enLocaleMessages.endOfFlowMessage10.message, + tag: 'button', + }); + } // Show account information await driver.clickElement( diff --git a/test/e2e/tests/metamask-responsive-ui.spec.js b/test/e2e/tests/metamask-responsive-ui.spec.js index e512ce9f4..adb5ad644 100644 --- a/test/e2e/tests/metamask-responsive-ui.spec.js +++ b/test/e2e/tests/metamask-responsive-ui.spec.js @@ -16,77 +16,133 @@ describe('Metamask Responsive UI', function () { async ({ driver }) => { await driver.navigate(); - // clicks the continue button on the welcome screen - await driver.findElement('.welcome-page__header'); - await driver.clickElement({ - text: enLocaleMessages.getStarted.message, - tag: 'button', - }); - await driver.delay(tinyDelayMs); + async function clickWordAndWait(word) { + await driver.clickElement( + `[data-testid="seed-phrase-sorted"] [data-testid="draggable-seed-${word}"]`, + ); + await driver.delay(tinyDelayMs); + } - // clicks the "Create New Wallet" option - await driver.clickElement({ text: 'Create a Wallet', tag: 'button' }); + if (process.env.ONBOARDING_V2 === '1') { + // welcome + await driver.clickElement('[data-testid="onboarding-create-wallet"]'); - // clicks the "I Agree" option on the metametrics opt-in screen - await driver.clickElement('.btn-primary'); + // metrics + await driver.clickElement('[data-testid="metametrics-no-thanks"]'); - // accepts a secure password - await driver.fill( - '.first-time-flow__form #create-password', - 'correct horse battery staple', - ); - await driver.fill( - '.first-time-flow__form #confirm-password', - 'correct horse battery staple', - ); - await driver.clickElement('.first-time-flow__checkbox'); - await driver.clickElement('.first-time-flow__form button'); + // create password + await driver.fill( + '[data-testid="create-password-new"]', + 'correct horse battery staple', + ); + await driver.fill( + '[data-testid="create-password-confirm"]', + 'correct horse battery staple', + ); + await driver.clickElement('[data-testid="create-password-terms"]'); + await driver.clickElement('[data-testid="create-password-wallet"]'); - // renders the Secret Recovery Phrase intro screen - await driver.clickElement('.seed-phrase-intro__left button'); + // secure wallet + await driver.clickElement( + '[data-testid="secure-wallet-recommended"]', + ); - // reveals the Secret Recovery Phrase - await driver.clickElement( - '.reveal-seed-phrase__secret-blocker .reveal-seed-phrase__reveal-button', - ); - const revealedSeedPhrase = await driver.findElement( - '.reveal-seed-phrase__secret-words', - ); - const seedPhrase = await revealedSeedPhrase.getText(); - assert.equal(seedPhrase.split(' ').length, 12); + // review + await driver.clickElement('[data-testid="recovery-phrase-reveal"]'); + const chipTwo = await ( + await driver.findElement('[data-testid="recovery-phrase-chip-2"]') + ).getText(); + const chipThree = await ( + await driver.findElement('[data-testid="recovery-phrase-chip-3"]') + ).getText(); + const chipSeven = await ( + await driver.findElement('[data-testid="recovery-phrase-chip-7"]') + ).getText(); + await driver.clickElement('[data-testid="recovery-phrase-next"]'); + + // confirm + await driver.fill('[data-testid="recovery-phrase-input-2"]', chipTwo); + await driver.fill( + '[data-testid="recovery-phrase-input-3"]', + chipThree, + ); + await driver.fill( + '[data-testid="recovery-phrase-input-7"]', + chipSeven, + ); + await driver.clickElement('[data-testid="recovery-phrase-confirm"]'); + + // complete + await driver.clickElement('[data-testid="onboarding-complete-done"]'); + + // pin extension + await driver.clickElement('[data-testid="pin-extension-next"]'); + await driver.clickElement('[data-testid="pin-extension-done"]'); + } else { + // clicks the continue button on the welcome screen + await driver.findElement('.welcome-page__header'); + await driver.clickElement({ + text: enLocaleMessages.getStarted.message, + tag: 'button', + }); + await driver.delay(tinyDelayMs); - await driver.clickElement({ - text: enLocaleMessages.next.message, - tag: 'button', - }); + // clicks the "Create New Wallet" option + await driver.clickElement({ text: 'Create a Wallet', tag: 'button' }); - async function clickWordAndWait(word) { - await driver.clickElement( - `[data-testid="seed-phrase-sorted"] [data-testid="draggable-seed-${word}"]`, + // clicks the "I Agree" option on the metametrics opt-in screen + await driver.clickElement('.btn-primary'); + + // accepts a secure password + await driver.fill( + '.first-time-flow__form #create-password', + 'correct horse battery staple', ); - await driver.delay(tinyDelayMs); - } + await driver.fill( + '.first-time-flow__form #confirm-password', + 'correct horse battery staple', + ); + await driver.clickElement('.first-time-flow__checkbox'); + await driver.clickElement('.first-time-flow__form button'); - // can retype the Secret Recovery Phrase - const words = seedPhrase.split(' '); - for (const word of words) { - await clickWordAndWait(word); - } - await driver.clickElement({ text: 'Confirm', tag: 'button' }); + // renders the Secret Recovery Phrase intro screen + await driver.clickElement('.seed-phrase-intro__left button'); - // clicks through the success screen - await driver.findElement({ text: 'Congratulations', tag: 'div' }); - await driver.clickElement({ - text: enLocaleMessages.endOfFlowMessage10.message, - tag: 'button', - }); + // reveals the Secret Recovery Phrase + await driver.clickElement( + '.reveal-seed-phrase__secret-blocker .reveal-seed-phrase__reveal-button', + ); + const revealedSeedPhrase = await driver.findElement( + '.reveal-seed-phrase__secret-words', + ); + const seedPhrase = await revealedSeedPhrase.getText(); + assert.equal(seedPhrase.split(' ').length, 12); + + await driver.clickElement({ + text: enLocaleMessages.next.message, + tag: 'button', + }); + + // can retype the Secret Recovery Phrase + const words = seedPhrase.split(' '); + for (const word of words) { + await clickWordAndWait(word); + } + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + + // clicks through the success screen + await driver.findElement({ text: 'Congratulations', tag: 'div' }); + await driver.clickElement({ + text: enLocaleMessages.endOfFlowMessage10.message, + tag: 'button', + }); + } - // Show account information - // balance renders - await driver.waitForSelector({ - css: '[data-testid="eth-overview__primary-currency"]', - text: '0 ETH', - }); + // assert balance + const balance = await driver.findElement( + '[data-testid="wallet-balance"]', + ); + assert.ok(/^0\sETH$/u.test(await balance.getText())); }, ); }); diff --git a/ui/components/ui/chip/chip-with-input.js b/ui/components/ui/chip/chip-with-input.js index c6fad92d9..8a5e30cc9 100644 --- a/ui/components/ui/chip/chip-with-input.js +++ b/ui/components/ui/chip/chip-with-input.js @@ -5,6 +5,7 @@ import { COLORS } from '../../../helpers/constants/design-system'; import Chip from '.'; export function ChipWithInput({ + dataTestId, className, borderColor = COLORS.UI1, inputValue, @@ -17,6 +18,7 @@ export function ChipWithInput({ > {setInputValue && ( { @@ -30,6 +32,7 @@ export function ChipWithInput({ } ChipWithInput.propTypes = { + dataTestId: PropTypes.string, borderColor: PropTypes.oneOf(Object.values(COLORS)), className: PropTypes.string, inputValue: PropTypes.string, diff --git a/ui/components/ui/chip/chip.js b/ui/components/ui/chip/chip.js index 6311ea72e..45157fd51 100644 --- a/ui/components/ui/chip/chip.js +++ b/ui/components/ui/chip/chip.js @@ -6,6 +6,7 @@ import Typography from '../typography'; import { COLORS, TYPOGRAPHY } from '../../../helpers/constants/design-system'; export default function Chip({ + dataTestId, className, children, borderColor = COLORS.UI1, @@ -25,6 +26,7 @@ export default function Chip({ return (
)} {error && ( @@ -111,6 +113,7 @@ export default function FormField({ } FormField.propTypes = { + dataTestId: PropTypes.string, titleText: PropTypes.oneOfType([PropTypes.string, PropTypes.node]), titleUnit: PropTypes.string, tooltipText: PropTypes.oneOfType([PropTypes.string, PropTypes.node]), diff --git a/ui/pages/onboarding-flow/create-password/create-password.js b/ui/pages/onboarding-flow/create-password/create-password.js index 66471c67f..fcdbca69a 100644 --- a/ui/pages/onboarding-flow/create-password/create-password.js +++ b/ui/pages/onboarding-flow/create-password/create-password.js @@ -131,6 +131,7 @@ export default function CreatePassword({ >
setTermsChecked(!termsChecked)} checked={termsChecked} /> @@ -190,6 +193,11 @@ export default function CreatePassword({ - diff --git a/ui/pages/onboarding-flow/import-srp/import-srp.js b/ui/pages/onboarding-flow/import-srp/import-srp.js index 7707b5f9b..797aacef4 100644 --- a/ui/pages/onboarding-flow/import-srp/import-srp.js +++ b/ui/pages/onboarding-flow/import-srp/import-srp.js @@ -78,6 +78,7 @@ export default function ImportSRP({ submitSecretRecoveryPhrase }) { />

(\r\n type: T\r\n): PayloadActionCreator\r\n\r\n/**\r\n * A utility function to create an action creator for the given action type\r\n * string. The action creator accepts a single argument, which will be included\r\n * in the action object as a field called payload. The action creator function\r\n * will also have its toString() overriden so that it returns the action type,\r\n * allowing it to be used in reducer logic that is looking for that action type.\r\n *\r\n * @param type The action type to use for created actions.\r\n * @param prepare (optional) a method that takes any number of arguments and returns { payload } or { payload, meta }.\r\n * If this is given, the resulting action creator will pass its arguments to this method to calculate payload & meta.\r\n *\r\n * @public\r\n */\r\nexport function createAction<\r\n PA extends PrepareAction,\r\n T extends string = string\r\n>(\r\n type: T,\r\n prepareAction: PA\r\n): PayloadActionCreator['payload'], T, PA>\r\n\r\nexport function createAction(type: string, prepareAction?: Function): any {\r\n function actionCreator(...args: any[]) {\r\n if (prepareAction) {\r\n let prepared = prepareAction(...args)\r\n if (!prepared) {\r\n throw new Error('prepareAction did not return an object')\r\n }\r\n\r\n return {\r\n type,\r\n payload: prepared.payload,\r\n ...('meta' in prepared && { meta: prepared.meta }),\r\n ...('error' in prepared && { error: prepared.error }),\r\n }\r\n }\r\n return { type, payload: args[0] }\r\n }\r\n\r\n actionCreator.toString = () => `${type}`\r\n\r\n actionCreator.type = type\r\n\r\n actionCreator.match = (action: Action): action is PayloadAction =>\r\n action.type === type\r\n\r\n return actionCreator\r\n}\r\n\r\nexport function isFSA(action: unknown): action is {\r\n type: string\r\n payload?: unknown\r\n error?: unknown\r\n meta?: unknown\r\n} {\r\n return (\r\n isPlainObject(action) &&\r\n typeof (action as any).type === 'string' &&\r\n Object.keys(action).every(isValidKey)\r\n )\r\n}\r\n\r\nfunction isValidKey(key: string) {\r\n return ['type', 'payload', 'error', 'meta'].indexOf(key) > -1\r\n}\r\n\r\n/**\r\n * Returns the action type of the actions created by the passed\r\n * `createAction()`-generated action creator (arbitrary action creators\r\n * are not supported).\r\n *\r\n * @param action The action creator whose action type to get.\r\n * @returns The action type used by the action creator.\r\n *\r\n * @public\r\n */\r\nexport function getType(\r\n actionCreator: PayloadActionCreator\r\n): T {\r\n return `${actionCreator}` as T\r\n}\r\n\r\n// helper types for more readable typings\r\n\r\ntype IfPrepareActionMethodProvided<\r\n PA extends PrepareAction | void,\r\n True,\r\n False\r\n> = PA extends (...args: any[]) => any ? True : False\r\n","import type { Draft } from 'immer'\r\nimport createNextState, { isDraft, isDraftable } from 'immer'\r\nimport type { AnyAction, Action, Reducer } from 'redux'\r\nimport type { ActionReducerMapBuilder } from './mapBuilders'\r\nimport { executeReducerBuilderCallback } from './mapBuilders'\r\nimport type { NoInfer } from './tsHelpers'\r\n\r\n/**\r\n * Defines a mapping from action types to corresponding action object shapes.\r\n *\r\n * @deprecated This should not be used manually - it is only used for internal\r\n * inference purposes and should not have any further value.\r\n * It might be removed in the future.\r\n * @public\r\n */\r\nexport type Actions = Record\r\n\r\nexport interface ActionMatcher {\r\n (action: AnyAction): action is A\r\n}\r\n\r\nexport type ActionMatcherDescription = {\r\n matcher: ActionMatcher\r\n reducer: CaseReducer>\r\n}\r\n\r\nexport type ReadonlyActionMatcherDescriptionCollection = ReadonlyArray<\r\n ActionMatcherDescription\r\n>\r\n\r\nexport type ActionMatcherDescriptionCollection = Array<\r\n ActionMatcherDescription\r\n>\r\n\r\n/**\r\n * An *case reducer* is a reducer function for a specific action type. Case\r\n * reducers can be composed to full reducers using `createReducer()`.\r\n *\r\n * Unlike a normal Redux reducer, a case reducer is never called with an\r\n * `undefined` state to determine the initial state. Instead, the initial\r\n * state is explicitly specified as an argument to `createReducer()`.\r\n *\r\n * In addition, a case reducer can choose to mutate the passed-in `state`\r\n * value directly instead of returning a new state. This does not actually\r\n * cause the store state to be mutated directly; instead, thanks to\r\n * [immer](https://github.com/mweststrate/immer), the mutations are\r\n * translated to copy operations that result in a new state.\r\n *\r\n * @public\r\n */\r\nexport type CaseReducer = (\r\n state: Draft,\r\n action: A\r\n) => S | void | Draft\r\n\r\n/**\r\n * A mapping from action types to case reducers for `createReducer()`.\r\n *\r\n * @deprecated This should not be used manually - it is only used\r\n * for internal inference purposes and using it manually\r\n * would lead to type erasure.\r\n * It might be removed in the future.\r\n * @public\r\n */\r\nexport type CaseReducers = {\r\n [T in keyof AS]: AS[T] extends Action ? CaseReducer : void\r\n}\r\n\r\n/**\r\n * A utility function that allows defining a reducer as a mapping from action\r\n * type to *case reducer* functions that handle these action types. The\r\n * reducer's initial state is passed as the first argument.\r\n *\r\n * @remarks\r\n * The body of every case reducer is implicitly wrapped with a call to\r\n * `produce()` from the [immer](https://github.com/mweststrate/immer) library.\r\n * This means that rather than returning a new state object, you can also\r\n * mutate the passed-in state object directly; these mutations will then be\r\n * automatically and efficiently translated into copies, giving you both\r\n * convenience and immutability.\r\n *\r\n * @overloadSummary\r\n * This overload accepts a callback function that receives a `builder` object as its argument.\r\n * That builder provides `addCase`, `addMatcher` and `addDefaultCase` functions that may be\r\n * called to define what actions this reducer will handle.\r\n *\r\n * @param initialState - The initial state that should be used when the reducer is called the first time.\r\n * @param builderCallback - A callback that receives a *builder* object to define\r\n * case reducers via calls to `builder.addCase(actionCreatorOrType, reducer)`.\r\n * @example\r\n```ts\r\nimport {\r\n createAction,\r\n createReducer,\r\n AnyAction,\r\n PayloadAction,\r\n} from \"@reduxjs/toolkit\";\r\n\r\nconst increment = createAction(\"increment\");\r\nconst decrement = createAction(\"decrement\");\r\n\r\nfunction isActionWithNumberPayload(\r\n action: AnyAction\r\n): action is PayloadAction {\r\n return typeof action.payload === \"number\";\r\n}\r\n\r\ncreateReducer(\r\n {\r\n counter: 0,\r\n sumOfNumberPayloads: 0,\r\n unhandledActions: 0,\r\n },\r\n (builder) => {\r\n builder\r\n .addCase(increment, (state, action) => {\r\n // action is inferred correctly here\r\n state.counter += action.payload;\r\n })\r\n // You can chain calls, or have separate `builder.addCase()` lines each time\r\n .addCase(decrement, (state, action) => {\r\n state.counter -= action.payload;\r\n })\r\n // You can apply a \"matcher function\" to incoming actions\r\n .addMatcher(isActionWithNumberPayload, (state, action) => {})\r\n // and provide a default case if no other handlers matched\r\n .addDefaultCase((state, action) => {});\r\n }\r\n);\r\n```\r\n * @public\r\n */\r\nexport function createReducer(\r\n initialState: S,\r\n builderCallback: (builder: ActionReducerMapBuilder) => void\r\n): Reducer\r\n\r\n/**\r\n * A utility function that allows defining a reducer as a mapping from action\r\n * type to *case reducer* functions that handle these action types. The\r\n * reducer's initial state is passed as the first argument.\r\n *\r\n * The body of every case reducer is implicitly wrapped with a call to\r\n * `produce()` from the [immer](https://github.com/mweststrate/immer) library.\r\n * This means that rather than returning a new state object, you can also\r\n * mutate the passed-in state object directly; these mutations will then be\r\n * automatically and efficiently translated into copies, giving you both\r\n * convenience and immutability.\r\n * \r\n * @overloadSummary\r\n * This overload accepts an object where the keys are string action types, and the values\r\n * are case reducer functions to handle those action types.\r\n *\r\n * @param initialState - The initial state that should be used when the reducer is called the first time.\r\n * @param actionsMap - An object mapping from action types to _case reducers_, each of which handles one specific action type.\r\n * @param actionMatchers - An array of matcher definitions in the form `{matcher, reducer}`.\r\n * All matching reducers will be executed in order, independently if a case reducer matched or not.\r\n * @param defaultCaseReducer - A \"default case\" reducer that is executed if no case reducer and no matcher\r\n * reducer was executed for this action.\r\n *\r\n * @example\r\n```js\r\nconst counterReducer = createReducer(0, {\r\n increment: (state, action) => state + action.payload,\r\n decrement: (state, action) => state - action.payload\r\n})\r\n```\r\n \r\n * Action creators that were generated using [`createAction`](./createAction) may be used directly as the keys here, using computed property syntax:\r\n\r\n```js\r\nconst increment = createAction('increment')\r\nconst decrement = createAction('decrement')\r\n\r\nconst counterReducer = createReducer(0, {\r\n [increment]: (state, action) => state + action.payload,\r\n [decrement.type]: (state, action) => state - action.payload\r\n})\r\n```\r\n * @public\r\n */\r\nexport function createReducer<\r\n S,\r\n CR extends CaseReducers = CaseReducers\r\n>(\r\n initialState: S,\r\n actionsMap: CR,\r\n actionMatchers?: ActionMatcherDescriptionCollection,\r\n defaultCaseReducer?: CaseReducer\r\n): Reducer\r\n\r\nexport function createReducer(\r\n initialState: S,\r\n mapOrBuilderCallback:\r\n | CaseReducers\r\n | ((builder: ActionReducerMapBuilder) => void),\r\n actionMatchers: ReadonlyActionMatcherDescriptionCollection = [],\r\n defaultCaseReducer?: CaseReducer\r\n): Reducer {\r\n let [actionsMap, finalActionMatchers, finalDefaultCaseReducer] =\r\n typeof mapOrBuilderCallback === 'function'\r\n ? executeReducerBuilderCallback(mapOrBuilderCallback)\r\n : [mapOrBuilderCallback, actionMatchers, defaultCaseReducer]\r\n\r\n const frozenInitialState = createNextState(initialState, () => {})\r\n\r\n return function (state = frozenInitialState, action): S {\r\n let caseReducers = [\r\n actionsMap[action.type],\r\n ...finalActionMatchers\r\n .filter(({ matcher }) => matcher(action))\r\n .map(({ reducer }) => reducer),\r\n ]\r\n if (caseReducers.filter((cr) => !!cr).length === 0) {\r\n caseReducers = [finalDefaultCaseReducer]\r\n }\r\n\r\n return caseReducers.reduce((previousState, caseReducer): S => {\r\n if (caseReducer) {\r\n if (isDraft(previousState)) {\r\n // If it's already a draft, we must already be inside a `createNextState` call,\r\n // likely because this is being wrapped in `createReducer`, `createSlice`, or nested\r\n // inside an existing draft. It's safe to just pass the draft to the mutator.\r\n const draft = previousState as Draft // We can assume this is already a draft\r\n const result = caseReducer(draft, action)\r\n\r\n if (typeof result === 'undefined') {\r\n return previousState\r\n }\r\n\r\n return result as S\r\n } else if (!isDraftable(previousState)) {\r\n // If state is not draftable (ex: a primitive, such as 0), we want to directly\r\n // return the caseReducer func and not wrap it with produce.\r\n const result = caseReducer(previousState as any, action)\r\n\r\n if (typeof result === 'undefined') {\r\n if (previousState === null) {\r\n return previousState\r\n }\r\n throw Error(\r\n 'A case reducer on a non-draftable value must not return undefined'\r\n )\r\n }\r\n\r\n return result as S\r\n } else {\r\n // @ts-ignore createNextState() produces an Immutable> rather\r\n // than an Immutable, and TypeScript cannot find out how to reconcile\r\n // these two types.\r\n return createNextState(previousState, (draft: Draft) => {\r\n return caseReducer(draft, action)\r\n })\r\n }\r\n }\r\n\r\n return previousState\r\n }, state)\r\n }\r\n}\r\n","import type { Action, AnyAction } from 'redux'\r\nimport type {\r\n CaseReducer,\r\n CaseReducers,\r\n ActionMatcher,\r\n ActionMatcherDescriptionCollection,\r\n} from './createReducer'\r\n\r\nexport interface TypedActionCreator {\r\n (...args: any[]): Action\r\n type: Type\r\n}\r\n\r\n/**\r\n * A builder for an action <-> reducer map.\r\n *\r\n * @public\r\n */\r\nexport interface ActionReducerMapBuilder {\r\n /**\r\n * Adds a case reducer to handle a single exact action type.\r\n * @remarks\r\n * All calls to `builder.addCase` must come before any calls to `builder.addMatcher` or `builder.addDefaultCase`.\r\n * @param actionCreator - Either a plain action type string, or an action creator generated by [`createAction`](./createAction) that can be used to determine the action type.\r\n * @param reducer - The actual case reducer function.\r\n */\r\n addCase>(\r\n actionCreator: ActionCreator,\r\n reducer: CaseReducer>\r\n ): ActionReducerMapBuilder\r\n /**\r\n * Adds a case reducer to handle a single exact action type.\r\n * @remarks\r\n * All calls to `builder.addCase` must come before any calls to `builder.addMatcher` or `builder.addDefaultCase`.\r\n * @param actionCreator - Either a plain action type string, or an action creator generated by [`createAction`](./createAction) that can be used to determine the action type.\r\n * @param reducer - The actual case reducer function.\r\n */\r\n addCase>(\r\n type: Type,\r\n reducer: CaseReducer\r\n ): ActionReducerMapBuilder\r\n\r\n /**\r\n * Allows you to match your incoming actions against your own filter function instead of only the `action.type` property.\r\n * @remarks\r\n * If multiple matcher reducers match, all of them will be executed in the order\r\n * they were defined in - even if a case reducer already matched.\r\n * All calls to `builder.addMatcher` must come after any calls to `builder.addCase` and before any calls to `builder.addDefaultCase`.\r\n * @param matcher - A matcher function. In TypeScript, this should be a [type predicate](https://www.typescriptlang.org/docs/handbook/advanced-types.html#using-type-predicates)\r\n * function\r\n * @param reducer - The actual case reducer function.\r\n *\r\n * @example\r\n```ts\r\nimport {\r\n createAction,\r\n createReducer,\r\n AsyncThunk,\r\n AnyAction,\r\n} from \"@reduxjs/toolkit\";\r\n\r\ntype GenericAsyncThunk = AsyncThunk;\r\n\r\ntype PendingAction = ReturnType;\r\ntype RejectedAction = ReturnType;\r\ntype FulfilledAction = ReturnType;\r\n\r\nconst initialState: Record = {};\r\nconst resetAction = createAction(\"reset-tracked-loading-state\");\r\n\r\nfunction isPendingAction(action: AnyAction): action is PendingAction {\r\n return action.type.endsWith(\"/pending\");\r\n}\r\n\r\nconst reducer = createReducer(initialState, (builder) => {\r\n builder\r\n .addCase(resetAction, () => initialState)\r\n // matcher can be defined outside as a type predicate function\r\n .addMatcher(isPendingAction, (state, action) => {\r\n state[action.meta.requestId] = \"pending\";\r\n })\r\n .addMatcher(\r\n // matcher can be defined inline as a type predicate function\r\n (action): action is RejectedAction => action.type.endsWith(\"/rejected\"),\r\n (state, action) => {\r\n state[action.meta.requestId] = \"rejected\";\r\n }\r\n )\r\n // matcher can just return boolean and the matcher can receive a generic argument\r\n .addMatcher(\r\n (action) => action.type.endsWith(\"/fulfilled\"),\r\n (state, action) => {\r\n state[action.meta.requestId] = \"fulfilled\";\r\n }\r\n );\r\n});\r\n```\r\n */\r\n addMatcher(\r\n matcher: ActionMatcher | ((action: AnyAction) => boolean),\r\n reducer: CaseReducer\r\n ): Omit, 'addCase'>\r\n\r\n /**\r\n * Adds a \"default case\" reducer that is executed if no case reducer and no matcher\r\n * reducer was executed for this action.\r\n * @param reducer - The fallback \"default case\" reducer function.\r\n *\r\n * @example\r\n```ts\r\nimport { createReducer } from '@reduxjs/toolkit'\r\nconst initialState = { otherActions: 0 }\r\nconst reducer = createReducer(initialState, builder => {\r\n builder\r\n // .addCase(...)\r\n // .addMatcher(...)\r\n .addDefaultCase((state, action) => {\r\n state.otherActions++\r\n })\r\n})\r\n```\r\n */\r\n addDefaultCase(reducer: CaseReducer): {}\r\n}\r\n\r\nexport function executeReducerBuilderCallback(\r\n builderCallback: (builder: ActionReducerMapBuilder) => void\r\n): [\r\n CaseReducers,\r\n ActionMatcherDescriptionCollection,\r\n CaseReducer | undefined\r\n] {\r\n const actionsMap: CaseReducers = {}\r\n const actionMatchers: ActionMatcherDescriptionCollection = []\r\n let defaultCaseReducer: CaseReducer | undefined\r\n const builder = {\r\n addCase(\r\n typeOrActionCreator: string | TypedActionCreator,\r\n reducer: CaseReducer\r\n ) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n /*\r\n to keep the definition by the user in line with actual behavior, \r\n we enforce `addCase` to always be called before calling `addMatcher`\r\n as matching cases take precedence over matchers\r\n */\r\n if (actionMatchers.length > 0) {\r\n throw new Error(\r\n '`builder.addCase` should only be called before calling `builder.addMatcher`'\r\n )\r\n }\r\n if (defaultCaseReducer) {\r\n throw new Error(\r\n '`builder.addCase` should only be called before calling `builder.addDefaultCase`'\r\n )\r\n }\r\n }\r\n const type =\r\n typeof typeOrActionCreator === 'string'\r\n ? typeOrActionCreator\r\n : typeOrActionCreator.type\r\n if (type in actionsMap) {\r\n throw new Error(\r\n 'addCase cannot be called with two reducers for the same action type'\r\n )\r\n }\r\n actionsMap[type] = reducer\r\n return builder\r\n },\r\n addMatcher(\r\n matcher: ActionMatcher,\r\n reducer: CaseReducer\r\n ) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (defaultCaseReducer) {\r\n throw new Error(\r\n '`builder.addMatcher` should only be called before calling `builder.addDefaultCase`'\r\n )\r\n }\r\n }\r\n actionMatchers.push({ matcher, reducer })\r\n return builder\r\n },\r\n addDefaultCase(reducer: CaseReducer) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n if (defaultCaseReducer) {\r\n throw new Error('`builder.addDefaultCase` can only be called once')\r\n }\r\n }\r\n defaultCaseReducer = reducer\r\n return builder\r\n },\r\n }\r\n builderCallback(builder)\r\n return [actionsMap, actionMatchers, defaultCaseReducer]\r\n}\r\n","import type { Reducer } from 'redux'\r\nimport type {\r\n ActionCreatorWithoutPayload,\r\n PayloadAction,\r\n PayloadActionCreator,\r\n PrepareAction,\r\n _ActionCreatorWithPreparedPayload,\r\n} from './createAction'\r\nimport { createAction } from './createAction'\r\nimport type { CaseReducer, CaseReducers } from './createReducer'\r\nimport { createReducer } from './createReducer'\r\nimport type { ActionReducerMapBuilder } from './mapBuilders'\r\nimport { executeReducerBuilderCallback } from './mapBuilders'\r\nimport type { NoInfer } from './tsHelpers'\r\n\r\n/**\r\n * An action creator attached to a slice.\r\n *\r\n * @deprecated please use PayloadActionCreator directly\r\n *\r\n * @public\r\n */\r\nexport type SliceActionCreator