From 0d857d67393864f6cc97fb8b01ef56fed36a6773 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 20 Sep 2023 14:47:14 +0200 Subject: [PATCH 01/45] chore: add path-browserify --- package-lock.json | 29 +++++++++++++++++------------ package.json | 7 ++++--- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index faf13c7d9d1..5648d5546d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -62,6 +62,7 @@ "moment-timezone": "^0.5.31", "onfido-sdk-ui": "13.1.0", "patch-package": "^8.0.0", + "path-browserify": "^1.0.1", "process": "^0.11.10", "prop-types": "^15.7.2", "pusher-js": "8.3.0", @@ -12711,11 +12712,6 @@ "node": ">=8" } }, - "node_modules/@storybook/builder-webpack5/node_modules/path-browserify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/@storybook/builder-webpack5/node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -38520,6 +38516,11 @@ "version": "1.0.0", "license": "MIT" }, + "node_modules/node-libs-browser/node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, "node_modules/node-libs-browser/node_modules/punycode": { "version": "1.4.1", "license": "MIT" @@ -39573,8 +39574,9 @@ } }, "node_modules/path-browserify": { - "version": "0.0.1", - "license": "MIT" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, "node_modules/path-dirname": { "version": "1.0.2", @@ -57447,10 +57449,6 @@ "p-limit": "^2.2.0" } }, - "path-browserify": { - "version": "1.0.1", - "dev": true - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -75404,6 +75402,11 @@ "isarray": { "version": "1.0.0" }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, "punycode": { "version": "1.4.1" } @@ -76093,7 +76096,9 @@ } }, "path-browserify": { - "version": "0.0.1" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, "path-dirname": { "version": "1.0.2", diff --git a/package.json b/package.json index 85c4289436f..12d38518bb0 100644 --- a/package.json +++ b/package.json @@ -61,9 +61,9 @@ "@formatjs/intl-pluralrules": "^5.2.2", "@gorhom/portal": "^1.0.14", "@invertase/react-native-apple-authentication": "^2.2.2", - "@oguzhnatly/react-native-image-manipulator": "github:Expensify/react-native-image-manipulator#5cdae3d4455b03a04c57f50be3863e2fe6c92c52", "@kie/act-js": "^2.0.1", "@kie/mock-github": "^1.0.0", + "@oguzhnatly/react-native-image-manipulator": "github:Expensify/react-native-image-manipulator#5cdae3d4455b03a04c57f50be3863e2fe6c92c52", "@onfido/react-native-sdk": "7.4.0", "@react-native-async-storage/async-storage": "^1.17.10", "@react-native-camera-roll/camera-roll": "5.4.0", @@ -81,9 +81,9 @@ "@react-navigation/stack": "6.3.16", "@react-ng/bounds-observer": "^0.2.1", "@rnmapbox/maps": "^10.0.11", + "@types/node": "^18.14.0", "@ua/react-native-airship": "^15.2.6", "awesome-phonenumber": "^5.4.0", - "@types/node": "^18.14.0", "babel-plugin-transform-remove-console": "^6.9.4", "babel-polyfill": "^6.26.0", "canvas-size": "^1.2.6", @@ -104,6 +104,7 @@ "moment-timezone": "^0.5.31", "onfido-sdk-ui": "13.1.0", "patch-package": "^8.0.0", + "path-browserify": "^1.0.1", "process": "^0.11.10", "prop-types": "^15.7.2", "pusher-js": "8.3.0", @@ -111,8 +112,8 @@ "react-collapse": "^5.1.0", "react-content-loader": "^6.1.0", "react-dom": "18.1.0", - "react-map-gl": "^7.1.3", "react-error-boundary": "^4.0.11", + "react-map-gl": "^7.1.3", "react-native": "0.72.4", "react-native-blob-util": "^0.17.3", "react-native-collapsible": "^1.6.0", From cb9d2f911047314cbf09553a8530b0c3f84d3096 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 20 Sep 2023 14:47:31 +0200 Subject: [PATCH 02/45] chore: add path polyfill to webpack --- config/webpack/webpack.common.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/webpack/webpack.common.js b/config/webpack/webpack.common.js index 7dc851c95c9..91b00856b3e 100644 --- a/config/webpack/webpack.common.js +++ b/config/webpack/webpack.common.js @@ -197,6 +197,7 @@ const webpackConfig = ({envFile = '.env', platform = 'web'}) => ({ extensions: ['.web.js', platform === 'web' ? '.website.js' : '.desktop.js', '.js', '.jsx', '.web.ts', platform === 'web' ? '.website.ts' : '.desktop.ts', '.ts', '.web.tsx', '.tsx'], fallback: { 'process/browser': require.resolve('process/browser'), + path: require.resolve('path-browserify'), }, }, optimization: { @@ -219,6 +220,9 @@ const webpackConfig = ({envFile = '.env', platform = 'web'}) => ({ }, }, }, + experiments: { + asyncWebAssembly: true, + }, }); module.exports = webpackConfig; From 67d7cc4424b2e343d1e7984ba1fb1a62aece7d58 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 20 Sep 2023 14:47:42 +0200 Subject: [PATCH 03/45] feat: test encryption wasm file --- src/Expensify.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/Expensify.js b/src/Expensify.js index fba65e42c06..aef1fb327c0 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -4,6 +4,7 @@ import PropTypes from 'prop-types'; import React, {useCallback, useState, useEffect, useRef, useLayoutEffect, useMemo} from 'react'; import {AppState, Linking} from 'react-native'; import Onyx, {withOnyx} from 'react-native-onyx'; +import * as Encryptify from 'react-native-encryptify'; import * as Report from './libs/actions/Report'; import BootSplash from './libs/BootSplash'; import * as ActiveClientManager from './libs/ActiveClientManager'; @@ -183,6 +184,28 @@ function Expensify(props) { // eslint-disable-next-line react-hooks/exhaustive-deps -- we don't want this effect to run again }, []); + useEffect(() => { + console.log({Encryptify}); + + const kemKeys = Encryptify.KEMGenKeys(); + + const publicKeys = {kyber1024: kemKeys.kyber1024.publicKey, rsa4096: kemKeys.rsa4096.publicKey}; + const privateKeys = {kyber1024: kemKeys.kyber1024.privateKey, rsa4096: kemKeys.rsa4096.privateKey}; + + const data = 'Hello World! 123'; + const {sharedSecret, cipherText} = Encryptify.KEMEncrypt(publicKeys); + const encryptedData = Encryptify.AESEncrypt('some iv value', sharedSecret, data); + + // After encryption on the sender side, the message is sent to the receiver: + // Only the encryptedData an the cipherText must be sent to the receiver + // The receiver can then decrypt the cipherText with his private keys + + const decryptedSharedSecret = Encryptify.KEMDecrypt(privateKeys, cipherText); + const decryptedData = Encryptify.AESDecrypt('some iv value', decryptedSharedSecret, encryptedData); + + console.log({encryptedData, decryptedData}); + }, []); + // Display a blank page until the onyx migration completes if (!isOnyxMigrated) { return null; From 9c23a4f6daede69977e8c7a84a36e23e22edad00 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Thu, 21 Sep 2023 17:03:10 +0200 Subject: [PATCH 04/45] fix: remove polyfills --- config/webpack/webpack.common.js | 2 +- package-lock.json | 12 ++++++++---- package.json | 1 - 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/config/webpack/webpack.common.js b/config/webpack/webpack.common.js index 91b00856b3e..f2804e37ce2 100644 --- a/config/webpack/webpack.common.js +++ b/config/webpack/webpack.common.js @@ -197,7 +197,6 @@ const webpackConfig = ({envFile = '.env', platform = 'web'}) => ({ extensions: ['.web.js', platform === 'web' ? '.website.js' : '.desktop.js', '.js', '.jsx', '.web.ts', platform === 'web' ? '.website.ts' : '.desktop.ts', '.ts', '.web.tsx', '.tsx'], fallback: { 'process/browser': require.resolve('process/browser'), - path: require.resolve('path-browserify'), }, }, optimization: { @@ -222,6 +221,7 @@ const webpackConfig = ({envFile = '.env', platform = 'web'}) => ({ }, experiments: { asyncWebAssembly: true, + syncWebAssembly: true, }, }); diff --git a/package-lock.json b/package-lock.json index 6c330421205..76d294b91b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -62,7 +62,6 @@ "moment-timezone": "^0.5.31", "onfido-sdk-ui": "13.1.0", "patch-package": "^8.0.0", - "path-browserify": "^1.0.1", "process": "^0.11.10", "prop-types": "^15.7.2", "pusher-js": "8.3.0", @@ -28584,8 +28583,9 @@ }, "node_modules/file-loader": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "devOptional": true, - "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -39576,7 +39576,8 @@ "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true }, "node_modules/path-dirname": { "version": "1.0.2", @@ -68593,6 +68594,8 @@ }, "file-loader": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "devOptional": true, "requires": { "loader-utils": "^2.0.0", @@ -76098,7 +76101,8 @@ "path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true }, "path-dirname": { "version": "1.0.2", diff --git a/package.json b/package.json index e5e71fd16e4..5f3b4026d6f 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,6 @@ "moment-timezone": "^0.5.31", "onfido-sdk-ui": "13.1.0", "patch-package": "^8.0.0", - "path-browserify": "^1.0.1", "process": "^0.11.10", "prop-types": "^15.7.2", "pusher-js": "8.3.0", From 86743c0383da6b6f0d0dd4da189075f2d2fb4cb8 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 22 Sep 2023 17:41:05 +0200 Subject: [PATCH 05/45] fix: update webpack --- config/webpack/webpack.common.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/config/webpack/webpack.common.js b/config/webpack/webpack.common.js index f2804e37ce2..c9205ddbf73 100644 --- a/config/webpack/webpack.common.js +++ b/config/webpack/webpack.common.js @@ -22,6 +22,7 @@ const includeModules = [ 'react-native-google-places-autocomplete', 'react-native-qrcode-svg', 'react-native-view-shot', + 'react-native-encryptify', ].join('|'); const envToLogoSuffixMap = { @@ -94,6 +95,7 @@ const webpackConfig = ({envFile = '.env', platform = 'web'}) => ({ // These files are copied over as per instructions here // https://github.com/wojtekmaj/react-pdf#copying-cmaps {from: 'node_modules/pdfjs-dist/cmaps/', to: 'cmaps/'}, + // {from: 'node_modules/react-native-encryptify/lib/wasm/*', to: '[name][ext]'}, ], }), new EnvironmentPlugin({JEST_WORKER_ID: null}), @@ -178,6 +180,17 @@ const webpackConfig = ({envFile = '.env', platform = 'web'}) => ({ resourceQuery: /raw/, type: 'asset/source', }, + { + test: /\.wasm$/i, + type: 'javascript/auto', + loader: 'file-loader', + options: { + publicPath: '/', + }, + generator: { + filename: '[name].[ext]', + }, + }, ], }, resolve: { @@ -219,10 +232,6 @@ const webpackConfig = ({envFile = '.env', platform = 'web'}) => ({ }, }, }, - experiments: { - asyncWebAssembly: true, - syncWebAssembly: true, - }, }); module.exports = webpackConfig; From 03930498186d4f9bf481bf9914c4369ec2d04243 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 22 Sep 2023 17:42:10 +0200 Subject: [PATCH 06/45] chore: update dependencies --- package-lock.json | 213 ++++++++++------------------------------------ package.json | 1 + 2 files changed, 46 insertions(+), 168 deletions(-) diff --git a/package-lock.json b/package-lock.json index 76d294b91b6..ed12aeed5ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,6 +52,7 @@ "domhandler": "^4.3.0", "expensify-common": "git+ssh://git@github.com/Expensify/expensify-common.git#35bff866a8d345b460ea6256f0a0f0a8a7f81086", "fbjs": "^3.0.2", + "file-loader": "^6.2.0", "htmlparser2": "^7.2.0", "idb-keyval": "^6.2.1", "jest-when": "^3.5.2", @@ -18410,7 +18411,6 @@ }, "node_modules/@types/eslint": { "version": "8.4.6", - "devOptional": true, "license": "MIT", "dependencies": { "@types/estree": "*", @@ -18419,7 +18419,6 @@ }, "node_modules/@types/eslint-scope": { "version": "3.7.4", - "devOptional": true, "license": "MIT", "dependencies": { "@types/eslint": "*", @@ -18428,7 +18427,6 @@ }, "node_modules/@types/estree": { "version": "0.0.51", - "devOptional": true, "license": "MIT" }, "node_modules/@types/estree-jsx": { @@ -18613,8 +18611,7 @@ "node_modules/@types/json-schema": { "version": "7.0.12", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "devOptional": true + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -19654,8 +19651,7 @@ "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "devOptional": true + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" }, "node_modules/@webassemblyjs/helper-code-frame": { "version": "1.9.0", @@ -19682,7 +19678,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "devOptional": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -19692,14 +19687,12 @@ "node_modules/@webassemblyjs/helper-numbers/node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "devOptional": true + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "node_modules/@webassemblyjs/helper-numbers/node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "devOptional": true + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.9.0", @@ -19711,7 +19704,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "devOptional": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -19723,7 +19715,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "devOptional": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -19732,14 +19723,12 @@ "node_modules/@webassemblyjs/helper-wasm-section/node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "devOptional": true + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/ieee754": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "devOptional": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -19748,7 +19737,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "devOptional": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -19756,14 +19744,12 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "devOptional": true + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "devOptional": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -19779,7 +19765,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "devOptional": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -19788,14 +19773,12 @@ "node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "devOptional": true + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wast-printer": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "devOptional": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" @@ -19805,7 +19788,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "devOptional": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -19818,7 +19800,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "devOptional": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -19827,14 +19808,12 @@ "node_modules/@webassemblyjs/wasm-gen/node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "devOptional": true + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "devOptional": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -19846,7 +19825,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "devOptional": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -19855,14 +19833,12 @@ "node_modules/@webassemblyjs/wasm-opt/node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "devOptional": true + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "devOptional": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -19876,7 +19852,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "devOptional": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -19885,14 +19860,12 @@ "node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "devOptional": true + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "devOptional": true + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/wast-parser": { "version": "1.9.0", @@ -19977,12 +19950,10 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "devOptional": true, "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", - "devOptional": true, "license": "Apache-2.0" }, "node_modules/@yarnpkg/lockfile": { @@ -21932,7 +21903,6 @@ }, "node_modules/big.js": { "version": "5.2.2", - "devOptional": true, "license": "MIT", "engines": { "node": "*" @@ -23050,7 +23020,6 @@ }, "node_modules/chrome-trace-event": { "version": "1.0.3", - "devOptional": true, "license": "MIT", "engines": { "node": ">=6.0" @@ -25941,7 +25910,6 @@ }, "node_modules/emojis-list": { "version": "3.0.0", - "devOptional": true, "license": "MIT", "engines": { "node": ">= 4" @@ -26027,7 +25995,6 @@ "version": "5.15.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "devOptional": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -26040,7 +26007,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "devOptional": true, "engines": { "node": ">=6" } @@ -26227,8 +26193,7 @@ "node_modules/es-module-lexer": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", - "devOptional": true + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" }, "node_modules/es-set-tostringtag": { "version": "2.0.1", @@ -27468,7 +27433,6 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", - "devOptional": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -27480,7 +27444,6 @@ }, "node_modules/eslint-scope/node_modules/estraverse": { "version": "4.3.0", - "devOptional": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -27723,7 +27686,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "devOptional": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -27734,7 +27696,6 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "devOptional": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -28585,7 +28546,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "devOptional": true, "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -29432,7 +29392,6 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "devOptional": true, "license": "BSD-2-Clause" }, "node_modules/global": { @@ -34764,7 +34723,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "devOptional": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -43595,7 +43553,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "devOptional": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -43611,7 +43568,6 @@ }, "node_modules/schema-utils/node_modules/ajv": { "version": "6.12.6", - "devOptional": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -43626,7 +43582,6 @@ }, "node_modules/schema-utils/node_modules/ajv-keywords": { "version": "3.5.2", - "devOptional": true, "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" @@ -43634,7 +43589,6 @@ }, "node_modules/schema-utils/node_modules/json-schema-traverse": { "version": "0.4.1", - "devOptional": true, "license": "MIT" }, "node_modules/seedrandom": { @@ -47109,7 +47063,6 @@ }, "node_modules/watchpack": { "version": "2.4.0", - "devOptional": true, "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -47408,7 +47361,6 @@ "version": "5.88.2", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", - "devOptional": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -47988,14 +47940,12 @@ "node_modules/webpack/node_modules/@types/estree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "devOptional": true + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" }, "node_modules/webpack/node_modules/@webassemblyjs/ast": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "devOptional": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -48004,14 +47954,12 @@ "node_modules/webpack/node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "devOptional": true + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/webpack/node_modules/acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "devOptional": true, "bin": { "acorn": "bin/acorn" }, @@ -48023,7 +47971,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "devOptional": true, "peerDependencies": { "acorn": "^8" } @@ -48032,7 +47979,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, "engines": { "node": ">=8" } @@ -48041,7 +47987,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "devOptional": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -48053,7 +47998,6 @@ }, "node_modules/webpack/node_modules/loader-runner": { "version": "4.3.0", - "devOptional": true, "license": "MIT", "engines": { "node": ">=6.11.5" @@ -48063,7 +48007,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "devOptional": true, "dependencies": { "randombytes": "^2.1.0" } @@ -48072,7 +48015,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -48085,7 +48027,6 @@ }, "node_modules/webpack/node_modules/tapable": { "version": "2.2.1", - "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -48095,7 +48036,6 @@ "version": "5.3.9", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "devOptional": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", @@ -48127,7 +48067,6 @@ }, "node_modules/webpack/node_modules/webpack-sources": { "version": "3.2.3", - "devOptional": true, "license": "MIT", "engines": { "node": ">=10.13.0" @@ -61404,7 +61343,6 @@ }, "@types/eslint": { "version": "8.4.6", - "devOptional": true, "requires": { "@types/estree": "*", "@types/json-schema": "*" @@ -61412,15 +61350,13 @@ }, "@types/eslint-scope": { "version": "3.7.4", - "devOptional": true, "requires": { "@types/eslint": "*", "@types/estree": "*" } }, "@types/estree": { - "version": "0.0.51", - "devOptional": true + "version": "0.0.51" }, "@types/estree-jsx": { "version": "1.0.0", @@ -61582,8 +61518,7 @@ "@types/json-schema": { "version": "7.0.12", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "devOptional": true + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" }, "@types/json5": { "version": "0.0.29", @@ -62298,8 +62233,7 @@ "@webassemblyjs/helper-buffer": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "devOptional": true + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" }, "@webassemblyjs/helper-code-frame": { "version": "1.9.0", @@ -62323,7 +62257,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "devOptional": true, "requires": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -62333,14 +62266,12 @@ "@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "devOptional": true + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "devOptional": true + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" } } }, @@ -62354,7 +62285,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "devOptional": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -62366,7 +62296,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "devOptional": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -62375,8 +62304,7 @@ "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "devOptional": true + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" } } }, @@ -62384,7 +62312,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "devOptional": true, "requires": { "@xtuc/ieee754": "^1.2.0" } @@ -62393,7 +62320,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "devOptional": true, "requires": { "@xtuc/long": "4.2.2" } @@ -62401,14 +62327,12 @@ "@webassemblyjs/utf8": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "devOptional": true + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "@webassemblyjs/wasm-edit": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "devOptional": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -62424,7 +62348,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "devOptional": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -62433,14 +62356,12 @@ "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "devOptional": true + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "@webassemblyjs/wast-printer": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "devOptional": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" @@ -62452,7 +62373,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "devOptional": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -62465,7 +62385,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "devOptional": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -62474,8 +62393,7 @@ "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "devOptional": true + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" } } }, @@ -62483,7 +62401,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "devOptional": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -62495,7 +62412,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "devOptional": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -62504,8 +62420,7 @@ "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "devOptional": true + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" } } }, @@ -62513,7 +62428,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "devOptional": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -62527,7 +62441,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "devOptional": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -62536,14 +62449,12 @@ "@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "devOptional": true + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "devOptional": true + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" } } }, @@ -62604,12 +62515,10 @@ "version": "0.7.5" }, "@xtuc/ieee754": { - "version": "1.2.0", - "devOptional": true + "version": "1.2.0" }, "@xtuc/long": { - "version": "4.2.2", - "devOptional": true + "version": "4.2.2" }, "@yarnpkg/lockfile": { "version": "1.1.0" @@ -63987,8 +63896,7 @@ "version": "1.6.51" }, "big.js": { - "version": "5.2.2", - "devOptional": true + "version": "5.2.2" }, "bin-links": { "version": "4.0.2", @@ -64756,8 +64664,7 @@ "dev": true }, "chrome-trace-event": { - "version": "1.0.3", - "devOptional": true + "version": "1.0.3" }, "chromium-pickle-js": { "version": "0.2.0", @@ -66757,8 +66664,7 @@ "version": "8.0.0" }, "emojis-list": { - "version": "3.0.0", - "devOptional": true + "version": "3.0.0" }, "encode-utf8": { "version": "1.0.3" @@ -66815,7 +66721,6 @@ "version": "5.15.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "devOptional": true, "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -66824,8 +66729,7 @@ "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "devOptional": true + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" } } }, @@ -66971,8 +66875,7 @@ "es-module-lexer": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", - "devOptional": true + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" }, "es-set-tostringtag": { "version": "2.0.1", @@ -67923,15 +67826,13 @@ }, "eslint-scope": { "version": "5.1.1", - "devOptional": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "dependencies": { "estraverse": { - "version": "4.3.0", - "devOptional": true + "version": "4.3.0" } } }, @@ -67975,14 +67876,12 @@ }, "esrecurse": { "version": "4.3.0", - "devOptional": true, "requires": { "estraverse": "^5.2.0" } }, "estraverse": { - "version": "5.3.0", - "devOptional": true + "version": "5.3.0" }, "estree-to-babel": { "version": "3.2.1", @@ -68596,7 +68495,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "devOptional": true, "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -69147,8 +69045,7 @@ } }, "glob-to-regexp": { - "version": "0.4.1", - "devOptional": true + "version": "0.4.1" }, "global": { "version": "4.4.0", @@ -72711,7 +72608,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "devOptional": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -78788,7 +78684,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "devOptional": true, "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -78797,7 +78692,6 @@ "dependencies": { "ajv": { "version": "6.12.6", - "devOptional": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -78807,12 +78701,10 @@ }, "ajv-keywords": { "version": "3.5.2", - "devOptional": true, "requires": {} }, "json-schema-traverse": { - "version": "0.4.1", - "devOptional": true + "version": "0.4.1" } } }, @@ -81205,7 +81097,6 @@ }, "watchpack": { "version": "2.4.0", - "devOptional": true, "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -81428,7 +81319,6 @@ "version": "5.88.2", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", - "devOptional": true, "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -81459,14 +81349,12 @@ "@types/estree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "devOptional": true + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" }, "@webassemblyjs/ast": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "devOptional": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -81475,33 +81363,28 @@ "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "devOptional": true + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "devOptional": true + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" }, "acorn-import-assertions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "devOptional": true, "requires": {} }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "devOptional": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -81509,14 +81392,12 @@ } }, "loader-runner": { - "version": "4.3.0", - "devOptional": true + "version": "4.3.0" }, "serialize-javascript": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "devOptional": true, "requires": { "randombytes": "^2.1.0" } @@ -81525,20 +81406,17 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "devOptional": true, "requires": { "has-flag": "^4.0.0" } }, "tapable": { - "version": "2.2.1", - "devOptional": true + "version": "2.2.1" }, "terser-webpack-plugin": { "version": "5.3.9", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "devOptional": true, "requires": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", @@ -81548,8 +81426,7 @@ } }, "webpack-sources": { - "version": "3.2.3", - "devOptional": true + "version": "3.2.3" } } }, diff --git a/package.json b/package.json index f08a63d2203..799951e3df3 100644 --- a/package.json +++ b/package.json @@ -95,6 +95,7 @@ "domhandler": "^4.3.0", "expensify-common": "git+ssh://git@github.com/Expensify/expensify-common.git#35bff866a8d345b460ea6256f0a0f0a8a7f81086", "fbjs": "^3.0.2", + "file-loader": "^6.2.0", "htmlparser2": "^7.2.0", "idb-keyval": "^6.2.1", "jest-when": "^3.5.2", From 488f6d9c55a34361819651ad4649ffbd32566788 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 22 Sep 2023 17:42:16 +0200 Subject: [PATCH 07/45] fix: import --- src/Expensify.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Expensify.js b/src/Expensify.js index e482c7b7d3e..75cf08cf13e 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -4,7 +4,7 @@ import PropTypes from 'prop-types'; import React, {useCallback, useState, useEffect, useRef, useLayoutEffect, useMemo} from 'react'; import {AppState, Linking} from 'react-native'; import Onyx, {withOnyx} from 'react-native-onyx'; -import * as Encryptify from 'react-native-encryptify'; +import Encryptify from 'react-native-encryptify'; import * as Report from './libs/actions/Report'; import BootSplash from './libs/BootSplash'; import * as ActiveClientManager from './libs/ActiveClientManager'; From 63a9cd59105a424ab5237e16d67de089c8050f61 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sat, 23 Sep 2023 14:34:56 +0200 Subject: [PATCH 08/45] fix: webpack config --- config/webpack/webpack.common.js | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/config/webpack/webpack.common.js b/config/webpack/webpack.common.js index c9205ddbf73..58adb94e6e4 100644 --- a/config/webpack/webpack.common.js +++ b/config/webpack/webpack.common.js @@ -22,7 +22,6 @@ const includeModules = [ 'react-native-google-places-autocomplete', 'react-native-qrcode-svg', 'react-native-view-shot', - 'react-native-encryptify', ].join('|'); const envToLogoSuffixMap = { @@ -95,7 +94,6 @@ const webpackConfig = ({envFile = '.env', platform = 'web'}) => ({ // These files are copied over as per instructions here // https://github.com/wojtekmaj/react-pdf#copying-cmaps {from: 'node_modules/pdfjs-dist/cmaps/', to: 'cmaps/'}, - // {from: 'node_modules/react-native-encryptify/lib/wasm/*', to: '[name][ext]'}, ], }), new EnvironmentPlugin({JEST_WORKER_ID: null}), @@ -182,14 +180,7 @@ const webpackConfig = ({envFile = '.env', platform = 'web'}) => ({ }, { test: /\.wasm$/i, - type: 'javascript/auto', - loader: 'file-loader', - options: { - publicPath: '/', - }, - generator: { - filename: '[name].[ext]', - }, + type: 'asset/resource', }, ], }, From 9b0b99efa79c75203d61889fe96b922ebff1fd00 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sat, 23 Sep 2023 14:35:08 +0200 Subject: [PATCH 09/45] fix: add useEncryptify hook --- src/Expensify.js | 9 +++++++-- src/hooks/useEncryptify.js | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 src/hooks/useEncryptify.js diff --git a/src/Expensify.js b/src/Expensify.js index 75cf08cf13e..81689c336b9 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -4,7 +4,6 @@ import PropTypes from 'prop-types'; import React, {useCallback, useState, useEffect, useRef, useLayoutEffect, useMemo} from 'react'; import {AppState, Linking} from 'react-native'; import Onyx, {withOnyx} from 'react-native-onyx'; -import Encryptify from 'react-native-encryptify'; import * as Report from './libs/actions/Report'; import BootSplash from './libs/BootSplash'; import * as ActiveClientManager from './libs/ActiveClientManager'; @@ -38,6 +37,7 @@ import DeeplinkWrapper from './components/DeeplinkWrapper'; import UnreadIndicatorUpdater from './libs/UnreadIndicatorUpdater'; // eslint-disable-next-line no-unused-vars import subscribePushNotification from './libs/Notification/PushNotification/subscribePushNotification'; +import useEncryptify from './hooks/useEncryptify'; Onyx.registerLogger(({level, message}) => { if (level === 'alert') { @@ -186,7 +186,12 @@ function Expensify(props) { // eslint-disable-next-line react-hooks/exhaustive-deps -- we don't want this effect to run again }, []); + const {Encryptify, isEncryptifyReady} = useEncryptify(); useEffect(() => { + if (!isEncryptifyReady) { + return; + } + console.log({Encryptify}); const kemKeys = Encryptify.KEMGenKeys(); @@ -206,7 +211,7 @@ function Expensify(props) { const decryptedData = Encryptify.AESDecrypt('some iv value', decryptedSharedSecret, encryptedData); console.log({encryptedData, decryptedData}); - }, []); + }, [Encryptify, isEncryptifyReady]); // Display a blank page until the onyx migration completes if (!isOnyxMigrated) { diff --git a/src/hooks/useEncryptify.js b/src/hooks/useEncryptify.js new file mode 100644 index 00000000000..08172b7b347 --- /dev/null +++ b/src/hooks/useEncryptify.js @@ -0,0 +1,18 @@ +import {useEffect, useState} from 'react'; +import EncryptifyModule, {initializationPromise} from 'react-native-encryptify'; + +const useEncryptify = () => { + const [Encryptify, setEncryptify] = useState(EncryptifyModule); + const [ready, setReady] = useState(false); + + useEffect(() => { + initializationPromise.then(() => { + setEncryptify(EncryptifyModule); + setReady(true); + }); + }, []); + + return {Encryptify, isEncryptifyReady: ready}; +}; + +export default useEncryptify; From 1b6048f8e2f2da4ed2d3561f8b804dbf515f2608 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Tue, 26 Sep 2023 00:11:12 +0200 Subject: [PATCH 10/45] log --- src/Expensify.js | 2 -- src/hooks/useEncryptify.js | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index 81689c336b9..59d94f5c220 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -192,8 +192,6 @@ function Expensify(props) { return; } - console.log({Encryptify}); - const kemKeys = Encryptify.KEMGenKeys(); const publicKeys = {kyber1024: kemKeys.kyber1024.publicKey, rsa4096: kemKeys.rsa4096.publicKey}; diff --git a/src/hooks/useEncryptify.js b/src/hooks/useEncryptify.js index 08172b7b347..a68c8a15bf9 100644 --- a/src/hooks/useEncryptify.js +++ b/src/hooks/useEncryptify.js @@ -6,8 +6,8 @@ const useEncryptify = () => { const [ready, setReady] = useState(false); useEffect(() => { - initializationPromise.then(() => { - setEncryptify(EncryptifyModule); + initializationPromise.then((instance) => { + setEncryptify(instance); setReady(true); }); }, []); From c2826a3ad166a4daaf977ba3b9ef3edb01a934fb Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 22 Oct 2023 12:28:46 +0200 Subject: [PATCH 11/45] update example --- src/Expensify.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index b3dcfbc0036..bec6e40a601 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -196,18 +196,17 @@ function Expensify(props) { const kemKeys = Encryptify.KEMGenKeys(); - const publicKeys = {kyber1024: kemKeys.kyber1024.publicKey, rsa4096: kemKeys.rsa4096.publicKey}; - const privateKeys = {kyber1024: kemKeys.kyber1024.privateKey, rsa4096: kemKeys.rsa4096.privateKey}; + console.log({kemKeys}); const data = 'Hello World! 123'; - const {sharedSecret, cipherText} = Encryptify.KEMEncrypt(publicKeys); + const {sharedSecret, cipherText} = Encryptify.KEMEncrypt(kemKeys.public); const encryptedData = Encryptify.AESEncrypt('some iv value', sharedSecret, data); // After encryption on the sender side, the message is sent to the receiver: // Only the encryptedData an the cipherText must be sent to the receiver // The receiver can then decrypt the cipherText with his private keys - const decryptedSharedSecret = Encryptify.KEMDecrypt(privateKeys, cipherText); + const decryptedSharedSecret = Encryptify.KEMDecrypt(kemKeys.private, cipherText); const decryptedData = Encryptify.AESDecrypt('some iv value', decryptedSharedSecret, encryptedData); console.log({encryptedData, decryptedData}); From 69d18cbc0bd0dc99a32210d6746c8f2e43879b8b Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 22 Oct 2023 12:34:44 +0200 Subject: [PATCH 12/45] fix: remove unused dependency --- package-lock.json | 213 ++++++++++++++++++++++++++++++++++++---------- package.json | 3 +- 2 files changed, 169 insertions(+), 47 deletions(-) diff --git a/package-lock.json b/package-lock.json index c205c4ecf45..1acd6b9097d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,6 @@ "domhandler": "^4.3.0", "expensify-common": "git+ssh://git@github.com/Expensify/expensify-common.git#bdbdf44825658500ba581d3e86237d7b8996cc2e", "fbjs": "^3.0.2", - "file-loader": "^6.2.0", "htmlparser2": "^7.2.0", "idb-keyval": "^6.2.1", "jest-when": "^3.5.2", @@ -19346,6 +19345,7 @@ }, "node_modules/@types/eslint": { "version": "8.4.6", + "devOptional": true, "license": "MIT", "dependencies": { "@types/estree": "*", @@ -19356,6 +19356,7 @@ "version": "3.7.4", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "devOptional": true, "license": "MIT", "dependencies": { "@types/eslint": "*", @@ -19366,6 +19367,7 @@ "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "devOptional": true, "license": "MIT" }, "node_modules/@types/estree-jsx": { @@ -19579,7 +19581,8 @@ "node_modules/@types/json-schema": { "version": "7.0.12", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "devOptional": true }, "node_modules/@types/json5": { "version": "0.0.29", @@ -20711,7 +20714,8 @@ "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "devOptional": true }, "node_modules/@webassemblyjs/helper-code-frame": { "version": "1.9.0", @@ -20744,6 +20748,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "devOptional": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -20753,12 +20758,14 @@ "node_modules/@webassemblyjs/helper-numbers/node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "devOptional": true }, "node_modules/@webassemblyjs/helper-numbers/node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "devOptional": true }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.9.0", @@ -20770,6 +20777,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "devOptional": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -20781,6 +20789,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "devOptional": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -20789,12 +20798,14 @@ "node_modules/@webassemblyjs/helper-wasm-section/node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "devOptional": true }, "node_modules/@webassemblyjs/ieee754": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "devOptional": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -20803,6 +20814,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "devOptional": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -20810,12 +20822,14 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "devOptional": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "devOptional": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -20831,6 +20845,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "devOptional": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -20839,12 +20854,14 @@ "node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "devOptional": true }, "node_modules/@webassemblyjs/wasm-edit/node_modules/@webassemblyjs/wast-printer": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "devOptional": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" @@ -20854,6 +20871,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "devOptional": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -20866,6 +20884,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "devOptional": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -20874,12 +20893,14 @@ "node_modules/@webassemblyjs/wasm-gen/node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "devOptional": true }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "devOptional": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -20891,6 +20912,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "devOptional": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -20899,12 +20921,14 @@ "node_modules/@webassemblyjs/wasm-opt/node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "devOptional": true }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "devOptional": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -20918,6 +20942,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "devOptional": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -20926,12 +20951,14 @@ "node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "devOptional": true }, "node_modules/@webassemblyjs/wasm-parser/node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "devOptional": true }, "node_modules/@webassemblyjs/wast-parser": { "version": "1.9.0", @@ -21028,12 +21055,14 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "devOptional": true, "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "devOptional": true, "license": "Apache-2.0" }, "node_modules/@yarnpkg/lockfile": { @@ -23227,6 +23256,7 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "devOptional": true, "license": "MIT", "engines": { "node": "*" @@ -24481,6 +24511,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=6.0" @@ -27753,6 +27784,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "devOptional": true, "license": "MIT", "engines": { "node": ">= 4" @@ -27846,6 +27878,7 @@ "version": "5.15.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "devOptional": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -27858,6 +27891,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "devOptional": true, "engines": { "node": ">=6" } @@ -28058,7 +28092,8 @@ "node_modules/es-module-lexer": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "devOptional": true }, "node_modules/es-set-tostringtag": { "version": "2.0.1", @@ -29426,6 +29461,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "devOptional": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -29439,6 +29475,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "devOptional": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -29717,6 +29754,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "devOptional": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -29729,6 +29767,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "devOptional": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -30691,6 +30730,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "devOptional": true, "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -31654,6 +31694,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "devOptional": true, "license": "BSD-2-Clause" }, "node_modules/global": { @@ -37553,6 +37594,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "devOptional": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -47253,6 +47295,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "devOptional": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -47270,6 +47313,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "devOptional": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -47286,6 +47330,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "devOptional": true, "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" @@ -47295,6 +47340,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "devOptional": true, "license": "MIT" }, "node_modules/seedrandom": { @@ -51293,6 +51339,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "devOptional": true, "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -51637,6 +51684,7 @@ "version": "5.88.2", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "devOptional": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -52270,12 +52318,14 @@ "node_modules/webpack/node_modules/@types/estree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "devOptional": true }, "node_modules/webpack/node_modules/@webassemblyjs/ast": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "devOptional": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -52284,12 +52334,14 @@ "node_modules/webpack/node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "devOptional": true }, "node_modules/webpack/node_modules/acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "devOptional": true, "bin": { "acorn": "bin/acorn" }, @@ -52301,6 +52353,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "devOptional": true, "peerDependencies": { "acorn": "^8" } @@ -52309,6 +52362,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "devOptional": true, "engines": { "node": ">=8" } @@ -52317,6 +52371,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "devOptional": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -52330,6 +52385,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=6.11.5" @@ -52339,6 +52395,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "devOptional": true, "dependencies": { "randombytes": "^2.1.0" } @@ -52347,6 +52404,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -52361,6 +52419,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -52370,6 +52429,7 @@ "version": "5.3.9", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "devOptional": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", @@ -52403,6 +52463,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=10.13.0" @@ -66709,6 +66770,7 @@ }, "@types/eslint": { "version": "8.4.6", + "devOptional": true, "requires": { "@types/estree": "*", "@types/json-schema": "*" @@ -66718,6 +66780,7 @@ "version": "3.7.4", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "devOptional": true, "requires": { "@types/eslint": "*", "@types/estree": "*" @@ -66726,7 +66789,8 @@ "@types/estree": { "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "devOptional": true }, "@types/estree-jsx": { "version": "1.0.0", @@ -66917,7 +66981,8 @@ "@types/json-schema": { "version": "7.0.12", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "devOptional": true }, "@types/json5": { "version": "0.0.29", @@ -67724,7 +67789,8 @@ "@webassemblyjs/helper-buffer": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "devOptional": true }, "@webassemblyjs/helper-code-frame": { "version": "1.9.0", @@ -67754,6 +67820,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "devOptional": true, "requires": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -67763,12 +67830,14 @@ "@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "devOptional": true }, "@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "devOptional": true } } }, @@ -67782,6 +67851,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "devOptional": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -67793,6 +67863,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "devOptional": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -67801,7 +67872,8 @@ "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "devOptional": true } } }, @@ -67809,6 +67881,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "devOptional": true, "requires": { "@xtuc/ieee754": "^1.2.0" } @@ -67817,6 +67890,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "devOptional": true, "requires": { "@xtuc/long": "4.2.2" } @@ -67824,12 +67898,14 @@ "@webassemblyjs/utf8": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "devOptional": true }, "@webassemblyjs/wasm-edit": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "devOptional": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -67845,6 +67921,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "devOptional": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -67853,12 +67930,14 @@ "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "devOptional": true }, "@webassemblyjs/wast-printer": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "devOptional": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" @@ -67870,6 +67949,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "devOptional": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -67882,6 +67962,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "devOptional": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -67890,7 +67971,8 @@ "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "devOptional": true } } }, @@ -67898,6 +67980,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "devOptional": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -67909,6 +67992,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "devOptional": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -67917,7 +68001,8 @@ "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "devOptional": true } } }, @@ -67925,6 +68010,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "devOptional": true, "requires": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -67938,6 +68024,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "devOptional": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -67946,12 +68033,14 @@ "@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "devOptional": true }, "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "devOptional": true } } }, @@ -68024,12 +68113,14 @@ "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "devOptional": true }, "@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "devOptional": true }, "@yarnpkg/lockfile": { "version": "1.1.0", @@ -69651,7 +69742,8 @@ "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "devOptional": true }, "bin-links": { "version": "4.0.2", @@ -70556,7 +70648,8 @@ "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "devOptional": true }, "chromium-pickle-js": { "version": "0.2.0", @@ -72938,7 +73031,8 @@ "emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "devOptional": true }, "encode-utf8": { "version": "1.0.3", @@ -73003,6 +73097,7 @@ "version": "5.15.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "devOptional": true, "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -73011,7 +73106,8 @@ "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "devOptional": true } } }, @@ -73171,7 +73267,8 @@ "es-module-lexer": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "devOptional": true }, "es-set-tostringtag": { "version": "2.0.1", @@ -74274,6 +74371,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "devOptional": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -74282,7 +74380,8 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "devOptional": true } } }, @@ -74338,6 +74437,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "devOptional": true, "requires": { "estraverse": "^5.2.0" } @@ -74345,7 +74445,8 @@ "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "devOptional": true }, "estree-to-babel": { "version": "3.2.1", @@ -75071,6 +75172,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "devOptional": true, "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -75738,7 +75840,8 @@ "glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "devOptional": true }, "global": { "version": "4.4.0", @@ -79866,6 +79969,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "devOptional": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -86807,6 +86911,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "devOptional": true, "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -86817,6 +86922,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "devOptional": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -86828,12 +86934,14 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "devOptional": true, "requires": {} }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "devOptional": true } } }, @@ -89750,6 +89858,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "devOptional": true, "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -90018,6 +90127,7 @@ "version": "5.88.2", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "devOptional": true, "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -90048,12 +90158,14 @@ "@types/estree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "devOptional": true }, "@webassemblyjs/ast": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "devOptional": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -90062,28 +90174,33 @@ "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "devOptional": true }, "acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "devOptional": true }, "acorn-import-assertions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "devOptional": true, "requires": {} }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "devOptional": true }, "jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "devOptional": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -90093,12 +90210,14 @@ "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "devOptional": true }, "serialize-javascript": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "devOptional": true, "requires": { "randombytes": "^2.1.0" } @@ -90107,6 +90226,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "devOptional": true, "requires": { "has-flag": "^4.0.0" } @@ -90114,12 +90234,14 @@ "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "devOptional": true }, "terser-webpack-plugin": { "version": "5.3.9", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "devOptional": true, "requires": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", @@ -90131,7 +90253,8 @@ "webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "devOptional": true } } }, diff --git a/package.json b/package.json index 671d5a854e3..e926ab9b452 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "start": "npx react-native start", "web": "scripts/set-pusher-suffix.sh && concurrently npm:web-proxy npm:web-server", "web-proxy": "node web/proxy.js", - "web-server": "webpack-dev-server --open --config config/webpack/webpack.dev.js", + "web-server": "webpack-dev-server --config config/webpack/webpack.dev.js", "build": "webpack --config config/webpack/webpack.common.js --env envFile=.env.production", "build-staging": "webpack --config config/webpack/webpack.common.js --env envFile=.env.staging", "build-adhoc": "webpack --config config/webpack/webpack.common.js --env envFile=.env.adhoc", @@ -97,7 +97,6 @@ "domhandler": "^4.3.0", "expensify-common": "git+ssh://git@github.com/Expensify/expensify-common.git#bdbdf44825658500ba581d3e86237d7b8996cc2e", "fbjs": "^3.0.2", - "file-loader": "^6.2.0", "htmlparser2": "^7.2.0", "idb-keyval": "^6.2.1", "jest-when": "^3.5.2", From 4370e28437c828d689dbf16bfbcf5b225cbd6b38 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 22 Oct 2023 12:35:30 +0200 Subject: [PATCH 13/45] chore: reset package-lock.json --- package-lock.json | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1acd6b9097d..39220723706 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13150,6 +13150,13 @@ "node": ">=8" } }, + "node_modules/@storybook/builder-webpack5/node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, "node_modules/@storybook/builder-webpack5/node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -30731,6 +30738,7 @@ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "devOptional": true, + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -41523,11 +41531,6 @@ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, - "node_modules/node-libs-browser/node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" - }, "node_modules/node-libs-browser/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -42740,10 +42743,10 @@ } }, "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "license": "MIT" }, "node_modules/path-dirname": { "version": "1.0.2", @@ -62320,6 +62323,12 @@ "p-limit": "^2.2.0" } }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -82847,11 +82856,6 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" - }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -83700,10 +83704,9 @@ } }, "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" }, "path-dirname": { "version": "1.0.2", From e1fc68cd1e435f52e9158a2cd23a6d96fbcb9c16 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 22 Oct 2023 12:36:15 +0200 Subject: [PATCH 14/45] reset package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e926ab9b452..2ba8a358b94 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "start": "npx react-native start", "web": "scripts/set-pusher-suffix.sh && concurrently npm:web-proxy npm:web-server", "web-proxy": "node web/proxy.js", - "web-server": "webpack-dev-server --config config/webpack/webpack.dev.js", + "web-server": "webpack-dev-server --open --config config/webpack/webpack.dev.js", "build": "webpack --config config/webpack/webpack.common.js --env envFile=.env.production", "build-staging": "webpack --config config/webpack/webpack.common.js --env envFile=.env.staging", "build-adhoc": "webpack --config config/webpack/webpack.common.js --env envFile=.env.adhoc", From bfa85aeaaa80a2ce15d44259e0328df4deec31c4 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 25 Oct 2023 09:39:06 +0200 Subject: [PATCH 15/45] fix: update initialization --- index.js | 6 +++--- src/setup/index.js | 11 +++++++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index ac6b1e452a4..92ec0058bb2 100644 --- a/index.js +++ b/index.js @@ -6,8 +6,8 @@ import {enableLegacyWebImplementation} from 'react-native-gesture-handler'; import {AppRegistry} from 'react-native'; import App from './src/App'; import Config from './src/CONFIG'; -import additionalAppSetup from './src/setup'; +import * as Setup from './src/setup'; enableLegacyWebImplementation(true); -AppRegistry.registerComponent(Config.APP_NAME, () => App); -additionalAppSetup(); +Setup.blocking().then(() => AppRegistry.registerComponent(Config.APP_NAME, () => App)); +Setup.nonBlockingSetup(); diff --git a/src/setup/index.js b/src/setup/index.js index 5e92bff35ba..cb857357ccd 100644 --- a/src/setup/index.js +++ b/src/setup/index.js @@ -1,5 +1,6 @@ import {I18nManager} from 'react-native'; import Onyx from 'react-native-onyx'; +import {init} from 'react-native-encryptify'; import ONYXKEYS from '../ONYXKEYS'; import CONST from '../CONST'; import platformSetup from './platformSetup'; @@ -8,7 +9,7 @@ import * as Device from '../libs/actions/Device'; import intlPolyfill from '../libs/IntlPolyfill'; import exposeGlobalMemoryOnlyKeysMethods from '../libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods'; -export default function () { +const nonBlocking = function () { /* * Initialize the Onyx store when the app loads for the first time. * @@ -56,4 +57,10 @@ export default function () { // Perform any other platform-specific setup platformSetup(); -} +}; + +const blocking = function () { + return init(); +}; + +export {nonBlocking, blocking}; From 94fc3fcb7f70f14b94bc4bf6927efb77f290a91f Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 25 Oct 2023 09:39:38 +0200 Subject: [PATCH 16/45] update example --- src/Expensify.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index bec6e40a601..4d70666b9d2 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -4,6 +4,7 @@ import PropTypes from 'prop-types'; import React, {useCallback, useState, useEffect, useRef, useLayoutEffect, useMemo} from 'react'; import {AppState, Linking} from 'react-native'; import Onyx, {withOnyx} from 'react-native-onyx'; +import Encryptify from 'react-native-encryptify'; import * as Report from './libs/actions/Report'; import BootSplash from './libs/BootSplash'; import * as ActiveClientManager from './libs/ActiveClientManager'; @@ -31,13 +32,13 @@ import EmojiPicker from './components/EmojiPicker/EmojiPicker'; import * as EmojiPickerAction from './libs/actions/EmojiPickerAction'; import * as DemoActions from './libs/actions/DemoActions'; import DeeplinkWrapper from './components/DeeplinkWrapper'; +// import useEncryptify from './hooks/useEncryptify'; // This lib needs to be imported, but it has nothing to export since all it contains is an Onyx connection // eslint-disable-next-line no-unused-vars import UnreadIndicatorUpdater from './libs/UnreadIndicatorUpdater'; // eslint-disable-next-line no-unused-vars import subscribePushNotification from './libs/Notification/PushNotification/subscribePushNotification'; -import useEncryptify from './hooks/useEncryptify'; Onyx.registerLogger(({level, message}) => { if (level === 'alert') { @@ -188,11 +189,11 @@ function Expensify(props) { // eslint-disable-next-line react-hooks/exhaustive-deps -- we don't want this effect to run again }, []); - const {Encryptify, isEncryptifyReady} = useEncryptify(); + // const {Encryptify, isEncryptifyReady} = useEncryptify(); useEffect(() => { - if (!isEncryptifyReady) { - return; - } + // if (!isEncryptifyReady) { + // return; + // } const kemKeys = Encryptify.KEMGenKeys(); @@ -210,7 +211,7 @@ function Expensify(props) { const decryptedData = Encryptify.AESDecrypt('some iv value', decryptedSharedSecret, encryptedData); console.log({encryptedData, decryptedData}); - }, [Encryptify, isEncryptifyReady]); + }, []); // Display a blank page until the onyx migration completes if (!isOnyxMigrated) { From ef24c655ace23d537f74cfe57c7f6911e8a3b55d Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 25 Oct 2023 09:41:52 +0200 Subject: [PATCH 17/45] fix: wrong name --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 92ec0058bb2..623800a4426 100644 --- a/index.js +++ b/index.js @@ -10,4 +10,4 @@ import * as Setup from './src/setup'; enableLegacyWebImplementation(true); Setup.blocking().then(() => AppRegistry.registerComponent(Config.APP_NAME, () => App)); -Setup.nonBlockingSetup(); +Setup.nonBlocking(); From 39ba292012572becc713fe4a573dacd4a1af5680 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 25 Oct 2023 10:55:46 +0200 Subject: [PATCH 18/45] restructure setup logic --- index.js | 8 +++++-- src/setup/index.js | 27 +++++++++++++++--------- src/setup/platformSetup/index.desktop.js | 14 +++++++++++- src/setup/platformSetup/index.native.js | 14 +++++++++++- src/setup/platformSetup/index.website.js | 14 +++++++++++- 5 files changed, 62 insertions(+), 15 deletions(-) diff --git a/index.js b/index.js index 623800a4426..b6375e00f34 100644 --- a/index.js +++ b/index.js @@ -9,5 +9,9 @@ import Config from './src/CONFIG'; import * as Setup from './src/setup'; enableLegacyWebImplementation(true); -Setup.blocking().then(() => AppRegistry.registerComponent(Config.APP_NAME, () => App)); -Setup.nonBlocking(); + +Setup.beforeAppLoad().then(() => { + AppRegistry.registerComponent(Config.APP_NAME, () => App); + Setup.afterAppLoad(); +}); +Setup.additional(); diff --git a/src/setup/index.js b/src/setup/index.js index cb857357ccd..10a841c2180 100644 --- a/src/setup/index.js +++ b/src/setup/index.js @@ -1,15 +1,25 @@ import {I18nManager} from 'react-native'; import Onyx from 'react-native-onyx'; -import {init} from 'react-native-encryptify'; +import {init as initEncryptify} from 'react-native-encryptify'; import ONYXKEYS from '../ONYXKEYS'; import CONST from '../CONST'; -import platformSetup from './platformSetup'; +import * as PlatformSetup from './platformSetup'; import * as Metrics from '../libs/Metrics'; import * as Device from '../libs/actions/Device'; import intlPolyfill from '../libs/IntlPolyfill'; import exposeGlobalMemoryOnlyKeysMethods from '../libs/actions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods'; -const nonBlocking = function () { +function beforeAppLoad() { + PlatformSetup.beforeAppLoad(); + return initEncryptify(); +} + +function afterAppLoad() { + // Perform any other platform-specific setup + PlatformSetup.afterAppLoad(); +} + +function additional() { /* * Initialize the Onyx store when the app loads for the first time. * @@ -55,12 +65,9 @@ const nonBlocking = function () { // Polyfill the Intl API if locale data is not as expected intlPolyfill(); - // Perform any other platform-specific setup - platformSetup(); -}; + PlatformSetup.additional(); -const blocking = function () { - return init(); -}; + return Promise.resolve(); +} -export {nonBlocking, blocking}; +export {beforeAppLoad, afterAppLoad, additional}; diff --git a/src/setup/platformSetup/index.desktop.js b/src/setup/platformSetup/index.desktop.js index 0fff03ed252..d3c1a8b3a9e 100644 --- a/src/setup/platformSetup/index.desktop.js +++ b/src/setup/platformSetup/index.desktop.js @@ -6,7 +6,15 @@ import ELECTRON_EVENTS from '../../../desktop/ELECTRON_EVENTS'; import ROUTES from '../../ROUTES'; import Navigation from '../../libs/Navigation/Navigation'; -export default function () { +function beforeAppLoad() { + return Promise.resolve(); +} + +function afterAppLoad() { + return Promise.resolve(); +} + +function additional() { AppRegistry.runApplication(Config.APP_NAME, { rootTag: document.getElementById('root'), }); @@ -23,4 +31,8 @@ export default function () { // Start current date updater DateUtils.startCurrentDateUpdater(); + + return Promise.resolve(); } + +export {beforeAppLoad, afterAppLoad, additional}; diff --git a/src/setup/platformSetup/index.native.js b/src/setup/platformSetup/index.native.js index 470bef78848..04e9f03158e 100644 --- a/src/setup/platformSetup/index.native.js +++ b/src/setup/platformSetup/index.native.js @@ -4,7 +4,15 @@ import PushNotification from '../../libs/Notification/PushNotification'; import Performance from '../../libs/Performance'; import subscribeToReportCommentPushNotifications from '../../libs/Notification/PushNotification/subscribeToReportCommentPushNotifications'; -export default function () { +function beforeAppLoad() { + return Promise.resolve(); +} + +function afterAppLoad() { + return Promise.resolve(); +} + +function additional() { // We do not want to send crash reports if we are on a locally built release version of the app. // Crashlytics is disabled by default for debug builds, but not local release builds so we are using // an environment variable to enable them in the staging & production apps and opt-out everywhere else. @@ -22,4 +30,8 @@ export default function () { subscribeToReportCommentPushNotifications(); Performance.setupPerformanceObserver(); + + return Promise.resolve(); } + +export {beforeAppLoad, afterAppLoad, additional}; diff --git a/src/setup/platformSetup/index.website.js b/src/setup/platformSetup/index.website.js index e859005c9ab..8a15f019e60 100644 --- a/src/setup/platformSetup/index.website.js +++ b/src/setup/platformSetup/index.website.js @@ -55,11 +55,19 @@ const webUpdater = () => ({ update: () => webUpdate(), }); -export default function () { +function beforeAppLoad() { + return Promise.resolve(); +} + +function afterAppLoad() { AppRegistry.runApplication(Config.APP_NAME, { rootTag: document.getElementById('root'), }); + return Promise.resolve(); +} + +function additional() { // When app loads, get current version (production only) if (Config.IS_IN_PRODUCTION) { checkForUpdates(webUpdater()); @@ -67,4 +75,8 @@ export default function () { // Start current date updater DateUtils.startCurrentDateUpdater(); + + return Promise.resolve(); } + +export {beforeAppLoad, afterAppLoad, additional}; From 209a83c5a3602f3a9f88cd427686d82acd9f907b Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 25 Oct 2023 11:03:26 +0200 Subject: [PATCH 19/45] add log --- src/Expensify.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Expensify.js b/src/Expensify.js index 4d70666b9d2..625d944f919 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -195,6 +195,8 @@ function Expensify(props) { // return; // } + console.log('call Encryptify'); + const kemKeys = Encryptify.KEMGenKeys(); console.log({kemKeys}); From 7e05e4e407f477b9b5a76b2590db0067521a941d Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 25 Oct 2023 12:22:09 +0200 Subject: [PATCH 20/45] add missing return --- src/setup/index.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/setup/index.js b/src/setup/index.js index 10a841c2180..f6c61c81f65 100644 --- a/src/setup/index.js +++ b/src/setup/index.js @@ -16,7 +16,7 @@ function beforeAppLoad() { function afterAppLoad() { // Perform any other platform-specific setup - PlatformSetup.afterAppLoad(); + return PlatformSetup.afterAppLoad(); } function additional() { @@ -65,9 +65,7 @@ function additional() { // Polyfill the Intl API if locale data is not as expected intlPolyfill(); - PlatformSetup.additional(); - - return Promise.resolve(); + return PlatformSetup.additional(); } export {beforeAppLoad, afterAppLoad, additional}; From 7d1c5131b675b8a4f467046e88754dbd98fd81dc Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Wed, 25 Oct 2023 15:33:57 +0200 Subject: [PATCH 21/45] clean up example --- src/Expensify.js | 9 ++------- src/hooks/useEncryptify.js | 18 ------------------ 2 files changed, 2 insertions(+), 25 deletions(-) delete mode 100644 src/hooks/useEncryptify.js diff --git a/src/Expensify.js b/src/Expensify.js index 625d944f919..8355eadf2ee 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -189,16 +189,10 @@ function Expensify(props) { // eslint-disable-next-line react-hooks/exhaustive-deps -- we don't want this effect to run again }, []); - // const {Encryptify, isEncryptifyReady} = useEncryptify(); useEffect(() => { - // if (!isEncryptifyReady) { - // return; - // } - - console.log('call Encryptify'); - const kemKeys = Encryptify.KEMGenKeys(); + // eslint-disable-next-line no-console console.log({kemKeys}); const data = 'Hello World! 123'; @@ -212,6 +206,7 @@ function Expensify(props) { const decryptedSharedSecret = Encryptify.KEMDecrypt(kemKeys.private, cipherText); const decryptedData = Encryptify.AESDecrypt('some iv value', decryptedSharedSecret, encryptedData); + // eslint-disable-next-line no-console console.log({encryptedData, decryptedData}); }, []); diff --git a/src/hooks/useEncryptify.js b/src/hooks/useEncryptify.js deleted file mode 100644 index a68c8a15bf9..00000000000 --- a/src/hooks/useEncryptify.js +++ /dev/null @@ -1,18 +0,0 @@ -import {useEffect, useState} from 'react'; -import EncryptifyModule, {initializationPromise} from 'react-native-encryptify'; - -const useEncryptify = () => { - const [Encryptify, setEncryptify] = useState(EncryptifyModule); - const [ready, setReady] = useState(false); - - useEffect(() => { - initializationPromise.then((instance) => { - setEncryptify(instance); - setReady(true); - }); - }, []); - - return {Encryptify, isEncryptifyReady: ready}; -}; - -export default useEncryptify; From 0c3df42f112dc19d8de211247cae01fea3b99c72 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 27 Oct 2023 17:43:29 +0200 Subject: [PATCH 22/45] update example to add performance tests --- src/Expensify.js | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index 8355eadf2ee..9a6b8145bf5 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -5,6 +5,7 @@ import React, {useCallback, useState, useEffect, useRef, useLayoutEffect, useMem import {AppState, Linking} from 'react-native'; import Onyx, {withOnyx} from 'react-native-onyx'; import Encryptify from 'react-native-encryptify'; +import performance from 'react-native-performance'; import * as Report from './libs/actions/Report'; import BootSplash from './libs/BootSplash'; import * as ActiveClientManager from './libs/ActiveClientManager'; @@ -40,6 +41,11 @@ import UnreadIndicatorUpdater from './libs/UnreadIndicatorUpdater'; // eslint-disable-next-line no-unused-vars import subscribePushNotification from './libs/Notification/PushNotification/subscribePushNotification'; +// 255 characters string for testing the encryption lib +const ENCRYPTION_DATA = + 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis,'; +const ENCRYPTION_IV = 'Lorem ipsum dolor sit amet'; + Onyx.registerLogger(({level, message}) => { if (level === 'alert') { Log.alert(message); @@ -190,24 +196,49 @@ function Expensify(props) { }, []); useEffect(() => { + performance.mark('beforeKemGenKeys'); const kemKeys = Encryptify.KEMGenKeys(); + performance.measure('KEMGenKeys', 'beforeKemGenKeys'); // eslint-disable-next-line no-console console.log({kemKeys}); - const data = 'Hello World! 123'; + performance.mark('beforeKEMEncrypt'); const {sharedSecret, cipherText} = Encryptify.KEMEncrypt(kemKeys.public); - const encryptedData = Encryptify.AESEncrypt('some iv value', sharedSecret, data); + performance.measure('KEMEncrypt', 'beforeKEMEncrypt'); + + performance.mark('beforeAESEncrypt'); + const encryptedData = Encryptify.AESEncrypt(ENCRYPTION_IV, sharedSecret, ENCRYPTION_DATA); + performance.measure('AESEncrypt', 'beforeAESEncrypt'); // After encryption on the sender side, the message is sent to the receiver: // Only the encryptedData an the cipherText must be sent to the receiver // The receiver can then decrypt the cipherText with his private keys + performance.mark('beforeKEMDecrypt'); const decryptedSharedSecret = Encryptify.KEMDecrypt(kemKeys.private, cipherText); - const decryptedData = Encryptify.AESDecrypt('some iv value', decryptedSharedSecret, encryptedData); + performance.measure('KEMDecrypt', 'beforeKEMDecrypt'); + + performance.mark('beforeAESDecrypt'); + const decryptedData = Encryptify.AESDecrypt(ENCRYPTION_IV, decryptedSharedSecret, encryptedData); + performance.measure('AESDecrypt', 'beforeAESDecrypt'); + + const logString = `"${ENCRYPTION_DATA}" +got encrypted to: +${encryptedData} +and decrypted back to: +${decryptedData} +Success: ${ENCRYPTION_DATA === decryptedData} + +Performance: + +`; + + // eslint-disable-next-line no-console + console.log(logString); // eslint-disable-next-line no-console - console.log({encryptedData, decryptedData}); + console.log(performance.getEntriesByType('measure')); }, []); // Display a blank page until the onyx migration completes From c0624d39f0a55bb71d40ca41a4908feede1e92ec Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 27 Oct 2023 17:53:11 +0200 Subject: [PATCH 23/45] add more performance metrics --- src/Expensify.js | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index 9a6b8145bf5..fcd8537d085 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -196,32 +196,32 @@ function Expensify(props) { }, []); useEffect(() => { - performance.mark('beforeKemGenKeys'); + performance.mark('KEMGenKeys'); const kemKeys = Encryptify.KEMGenKeys(); - performance.measure('KEMGenKeys', 'beforeKemGenKeys'); + performance.measure('KEMGenKeys', 'KEMGenKeys'); // eslint-disable-next-line no-console console.log({kemKeys}); - performance.mark('beforeKEMEncrypt'); + performance.mark('KEMEncrypt'); const {sharedSecret, cipherText} = Encryptify.KEMEncrypt(kemKeys.public); - performance.measure('KEMEncrypt', 'beforeKEMEncrypt'); + performance.measure('KEMEncrypt', 'KEMEncrypt'); - performance.mark('beforeAESEncrypt'); + performance.mark('AESEncrypt'); const encryptedData = Encryptify.AESEncrypt(ENCRYPTION_IV, sharedSecret, ENCRYPTION_DATA); - performance.measure('AESEncrypt', 'beforeAESEncrypt'); + performance.measure('AESEncrypt', 'AESEncrypt'); // After encryption on the sender side, the message is sent to the receiver: // Only the encryptedData an the cipherText must be sent to the receiver // The receiver can then decrypt the cipherText with his private keys - performance.mark('beforeKEMDecrypt'); + performance.mark('KEMDecrypt'); const decryptedSharedSecret = Encryptify.KEMDecrypt(kemKeys.private, cipherText); - performance.measure('KEMDecrypt', 'beforeKEMDecrypt'); + performance.measure('KEMDecrypt', 'KEMDecrypt'); - performance.mark('beforeAESDecrypt'); + performance.mark('AESDecrypt'); const decryptedData = Encryptify.AESDecrypt(ENCRYPTION_IV, decryptedSharedSecret, encryptedData); - performance.measure('AESDecrypt', 'beforeAESDecrypt'); + performance.measure('AESDecrypt', 'AESDecrypt'); const logString = `"${ENCRYPTION_DATA}" got encrypted to: @@ -239,6 +239,29 @@ Performance: console.log(logString); // eslint-disable-next-line no-console console.log(performance.getEntriesByType('measure')); + + performance.clearMarks(); + performance.clearMeasures(); + + for (let i = 0; i < 100; i++) { + // eslint-disable-next-line no-bitwise + const inputData = ENCRYPTION_DATA >> i; + + performance.mark('AESEncrypt under load'); + const encryptedDataIter = Encryptify.AESEncrypt(ENCRYPTION_IV, sharedSecret, inputData); + performance.measure(`Iteration ${i}`, 'AESEncrypt under load'); + + performance.mark('AESDecrypt under load'); + Encryptify.AESDecrypt(ENCRYPTION_IV, sharedSecret, encryptedDataIter); + performance.measure(`Iteration ${i}`, 'AESDecrypt under load'); + } + + // eslint-disable-next-line no-console + console.log('Under Load: (encrypting/decrypting 100 times)'); + // eslint-disable-next-line no-console + console.log(performance.getEntriesByName('AESEncrypt under load')); + // eslint-disable-next-line no-console + console.log(performance.getEntriesByName('AESDecrypt under load')); }, []); // Display a blank page until the onyx migration completes From d86b2d1b2e2e0cabddb61f301029888a70e5e91b Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 27 Oct 2023 18:13:22 +0200 Subject: [PATCH 24/45] fix: extract performance test code --- src/Expensify.js | 75 +------------------------ src/testEncryptifyPerformance.ts | 95 ++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 72 deletions(-) create mode 100644 src/testEncryptifyPerformance.ts diff --git a/src/Expensify.js b/src/Expensify.js index fcd8537d085..4f13d70ecbe 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -4,8 +4,6 @@ import PropTypes from 'prop-types'; import React, {useCallback, useState, useEffect, useRef, useLayoutEffect, useMemo} from 'react'; import {AppState, Linking} from 'react-native'; import Onyx, {withOnyx} from 'react-native-onyx'; -import Encryptify from 'react-native-encryptify'; -import performance from 'react-native-performance'; import * as Report from './libs/actions/Report'; import BootSplash from './libs/BootSplash'; import * as ActiveClientManager from './libs/ActiveClientManager'; @@ -40,11 +38,7 @@ import DeeplinkWrapper from './components/DeeplinkWrapper'; import UnreadIndicatorUpdater from './libs/UnreadIndicatorUpdater'; // eslint-disable-next-line no-unused-vars import subscribePushNotification from './libs/Notification/PushNotification/subscribePushNotification'; - -// 255 characters string for testing the encryption lib -const ENCRYPTION_DATA = - 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis,'; -const ENCRYPTION_IV = 'Lorem ipsum dolor sit amet'; +import {testAesUnderLoad, testEncryptionFlow} from './testEncryptifyPerformance'; Onyx.registerLogger(({level, message}) => { if (level === 'alert') { @@ -196,72 +190,9 @@ function Expensify(props) { }, []); useEffect(() => { - performance.mark('KEMGenKeys'); - const kemKeys = Encryptify.KEMGenKeys(); - performance.measure('KEMGenKeys', 'KEMGenKeys'); - - // eslint-disable-next-line no-console - console.log({kemKeys}); - - performance.mark('KEMEncrypt'); - const {sharedSecret, cipherText} = Encryptify.KEMEncrypt(kemKeys.public); - performance.measure('KEMEncrypt', 'KEMEncrypt'); - - performance.mark('AESEncrypt'); - const encryptedData = Encryptify.AESEncrypt(ENCRYPTION_IV, sharedSecret, ENCRYPTION_DATA); - performance.measure('AESEncrypt', 'AESEncrypt'); - - // After encryption on the sender side, the message is sent to the receiver: - // Only the encryptedData an the cipherText must be sent to the receiver - // The receiver can then decrypt the cipherText with his private keys - - performance.mark('KEMDecrypt'); - const decryptedSharedSecret = Encryptify.KEMDecrypt(kemKeys.private, cipherText); - performance.measure('KEMDecrypt', 'KEMDecrypt'); - - performance.mark('AESDecrypt'); - const decryptedData = Encryptify.AESDecrypt(ENCRYPTION_IV, decryptedSharedSecret, encryptedData); - performance.measure('AESDecrypt', 'AESDecrypt'); - - const logString = `"${ENCRYPTION_DATA}" -got encrypted to: -${encryptedData} -and decrypted back to: -${decryptedData} - -Success: ${ENCRYPTION_DATA === decryptedData} - -Performance: - -`; - - // eslint-disable-next-line no-console - console.log(logString); - // eslint-disable-next-line no-console - console.log(performance.getEntriesByType('measure')); - - performance.clearMarks(); - performance.clearMeasures(); - - for (let i = 0; i < 100; i++) { - // eslint-disable-next-line no-bitwise - const inputData = ENCRYPTION_DATA >> i; - - performance.mark('AESEncrypt under load'); - const encryptedDataIter = Encryptify.AESEncrypt(ENCRYPTION_IV, sharedSecret, inputData); - performance.measure(`Iteration ${i}`, 'AESEncrypt under load'); - - performance.mark('AESDecrypt under load'); - Encryptify.AESDecrypt(ENCRYPTION_IV, sharedSecret, encryptedDataIter); - performance.measure(`Iteration ${i}`, 'AESDecrypt under load'); - } + const sharedSecret = testEncryptionFlow(true); - // eslint-disable-next-line no-console - console.log('Under Load: (encrypting/decrypting 100 times)'); - // eslint-disable-next-line no-console - console.log(performance.getEntriesByName('AESEncrypt under load')); - // eslint-disable-next-line no-console - console.log(performance.getEntriesByName('AESDecrypt under load')); + testAesUnderLoad(sharedSecret, 100, true); }, []); // Display a blank page until the onyx migration completes diff --git a/src/testEncryptifyPerformance.ts b/src/testEncryptifyPerformance.ts new file mode 100644 index 00000000000..791ba84b361 --- /dev/null +++ b/src/testEncryptifyPerformance.ts @@ -0,0 +1,95 @@ +import Encryptify from 'react-native-encryptify'; +import performance from 'react-native-performance'; + +// 255 characters string for testing the encryption lib +const ENCRYPTION_DATA = + 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis,'; +const ENCRYPTION_IV = 'Lorem ipsum dolor sit amet'; + +const testEncryptionFlow = (shouldLog = true): string => { + performance.mark('KEMGenKeys'); + const kemKeys = Encryptify.KEMGenKeys(); + performance.measure('KEMGenKeys', 'KEMGenKeys'); + + performance.mark('KEMEncrypt'); + const {sharedSecret, cipherText} = Encryptify.KEMEncrypt(kemKeys.public); + performance.measure('KEMEncrypt', 'KEMEncrypt'); + + performance.mark('AESEncrypt'); + const encryptedData = Encryptify.AESEncrypt(ENCRYPTION_IV, sharedSecret, ENCRYPTION_DATA); + performance.measure('AESEncrypt', 'AESEncrypt'); + + // After encryption on the sender side, the message is sent to the receiver: + // Only the encryptedData an the cipherText must be sent to the receiver + // The receiver can then decrypt the cipherText with his private keys + + performance.mark('KEMDecrypt'); + const decryptedSharedSecret = Encryptify.KEMDecrypt(kemKeys.private, cipherText); + performance.measure('KEMDecrypt', 'KEMDecrypt'); + + performance.mark('AESDecrypt'); + const decryptedData = Encryptify.AESDecrypt(ENCRYPTION_IV, decryptedSharedSecret, encryptedData); + performance.measure('AESDecrypt', 'AESDecrypt'); + + performance.clearMarks(); + performance.clearMeasures(); + + if (shouldLog) { + console.log({kemKeys}); + + const logString = `"${ENCRYPTION_DATA}" +got encrypted to: +${encryptedData} +and decrypted back to: +${decryptedData} + +Success: ${ENCRYPTION_DATA === decryptedData} + +Performance: + +`; + + // eslint-disable-next-line no-console + console.log(logString); + // eslint-disable-next-line no-console + console.log(performance.getEntriesByType('measure')); + } + + return sharedSecret; +}; + +const testAesUnderLoad = (sharedSecret: string, iterations: number, shouldLog = true) => { + const shiftString = (str: string, numOfChars: number) => str.substring(numOfChars) + str.substring(0, numOfChars); + + for (let i = 0; i < iterations; i++) { + // eslint-disable-next-line no-bitwise + const inputData = shiftString(ENCRYPTION_DATA, i); + + performance.mark('AESEncrypt under load'); + const encryptedDataIter = Encryptify.AESEncrypt(ENCRYPTION_IV, sharedSecret, inputData); + performance.measure(`Iteration ${i}`, 'AESEncrypt under load'); + + performance.mark('AESDecrypt under load'); + Encryptify.AESDecrypt(ENCRYPTION_IV, sharedSecret, encryptedDataIter); + performance.measure(`Iteration ${i}`, 'AESDecrypt under load'); + } + + const getAverageTime = (name: string) => performance.getEntriesByName(name).reduce((total, entry) => total + entry.duration, 0) / iterations; + const averageTimeToEncrypt = getAverageTime('AESEncrypt under load'); + const averageTimeToDecrypt = getAverageTime('AESDecrypt under load'); + + if (shouldLog) { + // eslint-disable-next-line no-console + console.log('Under Load: (encrypting/decrypting 100 times)'); + // eslint-disable-next-line no-console + console.log(performance.getEntriesByName('AESEncrypt under load')); + // eslint-disable-next-line no-console + console.log(`Average time to encrypt: ${averageTimeToEncrypt}ms`); + // eslint-disable-next-line no-console + console.log(performance.getEntriesByName('AESDecrypt under load')); + // eslint-disable-next-line no-console + console.log(`Average time to decrypt: ${averageTimeToDecrypt}ms`); + } +}; + +export {testEncryptionFlow, testAesUnderLoad}; From 7440e51e3aa43ff6a4583b4b18584c223e823d2c Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 27 Oct 2023 18:21:01 +0200 Subject: [PATCH 25/45] fix: improve performance test --- src/testEncryptifyPerformance.ts | 42 ++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/src/testEncryptifyPerformance.ts b/src/testEncryptifyPerformance.ts index 791ba84b361..9c60cc0a4a0 100644 --- a/src/testEncryptifyPerformance.ts +++ b/src/testEncryptifyPerformance.ts @@ -1,5 +1,5 @@ import Encryptify from 'react-native-encryptify'; -import performance from 'react-native-performance'; +import performance, {PerformanceMeasure} from 'react-native-performance'; // 255 characters string for testing the encryption lib const ENCRYPTION_DATA = @@ -31,9 +31,6 @@ const testEncryptionFlow = (shouldLog = true): string => { const decryptedData = Encryptify.AESDecrypt(ENCRYPTION_IV, decryptedSharedSecret, encryptedData); performance.measure('AESDecrypt', 'AESDecrypt'); - performance.clearMarks(); - performance.clearMeasures(); - if (shouldLog) { console.log({kemKeys}); @@ -49,12 +46,18 @@ Performance: `; - // eslint-disable-next-line no-console + const performanceLines = performance + .getEntriesByType('measure') + .map((entry) => `${entry.name}: ${entry.duration}ms`) + .join('\n'); + console.log(logString); - // eslint-disable-next-line no-console - console.log(performance.getEntriesByType('measure')); + console.log(performanceLines); } + performance.clearMarks(); + performance.clearMeasures(); + return sharedSecret; }; @@ -67,29 +70,38 @@ const testAesUnderLoad = (sharedSecret: string, iterations: number, shouldLog = performance.mark('AESEncrypt under load'); const encryptedDataIter = Encryptify.AESEncrypt(ENCRYPTION_IV, sharedSecret, inputData); - performance.measure(`Iteration ${i}`, 'AESEncrypt under load'); + performance.measure(`Encryption Iteration ${i}`, 'AESEncrypt under load'); performance.mark('AESDecrypt under load'); Encryptify.AESDecrypt(ENCRYPTION_IV, sharedSecret, encryptedDataIter); - performance.measure(`Iteration ${i}`, 'AESDecrypt under load'); + performance.measure(`Decryption teration ${i}`, 'AESDecrypt under load'); } - const getAverageTime = (name: string) => performance.getEntriesByName(name).reduce((total, entry) => total + entry.duration, 0) / iterations; - const averageTimeToEncrypt = getAverageTime('AESEncrypt under load'); - const averageTimeToDecrypt = getAverageTime('AESDecrypt under load'); + const allMeasures = performance.getEntriesByType('measure'); + const encryptionMeasures = allMeasures.filter((measure) => measure.name.includes('Encryption')); + const decryptionMeasures = allMeasures.filter((measure) => measure.name.includes('Decryption')); + + const getMeanTime = (measures: PerformanceMeasure[]) => measures.reduce((total, entry) => total + entry.duration, 0) / iterations; + const getMinTime = (measures: PerformanceMeasure[]) => Math.min(...measures.map((entry) => entry.duration)); + const getMaxTime = (measures: PerformanceMeasure[]) => Math.max(...measures.map((entry) => entry.duration)); if (shouldLog) { + const printData = (measures: PerformanceMeasure[]) => `Encryption | Mean: ${getMeanTime(measures)}ms, Min: ${getMinTime(measures)}ms, Max: ${getMaxTime(measures)}ms`; + // eslint-disable-next-line no-console - console.log('Under Load: (encrypting/decrypting 100 times)'); + console.log(`Under Load: (encrypting/decrypting ${iterations} times)`); // eslint-disable-next-line no-console console.log(performance.getEntriesByName('AESEncrypt under load')); // eslint-disable-next-line no-console - console.log(`Average time to encrypt: ${averageTimeToEncrypt}ms`); + console.log(printData(encryptionMeasures)); // eslint-disable-next-line no-console console.log(performance.getEntriesByName('AESDecrypt under load')); // eslint-disable-next-line no-console - console.log(`Average time to decrypt: ${averageTimeToDecrypt}ms`); + console.log(printData(encryptionMeasures)); } + + performance.clearMarks(); + performance.clearMeasures(); }; export {testEncryptionFlow, testAesUnderLoad}; From 04d1b0453b1845edde50ac1c09bb337fec6b2af1 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 27 Oct 2023 18:24:20 +0200 Subject: [PATCH 26/45] update tests --- src/testEncryptifyPerformance.ts | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/testEncryptifyPerformance.ts b/src/testEncryptifyPerformance.ts index 9c60cc0a4a0..080072f025c 100644 --- a/src/testEncryptifyPerformance.ts +++ b/src/testEncryptifyPerformance.ts @@ -5,6 +5,7 @@ import performance, {PerformanceMeasure} from 'react-native-performance'; const ENCRYPTION_DATA = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis,'; const ENCRYPTION_IV = 'Lorem ipsum dolor sit amet'; +const PERFORMANCE_METRICS_DECIMAL_PLACES = 4; const testEncryptionFlow = (shouldLog = true): string => { performance.mark('KEMGenKeys'); @@ -48,7 +49,7 @@ Performance: const performanceLines = performance .getEntriesByType('measure') - .map((entry) => `${entry.name}: ${entry.duration}ms`) + .map((entry) => `${entry.name}: ${entry.duration.toFixed(PERFORMANCE_METRICS_DECIMAL_PLACES)}ms`) .join('\n'); console.log(logString); @@ -65,7 +66,6 @@ const testAesUnderLoad = (sharedSecret: string, iterations: number, shouldLog = const shiftString = (str: string, numOfChars: number) => str.substring(numOfChars) + str.substring(0, numOfChars); for (let i = 0; i < iterations; i++) { - // eslint-disable-next-line no-bitwise const inputData = shiftString(ENCRYPTION_DATA, i); performance.mark('AESEncrypt under load'); @@ -86,18 +86,14 @@ const testAesUnderLoad = (sharedSecret: string, iterations: number, shouldLog = const getMaxTime = (measures: PerformanceMeasure[]) => Math.max(...measures.map((entry) => entry.duration)); if (shouldLog) { - const printData = (measures: PerformanceMeasure[]) => `Encryption | Mean: ${getMeanTime(measures)}ms, Min: ${getMinTime(measures)}ms, Max: ${getMaxTime(measures)}ms`; + const printData = (measures: PerformanceMeasure[]) => + `Encryption | Mean: ${getMeanTime(measures).toFixed(PERFORMANCE_METRICS_DECIMAL_PLACES)}ms, Min: ${getMinTime(measures).toFixed( + PERFORMANCE_METRICS_DECIMAL_PLACES, + )}ms, Max: ${getMaxTime(measures).toFixed(PERFORMANCE_METRICS_DECIMAL_PLACES)}ms`; - // eslint-disable-next-line no-console console.log(`Under Load: (encrypting/decrypting ${iterations} times)`); - // eslint-disable-next-line no-console - console.log(performance.getEntriesByName('AESEncrypt under load')); - // eslint-disable-next-line no-console - console.log(printData(encryptionMeasures)); - // eslint-disable-next-line no-console - console.log(performance.getEntriesByName('AESDecrypt under load')); - // eslint-disable-next-line no-console console.log(printData(encryptionMeasures)); + console.log(printData(decryptionMeasures)); } performance.clearMarks(); From f616e59214ebcd6288454f87f645cd71ee6b5142 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 27 Oct 2023 18:26:55 +0200 Subject: [PATCH 27/45] fix: typo --- src/testEncryptifyPerformance.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/testEncryptifyPerformance.ts b/src/testEncryptifyPerformance.ts index 080072f025c..2e5093af874 100644 --- a/src/testEncryptifyPerformance.ts +++ b/src/testEncryptifyPerformance.ts @@ -87,13 +87,13 @@ const testAesUnderLoad = (sharedSecret: string, iterations: number, shouldLog = if (shouldLog) { const printData = (measures: PerformanceMeasure[]) => - `Encryption | Mean: ${getMeanTime(measures).toFixed(PERFORMANCE_METRICS_DECIMAL_PLACES)}ms, Min: ${getMinTime(measures).toFixed( - PERFORMANCE_METRICS_DECIMAL_PLACES, - )}ms, Max: ${getMaxTime(measures).toFixed(PERFORMANCE_METRICS_DECIMAL_PLACES)}ms`; + `Mean: ${getMeanTime(measures).toFixed(PERFORMANCE_METRICS_DECIMAL_PLACES)}ms, Min: ${getMinTime(measures).toFixed(PERFORMANCE_METRICS_DECIMAL_PLACES)}ms, Max: ${getMaxTime( + measures, + ).toFixed(PERFORMANCE_METRICS_DECIMAL_PLACES)}ms`; console.log(`Under Load: (encrypting/decrypting ${iterations} times)`); - console.log(printData(encryptionMeasures)); - console.log(printData(decryptionMeasures)); + console.log(`Encryption: ${printData(encryptionMeasures)}`); + console.log(`Decryption: ${printData(decryptionMeasures)}`); } performance.clearMarks(); From 2d9cd01aec8179c2e2ea2fc2711aa8939e0a7302 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 27 Oct 2023 18:31:03 +0200 Subject: [PATCH 28/45] add more tests --- src/Expensify.js | 2 ++ src/testEncryptifyPerformance.ts | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index 4f13d70ecbe..c0dc6c6b872 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -193,6 +193,8 @@ function Expensify(props) { const sharedSecret = testEncryptionFlow(true); testAesUnderLoad(sharedSecret, 100, true); + testAesUnderLoad(sharedSecret, 1000, true); + testAesUnderLoad(sharedSecret, 10000, true); }, []); // Display a blank page until the onyx migration completes diff --git a/src/testEncryptifyPerformance.ts b/src/testEncryptifyPerformance.ts index 2e5093af874..ec5ab08dcd0 100644 --- a/src/testEncryptifyPerformance.ts +++ b/src/testEncryptifyPerformance.ts @@ -92,8 +92,8 @@ const testAesUnderLoad = (sharedSecret: string, iterations: number, shouldLog = ).toFixed(PERFORMANCE_METRICS_DECIMAL_PLACES)}ms`; console.log(`Under Load: (encrypting/decrypting ${iterations} times)`); - console.log(`Encryption: ${printData(encryptionMeasures)}`); - console.log(`Decryption: ${printData(decryptionMeasures)}`); + console.log(`Encryption | ${printData(encryptionMeasures)}`); + console.log(`Decryption | ${printData(decryptionMeasures)}`); } performance.clearMarks(); From 68d79d9b16cc4b0b6f84379b37f25dce3598844c Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 27 Oct 2023 18:33:48 +0200 Subject: [PATCH 29/45] add wasm load time metric --- index.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/index.js b/index.js index b6375e00f34..e3de648f4de 100644 --- a/index.js +++ b/index.js @@ -7,10 +7,17 @@ import {AppRegistry} from 'react-native'; import App from './src/App'; import Config from './src/CONFIG'; import * as Setup from './src/setup'; +import performance from 'react-native-performance'; + +performance.mark('appStartup'); enableLegacyWebImplementation(true); Setup.beforeAppLoad().then(() => { + performance.measure('Encryptify WASM load', 'appStartup'); + const wasmLoadTime = performance.getEntriesByName('Encryptify WASM load')[0].duration; + console.log(`Encryptify WASM load time: ${wasmLoadTime}ms`); + AppRegistry.registerComponent(Config.APP_NAME, () => App); Setup.afterAppLoad(); }); From 77594c8bb705587347219c972bc2e3bad88d5f62 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 27 Oct 2023 18:35:02 +0200 Subject: [PATCH 30/45] update app startup test --- index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index e3de648f4de..eecf6c73d81 100644 --- a/index.js +++ b/index.js @@ -8,6 +8,7 @@ import App from './src/App'; import Config from './src/CONFIG'; import * as Setup from './src/setup'; import performance from 'react-native-performance'; +import {PERFORMANCE_METRICS_DECIMAL_PLACES} from './src/testEncryptifyPerformance'; performance.mark('appStartup'); @@ -16,7 +17,7 @@ enableLegacyWebImplementation(true); Setup.beforeAppLoad().then(() => { performance.measure('Encryptify WASM load', 'appStartup'); const wasmLoadTime = performance.getEntriesByName('Encryptify WASM load')[0].duration; - console.log(`Encryptify WASM load time: ${wasmLoadTime}ms`); + console.log(`Encryptify WASM load time: ${wasmLoadTime.toFixed(PERFORMANCE_METRICS_DECIMAL_PLACES)}ms`); AppRegistry.registerComponent(Config.APP_NAME, () => App); Setup.afterAppLoad(); From d2b1996740f5726d0128e078f57a6301ac33064c Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 27 Oct 2023 18:35:09 +0200 Subject: [PATCH 31/45] export constant --- src/testEncryptifyPerformance.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/testEncryptifyPerformance.ts b/src/testEncryptifyPerformance.ts index ec5ab08dcd0..0f5c21d6b63 100644 --- a/src/testEncryptifyPerformance.ts +++ b/src/testEncryptifyPerformance.ts @@ -100,4 +100,4 @@ const testAesUnderLoad = (sharedSecret: string, iterations: number, shouldLog = performance.clearMeasures(); }; -export {testEncryptionFlow, testAesUnderLoad}; +export {testEncryptionFlow, testAesUnderLoad, PERFORMANCE_METRICS_DECIMAL_PLACES}; From 4ba1c5c8e23791eec3db21ec53fb44b1b52cc876 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sat, 28 Oct 2023 17:23:57 +0200 Subject: [PATCH 32/45] update example to use async functions --- src/Expensify.js | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index 8355eadf2ee..697bfca9e65 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -190,24 +190,28 @@ function Expensify(props) { }, []); useEffect(() => { - const kemKeys = Encryptify.KEMGenKeys(); + async function exec() { + const kemKeys = await Encryptify.KemGenKeys(); - // eslint-disable-next-line no-console - console.log({kemKeys}); + // eslint-disable-next-line no-console + console.log({kemKeys}); - const data = 'Hello World! 123'; - const {sharedSecret, cipherText} = Encryptify.KEMEncrypt(kemKeys.public); - const encryptedData = Encryptify.AESEncrypt('some iv value', sharedSecret, data); + const data = 'Hello World! 123'; + const {sharedSecret, cipherText} = await Encryptify.KemEncrypt(kemKeys.public); + const encryptedData = await Encryptify.AesEncrypt('some iv value', sharedSecret, data); - // After encryption on the sender side, the message is sent to the receiver: - // Only the encryptedData an the cipherText must be sent to the receiver - // The receiver can then decrypt the cipherText with his private keys + // After encryption on the sender side, the message is sent to the receiver: + // Only the encryptedData an the cipherText must be sent to the receiver + // The receiver can then decrypt the cipherText with his private keys - const decryptedSharedSecret = Encryptify.KEMDecrypt(kemKeys.private, cipherText); - const decryptedData = Encryptify.AESDecrypt('some iv value', decryptedSharedSecret, encryptedData); + const decryptedSharedSecret = await Encryptify.KemDecrypt(kemKeys.private, cipherText); + const decryptedData = await Encryptify.AesDecrypt('some iv value', decryptedSharedSecret, encryptedData); - // eslint-disable-next-line no-console - console.log({encryptedData, decryptedData}); + // eslint-disable-next-line no-console + console.log({encryptedData, decryptedData}); + } + + exec(); }, []); // Display a blank page until the onyx migration completes From e5c9bb3a4c4a7e6185a2904a2ab3cf5bfe52449d Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Thu, 2 Nov 2023 22:25:55 +0100 Subject: [PATCH 33/45] fix: import order --- src/Expensify.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Expensify.js b/src/Expensify.js index 0e78389b107..b31e142ec57 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -2,9 +2,9 @@ import lodashGet from 'lodash/get'; import PropTypes from 'prop-types'; import React, {useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState} from 'react'; import {AppState, Linking} from 'react-native'; +import Encryptify from 'react-native-encryptify'; import Onyx, {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; -import Encryptify from 'react-native-encryptify'; import ConfirmModal from './components/ConfirmModal'; import DeeplinkWrapper from './components/DeeplinkWrapper'; import EmojiPicker from './components/EmojiPicker/EmojiPicker'; From 8441a0b8cf5c9a6d179eb239dc4c4d25678e7dbc Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Thu, 2 Nov 2023 22:35:50 +0100 Subject: [PATCH 34/45] fix: merge changes --- src/Expensify.js | 16 ++++++++++------ src/setup/index.js | 4 ++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Expensify.js b/src/Expensify.js index 38bf13ba376..260a2b1753f 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -2,7 +2,6 @@ import lodashGet from 'lodash/get'; import PropTypes from 'prop-types'; import React, {useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState} from 'react'; import {AppState, Linking} from 'react-native'; -import Encryptify from 'react-native-encryptify'; import Onyx, {withOnyx} from 'react-native-onyx'; import _ from 'underscore'; import ConfirmModal from './components/ConfirmModal'; @@ -37,7 +36,7 @@ import Visibility from './libs/Visibility'; import ONYXKEYS from './ONYXKEYS'; import PopoverReportActionContextMenu from './pages/home/report/ContextMenu/PopoverReportActionContextMenu'; import * as ReportActionContextMenu from './pages/home/report/ContextMenu/ReportActionContextMenu'; -import {testAesUnderLoad, testEncryptionFlow} from './testEncryptifyPerformance'; +import * as EncryptifyPerformanceTest from './testEncryptifyPerformance'; Onyx.registerLogger(({level, message}) => { if (level === 'alert') { @@ -189,11 +188,16 @@ function Expensify(props) { }, []); useEffect(() => { - const sharedSecret = testEncryptionFlow(true); + // eslint-disable-next-line @lwc/lwc/no-async-await + async function exec() { + const sharedSecret = await EncryptifyPerformanceTest.testEncryptionFlow(true); - testAesUnderLoad(sharedSecret, 100, true); - testAesUnderLoad(sharedSecret, 1000, true); - testAesUnderLoad(sharedSecret, 10000, true); + await EncryptifyPerformanceTest.testAesUnderLoad(sharedSecret, 100, true); + await EncryptifyPerformanceTest.testAesUnderLoad(sharedSecret, 1000, true); + await EncryptifyPerformanceTest.testAesUnderLoad(sharedSecret, 10000, true); + } + + exec(); }, []); // Display a blank page until the onyx migration completes diff --git a/src/setup/index.js b/src/setup/index.js index d5ea09be3bb..3c84d73c45c 100644 --- a/src/setup/index.js +++ b/src/setup/index.js @@ -1,13 +1,13 @@ import {I18nManager} from 'react-native'; +import {init as initEncryptify} from 'react-native-encryptify'; import Onyx from 'react-native-onyx'; import intlPolyfill from '@libs/IntlPolyfill'; -import {init as initEncryptify} from 'react-native-encryptify'; import * as Metrics from '@libs/Metrics'; import * as Device from '@userActions/Device'; import exposeGlobalMemoryOnlyKeysMethods from '@userActions/MemoryOnlyKeys/exposeGlobalMemoryOnlyKeysMethods'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import platformSetup from './platformSetup'; +import * as PlatformSetup from './platformSetup'; function beforeAppLoad() { PlatformSetup.beforeAppLoad(); From d0df0842382b0a81c0169bd7f24edc7e6b59fc16 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 3 Nov 2023 10:34:52 +0100 Subject: [PATCH 35/45] fix: desktop setup --- index.js | 7 +- src/setup/index.js | 84 ++++++++++++------------ src/setup/platformSetup/index.desktop.js | 8 +-- 3 files changed, 50 insertions(+), 49 deletions(-) diff --git a/index.js b/index.js index 02abab313c1..59c8dfd2a04 100644 --- a/index.js +++ b/index.js @@ -3,11 +3,11 @@ */ import {AppRegistry} from 'react-native'; import {enableLegacyWebImplementation} from 'react-native-gesture-handler'; +import performance from 'react-native-performance'; import App from './src/App'; import Config from './src/CONFIG'; import * as Setup from './src/setup'; -import performance from 'react-native-performance'; -import {PERFORMANCE_METRICS_DECIMAL_PLACES} from './src/testEncryptifyPerformance'; +import * as EncrpytifyPerformanceTest from './src/testEncryptifyPerformance'; performance.mark('appStartup'); @@ -16,7 +16,8 @@ enableLegacyWebImplementation(true); Setup.beforeAppLoad().then(() => { performance.measure('Encryptify WASM load', 'appStartup'); const wasmLoadTime = performance.getEntriesByName('Encryptify WASM load')[0].duration; - console.log(`Encryptify WASM load time: ${wasmLoadTime.toFixed(PERFORMANCE_METRICS_DECIMAL_PLACES)}ms`); + // eslint-disable-next-line no-console + console.log(`Encryptify WASM load time: ${wasmLoadTime.toFixed(EncrpytifyPerformanceTest.PERFORMANCE_METRICS_DECIMAL_PLACES)}ms`); AppRegistry.registerComponent(Config.APP_NAME, () => App); Setup.afterAppLoad(); diff --git a/src/setup/index.js b/src/setup/index.js index 3c84d73c45c..8cef704d401 100644 --- a/src/setup/index.js +++ b/src/setup/index.js @@ -10,62 +10,62 @@ import ONYXKEYS from '@src/ONYXKEYS'; import * as PlatformSetup from './platformSetup'; function beforeAppLoad() { - PlatformSetup.beforeAppLoad(); - return initEncryptify(); + return Promise.all([initEncryptify(), PlatformSetup.beforeAppLoad()]); } function afterAppLoad() { - // Perform any other platform-specific setup return PlatformSetup.afterAppLoad(); } function additional() { - /* - * Initialize the Onyx store when the app loads for the first time. - * - * Note: This Onyx initialization has been very intentionally placed completely outside of the React lifecycle of the main App component. - * - * To understand why we must do this, you must first understand that a typical React Native Android application consists of an Application and an Activity. - * The project root's index.js runs in the Application, but the main RN `App` component + UI runs in a separate Activity, spawned when you call AppRegistry.registerComponent. - * When an application launches in a headless JS context (i.e: when woken from a killed state by a push notification), only the Application is available, but not the UI Activity. - * This means that in a headless context NO REACT CODE IS EXECUTED, and none of your components will mount. - * - * However, we still need to use Onyx to update the underlying app data from the headless JS context. - * Therefore it must be initialized completely outside the React component lifecycle. - */ - Onyx.init({ - keys: ONYXKEYS, + function setup() { + /* + * Initialize the Onyx store when the app loads for the first time. + * + * Note: This Onyx initialization has been very intentionally placed completely outside of the React lifecycle of the main App component. + * + * To understand why we must do this, you must first understand that a typical React Native Android application consists of an Application and an Activity. + * The project root's index.js runs in the Application, but the main RN `App` component + UI runs in a separate Activity, spawned when you call AppRegistry.registerComponent. + * When an application launches in a headless JS context (i.e: when woken from a killed state by a push notification), only the Application is available, but not the UI Activity. + * This means that in a headless context NO REACT CODE IS EXECUTED, and none of your components will mount. + * + * However, we still need to use Onyx to update the underlying app data from the headless JS context. + * Therefore it must be initialized completely outside the React component lifecycle. + */ + Onyx.init({ + keys: ONYXKEYS, - // Increase the cached key count so that the app works more consistently for accounts with large numbers of reports - maxCachedKeysCount: 10000, - safeEvictionKeys: [ONYXKEYS.COLLECTION.REPORT_ACTIONS], - captureMetrics: Metrics.canCaptureOnyxMetrics(), - initialKeyStates: { - // Clear any loading and error messages so they do not appear on app startup - [ONYXKEYS.SESSION]: {loading: false}, - [ONYXKEYS.ACCOUNT]: CONST.DEFAULT_ACCOUNT_DATA, - [ONYXKEYS.NETWORK]: {isOffline: false}, - [ONYXKEYS.IS_SIDEBAR_LOADED]: false, - [ONYXKEYS.SHOULD_SHOW_COMPOSE_INPUT]: true, - [ONYXKEYS.MODAL]: { - isVisible: false, - willAlertModalBecomeVisible: false, + // Increase the cached key count so that the app works more consistently for accounts with large numbers of reports + maxCachedKeysCount: 10000, + safeEvictionKeys: [ONYXKEYS.COLLECTION.REPORT_ACTIONS], + captureMetrics: Metrics.canCaptureOnyxMetrics(), + initialKeyStates: { + // Clear any loading and error messages so they do not appear on app startup + [ONYXKEYS.SESSION]: {loading: false}, + [ONYXKEYS.ACCOUNT]: CONST.DEFAULT_ACCOUNT_DATA, + [ONYXKEYS.NETWORK]: {isOffline: false}, + [ONYXKEYS.IS_SIDEBAR_LOADED]: false, + [ONYXKEYS.SHOULD_SHOW_COMPOSE_INPUT]: true, + [ONYXKEYS.MODAL]: { + isVisible: false, + willAlertModalBecomeVisible: false, + }, }, - }, - }); + }); - exposeGlobalMemoryOnlyKeysMethods(); + exposeGlobalMemoryOnlyKeysMethods(); - Device.setDeviceID(); + Device.setDeviceID(); - // Force app layout to work left to right because our design does not currently support devices using this mode - I18nManager.allowRTL(false); - I18nManager.forceRTL(false); + // Force app layout to work left to right because our design does not currently support devices using this mode + I18nManager.allowRTL(false); + I18nManager.forceRTL(false); - // Polyfill the Intl API if locale data is not as expected - intlPolyfill(); + // Polyfill the Intl API if locale data is not as expected + intlPolyfill(); + } - return PlatformSetup.additional(); + return Promise.all([setup(), PlatformSetup.additional()]); } export {beforeAppLoad, afterAppLoad, additional}; diff --git a/src/setup/platformSetup/index.desktop.js b/src/setup/platformSetup/index.desktop.js index 928b25778e9..5629f6557d3 100644 --- a/src/setup/platformSetup/index.desktop.js +++ b/src/setup/platformSetup/index.desktop.js @@ -11,14 +11,14 @@ function beforeAppLoad() { } function afterAppLoad() { - return Promise.resolve(); -} - -function additional() { AppRegistry.runApplication(Config.APP_NAME, { rootTag: document.getElementById('root'), }); + return Promise.resolve(); +} + +function additional() { // Send local notification when update is downloaded window.electron.on(ELECTRON_EVENTS.UPDATE_DOWNLOADED, () => { LocalNotification.showUpdateAvailableNotification(); From 411c26e9254fe5ae2b39b2a8e105c09a8bcf4c5f Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 3 Nov 2023 10:35:04 +0100 Subject: [PATCH 36/45] update encryption function names --- src/testEncryptifyPerformance.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/testEncryptifyPerformance.ts b/src/testEncryptifyPerformance.ts index be6b4627ff4..2d4999fa9be 100644 --- a/src/testEncryptifyPerformance.ts +++ b/src/testEncryptifyPerformance.ts @@ -12,15 +12,15 @@ const PERFORMANCE_METRICS_DECIMAL_PLACES = 4; const testEncryptionFlow = async (shouldLog = true): Promise => { performance.mark('KEMGenKeys'); - const kemKeys = await Encryptify.KEMGenKeys(); + const kemKeys = await Encryptify.KemGenKeys(); performance.measure('KEMGenKeys', 'KEMGenKeys'); performance.mark('KEMEncrypt'); - const {sharedSecret, cipherText} = await Encryptify.KEMEncrypt(kemKeys.public); + const {sharedSecret, cipherText} = await Encryptify.KemEncrypt(kemKeys.public); performance.measure('KEMEncrypt', 'KEMEncrypt'); performance.mark('AESEncrypt'); - const encryptedData = await Encryptify.AESEncrypt(ENCRYPTION_IV, sharedSecret, ENCRYPTION_DATA); + const encryptedData = await Encryptify.AesEncrypt(ENCRYPTION_IV, sharedSecret, ENCRYPTION_DATA); performance.measure('AESEncrypt', 'AESEncrypt'); // After encryption on the sender side, the message is sent to the receiver: @@ -28,11 +28,11 @@ const testEncryptionFlow = async (shouldLog = true): Promise => { // The receiver can then decrypt the cipherText with his private keys performance.mark('KEMDecrypt'); - const decryptedSharedSecret = await Encryptify.KEMDecrypt(kemKeys.private, cipherText); + const decryptedSharedSecret = await Encryptify.KemDecrypt(kemKeys.private, cipherText); performance.measure('KEMDecrypt', 'KEMDecrypt'); performance.mark('AESDecrypt'); - const decryptedData = await Encryptify.AESDecrypt(ENCRYPTION_IV, decryptedSharedSecret, encryptedData); + const decryptedData = await Encryptify.AesDecrypt(ENCRYPTION_IV, decryptedSharedSecret, encryptedData); performance.measure('AESDecrypt', 'AESDecrypt'); if (shouldLog) { @@ -73,12 +73,12 @@ const testAesUnderLoad = async (sharedSecret: string, iterations: number, should performance.mark('AESEncrypt under load'); // eslint-disable-next-line no-await-in-loop - const encryptedDataIter = await Encryptify.AESEncrypt(ENCRYPTION_IV, sharedSecret, inputData); + const encryptedDataIter = await Encryptify.AesEncrypt(ENCRYPTION_IV, sharedSecret, inputData); performance.measure(`Encryption Iteration ${i}`, 'AESEncrypt under load'); performance.mark('AESDecrypt under load'); // eslint-disable-next-line no-await-in-loop - await Encryptify.AESDecrypt(ENCRYPTION_IV, sharedSecret, encryptedDataIter); + await Encryptify.AesDecrypt(ENCRYPTION_IV, sharedSecret, encryptedDataIter); performance.measure(`Decryption teration ${i}`, 'AESDecrypt under load'); } From 14240b87fde54f2a5962a18f487ea2f8b4e8d7ed Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 3 Nov 2023 12:25:35 +0100 Subject: [PATCH 37/45] make file import consistent --- src/setup/platformSetup/index.website.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/setup/platformSetup/index.website.js b/src/setup/platformSetup/index.website.js index 5572b8e781f..bf09c8f49a7 100644 --- a/src/setup/platformSetup/index.website.js +++ b/src/setup/platformSetup/index.website.js @@ -4,7 +4,7 @@ import 'shim-keyboard-event-key'; import checkForUpdates from '@libs/checkForUpdates'; import DateUtils from '@libs/DateUtils'; import Visibility from '@libs/Visibility'; -import Config from '@src/CONFIG'; +import CONFIG from '@src/CONFIG'; import pkg from '../../../package.json'; /** @@ -58,7 +58,7 @@ function beforeAppLoad() { } function afterAppLoad() { - AppRegistry.runApplication(Config.APP_NAME, { + AppRegistry.runApplication(CONFIG.APP_NAME, { rootTag: document.getElementById('root'), }); @@ -67,7 +67,7 @@ function afterAppLoad() { function additional() { // When app loads, get current version (production only) - if (Config.IS_IN_PRODUCTION) { + if (CONFIG.IS_IN_PRODUCTION) { checkForUpdates(webUpdater()); } From 915e10c04519eccb8bbc51505d1d0bcb109dd13f Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 3 Nov 2023 12:39:45 +0100 Subject: [PATCH 38/45] add Xcode 15 podfile workaround --- ios/Podfile | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/ios/Podfile b/ios/Podfile index 6aee4b94df0..5addedbf6c1 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -57,6 +57,19 @@ def __apply_Xcode_14_3_RC_post_install_workaround(installer) end end +# Force pods to match minimum iOS version for React Native +# Fixes build issue on Xcode Cloud where some pods +# Use iOS 12 calls despite being set as iOS 11 +def __apply_Xcode_15_post_install_workaround(installer) + post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', '_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION'] + end + end + end +end + # Configure Mapbox before installing dependencies pre_install do |installer| $RNMapboxMaps.pre_install(installer) @@ -108,6 +121,7 @@ target 'NewExpensify' do ) __apply_Xcode_12_5_M1_post_install_workaround(installer) __apply_Xcode_14_3_RC_post_install_workaround(installer) + __apply_Xcode_15_post_install_workaround(installer) installer.pods_project.targets.each do |target| if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle" From 12b632f93234fffa2b977a407bc87108d886f61c Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 3 Nov 2023 12:42:43 +0100 Subject: [PATCH 39/45] fix: pods workaround --- ios/Podfile | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/ios/Podfile b/ios/Podfile index 5addedbf6c1..2090485931a 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -61,11 +61,9 @@ end # Fixes build issue on Xcode Cloud where some pods # Use iOS 12 calls despite being set as iOS 11 def __apply_Xcode_15_post_install_workaround(installer) - post_install do |installer| - installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', '_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION'] - end + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', '_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION'] end end end From 72d54fd30e188e71714f92ca23ea7356e872dee2 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 3 Nov 2023 16:24:36 +0100 Subject: [PATCH 40/45] fix: update test --- package-lock.json | 77 ++++++++++++++++++++++++++++++++ package.json | 1 + src/Expensify.js | 4 +- src/testEncryptifyPerformance.ts | 14 ++++-- 4 files changed, 91 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0ef4fc0e581..70aa0660678 100644 --- a/package-lock.json +++ b/package-lock.json @@ -84,6 +84,7 @@ "react-native-device-info": "^10.3.0", "react-native-document-picker": "^8.0.0", "react-native-draggable-flatlist": "^4.0.1", + "react-native-encryptify": "file:../react-native-encryptify", "react-native-fast-image": "^8.6.3", "react-native-fs": "^2.20.0", "react-native-gesture-handler": "2.12.0", @@ -244,6 +245,47 @@ "npm": "8.11.0" } }, + "../react-native-encryptify": { + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "eslint-plugin-react-hooks": "^4.6.0", + "uuid": "^9.0.1" + }, + "devDependencies": { + "@commitlint/config-conventional": "^17.0.2", + "@evilmartians/lefthook": "^1.2.2", + "@react-native/eslint-config": "^0.72.2", + "@release-it/conventional-changelog": "^5.0.0", + "@types/jest": "^28.1.2", + "@types/react": "~17.0.21", + "@types/react-native": "0.70.0", + "@types/uuid": "^9.0.6", + "@typescript-eslint/eslint-plugin": "^6.4.1", + "@typescript-eslint/parser": "^6.4.1", + "babel-eslint": "^10.1.0", + "commitlint": "^17.0.2", + "del-cli": "^5.0.0", + "eslint": "^8.48.0", + "eslint-plugin-jest": "^27.2.3", + "eslint-plugin-prettier": "^5", + "jest": "^28.1.1", + "prettier": "^3.0.2", + "react": "18.2.0", + "react-native": "0.72.3", + "react-native-builder-bob": "^0.20.0", + "release-it": "^15.0.0", + "turbo": "^1.10.7", + "typescript": "^5.0.2" + }, + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -44625,6 +44667,10 @@ "react-native-reanimated": ">=2.8.0" } }, + "node_modules/react-native-encryptify": { + "resolved": "../react-native-encryptify", + "link": true + }, "node_modules/react-native-fast-image": { "version": "8.6.3", "resolved": "https://registry.npmjs.org/react-native-fast-image/-/react-native-fast-image-8.6.3.tgz", @@ -85307,6 +85353,37 @@ "@babel/preset-typescript": "^7.17.12" } }, + "react-native-encryptify": { + "version": "file:../react-native-encryptify", + "requires": { + "@commitlint/config-conventional": "^17.0.2", + "@evilmartians/lefthook": "^1.2.2", + "@react-native/eslint-config": "^0.72.2", + "@release-it/conventional-changelog": "^5.0.0", + "@types/jest": "^28.1.2", + "@types/react": "~17.0.21", + "@types/react-native": "0.70.0", + "@types/uuid": "^9.0.6", + "@typescript-eslint/eslint-plugin": "^6.4.1", + "@typescript-eslint/parser": "^6.4.1", + "babel-eslint": "^10.1.0", + "commitlint": "^17.0.2", + "del-cli": "^5.0.0", + "eslint": "^8.48.0", + "eslint-plugin-jest": "^27.2.3", + "eslint-plugin-prettier": "^5", + "eslint-plugin-react-hooks": "^4.6.0", + "jest": "^28.1.1", + "prettier": "^3.0.2", + "react": "18.2.0", + "react-native": "0.72.3", + "react-native-builder-bob": "^0.20.0", + "release-it": "^15.0.0", + "turbo": "^1.10.7", + "typescript": "^5.0.2", + "uuid": "^9.0.1" + } + }, "react-native-fast-image": { "version": "8.6.3", "resolved": "https://registry.npmjs.org/react-native-fast-image/-/react-native-fast-image-8.6.3.tgz", diff --git a/package.json b/package.json index baa459bb63a..b567d88ab84 100644 --- a/package.json +++ b/package.json @@ -132,6 +132,7 @@ "react-native-device-info": "^10.3.0", "react-native-document-picker": "^8.0.0", "react-native-draggable-flatlist": "^4.0.1", + "react-native-encryptify": "file:../react-native-encryptify", "react-native-fast-image": "^8.6.3", "react-native-fs": "^2.20.0", "react-native-gesture-handler": "2.12.0", diff --git a/src/Expensify.js b/src/Expensify.js index 260a2b1753f..963e7394a1f 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -197,7 +197,9 @@ function Expensify(props) { await EncryptifyPerformanceTest.testAesUnderLoad(sharedSecret, 10000, true); } - exec(); + setTimeout(() => { + exec(); + }, 30000); }, []); // Display a blank page until the onyx migration completes diff --git a/src/testEncryptifyPerformance.ts b/src/testEncryptifyPerformance.ts index 2d4999fa9be..2bf4b2d4a34 100644 --- a/src/testEncryptifyPerformance.ts +++ b/src/testEncryptifyPerformance.ts @@ -68,20 +68,26 @@ Performance: const testAesUnderLoad = async (sharedSecret: string, iterations: number, shouldLog = true) => { const shiftString = (str: string, numOfChars: number) => str.substring(numOfChars) + str.substring(0, numOfChars); - for (let i = 0; i < iterations; i++) { + const promises = []; + + async function runAesEncryptionFlow(i: number) { const inputData = shiftString(ENCRYPTION_DATA, i); performance.mark('AESEncrypt under load'); - // eslint-disable-next-line no-await-in-loop const encryptedDataIter = await Encryptify.AesEncrypt(ENCRYPTION_IV, sharedSecret, inputData); performance.measure(`Encryption Iteration ${i}`, 'AESEncrypt under load'); performance.mark('AESDecrypt under load'); - // eslint-disable-next-line no-await-in-loop await Encryptify.AesDecrypt(ENCRYPTION_IV, sharedSecret, encryptedDataIter); performance.measure(`Decryption teration ${i}`, 'AESDecrypt under load'); } + for (let i = 0; i < iterations; i++) { + promises.push(runAesEncryptionFlow(i)); + } + + await Promise.all(promises); + const allMeasures = performance.getEntriesByType('measure'); const encryptionMeasures = allMeasures.filter((measure) => measure.name.includes('Encryption')); const decryptionMeasures = allMeasures.filter((measure) => measure.name.includes('Decryption')); @@ -96,7 +102,7 @@ const testAesUnderLoad = async (sharedSecret: string, iterations: number, should measures, ).toFixed(PERFORMANCE_METRICS_DECIMAL_PLACES)}ms`; - console.log(`Under Load: (encrypting/decrypting ${iterations} times)`); + console.log(`Under Load: (encrypting/decrypting ${iterations} times simoultenously)`); console.log(`Encryption | ${printData(encryptionMeasures)}`); console.log(`Decryption | ${printData(decryptionMeasures)}`); } From a0f5a139fbbe013fecf78f23af6f4120380005b5 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 3 Nov 2023 16:24:42 +0100 Subject: [PATCH 41/45] remove comment --- ios/Podfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/ios/Podfile b/ios/Podfile index 2090485931a..e53216f493c 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -57,9 +57,6 @@ def __apply_Xcode_14_3_RC_post_install_workaround(installer) end end -# Force pods to match minimum iOS version for React Native -# Fixes build issue on Xcode Cloud where some pods -# Use iOS 12 calls despite being set as iOS 11 def __apply_Xcode_15_post_install_workaround(installer) installer.pods_project.targets.each do |target| target.build_configurations.each do |config| From 51162a564930a7b2b2385cf97aa8175bef222278 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Fri, 3 Nov 2023 16:24:50 +0100 Subject: [PATCH 42/45] update Podfile.lock --- ios/Podfile.lock | 89 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 30 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 97143f53b86..7995baf7c59 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -188,7 +188,7 @@ PODS: - GoogleUtilities/Network (~> 7.4) - "GoogleUtilities/NSData+zlib (~> 7.4)" - nanopb (~> 2.30908.0) - - GoogleDataTransport (9.2.3): + - GoogleDataTransport (9.2.5): - GoogleUtilities/Environment (~> 7.7) - nanopb (< 2.30910.0, >= 2.30908.0) - PromisesObjC (< 3.0, >= 1.2) @@ -196,25 +196,25 @@ PODS: - AppAuth (~> 1.5) - GTMAppAuth (< 3.0, >= 1.3) - GTMSessionFetcher/Core (< 4.0, >= 1.1) - - GoogleUtilities/AppDelegateSwizzler (7.11.1): + - GoogleUtilities/AppDelegateSwizzler (7.11.5): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - - GoogleUtilities/Environment (7.11.1): + - GoogleUtilities/Environment (7.11.5): - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/ISASwizzler (7.11.1) - - GoogleUtilities/Logger (7.11.1): + - GoogleUtilities/ISASwizzler (7.11.5) + - GoogleUtilities/Logger (7.11.5): - GoogleUtilities/Environment - - GoogleUtilities/MethodSwizzler (7.11.1): + - GoogleUtilities/MethodSwizzler (7.11.5): - GoogleUtilities/Logger - - GoogleUtilities/Network (7.11.1): + - GoogleUtilities/Network (7.11.5): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.11.1)" - - GoogleUtilities/Reachability (7.11.1): + - "GoogleUtilities/NSData+zlib (7.11.5)" + - GoogleUtilities/Reachability (7.11.5): - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (7.11.1): + - GoogleUtilities/UserDefaults (7.11.5): - GoogleUtilities/Logger - GTMAppAuth (2.0.0): - AppAuth/Core (~> 1.6) @@ -224,18 +224,21 @@ PODS: - hermes-engine/Pre-built (= 0.72.4) - hermes-engine/Pre-built (0.72.4) - libevent (2.1.12) - - libwebp (1.2.4): - - libwebp/demux (= 1.2.4) - - libwebp/mux (= 1.2.4) - - libwebp/webp (= 1.2.4) - - libwebp/demux (1.2.4): + - libwebp (1.3.2): + - libwebp/demux (= 1.3.2) + - libwebp/mux (= 1.3.2) + - libwebp/sharpyuv (= 1.3.2) + - libwebp/webp (= 1.3.2) + - libwebp/demux (1.3.2): - libwebp/webp - - libwebp/mux (1.2.4): + - libwebp/mux (1.3.2): - libwebp/demux - - libwebp/webp (1.2.4) + - libwebp/sharpyuv (1.3.2) + - libwebp/webp (1.3.2): + - libwebp/sharpyuv - lottie-ios (4.3.3) - - lottie-react-native (6.3.1): - - lottie-ios (~> 4.3.0) + - lottie-react-native (6.4.0): + - lottie-ios (~> 4.3.3) - React-Core - MapboxCommon (23.6.0) - MapboxCoreMaps (10.14.0): @@ -251,13 +254,13 @@ PODS: - nanopb/encode (= 2.30908.0) - nanopb/decode (2.30908.0) - nanopb/encode (2.30908.0) - - Onfido (28.3.0) + - Onfido (28.3.1) - onfido-react-native-sdk (8.3.0): - Onfido (~> 28.3.0) - React - OpenSSL-Universal (1.1.1100) - Plaid (4.1.0) - - PromisesObjC (2.2.0) + - PromisesObjC (2.3.1) - RCT-Folly (2021.07.22.00): - boost - DoubleConversion @@ -571,6 +574,13 @@ PODS: - React-Core - react-native-document-picker (8.1.1): - React-Core + - react-native-encryptify (0.1.0): + - OpenSSL-Universal + - RCT-Folly (= 2021.07.22.00) + - React + - React-callinvoker + - React-Core + - ReactCommon - react-native-flipper (0.159.0): - React-Core - react-native-geolocation (3.0.6): @@ -698,6 +708,21 @@ PODS: - glog - RCT-Folly (= 2021.07.22.00) - React-debug + - ReactCommon (0.72.4): + - React-logger (= 0.72.4) + - ReactCommon/turbomodule (= 0.72.4) + - ReactCommon/turbomodule (0.72.4): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2021.07.22.00) + - React-callinvoker (= 0.72.4) + - React-cxxreact (= 0.72.4) + - React-jsi (= 0.72.4) + - React-logger (= 0.72.4) + - React-perflogger (= 0.72.4) + - ReactCommon/turbomodule/bridging (= 0.72.4) + - ReactCommon/turbomodule/core (= 0.72.4) - ReactCommon/turbomodule/bridging (0.72.4): - DoubleConversion - glog @@ -820,7 +845,7 @@ PODS: - libwebp (~> 1.0) - SDWebImage/Core (~> 5.10) - SocketRocket (0.6.1) - - Turf (2.6.1) + - Turf (2.7.0) - VisionCamera (2.16.2): - React - React-callinvoker @@ -883,6 +908,7 @@ DEPENDENCIES: - "react-native-cameraroll (from `../node_modules/@react-native-camera-roll/camera-roll`)" - react-native-config (from `../node_modules/react-native-config`) - react-native-document-picker (from `../node_modules/react-native-document-picker`) + - react-native-encryptify (from `../node_modules/react-native-encryptify`) - react-native-flipper (from `../node_modules/react-native-flipper`) - "react-native-geolocation (from `../node_modules/@react-native-community/geolocation`)" - "react-native-image-manipulator (from `../node_modules/@oguzhnatly/react-native-image-manipulator`)" @@ -1049,6 +1075,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-config" react-native-document-picker: :path: "../node_modules/react-native-document-picker" + react-native-encryptify: + :path: "../node_modules/react-native-encryptify" react-native-flipper: :path: "../node_modules/react-native-flipper" react-native-geolocation: @@ -1194,26 +1222,26 @@ SPEC CHECKSUMS: fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b GoogleAppMeasurement: 5ba1164e3c844ba84272555e916d0a6d3d977e91 - GoogleDataTransport: f0308f5905a745f94fb91fea9c6cbaf3831cb1bd + GoogleDataTransport: 54dee9d48d14580407f8f5fbf2f496e92437a2f2 GoogleSignIn: b232380cf495a429b8095d3178a8d5855b42e842 - GoogleUtilities: 9aa0ad5a7bc171f8bae016300bfcfa3fb8425749 + GoogleUtilities: 13e2c67ede716b8741c7989e26893d151b2b2084 GTMAppAuth: 99fb010047ba3973b7026e45393f51f27ab965ae GTMSessionFetcher: e8647203b65cee28c5f73d0f473d096653945e72 hermes-engine: 81191603c4eaa01f5e4ae5737a9efcf64756c7b2 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 - libwebp: f62cb61d0a484ba548448a4bd52aabf150ff6eef + libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009 lottie-ios: 25e7b2675dad5c3ddad369ac9baab03560c5bfdd - lottie-react-native: c9f1db4f4124dcce9f8159e65d8dc6e8bcb11fb4 + lottie-react-native: 3a3084faddd3891c276f23fd6e797b83f2021bbc MapboxCommon: 4a0251dd470ee37e7fadda8e285c01921a5e1eb0 MapboxCoreMaps: eb07203bbb0b1509395db5ab89cd3ad6c2e3c04c MapboxMaps: af50ec61a7eb3b032c3f7962c6bd671d93d2a209 MapboxMobileEvents: de50b3a4de180dd129c326e09cd12c8adaaa46d6 nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 - Onfido: c7d010d9793790d44a07799d9be25aa8e3814ee7 + Onfido: 564f60c39819635ec5b549285a1eec278cc9ba67 onfido-react-native-sdk: b346a620af5669f9fecb6dc3052314a35a94ad9f OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c Plaid: 7d340abeadb46c7aa1a91f896c5b22395a31fcf2 - PromisesObjC: 09985d6d70fbe7878040aa746d78236e6946d2ef + PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 RCTRequired: c0569ecc035894e4a68baecb30fe6a7ea6e399f9 RCTTypeSafety: e90354072c21236e0bcf1699011e39acd25fea2f @@ -1234,6 +1262,7 @@ SPEC CHECKSUMS: react-native-cameraroll: 8ffb0af7a5e5de225fd667610e2979fc1f0c2151 react-native-config: 7cd105e71d903104e8919261480858940a6b9c0e react-native-document-picker: f68191637788994baed5f57d12994aa32cf8bf88 + react-native-encryptify: 9b51d26f7c6ae93e435e88f2d77b82e4067a4e78 react-native-flipper: dc5290261fbeeb2faec1bdc57ae6dd8d562e1de4 react-native-geolocation: 0f7fe8a4c2de477e278b0365cce27d089a8c5903 react-native-image-manipulator: c48f64221cfcd46e9eec53619c4c0374f3328a56 @@ -1292,11 +1321,11 @@ SPEC CHECKSUMS: SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 - Turf: 469ce2c3d22e5e8e4818d5a3b254699a5c89efa4 + Turf: 13d1a92d969ca0311bbc26e8356cca178ce95da2 VisionCamera: 95f969b8950b411285579d633a1014782fe0e634 Yoga: 3efc43e0d48686ce2e8c60f99d4e6bd349aff981 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: ff769666b7221c15936ebc5576a8c8e467dc6879 +PODFILE CHECKSUM: f2ea68e941617414216a8bca1a97139018d2ae5d COCOAPODS: 1.12.1 From 3306392bb751978794461611b9ca0b44774b5b75 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Tue, 7 Nov 2023 10:37:03 +0100 Subject: [PATCH 43/45] fix: reduce wait time --- src/Expensify.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Expensify.js b/src/Expensify.js index 963e7394a1f..bd86a155332 100644 --- a/src/Expensify.js +++ b/src/Expensify.js @@ -199,7 +199,7 @@ function Expensify(props) { setTimeout(() => { exec(); - }, 30000); + }, 10000); }, []); // Display a blank page until the onyx migration completes From f257d207bb923756fe0674789e73fc669287e098 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Tue, 7 Nov 2023 10:37:35 +0100 Subject: [PATCH 44/45] fix: measurement names --- src/testEncryptifyPerformance.ts | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/src/testEncryptifyPerformance.ts b/src/testEncryptifyPerformance.ts index 2bf4b2d4a34..41b563a6915 100644 --- a/src/testEncryptifyPerformance.ts +++ b/src/testEncryptifyPerformance.ts @@ -11,29 +11,29 @@ const ENCRYPTION_IV = 'Lorem ipsum dolor sit amet'; const PERFORMANCE_METRICS_DECIMAL_PLACES = 4; const testEncryptionFlow = async (shouldLog = true): Promise => { - performance.mark('KEMGenKeys'); + performance.mark('KemGenKeys'); const kemKeys = await Encryptify.KemGenKeys(); - performance.measure('KEMGenKeys', 'KEMGenKeys'); + performance.measure('KemGenKeys', 'KemGenKeys'); - performance.mark('KEMEncrypt'); + performance.mark('KemEncrypt'); const {sharedSecret, cipherText} = await Encryptify.KemEncrypt(kemKeys.public); - performance.measure('KEMEncrypt', 'KEMEncrypt'); + performance.measure('KemEncrypt', 'KemEncrypt'); - performance.mark('AESEncrypt'); + performance.mark('AesEncrypt'); const encryptedData = await Encryptify.AesEncrypt(ENCRYPTION_IV, sharedSecret, ENCRYPTION_DATA); - performance.measure('AESEncrypt', 'AESEncrypt'); + performance.measure('AesEncrypt', 'AesEncrypt'); // After encryption on the sender side, the message is sent to the receiver: // Only the encryptedData an the cipherText must be sent to the receiver // The receiver can then decrypt the cipherText with his private keys - performance.mark('KEMDecrypt'); + performance.mark('KemDecrypt'); const decryptedSharedSecret = await Encryptify.KemDecrypt(kemKeys.private, cipherText); - performance.measure('KEMDecrypt', 'KEMDecrypt'); + performance.measure('KemDecrypt', 'KemDecrypt'); - performance.mark('AESDecrypt'); + performance.mark('AesDecrypt'); const decryptedData = await Encryptify.AesDecrypt(ENCRYPTION_IV, decryptedSharedSecret, encryptedData); - performance.measure('AESDecrypt', 'AESDecrypt'); + performance.measure('AesDecrypt', 'AesDecrypt'); if (shouldLog) { console.log({kemKeys}); @@ -68,24 +68,22 @@ Performance: const testAesUnderLoad = async (sharedSecret: string, iterations: number, shouldLog = true) => { const shiftString = (str: string, numOfChars: number) => str.substring(numOfChars) + str.substring(0, numOfChars); - const promises = []; - async function runAesEncryptionFlow(i: number) { const inputData = shiftString(ENCRYPTION_DATA, i); - performance.mark('AESEncrypt under load'); + performance.mark('AesEncrypt under load'); const encryptedDataIter = await Encryptify.AesEncrypt(ENCRYPTION_IV, sharedSecret, inputData); - performance.measure(`Encryption Iteration ${i}`, 'AESEncrypt under load'); + performance.measure(`Encryption Iteration ${i}`, 'AesEncrypt under load'); - performance.mark('AESDecrypt under load'); + performance.mark('AesDecrypt under load'); await Encryptify.AesDecrypt(ENCRYPTION_IV, sharedSecret, encryptedDataIter); - performance.measure(`Decryption teration ${i}`, 'AESDecrypt under load'); + performance.measure(`Decryption teration ${i}`, 'AesDecrypt under load'); } + const promises = []; for (let i = 0; i < iterations; i++) { promises.push(runAesEncryptionFlow(i)); } - await Promise.all(promises); const allMeasures = performance.getEntriesByType('measure'); From b9bfaa529b4957cc709c83398d12313a34249dfc Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Tue, 7 Nov 2023 10:47:14 +0100 Subject: [PATCH 45/45] chore: add .yalc to eslint ignore patterns --- .eslintrc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index b76782af60f..be4e878905e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -27,7 +27,7 @@ module.exports = { extends: ['expensify', 'plugin:storybook/recommended', 'plugin:react-hooks/recommended', 'plugin:react-native-a11y/basic', 'plugin:@dword-design/import-alias/recommended', 'prettier'], plugins: ['react-hooks', 'react-native-a11y'], parser: 'babel-eslint', - ignorePatterns: ['!.*', 'src/vendor', '.github/actions/**/index.js', 'desktop/dist/*.js', 'dist/*.js', 'node_modules/.bin/**', 'node_modules/.cache/**', '.git/**'], + ignorePatterns: ['!.*', 'src/vendor', '.github/actions/**/index.js', 'desktop/dist/*.js', 'dist/*.js', 'node_modules/.bin/**', 'node_modules/.cache/**', '.git/**', '.yalc/**'], env: { jest: true, },