From 268b6d1bd01e0315e82659eaa94965af46769e82 Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Tue, 6 Feb 2024 11:10:55 +0000 Subject: [PATCH 01/20] chore(wallet-mobile): added mmkv pkg --- apps/wallet-mobile/ios/Podfile.lock | 14 ++++++++++++++ apps/wallet-mobile/package.json | 1 + yarn.lock | 5 +++++ 3 files changed, 20 insertions(+) diff --git a/apps/wallet-mobile/ios/Podfile.lock b/apps/wallet-mobile/ios/Podfile.lock index c8ecaa4269..f07e4c995c 100644 --- a/apps/wallet-mobile/ios/Podfile.lock +++ b/apps/wallet-mobile/ios/Podfile.lock @@ -109,6 +109,9 @@ PODS: - hermes-engine/Pre-built (= 0.71.14) - hermes-engine/Pre-built (0.71.14) - libevent (2.1.12) + - MMKV (1.3.3): + - MMKVCore (~> 1.3.3) + - MMKVCore (1.3.3) - MultiplatformBleAdapter (0.1.9) - OpenSSL-Universal (1.1.1100) - Permission-BluetoothPeripheral (3.8.4): @@ -385,6 +388,9 @@ PODS: - React-Core - react-native-haskell-shelley (6.0.0-alpha.2): - React + - react-native-mmkv (2.11.0): + - MMKV (>= 1.2.13) + - React-Core - react-native-pager-view (6.2.0): - React-Core - react-native-quick-base64 (2.0.6): @@ -624,6 +630,7 @@ DEPENDENCIES: - react-native-ble-plx (from `../../../node_modules/react-native-ble-plx`) - react-native-config (from `../../../node_modules/react-native-config`) - "react-native-haskell-shelley (from `../../../node_modules/@emurgo/csl-mobile-bridge`)" + - react-native-mmkv (from `../../../node_modules/react-native-mmkv`) - react-native-pager-view (from `../../../node_modules/react-native-pager-view`) - react-native-quick-base64 (from `../../../node_modules/react-native-quick-base64`) - react-native-randombytes (from `../../../node_modules/react-native-randombytes`) @@ -675,6 +682,8 @@ SPEC REPOS: - FlipperKit - fmt - libevent + - MMKV + - MMKVCore - MultiplatformBleAdapter - OpenSSL-Universal - Sentry @@ -770,6 +779,8 @@ EXTERNAL SOURCES: :path: "../../../node_modules/react-native-config" react-native-haskell-shelley: :path: "../../../node_modules/@emurgo/csl-mobile-bridge" + react-native-mmkv: + :path: "../../../node_modules/react-native-mmkv" react-native-pager-view: :path: "../../../node_modules/react-native-pager-view" react-native-quick-base64: @@ -875,6 +886,8 @@ SPEC CHECKSUMS: glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b hermes-engine: d7cc127932c89c53374452d6f93473f1970d8e88 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 + MMKV: f902fb6719da13c2ab0965233d8963a59416f911 + MMKVCore: d26e4d3edd5cb8588c2569222cbd8be4231374e9 MultiplatformBleAdapter: 5a6a897b006764392f9cef785e4360f54fb9477d OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c Permission-BluetoothPeripheral: 2b88a131074edafd8a46a5cda4ba610ec986d2fb @@ -901,6 +914,7 @@ SPEC CHECKSUMS: react-native-ble-plx: f10240444452dfb2d2a13a0e4f58d7783e92d76e react-native-config: 86038147314e2e6d10ea9972022aa171e6b1d4d8 react-native-haskell-shelley: c01783e1181b8fc1fea715a288801056d70afc07 + react-native-mmkv: e97c0c79403fb94577e5d902ab1ebd42b0715b43 react-native-pager-view: 0ccb8bf60e2ebd38b1f3669fa3650ecce81db2df react-native-quick-base64: 62290829c619fbabca4c41cfec75ae759d08fc1c react-native-randombytes: b6677f7d495c27e9ee0dbd77ebc97b3c59173729 diff --git a/apps/wallet-mobile/package.json b/apps/wallet-mobile/package.json index 17d1d77b07..f40b1729c7 100644 --- a/apps/wallet-mobile/package.json +++ b/apps/wallet-mobile/package.json @@ -165,6 +165,7 @@ "react-native-linear-gradient": "2.5.6", "react-native-localize": "^3.0.2", "react-native-markdown-display": "^7.0.0-alpha.2", + "react-native-mmkv": "^2.11.0", "react-native-pager-view": "^6.2.0", "react-native-paper": "^4.12.0", "react-native-permissions": "^3.8.0", diff --git a/yarn.lock b/yarn.lock index 04202611cc..9d21f73e35 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20089,6 +20089,11 @@ react-native-markdown-display@^7.0.0-alpha.2: prop-types "^15.7.2" react-native-fit-image "^1.5.5" +react-native-mmkv@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/react-native-mmkv/-/react-native-mmkv-2.11.0.tgz#51b9985f6a5c09fe9c16d8c1861cc2901856ace1" + integrity sha512-28PdUHjZJmAw3q+8zJDAAdohnZMpDC7WgRUJxACOMkcmJeqS3u5cKS/lSq2bhf1CvaeIiHYHUWiyatUjMRCDQQ== + react-native-modal-datetime-picker@^14.0.0: version "14.0.1" resolved "https://registry.yarnpkg.com/react-native-modal-datetime-picker/-/react-native-modal-datetime-picker-14.0.1.tgz#d9c6df4ff85bf1cfbe108c756dc26dcca4cc5f2f" From 4ee6b3ba270e8b23380b1a4ea93b3e695062fd6f Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Wed, 7 Feb 2024 13:53:59 +0000 Subject: [PATCH 02/20] fix(staking): missing @yoroi/common dep --- packages/staking/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/staking/package.json b/packages/staking/package.json index c0854e70e0..f5e3713997 100644 --- a/packages/staking/package.json +++ b/packages/staking/package.json @@ -130,6 +130,7 @@ }, "dependencies": { "@emurgo/cip14-js": "^3.0.1", + "@yoroi/common": "1.5.1", "bech32": "^2.0.0", "bip39": "^3.1.0", "immer": "^10.0.2" From 69668330cb1f6e1c9e2c44cc28ce64bd964224eb Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Wed, 7 Feb 2024 13:54:38 +0000 Subject: [PATCH 03/20] fix(root): ignore e2e while rebuilding pkgs --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 85e90e35f4..36d6336fc9 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "wallet-mobile:start": "cd apps/wallet-mobile && yarn start", "wallet-mobile:reset": "cd apps/wallet-mobile && yarn reset && cd ../..", "watch": "chokidar \"packages/*/src/**/*\" -c \"yarn build:changed\"", - "build:changed": "lerna run build --since --ignore @yoroi/wallet-mobile" + "build:changed": "lerna run build --since --ignore @yoroi/wallet-mobile --ignore @yoroi/e2e-wallet-mobile" }, "devDependencies": { "concurrently": "^8.2.0", From f195fdc85822daaadb1cc2cd1ae6176c24a0f339 Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Wed, 7 Feb 2024 13:55:22 +0000 Subject: [PATCH 04/20] chore(types): added MaybePromise helper type --- packages/types/src/helpers/types.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/types/src/helpers/types.ts b/packages/types/src/helpers/types.ts index d38225cbc3..7b4ea85139 100644 --- a/packages/types/src/helpers/types.ts +++ b/packages/types/src/helpers/types.ts @@ -17,3 +17,7 @@ export type Right = { } export type Either = Left | Right + +export type MaybePromise = IsAsync extends true + ? Promise + : T From 4b5d0087b2f2b3b27664434e2845c55cf1b5abff Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Thu, 8 Feb 2024 13:47:10 +0000 Subject: [PATCH 05/20] chore: drop @types/react-native + added mmkv peer dep --- apps/wallet-mobile/package.json | 1 - packages/api/package.json | 1 - packages/banxa/package.json | 1 - packages/common/package.json | 3 +- packages/links/package.json | 1 - packages/staking/package.json | 1 - packages/swap/package.json | 1 - packages/theme/package.json | 1 - yarn.lock | 424 +------------------------------- 9 files changed, 9 insertions(+), 425 deletions(-) diff --git a/apps/wallet-mobile/package.json b/apps/wallet-mobile/package.json index f40b1729c7..cf1a0b5678 100644 --- a/apps/wallet-mobile/package.json +++ b/apps/wallet-mobile/package.json @@ -234,7 +234,6 @@ "@types/mocha": "^10.0.0", "@types/node": "^16.18.27", "@types/react": "18.2.0", - "@types/react-native": "0.71.6", "@types/react-native-background-timer": "^2.0.0", "@types/react-test-renderer": "^18.0.0", "@types/tinycolor2": "^1.4.6", diff --git a/packages/api/package.json b/packages/api/package.json index 34b4cce8fb..e1295231e5 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -148,7 +148,6 @@ "@testing-library/react-native": "^12.3.0", "@types/jest": "^28.1.2", "@types/react": "18.2.0", - "@types/react-native": "0.71.6", "@yoroi/types": "1.5.2", "axios-mock-adapter": "^1.21.5", "commitlint": "^17.0.2", diff --git a/packages/banxa/package.json b/packages/banxa/package.json index 3ff81646f8..b2b163d987 100644 --- a/packages/banxa/package.json +++ b/packages/banxa/package.json @@ -143,7 +143,6 @@ "@testing-library/react-hooks": "^8.0.1", "@types/jest": "^28.1.2", "@types/react": "18.2.0", - "@types/react-native": "0.71.6", "commitlint": "^17.0.2", "del-cli": "^5.0.0", "dependency-cruiser": "^13.1.1", diff --git a/packages/common/package.json b/packages/common/package.json index bed65bd250..0c88e525ba 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -146,7 +146,6 @@ "@testing-library/react-native": "^12.3.0", "@types/jest": "^28.1.2", "@types/react": "18.2.0", - "@types/react-native": "0.71.6", "@yoroi/types": "1.5.2", "axios-mock-adapter": "^1.21.5", "commitlint": "^17.0.2", @@ -163,6 +162,7 @@ "react": "18.2.0", "react-native": "~0.71.0", "react-native-builder-bob": "^0.20.4", + "react-native-mmkv": "^2.11.0", "react-query": "^3.39.3", "react-test-renderer": "^18.2.0", "release-it": "^15.0.0", @@ -171,6 +171,7 @@ "peerDependencies": { "@react-native-async-storage/async-storage": ">= 1.19.3 <= 1.20.0", "react": ">= 16.8.0 <= 19.0.0", + "react-native-mmkv": "^2.11.0", "react-query": "^3.39.3" }, "packageManager": "yarn@1.22.21", diff --git a/packages/links/package.json b/packages/links/package.json index 9bde8ab934..1621a838b4 100644 --- a/packages/links/package.json +++ b/packages/links/package.json @@ -147,7 +147,6 @@ "@testing-library/react-native": "^12.3.0", "@types/jest": "^28.1.2", "@types/react": "18.2.0", - "@types/react-native": "0.71.6", "@yoroi/types": "1.5.2", "commitlint": "^17.0.2", "del-cli": "^5.0.0", diff --git a/packages/staking/package.json b/packages/staking/package.json index f5e3713997..ffff4f78db 100644 --- a/packages/staking/package.json +++ b/packages/staking/package.json @@ -147,7 +147,6 @@ "@types/blake2b": "^2.1.3", "@types/jest": "^28.1.2", "@types/react": "18.2.0", - "@types/react-native": "0.71.6", "@yoroi/types": "1.5.2", "axios-mock-adapter": "^1.21.5", "commitlint": "^17.0.2", diff --git a/packages/swap/package.json b/packages/swap/package.json index 69e0fffdf7..ad3d466684 100644 --- a/packages/swap/package.json +++ b/packages/swap/package.json @@ -148,7 +148,6 @@ "@testing-library/react-native": "^12.3.0", "@types/jest": "^28.1.2", "@types/react": "18.2.0", - "@types/react-native": "0.71.6", "@yoroi/types": "1.5.2", "commitlint": "^17.0.2", "del-cli": "^5.0.0", diff --git a/packages/theme/package.json b/packages/theme/package.json index 9017d93fba..cd4ba1fcc1 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -143,7 +143,6 @@ "@types/blake2b": "^2.1.3", "@types/jest": "^28.1.2", "@types/react": "18.2.0", - "@types/react-native": "0.71.6", "@yoroi/types": "^1.5.0", "axios-mock-adapter": "^1.21.5", "commitlint": "^17.0.2", diff --git a/yarn.lock b/yarn.lock index 9d21f73e35..afa2fb737b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2768,116 +2768,6 @@ bignumber.js "^9.0.1" easy-crc "1.1.0" -"@esbuild/android-arm64@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.12.tgz#d2b7408f2d2fe6ad93877d90ebb18e0d2648828c" - integrity sha512-BMAlczRqC/LUt2P97E4apTBbkvS9JTJnp2DKFbCwpZ8vBvXVbNdqmvzW/OsdtI/+mGr+apkkpqGM8WecLkPgrA== - -"@esbuild/android-arm@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.12.tgz#b91c893170ef45b3a094795b5a44ee519c23aed6" - integrity sha512-LIxaNIQfkFZbTLb4+cX7dozHlAbAshhFE5PKdro0l+FnCpx1GDJaQ2WMcqm+ToXKMt8p8Uojk/MFRuGyz3V5Sw== - -"@esbuild/android-x64@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.12.tgz#26c97fa3e70adeab859dc08a6814c0502d3d8e16" - integrity sha512-zU5MyluNsykf5cOJ0LZZZjgAHbhPJ1cWfdH1ZXVMXxVMhEV0VZiZXQdwBBVvmvbF28EizeK7obG9fs+fpmS0eQ== - -"@esbuild/darwin-arm64@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.12.tgz#c2e54e9b5d340d1d1719edf786b905399e0dfd44" - integrity sha512-zUZMep7YONnp6954QOOwEBwFX9svlKd3ov6PkxKd53LGTHsp/gy7vHaPGhhjBmEpqXEXShi6dddjIkmd+NgMsA== - -"@esbuild/darwin-x64@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.12.tgz#1029cfbd5fe22e5426470dee63511b33eeeb8127" - integrity sha512-ohqLPc7i67yunArPj1+/FeeJ7AgwAjHqKZ512ADk3WsE3FHU9l+m5aa7NdxXr0HmN1bjDlUslBjWNbFlD9y12Q== - -"@esbuild/freebsd-arm64@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.12.tgz#613e261c2af436c5c88df77ebcf8ba9f5da49fa8" - integrity sha512-GIIHtQXqgeOOqdG16a/A9N28GpkvjJnjYMhOnXVbn3EDJcoItdR58v/pGN31CHjyXDc8uCcRnFWmqaJt24AYJg== - -"@esbuild/freebsd-x64@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.12.tgz#367ebe738a43caced16564a4d2f05d24880b767c" - integrity sha512-zK0b9a1/0wZY+6FdOS3BpZcPc1kcx2G5yxxfEJtEUzVxI6n/FrC2Phsxj/YblPuBchhBZ/1wwn7AyEBUyNSa6g== - -"@esbuild/linux-arm64@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.12.tgz#6ba110e496fa83de5e955f66f7e92a576b03e950" - integrity sha512-JKgG8Q/LL/9sw/iHHxQyVMoQYu3rU3+a5Z87DxC+wAu3engz+EmctIrV+FGOgI6gWG1z1+5nDDbXiRMGQZXqiw== - -"@esbuild/linux-arm@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.12.tgz#21688a452c82c1422eb7f7fee80fc649bef40fb8" - integrity sha512-y75OijvrBE/1XRrXq1jtrJfG26eHeMoqLJ2dwQNwviwTuTtHGCojsDO6BJNF8gU+3jTn1KzJEMETytwsFSvc+Q== - -"@esbuild/linux-ia32@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.12.tgz#78f0ae5068251831db012fb2dcdee6c37a54a92e" - integrity sha512-yoRIAqc0B4lDIAAEFEIu9ttTRFV84iuAl0KNCN6MhKLxNPfzwCBvEMgwco2f71GxmpBcTtn7KdErueZaM2rEvw== - -"@esbuild/linux-loong64@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.12.tgz#6b33d8904be562f77587857d87d781264319a6ea" - integrity sha512-qYgt3dHPVvf/MgbIBpJ4Sup/yb9DAopZ3a2JgMpNKIHUpOdnJ2eHBo/aQdnd8dJ21X/+sS58wxHtA9lEazYtXQ== - -"@esbuild/linux-mips64el@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.12.tgz#2313a1b0528ebe24d1c5eab010e0e2427b54ca24" - integrity sha512-wHphlMLK4ufNOONqukELfVIbnGQJrHJ/mxZMMrP2jYrPgCRZhOtf0kC4yAXBwnfmULimV1qt5UJJOw4Kh13Yfg== - -"@esbuild/linux-ppc64@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.12.tgz#38d0d25174e5307c443884e5723887e7dada49f1" - integrity sha512-TeN//1Ft20ZZW41+zDSdOI/Os1bEq5dbvBvYkberB7PHABbRcsteeoNVZFlI0YLpGdlBqohEpjrn06kv8heCJg== - -"@esbuild/linux-riscv64@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.12.tgz#79a28320967911ff31a88b39353cc2ad151d3696" - integrity sha512-AgUebVS4DoAblBgiB2ACQ/8l4eGE5aWBb8ZXtkXHiET9mbj7GuWt3OnsIW/zX+XHJt2RYJZctbQ2S/mDjbp0UA== - -"@esbuild/linux-s390x@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.12.tgz#48db270c54e8d32110e0aa63f8a87d2485fb6cdf" - integrity sha512-dJ3Rb3Ei2u/ysSXd6pzleGtfDdc2MuzKt8qc6ls8vreP1G3B7HInX3i7gXS4BGeVd24pp0yqyS7bJ5NHaI9ing== - -"@esbuild/linux-x64@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz#05d9b4af808faf5fcd79b565f186ff86aa31b5b1" - integrity sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ== - -"@esbuild/netbsd-x64@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.12.tgz#8e027526e556c3e909b55bb3b1839013ff9d9786" - integrity sha512-55FzVCAiwE9FK8wWeCRuvjazNRJ1QqLCYGZVB6E8RuQuTeStSwotpSW4xoRGwp3a1wUsaVCdYcj5LGCASVJmMg== - -"@esbuild/openbsd-x64@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.12.tgz#81f5141b50987e05967b05d0ca6271fbb2f57532" - integrity sha512-qnluf8rfb6Y5Lw2tirfK2quZOBbVqmwxut7GPCIJsM8lc4AEUj9L8y0YPdLaPK0TECt4IdyBdBD/KRFKorlK3g== - -"@esbuild/sunos-x64@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.12.tgz#4d91cf84062dd0db5e9f8484dcaaff6443557839" - integrity sha512-+RkKpVQR7bICjTOPUpkTBTaJ4TFqQBX5Ywyd/HSdDkQGn65VPkTsR/pL4AMvuMWy+wnXgIl4EY6q4mVpJal8Kg== - -"@esbuild/win32-arm64@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.12.tgz#cdb85b318a92ce7ee7736f7c29cde2f5c687957e" - integrity sha512-GNHuciv0mFM7ouzsU0+AwY+7eV4Mgo5WnbhfDCQGtpvOtD1vbOiRjPYG6dhmMoFyBjj+pNqQu2X+7DKn0KQ/Gw== - -"@esbuild/win32-ia32@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.12.tgz#cd9d6860992aae3f039bec40ce8fac92ffac8911" - integrity sha512-kR8cezhYipbbypGkaqCTWIeu4zID17gamC8YTPXYtcN3E5BhhtTnwKBn9I0PJur/T6UVwIEGYzkffNL0lFvxEw== - -"@esbuild/win32-x64@0.18.12": - version "0.18.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.12.tgz#1da26735ce5954bf914f8f2117b5096c548bbba2" - integrity sha512-O0UYQVkvfM/jO8a4OwoV0mAKSJw+mjWTAd1MJd/1FCX6uiMdLmMRPK/w6e9OQ0ob2WGxzIm9va/KG0Ja4zIOgg== - "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -6359,14 +6249,7 @@ "@types/node" "*" base-x "^3.0.6" -"@types/chai-subset@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@types/chai-subset/-/chai-subset-1.3.3.tgz#97893814e92abd2c534de422cb377e0e0bdaac94" - integrity sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw== - dependencies: - "@types/chai" "*" - -"@types/chai@*", "@types/chai@^4.3.4", "@types/chai@^4.3.5": +"@types/chai@*", "@types/chai@^4.3.4": version "4.3.5" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b" integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== @@ -6616,13 +6499,6 @@ resolved "https://registry.yarnpkg.com/@types/react-native-background-timer/-/react-native-background-timer-2.0.0.tgz#c44c57f8fbca9d9d5521fdd72a8f55232b79381e" integrity sha512-y5VW82dL/ESOLg+5QQHyBdsFVA4ZklENxmOyxv8o06T+3HBG2JOSuz/CIPz1vKdB7dmWDGPZNuPosdtnp+xv2A== -"@types/react-native@0.71.6": - version "0.71.6" - resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.71.6.tgz#bf0fc6a69bf0c2933c089dfb19fc182b09cb7790" - integrity sha512-eCqEZ+GhW9L9o6yVoPqCCAq8Sbd6liaKlh6WviD0X7O035NEe7VQ+q9KXYL+mhyZrLI5sbX7f3G973gG6fuiyQ== - dependencies: - "@types/react" "*" - "@types/react-test-renderer@^18.0.0": version "18.0.0" resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-18.0.0.tgz#7b7f69ca98821ea5501b21ba24ea7b6139da2243" @@ -6961,50 +6837,6 @@ "@urql/core" ">=2.3.1" wonka "^4.0.14" -"@vitest/expect@0.31.1": - version "0.31.1" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-0.31.1.tgz#db8cb5a14a91167b948f377b9d29442229c73747" - integrity sha512-BV1LyNvhnX+eNYzJxlHIGPWZpwJFZaCcOIzp2CNG0P+bbetenTupk6EO0LANm4QFt0TTit+yqx7Rxd1qxi/SQA== - dependencies: - "@vitest/spy" "0.31.1" - "@vitest/utils" "0.31.1" - chai "^4.3.7" - -"@vitest/runner@0.31.1": - version "0.31.1" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-0.31.1.tgz#fc06260d4824dde624abaeea1825d6a75bad4583" - integrity sha512-imWuc82ngOtxdCUpXwtEzZIuc1KMr+VlQ3Ondph45VhWoQWit5yvG/fFcldbnCi8DUuFi+NmNx5ehMUw/cGLUw== - dependencies: - "@vitest/utils" "0.31.1" - concordance "^5.0.4" - p-limit "^4.0.0" - pathe "^1.1.0" - -"@vitest/snapshot@0.31.1": - version "0.31.1" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-0.31.1.tgz#7fc3f1e48f0c4313e6cb795c17a2c1aa909a7d64" - integrity sha512-L3w5uU9bMe6asrNzJ8WZzN+jUTX4KSgCinEJPXyny0o90fG4FPQMV0OWsq7vrCWfQlAilMjDnOF9nP8lidsJ+g== - dependencies: - magic-string "^0.30.0" - pathe "^1.1.0" - pretty-format "^27.5.1" - -"@vitest/spy@0.31.1": - version "0.31.1" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-0.31.1.tgz#1c3b6a3eec4ce81b8889e19c7fac6a603b600b14" - integrity sha512-1cTpt2m9mdo3hRLDyCG2hDQvRrePTDgEJBFQQNz1ydHHZy03EiA6EpFxY+7ODaY7vMRCie+WlFZBZ0/dQWyssQ== - dependencies: - tinyspy "^2.1.0" - -"@vitest/utils@0.31.1": - version "0.31.1" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-0.31.1.tgz#b810a458b37ef16931ab0d384ce79a9500f34e07" - integrity sha512-yFyRD5ilwojsZfo3E0BnH72pSVSuLg2356cN1tCEe/0RtDzxTPYwOomIC+eQbot7m6DRy4tPZw+09mB7NkbMmA== - dependencies: - concordance "^5.0.4" - loupe "^2.3.6" - pretty-format "^27.5.1" - "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -8858,11 +8690,6 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cac@^6.7.14: - version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" - integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== - cacache@^12.0.2: version "12.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" @@ -9721,20 +9548,6 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" -concordance@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.4.tgz#9896073261adced72f88d60e4d56f8efc4bbbbd2" - integrity sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw== - dependencies: - date-time "^3.1.0" - esutils "^2.0.3" - fast-diff "^1.2.0" - js-string-escape "^1.0.1" - lodash "^4.17.15" - md5-hex "^3.0.1" - semver "^7.3.2" - well-known-symbols "^2.0.0" - concurrently@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.2.0.tgz#cdc9f621a4d913366600355d68254df2c5e782f3" @@ -10443,13 +10256,6 @@ date-fns@^2.30.0: dependencies: "@babel/runtime" "^7.21.0" -date-time@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/date-time/-/date-time-3.1.0.tgz#0d1e934d170579f481ed8df1e2b8ff70ee845e1e" - integrity sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg== - dependencies: - time-zone "^1.0.0" - dateformat@^3.0.0, dateformat@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" @@ -11403,34 +11209,6 @@ es6-symbol@3.1.3, es6-symbol@^3.1.1, es6-symbol@^3.1.3: d "^1.0.1" ext "^1.1.2" -esbuild@^0.18.10: - version "0.18.12" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.12.tgz#861d37cc321ac797d059f221d9da12acfe555350" - integrity sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg== - optionalDependencies: - "@esbuild/android-arm" "0.18.12" - "@esbuild/android-arm64" "0.18.12" - "@esbuild/android-x64" "0.18.12" - "@esbuild/darwin-arm64" "0.18.12" - "@esbuild/darwin-x64" "0.18.12" - "@esbuild/freebsd-arm64" "0.18.12" - "@esbuild/freebsd-x64" "0.18.12" - "@esbuild/linux-arm" "0.18.12" - "@esbuild/linux-arm64" "0.18.12" - "@esbuild/linux-ia32" "0.18.12" - "@esbuild/linux-loong64" "0.18.12" - "@esbuild/linux-mips64el" "0.18.12" - "@esbuild/linux-ppc64" "0.18.12" - "@esbuild/linux-riscv64" "0.18.12" - "@esbuild/linux-s390x" "0.18.12" - "@esbuild/linux-x64" "0.18.12" - "@esbuild/netbsd-x64" "0.18.12" - "@esbuild/openbsd-x64" "0.18.12" - "@esbuild/sunos-x64" "0.18.12" - "@esbuild/win32-arm64" "0.18.12" - "@esbuild/win32-ia32" "0.18.12" - "@esbuild/win32-x64" "0.18.12" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -11873,7 +11651,7 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== -esutils@^2.0.2, esutils@^2.0.3: +esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== @@ -12324,7 +12102,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.1.1, fast-diff@^1.1.2, fast-diff@^1.2.0: +fast-diff@^1.1.1, fast-diff@^1.1.2: version "1.3.0" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== @@ -15951,11 +15729,6 @@ 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 sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg== - "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" @@ -16119,7 +15892,7 @@ json5@^1.0.1, json5@^1.0.2: dependencies: minimist "^1.2.0" -jsonc-parser@3.2.0, jsonc-parser@^3.2.0: +jsonc-parser@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== @@ -16480,11 +16253,6 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -local-pkg@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" - integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== - localforage@^1.8.1: version "1.10.0" resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" @@ -16698,7 +16466,7 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -loupe@^2.3.1, loupe@^2.3.6: +loupe@^2.3.1: version "2.3.6" resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== @@ -16877,13 +16645,6 @@ md5-file@^3.2.3: dependencies: buffer-alloc "^1.1.0" -md5-hex@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-3.0.1.tgz#be3741b510591434b2784d79e556eefc2c9a8e5c" - integrity sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw== - dependencies: - blueimp-md5 "^2.10.0" - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -17689,16 +17450,6 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mlly@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.4.0.tgz#830c10d63f1f97bd8785377b24dc2a15d972832b" - integrity sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg== - dependencies: - acorn "^8.9.0" - pathe "^1.1.1" - pkg-types "^1.0.3" - ufo "^1.1.2" - mocha@^10.0.0: version "10.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" @@ -17847,7 +17598,7 @@ nanoid@3.3.3: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== -nanoid@^3.1.23, nanoid@^3.3.1, nanoid@^3.3.6: +nanoid@^3.1.23, nanoid@^3.3.1: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== @@ -18717,13 +18468,6 @@ p-limit@^3.0.2, p-limit@^3.1.0: dependencies: yocto-queue "^0.1.0" -p-limit@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" - integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== - dependencies: - yocto-queue "^1.0.0" - p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -19080,11 +18824,6 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pathe@^1.1.0, pathe@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a" - integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== - pathval@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" @@ -19191,15 +18930,6 @@ pkg-dir@^5.0.0: dependencies: find-up "^5.0.0" -pkg-types@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868" - integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A== - dependencies: - jsonc-parser "^3.2.0" - mlly "^1.2.0" - pathe "^1.1.0" - pkg-up@^3.0.1, pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" @@ -19314,15 +19044,6 @@ postcss-value-parser@^4.0.2: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.25: - version "8.4.25" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.25.tgz#4a133f5e379eda7f61e906c3b1aaa9b81292726f" - integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - prebuild-install@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" @@ -19391,7 +19112,7 @@ pretty-format@^26.5.2, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: +pretty-format@^27.0.0, pretty-format@^27.0.2: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== @@ -20988,13 +20709,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rollup@^3.25.2: - version "3.26.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.26.2.tgz#2e76a37606cb523fc9fef43e6f59c93f86d95e7c" - integrity sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA== - optionalDependencies: - fsevents "~2.3.2" - run-applescript@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" @@ -21426,11 +21140,6 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -siginfo@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" - integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== - signal-exit@3.0.7, signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -21669,11 +21378,6 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -21823,11 +21527,6 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" -stackback@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" - integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== - stackframe@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" @@ -21858,11 +21557,6 @@ statuses@~1.5.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -std-env@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.3.3.tgz#a54f06eb245fdcfef53d56f3c0251f1d5c3d01fe" - integrity sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg== - stdin-discarder@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.1.0.tgz#22b3e400393a8e28ebf53f9958f3880622efde21" @@ -22191,13 +21885,6 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strip-literal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.0.1.tgz#0115a332710c849b4e46497891fb8d585e404bd2" - integrity sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q== - dependencies: - acorn "^8.8.2" - strnum@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" @@ -22564,11 +22251,6 @@ throwback@^4.1.0: resolved "https://registry.yarnpkg.com/throwback/-/throwback-4.1.0.tgz#421aac7ba9eff473105385ac4a2b0130d4b0a59c" integrity sha512-dLFe8bU8SeH0xeqeKL7BNo8XoPC/o91nz9/ooeplZPiso+DZukhoyZcSz9TFnUNScm+cA9qjU1m1853M6sPOng== -time-zone@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" - integrity sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA== - timers-browserify@^2.0.4: version "2.0.12" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" @@ -22576,11 +22258,6 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" -tinybench@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.5.0.tgz#4711c99bbf6f3e986f67eb722fed9cddb3a68ba5" - integrity sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA== - tinycolor2@1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" @@ -22591,16 +22268,6 @@ tinycolor2@^1.4.1: resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== -tinypool@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.5.0.tgz#3861c3069bf71e4f1f5aa2d2e6b3aaacc278961e" - integrity sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ== - -tinyspy@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.1.1.tgz#9e6371b00c259e5c5b301917ca18c01d40ae558c" - integrity sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w== - titleize@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" @@ -23090,11 +22757,6 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== -ufo@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.1.2.tgz#d0d9e0fa09dece0c31ffd57bd363f030a35cfe76" - integrity sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ== - uglify-es@^3.1.9: version "3.3.9" resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" @@ -23502,60 +23164,6 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -vite-node@0.31.1: - version "0.31.1" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.31.1.tgz#9fea18cbf9552ab262b969068249a8b8e7fb8b38" - integrity sha512-BajE/IsNQ6JyizPzu9zRgHrBwczkAs0erQf/JRpgTIESpKvNj9/Gd0vxX905klLkb0I0SJVCKbdrl5c6FnqYKA== - dependencies: - cac "^6.7.14" - debug "^4.3.4" - mlly "^1.2.0" - pathe "^1.1.0" - picocolors "^1.0.0" - vite "^3.0.0 || ^4.0.0" - -"vite@^3.0.0 || ^4.0.0": - version "4.4.3" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.3.tgz#dfaf86f4cba3058bf2724e2e2c88254fb0f21a5a" - integrity sha512-IMnXQXXWgLi5brBQx/4WzDxdzW0X3pjO4nqFJAuNvwKtxzAmPzFE1wszW3VDpAGQJm3RZkm/brzRdyGsnwgJIA== - dependencies: - esbuild "^0.18.10" - postcss "^8.4.25" - rollup "^3.25.2" - optionalDependencies: - fsevents "~2.3.2" - -vitest@0.31.1: - version "0.31.1" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.31.1.tgz#e3d1b68a44e76e24f142c1156fe9772ef603e52c" - integrity sha512-/dOoOgzoFk/5pTvg1E65WVaobknWREN15+HF+0ucudo3dDG/vCZoXTQrjIfEaWvQXmqScwkRodrTbM/ScMpRcQ== - dependencies: - "@types/chai" "^4.3.5" - "@types/chai-subset" "^1.3.3" - "@types/node" "*" - "@vitest/expect" "0.31.1" - "@vitest/runner" "0.31.1" - "@vitest/snapshot" "0.31.1" - "@vitest/spy" "0.31.1" - "@vitest/utils" "0.31.1" - acorn "^8.8.2" - acorn-walk "^8.2.0" - cac "^6.7.14" - chai "^4.3.7" - concordance "^5.0.4" - debug "^4.3.4" - local-pkg "^0.4.3" - magic-string "^0.30.0" - pathe "^1.1.0" - picocolors "^1.0.0" - std-env "^3.3.2" - strip-literal "^1.0.1" - tinybench "^2.5.0" - tinypool "^0.5.0" - vite "^3.0.0 || ^4.0.0" - vite-node "0.31.1" - why-is-node-running "^2.2.2" - vlq@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" @@ -23682,11 +23290,6 @@ webpack@4: watchpack "^1.7.4" webpack-sources "^1.4.1" -well-known-symbols@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5" - integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== - whatwg-fetch@^3.0.0: version "3.6.2" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" @@ -23768,14 +23371,6 @@ which@^3.0.0: dependencies: isexe "^2.0.0" -why-is-node-running@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.2.2.tgz#4185b2b4699117819e7154594271e7e344c9973e" - integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA== - dependencies: - siginfo "^2.0.0" - stackback "0.0.2" - wide-align@^1.1.2, wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" @@ -24155,11 +23750,6 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== - zod@^3.22.1: version "3.22.1" resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.1.tgz#815f850baf933fef96c1061322dbe579b1a80c27" From fa1fda28ed3d7635c310e99e7aa1103534ff3bd1 Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Thu, 8 Feb 2024 14:00:01 +0000 Subject: [PATCH 06/20] chore: normalize TS version --- apps/wallet-mobile/package.json | 10 ++--- e2e/wallet-mobile/package.json | 11 ++++-- packages/api/package.json | 8 ++-- packages/banxa/package.json | 8 ++-- packages/common/package.json | 8 ++-- packages/links/package.json | 8 ++-- packages/resolver/package.json | 7 +++- packages/staking/package.json | 8 ++-- packages/swap/package.json | 8 ++-- packages/theme/package.json | 8 ++-- packages/types/package.json | 3 +- yarn.lock | 70 +++++++++++---------------------- 12 files changed, 76 insertions(+), 81 deletions(-) diff --git a/apps/wallet-mobile/package.json b/apps/wallet-mobile/package.json index cf1a0b5678..5ce8ddcd69 100644 --- a/apps/wallet-mobile/package.json +++ b/apps/wallet-mobile/package.json @@ -226,16 +226,16 @@ "@storybook/theming": "<7.0.0", "@testing-library/react-hooks": "^8.0.1", "@testing-library/react-native": "^9.0.0", - "@tsconfig/react-native": "^2.0.2", + "@tsconfig/react-native": "^3.0.3", "@types/bs58": "^4.0.4", "@types/chai": "^4.3.4", - "@types/jest": "^29.2.1", + "@types/jest": "^29.5.12", "@types/lodash": "^4.14.175", "@types/mocha": "^10.0.0", "@types/node": "^16.18.27", - "@types/react": "18.2.0", + "@types/react": "^18.2.55", "@types/react-native-background-timer": "^2.0.0", - "@types/react-test-renderer": "^18.0.0", + "@types/react-test-renderer": "^18.0.7", "@types/tinycolor2": "^1.4.6", "@types/uuid": "^8.3.4", "@typescript-eslint/eslint-plugin": "^5.0.0", @@ -278,7 +278,7 @@ "ts-jest": "^29.1.0", "ts-node": "^10.7.0", "ts-sinon": "^2.0.2", - "typescript": "4.8.4", + "typescript": "^5.3.3", "typescript-coverage-report": "^0.6.4", "yargs": "^17.7.2" }, diff --git a/e2e/wallet-mobile/package.json b/e2e/wallet-mobile/package.json index 0ef62f274e..063725743b 100644 --- a/e2e/wallet-mobile/package.json +++ b/e2e/wallet-mobile/package.json @@ -69,14 +69,17 @@ }, "devDependencies": { "@babel/preset-typescript": "^7.23.2", - "@types/jest": "^29.5.5", - "prettier": "^3.0.0", - "typescript": "5.0.4", + "@tsconfig/react-native": "^3.0.3", + "@types/jest": "^29.5.12", + "@types/react": "^18.2.55", + "@types/react-test-renderer": "^18.0.7", "eslint": "^8.46.0", "eslint-config-prettier": "^8.9.0", "eslint-plugin-ft-flow": "^3.0.0", "eslint-plugin-prettier": "^5.0.0", - "ts-jest": "^29.1.1" + "prettier": "^3.0.0", + "ts-jest": "^29.1.1", + "typescript": "^5.3.3" }, "e2ePath": { "ios": "./tests/_ios", diff --git a/packages/api/package.json b/packages/api/package.json index e1295231e5..448eb9d66c 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -146,8 +146,10 @@ "@testing-library/react": "^14.0.0", "@testing-library/react-hooks": "^8.0.1", "@testing-library/react-native": "^12.3.0", - "@types/jest": "^28.1.2", - "@types/react": "18.2.0", + "@tsconfig/react-native": "^3.0.3", + "@types/jest": "^29.5.12", + "@types/react": "^18.2.55", + "@types/react-test-renderer": "^18.0.7", "@yoroi/types": "1.5.2", "axios-mock-adapter": "^1.21.5", "commitlint": "^17.0.2", @@ -167,7 +169,7 @@ "react-query": "^3.39.3", "react-test-renderer": "^18.2.0", "release-it": "^15.0.0", - "typescript": "^4.5.2" + "typescript": "^5.3.3" }, "peerDependencies": { "react": ">= 16.8.0 <= 19.0.0", diff --git a/packages/banxa/package.json b/packages/banxa/package.json index b2b163d987..0ccc69ddbd 100644 --- a/packages/banxa/package.json +++ b/packages/banxa/package.json @@ -141,8 +141,10 @@ "@react-native-community/eslint-config": "^3.0.2", "@release-it/conventional-changelog": "^5.0.0", "@testing-library/react-hooks": "^8.0.1", - "@types/jest": "^28.1.2", - "@types/react": "18.2.0", + "@tsconfig/react-native": "^3.0.3", + "@types/jest": "^29.5.12", + "@types/react": "^18.2.55", + "@types/react-test-renderer": "^18.0.7", "commitlint": "^17.0.2", "del-cli": "^5.0.0", "dependency-cruiser": "^13.1.1", @@ -160,7 +162,7 @@ "react-query": "^3.39.3", "react-test-renderer": "^18.2.0", "release-it": "^15.0.0", - "typescript": "^4.5.2" + "typescript": "^5.3.3" }, "peerDependencies": { "react": ">= 16.8.0 <= 19.0.0", diff --git a/packages/common/package.json b/packages/common/package.json index 0c88e525ba..d5ed88f752 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -144,8 +144,10 @@ "@testing-library/react": "^14.0.0", "@testing-library/react-hooks": "^8.0.1", "@testing-library/react-native": "^12.3.0", - "@types/jest": "^28.1.2", - "@types/react": "18.2.0", + "@tsconfig/react-native": "^3.0.3", + "@types/jest": "^29.5.12", + "@types/react": "^18.2.55", + "@types/react-test-renderer": "^18.0.7", "@yoroi/types": "1.5.2", "axios-mock-adapter": "^1.21.5", "commitlint": "^17.0.2", @@ -166,7 +168,7 @@ "react-query": "^3.39.3", "react-test-renderer": "^18.2.0", "release-it": "^15.0.0", - "typescript": "^4.5.2" + "typescript": "^5.3.3" }, "peerDependencies": { "@react-native-async-storage/async-storage": ">= 1.19.3 <= 1.20.0", diff --git a/packages/links/package.json b/packages/links/package.json index 1621a838b4..43751e0ece 100644 --- a/packages/links/package.json +++ b/packages/links/package.json @@ -145,8 +145,10 @@ "@release-it/conventional-changelog": "^5.0.0", "@testing-library/react-hooks": "^8.0.1", "@testing-library/react-native": "^12.3.0", - "@types/jest": "^28.1.2", - "@types/react": "18.2.0", + "@tsconfig/react-native": "^3.0.3", + "@types/jest": "^29.5.12", + "@types/react": "^18.2.55", + "@types/react-test-renderer": "^18.0.7", "@yoroi/types": "1.5.2", "commitlint": "^17.0.2", "del-cli": "^5.0.0", @@ -165,7 +167,7 @@ "react-query": "^3.39.3", "react-test-renderer": "^18.2.0", "release-it": "^15.0.0", - "typescript": "^4.5.2" + "typescript": "^5.3.3" }, "peerDependencies": { "@react-native-async-storage/async-storage": ">= 1.19.3 <= 1.20.0", diff --git a/packages/resolver/package.json b/packages/resolver/package.json index d9faae56ca..b5cebc448e 100644 --- a/packages/resolver/package.json +++ b/packages/resolver/package.json @@ -149,7 +149,10 @@ "@release-it/conventional-changelog": "^5.0.0", "@testing-library/react-hooks": "^8.0.1", "@testing-library/react-native": "^12.3.0", - "@types/jest": "^28.1.2", + "@tsconfig/react-native": "^3.0.3", + "@types/jest": "^29.5.12", + "@types/react": "^18.2.55", + "@types/react-test-renderer": "^18.0.7", "@yoroi/types": "1.5.2", "commitlint": "^17.0.2", "del-cli": "^5.0.0", @@ -168,7 +171,7 @@ "react-query": "^3.39.3", "react-test-renderer": "^18.2.0", "release-it": "^15.0.0", - "typescript": "4.8.4" + "typescript": "^5.3.3" }, "peerDependencies": { "@react-native-async-storage/async-storage": ">= 1.19.3 <= 1.20.0", diff --git a/packages/staking/package.json b/packages/staking/package.json index ffff4f78db..5952dd1356 100644 --- a/packages/staking/package.json +++ b/packages/staking/package.json @@ -144,9 +144,11 @@ "@testing-library/react": "^14.0.0", "@testing-library/react-hooks": "^8.0.1", "@testing-library/react-native": "^12.3.0", + "@tsconfig/react-native": "^3.0.3", "@types/blake2b": "^2.1.3", - "@types/jest": "^28.1.2", - "@types/react": "18.2.0", + "@types/jest": "^29.5.12", + "@types/react": "^18.2.55", + "@types/react-test-renderer": "^18.0.7", "@yoroi/types": "1.5.2", "axios-mock-adapter": "^1.21.5", "commitlint": "^17.0.2", @@ -166,7 +168,7 @@ "react-query": "^3.39.3", "react-test-renderer": "^18.2.0", "release-it": "^15.0.0", - "typescript": "^4.5.2" + "typescript": "^5.3.3" }, "peerDependencies": { "@react-native-async-storage/async-storage": ">= 1.19.3 <= 1.20.0", diff --git a/packages/swap/package.json b/packages/swap/package.json index ad3d466684..60ce45a69f 100644 --- a/packages/swap/package.json +++ b/packages/swap/package.json @@ -146,8 +146,10 @@ "@release-it/conventional-changelog": "^5.0.0", "@testing-library/react-hooks": "^8.0.1", "@testing-library/react-native": "^12.3.0", - "@types/jest": "^28.1.2", - "@types/react": "18.2.0", + "@tsconfig/react-native": "^3.0.3", + "@types/jest": "^29.5.12", + "@types/react": "^18.2.55", + "@types/react-test-renderer": "^18.0.7", "@yoroi/types": "1.5.2", "commitlint": "^17.0.2", "del-cli": "^5.0.0", @@ -166,7 +168,7 @@ "react-query": "^3.39.3", "react-test-renderer": "^18.2.0", "release-it": "^15.0.0", - "typescript": "^4.5.2" + "typescript": "^5.3.3" }, "peerDependencies": { "@react-native-async-storage/async-storage": ">= 1.19.3 <= 1.20.0", diff --git a/packages/theme/package.json b/packages/theme/package.json index cd4ba1fcc1..fbf63a2631 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -140,9 +140,11 @@ "@testing-library/react": "^14.0.0", "@testing-library/react-hooks": "^8.0.1", "@testing-library/react-native": "^12.3.0", + "@tsconfig/react-native": "^3.0.3", "@types/blake2b": "^2.1.3", - "@types/jest": "^28.1.2", - "@types/react": "18.2.0", + "@types/jest": "^29.5.12", + "@types/react": "^18.2.55", + "@types/react-test-renderer": "^18.0.7", "@yoroi/types": "^1.5.0", "axios-mock-adapter": "^1.21.5", "commitlint": "^17.0.2", @@ -162,7 +164,7 @@ "react-query": "^3.39.3", "react-test-renderer": "^18.2.0", "release-it": "^15.0.0", - "typescript": "^4.5.2" + "typescript": "^5.3.3" }, "peerDependencies": { "@react-native-async-storage/async-storage": ">= 1.19.3 <= 1.20.0", diff --git a/packages/types/package.json b/packages/types/package.json index 355fd29081..6e7410886c 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -101,6 +101,7 @@ "@commitlint/config-conventional": "^17.0.2", "@release-it/conventional-changelog": "^5.0.0", "@testing-library/react-hooks": "^8.0.1", + "@types/jest": "^29.5.12", "commitlint": "^17.0.2", "del-cli": "^5.0.0", "dependency-cruiser": "^13.1.1", @@ -111,7 +112,7 @@ "jest": "^28.1.1", "prettier": "^2.0.5", "release-it": "^15.0.0", - "typescript": "^4.5.2" + "typescript": "^5.3.3" }, "packageManager": "yarn@1.22.21", "engines": { diff --git a/yarn.lock b/yarn.lock index afa2fb737b..0ad4400e23 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6173,10 +6173,10 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== -"@tsconfig/react-native@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/react-native/-/react-native-2.0.3.tgz#79ad8efc6d3729152da6cb23725b6c364a7349b2" - integrity sha512-jE58snEKBd9DXfyR4+ssZmYJ/W2mOSnNrvljR0aLyQJL9JKX6vlWELHkRjb3HBbcM9Uy0hZGijXbqEAjOERW2A== +"@tsconfig/react-native@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/react-native/-/react-native-3.0.3.tgz#38b306639571a0cd025467f90031897b52928986" + integrity sha512-3FVk8Uwb5YRwaHW/4dpcYQa5TTJSBXzIHRBDn3l+YmsXqFfcVGii+G8RPboC6I9iGgtUTxKHz3Y+6WDJDwVXnA== "@tufjs/canonical-json@1.0.0": version "1.0.0" @@ -6339,26 +6339,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^28.1.2": - version "28.1.8" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.8.tgz#6936409f3c9724ea431efd412ea0238a0f03b09b" - integrity sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw== - dependencies: - expect "^28.0.0" - pretty-format "^28.0.0" - -"@types/jest@^29.2.1": - version "29.5.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.2.tgz#86b4afc86e3a8f3005b297ed8a72494f89e6395b" - integrity sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/jest@^29.5.5": - version "29.5.5" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.5.tgz#727204e06228fe24373df9bae76b90f3e8236a2a" - integrity sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg== +"@types/jest@^29.5.12": + version "29.5.12" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -6499,10 +6483,10 @@ resolved "https://registry.yarnpkg.com/@types/react-native-background-timer/-/react-native-background-timer-2.0.0.tgz#c44c57f8fbca9d9d5521fdd72a8f55232b79381e" integrity sha512-y5VW82dL/ESOLg+5QQHyBdsFVA4ZklENxmOyxv8o06T+3HBG2JOSuz/CIPz1vKdB7dmWDGPZNuPosdtnp+xv2A== -"@types/react-test-renderer@^18.0.0": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-18.0.0.tgz#7b7f69ca98821ea5501b21ba24ea7b6139da2243" - integrity sha512-C7/5FBJ3g3sqUahguGi03O79b8afNeSD6T8/GU50oQrJCU0bVCCGQHaGKUbg2Ce8VQEEqTw8/HiS6lXHHdgkdQ== +"@types/react-test-renderer@^18.0.7": + version "18.0.7" + resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-18.0.7.tgz#2cfe657adb3688cdf543995eceb2e062b5a68728" + integrity sha512-1+ANPOWc6rB3IkSnElhjv6VLlKg2dSv/OWClUyZimbLsQyBn8Js9Vtdsi3UICJ2rIQ3k2la06dkB+C92QfhKmg== dependencies: "@types/react" "*" @@ -6515,10 +6499,10 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@18.2.0": - version "18.2.0" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.0.tgz#15cda145354accfc09a18d2f2305f9fc099ada21" - integrity sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA== +"@types/react@^18.2.55": + version "18.2.55" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.55.tgz#38141821b7084404b5013742bc4ae08e44da7a67" + integrity sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -11795,7 +11779,7 @@ expand-template@^2.0.3: resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== -expect@^28.0.0, expect@^28.1.3: +expect@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== @@ -19121,7 +19105,7 @@ pretty-format@^27.0.0, pretty-format@^27.0.2: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^28.0.0, pretty-format@^28.1.3: +pretty-format@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== @@ -22712,16 +22696,6 @@ typescript-coverage-report@^0.6.4: semantic-ui-react "^0.88.2" type-coverage-core "^2.17.2" -typescript@4.8.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" - integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== - -typescript@5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" - integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== - "typescript@>=3 < 6", "typescript@^4.6.4 || ^5.0.0", "typescript@^4.7 || 5": version "5.1.6" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" @@ -22732,10 +22706,10 @@ typescript@^3.9.7: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== -typescript@^4.5.2: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== typescript@~4.4.4: version "4.4.4" From 19e7fea82de28bff2156930ed75f1065e9028e04 Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:15:28 +0000 Subject: [PATCH 07/20] chore(types): updated multi/simple storage --- packages/types/src/app/multi-storage.ts | 19 +++++++++--------- packages/types/src/app/storage.ts | 26 ++++++++++++++----------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/packages/types/src/app/multi-storage.ts b/packages/types/src/app/multi-storage.ts index 35d176a084..1ebd97b482 100644 --- a/packages/types/src/app/multi-storage.ts +++ b/packages/types/src/app/multi-storage.ts @@ -1,18 +1,19 @@ import {AppStorage, AppStorageFolderName} from './storage' -import {Nullable} from '../helpers/types' +import {MaybePromise, Nullable} from '../helpers/types' -export interface AppMultiStorage { - getAllKeys: () => Promise> - clear: () => Promise - saveMany: (data: ReadonlyArray>) => Promise - readAll: () => Promise]>> +export interface AppMultiStorage { + getAllKeys: () => MaybePromise, IsAsync> + clear: () => MaybePromise + saveMany: (data: ReadonlyArray>) => MaybePromise + readAll: () => MaybePromise]>, IsAsync> readMany: ( keys: ReadonlyArray, - ) => Promise]>> + ) => MaybePromise]>, IsAsync> + removeMany: (keys: ReadonlyArray) => MaybePromise } -export type AppMultiStorageOptions = { - storage: AppStorage +export type AppMultiStorageOptions = { + storage: AppStorage dataFolder: AppStorageFolderName keyExtractor: keyof T | ((data: NonNullable) => string) serializer?: (data: NonNullable) => string diff --git a/packages/types/src/app/storage.ts b/packages/types/src/app/storage.ts index a835857f33..4331f39a8d 100644 --- a/packages/types/src/app/storage.ts +++ b/packages/types/src/app/storage.ts @@ -1,27 +1,31 @@ +import {MaybePromise} from '../helpers/types' + export type AppStorageFolderName = `${string}/` -export interface AppStorage { - join: (folderName: AppStorageFolderName) => AppStorage +export interface AppStorage { + join: (folderName: AppStorageFolderName) => AppStorage getItem: ( key: string, parse?: (item: string | null) => T, - ) => Promise + ) => MaybePromise multiGet: ( keys: ReadonlyArray, parse?: (item: string | null) => T, - ) => Promise> + ) => MaybePromise, IsAsync> setItem: ( key: string, value: T, stringify?: (data: T) => string, - ) => Promise + ) => MaybePromise multiSet: ( tuples: ReadonlyArray<[key: string, value: unknown]>, stringify?: (data: unknown) => string, - ) => Promise - removeItem: (key: string) => Promise - removeFolder: (folderName: AppStorageFolderName) => Promise - multiRemove: (keys: ReadonlyArray) => Promise - getAllKeys: () => Promise> - clear: () => Promise + ) => MaybePromise + removeItem: (key: string) => MaybePromise + removeFolder: ( + folderName: AppStorageFolderName, + ) => MaybePromise + multiRemove: (keys: ReadonlyArray) => MaybePromise + getAllKeys: () => MaybePromise, IsAsync> + clear: () => MaybePromise } From 3083e319c2537c0bc1c4f0fd10cad83015a8171b Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:16:12 +0000 Subject: [PATCH 08/20] chore(types): added the observable storage --- packages/types/src/app/observable-storage.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 packages/types/src/app/observable-storage.ts diff --git a/packages/types/src/app/observable-storage.ts b/packages/types/src/app/observable-storage.ts new file mode 100644 index 0000000000..3811367cac --- /dev/null +++ b/packages/types/src/app/observable-storage.ts @@ -0,0 +1,17 @@ +import {AppMultiStorage} from './multi-storage' +import {AppStorage} from './storage' + +export type AppObservableStorage = + AppStorage & { + onUpdate: ( + keysToObserve: ReadonlyArray, + callback: (keys: ReadonlyArray | null) => void, + ) => () => void + } + +export type AppObservableMultiStorage< + T, + IsAsync extends boolean = true, +> = AppMultiStorage & { + onUpdate: (callback: () => void) => () => void +} From 9920333e22a55ecf7f5194465207be8e38ffa43d Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:16:41 +0000 Subject: [PATCH 09/20] chore(types): lifted observer types to types pkg --- packages/types/src/app/simple-observer.ts | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 packages/types/src/app/simple-observer.ts diff --git a/packages/types/src/app/simple-observer.ts b/packages/types/src/app/simple-observer.ts new file mode 100644 index 0000000000..91088f7bf6 --- /dev/null +++ b/packages/types/src/app/simple-observer.ts @@ -0,0 +1,8 @@ +export type AppSubscriber = (data: T) => void + +export type AppObserver = Readonly<{ + subscribe: (subscriber: AppSubscriber) => () => void + unsubscribe: (subscriber: AppSubscriber) => void + notify: (data: T) => void + destroy: () => void +}> From 086372cea03d019397901b46d53cb32b33af721b Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:17:14 +0000 Subject: [PATCH 10/20] chore(types): added the cache types --- packages/types/src/app/cache.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 packages/types/src/app/cache.ts diff --git a/packages/types/src/app/cache.ts b/packages/types/src/app/cache.ts new file mode 100644 index 0000000000..049b6cd4f8 --- /dev/null +++ b/packages/types/src/app/cache.ts @@ -0,0 +1,13 @@ +export type AppCacheInfo = { + expires: number + hash: string +} + +export interface AppCacheRecord extends AppCacheInfo { + record: T +} + +export interface AppCacheRow + extends AppCacheRecord { + key: K +} From a12ee05b9d80d6eaf43858a11b0fd36043d195d5 Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:17:38 +0000 Subject: [PATCH 11/20] chore(types): exported the new types --- packages/types/src/index.ts | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index d89fe396c4..36b46dc82d 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -90,18 +90,44 @@ import { ApiTokenSupplyResponse, ApiTokeSupplyRequest, } from './api/cardano' +import { + AppObservableMultiStorage, + AppObservableStorage, +} from './app/observable-storage' +import {AppCacheInfo, AppCacheRecord, AppCacheRow} from './app/cache' +import {AppObserver, AppSubscriber} from './app/simple-observer' export namespace App { - export interface Storage extends AppStorage {} + export interface Storage + extends AppStorage {} export type StorageFolderName = AppStorageFolderName - export interface MultiStorage extends AppMultiStorage {} - export type MultiStorageOptions = AppMultiStorageOptions + export interface MultiStorage + extends AppMultiStorage {} + + export interface ObservableStorage + extends AppObservableStorage {} + export interface ObservableMultiStorage + extends AppObservableMultiStorage {} + + export type MultiStorageOptions< + T, + IsAsync extends boolean = true, + > = AppMultiStorageOptions + + export type Observer = AppObserver + export type Subscriber = AppSubscriber + + export type CacheInfo = AppCacheInfo + export interface CacheRecord extends AppCacheRecord {} + export interface CacheRow + extends AppCacheRow {} export interface Api extends AppApi {} export type FrontendFeeTier = AppFrontendFeeTier export type FrontendFeesResponse = AppFrontendFeesResponse } + export namespace Swap { export interface Api extends SwapApi {} export type Manager = SwapManager From 60e0ac0bcd7a54a683cec7e1c61e83a2ebf234a5 Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:18:31 +0000 Subject: [PATCH 12/20] chore(common): updated observer types --- packages/common/src/observer/observer.test.ts | 5 +++-- packages/common/src/observer/observer.ts | 17 +++++------------ 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/packages/common/src/observer/observer.test.ts b/packages/common/src/observer/observer.test.ts index 534613b14b..c3937f5532 100644 --- a/packages/common/src/observer/observer.test.ts +++ b/packages/common/src/observer/observer.test.ts @@ -1,7 +1,8 @@ -import {Observer, observerMaker} from './observer' +import {App} from '@yoroi/types' +import {observerMaker} from './observer' describe('Observer', () => { - let observer: Observer + let observer: App.Observer let mockSubscriber1: jest.Mock let mockSubscriber2: jest.Mock diff --git a/packages/common/src/observer/observer.ts b/packages/common/src/observer/observer.ts index 91f6c012a7..c1d5cc79f6 100644 --- a/packages/common/src/observer/observer.ts +++ b/packages/common/src/observer/observer.ts @@ -1,16 +1,16 @@ -type Subscriber = (data: T) => void +import {App} from '@yoroi/types' -export const observerMaker = (): Readonly> => { - const subscribers: Set> = new Set() +export const observerMaker = (): App.Observer => { + const subscribers: Set> = new Set() return { - subscribe: (callback: Subscriber) => { + subscribe: (callback: App.Subscriber) => { subscribers.add(callback) return () => { subscribers.delete(callback) } }, - unsubscribe(subscriber: Subscriber) { + unsubscribe(subscriber: App.Subscriber) { subscribers.delete(subscriber) }, notify: (data: T) => { @@ -21,10 +21,3 @@ export const observerMaker = (): Readonly> => { }, } as const } - -export type Observer = { - subscribe: (subscriber: Subscriber) => () => void - unsubscribe: (subscriber: Subscriber) => void - notify: (data: T) => void - destroy: () => void -} From 362c8c206d85d96c2a26de402f53f507617ca876 Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:22:51 +0000 Subject: [PATCH 13/20] chore(common,resolver,wallet-mobile,staking): sync storage update and rootStorage as client --- apps/wallet-mobile/package.json | 3 +- .../src/HW/LedgerConnect/LedgerConnect.tsx | 10 ++- apps/wallet-mobile/src/InitApp.tsx | 4 +- .../TxHistory/TxDetails/TxDetails.stories.tsx | 7 +- .../src/TxHistory/TxHistoryNavigator.tsx | 4 +- apps/wallet-mobile/src/YoroiApp.tsx | 7 +- .../ChangePinScreen.stories.tsx | 7 +- .../CheckPinInput/CheckPinInput.stories.tsx | 7 +- .../CreatePinInput/CreatePinInput.stories.tsx | 7 +- .../CreatePinScreen.stories.tsx | 7 +- .../PinLoginScreen/PinLoginScreen.stories.tsx | 7 +- apps/wallet-mobile/src/auth/hooks.test.ts | 3 +- .../features/Initialization/common/terms.ts | 10 +-- .../common/useResetShowBuyBannerSmall.tsx | 4 +- .../common/useShowBuyBannerSmall.tsx | 4 +- .../Settings/Currency/CurrencyContext.tsx | 8 +-- .../Settings/PrivacyMode/PrivacyMode.tsx | 13 ++-- .../Settings/ScreenShare/ScreenShare.ts | 6 +- .../Staking/Governance/common/helpers.ts | 4 +- .../src/i18n/LanguageProvider.tsx | 11 ++-- .../src/metrics/metricsManager.tsx | 3 +- .../src/yoroi-wallets/auth/auth.ts | 12 ++-- .../tests/mainnet/ShelleyWallet.test.ts | 2 +- .../testnet/ShelleyWalletTestnet.test.ts | 2 +- .../transactionManager.test.ts | 2 +- .../cardano/utxoManager/utxoManager.test.ts | 3 +- .../src/yoroi-wallets/hooks/index.ts | 6 +- .../yoroi-wallets/memos/memosManager.test.ts | 2 +- .../yoroi-wallets/migrations/4_9_0.test.ts | 3 +- .../migrations/walletMeta.test.ts | 2 +- .../yoroi-wallets/migrations/walletMeta.ts | 3 +- .../yoroi-wallets/storage/EncryptedStorage.ts | 3 +- .../src/yoroi-wallets/storage/rootStorage.ts | 3 + .../walletManager/walletManager.ts | 3 +- .../src/HW/LedgerConnect/LedgerConnect.json | 32 +++++----- .../src/TxHistory/TxHistoryNavigator.json | 64 +++++++++---------- .../messages/src/yoroi-wallets/auth/auth.json | 12 ++-- .../storage/adapters/async-storage.test.ts | 44 ++++++++----- .../src/storage/adapters/async-storage.ts | 20 +++--- .../src/storage/adapters/rootStorage.ts | 3 - .../translators/storage-reactjs.test.tsx | 58 ----------------- .../storage/translators/storage-reactjs.tsx | 23 ------- packages/resolver/src/adapters/api.ts | 1 - .../staking/src/governance/manager.test.ts | 4 +- 44 files changed, 194 insertions(+), 249 deletions(-) create mode 100644 apps/wallet-mobile/src/yoroi-wallets/storage/rootStorage.ts delete mode 100644 packages/common/src/storage/adapters/rootStorage.ts delete mode 100644 packages/common/src/storage/translators/storage-reactjs.test.tsx delete mode 100644 packages/common/src/storage/translators/storage-reactjs.tsx diff --git a/apps/wallet-mobile/package.json b/apps/wallet-mobile/package.json index 5ce8ddcd69..1e18f90d5e 100644 --- a/apps/wallet-mobile/package.json +++ b/apps/wallet-mobile/package.json @@ -151,7 +151,7 @@ "lodash": "^4.17.21", "react": "18.2.0", "react-error-boundary": "^3.1.4", - "react-intl": "^6.4.1", + "react-intl": "^6.6.2", "react-native": "~0.71.0", "react-native-background-timer": "2.4.1", "react-native-ble-plx": "^2.0.3", @@ -233,7 +233,6 @@ "@types/lodash": "^4.14.175", "@types/mocha": "^10.0.0", "@types/node": "^16.18.27", - "@types/react": "^18.2.55", "@types/react-native-background-timer": "^2.0.0", "@types/react-test-renderer": "^18.0.7", "@types/tinycolor2": "^1.4.6", diff --git a/apps/wallet-mobile/src/HW/LedgerConnect/LedgerConnect.tsx b/apps/wallet-mobile/src/HW/LedgerConnect/LedgerConnect.tsx index 80bd871863..d9c6747c73 100644 --- a/apps/wallet-mobile/src/HW/LedgerConnect/LedgerConnect.tsx +++ b/apps/wallet-mobile/src/HW/LedgerConnect/LedgerConnect.tsx @@ -3,9 +3,9 @@ // @ts-ignore import TransportHID from '@emurgo/react-native-hid' import TransportBLE from '@ledgerhq/react-native-hw-transport-ble' -import React from 'react' +import * as React from 'react' import type {IntlShape} from 'react-intl' -import {defineMessages, injectIntl} from 'react-intl' +import {defineMessages, useIntl} from 'react-intl' import {ActivityIndicator, Alert, FlatList, Image, RefreshControl, ScrollView, StyleSheet, View} from 'react-native' import bleImage from '../../assets/img/bluetooth.png' @@ -305,7 +305,11 @@ class _LedgerConnect extends React.Component { } } -export const LedgerConnect = injectIntl(_LedgerConnect) +export const LedgerConnect = (props: Omit) => { + const intl = useIntl() + + return <_LedgerConnect {...props} intl={intl} /> +} const messages = defineMessages({ caption: { diff --git a/apps/wallet-mobile/src/InitApp.tsx b/apps/wallet-mobile/src/InitApp.tsx index 4a48cc64e3..4a6771278a 100644 --- a/apps/wallet-mobile/src/InitApp.tsx +++ b/apps/wallet-mobile/src/InitApp.tsx @@ -1,4 +1,4 @@ -import {isString, useStorage} from '@yoroi/common' +import {isString, useAsyncStorage} from '@yoroi/common' import {App} from '@yoroi/types' import React, {useEffect, useRef} from 'react' import {Platform, UIManager} from 'react-native' @@ -29,7 +29,7 @@ export const InitApp = () => { const useInitApp = () => { const [loaded, setLoaded] = React.useState(false) - const storage = useStorage() + const storage = useAsyncStorage() const crashReportsEnabled = useCrashReportsEnabled() const {initialised: screenShareInitialized} = useInitScreenShare() diff --git a/apps/wallet-mobile/src/TxHistory/TxDetails/TxDetails.stories.tsx b/apps/wallet-mobile/src/TxHistory/TxDetails/TxDetails.stories.tsx index 8b38945184..2eeca1a7d9 100644 --- a/apps/wallet-mobile/src/TxHistory/TxDetails/TxDetails.stories.tsx +++ b/apps/wallet-mobile/src/TxHistory/TxDetails/TxDetails.stories.tsx @@ -1,11 +1,12 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import {storiesOf} from '@storybook/react-native' -import {rootStorage, StorageProvider} from '@yoroi/common' +import {AsyncStorageProvider} from '@yoroi/common' import React from 'react' import {QueryProvider, RouteProvider} from '../../../.storybook/decorators' import {SelectedWalletProvider} from '../../SelectedWallet' import {mocks} from '../../yoroi-wallets/mocks' +import {rootStorage} from '../../yoroi-wallets/storage/rootStorage' import {TxDetails} from './TxDetails' storiesOf('TxDetails', module) @@ -48,7 +49,7 @@ storiesOf('TxDetails', module) - { @@ -64,7 +65,7 @@ storiesOf('TxDetails', module) }} > - + diff --git a/apps/wallet-mobile/src/TxHistory/TxHistoryNavigator.tsx b/apps/wallet-mobile/src/TxHistory/TxHistoryNavigator.tsx index 0251909a2e..dd371e8d8f 100644 --- a/apps/wallet-mobile/src/TxHistory/TxHistoryNavigator.tsx +++ b/apps/wallet-mobile/src/TxHistory/TxHistoryNavigator.tsx @@ -1,7 +1,7 @@ import {init} from '@emurgo/cross-csl-mobile' import {useNavigation} from '@react-navigation/native' import {createStackNavigator} from '@react-navigation/stack' -import {useStorage} from '@yoroi/common' +import {useAsyncStorage} from '@yoroi/common' import {resolverApiMaker, resolverManagerMaker, ResolverProvider, resolverStorageMaker} from '@yoroi/resolver' import { milkTokenId, @@ -68,7 +68,7 @@ export const TxHistoryNavigator = () => { const strings = useStrings() const wallet = useSelectedWallet() const walletName = useWalletName(wallet) - const storage = useStorage() + const storage = useAsyncStorage() const {theme} = useTheme() // modal diff --git a/apps/wallet-mobile/src/YoroiApp.tsx b/apps/wallet-mobile/src/YoroiApp.tsx index 15c2bd3618..33f05d6a0c 100644 --- a/apps/wallet-mobile/src/YoroiApp.tsx +++ b/apps/wallet-mobile/src/YoroiApp.tsx @@ -1,4 +1,4 @@ -import {rootStorage, StorageProvider} from '@yoroi/common' +import {AsyncStorageProvider} from '@yoroi/common' import {ThemeProvider} from '@yoroi/theme' import React from 'react' import {LogBox, Platform, StyleSheet, UIManager} from 'react-native' @@ -20,6 +20,7 @@ import {makeMetricsManager, MetricsProvider} from './metrics/metricsManager' import {SelectedWalletMetaProvider, SelectedWalletProvider} from './SelectedWallet/Context' import {WalletManagerProvider} from './WalletManager' import {useMigrations} from './yoroi-wallets/migrations' +import {rootStorage} from './yoroi-wallets/storage/rootStorage' import {walletManager} from './yoroi-wallets/walletManager' enableScreens() @@ -43,7 +44,7 @@ export const YoroiApp = () => { const migrated = useMigrations(rootStorage) // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions return migrated ? ( - + @@ -71,6 +72,6 @@ export const YoroiApp = () => { - + ) : null } diff --git a/apps/wallet-mobile/src/auth/ChangePinScreen/ChangePinScreen.stories.tsx b/apps/wallet-mobile/src/auth/ChangePinScreen/ChangePinScreen.stories.tsx index 5ae762d7eb..3232d495be 100644 --- a/apps/wallet-mobile/src/auth/ChangePinScreen/ChangePinScreen.stories.tsx +++ b/apps/wallet-mobile/src/auth/ChangePinScreen/ChangePinScreen.stories.tsx @@ -1,14 +1,15 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import {action} from '@storybook/addon-actions' import {storiesOf} from '@storybook/react-native' -import {rootStorage, StorageProvider} from '@yoroi/common' +import {AsyncStorageProvider} from '@yoroi/common' import React from 'react' +import {rootStorage} from '../../yoroi-wallets/storage/rootStorage' import {ChangePinScreen} from './ChangePinScreen' storiesOf('ChangePinScreen', module).add('Default', () => { return ( - => { @@ -21,7 +22,7 @@ storiesOf('ChangePinScreen', module).add('Default', () => { }} > - + ) }) diff --git a/apps/wallet-mobile/src/auth/CheckPinInput/CheckPinInput.stories.tsx b/apps/wallet-mobile/src/auth/CheckPinInput/CheckPinInput.stories.tsx index 6c45022512..9c194e0518 100644 --- a/apps/wallet-mobile/src/auth/CheckPinInput/CheckPinInput.stories.tsx +++ b/apps/wallet-mobile/src/auth/CheckPinInput/CheckPinInput.stories.tsx @@ -1,13 +1,14 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import {action} from '@storybook/addon-actions' import {storiesOf} from '@storybook/react-native' -import {rootStorage, StorageProvider} from '@yoroi/common' +import {AsyncStorageProvider} from '@yoroi/common' import React from 'react' +import {rootStorage} from '../../yoroi-wallets/storage/rootStorage' import {CheckPinInput} from './CheckPinInput' storiesOf('CheckPinInput', module).add('Default', () => ( - { @@ -17,7 +18,7 @@ storiesOf('CheckPinInput', module).add('Default', () => ( }} > - + )) // PIN = 111111 diff --git a/apps/wallet-mobile/src/auth/CreatePinInput/CreatePinInput.stories.tsx b/apps/wallet-mobile/src/auth/CreatePinInput/CreatePinInput.stories.tsx index 0c39b20907..6c07ace3f9 100644 --- a/apps/wallet-mobile/src/auth/CreatePinInput/CreatePinInput.stories.tsx +++ b/apps/wallet-mobile/src/auth/CreatePinInput/CreatePinInput.stories.tsx @@ -1,12 +1,13 @@ import {action} from '@storybook/addon-actions' import {storiesOf} from '@storybook/react-native' -import {rootStorage, StorageProvider} from '@yoroi/common' +import {AsyncStorageProvider} from '@yoroi/common' import React from 'react' +import {rootStorage} from '../../yoroi-wallets/storage/rootStorage' import {CreatePinInput} from './CreatePinInput' storiesOf('CreatePinInput', module).add('Default', () => ( - { @@ -16,5 +17,5 @@ storiesOf('CreatePinInput', module).add('Default', () => ( }} > - + )) diff --git a/apps/wallet-mobile/src/auth/CreatePinScreen/CreatePinScreen.stories.tsx b/apps/wallet-mobile/src/auth/CreatePinScreen/CreatePinScreen.stories.tsx index e5bc872f55..36e0508294 100644 --- a/apps/wallet-mobile/src/auth/CreatePinScreen/CreatePinScreen.stories.tsx +++ b/apps/wallet-mobile/src/auth/CreatePinScreen/CreatePinScreen.stories.tsx @@ -1,18 +1,19 @@ import {action} from '@storybook/addon-actions' import {storiesOf} from '@storybook/react-native' -import {rootStorage, StorageProvider} from '@yoroi/common' +import {AsyncStorageProvider} from '@yoroi/common' import React from 'react' +import {rootStorage} from '../../yoroi-wallets/storage/rootStorage' import {CreatePinScreen} from './CreatePinScreen' storiesOf('CreatePinScreen', module).add('Default', () => { return ( - action('onDone')} /> - + ) }) diff --git a/apps/wallet-mobile/src/auth/PinLoginScreen/PinLoginScreen.stories.tsx b/apps/wallet-mobile/src/auth/PinLoginScreen/PinLoginScreen.stories.tsx index b598b1a0a4..ca2da70851 100644 --- a/apps/wallet-mobile/src/auth/PinLoginScreen/PinLoginScreen.stories.tsx +++ b/apps/wallet-mobile/src/auth/PinLoginScreen/PinLoginScreen.stories.tsx @@ -1,12 +1,13 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import {storiesOf} from '@storybook/react-native' -import {rootStorage, StorageProvider} from '@yoroi/common' +import {AsyncStorageProvider} from '@yoroi/common' import React from 'react' +import {rootStorage} from '../../yoroi-wallets/storage/rootStorage' import {PinLoginScreen} from './PinLoginScreen' storiesOf('PinLoginScreen', module).add('Default', () => ( - => { @@ -15,7 +16,7 @@ storiesOf('PinLoginScreen', module).add('Default', () => ( }} > - + )) // PIN = 111111 diff --git a/apps/wallet-mobile/src/auth/hooks.test.ts b/apps/wallet-mobile/src/auth/hooks.test.ts index b90f5fd986..599175747c 100644 --- a/apps/wallet-mobile/src/auth/hooks.test.ts +++ b/apps/wallet-mobile/src/auth/hooks.test.ts @@ -1,7 +1,8 @@ import AsyncStorage from '@react-native-async-storage/async-storage' -import {parseSafe, rootStorage} from '@yoroi/common' +import {parseSafe} from '@yoroi/common' import {disableAllEasyConfirmation, enableAuthWithOs} from '../yoroi-wallets/auth' +import {rootStorage} from '../yoroi-wallets/storage/rootStorage' import {WalletMeta} from '../yoroi-wallets/walletManager' describe('enableAuthWithOs', () => { diff --git a/apps/wallet-mobile/src/features/Initialization/common/terms.ts b/apps/wallet-mobile/src/features/Initialization/common/terms.ts index 2f3e97fdf6..e33ad43268 100644 --- a/apps/wallet-mobile/src/features/Initialization/common/terms.ts +++ b/apps/wallet-mobile/src/features/Initialization/common/terms.ts @@ -1,4 +1,4 @@ -import {useStorage} from '@yoroi/common' +import {useAsyncStorage} from '@yoroi/common' import {useCallback} from 'react' import {useMutation, useQuery, useQueryClient} from 'react-query' @@ -11,10 +11,10 @@ export type LegalAgreement = { const queryKey = 'legalAgreement' export const useLegalAgreement = () => { - const storage = useStorage() + const storage = useAsyncStorage() const query = useQuery({ queryKey: [queryKey], - queryFn: async () => storage.join('appSettings/').getItem(queryKey), + queryFn: () => storage.join('appSettings/').getItem(queryKey), suspense: true, }) @@ -22,7 +22,7 @@ export const useLegalAgreement = () => { } export const useAgreeWithLegal = () => { - const storage = useStorage() + const storage = useAsyncStorage() const queryClient = useQueryClient() const mutationFn = useCallback(async () => { @@ -41,7 +41,7 @@ export const useAgreeWithLegal = () => { } } export const useResetLegalAgreement = () => { - const storage = useStorage() + const storage = useAsyncStorage() const queryClient = useQueryClient() const mutationFn = useCallback(async () => { diff --git a/apps/wallet-mobile/src/features/RampOnOff/common/useResetShowBuyBannerSmall.tsx b/apps/wallet-mobile/src/features/RampOnOff/common/useResetShowBuyBannerSmall.tsx index 62ac64c88d..ad01047641 100644 --- a/apps/wallet-mobile/src/features/RampOnOff/common/useResetShowBuyBannerSmall.tsx +++ b/apps/wallet-mobile/src/features/RampOnOff/common/useResetShowBuyBannerSmall.tsx @@ -1,4 +1,4 @@ -import {useMutationWithInvalidations, useStorage} from '@yoroi/common' +import {useAsyncStorage, useMutationWithInvalidations} from '@yoroi/common' import {UseMutationOptions} from 'react-query' import {useSelectedWallet} from '../../../SelectedWallet/Context/SelectedWalletContext' @@ -8,7 +8,7 @@ const thirtyDaysInMs = 30 * 24 * 60 * 60 * 1000 export const useResetShowBuyBannerSmall = (options: UseMutationOptions = {}) => { const wallet = useSelectedWallet() - const storage = useStorage() + const storage = useAsyncStorage() const rampOnOffStorage = storage.join(`wallet/${wallet.id}/${storageRootRampOnOff}/`) const mutation = useMutationWithInvalidations({ diff --git a/apps/wallet-mobile/src/features/RampOnOff/common/useShowBuyBannerSmall.tsx b/apps/wallet-mobile/src/features/RampOnOff/common/useShowBuyBannerSmall.tsx index 8bf4c93f68..b88be655ba 100644 --- a/apps/wallet-mobile/src/features/RampOnOff/common/useShowBuyBannerSmall.tsx +++ b/apps/wallet-mobile/src/features/RampOnOff/common/useShowBuyBannerSmall.tsx @@ -1,4 +1,4 @@ -import {isNumber, parseNumber, useStorage} from '@yoroi/common' +import {isNumber, parseNumber, useAsyncStorage} from '@yoroi/common' import {useQuery, UseQueryOptions} from 'react-query' import {useSelectedWallet} from '../../../SelectedWallet/Context/SelectedWalletContext' @@ -13,7 +13,7 @@ export const useShowBuyBannerSmall = (options?: UseQueryOptions { } const useCurrency = () => { - const storage = useStorage() + const storage = useAsyncStorage() const query = useQuery({ queryKey: ['currencySymbol'], queryFn: async () => { @@ -56,10 +56,10 @@ const useCurrency = () => { const useSaveCurrency = ({onSuccess, ...options}: UseMutationOptions = {}) => { const queryClient = useQueryClient() - const storage = useStorage() + const storage = useAsyncStorage() const mutation = useMutation({ - mutationFn: async (currencySymbol) => storage.join('appSettings/').setItem('currencySymbol', currencySymbol), + mutationFn: (currencySymbol) => storage.join('appSettings/').setItem('currencySymbol', currencySymbol), onSuccess: (data, variables, context) => { queryClient.invalidateQueries('currencySymbol') onSuccess?.(data, variables, context) diff --git a/apps/wallet-mobile/src/features/Settings/PrivacyMode/PrivacyMode.tsx b/apps/wallet-mobile/src/features/Settings/PrivacyMode/PrivacyMode.tsx index d7d8933877..d8c89a7aae 100644 --- a/apps/wallet-mobile/src/features/Settings/PrivacyMode/PrivacyMode.tsx +++ b/apps/wallet-mobile/src/features/Settings/PrivacyMode/PrivacyMode.tsx @@ -1,8 +1,8 @@ -import {parseSafe, useMutationWithInvalidations, useStorage} from '@yoroi/common' +import {parseSafe, useAsyncStorage, useMutationWithInvalidations} from '@yoroi/common' import {UseMutationOptions, useQuery} from 'react-query' export const useReadPrivacyMode = () => { - const storage = useStorage() + const storage = useAsyncStorage() const query = useQuery({ queryKey: ['privacyMode'], queryFn: async () => { @@ -20,9 +20,9 @@ export const useReadPrivacyMode = () => { } export const useWritePrivacyMode = ({...options}: UseMutationOptions = {}) => { - const storage = useStorage() + const storage = useAsyncStorage() const mutation = useMutationWithInvalidations({ - mutationFn: async (privacyMode) => storage.join('appSettings/').setItem('privacyMode', privacyMode), + mutationFn: (privacyMode) => storage.join('appSettings/').setItem('privacyMode', privacyMode), invalidateQueries: [['privacyMode']], ...options, }) @@ -31,12 +31,11 @@ export const useWritePrivacyMode = ({...options}: UseMutationOptions = {}) => { - const storage = useStorage() + const storage = useAsyncStorage() const privacyMode = useReadPrivacyMode() const mutation = useMutationWithInvalidations({ - mutationFn: async () => - storage.join('appSettings/').setItem('privacyMode', privacyMode === 'SHOWN' ? 'HIDDEN' : 'SHOWN'), + mutationFn: () => storage.join('appSettings/').setItem('privacyMode', privacyMode === 'SHOWN' ? 'HIDDEN' : 'SHOWN'), invalidateQueries: [['privacyMode']], ...options, }) diff --git a/apps/wallet-mobile/src/features/Settings/ScreenShare/ScreenShare.ts b/apps/wallet-mobile/src/features/Settings/ScreenShare/ScreenShare.ts index f3acaadbf4..78edfbbebc 100644 --- a/apps/wallet-mobile/src/features/Settings/ScreenShare/ScreenShare.ts +++ b/apps/wallet-mobile/src/features/Settings/ScreenShare/ScreenShare.ts @@ -1,4 +1,4 @@ -import {isBoolean, useMutationWithInvalidations, useStorage} from '@yoroi/common' +import {isBoolean, useAsyncStorage, useMutationWithInvalidations} from '@yoroi/common' import {useEffect, useState} from 'react' import {NativeModules, Platform} from 'react-native' import {useQuery} from 'react-query' @@ -6,7 +6,7 @@ import {useQuery} from 'react-query' const {FlagSecure} = NativeModules export const useChangeScreenShareSetting = () => { - const storage = useStorage() + const storage = useAsyncStorage() const mutation = useMutationWithInvalidations({ mutationFn: async (screenShareEnabled: boolean) => { @@ -25,7 +25,7 @@ export const useChangeScreenShareSetting = () => { } export const useScreenShareSettingEnabled = () => { - const storage = useStorage() + const storage = useAsyncStorage() return useQuery('screenShareEnabled', async () => { if (Platform.OS === 'android') { diff --git a/apps/wallet-mobile/src/features/Staking/Governance/common/helpers.ts b/apps/wallet-mobile/src/features/Staking/Governance/common/helpers.ts index cb7e61a2b0..de386749d7 100644 --- a/apps/wallet-mobile/src/features/Staking/Governance/common/helpers.ts +++ b/apps/wallet-mobile/src/features/Staking/Governance/common/helpers.ts @@ -1,4 +1,4 @@ -import {useStorage} from '@yoroi/common' +import {useAsyncStorage} from '@yoroi/common' import {type StakingKeyState, governanceApiMaker, governanceManagerMaker, useStakingKeyState} from '@yoroi/staking' import * as React from 'react' @@ -49,7 +49,7 @@ export const useIsGovernanceFeatureEnabled = (wallet: YoroiWallet) => { export const useGovernanceManagerMaker = () => { const {networkId, id: walletId} = useSelectedWallet() - const storage = useStorage() + const storage = useAsyncStorage() const governanceStorage = storage.join(`wallet/${walletId}/staking-governance/`) return React.useMemo( diff --git a/apps/wallet-mobile/src/i18n/LanguageProvider.tsx b/apps/wallet-mobile/src/i18n/LanguageProvider.tsx index 6794b9ecaa..a78bf43237 100644 --- a/apps/wallet-mobile/src/i18n/LanguageProvider.tsx +++ b/apps/wallet-mobile/src/i18n/LanguageProvider.tsx @@ -1,4 +1,6 @@ -import {parseSafe, useStorage} from '@yoroi/common' +/* eslint-disable @typescript-eslint/ban-ts-comment */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import {parseSafe, useAsyncStorage} from '@yoroi/common' import React, {useMemo} from 'react' import {IntlProvider} from 'react-intl' import {Text} from 'react-native' @@ -41,11 +43,12 @@ export const LanguageProvider = ({children}: {children: React.ReactNode}) => { return ( + {/* @ts-ignore types/react mistmatch */} {children} @@ -88,7 +91,7 @@ const missingProvider = () => { } const useLanguageCode = ({onSuccess, ...options}: UseQueryOptions = {}) => { - const storage = useStorage() + const storage = useAsyncStorage() const query = useQuery({ queryKey: ['languageCode'], queryFn: async () => { @@ -110,7 +113,7 @@ const useLanguageCode = ({onSuccess, ...options}: UseQueryOptions } const useSaveLanguageCode = ({onSuccess, ...options}: UseMutationOptions = {}) => { - const storage = useStorage() + const storage = useAsyncStorage() const queryClient = useQueryClient() const mutation = useMutation({ diff --git a/apps/wallet-mobile/src/metrics/metricsManager.tsx b/apps/wallet-mobile/src/metrics/metricsManager.tsx index e4a36038a9..c7482c8079 100644 --- a/apps/wallet-mobile/src/metrics/metricsManager.tsx +++ b/apps/wallet-mobile/src/metrics/metricsManager.tsx @@ -1,10 +1,11 @@ import {EnrichmentPlugin, Event, PluginType} from '@amplitude/analytics-types' -import {isKeyOf, parseBoolean, rootStorage} from '@yoroi/common' +import {isKeyOf, parseBoolean} from '@yoroi/common' import {App} from '@yoroi/types' import * as React from 'react' import Config from 'react-native-config' import {Logger} from '../yoroi-wallets/logging' +import {rootStorage} from '../yoroi-wallets/storage/rootStorage' import {Ampli, ampli} from './ampli' import {mockMetricsManager} from './mocks' diff --git a/apps/wallet-mobile/src/yoroi-wallets/auth/auth.ts b/apps/wallet-mobile/src/yoroi-wallets/auth/auth.ts index b142830849..ab1296dc8d 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/auth/auth.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/auth/auth.ts @@ -1,4 +1,4 @@ -import {parseSafe, parseString, useMutationWithInvalidations, useStorage} from '@yoroi/common' +import {parseSafe, parseString, useAsyncStorage, useMutationWithInvalidations} from '@yoroi/common' import {App} from '@yoroi/types' import * as React from 'react' import {defineMessages, useIntl} from 'react-intl' @@ -39,7 +39,7 @@ export const useAuthOsEnabled = (options?: UseQueryOptions) => { } export const useEnableAuthWithOs = (options?: UseMutationOptions) => { - const storage = useStorage() + const storage = useAsyncStorage() const queryClient = useQueryClient() const {authWithOs: enable, ...mutation} = useAuthWithOs({ ...options, @@ -132,7 +132,7 @@ export const useDisableAllEasyConfirmation = ( options?: UseMutationOptions, ) => { const walletManager = useWalletManager() - const storage = useStorage() + const storage = useAsyncStorage() const mutation = useMutationWithInvalidations({ mutationFn: async () => { await disableAllEasyConfirmation(storage) @@ -169,7 +169,7 @@ export const disableAllEasyConfirmation = async (storage: App.Storage) => { } export const useCreatePin = (options: UseMutationOptions) => { - const storage = useStorage() + const storage = useAsyncStorage() const appSettingsStorage = storage.join('appSettings/') const mutation = useMutationWithInvalidations({ invalidateQueries: [['authSetting']], @@ -191,7 +191,7 @@ export const useCreatePin = (options: UseMutationOptions) = const toHex = (text: string) => Buffer.from(text, 'utf8').toString('hex') export const useCheckPin = (options: UseMutationOptions = {}) => { - const storage = useStorage() + const storage = useAsyncStorage() const mutation = useMutation({ mutationFn: async (pin) => { const encryptedPinHash = await storage.join('appSettings/').getItem('customPinHash', parseString) @@ -216,7 +216,7 @@ export const useCheckPin = (options: UseMutationOptions } export const useAuthSetting = (options?: UseQueryOptions) => { - const storage = useStorage() + const storage = useAsyncStorage() const query = useQuery({ suspense: true, queryKey: ['authSetting'], diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/shelley/tests/mainnet/ShelleyWallet.test.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/shelley/tests/mainnet/ShelleyWallet.test.ts index 45ce667e16..a271e3e58c 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/shelley/tests/mainnet/ShelleyWallet.test.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/shelley/tests/mainnet/ShelleyWallet.test.ts @@ -1,11 +1,11 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import {Address} from '@emurgo/cross-csl-core' import AsyncStorage from '@react-native-async-storage/async-storage' -import {rootStorage} from '@yoroi/common' import {Balance} from '@yoroi/types' import {HWDeviceInfo} from '../../../../hw' import {EncryptedStorage, EncryptedStorageKeys} from '../../../../storage' +import {rootStorage} from '../../../../storage/rootStorage' import {DefaultAsset} from '../../../../types' import {WalletMeta} from '../../../../walletManager' import {ShelleyAddressGeneratorJSON} from '../../../chain' diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/shelley/tests/testnet/ShelleyWalletTestnet.test.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/shelley/tests/testnet/ShelleyWalletTestnet.test.ts index 9d651ade2c..39118925d1 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/shelley/tests/testnet/ShelleyWalletTestnet.test.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/shelley/tests/testnet/ShelleyWalletTestnet.test.ts @@ -1,11 +1,11 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import {Address} from '@emurgo/cross-csl-core' import AsyncStorage from '@react-native-async-storage/async-storage' -import {rootStorage} from '@yoroi/common' import {Balance} from '@yoroi/types' import {HWDeviceInfo} from '../../../../hw' import {EncryptedStorage, EncryptedStorageKeys} from '../../../../storage' +import {rootStorage} from '../../../../storage/rootStorage' import {DefaultAsset} from '../../../../types' import {WalletMeta} from '../../../../walletManager' import {ShelleyAddressGeneratorJSON} from '../../../chain' diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/transactionManager/transactionManager.test.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/transactionManager/transactionManager.test.ts index e76edbbe61..4ef3dc4c0e 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/transactionManager/transactionManager.test.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/transactionManager/transactionManager.test.ts @@ -1,8 +1,8 @@ import AsyncStorage from '@react-native-async-storage/async-storage' -import {rootStorage} from '@yoroi/common' import {fromPairs} from 'lodash' import DeviceInfo from 'react-native-device-info' +import {rootStorage} from '../../storage/rootStorage' import {ApiHistoryError} from '../errors' import { mockedAddressesByChunks, diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/utxoManager/utxoManager.test.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/utxoManager/utxoManager.test.ts index eb6d945958..4530a1f017 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/utxoManager/utxoManager.test.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/utxoManager/utxoManager.test.ts @@ -1,5 +1,4 @@ -import {rootStorage} from '@yoroi/common' - +import {rootStorage} from '../../storage/rootStorage' import {makeUtxoManagerStorage, makeUtxoStorage} from './utxoManager' describe('utxo manager storage', () => { diff --git a/apps/wallet-mobile/src/yoroi-wallets/hooks/index.ts b/apps/wallet-mobile/src/yoroi-wallets/hooks/index.ts index 64f96ec156..36e0fcc102 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/hooks/index.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/hooks/index.ts @@ -2,7 +2,7 @@ import {Certificate} from '@emurgo/cross-csl-core' import AsyncStorage, {AsyncStorageStatic} from '@react-native-async-storage/async-storage' import {useNavigation} from '@react-navigation/native' -import {parseBoolean, useMutationWithInvalidations, useStorage} from '@yoroi/common' +import {parseBoolean, useAsyncStorage, useMutationWithInvalidations} from '@yoroi/common' import {Api, App, Balance} from '@yoroi/types' import {Buffer} from 'buffer' import * as React from 'react' @@ -175,7 +175,7 @@ export const useSync = (wallet: YoroiWallet, options?: UseMutationOptions) => { - const storage = useStorage() + const storage = useAsyncStorage() const query = useQuery({ queryKey: [wallet.id, 'name'], queryFn: async () => { @@ -191,7 +191,7 @@ export const useWalletName = (wallet: YoroiWallet, options?: UseQueryOptions = {}) => { - const storage = useStorage() + const storage = useAsyncStorage() const mutation = useMutationWithInvalidations({ mutationFn: async (newName) => { const walletMeta = await storage.join('wallet/').getItem(wallet.id, parseWalletMeta) diff --git a/apps/wallet-mobile/src/yoroi-wallets/memos/memosManager.test.ts b/apps/wallet-mobile/src/yoroi-wallets/memos/memosManager.test.ts index 3a38e94bf1..693739b3f6 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/memos/memosManager.test.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/memos/memosManager.test.ts @@ -1,6 +1,6 @@ import AsyncStorage from '@react-native-async-storage/async-storage' -import {rootStorage} from '@yoroi/common' +import {rootStorage} from '../storage/rootStorage' import {makeMemosManager} from './memosManager' describe('memos manager', () => { diff --git a/apps/wallet-mobile/src/yoroi-wallets/migrations/4_9_0.test.ts b/apps/wallet-mobile/src/yoroi-wallets/migrations/4_9_0.test.ts index 450357172f..b461d87404 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/migrations/4_9_0.test.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/migrations/4_9_0.test.ts @@ -1,5 +1,4 @@ -import {rootStorage} from '@yoroi/common' - +import {rootStorage} from '../storage/rootStorage' import {migrateAuthSetting, OLD_OS_AUTH_KEY} from './4_9_0' describe('migrateAuthSetting', () => { const installationId = 'uuidv4' diff --git a/apps/wallet-mobile/src/yoroi-wallets/migrations/walletMeta.test.ts b/apps/wallet-mobile/src/yoroi-wallets/migrations/walletMeta.test.ts index 460d568b66..a6f4230f39 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/migrations/walletMeta.test.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/migrations/walletMeta.test.ts @@ -1,10 +1,10 @@ import AsyncStorage from '@react-native-async-storage/async-storage' -import {rootStorage} from '@yoroi/common' import assert from 'assert' import {expect} from 'chai' import {WALLET_CONFIG_24 as HASKELL_SHELLEY_24} from '../cardano/constants/mainnet/constants' import {WALLETS} from '../cardano/utils' +import {rootStorage} from '../storage/rootStorage' import {NETWORK_REGISTRY} from '../types' import {WalletMeta} from '../walletManager' import {migrateWalletMetas} from './walletMeta' diff --git a/apps/wallet-mobile/src/yoroi-wallets/migrations/walletMeta.ts b/apps/wallet-mobile/src/yoroi-wallets/migrations/walletMeta.ts index 10714f0f63..cd8298950d 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/migrations/walletMeta.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/migrations/walletMeta.ts @@ -1,10 +1,11 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import {parseSafe, rootStorage} from '@yoroi/common' +import {parseSafe} from '@yoroi/common' import {Logger} from '../../legacy/logging' import {CardanoTypes, legacyWalletChecksum, walletChecksum} from '../cardano/types' import {WALLETS} from '../cardano/utils' +import {rootStorage} from '../storage/rootStorage' import type {NetworkId, WalletImplementationId} from '../types/other' import {NETWORK_REGISTRY, WALLET_IMPLEMENTATION_REGISTRY} from '../types/other' import {WalletMeta} from '../walletManager' diff --git a/apps/wallet-mobile/src/yoroi-wallets/storage/EncryptedStorage.ts b/apps/wallet-mobile/src/yoroi-wallets/storage/EncryptedStorage.ts index e3d10a8a86..069d0f48ad 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/storage/EncryptedStorage.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/storage/EncryptedStorage.ts @@ -1,7 +1,8 @@ -import {parseString, rootStorage} from '@yoroi/common' +import {parseString} from '@yoroi/common' import {YoroiWallet} from '../cardano/types' import {decryptData, encryptData} from '../encryption' +import {rootStorage} from './rootStorage' type StorageKey = `${string}-MASTER_PASSWORD` export const EncryptedStorageKeys = { diff --git a/apps/wallet-mobile/src/yoroi-wallets/storage/rootStorage.ts b/apps/wallet-mobile/src/yoroi-wallets/storage/rootStorage.ts new file mode 100644 index 0000000000..932041c51c --- /dev/null +++ b/apps/wallet-mobile/src/yoroi-wallets/storage/rootStorage.ts @@ -0,0 +1,3 @@ +import {mountAsyncStorage} from '@yoroi/common' + +export const rootStorage = mountAsyncStorage('/') diff --git a/apps/wallet-mobile/src/yoroi-wallets/walletManager/walletManager.ts b/apps/wallet-mobile/src/yoroi-wallets/walletManager/walletManager.ts index 3869f95be0..e1a92ee64d 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/walletManager/walletManager.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/walletManager/walletManager.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import {parseSafe, rootStorage} from '@yoroi/common' +import {parseSafe} from '@yoroi/common' import {App} from '@yoroi/types' import ExtendableError from 'es6-error' import uuid from 'uuid' @@ -11,6 +11,7 @@ import {Logger} from '../logging' import {isWalletMeta, migrateWalletMetas, parseWalletMeta} from '../migrations/walletMeta' import {makeWalletEncryptedStorage} from '../storage' import {Keychain} from '../storage/Keychain' +import {rootStorage} from '../storage/rootStorage' import {NetworkId, WalletImplementationId} from '../types' export class WalletClosed extends ExtendableError {} diff --git a/apps/wallet-mobile/translations/messages/src/HW/LedgerConnect/LedgerConnect.json b/apps/wallet-mobile/translations/messages/src/HW/LedgerConnect/LedgerConnect.json index 375b12a573..e90899215d 100644 --- a/apps/wallet-mobile/translations/messages/src/HW/LedgerConnect/LedgerConnect.json +++ b/apps/wallet-mobile/translations/messages/src/HW/LedgerConnect/LedgerConnect.json @@ -4,14 +4,14 @@ "defaultMessage": "!!!Scanning bluetooth devices...", "file": "src/HW/LedgerConnect/LedgerConnect.tsx", "start": { - "line": 311, + "line": 315, "column": 11, - "index": 9810 + "index": 9898 }, "end": { - "line": 314, + "line": 318, "column": 3, - "index": 9944 + "index": 10032 } }, { @@ -19,14 +19,14 @@ "defaultMessage": "!!!You'll need to:", "file": "src/HW/LedgerConnect/LedgerConnect.tsx", "start": { - "line": 315, + "line": 319, "column": 13, - "index": 9959 + "index": 10047 }, "end": { - "line": 318, + "line": 322, "column": 3, - "index": 10081 + "index": 10169 } }, { @@ -34,14 +34,14 @@ "defaultMessage": "!!!USB device is ready, please tap on Confirm to continue.", "file": "src/HW/LedgerConnect/LedgerConnect.tsx", "start": { - "line": 319, + "line": 323, "column": 18, - "index": 10101 + "index": 10189 }, "end": { - "line": 322, + "line": 326, "column": 3, - "index": 10246 + "index": 10334 } }, { @@ -49,14 +49,14 @@ "defaultMessage": "!!!An error occurred while trying to connect with your hardware wallet:", "file": "src/HW/LedgerConnect/LedgerConnect.tsx", "start": { - "line": 323, + "line": 327, "column": 9, - "index": 10257 + "index": 10345 }, "end": { - "line": 326, + "line": 330, "column": 3, - "index": 10428 + "index": 10516 } } ] \ No newline at end of file diff --git a/apps/wallet-mobile/translations/messages/src/TxHistory/TxHistoryNavigator.json b/apps/wallet-mobile/translations/messages/src/TxHistory/TxHistoryNavigator.json index dc7405dce8..1ab21728db 100644 --- a/apps/wallet-mobile/translations/messages/src/TxHistory/TxHistoryNavigator.json +++ b/apps/wallet-mobile/translations/messages/src/TxHistory/TxHistoryNavigator.json @@ -6,12 +6,12 @@ "start": { "line": 358, "column": 16, - "index": 13489 + "index": 13499 }, "end": { "line": 361, "column": 3, - "index": 13578 + "index": 13588 } }, { @@ -21,12 +21,12 @@ "start": { "line": 362, "column": 13, - "index": 13593 + "index": 13603 }, "end": { "line": 365, "column": 3, - "index": 13666 + "index": 13676 } }, { @@ -36,12 +36,12 @@ "start": { "line": 366, "column": 17, - "index": 13685 + "index": 13695 }, "end": { "line": 369, "column": 3, - "index": 13762 + "index": 13772 } }, { @@ -51,12 +51,12 @@ "start": { "line": 370, "column": 15, - "index": 13779 + "index": 13789 }, "end": { "line": 373, "column": 3, - "index": 13852 + "index": 13862 } }, { @@ -66,12 +66,12 @@ "start": { "line": 374, "column": 21, - "index": 13875 + "index": 13885 }, "end": { "line": 377, "column": 3, - "index": 13970 + "index": 13980 } }, { @@ -81,12 +81,12 @@ "start": { "line": 378, "column": 14, - "index": 13986 + "index": 13996 }, "end": { "line": 381, "column": 3, - "index": 14067 + "index": 14077 } }, { @@ -96,12 +96,12 @@ "start": { "line": 382, "column": 13, - "index": 14082 + "index": 14092 }, "end": { "line": 385, "column": 3, - "index": 14162 + "index": 14172 } }, { @@ -111,12 +111,12 @@ "start": { "line": 386, "column": 18, - "index": 14182 + "index": 14192 }, "end": { "line": 389, "column": 3, - "index": 14283 + "index": 14293 } }, { @@ -126,12 +126,12 @@ "start": { "line": 390, "column": 20, - "index": 14305 + "index": 14315 }, "end": { "line": 393, "column": 3, - "index": 14394 + "index": 14404 } }, { @@ -141,12 +141,12 @@ "start": { "line": 394, "column": 26, - "index": 14422 + "index": 14432 }, "end": { "line": 397, "column": 3, - "index": 14526 + "index": 14536 } }, { @@ -156,12 +156,12 @@ "start": { "line": 398, "column": 19, - "index": 14547 + "index": 14557 }, "end": { "line": 401, "column": 3, - "index": 14640 + "index": 14650 } }, { @@ -171,12 +171,12 @@ "start": { "line": 402, "column": 16, - "index": 14658 + "index": 14668 }, "end": { "line": 405, "column": 3, - "index": 14744 + "index": 14754 } }, { @@ -186,12 +186,12 @@ "start": { "line": 406, "column": 19, - "index": 14765 + "index": 14775 }, "end": { "line": 412, "column": 3, - "index": 15003 + "index": 15013 } }, { @@ -201,12 +201,12 @@ "start": { "line": 413, "column": 27, - "index": 15032 + "index": 15042 }, "end": { "line": 416, "column": 3, - "index": 15125 + "index": 15135 } }, { @@ -216,12 +216,12 @@ "start": { "line": 417, "column": 13, - "index": 15140 + "index": 15150 }, "end": { "line": 420, "column": 3, - "index": 15215 + "index": 15225 } }, { @@ -231,12 +231,12 @@ "start": { "line": 421, "column": 25, - "index": 15242 + "index": 15252 }, "end": { "line": 424, "column": 3, - "index": 15316 + "index": 15326 } } ] \ No newline at end of file diff --git a/apps/wallet-mobile/translations/messages/src/yoroi-wallets/auth/auth.json b/apps/wallet-mobile/translations/messages/src/yoroi-wallets/auth/auth.json index 61196ba704..f546e35a68 100644 --- a/apps/wallet-mobile/translations/messages/src/yoroi-wallets/auth/auth.json +++ b/apps/wallet-mobile/translations/messages/src/yoroi-wallets/auth/auth.json @@ -6,12 +6,12 @@ "start": { "line": 253, "column": 13, - "index": 8382 + "index": 8412 }, "end": { "line": 256, "column": 3, - "index": 8489 + "index": 8519 } }, { @@ -21,12 +21,12 @@ "start": { "line": 257, "column": 19, - "index": 8510 + "index": 8540 }, "end": { "line": 260, "column": 3, - "index": 8621 + "index": 8651 } }, { @@ -36,12 +36,12 @@ "start": { "line": 261, "column": 16, - "index": 8639 + "index": 8669 }, "end": { "line": 264, "column": 3, - "index": 8746 + "index": 8776 } } ] \ No newline at end of file diff --git a/packages/common/src/storage/adapters/async-storage.test.ts b/packages/common/src/storage/adapters/async-storage.test.ts index cd95032e53..20fe854074 100644 --- a/packages/common/src/storage/adapters/async-storage.test.ts +++ b/packages/common/src/storage/adapters/async-storage.test.ts @@ -3,15 +3,16 @@ import AsyncStorage from '@react-native-async-storage/async-storage' import {App} from '@yoroi/types' import {parseSafe} from '../../helpers/parsers' -import {rootStorage} from './rootStorage' -import {mountMultiStorage} from './async-storage' +import {mountAsyncMultiStorage, mountAsyncStorage} from './async-storage' describe('prefixed storage', () => { beforeEach(() => AsyncStorage.clear()) it('getAllKeys, setItem, getItem, removeItem, clear', async () => { - const storage = rootStorage - await storage.getAllKeys().then((keys) => expect(keys).toEqual([])) + const storage = mountAsyncStorage('/') + await storage + .getAllKeys() + .then((keys: ReadonlyArray) => expect(keys).toEqual([])) await storage.setItem('item1', item1) expect(await storage.getItem('item1')).toEqual(item1) @@ -29,6 +30,7 @@ describe('prefixed storage', () => { }) it('getAllKeys, setItem, getItem, removeItem, clear, with prefix', async () => { + const rootStorage = mountAsyncStorage('/') const storage = rootStorage.join('prefix/') expect(await storage.getAllKeys()).toEqual([]) @@ -48,6 +50,7 @@ describe('prefixed storage', () => { }) it('getAllKeys, multiSet, multiGet, multiRemove', async () => { + const rootStorage = mountAsyncStorage('/') const storage = rootStorage.join('prefix/') await storage.multiSet([ @@ -70,10 +73,14 @@ describe('prefixed storage', () => { ['item2', null], ]) - await storage.getAllKeys().then((keys) => expect(keys).toEqual([])) + await storage + .getAllKeys() + .then((keys: ReadonlyArray) => expect(keys).toEqual([])) }) it('getAllKeys', async () => { + const rootStorage = mountAsyncStorage('/') + const storage1 = rootStorage.join('prefix/1/') expect(await storage1.getAllKeys()).toEqual([]) await storage1.setItem('key1', item1) @@ -94,6 +101,8 @@ describe('prefixed storage', () => { }) it('join', async () => { + const rootStorage = mountAsyncStorage('/') + const root = rootStorage.join('/') await root.setItem('key1', item1) await root.setItem('key2', item2) @@ -119,16 +128,16 @@ describe('prefixed storage', () => { describe('stringify/parse', () => { it('getItem, setItem', async () => { - const storage = rootStorage + const storage = mountAsyncStorage('/') const item = 'text' const storedItem = 'item123' - await storage.setItem('item', item, (data) => { + await storage.setItem('item', item, (data: unknown) => { expect(data).toBe(item) return storedItem }) // overrides JSON.stringify - const parsedResult = await storage.getItem('item', (data) => { + const parsedResult = await storage.getItem('item', (data: unknown) => { expect(data).toBe(storedItem) return item }) // overrides JSON.parse @@ -137,7 +146,7 @@ describe('prefixed storage', () => { }) it('multiGet, multiSet', async () => { - const storage = rootStorage + const storage = mountAsyncStorage('/') const item1 = 'item1' const storedItem1 = `${item1}-modified` const item2 = 'item2' @@ -147,14 +156,14 @@ describe('prefixed storage', () => { ['item2', item2], ] - await storage.multiSet(tuples, (data) => { + await storage.multiSet(tuples, (data: unknown) => { expect([item1, item2]).toContain(data) return `${data}-modified` }) // overrides JSON.stringify const parsedResult = await storage.multiGet( ['item1', 'item2'], - (data) => { + (data: string | null) => { expect([storedItem1, storedItem2]).toContain(data) return data?.slice(0, 5) }, @@ -165,6 +174,7 @@ describe('prefixed storage', () => { }) it('clears sub-storage', async () => { + const rootStorage = mountAsyncStorage('/') const storage1 = rootStorage.join('1/') const storage2 = storage1.join('2/') const storage3 = storage2.join('3/') @@ -197,6 +207,7 @@ describe('prefixed storage', () => { }) it('removeFolder', async () => { + const rootStorage = mountAsyncStorage('/') const storage1 = rootStorage.join('1/') const storage2 = storage1.join('2/') const storage3 = storage2.join('3/') @@ -241,7 +252,7 @@ describe('multi storage', () => { beforeEach(() => AsyncStorage.clear()) it('saveMany, readAll, readMany, keys, and clear providing the serializers', async () => { - const storage = mountMultiStorage(options) + const storage = mountAsyncMultiStorage(options) await storage.saveMany([item3, item4]) const readItems = await storage.readAll() @@ -262,7 +273,8 @@ describe('multi storage', () => { expect(emptyKeys).toEqual([]) }) it('saveMany, readAll, readMany, keys, and clear default serializers / key as extractor', async () => { - const storage = mountMultiStorage({ + const rootStorage = mountAsyncStorage('/') + const storage = mountAsyncMultiStorage({ storage: rootStorage.join('multiStorage/'), dataFolder: 'dataFolder/', keyExtractor: 'id', @@ -275,8 +287,10 @@ describe('multi storage', () => { ['2', item4], ]) + storage.removeMany(['2']) + const keys = await storage.getAllKeys() - expect(keys).toEqual(['1', '2']) + expect(keys).toEqual(['1']) const readItem = await storage.readMany(['1']) expect(readItem).toEqual([['1', item3]]) @@ -289,7 +303,7 @@ describe('multi storage', () => { }) const options: App.MultiStorageOptions = { - storage: rootStorage.join('multiStorage/'), + storage: mountAsyncStorage('/').join('multiStorage/'), dataFolder: 'dataFolder/', keyExtractor: (item: any) => item.id, serializer: JSON.stringify, diff --git a/packages/common/src/storage/adapters/async-storage.ts b/packages/common/src/storage/adapters/async-storage.ts index a96ba48234..0491f9e9dc 100644 --- a/packages/common/src/storage/adapters/async-storage.ts +++ b/packages/common/src/storage/adapters/async-storage.ts @@ -2,10 +2,12 @@ import AsyncStorage from '@react-native-async-storage/async-storage' import {App, Nullable} from '@yoroi/types' import {parseSafe} from '../../helpers/parsers' +import {isFolderKey} from '../helpers/is-folder-key' +import {isFileKey} from '../helpers/is-file-key' // ------- -// ADAPTER + "FACTORY" -export const mountStorage = (path: App.StorageFolderName): App.Storage => { +// FACTORY +export const mountAsyncStorage = (path: App.StorageFolderName): App.Storage => { const withPath = (key: string) => `${path}${key}` as `${App.StorageFolderName}${string}` const withoutPath = (value: string) => value.slice(path.length) @@ -37,7 +39,7 @@ export const mountStorage = (path: App.StorageFolderName): App.Storage => { return { join: (folderName: App.StorageFolderName) => - mountStorage(`${path}${folderName}`), + mountAsyncStorage(`${path}${folderName}`), getItem, multiGet, @@ -92,7 +94,7 @@ export const mountStorage = (path: App.StorageFolderName): App.Storage => { } as const } -export const mountMultiStorage = ( +export const mountAsyncMultiStorage = ( options: App.MultiStorageOptions, ): Readonly> => { const { @@ -122,6 +124,8 @@ export const mountMultiStorage = ( ) const readMany = (keysToRead: ReadonlyArray) => dataStorage.multiGet>(keysToRead, deserializer) + const removeMany = (keysToRead: ReadonlyArray) => + dataStorage.multiRemove(keysToRead) const getAllKeys = () => getAllKeysStorage().then((keys) => keys) return { @@ -130,12 +134,6 @@ export const mountMultiStorage = ( readAll, saveMany, readMany, + removeMany, } as const } - -// ------- -// HELPERS -const isFileKey = ({key, path}: {key: string; path: string}) => - !key.slice(path.length).includes('/') -const isFolderKey = ({key, path}: {key: string; path: string}) => - !isFileKey({key, path}) diff --git a/packages/common/src/storage/adapters/rootStorage.ts b/packages/common/src/storage/adapters/rootStorage.ts deleted file mode 100644 index eda729890f..0000000000 --- a/packages/common/src/storage/adapters/rootStorage.ts +++ /dev/null @@ -1,3 +0,0 @@ -import {mountStorage} from './async-storage' - -export const rootStorage = mountStorage('/') diff --git a/packages/common/src/storage/translators/storage-reactjs.test.tsx b/packages/common/src/storage/translators/storage-reactjs.test.tsx deleted file mode 100644 index a3dc0179c0..0000000000 --- a/packages/common/src/storage/translators/storage-reactjs.test.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import React from 'react' -import renderer from 'react-test-renderer' - -import {StorageProvider, useStorage} from './storage-reactjs' // Update with the actual module path -import {rootStorage} from '../adapters/rootStorage' - -describe('StorageProvider and useStorage Tests', () => { - test('StorageProvider provides storage context', () => { - const TestComponent = () => { - const storage = useStorage() - return
{storage ? 'Storage Available' : 'Storage Unavailable'}
- } - - const tree = renderer.create( - - - , - ) - - const treeInstance = tree.root - const textElement = treeInstance.findByType('div') - expect(textElement.props.children).toBe('Storage Available') - }) - - test('StorageProvider provides the default rootStorage context', () => { - const TestComponent = () => { - const storage = useStorage() - return
{storage ? 'Storage Available' : 'Storage Unavailable'}
- } - - const tree = renderer.create( - - - , - ) - - const treeInstance = tree.root - const textElement = treeInstance.findByType('div') - expect(textElement.props.children).toBe('Storage Available') - }) - - test('useStorage throws error without StorageProvider', () => { - const InvalidComponent = () => { - useStorage() - return
Invalid Component
- } - - // Suppress console error caused by the 'invalid' function - const originalError = console.error - console.error = jest.fn() - - expect(() => renderer.create()).toThrow( - 'Missing StorageProvider', - ) - - console.error = originalError - }) -}) diff --git a/packages/common/src/storage/translators/storage-reactjs.tsx b/packages/common/src/storage/translators/storage-reactjs.tsx deleted file mode 100644 index 884985909e..0000000000 --- a/packages/common/src/storage/translators/storage-reactjs.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react' -import {App} from '@yoroi/types' - -import {rootStorage} from '../adapters/rootStorage' -import {invalid} from '../../errors/errors' - -const StorageContext = React.createContext(undefined) -export const StorageProvider = ({ - children, - storage = rootStorage, -}: { - storage?: App.Storage - children: React.ReactNode -}) => { - return ( - - {children} - - ) -} - -export const useStorage = () => - React.useContext(StorageContext) ?? invalid('Missing StorageProvider') diff --git a/packages/resolver/src/adapters/api.ts b/packages/resolver/src/adapters/api.ts index 73d579d2b9..db5eac1f1c 100644 --- a/packages/resolver/src/adapters/api.ts +++ b/packages/resolver/src/adapters/api.ts @@ -53,7 +53,6 @@ export const resolverApiMaker = ( apiConfig[Resolver.NameServer.Unstoppable], ) const getCnsCryptoAddress = cnsApi.getCryptoAddress(cslFactory) - // @ts-expect-error TODO: bugfix on TS 5.4 (readonly array of readonly array) const operationsGetCryptoAddress: GetCryptoAddressOperations = [ [Resolver.NameServer.Handle, getHandleCryptoAddress], [Resolver.NameServer.Unstoppable, getUnstoppableCryptoAddress], diff --git a/packages/staking/src/governance/manager.test.ts b/packages/staking/src/governance/manager.test.ts index 9a01825537..9d5b331569 100644 --- a/packages/staking/src/governance/manager.test.ts +++ b/packages/staking/src/governance/manager.test.ts @@ -1,7 +1,7 @@ import {governanceManagerMaker, GovernanceAction} from './manager' import {init} from '@emurgo/cross-csl-nodejs' import {GovernanceApi, governanceApiMaker} from './api' -import {fetcher, mountStorage} from '@yoroi/common' +import {fetcher, mountAsyncStorage} from '@yoroi/common' const apiMock: GovernanceApi = { getDRepById: () => @@ -22,7 +22,7 @@ describe('createGovernanceManager', () => { walletId: 'walletId', networkId, cardano, - storage: mountStorage('wallet/'), + storage: mountAsyncStorage('wallet/'), api: governanceApiMaker({networkId, client: fetcher}), } From 82ebac6632d57c306c607fb2e3ec4fe6cdc75ebf Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:24:36 +0000 Subject: [PATCH 14/20] chore(common): added the async storage --- .../src/storage/adapters/mmkv-storage.test.ts | 310 ++++++++++++++++++ .../src/storage/adapters/mmkv-storage.ts | 170 ++++++++++ .../common/src/storage/helpers/is-file-key.ts | 2 + .../src/storage/helpers/is-folder-key.ts | 4 + .../async-storage-reactjs.test.tsx | 60 ++++ .../translators/async-storage-reactjs.tsx | 26 ++ .../translators/sync-storage-reactjs.test.tsx | 60 ++++ .../translators/sync-storage-reactjs.tsx | 25 ++ 8 files changed, 657 insertions(+) create mode 100644 packages/common/src/storage/adapters/mmkv-storage.test.ts create mode 100644 packages/common/src/storage/adapters/mmkv-storage.ts create mode 100644 packages/common/src/storage/helpers/is-file-key.ts create mode 100644 packages/common/src/storage/helpers/is-folder-key.ts create mode 100644 packages/common/src/storage/translators/async-storage-reactjs.test.tsx create mode 100644 packages/common/src/storage/translators/async-storage-reactjs.tsx create mode 100644 packages/common/src/storage/translators/sync-storage-reactjs.test.tsx create mode 100644 packages/common/src/storage/translators/sync-storage-reactjs.tsx diff --git a/packages/common/src/storage/adapters/mmkv-storage.test.ts b/packages/common/src/storage/adapters/mmkv-storage.test.ts new file mode 100644 index 0000000000..ea671f8915 --- /dev/null +++ b/packages/common/src/storage/adapters/mmkv-storage.test.ts @@ -0,0 +1,310 @@ +import {App} from '@yoroi/types' + +import {parseSafe} from '../../helpers/parsers' +import {mountMMKVMultiStorage, mountMMKVStorage} from './mmkv-storage' +import {MMKV} from 'react-native-mmkv' + +const mmkv = new MMKV({id: 'default.mmkv'}) +const rootStorage = mountMMKVStorage('/', 'default.mmkv', mmkv) + +describe('prefixed storage', () => { + beforeEach(() => rootStorage.clear()) + + it('getAllKeys, setItem, getItem, removeItem, clear', async () => { + const storage = mountMMKVStorage('/') + expect(storage.getAllKeys()).toEqual([]) + + storage.setItem('item1', item1) + expect(storage.getItem('item1')).toEqual(item1) + storage.setItem('item2', item2) + expect(storage.getItem('item2')).toEqual(item2) + expect(storage.getItem('does not exist')).toEqual(null) + expect(storage.getAllKeys()).toEqual(['item1', 'item2']) + + storage.removeItem('item1') + expect(storage.getItem('item1')).toEqual(null) + expect(storage.getAllKeys()).toEqual(['item2']) + + storage.clear() + expect(storage.getAllKeys()).toEqual([]) + }) + + it('getAllKeys, setItem, getItem, removeItem, clear, with prefix', async () => { + const storage = rootStorage.join('prefix/') + expect(storage.getAllKeys()).toEqual([]) + + storage.setItem('item1', item1) + expect(storage.getItem('item1')).toEqual(item1) + storage.setItem('item2', item2) + expect(storage.getItem('item2')).toEqual(item2) + expect(storage.getItem('does not exist')).toEqual(null) + expect(storage.getAllKeys()).toEqual(['item1', 'item2']) + + storage.removeItem('item1') + expect(storage.getItem('item1')).toEqual(null) + expect(storage.getAllKeys()).toEqual(['item2']) + + storage.clear() + expect(storage.getAllKeys()).toEqual([]) + }) + + it('getAllKeys, multiSet, multiGet, multiRemove', async () => { + const storage = rootStorage.join('prefix/') + + storage.multiSet([ + ['item1', item1], + ['item2', item2], + ]) + const keys = storage.getAllKeys() + expect(keys).toEqual(['item1', 'item2']) + + const items1 = storage.multiGet(['item1', 'item2']) + expect(items1).toEqual([ + ['item1', {a: 123, b: 234}], + ['item2', {c: 123, d: 234}], + ]) + + storage.multiRemove(['item1', 'item2']) + const items2 = storage.multiGet(['item1', 'item2']) + expect(items2).toEqual([ + ['item1', null], + ['item2', null], + ]) + + expect(storage.getAllKeys()).toEqual([]) + }) + + it('getAllKeys', async () => { + const storage1 = rootStorage.join('prefix/1/') + expect(storage1.getAllKeys()).toEqual([]) + storage1.setItem('key1', item1) + storage1.setItem('key2', item2) + expect(storage1.getAllKeys()).toEqual(['key1', 'key2']) + + const storage2 = rootStorage.join('prefix/2/3/') + expect(storage2.getAllKeys()).toEqual([]) + storage2.setItem('key1', item1) + storage2.setItem('key2', item2) + expect(storage2.getAllKeys()).toEqual(['key1', 'key2']) + + const storage = rootStorage.join('prefix/') + expect(storage.getAllKeys()).toEqual([]) + storage.setItem('key1', item1) + storage.setItem('key2', item2) + expect(storage.getAllKeys()).toEqual(['key1', 'key2']) + }) + + it('join', async () => { + const root = rootStorage.join('/') + root.setItem('key1', item1) + root.setItem('key2', item2) + expect(root.getAllKeys()).toEqual(['key1', 'key2']) + + const storage = root.join('dir/') + expect(storage.getAllKeys()).toEqual([]) + + storage.setItem('item1', item1) + expect(storage.getItem('item1')).toEqual(item1) + storage.setItem('item2', item2) + expect(storage.getItem('item2')).toEqual(item2) + expect(storage.getItem('does not exist')).toEqual(null) + expect(storage.getAllKeys()).toEqual(['item1', 'item2']) + + storage.removeItem('item1') + expect(storage.getItem('item1')).toEqual(null) + expect(storage.getAllKeys()).toEqual(['item2']) + + storage.clear() + expect(storage.getAllKeys()).toEqual([]) + }) + + describe('stringify/parse', () => { + it('getItem, setItem', async () => { + const item = 'text' + const storedItem = 'item123' + + rootStorage.setItem('item', item, (data: unknown) => { + expect(data).toBe(item) + return storedItem + }) // overrides JSON.stringify + + const parsedResult = rootStorage.getItem('item', (data: unknown) => { + expect(data).toBe(storedItem) + return item + }) // overrides JSON.parse + + expect(parsedResult).toBe(item) + }) + + it('multiGet, multiSet', async () => { + const item1 = 'item1' + const storedItem1 = `${item1}-modified` + const item2 = 'item2' + const storedItem2 = `${item2}-modified` + const tuples: [string, unknown][] = [ + ['item1', item1], + ['item2', item2], + ] + + rootStorage.multiSet(tuples, (data: unknown) => { + expect([item1, item2]).toContain(data) + return `${data}-modified` + }) // overrides JSON.stringify + + const parsedResult = rootStorage.multiGet( + ['item1', 'item2'], + (data: string | null) => { + expect([storedItem1, storedItem2]).toContain(data) + return data?.slice(0, 5) + }, + ) // overrides JSON.parse + + expect(parsedResult).toEqual(tuples) + }) + }) + + it('clears sub-storage', async () => { + const storage1 = rootStorage.join('1/') + const storage2 = storage1.join('2/') + const storage3 = storage2.join('3/') + + rootStorage.setItem('a', '000') + rootStorage.setItem('1', '000') + storage1.setItem('b', 111) + storage2.setItem('c', 222) + storage3.setItem('d', 333) + + expect(snapshot()).toEqual({ + // folder named "1" + '/1/2/3/d': 333, + '/1/2/c': 222, + '/1/b': 111, + + // file named "1" + '/1': '000', + '/a': '000', + }) + + expect(storage1.getAllKeys()).toEqual(['b']) + + storage1.clear() + + expect(snapshot()).toEqual({ + '/a': '000', + '/1': '000', + }) + }) + + it('removeFolder', async () => { + const storage1 = rootStorage.join('1/') + const storage2 = storage1.join('2/') + const storage3 = storage2.join('3/') + + rootStorage.setItem('a', '000') + rootStorage.setItem('1', '000') + storage1.setItem('b', 111) + storage2.setItem('c', 222) + storage3.setItem('d', 333) + + expect(snapshot()).toEqual({ + // folder named "1" + '/1/2/3/d': 333, + '/1/2/c': 222, + '/1/b': 111, + + // root folder + '/1': '000', + '/a': '000', + }) + + storage2.removeFolder('3/') + + expect(snapshot()).toEqual({ + '/1/2/c': 222, + '/1/b': 111, + + '/1': '000', + '/a': '000', + }) + + rootStorage.removeFolder('1/') + + expect(snapshot()).toEqual({ + '/1': '000', + '/a': '000', + }) + }) +}) + +describe('multi storage', () => { + it('saveMany, readAll, readMany, keys, and clear providing the serializers', async () => { + const storage = mountMMKVMultiStorage(options) + storage.saveMany([item3, item4]) + + const readItems = storage.readAll() + expect(readItems).toEqual([ + ['1', item3], + ['2', item4], + ]) + + const readItem = storage.readMany(['1']) + expect(readItem).toEqual([['1', item3]]) + + const keys = storage.getAllKeys() + expect(keys).toEqual(['1', '2']) + + storage.clear() + + const emptyKeys = storage.getAllKeys() + expect(emptyKeys).toEqual([]) + }) + it('saveMany, readAll, readMany, keys, and clear default serializers / key as extractor', async () => { + const storage = mountMMKVMultiStorage({ + storage: rootStorage.join('multiStorage/'), + dataFolder: 'dataFolder/', + keyExtractor: 'id', + }) + storage.saveMany([item3, item4]) + + const readItems = storage.readAll() + expect(readItems).toEqual([ + ['1', item3], + ['2', item4], + ]) + + const keys = storage.getAllKeys() + expect(keys).toEqual(['1', '2']) + + storage.removeMany(['2']) + const keysLeft = storage.getAllKeys() + expect(keysLeft).toEqual(['1']) + + const readItem = storage.readMany(['1']) + expect(readItem).toEqual([['1', item3]]) + + storage.clear() + + const emptyKeys = storage.getAllKeys() + expect(emptyKeys).toEqual([]) + }) +}) + +const options: App.MultiStorageOptions = { + storage: mountMMKVStorage('/').join('multiStorage/'), + dataFolder: 'dataFolder/', + keyExtractor: (item: any) => item.id, + serializer: JSON.stringify, + deserializer: (data: any) => JSON.parse(data as string), +} + +const item1 = {a: 123, b: 234} +const item2 = {c: 123, d: 234} +const item3 = {id: 1, a: 123, b: 234} +const item4 = {id: '2', c: 123, d: 234} + +const snapshot = () => { + const entries = mmkv + .getAllKeys() + .map((key) => [key, parseSafe(mmkv.getString(key))]) + return Object.fromEntries(entries) +} diff --git a/packages/common/src/storage/adapters/mmkv-storage.ts b/packages/common/src/storage/adapters/mmkv-storage.ts new file mode 100644 index 0000000000..982b534ff2 --- /dev/null +++ b/packages/common/src/storage/adapters/mmkv-storage.ts @@ -0,0 +1,170 @@ +import {MMKV} from 'react-native-mmkv' +import {App, Nullable} from '@yoroi/types' + +import {parseSafe} from '../../helpers/parsers' +import {isFolderKey} from '../helpers/is-folder-key' +import {isFileKey} from '../helpers/is-file-key' + +// ------- +// FACTORY +export const mountMMKVStorage = ( + path: App.StorageFolderName, + id: string = 'default.mmkv', + instance?: MMKV, +): App.Storage => { + // mmkv uses id as file and the path is irrelevant if sharing content amongst app (iOS) + // therefore the client needs to know all the ids to delete all data + // which means that it works differently than AsyncStorage + // think of the id as the volume + const storage = instance ?? new MMKV({id}) + + const withPath = (key: string) => + `${path}${key}` as `${App.StorageFolderName}${string}` + const withoutPath = (absolutePath: string) => absolutePath.slice(path.length) + + function join(folderToJoin: App.StorageFolderName) { + return mountMMKVStorage(`${path}${folderToJoin}`, id, storage) + } + + function getItem(key: string, parse: (item: string | null) => T): T + function getItem(key: string): T + function getItem(key: string, parse = parseSafe) { + const item = storage.getString(withPath(key)) ?? null + return parse(item) + } + + function multiGet( + keys: ReadonlyArray, + parse: (item: string | null) => T, + ): ReadonlyArray<[string, T]> + function multiGet( + keys: ReadonlyArray, + ): ReadonlyArray<[string, T]> + function multiGet(keys: ReadonlyArray, parse = parseSafe) { + const absolutePaths = keys.map((key) => withPath(key)) + return Object.freeze( + absolutePaths.map((key) => [ + withoutPath(key), + parse(storage.getString(key) ?? null), + ]), + ) + } + + function setItem(key: string, value: T): void + function setItem( + key: string, + value: T, + stringify: (data: T) => string, + ): void + function setItem( + key: string, + value: T, + stringify: (data: T) => string = JSON.stringify, + ) { + const item = stringify(value) + storage.set(withPath(key), item) + } + + function multiSet(tuples: ReadonlyArray<[key: string, value: unknown]>): void + function multiSet( + tuples: ReadonlyArray<[key: string, value: unknown]>, + stringify: (data: unknown) => string, + ): void + function multiSet( + tuples: ReadonlyArray<[key: string, value: unknown]>, + stringify: (data: unknown) => string = JSON.stringify, + ) { + tuples.forEach(([key, value]) => + storage.set(withPath(key), stringify(value)), + ) + } + + function removeItem(key: string) { + storage.delete(withPath(key)) + } + + function removeFolder(folderName: App.StorageFolderName) { + const keys = storage.getAllKeys() + const filteredKeys = keys.filter( + (key) => + key.startsWith(path) && + withoutPath(key).startsWith(folderName) && + isFolderKey({key, path}), + ) + filteredKeys.forEach((key) => storage.delete(key)) + } + + function multiRemove(keys: ReadonlyArray) { + const absolutePaths = keys.map((key) => withPath(key)) + absolutePaths.forEach((key) => storage.delete(key)) + } + + function getAllKeys() { + return Object.freeze( + storage + .getAllKeys() + .filter((key) => key.startsWith(path) && isFileKey({key, path})) + .map(withoutPath), + ) + } + + function clear() { + const keys = storage.getAllKeys() + const filteredKeys = keys.filter((key) => key.startsWith(path)) + + filteredKeys.forEach((key) => storage.delete(key)) + } + + return { + join, + getItem, + multiGet, + setItem, + multiSet, + removeItem, + removeFolder, + multiRemove, + getAllKeys, + clear, + } as const +} + +export const mountMMKVMultiStorage = ( + options: App.MultiStorageOptions, +): Readonly> => { + const { + storage, + dataFolder, + keyExtractor, + serializer = JSON.stringify, + deserializer = parseSafe as (item: string | null) => Nullable, + } = options + const dataStorage = storage.join(dataFolder) + const {getAllKeys, multiSet, multiGet} = dataStorage + + const clear = () => storage.removeFolder(dataFolder) + const saveMany = (items: ReadonlyArray>) => { + const entries: [string, T][] = items.map((item) => { + if (typeof keyExtractor === 'function') { + return [keyExtractor(item), item] + } + return [String(item[keyExtractor]), item] + }) + const entriesWithKeys = entries.filter(([key]) => key != null && key !== '') + return multiSet(entriesWithKeys, serializer as (item: unknown) => string) + } + const readAll = () => multiGet>(getAllKeys(), deserializer) + const readMany = (keys: ReadonlyArray) => + multiGet>(keys, deserializer) + const removeMany = (keys: ReadonlyArray) => + dataStorage.multiRemove(keys) + + return { + getAllKeys, + clear, + readAll, + saveMany, + readMany, + removeMany, + } as const +} diff --git a/packages/common/src/storage/helpers/is-file-key.ts b/packages/common/src/storage/helpers/is-file-key.ts new file mode 100644 index 0000000000..4ae4c1b43a --- /dev/null +++ b/packages/common/src/storage/helpers/is-file-key.ts @@ -0,0 +1,2 @@ +export const isFileKey = ({key, path}: {key: string; path: string}) => + !key.slice(path.length).includes('/') diff --git a/packages/common/src/storage/helpers/is-folder-key.ts b/packages/common/src/storage/helpers/is-folder-key.ts new file mode 100644 index 0000000000..206e3b9c6c --- /dev/null +++ b/packages/common/src/storage/helpers/is-folder-key.ts @@ -0,0 +1,4 @@ +import {isFileKey} from './is-file-key' + +export const isFolderKey = ({key, path}: {key: string; path: string}) => + !isFileKey({key, path}) diff --git a/packages/common/src/storage/translators/async-storage-reactjs.test.tsx b/packages/common/src/storage/translators/async-storage-reactjs.test.tsx new file mode 100644 index 0000000000..5dd447c0d5 --- /dev/null +++ b/packages/common/src/storage/translators/async-storage-reactjs.test.tsx @@ -0,0 +1,60 @@ +import React from 'react' +import renderer from 'react-test-renderer' + +import {AsyncStorageProvider, useAsyncStorage} from './async-storage-reactjs' // Update with the actual module path +import {mountAsyncStorage} from '../adapters/async-storage' + +const rootStorage = mountAsyncStorage('/') + +describe('AsyncStorageProvider and useAsyncStorage Tests', () => { + test('AsyncStorageProvider provides storage context', () => { + const TestComponent = () => { + const storage = useAsyncStorage() + return
{storage ? 'Storage Available' : 'Storage Unavailable'}
+ } + + const tree = renderer.create( + + + , + ) + + const treeInstance = tree.root + const textElement = treeInstance.findByType('div') + expect(textElement.props.children).toBe('Storage Available') + }) + + test('AsyncStorageProvider provides the default rootStorage context', () => { + const TestComponent = () => { + const storage = useAsyncStorage() + return
{storage ? 'Storage Available' : 'Storage Unavailable'}
+ } + + const tree = renderer.create( + + + , + ) + + const treeInstance = tree.root + const textElement = treeInstance.findByType('div') + expect(textElement.props.children).toBe('Storage Available') + }) + + test('useAsyncStorage throws error without AsyncStorageProvider', () => { + const InvalidComponent = () => { + useAsyncStorage() + return
Invalid Component
+ } + + // Suppress console error caused by the 'invalid' function + const originalError = console.error + console.error = jest.fn() + + expect(() => renderer.create()).toThrow( + 'Missing AsyncStorageProvider', + ) + + console.error = originalError + }) +}) diff --git a/packages/common/src/storage/translators/async-storage-reactjs.tsx b/packages/common/src/storage/translators/async-storage-reactjs.tsx new file mode 100644 index 0000000000..b6b6bf7385 --- /dev/null +++ b/packages/common/src/storage/translators/async-storage-reactjs.tsx @@ -0,0 +1,26 @@ +import React from 'react' +import {App} from '@yoroi/types' + +import {invalid} from '../../errors/errors' +import {mountAsyncStorage} from '../adapters/async-storage' + +const AsyncStorageContext = React.createContext( + undefined, +) +export const AsyncStorageProvider = ({ + children, + storage = mountAsyncStorage('/'), +}: { + storage?: App.Storage + children: React.ReactNode +}) => { + return ( + + {children} + + ) +} + +export const useAsyncStorage = () => + React.useContext(AsyncStorageContext) ?? + invalid('Missing AsyncStorageProvider') diff --git a/packages/common/src/storage/translators/sync-storage-reactjs.test.tsx b/packages/common/src/storage/translators/sync-storage-reactjs.test.tsx new file mode 100644 index 0000000000..4ca9beac6e --- /dev/null +++ b/packages/common/src/storage/translators/sync-storage-reactjs.test.tsx @@ -0,0 +1,60 @@ +import React from 'react' +import renderer from 'react-test-renderer' + +import {SyncStorageProvider, useSyncStorage} from './sync-storage-reactjs' // Update with the actual module path +import {mountMMKVStorage} from '../adapters/mmkv-storage' + +const rootStorage = mountMMKVStorage('/') + +describe('SyncStorageProvider and useSyncStorage Tests', () => { + test('SyncStorageProvider provides storage context', () => { + const TestComponent = () => { + const storage = useSyncStorage() + return
{storage ? 'Storage Available' : 'Storage Unavailable'}
+ } + + const tree = renderer.create( + + + , + ) + + const treeInstance = tree.root + const textElement = treeInstance.findByType('div') + expect(textElement.props.children).toBe('Storage Available') + }) + + test('SyncStorageProvider provides the default rootStorage context', () => { + const TestComponent = () => { + const storage = useSyncStorage() + return
{storage ? 'Storage Available' : 'Storage Unavailable'}
+ } + + const tree = renderer.create( + + + , + ) + + const treeInstance = tree.root + const textElement = treeInstance.findByType('div') + expect(textElement.props.children).toBe('Storage Available') + }) + + test('useSyncStorage throws error without SyncStorageProvider', () => { + const InvalidComponent = () => { + useSyncStorage() + return
Invalid Component
+ } + + // Suppress console error caused by the 'invalid' function + const originalError = console.error + console.error = jest.fn() + + expect(() => renderer.create()).toThrow( + 'Missing SyncStorageProvider', + ) + + console.error = originalError + }) +}) diff --git a/packages/common/src/storage/translators/sync-storage-reactjs.tsx b/packages/common/src/storage/translators/sync-storage-reactjs.tsx new file mode 100644 index 0000000000..1481b507d4 --- /dev/null +++ b/packages/common/src/storage/translators/sync-storage-reactjs.tsx @@ -0,0 +1,25 @@ +import React from 'react' +import {App} from '@yoroi/types' + +import {invalid} from '../../errors/errors' +import {mountMMKVStorage} from '../adapters/mmkv-storage' + +const SyncStorageContext = React.createContext>( + undefined, +) +export const SyncStorageProvider = ({ + children, + storage = mountMMKVStorage('/'), +}: { + storage?: App.Storage + children: React.ReactNode +}) => { + return ( + + {children} + + ) +} + +export const useSyncStorage = () => + React.useContext(SyncStorageContext) ?? invalid('Missing SyncStorageProvider') From c0ac1d8d10cec237de7fc38531941896a0a0e547 Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:24:59 +0000 Subject: [PATCH 15/20] chore(common): added the observable storage --- .../adapters/observable-storage.test.ts | 157 ++++++++++++++++++ .../storage/adapters/observable-storage.ts | 136 +++++++++++++++ 2 files changed, 293 insertions(+) create mode 100644 packages/common/src/storage/adapters/observable-storage.test.ts create mode 100644 packages/common/src/storage/adapters/observable-storage.ts diff --git a/packages/common/src/storage/adapters/observable-storage.test.ts b/packages/common/src/storage/adapters/observable-storage.test.ts new file mode 100644 index 0000000000..4772742700 --- /dev/null +++ b/packages/common/src/storage/adapters/observable-storage.test.ts @@ -0,0 +1,157 @@ +import {App} from '@yoroi/types' +import { + observableMultiStorageMaker, + observableStorageMaker, +} from './observable-storage' + +describe('observableStorageMaker', () => { + beforeEach(() => jest.resetAllMocks()) + + it('mmkv - should notify observers when storage methods are called', () => { + const storage: App.Storage = { + clear: jest.fn(), + multiSet: jest.fn(), + setItem: jest.fn(), + multiRemove: jest.fn(), + removeItem: jest.fn(), + getAllKeys: jest.fn(), + join: jest.fn(), + getItem: jest.fn(), + multiGet: jest.fn(), + removeFolder: jest.fn(), + } + const observerCallback = jest.fn() + + const observableStorage = observableStorageMaker(storage) + + const unsubscribe = observableStorage.onUpdate( + ['key1', 'key2'], + observerCallback, + ) + + observableStorage.clear() + expect(observerCallback).toHaveBeenCalledWith(null) + + observableStorage.setItem('key1', 'value1') + expect(observerCallback).toHaveBeenCalledWith(['key1']) + + observableStorage.multiRemove(['key1', 'key2']) + expect(observerCallback).toHaveBeenCalledWith(['key1', 'key2']) + + // untracked keys + observableStorage.multiSet([ + ['key3', 'valu3'], + ['key4', 'value4'], + ]) + + unsubscribe() + expect(storage.clear).toHaveBeenCalled() + expect(storage.setItem).toHaveBeenCalledWith('key1', 'value1') + expect(storage.multiRemove).toHaveBeenCalledWith(['key1', 'key2']) + }) + + it('async = should notify observers when storage promises are invoked', async () => { + const storage: App.Storage = { + clear: jest.fn().mockResolvedValue(undefined), + multiSet: jest.fn().mockResolvedValue(undefined), + setItem: jest.fn().mockResolvedValue(undefined), + multiRemove: jest.fn().mockResolvedValue(undefined), + removeItem: jest.fn().mockResolvedValue(undefined), + getAllKeys: jest.fn().mockResolvedValue([]), + join: jest.fn().mockResolvedValue(undefined), + getItem: jest.fn().mockResolvedValue(undefined), + multiGet: jest.fn().mockResolvedValue(undefined), + removeFolder: jest.fn().mockResolvedValue(undefined), + } + const observerCallback = jest.fn() + + const observableStorage = observableStorageMaker(storage) + + const unsubscribe = observableStorage.onUpdate( + ['key1', 'key2'], + observerCallback, + ) + + await observableStorage.clear() + expect(observerCallback).toHaveBeenCalledWith(null) + + await observableStorage.setItem('key1', 'value1') + expect(observerCallback).toHaveBeenCalledWith(['key1']) + + await observableStorage.multiRemove(['key1', 'key2']) + expect(observerCallback).toHaveBeenCalledWith(['key1', 'key2']) + + // untracked keys + await observableStorage.multiSet([ + ['key3', 'valu3'], + ['key4', 'value4'], + ]) + + unsubscribe() + expect(storage.clear).toHaveBeenCalled() + expect(storage.setItem).toHaveBeenCalledWith('key1', 'value1') + expect(storage.multiRemove).toHaveBeenCalledWith(['key1', 'key2']) + expect(storage.multiSet).toHaveBeenCalledWith([ + ['key3', 'valu3'], + ['key4', 'value4'], + ]) + }) +}) + +describe('observableMultiStorageMaker', () => { + beforeEach(() => jest.resetAllMocks()) + + it('mmkv - should notify observers when storage methods are called', () => { + const storage: App.MultiStorage<{id: string; value: string}, false> = { + clear: jest.fn(), + getAllKeys: jest.fn(), + readAll: jest.fn(), + readMany: jest.fn(), + saveMany: jest.fn(), + removeMany: jest.fn(), + } + const observerCallback = jest.fn() + + const observableStorage = observableMultiStorageMaker(storage) + + observableStorage.onUpdate(observerCallback) + + observableStorage.clear() + expect(observerCallback).toHaveBeenCalledWith(null) + + observableStorage.saveMany([{id: 'key1', value: 'value1'}]) + expect(observerCallback).toHaveBeenCalledWith(null) + + expect(storage.clear).toHaveBeenCalled() + expect(storage.saveMany).toHaveBeenCalledWith([ + {id: 'key1', value: 'value1'}, + ]) + }) + + it('async = should notify observers when storage promises are invoked', async () => { + const storage: App.MultiStorage<{id: string; value: string}, true> = { + clear: jest.fn().mockResolvedValue(undefined), + getAllKeys: jest.fn().mockResolvedValue([]), + readAll: jest.fn().mockResolvedValue([]), + readMany: jest.fn().mockResolvedValue([]), + saveMany: jest.fn().mockResolvedValue(undefined), + removeMany: jest.fn().mockResolvedValue(undefined), + } + const observerCallback = jest.fn() + + const observableStorage = observableMultiStorageMaker(storage) + + observableStorage.onUpdate(observerCallback) + + await observableStorage.clear() + expect(observerCallback).toHaveBeenCalledWith(null) + + await observableStorage.saveMany([{id: 'key1', value: 'value1'}]) + expect(observerCallback).toHaveBeenCalledWith(null) + + expect(storage.clear).toHaveBeenCalled() + expect(storage.saveMany).toHaveBeenCalledWith([ + {id: 'key1', value: 'value1'}, + ]) + }) +}) diff --git a/packages/common/src/storage/adapters/observable-storage.ts b/packages/common/src/storage/adapters/observable-storage.ts new file mode 100644 index 0000000000..961a1999ae --- /dev/null +++ b/packages/common/src/storage/adapters/observable-storage.ts @@ -0,0 +1,136 @@ +import {App} from '@yoroi/types' +import {observerMaker} from '../../observer/observer' +import {isString} from '../../helpers/parsers' +import {intersection} from '../../helpers/arrays' + +export const observableStorageMaker = ( + storage: App.Storage, +): App.ObservableStorage => { + const triggers: Array> = [ + 'clear', + // 'removeFolder', can be added later as long the key checks for "/" in the arg when string + 'multiSet', + 'setItem', + 'multiRemove', + 'removeItem', + ] + const observable = observerMaker() + + const onUpdate = ( + keysToObserve: ReadonlyArray, + callback: (keysAnnounced: ReadonlyArray | null) => void, + ) => { + const wrappedCallback = (keysUpdated: string[] | null) => { + if (!keysUpdated) { + callback(null) + } else { + const keysToAnnounce = intersection(keysToObserve, keysUpdated) + if (keysToAnnounce.length > 0) callback(keysToAnnounce) + } + } + return observable.subscribe(wrappedCallback) + } + + const proxyHandler = { + get( + target: App.Storage, + property: keyof App.Storage, + receiver: any, + ) { + const origProperty = target[property] + if (typeof origProperty === 'function' && triggers.includes(property)) { + const origMethod: (...args: any[]) => any = origProperty + return function (...args: any[]) { + const notify = () => { + const [firstArg] = args + const isArray = Array.isArray(firstArg) + if (isString(firstArg)) { + // single operations + observable.notify([firstArg]) + } else if (isArray) { + // multi operations + const keys = firstArg as string[] + observable.notify(keys) + } else { + // clear + observable.notify(null) + } + } + const result: ReturnType = origMethod.apply( + target, + args, + ) + + if (result instanceof Promise) { + return result.then((resolvedValue) => { + notify() + return resolvedValue + }) + } else { + notify() + return result + } + } + } + + return Reflect.get(target, property, receiver) + }, + } + + const proxiedStorage: App.Storage = new Proxy(storage, proxyHandler) + return { + ...proxiedStorage, + onUpdate, + } as const +} + +export const observableMultiStorageMaker = ( + storage: App.MultiStorage, +): App.ObservableMultiStorage => { + const triggers: Array> = [ + 'clear', + 'saveMany', + ] + const observable = observerMaker() + const onUpdate = (callback: () => void) => observable.subscribe(callback) + + const proxyHandler = { + get( + target: App.MultiStorage, + property: keyof App.MultiStorage, + receiver: any, + ) { + const origProperty = target[property] + if (typeof origProperty === 'function' && triggers.includes(property)) { + const origMethod: (...args: any[]) => any = origProperty + return function (...args: any[]) { + const result: ReturnType = origMethod.apply( + target, + args, + ) + + if (result instanceof Promise) { + return result.then((resolvedValue) => { + observable.notify(null) + return resolvedValue + }) + } else { + observable.notify(null) + return result + } + } + } + + return Reflect.get(target, property, receiver) + }, + } + + const proxiedStorage: App.MultiStorage = new Proxy( + storage, + proxyHandler, + ) + return { + ...proxiedStorage, + onUpdate, + } as const +} From d909d4af818938d2dc34a2fcd140e8a727bb3769 Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:25:35 +0000 Subject: [PATCH 16/20] chore(wallet-mobile): updated react-intl still types are wrong for native --- yarn.lock | 108 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 70 insertions(+), 38 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0ad4400e23..d51189dba2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3143,6 +3143,14 @@ "@formatjs/intl-localematcher" "0.4.0" tslib "^2.4.0" +"@formatjs/ecma402-abstract@1.18.2": + version "1.18.2" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz#bf103712a406874eb1e387858d5be2371ab3aa14" + integrity sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA== + dependencies: + "@formatjs/intl-localematcher" "0.5.4" + tslib "^2.4.0" + "@formatjs/fast-memoize@2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz#33bd616d2e486c3e8ef4e68c99648c196887802b" @@ -3159,6 +3167,15 @@ "@formatjs/icu-skeleton-parser" "1.6.0" tslib "^2.4.0" +"@formatjs/icu-messageformat-parser@2.7.6": + version "2.7.6" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.6.tgz#3d69806de056d2919d53dad895a5ff4851e4e9ff" + integrity sha512-etVau26po9+eewJKYoiBKP6743I1br0/Ie00Pb/S/PtmYfmjTcOn2YCh2yNkSZI12h6Rg+BOgQYborXk46BvkA== + dependencies: + "@formatjs/ecma402-abstract" "1.18.2" + "@formatjs/icu-skeleton-parser" "1.8.0" + tslib "^2.4.0" + "@formatjs/icu-skeleton-parser@1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.6.0.tgz#0728be8b6b3656f1a4b8e6e5b0e02dffffc23c6c" @@ -3167,6 +3184,14 @@ "@formatjs/ecma402-abstract" "1.17.0" tslib "^2.4.0" +"@formatjs/icu-skeleton-parser@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.0.tgz#5f3d3a620c687d6f8c180d80d1241e8f213acf79" + integrity sha512-QWLAYvM0n8hv7Nq5BEs4LKIjevpVpbGLAJgOaYzg9wABEoX1j0JO1q2/jVkO6CVlq0dbsxZCngS5aXbysYueqA== + dependencies: + "@formatjs/ecma402-abstract" "1.18.2" + tslib "^2.4.0" + "@formatjs/intl-datetimeformat@^6.7.0": version "6.10.0" resolved "https://registry.yarnpkg.com/@formatjs/intl-datetimeformat/-/intl-datetimeformat-6.10.0.tgz#4694781b19ffd0d18a30c2d569e12a0fd1493717" @@ -3176,13 +3201,13 @@ "@formatjs/intl-localematcher" "0.4.0" tslib "^2.4.0" -"@formatjs/intl-displaynames@6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-6.5.0.tgz#32737088e7d943fb3e22140e64bb634e0ba05fcf" - integrity sha512-sg/nR8ILEdUl+2sWu6jc1nQ5s04yucGlH1RVfatW8TSJ5uG3Yy3vgigi8NNC/BuhcncUNPWqSpTCSI1hA+rhiw== +"@formatjs/intl-displaynames@6.6.6": + version "6.6.6" + resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-6.6.6.tgz#be9fea4d24f577bb1a9d0f3ef4f2dcdabb4fe42d" + integrity sha512-Dg5URSjx0uzF8VZXtHb6KYZ6LFEEhCbAbKoYChYHEOnMFTw/ZU3jIo/NrujzQD2EfKPgQzIq73LOUvW6Z/LpFA== dependencies: - "@formatjs/ecma402-abstract" "1.17.0" - "@formatjs/intl-localematcher" "0.4.0" + "@formatjs/ecma402-abstract" "1.18.2" + "@formatjs/intl-localematcher" "0.5.4" tslib "^2.4.0" "@formatjs/intl-enumerator@1.3.2": @@ -3199,13 +3224,13 @@ dependencies: tslib "^2.4.0" -"@formatjs/intl-listformat@7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-7.4.0.tgz#fa8ac535d82fc716f052f2fd60eeaa7331362357" - integrity sha512-ifupb+balZUAF/Oh3QyGRqPRWGSKwWoMPR0cYZEG7r61SimD+m38oFQqVx/3Fp7LfQFF11m7IS+MlxOo2sKINA== +"@formatjs/intl-listformat@7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-7.5.5.tgz#e4c7d741f2201c65e7da71326726e61332c7161e" + integrity sha512-XoI52qrU6aBGJC9KJddqnacuBbPlb/bXFN+lIFVFhQ1RnFHpzuFrlFdjD9am2O7ZSYsyqzYRpkVcXeT1GHkwDQ== dependencies: - "@formatjs/ecma402-abstract" "1.17.0" - "@formatjs/intl-localematcher" "0.4.0" + "@formatjs/ecma402-abstract" "1.18.2" + "@formatjs/intl-localematcher" "0.5.4" tslib "^2.4.0" "@formatjs/intl-locale@^3.2.1": @@ -3225,6 +3250,13 @@ dependencies: tslib "^2.4.0" +"@formatjs/intl-localematcher@0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz#caa71f2e40d93e37d58be35cfffe57865f2b366f" + integrity sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g== + dependencies: + tslib "^2.4.0" + "@formatjs/intl-numberformat@^8.4.1": version "8.7.0" resolved "https://registry.yarnpkg.com/@formatjs/intl-numberformat/-/intl-numberformat-8.7.0.tgz#981bf87c13a08fcf72616f024805c6ecf6f54fd2" @@ -3252,17 +3284,17 @@ "@formatjs/intl-localematcher" "0.4.0" tslib "^2.4.0" -"@formatjs/intl@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.9.0.tgz#e1335572af3ca8a53e136a78e866f1851a9718c2" - integrity sha512-Ym0trUoC/VO6wQu4YHa0H1VR2tEixFRmwZgADkDLm7nD+vv1Ob+/88mUAoT0pwvirFqYKgUKEwp1tFepqyqvVA== +"@formatjs/intl@2.10.0": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.10.0.tgz#d7bb557e172ceb0bb0be9298b61e9de957119985" + integrity sha512-X3xT9guVkKDS86EKV80lS0KxoazUglkJTGZO66sKY7otgl0VeStPA8B3u8UkKT47PexVV98fUzjpkchYmbe9nw== dependencies: - "@formatjs/ecma402-abstract" "1.17.0" + "@formatjs/ecma402-abstract" "1.18.2" "@formatjs/fast-memoize" "2.2.0" - "@formatjs/icu-messageformat-parser" "2.6.0" - "@formatjs/intl-displaynames" "6.5.0" - "@formatjs/intl-listformat" "7.4.0" - intl-messageformat "10.5.0" + "@formatjs/icu-messageformat-parser" "2.7.6" + "@formatjs/intl-displaynames" "6.6.6" + "@formatjs/intl-listformat" "7.5.5" + intl-messageformat "10.5.11" tslib "^2.4.0" "@formatjs/ts-transformer@3.13.3", "@formatjs/ts-transformer@^3.13.0": @@ -13761,14 +13793,14 @@ intl-messageformat-parser@^1.2.0, intl-messageformat-parser@^1.8.1: resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz#0eb14c5618333be4c95c409457b66c8c33ddcc01" integrity sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg== -intl-messageformat@10.5.0: - version "10.5.0" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.5.0.tgz#86d11b15913ac954075b25253f5e669359f89538" - integrity sha512-AvojYuOaRb6r2veOKfTVpxH9TrmjSdc5iR9R5RgBwrDZYSmAAFVT+QLbW3C4V7Qsg0OguMp67Q/EoUkxZzXRGw== +intl-messageformat@10.5.11: + version "10.5.11" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.5.11.tgz#95d6a3b0b303f924d5d8c3f8d3ad057d1dc73c64" + integrity sha512-eYq5fkFBVxc7GIFDzpFQkDOZgNayNTQn4Oufe8jw6YY6OHVw70/4pA3FyCsQ0Gb2DnvEJEMmN2tOaXUGByM+kg== dependencies: - "@formatjs/ecma402-abstract" "1.17.0" + "@formatjs/ecma402-abstract" "1.18.2" "@formatjs/fast-memoize" "2.2.0" - "@formatjs/icu-messageformat-parser" "2.6.0" + "@formatjs/icu-messageformat-parser" "2.7.6" tslib "^2.4.0" invariant@*, invariant@2.2.4, invariant@^2.2.2, invariant@^2.2.4: @@ -19607,20 +19639,20 @@ react-intl-translations-manager@^5.0.3: json-stable-stringify "^1.0.1" mkdirp "^0.5.1" -react-intl@^6.4.1: - version "6.4.4" - resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-6.4.4.tgz#14b45ce046bfbb60c0e6d392d8ddc30e9ead5a4f" - integrity sha512-/C9Sl/5//ohfkNG6AWlJuf4BhTXsbzyk93K62A4zRhSPANyOGpKZ+fWhN+TLfFd5YjDUHy+exU/09y0w1bO4Xw== - dependencies: - "@formatjs/ecma402-abstract" "1.17.0" - "@formatjs/icu-messageformat-parser" "2.6.0" - "@formatjs/intl" "2.9.0" - "@formatjs/intl-displaynames" "6.5.0" - "@formatjs/intl-listformat" "7.4.0" +react-intl@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-6.6.2.tgz#97a044afa9cac65ae62f404c8bb9cbd3aec52d41" + integrity sha512-IpW2IkLtGENSFlX3vfH11rjuCIsW0VyjT0Q1pPKMZPtT2z1FxLt4weFT5Ezti2TScT1xiyb3aQBFth9EB7jzAg== + dependencies: + "@formatjs/ecma402-abstract" "1.18.2" + "@formatjs/icu-messageformat-parser" "2.7.6" + "@formatjs/intl" "2.10.0" + "@formatjs/intl-displaynames" "6.6.6" + "@formatjs/intl-listformat" "7.5.5" "@types/hoist-non-react-statics" "^3.3.1" "@types/react" "16 || 17 || 18" hoist-non-react-statics "^3.3.2" - intl-messageformat "10.5.0" + intl-messageformat "10.5.11" tslib "^2.4.0" "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0: From e50d025498b8b4e578eb740e2b78a8a8fda0772e Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:26:20 +0000 Subject: [PATCH 17/20] chore(common): updated exports --- packages/common/src/index.ts | 7 ++++--- packages/common/src/translators/reactjs/hooks/index.ts | 1 - packages/common/src/translators/reactjs/index.ts | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) delete mode 100644 packages/common/src/translators/reactjs/hooks/index.ts delete mode 100644 packages/common/src/translators/reactjs/index.ts diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index cc68091f4b..13cb6d1d32 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -3,11 +3,12 @@ export * from './errors/errors' export * from './helpers/parsers' export * from './helpers/strings' export * from './storage/adapters/async-storage' -export * from './storage/translators/storage-reactjs' -export * from './storage/adapters/rootStorage' +export * from './storage/adapters/mmkv-storage' +export * from './storage/translators/sync-storage-reactjs' +export * from './storage/translators/async-storage-reactjs' export * from './api/fetcher' export * from './api/fetchData' export * from './api/handleApiError' export * from './observer/observer' -export * from './translators/reactjs' +export * from './translators/reactjs/hooks/useMutationWithInvalidations' export * from './helpers/monads' diff --git a/packages/common/src/translators/reactjs/hooks/index.ts b/packages/common/src/translators/reactjs/hooks/index.ts deleted file mode 100644 index 7e30e92f63..0000000000 --- a/packages/common/src/translators/reactjs/hooks/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {useMutationWithInvalidations} from './useMutationWithInvalidations' diff --git a/packages/common/src/translators/reactjs/index.ts b/packages/common/src/translators/reactjs/index.ts deleted file mode 100644 index fc78d35129..0000000000 --- a/packages/common/src/translators/reactjs/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './hooks' From 29b58bcbb88503d5f7f88017a03c6b770eb3d804 Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Tue, 13 Feb 2024 13:08:50 +0000 Subject: [PATCH 18/20] chore(common): CR unsubscribe listeners --- packages/common/src/observer/observer.test.ts | 12 ++++++++---- .../src/storage/adapters/observable-storage.test.ts | 6 ++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/common/src/observer/observer.test.ts b/packages/common/src/observer/observer.test.ts index c3937f5532..8b37bd2d5e 100644 --- a/packages/common/src/observer/observer.test.ts +++ b/packages/common/src/observer/observer.test.ts @@ -19,11 +19,13 @@ describe('Observer', () => { }) it('should allow multiple subscribers to subscribe', () => { - observer.subscribe(mockSubscriber1) - observer.subscribe(mockSubscriber2) + const unsubscribe1 = observer.subscribe(mockSubscriber1) + const unsubscribe2 = observer.subscribe(mockSubscriber2) observer.notify(42) expect(mockSubscriber1).toHaveBeenCalledWith(42) expect(mockSubscriber2).toHaveBeenCalledWith(42) + unsubscribe1() + unsubscribe2() }) it('should allow subscribers to unsubscribe', () => { @@ -38,11 +40,13 @@ describe('Observer', () => { }) it('should allow destroying all subscriptions', () => { - observer.subscribe(mockSubscriber1) - observer.subscribe(mockSubscriber2) + const unsubscribe1 = observer.subscribe(mockSubscriber1) + const unsubscribe2 = observer.subscribe(mockSubscriber2) observer.destroy() observer.notify(42) expect(mockSubscriber1).not.toHaveBeenCalled() expect(mockSubscriber2).not.toHaveBeenCalled() + unsubscribe1() + unsubscribe2() }) }) diff --git a/packages/common/src/storage/adapters/observable-storage.test.ts b/packages/common/src/storage/adapters/observable-storage.test.ts index 4772742700..46fa9ead2f 100644 --- a/packages/common/src/storage/adapters/observable-storage.test.ts +++ b/packages/common/src/storage/adapters/observable-storage.test.ts @@ -114,7 +114,7 @@ describe('observableMultiStorageMaker', () => { const observableStorage = observableMultiStorageMaker(storage) - observableStorage.onUpdate(observerCallback) + const unsubscribe = observableStorage.onUpdate(observerCallback) observableStorage.clear() expect(observerCallback).toHaveBeenCalledWith(null) @@ -122,6 +122,7 @@ describe('observableMultiStorageMaker', () => { observableStorage.saveMany([{id: 'key1', value: 'value1'}]) expect(observerCallback).toHaveBeenCalledWith(null) + unsubscribe() expect(storage.clear).toHaveBeenCalled() expect(storage.saveMany).toHaveBeenCalledWith([ {id: 'key1', value: 'value1'}, @@ -141,7 +142,7 @@ describe('observableMultiStorageMaker', () => { const observableStorage = observableMultiStorageMaker(storage) - observableStorage.onUpdate(observerCallback) + const unsubscribe = observableStorage.onUpdate(observerCallback) await observableStorage.clear() expect(observerCallback).toHaveBeenCalledWith(null) @@ -149,6 +150,7 @@ describe('observableMultiStorageMaker', () => { await observableStorage.saveMany([{id: 'key1', value: 'value1'}]) expect(observerCallback).toHaveBeenCalledWith(null) + unsubscribe() expect(storage.clear).toHaveBeenCalled() expect(storage.saveMany).toHaveBeenCalledWith([ {id: 'key1', value: 'value1'}, From ecdcd0a4503f5d7a49dad170096a7280db6b85bf Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Tue, 13 Feb 2024 13:12:58 +0000 Subject: [PATCH 19/20] chore(wallet-mobile): explicit initialization of storage provider --- apps/wallet-mobile/src/YoroiApp.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/wallet-mobile/src/YoroiApp.tsx b/apps/wallet-mobile/src/YoroiApp.tsx index 33f05d6a0c..d6a26fe364 100644 --- a/apps/wallet-mobile/src/YoroiApp.tsx +++ b/apps/wallet-mobile/src/YoroiApp.tsx @@ -44,7 +44,7 @@ export const YoroiApp = () => { const migrated = useMigrations(rootStorage) // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions return migrated ? ( - + From 64887a014513d8f57e567da807dfda96f03299f3 Mon Sep 17 00:00:00 2001 From: Juliano Lazzarotto <30806844+stackchain@users.noreply.github.com> Date: Tue, 13 Feb 2024 15:01:27 +0000 Subject: [PATCH 20/20] chore(common): CR added tests to helpers --- .../src/storage/helpers/is-file-key.test.ts | 23 ++++++++++++++ .../src/storage/helpers/is-folder-key.test.ts | 31 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 packages/common/src/storage/helpers/is-file-key.test.ts create mode 100644 packages/common/src/storage/helpers/is-folder-key.test.ts diff --git a/packages/common/src/storage/helpers/is-file-key.test.ts b/packages/common/src/storage/helpers/is-file-key.test.ts new file mode 100644 index 0000000000..8d94367abc --- /dev/null +++ b/packages/common/src/storage/helpers/is-file-key.test.ts @@ -0,0 +1,23 @@ +import {isFileKey} from './is-file-key' + +describe('isFileKey', () => { + it('returns true for a key under the path', () => { + expect(isFileKey({key: 'path/to/key', path: 'path/to/'})).toBeTruthy() + }) + + it('returns false for a key under another path', () => { + expect(isFileKey({key: 'path/another/key', path: 'path/to/'})).toBeFalsy() + }) + + it('handles no trailing slash in path', () => { + expect(isFileKey({key: 'path/to/file', path: 'path/to'})).toBeFalsy() + }) + + it('returns true when providing the key without path', () => { + expect(isFileKey({key: 'file', path: 'path/to/'})).toBeTruthy() + }) + + it('returns true when empty key and path', () => { + expect(isFileKey({key: '', path: ''})).toBeTruthy() + }) +}) diff --git a/packages/common/src/storage/helpers/is-folder-key.test.ts b/packages/common/src/storage/helpers/is-folder-key.test.ts new file mode 100644 index 0000000000..7eff3146c9 --- /dev/null +++ b/packages/common/src/storage/helpers/is-folder-key.test.ts @@ -0,0 +1,31 @@ +import {isFolderKey} from './is-folder-key' + +describe('isFolderKey', () => { + it('returns false for a direct file under the path', () => { + expect(isFolderKey({key: 'path/to/key', path: 'path/to/'})).toBeFalsy() + }) + + it('returns true for a directory under the path', () => { + expect( + isFolderKey({key: 'path/to/directory/', path: 'path/to/'}), + ).toBeTruthy() + }) + + it('returns true for deeper directories', () => { + expect( + isFolderKey({key: 'path/to/deeper/dir/', path: 'path/to/'}), + ).toBeTruthy() + }) + + it('returns false when empty path', () => { + expect(isFolderKey({key: '', path: ''})).toBeFalsy() + }) + + it('returns false when key is the same as path', () => { + expect(isFolderKey({key: 'path/to/', path: 'path/to/'})).toBeFalsy() + }) + + it('considers key with path as key, thus false for folder', () => { + expect(isFolderKey({key: 'path/to/key', path: 'path/to/'})).toBeFalsy() + }) +})