diff --git a/.reassure/current.perf b/.reassure/current.perf new file mode 100644 index 00000000000..7604caafb8c --- /dev/null +++ b/.reassure/current.perf @@ -0,0 +1,2 @@ +{"metadata":{"creationDate":"2024-07-04T00:10:12.126Z","branch":"main","commitHash":"8db254ad21c577e266eeebeb10bb3f64dae02947"}} +{"name":"RN CLI - WalletActions 10 runs","type":"render","runs":10,"meanDuration":3.5,"stdevDuration":0.5270462766947299,"durations":[3,4,4,3,3,4,3,4,4,3],"warmupDurations":[102],"meanCount":1,"stdevCount":0,"counts":[1,1,1,1,1,1,1,1,1,1],"issues":{"initialUpdateCount":0,"redundantUpdates":[]}} diff --git a/app/components/Views/Wallet/ignore.tsx b/app/components/Views/Wallet/ignore.tsx new file mode 100644 index 00000000000..f572f125d05 --- /dev/null +++ b/app/components/Views/Wallet/ignore.tsx @@ -0,0 +1,117 @@ +/* import React from 'react'; +import { measureRenders } from 'reassure'; +import Wallet from './'; // Adjust the import path if necessary +import { Provider } from 'react-redux'; +import configureMockStore from 'redux-mock-store'; +import { mockInitialState } from './index.test'; +import { createMockAccountsControllerState } from '../../../util/test/accountsControllerTestUtils'; + +import Engine from '../../../core/Engine'; +const mockEngine = Engine; +const MOCK_ADDRESS = '0xc4955c0d639d99699bfd7ec54d9fafee40e4d272'; + +const MOCK_ACCOUNTS_CONTROLLER_STATE = createMockAccountsControllerState([ + MOCK_ADDRESS, +]); +jest.mock('../../../core/Engine', () => ({ + init: () => mockEngine.init({}), + getTotalFiatAccountBalance: jest.fn(), + context: { + PreferencesController: { + selectedAddress: MOCK_ADDRESS, + identities: { + [MOCK_ADDRESS]: { + name: 'Account 1', + address: MOCK_ADDRESS, + }, + }, + }, + NftController: { + allNfts: { + [MOCK_ADDRESS]: { + [MOCK_ADDRESS]: [], + }, + }, + allNftContracts: { + [MOCK_ADDRESS]: { + [MOCK_ADDRESS]: [], + }, + }, + }, + TokenRatesController: { + poll: jest.fn(), + }, + TokenDetectionController: { + detectTokens: jest.fn(), + }, + NftDetectionController: { + detectNfts: jest.fn(), + }, + AccountTrackerController: { + refresh: jest.fn(), + }, + KeyringController: { + state: { + keyrings: [ + { + accounts: ['0xC4955C0d639D99699Bfd7Ec54d9FaFEe40e4D272'], + }, + ], + }, + }, + AccountsController: { + ...MOCK_ACCOUNTS_CONTROLLER_STATE, + }, + }, +})); + +jest.mock('react-redux', () => ({ + ...jest.requireActual('react-redux'), + useSelector: jest + .fn() + .mockImplementation((callback) => callback(mockInitialState)), +})); + +jest.mock('@react-navigation/native', () => { + const actualNav = jest.requireActual('@react-navigation/native'); + return { + ...actualNav, + useNavigation: () => ({ + navigate: jest.fn(), + setOptions: jest.fn(), + goBack: jest.fn(), + reset: jest.fn(), + dangerouslyGetParent: () => ({ + pop: jest.fn(), + }), + }), + }; +}); + +jest.mock('react-native-scrollable-tab-view', () => { + const ScrollableTabViewMock = jest + .fn() + .mockImplementation(() => ScrollableTabViewMock); + // TODO - Clean up mock. + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + ScrollableTabViewMock.defaultProps = { + onChangeTab: jest.fn(), + renderTabBar: jest.fn(), + }; + return ScrollableTabViewMock; +}); + +// Mock store setup +const mockStore = configureMockStore(); +const store = mockStore(mockInitialState); + +test('Simple test', async () => { + const test = await measureRenders( + + + , + ); + console.log('ENTER test', test); +}); + */ diff --git a/app/components/Views/Wallet/index.test.tsx b/app/components/Views/Wallet/index.test.tsx index ad0765d26c4..556b655853b 100644 --- a/app/components/Views/Wallet/index.test.tsx +++ b/app/components/Views/Wallet/index.test.tsx @@ -71,7 +71,16 @@ jest.mock('../../../core/Engine', () => ({ }, })); -const mockInitialState = { +// eslint-disable-next-line import/prefer-default-export +export const mockInitialState = { + navigation: { + currentRoute: 'WalletView', + currentBottomNavRoute: 'Wallet', + }, + legalNotices: { + newPrivacyPolicyToastShownDate: null, + newPrivacyPolicyToastClickedOrClosed: false, + }, networkOnboarded: { networkOnboardedState: { '0x1': true, diff --git a/app/components/Views/WalletActions/WalletActions.perf-test.tsx b/app/components/Views/WalletActions/WalletActions.perf-test.tsx new file mode 100644 index 00000000000..659e3ea8a30 --- /dev/null +++ b/app/components/Views/WalletActions/WalletActions.perf-test.tsx @@ -0,0 +1,132 @@ +import React from 'react'; +import { measureRenders } from 'reassure'; +import WalletActions from './WalletActions'; +import { fireEvent, screen } from '@testing-library/react-native'; +import { WalletActionsModalSelectorsIDs } from '../../../../e2e/selectors/Modals/WalletActionsModal.selectors'; +import { createMockAccountsControllerState } from '../../../util/test/accountsControllerTestUtils'; +import initialBackgroundState from '../../../util/test/initial-background-state.json'; +jest.setTimeout(600_000); +const MOCK_ADDRESS = '0xc4955c0d639d99699bfd7ec54d9fafee40e4d272'; + +const MOCK_ACCOUNTS_CONTROLLER_STATE = createMockAccountsControllerState([ + MOCK_ADDRESS, +]); +const mockInitialState = { + fiatOrders: { + networks: [], + }, + browser: { + tabs: [], + }, + navigation: { + currentRoute: 'WalletView', + currentBottomNavRoute: 'Wallet', + }, + legalNotices: { + newPrivacyPolicyToastShownDate: null, + newPrivacyPolicyToastClickedOrClosed: false, + }, + networkOnboarded: { + networkOnboardedState: { + '0x1': true, + }, + }, + security: { + dataCollectionForMarketing: true, + }, + swaps: { + [MOCK_ADDRESS]: { isLive: true }, + hasOnboarded: false, + isLive: true, + }, + wizard: { + step: 0, + }, + settings: { + primaryCurrency: 'usd', + }, + engine: { + backgroundState: { + ...initialBackgroundState, + PreferencesController: { + selectedAddress: MOCK_ADDRESS, + identities: { + [MOCK_ADDRESS]: { + name: 'Account 1', + address: MOCK_ADDRESS, + }, + }, + }, + AccountsController: { + ...MOCK_ACCOUNTS_CONTROLLER_STATE, + }, + }, + }, +}; + +jest.mock('react-native-safe-area-context', () => { + // using disting digits for mock rects to make sure they are not mixed up + const inset = { top: 1, right: 2, bottom: 3, left: 4 }; + const frame = { width: 5, height: 6, x: 7, y: 8 }; + return { + SafeAreaProvider: jest.fn().mockImplementation(({ children }) => children), + SafeAreaConsumer: jest + .fn() + .mockImplementation(({ children }) => children(inset)), + useSafeAreaInsets: jest.fn().mockImplementation(() => inset), + useSafeAreaFrame: jest.fn().mockImplementation(() => frame), + }; +}); +jest.mock('@react-navigation/native', () => { + const actualNav = jest.requireActual('@react-navigation/native'); + return { + ...actualNav, + useNavigation: () => ({ + navigate: jest.fn(), + setOptions: jest.fn(), + goBack: jest.fn(), + reset: jest.fn(), + dangerouslyGetParent: () => ({ + pop: jest.fn(), + }), + }), + }; +}); + +const mockDispatch = jest.fn(); + +jest.mock('react-redux', () => ({ + ...jest.requireActual('react-redux'), + useDispatch: jest.fn().mockImplementation(() => mockDispatch), + useSelector: jest + .fn() + .mockImplementation((callback) => callback(mockInitialState)), +})); + +test('RN CLI - WalletActions 10 runs', async () => { + const scenario = async () => { + const button = screen.getByTestId( + WalletActionsModalSelectorsIDs.SEND_BUTTON, + ); + + /* fireEvent.press(button); + + await screen.findByText('Cancel'); */ + }; + + await measureRenders( /* , { scenario, runs: 1 } */); +}); + +/* test('RN CLI - WalletActions 50 runs', async () => { + const scenario = async () => { + const button = screen.getByTestId( + WalletActionsModalSelectorsIDs.SEND_BUTTON, + ); + + /* fireEvent.press(button); + + await screen.findByText('Cancel'); + }; + + await measureRenders(, { scenario, runs: 50 }); +}); */ diff --git a/package.json b/package.json index 4fe7634522e..03835c591d6 100644 --- a/package.json +++ b/package.json @@ -472,6 +472,7 @@ "react-native-svg-asset-plugin": "^0.5.0", "react-native-svg-transformer": "^1.0.0", "react-test-renderer": "18.2.0", + "reassure": "^1.0.0", "regenerator-runtime": "0.13.9", "rn-nodeify": "10.3.0", "serve-handler": "^6.1.5", @@ -571,4 +572,4 @@ } }, "packageManager": "yarn@1.22.22" -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index 30a497d0534..d04966a9f65 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1261,6 +1261,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.24.4": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" + integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.0.0", "@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" @@ -1300,6 +1307,48 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@callstack/reassure-cli@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@callstack/reassure-cli/-/reassure-cli-1.0.0.tgz#e7ca13c5fab18bab3121c5fd42789470deb33a03" + integrity sha512-Yhej/XmB1mFAwBYHYZacj98U1+9fDZqrBxsA82Elk+omnEG0zWI4/9TFKKgMzOz72hb8Y7eKLIDZx6NJyWGqKg== + dependencies: + "@callstack/reassure-compare" "1.0.0" + "@callstack/reassure-logger" "1.0.0" + chalk "4.1.2" + simple-git "^3.24.0" + yargs "^17.7.2" + +"@callstack/reassure-compare@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@callstack/reassure-compare/-/reassure-compare-1.0.0.tgz#4f02471934b4166db331c5abefb907ac69ab4d7c" + integrity sha512-kezQ24tzQjjxCKuLzob4Bz6ZhQ5nTLXAeuvwf+FV3jlZ2LSJDaURiNqq7m5NrHYWL5XhZ7zZOATtlVjFwHBfrA== + dependencies: + "@callstack/reassure-logger" "1.0.0" + markdown-table "^2.0.0" + ts-regex-builder "^1.7.1" + zod "^3.23.8" + +"@callstack/reassure-danger@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@callstack/reassure-danger/-/reassure-danger-1.0.0.tgz#ad53a2c6fee797c854e0513d7c82dadce1251a04" + integrity sha512-0Abokqoed4vCG9AySjENTTLqsjaIWZ1q3WGiR5C4Dyz2CYSpdlpOFkIl4iHux/egL1GDkPsh0kIV2Y/aNbfnmg== + +"@callstack/reassure-logger@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@callstack/reassure-logger/-/reassure-logger-1.0.0.tgz#b6c7543bbf6800ad37ad633c3455a380648010d4" + integrity sha512-xFZU2mIesDZWnKh1fjfQ3nffjxi+m/W9vt+EruNdJcxpe0yfxrIs3R/fN0PElpb9TRtY7dE4GpvOKwjIIAsRUA== + dependencies: + chalk "4.1.2" + +"@callstack/reassure-measure@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@callstack/reassure-measure/-/reassure-measure-1.0.0.tgz#1e86212fac46a176bfe79cf9be59a8df6a70ab1f" + integrity sha512-OpR/s4igz2y6y9P3SdHuCG2Q2Xsb/04+bfEtFxvLwQgdf+jBqPlo6k5Gh/bd0Mqr8eKw8sd5Xm18NFhYRHr46g== + dependencies: + "@callstack/reassure-logger" "1.0.0" + mathjs "^12.4.2" + pretty-format "^29.7.0" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -3434,6 +3483,18 @@ "@keystonehq/bc-ur-registry-eth" "^0.6.12" "@ngraveio/bc-ur" "^1.1.6" +"@kwsites/file-exists@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@kwsites/file-exists/-/file-exists-1.1.1.tgz#ad1efcac13e1987d8dbaf235ef3be5b0d96faa99" + integrity sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw== + dependencies: + debug "^4.1.1" + +"@kwsites/promise-deferred@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz#8ace5259254426ccef57f3175bc64ed7095ed919" + integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw== + "@lavamoat/aa@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@lavamoat/aa/-/aa-4.2.0.tgz#1262589c77386b1741fe904ebdfe97b959bc8fa4" @@ -13031,6 +13092,14 @@ chai@^4.3.4: pathval "^1.1.1" type-detect "^4.0.5" +chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -13059,14 +13128,6 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -13638,6 +13699,11 @@ compare-versions@^6.1.0: resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.0.tgz#3f2131e3ae93577df111dba133e6db876ffe127a" integrity sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg== +complex.js@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/complex.js/-/complex.js-2.1.1.tgz#0675dac8e464ec431fb2ab7d30f41d889fb25c31" + integrity sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg== + compress-brotli@^1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/compress-brotli/-/compress-brotli-1.3.8.tgz#0c0a60c97a989145314ec381e84e26682e7b38db" @@ -14362,7 +14428,7 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@~4.3.1, debug@~4.3.2: version "4.3.5" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== @@ -14414,6 +14480,11 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +decimal.js@^10.4.3: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" @@ -15621,6 +15692,11 @@ escape-html@^1.0.3, escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= +escape-latex@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/escape-latex/-/escape-latex-1.2.0.tgz#07c03818cf7dac250cce517f4fda1b001ef2bca1" + integrity sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw== + escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" @@ -17340,6 +17416,11 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +fraction.js@4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.4.tgz#b2bac8249a610c3396106da97c5a71da75b94b1c" + integrity sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q== + fresh@0.5.2, fresh@~0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -18552,6 +18633,14 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" +import-local@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + improved-yarn-audit@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/improved-yarn-audit/-/improved-yarn-audit-3.0.0.tgz#dfb09cea1a3a92c790ea2b4056431f6fb1b99bfa" @@ -19302,6 +19391,11 @@ jake@^10.8.5: filelist "^1.0.1" minimatch "^3.0.4" +javascript-natural-sort@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" + integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== + jest-changed-files@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" @@ -21073,6 +21167,13 @@ map-stream@~0.1.0: resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== +markdown-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" + integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== + dependencies: + repeat-string "^1.0.0" + markdown-to-jsx@^6.11.4: version "6.11.4" resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.11.4.tgz#b4528b1ab668aef7fe61c1535c27e837819392c5" @@ -21101,6 +21202,21 @@ material-colors@^1.2.1: resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.6.tgz#6d1958871126992ceecc72f4bcc4d8f010865f46" integrity sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg== +mathjs@^12.4.2: + version "12.4.3" + resolved "https://registry.yarnpkg.com/mathjs/-/mathjs-12.4.3.tgz#eef86baf8ee4c2467fc8c4619107bf4a650b9954" + integrity sha512-oHdGPDbp7gO873xxG90RLq36IuicuKvbpr/bBG5g9c8Obm/VsKVrK9uoRZZHUodohzlnmCEqfDzbR3LH6m+aAQ== + dependencies: + "@babel/runtime" "^7.24.4" + complex.js "^2.1.1" + decimal.js "^10.4.3" + escape-latex "^1.2.0" + fraction.js "4.3.4" + javascript-natural-sort "^0.7.1" + seedrandom "^3.0.5" + tiny-emitter "^2.1.0" + typed-function "^4.1.1" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -25233,6 +25349,17 @@ real-require@^0.1.0: resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== +reassure@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/reassure/-/reassure-1.0.0.tgz#4f55863dfa43f0f3c5a32d274dc95c396bf30ba1" + integrity sha512-TmROMqr20rUZP1WVep6UY5eSAXG1Zr877Zy5Is1KLUV+zFahgSpqqhAkEY9wvzTUeG8/VMcK5mRlzoLGUPw8kw== + dependencies: + "@callstack/reassure-cli" "1.0.0" + "@callstack/reassure-compare" "1.0.0" + "@callstack/reassure-danger" "1.0.0" + "@callstack/reassure-measure" "1.0.0" + import-local "^3.1.0" + recast@^0.21.0: version "0.21.5" resolved "https://registry.yarnpkg.com/recast/-/recast-0.21.5.tgz#e8cd22bb51bcd6130e54f87955d33a2b2e57b495" @@ -25440,7 +25567,7 @@ renderkid@^3.0.0: lodash "^4.17.21" strip-ansi "^6.0.1" -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.0.0, repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -25939,6 +26066,11 @@ seed-random@~2.2.0: resolved "https://registry.yarnpkg.com/seed-random/-/seed-random-2.2.0.tgz#2a9b19e250a817099231a5b99a4daf80b7fbed54" integrity sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ== +seedrandom@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" + integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== + select@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" @@ -26276,6 +26408,15 @@ simple-get@^4.0.0, simple-get@^4.0.1: once "^1.3.1" simple-concat "^1.0.0" +simple-git@^3.24.0: + version "3.25.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.25.0.tgz#3666e76d6831f0583dc380645945b97e0ac4aab6" + integrity sha512-KIY5sBnzc4yEcJXW7Tdv4viEz8KyG+nU0hay+DWZasvdFOYKeUZ6Xc25LUHHjw0tinPT7O1eY6pzX7pRT1K8rw== + dependencies: + "@kwsites/file-exists" "^1.1.1" + "@kwsites/promise-deferred" "^1.1.1" + debug "^4.3.5" + simple-plist@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.3.1.tgz#16e1d8f62c6c9b691b8383127663d834112fb017" @@ -27345,7 +27486,7 @@ timm@^1.6.1: resolved "https://registry.yarnpkg.com/timm/-/timm-1.7.1.tgz#96bab60c7d45b5a10a8a4d0f0117c6b7e5aff76f" integrity sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw== -tiny-emitter@^2.0.0: +tiny-emitter@^2.0.0, tiny-emitter@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== @@ -27509,6 +27650,11 @@ ts-node@^10.5.0: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +ts-regex-builder@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/ts-regex-builder/-/ts-regex-builder-1.7.1.tgz#26b657b71169a577fef9f0484442f225d2b5fba3" + integrity sha512-FaxtsuQ9jLT+p0Uefmi8WCjRcCQ64kHyzfAD0MO2BjYXV92qpnEFgdT1TIetUj4WiucuYCEjCq+n6xGxp7DkNQ== + tsconfig-paths@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" @@ -27677,6 +27823,11 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" +typed-function@^4.1.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/typed-function/-/typed-function-4.2.1.tgz#19aa51847aa2dea9ef5e7fb7641c060179a74426" + integrity sha512-EGjWssW7Tsk4DGfE+5yluuljS1OGYWiI1J6e8puZz9nTMM51Oug8CD5Zo4gWMsOhq5BI+1bF+rWTm4Vbj3ivRA== + typed-styles@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" @@ -29277,7 +29428,7 @@ yargs@17.7.1: y18n "^5.0.5" yargs-parser "^21.1.1" -yargs@17.7.2, yargs@^17.0.0, yargs@^17.3.1, yargs@^17.5.1: +yargs@17.7.2, yargs@^17.0.0, yargs@^17.3.1, yargs@^17.5.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -29432,7 +29583,7 @@ zip-stream@^4.1.0: compress-commons "^4.1.0" readable-stream "^3.6.0" -zod@^3.21.4, zod@^3.22.4: +zod@^3.21.4, zod@^3.22.4, zod@^3.23.8: version "3.23.8" resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==