diff --git a/package-lock.json b/package-lock.json index 28063531a6..5334478a7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,6 +47,7 @@ "jest": "^29.3.1", "jest-mock": "^29.3.1", "lerna": "^4.0.0", + "lodash": "^4.17.21", "npm-run-all": "^4.1.5", "path-browserify": "1.0.1", "prettier": "^2.3.2", @@ -176,9 +177,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", - "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -259,16 +260,16 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "@babel/compat-data": "^7.22.6", + "@babel/helper-validator-option": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" }, "engines": { "node": ">=6.9.0" @@ -277,15 +278,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", @@ -321,31 +313,31 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.10", - "@babel/types": "^7.20.7" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -361,12 +353,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -403,9 +395,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -2441,6 +2433,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@noble/hashes": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.0.tgz", @@ -4543,9 +4544,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "funding": [ { @@ -4555,13 +4556,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -4778,9 +4783,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001450", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", - "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==", + "version": "1.0.30001515", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz", + "integrity": "sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==", "dev": true, "funding": [ { @@ -4790,6 +4795,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -6017,9 +6026,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.288", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.288.tgz", - "integrity": "sha512-8s9aJf3YiokIrR+HOQzNOGmEHFXVUQzXM/JaViVvKdCkNUjS+lEa/uT7xw3nDVG/IgfxiIwUGkwJ6AR1pTpYsQ==", + "version": "1.4.456", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.456.tgz", + "integrity": "sha512-d+eSL4mT9m72cnDT/kfQj6Pv6Cid4pUVlLOl8esm2SZuXBgtXtUyvCfc9F++GHLWLoY4gMNqg+0IVAoQ3sosKA==", "dev": true }, "node_modules/elliptic": { @@ -10790,7 +10799,8 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "node_modules/lodash._reinterpolate": { "version": "3.0.0", @@ -11852,9 +11862,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/noms": { @@ -15659,9 +15669,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "funding": [ { @@ -15671,6 +15681,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -15678,7 +15692,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -16524,7 +16538,6 @@ "bip32": "^2.0.6", "bip39": "^3.0.4", "https-proxy-agent": "^5.0.0", - "lodash": "^4.17.4", "ripple-address-codec": "^4.3.1", "ripple-binary-codec": "^1.10.0", "ripple-keypairs": "^1.3.1", @@ -16542,6 +16555,7 @@ "karma-chrome-launcher": "^3.1.1", "karma-jasmine": "^5.1.0", "karma-webpack": "^5.0.0", + "lodash": "^4.17.4", "node-polyfill-webpack-plugin": "^2.0.1", "react": "^18.2.0", "typedoc": "0.25.0" @@ -16643,9 +16657,9 @@ } }, "@babel/compat-data": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", - "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", "dev": true }, "@babel/core": { @@ -16711,24 +16725,16 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", "dev": true, "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "@babel/compat-data": "^7.22.6", + "@babel/helper-validator-option": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" } }, "@babel/helper-environment-visitor": { @@ -16757,28 +16763,28 @@ } }, "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-transforms": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.10", - "@babel/types": "^7.20.7" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/helper-plugin-utils": { @@ -16788,12 +16794,12 @@ "dev": true }, "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "requires": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" } }, "@babel/helper-split-export-declaration": { @@ -16818,9 +16824,9 @@ "dev": true }, "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true }, "@babel/helpers": { @@ -18449,6 +18455,12 @@ } } }, + "@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "dev": true + }, "@noble/hashes": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.0.tgz", @@ -20177,15 +20189,15 @@ } }, "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" } }, "bs-logger": { @@ -20351,9 +20363,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001450", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", - "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==", + "version": "1.0.30001515", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz", + "integrity": "sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==", "dev": true }, "caseless": { @@ -21344,9 +21356,9 @@ } }, "electron-to-chromium": { - "version": "1.4.288", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.288.tgz", - "integrity": "sha512-8s9aJf3YiokIrR+HOQzNOGmEHFXVUQzXM/JaViVvKdCkNUjS+lEa/uT7xw3nDVG/IgfxiIwUGkwJ6AR1pTpYsQ==", + "version": "1.4.456", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.456.tgz", + "integrity": "sha512-d+eSL4mT9m72cnDT/kfQj6Pv6Cid4pUVlLOl8esm2SZuXBgtXtUyvCfc9F++GHLWLoY4gMNqg+0IVAoQ3sosKA==", "dev": true }, "elliptic": { @@ -25073,7 +25085,8 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "lodash._reinterpolate": { "version": "3.0.0", @@ -25939,9 +25952,9 @@ } }, "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "noms": { @@ -28847,9 +28860,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "requires": { "escalade": "^3.1.1", diff --git a/package.json b/package.json index 17072abbd6..ca774ccf6d 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "jest": "^29.3.1", "jest-mock": "^29.3.1", "lerna": "^4.0.0", + "lodash": "^4.17.21", "npm-run-all": "^4.1.5", "path-browserify": "1.0.1", "prettier": "^2.3.2", diff --git a/packages/xrpl/package.json b/packages/xrpl/package.json index ba49dfd8a9..c466b8d455 100644 --- a/packages/xrpl/package.json +++ b/packages/xrpl/package.json @@ -27,7 +27,6 @@ "bip32": "^2.0.6", "bip39": "^3.0.4", "https-proxy-agent": "^5.0.0", - "lodash": "^4.17.4", "ripple-address-codec": "^4.3.1", "ripple-binary-codec": "^1.10.0", "ripple-keypairs": "^1.3.1", @@ -45,6 +44,7 @@ "karma-chrome-launcher": "^3.1.1", "karma-jasmine": "^5.1.0", "karma-webpack": "^5.0.0", + "lodash": "^4.17.4", "node-polyfill-webpack-plugin": "^2.0.1", "react": "^18.2.0", "typedoc": "0.25.0" @@ -58,7 +58,7 @@ "build:lib": "tsc --build tsconfig.build.json", "build:web": "webpack", "build:browserTests": "webpack --config ./test/webpack.config.js", - "analyze": "run-s build:web --analyze", + "analyze": "webpack --analyze", "watch": "run-s build:lib --watch", "clean": "rm -rf dist build coverage", "docgen": "tsc --build tsconfig.docs.json && typedoc && echo js.xrpl.org >> ../../docs/CNAME", diff --git a/packages/xrpl/src/Wallet/index.ts b/packages/xrpl/src/Wallet/index.ts index 7eb0baaeb0..709f1bf1a9 100644 --- a/packages/xrpl/src/Wallet/index.ts +++ b/packages/xrpl/src/Wallet/index.ts @@ -1,7 +1,6 @@ import BigNumber from 'bignumber.js' import { fromSeed } from 'bip32' import { mnemonicToSeedSync, validateMnemonic } from 'bip39' -import omitBy from 'lodash/omitBy' import { classicAddressToXAddress, isValidXAddress, @@ -26,6 +25,7 @@ import ECDSA from '../ECDSA' import { ValidationError } from '../errors' import { Transaction, validate } from '../models/transactions' import { ensureClassicAddress } from '../sugar/utils' +import { omitBy } from '../utils/collections' import { hashSignedTx } from '../utils/hashes/hashLedger' import { rfc1751MnemonicToKey } from './rfc1751' diff --git a/packages/xrpl/src/Wallet/signer.ts b/packages/xrpl/src/Wallet/signer.ts index 2938c7b5d7..e179898a5e 100644 --- a/packages/xrpl/src/Wallet/signer.ts +++ b/packages/xrpl/src/Wallet/signer.ts @@ -1,5 +1,4 @@ import { BigNumber } from 'bignumber.js' -import { flatMap } from 'lodash' import { decodeAccountID } from 'ripple-address-codec' import { decode, @@ -128,10 +127,9 @@ function getTransactionWithAllSigners( transactions: Transaction[], ): Transaction { // Signers must be sorted in the combined transaction - See compareSigners' documentation for more details - const sortedSigners: Signer[] = flatMap( - transactions, - (tx) => tx.Signers ?? [], - ).sort(compareSigners) + const sortedSigners: Signer[] = transactions + .flatMap((tx) => tx.Signers ?? []) + .sort(compareSigners) return { ...transactions[0], Signers: sortedSigners } } diff --git a/packages/xrpl/src/client/connection.ts b/packages/xrpl/src/client/connection.ts index 8210039fb8..7577487752 100644 --- a/packages/xrpl/src/client/connection.ts +++ b/packages/xrpl/src/client/connection.ts @@ -2,7 +2,6 @@ import { EventEmitter } from 'events' import { Agent } from 'http' -import omitBy from 'lodash/omitBy' import WebSocket from 'ws' import { @@ -12,6 +11,7 @@ import { XrplError, } from '../errors' import { BaseRequest } from '../models/methods/baseMethod' +import { omitBy } from '../utils/collections' import ConnectionManager from './ConnectionManager' import ExponentialBackoff from './ExponentialBackoff' diff --git a/packages/xrpl/src/sugar/balances.ts b/packages/xrpl/src/sugar/balances.ts index f8fb2517b4..90ae141c40 100644 --- a/packages/xrpl/src/sugar/balances.ts +++ b/packages/xrpl/src/sugar/balances.ts @@ -1,5 +1,3 @@ -import flatMap from 'lodash/flatMap' - import type { Balance, Client } from '..' import { AccountLinesRequest, @@ -108,7 +106,7 @@ async function getBalances( // combine results await Promise.all([xrpPromise, linesPromise]).then( ([xrpBalance, linesResponses]) => { - const accountLinesBalance = flatMap(linesResponses, (response) => + const accountLinesBalance = linesResponses.flatMap((response) => formatBalances(response.result.lines), ) if (xrpBalance !== '') { diff --git a/packages/xrpl/src/sugar/getOrderbook.ts b/packages/xrpl/src/sugar/getOrderbook.ts index a1bc091bc4..82a7620932 100644 --- a/packages/xrpl/src/sugar/getOrderbook.ts +++ b/packages/xrpl/src/sugar/getOrderbook.ts @@ -1,6 +1,5 @@ /* eslint-disable max-lines-per-function -- Needs to process orderbooks. */ import BigNumber from 'bignumber.js' -import flatMap from 'lodash/flatMap' import type { Client } from '../client' import { ValidationError } from '../errors' @@ -10,6 +9,7 @@ import { BookOffer, BookOfferCurrency, BookOffersRequest, + BookOffersResponse, } from '../models/methods/bookOffers' const DEFAULT_LIMIT = 20 @@ -112,17 +112,18 @@ async function getOrderbook( taker: options.taker ? options.taker : undefined, } // 2. Make Request - const directOfferResults = await this.requestAll(request) + const directOfferResults: BookOffersResponse[] = await this.requestAll( + request, + ) request.taker_gets = currency1 request.taker_pays = currency2 const reverseOfferResults = await this.requestAll(request) // 3. Return Formatted Response - const directOffers = flatMap( - directOfferResults, - (directOfferResult) => directOfferResult.result.offers, + + const directOffers = directOfferResults.flatMap( + (directOfferResult: BookOffersResponse) => directOfferResult.result.offers, ) - const reverseOffers = flatMap( - reverseOfferResults, + const reverseOffers = reverseOfferResults.flatMap( (reverseOfferResult) => reverseOfferResult.result.offers, ) diff --git a/packages/xrpl/src/utils/collections.ts b/packages/xrpl/src/utils/collections.ts new file mode 100644 index 0000000000..1f8c99676e --- /dev/null +++ b/packages/xrpl/src/utils/collections.ts @@ -0,0 +1,52 @@ +type ValueOf = T[keyof T] + +/** + * Creates an object composed of keys generated from the results of running each element of collection thru iteratee. + * The order of grouped values is determined by the order they occur in collection. + * The corresponding value of each key is an array of elements responsible for generating the key. + * + * Similar to lodash's groupBy + * + * @param array - array to iterate over + * @param iteratee - function that returns key of the group to place the item + * + * @returns a map of arrays + */ +export function groupBy( + array: T[], + iteratee: (value: T, index: number, array: T[]) => string, +): { [p: string]: T[] } { + // eslint-disable-next-line max-params -- need all the params for the fallback + return array.reduce<{ [key: string]: T[] }>(function predicate( + acc, + value, + index, + arrayReference, + ) { + ;(acc[iteratee(value, index, arrayReference)] ||= []).push(value) + return acc + }, + {}) +} + +/** + * Creates an object composed of the own and inherited enumerable string keyed properties of object that + * predicate doesn't return truthy for. + * + * @param obj - Object to have properties removed. + * @param predicate - function that returns whether the property should be removed from the obj. + * + * @returns object + */ +export function omitBy( + obj: T, + predicate: (objElement: ValueOf, k: string | number | symbol) => boolean, +): Partial { + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- We know the keys are properties of T + const keys: Array = Object.keys(obj) as Array + const keysToKeep = keys.filter((kb) => !predicate(obj[kb], kb)) + return keysToKeep.reduce((acc: Partial, key: keyof T) => { + acc[key] = obj[key] + return acc + }, {}) +} diff --git a/packages/xrpl/src/utils/getBalanceChanges.ts b/packages/xrpl/src/utils/getBalanceChanges.ts index 826c1a94f3..596017b895 100644 --- a/packages/xrpl/src/utils/getBalanceChanges.ts +++ b/packages/xrpl/src/utils/getBalanceChanges.ts @@ -1,6 +1,4 @@ import BigNumber from 'bignumber.js' -import flatten from 'lodash/flatten' -import groupBy from 'lodash/groupBy' import { Amount, @@ -10,6 +8,7 @@ import { Node, } from '../models' +import { groupBy } from './collections' import { dropsToXrp } from './xrpConversion' interface BalanceChange { @@ -182,5 +181,5 @@ export default function getBalanceChanges( } return [] }) - return groupByAccount(flatten(quantities)) + return groupByAccount(quantities.flat()) } diff --git a/packages/xrpl/src/utils/getNFTokenID.ts b/packages/xrpl/src/utils/getNFTokenID.ts index c113707a6b..f36c7357a7 100644 --- a/packages/xrpl/src/utils/getNFTokenID.ts +++ b/packages/xrpl/src/utils/getNFTokenID.ts @@ -1,4 +1,3 @@ -import flatMap from 'lodash/flatMap' import { decode } from 'ripple-binary-codec' import { NFToken } from '../models/ledger/NFTokenPage' @@ -33,6 +32,7 @@ function ensureDecodedMeta( * @returns The NFTokenID for the minted NFT. * @throws if meta is not TransactionMetadata. */ +// eslint-disable-next-line max-lines-per-function -- This function has a lot of documentation export default function getNFTokenID( meta: TransactionMetadata | string | undefined, ): string | undefined { @@ -57,7 +57,6 @@ export default function getNFTokenID( * not changed. Thus why we add the additional condition to check * if the PreviousFields contains NFTokens */ - const affectedNodes = decodedMeta.AffectedNodes.filter((node) => { if (isCreatedNode(node)) { return node.CreatedNode.LedgerEntryType === 'NFTokenPage' @@ -72,25 +71,28 @@ export default function getNFTokenID( }) /* eslint-disable @typescript-eslint/consistent-type-assertions -- Necessary for parsing metadata */ const previousTokenIDSet = new Set( - flatMap(affectedNodes, (node) => { - const nftokens = isModifiedNode(node) - ? (node.ModifiedNode.PreviousFields?.NFTokens as NFToken[]) - : [] - return nftokens.map((token) => token.NFToken.NFTokenID) - }).filter((id) => Boolean(id)), + affectedNodes + .flatMap((node) => { + const nftokens = isModifiedNode(node) + ? (node.ModifiedNode.PreviousFields?.NFTokens as NFToken[]) + : [] + return nftokens.map((token) => token.NFToken.NFTokenID) + }) + .filter((id) => Boolean(id)), ) /* eslint-disable @typescript-eslint/no-unnecessary-condition -- Cleaner to read */ - const finalTokenIDs = flatMap(affectedNodes, (node) => - ( - (((node as ModifiedNode).ModifiedNode?.FinalFields?.NFTokens ?? - (node as CreatedNode).CreatedNode?.NewFields?.NFTokens) as NFToken[]) ?? - [] - ).map((token) => token.NFToken.NFTokenID), - ).filter((nftokenID) => Boolean(nftokenID)) + const finalTokenIDs = affectedNodes + .flatMap((node) => + ( + (((node as ModifiedNode).ModifiedNode?.FinalFields?.NFTokens ?? + (node as CreatedNode).CreatedNode?.NewFields + ?.NFTokens) as NFToken[]) ?? [] + ).map((token) => token.NFToken.NFTokenID), + ) + .filter((nftokenID) => Boolean(nftokenID)) /* eslint-enable @typescript-eslint/consistent-type-assertions -- Necessary for parsing metadata */ /* eslint-enable @typescript-eslint/no-unnecessary-condition -- Cleaner to read */ - const nftokenID = finalTokenIDs.find((id) => !previousTokenIDSet.has(id)) return nftokenID diff --git a/packages/xrpl/tsconfig.json b/packages/xrpl/tsconfig.json index a906155d36..d1c0ec8fb1 100644 --- a/packages/xrpl/tsconfig.json +++ b/packages/xrpl/tsconfig.json @@ -3,6 +3,7 @@ "compilerOptions": { "pretty": true, "target": "es6", + "lib": ["es2019", "dom"], "outDir": "./dist/npm", "declaration": true, "declarationMap": true, diff --git a/tsconfig.json b/tsconfig.json index 414843606a..aa58f912e2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,7 @@ "compilerOptions": { "composite": true, "module": "commonjs", + "lib": ["es2019", "dom"], "moduleResolution": "node", "esModuleInterop": true, "sourceMap": true,