From ce50ccd3c7b4c89daf36a94bcda569611aaa628e Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 9 Feb 2024 12:40:33 +0530 Subject: [PATCH 001/362] add workflow to run detox iOS tests --- .github/workflows/e2e-detox.yml | 48 ++++++++ detox/.detoxrc.json | 6 +- detox/package-lock.json | 191 ++++++++++++++++++++++++++++++-- detox/package.json | 4 +- 4 files changed, 237 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/e2e-detox.yml diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml new file mode 100644 index 00000000000..5c951fd3ebd --- /dev/null +++ b/.github/workflows/e2e-detox.yml @@ -0,0 +1,48 @@ +name: Detox E2E Tests + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + build-and-test: + runs-on: macos-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v2 + + - name: ci/prepare-ios-build + uses: ./.github/actions/prepare-ios-build + + - name: Install Dependencies + run: | + npm -g install react-native-cli + brew install watchman + brew install gnupg + brew tap wix/brew + brew install applesimutils + npm run ios-gems-m1 + npm run pod-install-m1 + npm install + + - name: Configure Xcode Preferences + run: | + # Set Xcode's build location + mkdir -p ~/Library/Developer/Xcode/DerivedData + defaults write com.apple.dt.Xcode IDECustomDerivedDataLocation -string YES + defaults write com.apple.dt.Xcode CustomDerivedDataLocation -string "build" + defaults write com.apple.dt.Xcode CustomDerivedDataLocationType -string 3 + + - name: Build iOS app + run: npm run build:ios-sim + + - name: Start Server + run: npm run start & + + - name: Run Detox Tests + run: npm run e2e:ios diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 5a03db58c8f..9f2fb3f8896 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -8,11 +8,11 @@ "apps": { "ios.debug": { "type": "ios.app", - "binaryPath": "../ios/Build/Products/Debug-iphonesimulator/Mattermost.app" + "binaryPath": "../ios/DerivedData/Mattermost/Build/Products/Debug-iphonesimulator/Mattermost.app" }, "ios.release": { "type": "ios.app", - "binaryPath": "../ios/Build/Products/Release-iphonesimulator/Mattermost.app", + "binaryPath": "../ios/DerivedData/Build/Products/Release-iphonesimulator/Mattermost.app", "build": "cd .. && npm run build:ios-sim && cd detox" }, "android.debug": { @@ -30,7 +30,7 @@ "ios.simulator": { "type": "ios.simulator", "device": { - "type": "iPhone 14" + "type": "iPhone 15" } }, "android.emulator": { diff --git a/detox/package-lock.json b/detox/package-lock.json index b0697ff1934..eb2de97448e 100644 --- a/detox/package-lock.json +++ b/detox/package-lock.json @@ -21,7 +21,7 @@ "babel-plugin-module-resolver": "5.0.0", "client-oauth2": "4.3.3", "deepmerge": "4.3.1", - "detox": "20.11.4", + "detox": "20.17.1", "form-data": "4.0.0", "jest": "29.7.0", "jest-circus": "29.7.0", @@ -1827,6 +1827,12 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@flatten-js/interval-tree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@flatten-js/interval-tree/-/interval-tree-1.1.2.tgz", + "integrity": "sha512-OwLoV9E/XM6b7bes2rSFnGNjyRy7vcoIHFTnmBR2WAaZTf0Fe4EX4GdA65vU1KgFAasti7iRSg2dZfYd1Zt00Q==", + "dev": true + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -3439,6 +3445,33 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/bunyamin": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/bunyamin/-/bunyamin-1.5.2.tgz", + "integrity": "sha512-Xp2nfqk33zt3nX90OSTkLVOc5N+1zdR3MWvfLHoIrm3cGRkdxPTPYB9CCgrDV8oum5rbghJjAbmXFXOrRXvMtg==", + "dev": true, + "dependencies": { + "@flatten-js/interval-tree": "^1.1.2", + "multi-sort-stream": "^1.0.4", + "stream-json": "^1.7.5", + "trace-event-lib": "^1.3.1" + }, + "engines": { + "node": ">=14.18.2" + }, + "peerDependencies": { + "@types/bunyan": "^1.8.8", + "bunyan": "^1.8.15 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@types/bunyan": { + "optional": true + }, + "bunyan": { + "optional": true + } + } + }, "node_modules/bunyan": { "version": "1.8.15", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", @@ -3979,9 +4012,9 @@ } }, "node_modules/detox": { - "version": "20.11.4", - "resolved": "https://registry.npmjs.org/detox/-/detox-20.11.4.tgz", - "integrity": "sha512-P48KAtK8qIDOxJKUl4q/syPkuHz67kAeFlNodBZg5aO4hJiH+RsbEkQfJSYkTCeZV800EcmUQwZK2M5amLoYaw==", + "version": "20.17.1", + "resolved": "https://registry.npmjs.org/detox/-/detox-20.17.1.tgz", + "integrity": "sha512-10pey6CR9D5GSloRkH60ObBGZ8VS11H7iuBNY7qq6jO2swiqqckHhPLRXfH9+WGR7l3vDnfU+G/gQs7JxQkJwA==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -3997,6 +4030,7 @@ "funpermaproxy": "^1.1.0", "glob": "^8.0.3", "ini": "^1.3.4", + "jest-environment-emit": "^1.0.5", "json-cycle": "^1.3.0", "lodash": "^4.17.11", "multi-sort-stream": "^1.0.3", @@ -4024,7 +4058,7 @@ "detox": "local-cli/cli.js" }, "engines": { - "node": ">=14.5.0" + "node": ">=16" }, "peerDependencies": { "jest": "29.x.x || 28.x.x || ^27.2.5" @@ -4393,6 +4427,15 @@ "node": ">= 8" } }, + "node_modules/exeunt": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/exeunt/-/exeunt-1.1.0.tgz", + "integrity": "sha512-dd++Yn/0Fp+gtJ04YHov7MeAii+LFivJc6KqnJNfplzLVUkUDrfKoQDTLlCgzcW15vY5hKlHasWeIsQJ8agHsw==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -5777,6 +5820,70 @@ "node": ">=8" } }, + "node_modules/jest-environment-emit": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/jest-environment-emit/-/jest-environment-emit-1.0.5.tgz", + "integrity": "sha512-OsQ08AhYxkkyDBTIow+9ogNmJheQIGWQKp0Nku+1ToLWjAj2Pd6LmypN8HgUIqYHs4HFcqkQ25kaf1qExmoZpg==", + "dev": true, + "dependencies": { + "bunyamin": "^1.5.0", + "bunyan": "^2.0.5", + "bunyan-debug-stream": "^3.1.0", + "funpermaproxy": "^1.1.0", + "lodash.merge": "^4.6.2", + "node-ipc": "9.2.1", + "strip-ansi": "^6.0.0", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16.14.0" + }, + "peerDependencies": { + "@jest/environment": ">=27.2.5", + "@jest/types": ">=27.2.5", + "jest": ">=27.2.5", + "jest-environment-jsdom": ">=27.2.5", + "jest-environment-node": ">=27.2.5" + }, + "peerDependenciesMeta": { + "@jest/environment": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "jest-environment-node": { + "optional": true + } + } + }, + "node_modules/jest-environment-emit/node_modules/bunyan": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-2.0.5.tgz", + "integrity": "sha512-Jvl74TdxCN6rSP9W1I6+UOUtwslTDqsSFkDqZlFb/ilaSvQ+bZAnXT/GT97IZ5L+Vph0joPZPhxUyn6FLNmFAA==", + "dev": true, + "engines": [ + "node >=0.10.0" + ], + "dependencies": { + "exeunt": "1.1.0" + }, + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, "node_modules/jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", @@ -7186,6 +7293,12 @@ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -10663,6 +10776,12 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@flatten-js/interval-tree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@flatten-js/interval-tree/-/interval-tree-1.1.2.tgz", + "integrity": "sha512-OwLoV9E/XM6b7bes2rSFnGNjyRy7vcoIHFTnmBR2WAaZTf0Fe4EX4GdA65vU1KgFAasti7iRSg2dZfYd1Zt00Q==", + "dev": true + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -11911,6 +12030,18 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "bunyamin": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/bunyamin/-/bunyamin-1.5.2.tgz", + "integrity": "sha512-Xp2nfqk33zt3nX90OSTkLVOc5N+1zdR3MWvfLHoIrm3cGRkdxPTPYB9CCgrDV8oum5rbghJjAbmXFXOrRXvMtg==", + "dev": true, + "requires": { + "@flatten-js/interval-tree": "^1.1.2", + "multi-sort-stream": "^1.0.4", + "stream-json": "^1.7.5", + "trace-event-lib": "^1.3.1" + } + }, "bunyan": { "version": "1.8.15", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", @@ -12303,9 +12434,9 @@ "dev": true }, "detox": { - "version": "20.11.4", - "resolved": "https://registry.npmjs.org/detox/-/detox-20.11.4.tgz", - "integrity": "sha512-P48KAtK8qIDOxJKUl4q/syPkuHz67kAeFlNodBZg5aO4hJiH+RsbEkQfJSYkTCeZV800EcmUQwZK2M5amLoYaw==", + "version": "20.17.1", + "resolved": "https://registry.npmjs.org/detox/-/detox-20.17.1.tgz", + "integrity": "sha512-10pey6CR9D5GSloRkH60ObBGZ8VS11H7iuBNY7qq6jO2swiqqckHhPLRXfH9+WGR7l3vDnfU+G/gQs7JxQkJwA==", "dev": true, "requires": { "ajv": "^8.6.3", @@ -12320,6 +12451,7 @@ "funpermaproxy": "^1.1.0", "glob": "^8.0.3", "ini": "^1.3.4", + "jest-environment-emit": "^1.0.5", "json-cycle": "^1.3.0", "lodash": "^4.17.11", "multi-sort-stream": "^1.0.3", @@ -12597,6 +12729,12 @@ } } }, + "exeunt": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/exeunt/-/exeunt-1.1.0.tgz", + "integrity": "sha512-dd++Yn/0Fp+gtJ04YHov7MeAii+LFivJc6KqnJNfplzLVUkUDrfKoQDTLlCgzcW15vY5hKlHasWeIsQJ8agHsw==", + "dev": true + }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -13587,6 +13725,37 @@ } } }, + "jest-environment-emit": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/jest-environment-emit/-/jest-environment-emit-1.0.5.tgz", + "integrity": "sha512-OsQ08AhYxkkyDBTIow+9ogNmJheQIGWQKp0Nku+1ToLWjAj2Pd6LmypN8HgUIqYHs4HFcqkQ25kaf1qExmoZpg==", + "dev": true, + "requires": { + "bunyamin": "^1.5.0", + "bunyan": "^2.0.5", + "bunyan-debug-stream": "^3.1.0", + "funpermaproxy": "^1.1.0", + "lodash.merge": "^4.6.2", + "node-ipc": "9.2.1", + "strip-ansi": "^6.0.0", + "tslib": "^2.5.3" + }, + "dependencies": { + "bunyan": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-2.0.5.tgz", + "integrity": "sha512-Jvl74TdxCN6rSP9W1I6+UOUtwslTDqsSFkDqZlFb/ilaSvQ+bZAnXT/GT97IZ5L+Vph0joPZPhxUyn6FLNmFAA==", + "dev": true, + "requires": { + "dtrace-provider": "~0.8", + "exeunt": "1.1.0", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + } + } + }, "jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", @@ -14656,6 +14825,12 @@ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", diff --git a/detox/package.json b/detox/package.json index 953de290611..9128f4e8938 100644 --- a/detox/package.json +++ b/detox/package.json @@ -19,7 +19,7 @@ "babel-plugin-module-resolver": "5.0.0", "client-oauth2": "4.3.3", "deepmerge": "4.3.1", - "detox": "20.11.4", + "detox": "20.17.1", "form-data": "4.0.0", "jest": "29.7.0", "jest-circus": "29.7.0", @@ -45,10 +45,12 @@ "e2e:android-test": "detox test -c android.emu.debug", "e2e:android-build-release": "detox build -c android.emu.release", "e2e:android-test-release": "detox test -c android.emu.release --record-logs failing --take-screenshots failing", + "e2e:ios-build": "IOS=true detox build -c ios.sim.debug", "e2e:ios-test": "IOS=true detox test -c ios.sim.debug", "e2e:ios-build-release": "detox build -c ios.sim.release", "e2e:ios-test-release": "IOS=true detox test -c ios.sim.release --record-logs failing --take-screenshots failing", "check": "npm run lint && npm run tsc", + "clean-detox": "detox clean", "lint": "eslint --ignore-pattern node_modules --quiet .", "start:webhook": "node webhook_server.js", "tsc": "NODE_OPTIONS=--max_old_space_size=12000 tsc --noEmit" From 60a2575ee6fc26db8135817097df067a39393634 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 9 Feb 2024 12:59:38 +0530 Subject: [PATCH 002/362] add m1 runner --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 5c951fd3ebd..095161ed14d 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -10,7 +10,7 @@ on: jobs: build-and-test: - runs-on: macos-latest + runs-on: macos-latest-xlarge steps: - name: Checkout Repository From 64d0808dfc1ae94ee69880b53e42f18a8884f942 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 9 Feb 2024 13:02:59 +0530 Subject: [PATCH 003/362] remove m1 runner --- .github/workflows/e2e-detox.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 095161ed14d..8a0d7fccc3d 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -10,7 +10,7 @@ on: jobs: build-and-test: - runs-on: macos-latest-xlarge + runs-on: macos-latest steps: - name: Checkout Repository @@ -26,9 +26,6 @@ jobs: brew install gnupg brew tap wix/brew brew install applesimutils - npm run ios-gems-m1 - npm run pod-install-m1 - npm install - name: Configure Xcode Preferences run: | From aebd0feda2f9d3c29f0e7bd2916bf1975cab3f0b Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 9 Feb 2024 13:40:52 +0530 Subject: [PATCH 004/362] fix login --- .github/workflows/e2e-detox.yml | 3 +++ detox/e2e/support/server_api/user.ts | 2 +- detox/e2e/support/test_config.ts | 10 +++++----- detox/e2e/support/ui/screen/login.ts | 4 ++-- detox/e2e/test/channels/channel_info.e2e.ts | 8 +++++++- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 8a0d7fccc3d..f3b02775f51 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -41,5 +41,8 @@ jobs: - name: Start Server run: npm run start & + - name: Install Detox Dependencies + run: cd detox && npm install + - name: Run Detox Tests run: npm run e2e:ios diff --git a/detox/e2e/support/server_api/user.ts b/detox/e2e/support/server_api/user.ts index 37c70c31aaf..afd1d046d32 100644 --- a/detox/e2e/support/server_api/user.ts +++ b/detox/e2e/support/server_api/user.ts @@ -48,7 +48,7 @@ export const apiCreateUser = async (baseUrl: string, {prefix = 'user', user = nu newUser, ); - return {user: {...response.data, password: newUser.password}}; + return {user: {...response.data, newUser}}; } catch (err) { return getResponseFromError(err); } diff --git a/detox/e2e/support/test_config.ts b/detox/e2e/support/test_config.ts index 54b087db837..aa395186841 100644 --- a/detox/e2e/support/test_config.ts +++ b/detox/e2e/support/test_config.ts @@ -1,15 +1,15 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -export const serverOneUrl = process.env.SITE_1_URL || (process.env.IOS === 'true' ? 'http://127.0.0.1:8065' : 'http://10.0.2.2:8065'); -export const siteOneUrl = process.env.SITE_1_URL || 'http://127.0.0.1:8065'; +export const serverOneUrl = process.env.SITE_1_URL || (process.env.IOS === 'true' ? 'https://mobile-e2e-instance.test.mattermost.cloud' : 'http://10.0.2.2:8065'); +export const siteOneUrl = process.env.SITE_1_URL || 'https://mobile-e2e-instance.test.mattermost.cloud'; export const serverTwoUrl = process.env.SITE_2_URL || 'https://mobile02.test.mattermost.cloud'; export const siteTwoUrl = process.env.SITE_2_URL || 'https://mobile02.test.mattermost.cloud'; export const serverThreeUrl = process.env.SITE_3_URL || 'https://mobile03.test.mattermost.cloud'; export const siteThreeUrl = process.env.SITE_3_URL || 'https://mobile03.test.mattermost.cloud'; export const smtpUrl = process.env.SMTP_URL || 'http://127.0.0.1:9001'; -export const adminEmail = process.env.ADMIN_EMAIL || 'sysadmin@sample.mattermost.com'; -export const adminUsername = process.env.ADMIN_USERNAME || 'sysadmin'; -export const adminPassword = process.env.ADMIN_PASSWORD || 'Sys@dmin-sample1'; +export const adminEmail = process.env.ADMIN_EMAIL || 'success+sysadmin@simulator.amazonses.com'; +export const adminUsername = process.env.ADMIN_USERNAME || 'admin'; +export const adminPassword = process.env.ADMIN_PASSWORD || 'admin@xj9k74o1ttdy3e1kh43m9pu63h'; export const ldapServer = process.env.LDAP_SERVER || '127.0.0.1'; export const ldapPort = process.env.LDAP_PORT || 389; diff --git a/detox/e2e/support/ui/screen/login.ts b/detox/e2e/support/ui/screen/login.ts index 6a63024d995..8b1f532185a 100644 --- a/detox/e2e/support/ui/screen/login.ts +++ b/detox/e2e/support/ui/screen/login.ts @@ -60,8 +60,8 @@ class LoginScreen { login = async (user: any = {}) => { await this.toBeVisible(); - await this.usernameInput.replaceText(user.username); - await this.passwordInput.replaceText(user.password); + await this.usernameInput.replaceText(user.newUser.email); + await this.passwordInput.replaceText(user.newUser.password); await this.signinButton.tap(); await wait(timeouts.ONE_SEC); }; diff --git a/detox/e2e/test/channels/channel_info.e2e.ts b/detox/e2e/test/channels/channel_info.e2e.ts index 1dae1e81573..65fa25c43ed 100644 --- a/detox/e2e/test/channels/channel_info.e2e.ts +++ b/detox/e2e/test/channels/channel_info.e2e.ts @@ -12,6 +12,7 @@ import { serverOneUrl, siteOneUrl, } from '@support/test_config'; +import {Alert} from '@support/ui/component'; import { ChannelScreen, ChannelListScreen, @@ -20,7 +21,7 @@ import { ServerScreen, ChannelInfoScreen, } from '@support/ui/screen'; -import {timeouts, wait} from '@support/utils'; +import {isIos, timeouts, wait} from '@support/utils'; import {expect} from 'detox'; describe('Channels - Channel Info', () => { @@ -34,6 +35,11 @@ describe('Channels - Channel Info', () => { // # Log in to server await ServerScreen.connectToServer(serverOneUrl, serverOneDisplayName); + if (isIos()) { + // # Tap alert okay button + await waitFor(Alert.okayButton).toExist().withTimeout(timeouts.TEN_SEC); + await Alert.okayButton.tap(); + } await LoginScreen.login(user); }); From 7efb983fa17ae3d2a79e06d3fa6d37b5bcb90fc7 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 9 Feb 2024 14:24:06 +0530 Subject: [PATCH 005/362] fix login from admin --- .github/workflows/e2e-detox.yml | 3 +++ detox/e2e/support/ui/screen/login.ts | 12 ++++++++++-- detox/e2e/support/ui/screen/server.ts | 15 ++++++++++----- detox/e2e/test/channels/channel_info.e2e.ts | 8 +------- .../channels/convert_to_private_channel.e2e.ts | 2 +- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index f3b02775f51..d7c4c047acb 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -38,6 +38,9 @@ jobs: - name: Build iOS app run: npm run build:ios-sim + - name: List devices + run: applesimutils --list + - name: Start Server run: npm run start & diff --git a/detox/e2e/support/ui/screen/login.ts b/detox/e2e/support/ui/screen/login.ts index 8b1f532185a..1637bd6c8e2 100644 --- a/detox/e2e/support/ui/screen/login.ts +++ b/detox/e2e/support/ui/screen/login.ts @@ -60,8 +60,16 @@ class LoginScreen { login = async (user: any = {}) => { await this.toBeVisible(); - await this.usernameInput.replaceText(user.newUser.email); - await this.passwordInput.replaceText(user.newUser.password); + await this.usernameInput.typeText(user.newUser.email); + await this.passwordInput.typeText(`${user.newUser.password}\n`); + await this.signinButton.tap(); + await wait(timeouts.ONE_SEC); + }; + + loginAsAdmin = async (user: any = {}) => { + await this.toBeVisible(); + await this.usernameInput.typeText(user.username); + await this.passwordInput.typeText(`${user.password}\n`); await this.signinButton.tap(); await wait(timeouts.ONE_SEC); }; diff --git a/detox/e2e/support/ui/screen/server.ts b/detox/e2e/support/ui/screen/server.ts index 4bb74c2caf4..527c9663a9c 100644 --- a/detox/e2e/support/ui/screen/server.ts +++ b/detox/e2e/support/ui/screen/server.ts @@ -20,6 +20,8 @@ class ServerScreen { displayHelp: 'server_form.display_help', connectButton: 'server_form.connect.button', connectButtonDisabled: 'server_form.connect.button.disabled', + usernameInput: 'login_form.username.input', + usernameInputError: 'login_form.username.input.error', }; serverScreen = element(by.id(this.testID.serverScreen)); @@ -35,6 +37,7 @@ class ServerScreen { displayHelp = element(by.id(this.testID.displayHelp)); connectButton = element(by.id(this.testID.connectButton)); connectButtonDisabled = element(by.id(this.testID.connectButtonDisabled)); + usernameInput = element(by.id(this.testID.usernameInput)); toBeVisible = async () => { await waitFor(this.serverScreen).toExist().withTimeout(timeouts.TEN_SEC); @@ -54,12 +57,14 @@ class ServerScreen { if (isIos()) { await this.tapConnectButton(); - if (serverUrl.includes('127.0.0.1')) { - // # Tap alert okay button - await waitFor(Alert.okayButton).toExist().withTimeout(timeouts.TEN_SEC); - await Alert.okayButton.tap(); - } + // if (serverUrl.includes('127.0.0.1')) { + // # Tap alert okay button + await waitFor(Alert.okayButton).toExist().withTimeout(timeouts.TEN_SEC); + await Alert.okayButton.tap(); + + // } } + await waitFor(this.usernameInput).toExist().withTimeout(timeouts.ONE_SEC); }; close = async () => { diff --git a/detox/e2e/test/channels/channel_info.e2e.ts b/detox/e2e/test/channels/channel_info.e2e.ts index 65fa25c43ed..1dae1e81573 100644 --- a/detox/e2e/test/channels/channel_info.e2e.ts +++ b/detox/e2e/test/channels/channel_info.e2e.ts @@ -12,7 +12,6 @@ import { serverOneUrl, siteOneUrl, } from '@support/test_config'; -import {Alert} from '@support/ui/component'; import { ChannelScreen, ChannelListScreen, @@ -21,7 +20,7 @@ import { ServerScreen, ChannelInfoScreen, } from '@support/ui/screen'; -import {isIos, timeouts, wait} from '@support/utils'; +import {timeouts, wait} from '@support/utils'; import {expect} from 'detox'; describe('Channels - Channel Info', () => { @@ -35,11 +34,6 @@ describe('Channels - Channel Info', () => { // # Log in to server await ServerScreen.connectToServer(serverOneUrl, serverOneDisplayName); - if (isIos()) { - // # Tap alert okay button - await waitFor(Alert.okayButton).toExist().withTimeout(timeouts.TEN_SEC); - await Alert.okayButton.tap(); - } await LoginScreen.login(user); }); diff --git a/detox/e2e/test/channels/convert_to_private_channel.e2e.ts b/detox/e2e/test/channels/convert_to_private_channel.e2e.ts index 7579266ff2e..cacee2eee08 100644 --- a/detox/e2e/test/channels/convert_to_private_channel.e2e.ts +++ b/detox/e2e/test/channels/convert_to_private_channel.e2e.ts @@ -26,7 +26,7 @@ describe('Channels - Convert to Private Channel', () => { beforeAll(async () => { // # Log in to server as admin await ServerScreen.connectToServer(siteOneUrl, siteOneDisplayName); - await LoginScreen.login(getAdminAccount()); + await LoginScreen.loginAsAdmin(getAdminAccount()); }); beforeEach(async () => { From 67ea1d4e06d7d4c41d2a5763881fc4e045bdfc46 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 9 Feb 2024 14:56:39 +0530 Subject: [PATCH 006/362] set device to iPhone14 --- detox/.detoxrc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 9f2fb3f8896..f5cd545a243 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -30,7 +30,7 @@ "ios.simulator": { "type": "ios.simulator", "device": { - "type": "iPhone 15" + "type": "iPhone 14" } }, "android.emulator": { From eb362299d8e38b27e567c8d6f625b06cc1735fb5 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 00:48:40 +0530 Subject: [PATCH 007/362] manually set node and ruby --- .github/workflows/e2e-detox.yml | 14 +++++++++----- .../e2e/test/server_login/login_by_email.e2e.ts | 16 ++++++++-------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index d7c4c047acb..d8104d7d687 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -16,8 +16,15 @@ jobs: - name: Checkout Repository uses: actions/checkout@v2 - - name: ci/prepare-ios-build - uses: ./.github/actions/prepare-ios-build + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: 18 + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.7.6 - name: Install Dependencies run: | @@ -38,9 +45,6 @@ jobs: - name: Build iOS app run: npm run build:ios-sim - - name: List devices - run: applesimutils --list - - name: Start Server run: npm run start & diff --git a/detox/e2e/test/server_login/login_by_email.e2e.ts b/detox/e2e/test/server_login/login_by_email.e2e.ts index 21323e0989b..e58704a592b 100644 --- a/detox/e2e/test/server_login/login_by_email.e2e.ts +++ b/detox/e2e/test/server_login/login_by_email.e2e.ts @@ -60,15 +60,15 @@ describe('Server Login - Login by Email', () => { it('MM-T4677_2 - should show disabled signin button on empty username or password', async () => { // # Log in with empty username and non-empty password - await usernameInput.replaceText(''); - await passwordInput.replaceText('password'); + await usernameInput.clearText(); + await passwordInput.typeText('password'); // * Verify signin button is disabled await expect(signinButtonDisabled).toBeVisible(); // # Log in with non-empty username and empty password - await usernameInput.replaceText('username'); - await passwordInput.replaceText(''); + await usernameInput.typeText('username'); + await passwordInput.clearText(); // * Verify signin button is disabled await expect(signinButtonDisabled).toBeVisible(); @@ -76,8 +76,8 @@ describe('Server Login - Login by Email', () => { it('MM-T4677_3 - should show incorrect combination error on incorrect credentials', async () => { // # Log in with incorrect credentials - await usernameInput.replaceText('username'); - await passwordInput.replaceText('password'); + await usernameInput.typeText('username'); + await passwordInput.typeText('password'); await signinButton.tap(); // * Verify incorrect combination error @@ -87,8 +87,8 @@ describe('Server Login - Login by Email', () => { it('MM-T4677_4 - should show channel list screen on successful login', async () => { // # Log in to server with correct credentials const {team, user} = await Setup.apiInit(siteOneUrl); - await usernameInput.replaceText(user.username); - await passwordInput.replaceText(user.password); + await usernameInput.typeText(user.newUser.username); + await passwordInput.typeText(user.newUser.password); await signinButton.tap(); // * Verify on channel list screen and channel list header shows team display name and server display name From 0332df3584882c16b3f6f800f57d5804d61d5e91 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 16:23:11 +0530 Subject: [PATCH 008/362] add npm i --- .github/workflows/e2e-detox.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index d8104d7d687..8f0ecc729ab 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -19,7 +19,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v2 with: - node-version: 18 + node-version: 'auto' - name: Set up Ruby uses: ruby/setup-ruby@v1 @@ -33,6 +33,7 @@ jobs: brew install gnupg brew tap wix/brew brew install applesimutils + npm install - name: Configure Xcode Preferences run: | From d4e6896101c4da11df7d6869f50b6b52656f7bdb Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 16:31:17 +0530 Subject: [PATCH 009/362] add npm i --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 8f0ecc729ab..b1435bda8cc 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -19,7 +19,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v2 with: - node-version: 'auto' + node-version: '18' - name: Set up Ruby uses: ruby/setup-ruby@v1 From 50c1fd181491aaf5e341b96ade95ccfa73453bc9 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 16:43:21 +0530 Subject: [PATCH 010/362] new workflow --- .github/workflows/e2e-detox.yml | 89 ++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 29 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index b1435bda8cc..66956025f07 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -9,31 +9,17 @@ on: - main jobs: - build-and-test: + e2e-ios: runs-on: macos-latest - steps: - - name: Checkout Repository - uses: actions/checkout@v2 - - - name: Set up Node.js - uses: actions/setup-node@v2 - with: - node-version: '18' + - name: Checkout repository + uses: actions/checkout@v3 - - name: Set up Ruby - uses: ruby/setup-ruby@v1 + - name: Setup Node.js + uses: actions/setup-node@v3 with: - ruby-version: 2.7.6 - - - name: Install Dependencies - run: | - npm -g install react-native-cli - brew install watchman - brew install gnupg - brew tap wix/brew - brew install applesimutils - npm install + cache: npm + node-version-file: .node-version - name: Configure Xcode Preferences run: | @@ -43,14 +29,59 @@ jobs: defaults write com.apple.dt.Xcode CustomDerivedDataLocation -string "build" defaults write com.apple.dt.Xcode CustomDerivedDataLocationType -string 3 - - name: Build iOS app - run: npm run build:ios-sim + - name: Install npm dependencies + run: | + npm ci --prefer-offline + cd detox && npm install && cd .. - - name: Start Server - run: npm run start & + - name: Install macOS dependencies + run: | + brew tap wix/brew + brew install applesimutils + env: + HOMEBREW_NO_AUTO_UPDATE: 1 + HOMEBREW_NO_INSTALL_CLEANUP: 1 - - name: Install Detox Dependencies - run: cd detox && npm install + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + bundler-cache: true + + - name: Cache CocoaPods + id: cache-cocoapods + uses: actions/cache@v3 + with: + path: ios/Pods + key: ${{ runner.os }}-pods-${{ hashFiles('ios/Podfile.lock') }} + restore-keys: | + ${{ runner.os }}-pods- + + - name: Install CocoaPods + if: steps.cache-cocoapods.outputs.cache-hit != 'true' + run: cd ios && pod install && cd .. + + - name: Detox rebuild framework cache + run: npx detox rebuild-framework-cache - - name: Run Detox Tests - run: npm run e2e:ios + - name: Cache Detox build + id: cache-detox-build + uses: actions/cache@v3 + with: + path: ios/build + key: ${{ runner.os }}-detox-build + restore-keys: | + ${{ runner.os }}-detox-build + + - name: Detox build + run: npx detox build -- --configuration ios.sim.release + + - name: Detox test + run: npx detox test -- --configuration ios.sim.release --cleanup --headless --record-logs all + + - name: Upload artifacts + if: failure() + uses: actions/upload-artifact@v3 + with: + name: detox-artifacts + path: artifacts + \ No newline at end of file From d5f4a25ec93aec2c9967348b96d539239e9bd4de Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 16:55:26 +0530 Subject: [PATCH 011/362] new workflow --- .github/workflows/e2e-detox.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 66956025f07..386c17f69ef 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -31,13 +31,14 @@ jobs: - name: Install npm dependencies run: | - npm ci --prefer-offline + npm ci cd detox && npm install && cd .. - name: Install macOS dependencies run: | brew tap wix/brew brew install applesimutils + brew install watchman env: HOMEBREW_NO_AUTO_UPDATE: 1 HOMEBREW_NO_INSTALL_CLEANUP: 1 @@ -46,6 +47,10 @@ jobs: uses: ruby/setup-ruby@v1 with: bundler-cache: true + ruby-version: 2.7.6 + + - name: Install CocoaPods + run: gem install cocoapods -v 1.14.3 - name: Cache CocoaPods id: cache-cocoapods From 7b7ab62217e3deac10b9333830b5c8a8a45568cc Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 17:23:26 +0530 Subject: [PATCH 012/362] new workflow --- .github/workflows/e2e-detox.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 386c17f69ef..a0d5978433e 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -28,11 +28,6 @@ jobs: defaults write com.apple.dt.Xcode IDECustomDerivedDataLocation -string YES defaults write com.apple.dt.Xcode CustomDerivedDataLocation -string "build" defaults write com.apple.dt.Xcode CustomDerivedDataLocationType -string 3 - - - name: Install npm dependencies - run: | - npm ci - cd detox && npm install && cd .. - name: Install macOS dependencies run: | @@ -65,6 +60,11 @@ jobs: if: steps.cache-cocoapods.outputs.cache-hit != 'true' run: cd ios && pod install && cd .. + - name: Install npm dependencies + run: | + npm ci + cd detox && npm install && cd .. + - name: Detox rebuild framework cache run: npx detox rebuild-framework-cache @@ -78,10 +78,10 @@ jobs: ${{ runner.os }}-detox-build - name: Detox build - run: npx detox build -- --configuration ios.sim.release + run: cd detox && npx detox build -- --configuration ios.sim.release - name: Detox test - run: npx detox test -- --configuration ios.sim.release --cleanup --headless --record-logs all + run: cd detox && npx detox test -- --configuration ios.sim.release --cleanup --headless --record-logs all - name: Upload artifacts if: failure() From 562fd3fce7024d8553085bad9d117231c48aca9d Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 17:30:29 +0530 Subject: [PATCH 013/362] new workflow --- .github/workflows/e2e-detox.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index a0d5978433e..0e321a0e684 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -44,9 +44,6 @@ jobs: bundler-cache: true ruby-version: 2.7.6 - - name: Install CocoaPods - run: gem install cocoapods -v 1.14.3 - - name: Cache CocoaPods id: cache-cocoapods uses: actions/cache@v3 @@ -57,10 +54,12 @@ jobs: ${{ runner.os }}-pods- - name: Install CocoaPods - if: steps.cache-cocoapods.outputs.cache-hit != 'true' - run: cd ios && pod install && cd .. + run: | + gem install cocoapods -v 1.14.3 + pod repo update + cd ios && pod install && cd .. - - name: Install npm dependencies + - name: Install project's node dependencies run: | npm ci cd detox && npm install && cd .. From d6609a929d93973596cfc9195a07afb2698be9e9 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 17:37:37 +0530 Subject: [PATCH 014/362] new workflow --- .github/workflows/e2e-detox.yml | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 0e321a0e684..0b3f9c11c2f 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -56,13 +56,21 @@ jobs: - name: Install CocoaPods run: | gem install cocoapods -v 1.14.3 - pod repo update - cd ios && pod install && cd .. + pod --version + # pod repo update + # cd ios && pod install && cd .. - - name: Install project's node dependencies + - name: Install npm dependencies + run: npm install + + - name: Install iOS dependencies run: | - npm ci - cd detox && npm install && cd .. + cd ios + pod install + cd .. + + - name: Install project's node dependencies + run: cd detox && npm install && cd .. - name: Detox rebuild framework cache run: npx detox rebuild-framework-cache From 6d98bb5b321d730e23aa167416812c7a459f8114 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 17:49:33 +0530 Subject: [PATCH 015/362] new workflow --- .github/workflows/e2e-detox.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 0b3f9c11c2f..81010718f16 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -56,12 +56,11 @@ jobs: - name: Install CocoaPods run: | gem install cocoapods -v 1.14.3 - pod --version # pod repo update # cd ios && pod install && cd .. - name: Install npm dependencies - run: npm install + run: npm install --ignore-scripts - name: Install iOS dependencies run: | From 813b5874224fb2caffbd02aa692e757087d6e55f Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 18:00:07 +0530 Subject: [PATCH 016/362] new workflow --- .github/workflows/e2e-detox.yml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 81010718f16..f80072ade2a 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -53,22 +53,18 @@ jobs: restore-keys: | ${{ runner.os }}-pods- - - name: Install CocoaPods - run: | - gem install cocoapods -v 1.14.3 - # pod repo update - # cd ios && pod install && cd .. - - name: Install npm dependencies run: npm install --ignore-scripts - name: Install iOS dependencies run: | + gem install cocoapods -v 1.14.3 cd ios - pod install + pod --version + pod install --repo-update cd .. - - name: Install project's node dependencies + - name: Install detox node dependencies run: cd detox && npm install && cd .. - name: Detox rebuild framework cache From cc47a2512bc470ce211d60429b2e0879bcbd2c82 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 18:10:41 +0530 Subject: [PATCH 017/362] new workflow --- .github/workflows/e2e-detox.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index f80072ade2a..3628fc0b890 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -59,10 +59,8 @@ jobs: - name: Install iOS dependencies run: | gem install cocoapods -v 1.14.3 - cd ios - pod --version - pod install --repo-update - cd .. + npm run ios-gems + npm run pod-install - name: Install detox node dependencies run: cd detox && npm install && cd .. @@ -80,10 +78,10 @@ jobs: ${{ runner.os }}-detox-build - name: Detox build - run: cd detox && npx detox build -- --configuration ios.sim.release + run: npm run build:ios-sim - name: Detox test - run: cd detox && npx detox test -- --configuration ios.sim.release --cleanup --headless --record-logs all + run: npm run e2e:ios - name: Upload artifacts if: failure() From 40c38cd1a7b7696f71288c6986b7491bc6f74867 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 18:18:20 +0530 Subject: [PATCH 018/362] new workflow --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 3628fc0b890..4b30f3e8b66 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -60,7 +60,7 @@ jobs: run: | gem install cocoapods -v 1.14.3 npm run ios-gems - npm run pod-install + # npm run pod-install - name: Install detox node dependencies run: cd detox && npm install && cd .. From c39287a60b49a8a5f186b0eafe5bb3bf05817fcf Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 18:42:12 +0530 Subject: [PATCH 019/362] new workflow --- .github/workflows/e2e-detox.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 4b30f3e8b66..c0839e8434f 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -77,6 +77,9 @@ jobs: restore-keys: | ${{ runner.os }}-detox-build + - name: Run server + run: npm run start + - name: Detox build run: npm run build:ios-sim From f3fd08fd4d53400b6385fc6a93a3c174d376a68a Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 19:45:11 +0530 Subject: [PATCH 020/362] new workflow --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index c0839e8434f..33c00a0fe01 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -78,7 +78,7 @@ jobs: ${{ runner.os }}-detox-build - name: Run server - run: npm run start + run: npm run start & - name: Detox build run: npm run build:ios-sim From 879203e29bbc7d1eda4a375666fd77a491ef0ce4 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 22:55:37 +0530 Subject: [PATCH 021/362] new workflow --- .github/workflows/e2e-detox.yml | 101 ++++++++++++-------------------- 1 file changed, 38 insertions(+), 63 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 33c00a0fe01..7d81da26741 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -9,11 +9,30 @@ on: - main jobs: + trigger_build: + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v6 + with: + script: | + github.actions.callWithGitHubToken( + { owner: context.repo.owner, repo: context.repo.repo }, + 'workflow_dispatch', + { + workflow: 'build-pr.yml' + } + ) + e2e-ios: + needs: trigger_build runs-on: macos-latest steps: - name: Checkout repository uses: actions/checkout@v3 + - uses: actions/download-artifact@v2 + with: + name: ios-build-pr-${{ github.run_id }} + path: mobile-artifacts - name: Setup Node.js uses: actions/setup-node@v3 @@ -21,75 +40,31 @@ jobs: cache: npm node-version-file: .node-version - - name: Configure Xcode Preferences + - name: Install Detox dependencies run: | - # Set Xcode's build location - mkdir -p ~/Library/Developer/Xcode/DerivedData - defaults write com.apple.dt.Xcode IDECustomDerivedDataLocation -string YES - defaults write com.apple.dt.Xcode CustomDerivedDataLocation -string "build" - defaults write com.apple.dt.Xcode CustomDerivedDataLocationType -string 3 - - - name: Install macOS dependencies - run: | - brew tap wix/brew - brew install applesimutils - brew install watchman - env: - HOMEBREW_NO_AUTO_UPDATE: 1 - HOMEBREW_NO_INSTALL_CLEANUP: 1 - - - name: Setup Ruby - uses: ruby/setup-ruby@v1 - with: - bundler-cache: true - ruby-version: 2.7.6 + gem install detox-instruments detox-android + cd ios && pod install - - name: Cache CocoaPods - id: cache-cocoapods - uses: actions/cache@v3 + - name: Download iOS build artifact + uses: actions/download-artifact@v2 with: - path: ios/Pods - key: ${{ runner.os }}-pods-${{ hashFiles('ios/Podfile.lock') }} - restore-keys: | - ${{ runner.os }}-pods- + name: ios-build-pr-${{ github.run_id }} + path: mobile-artifacts - - name: Install npm dependencies - run: npm install --ignore-scripts - - - name: Install iOS dependencies + - name: Unzip artifact (if necessary) run: | - gem install cocoapods -v 1.14.3 - npm run ios-gems - # npm run pod-install - - - name: Install detox node dependencies - run: cd detox && npm install && cd .. - - - name: Detox rebuild framework cache - run: npx detox rebuild-framework-cache - - - name: Cache Detox build - id: cache-detox-build - uses: actions/cache@v3 - with: - path: ios/build - key: ${{ runner.os }}-detox-build - restore-keys: | - ${{ runner.os }}-detox-build - - - name: Run server - run: npm run start & - - - name: Detox build - run: npm run build:ios-sim + if [[ $OSTYPE == 'darwin' ]]; then + unzip mobile-artifacts/*.zip + else + unzip -o mobile-artifacts/*.zip + fi - - name: Detox test - run: npm run e2e:ios + - name: Run Detox tests (iOS) + run: npx detox run-all --test=e2e --configuration ios --platform ios --artifacts-dir mobile-artifacts - - name: Upload artifacts - if: failure() - uses: actions/upload-artifact@v3 + - name: Upload test results + uses: actions/upload-artifact@v2 with: - name: detox-artifacts - path: artifacts + name: detox-results + path: ios/reports \ No newline at end of file From a4aa0bae838374b0d64478c9c1c25946ba433333 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 23:16:20 +0530 Subject: [PATCH 022/362] reuse build pr --- .github/workflows/e2e-detox.yml | 73 +++++++++++++++++---------------- detox/.detoxrc.json | 2 +- 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 7d81da26741..779c0d932e6 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -9,41 +9,46 @@ on: - main jobs: - trigger_build: - runs-on: ubuntu-latest - steps: - - uses: actions/github-script@v6 - with: - script: | - github.actions.callWithGitHubToken( - { owner: context.repo.owner, repo: context.repo.repo }, - 'workflow_dispatch', - { - workflow: 'build-pr.yml' - } - ) - e2e-ios: - needs: trigger_build runs-on: macos-latest steps: - - name: Checkout repository - uses: actions/checkout@v3 - - uses: actions/download-artifact@v2 + - name: ci/checkout-repo + uses: actions/checkout@v4 with: - name: ios-build-pr-${{ github.run_id }} - path: mobile-artifacts + ref: ${{ github.event.pull_request.head.sha }} - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - cache: npm - node-version-file: .node-version + - name: ci/prepare-ios-build + uses: ./.github/actions/prepare-ios-build - - name: Install Detox dependencies + - name: ci/output-ssh-private-key + shell: bash run: | - gem install detox-instruments detox-android - cd ios && pod install + SSH_KEY_PATH=~/.ssh/id_ed25519 + mkdir -p ~/.ssh + echo -e '${{ secrets.MM_MOBILE_PRIVATE_DEPLOY_KEY }}' > ${SSH_KEY_PATH} + chmod 0600 ${SSH_KEY_PATH} + ssh-keygen -y -f ${SSH_KEY_PATH} > ${SSH_KEY_PATH}.pub + + - name: ci/build-ios-pr + env: + BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" + AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" + AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" + FASTLANE_TEAM_ID: "${{ secrets.MM_MOBILE_FASTLANE_TEAM_ID }}" + IOS_API_ISSUER_ID: "${{ secrets.MM_MOBILE_IOS_API_ISSUER_ID }}" + IOS_API_KEY: "${{ secrets.MM_MOBILE_IOS_API_KEY }}" + IOS_API_KEY_ID: "${{ secrets.MM_MOBILE_IOS_API_KEY_ID }}" + MATCH_GIT_URL: "${{ secrets.MM_MOBILE_MATCH_GIT_URL }}" + MATCH_PASSWORD: "${{ secrets.MM_MOBILE_MATCH_PASSWORD }}" + MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" + run: bundle exec fastlane ios build --env ios.pr + working-directory: ./fastlane + + - name: ci/upload-ios-pr-build + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + with: + name: ios-build-pr-${{ github.run_id }} + path: "*.ipa" - name: Download iOS build artifact uses: actions/download-artifact@v2 @@ -59,12 +64,8 @@ jobs: unzip -o mobile-artifacts/*.zip fi - - name: Run Detox tests (iOS) - run: npx detox run-all --test=e2e --configuration ios --platform ios --artifacts-dir mobile-artifacts + - name: Install detox dependancies + run: cd detox && npm install - - name: Upload test results - uses: actions/upload-artifact@v2 - with: - name: detox-results - path: ios/reports - \ No newline at end of file + - name: Run detox e2e + run: npm run e2e:ios diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index f5cd545a243..2c02b8c927d 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -8,7 +8,7 @@ "apps": { "ios.debug": { "type": "ios.app", - "binaryPath": "../ios/DerivedData/Mattermost/Build/Products/Debug-iphonesimulator/Mattermost.app" + "binaryPath": "../Mattermost.app" }, "ios.release": { "type": "ios.app", From c756fa646415a5a3d1aea7a5c67e4ae815622c87 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 23:37:30 +0530 Subject: [PATCH 023/362] reuse build pr --- .github/workflows/e2e-detox.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 779c0d932e6..6bfbf072222 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -56,6 +56,9 @@ jobs: name: ios-build-pr-${{ github.run_id }} path: mobile-artifacts + - name: Run react-native + run: npm run start & + - name: Unzip artifact (if necessary) run: | if [[ $OSTYPE == 'darwin' ]]; then From 7f95d0de70e7f310a42b0030d376918c3a516cc5 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 10 Feb 2024 23:51:35 +0530 Subject: [PATCH 024/362] remove zip logic --- .github/workflows/e2e-detox.yml | 12 +++--------- detox/.detoxrc.json | 2 +- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 6bfbf072222..ffe4ec2897b 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -59,16 +59,10 @@ jobs: - name: Run react-native run: npm run start & - - name: Unzip artifact (if necessary) - run: | - if [[ $OSTYPE == 'darwin' ]]; then - unzip mobile-artifacts/*.zip - else - unzip -o mobile-artifacts/*.zip - fi - - name: Install detox dependancies - run: cd detox && npm install + run: | + ls -l mobile-artifacts/ + cd detox && npm install - name: Run detox e2e run: npm run e2e:ios diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 2c02b8c927d..1b12f21ca65 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -8,7 +8,7 @@ "apps": { "ios.debug": { "type": "ios.app", - "binaryPath": "../Mattermost.app" + "binaryPath": "../mobile-artifacts/Mattermost.app" }, "ios.release": { "type": "ios.app", From 9928ca2944cca62065076a4c32d2bb64f0aeb866 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 11 Feb 2024 00:14:58 +0530 Subject: [PATCH 025/362] use ios-beta-sim workflow --- detox/.detoxrc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 1b12f21ca65..2c02b8c927d 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -8,7 +8,7 @@ "apps": { "ios.debug": { "type": "ios.app", - "binaryPath": "../mobile-artifacts/Mattermost.app" + "binaryPath": "../Mattermost.app" }, "ios.release": { "type": "ios.app", From d15a39698942fb01ca6fb99cfe33b3f38016eacf Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 11 Feb 2024 00:15:16 +0530 Subject: [PATCH 026/362] use ios-beta-sim workflow --- .github/workflows/e2e-detox.yml | 41 ++++++++++++--------------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index ffe4ec2897b..19f2ddb76c7 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -20,42 +20,31 @@ jobs: - name: ci/prepare-ios-build uses: ./.github/actions/prepare-ios-build - - name: ci/output-ssh-private-key - shell: bash - run: | - SSH_KEY_PATH=~/.ssh/id_ed25519 - mkdir -p ~/.ssh - echo -e '${{ secrets.MM_MOBILE_PRIVATE_DEPLOY_KEY }}' > ${SSH_KEY_PATH} - chmod 0600 ${SSH_KEY_PATH} - ssh-keygen -y -f ${SSH_KEY_PATH} > ${SSH_KEY_PATH}.pub - - - name: ci/build-ios-pr + - name: ci/build-ios-simulator env: - BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" - AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" - AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" - FASTLANE_TEAM_ID: "${{ secrets.MM_MOBILE_FASTLANE_TEAM_ID }}" - IOS_API_ISSUER_ID: "${{ secrets.MM_MOBILE_IOS_API_ISSUER_ID }}" - IOS_API_KEY: "${{ secrets.MM_MOBILE_IOS_API_KEY }}" - IOS_API_KEY_ID: "${{ secrets.MM_MOBILE_IOS_API_KEY_ID }}" - MATCH_GIT_URL: "${{ secrets.MM_MOBILE_MATCH_GIT_URL }}" - MATCH_PASSWORD: "${{ secrets.MM_MOBILE_MATCH_PASSWORD }}" - MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" - run: bundle exec fastlane ios build --env ios.pr + TAG: "${{ github.ref_name }}" + AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" + AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" + MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}" + GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" + run: bundle exec fastlane ios simulator --env ios.simulator working-directory: ./fastlane - - name: ci/upload-ios-pr-build - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + - name: ci/upload-ios-pr-simulator + uses: actions/upload-artifact@v2 with: - name: ios-build-pr-${{ github.run_id }} - path: "*.ipa" + name: ios-build-simulator-${{ github.run_id }} + path: mobile-artifacts/Mattermost-simulator-x86_64.app.zip - name: Download iOS build artifact uses: actions/download-artifact@v2 with: - name: ios-build-pr-${{ github.run_id }} + name: ios-build-simulator-${{ github.run_id }} path: mobile-artifacts + - name: Unzip artifact + run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ + - name: Run react-native run: npm run start & From d71461da4bf2a556158f0bfc759fd62e425c3383 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 11 Feb 2024 01:20:14 +0530 Subject: [PATCH 027/362] use ios-beta-sim workflow --- .github/workflows/e2e-detox.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 19f2ddb76c7..6b264611076 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -31,13 +31,13 @@ jobs: working-directory: ./fastlane - name: ci/upload-ios-pr-simulator - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ios-build-simulator-${{ github.run_id }} - path: mobile-artifacts/Mattermost-simulator-x86_64.app.zip + path: Mattermost-simulator-x86_64.app.zip - name: Download iOS build artifact - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v4 with: name: ios-build-simulator-${{ github.run_id }} path: mobile-artifacts From c08595f8389cb17c27232a4d18bf0456aec81304 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 11 Feb 2024 02:04:52 +0530 Subject: [PATCH 028/362] install applesimutils --- .github/workflows/e2e-detox.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 6b264611076..42c43831647 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -17,6 +17,11 @@ jobs: with: ref: ${{ github.event.pull_request.head.sha }} + - name: Brew install + run: | + brew tap wix/brew + brew install applesimutils + - name: ci/prepare-ios-build uses: ./.github/actions/prepare-ios-build From ba736657e0f4fcd0dea44da8c219e3010acf1841 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 11 Feb 2024 02:14:29 +0530 Subject: [PATCH 029/362] add cancel run logic --- .../actions/cancel-previous-run/action.yaml | 29 +++++++++++++++++++ .github/workflows/e2e-detox.yml | 3 ++ 2 files changed, 32 insertions(+) create mode 100644 .github/actions/cancel-previous-run/action.yaml diff --git a/.github/actions/cancel-previous-run/action.yaml b/.github/actions/cancel-previous-run/action.yaml new file mode 100644 index 00000000000..2f1ec710df2 --- /dev/null +++ b/.github/actions/cancel-previous-run/action.yaml @@ -0,0 +1,29 @@ +name: Cancel Previous Workflow + +on: + workflow_run: + workflows: + - Detox E2E Tests + types: + - requested + +jobs: + cancel-previous: + runs-on: ubuntu-latest + steps: + - name: Is there a new commit? + if: github.event.workflow_run.event != 'push' + run: exit 0 + + - name: Cancel active workflow on previous commit + uses: actions/github-script@v4 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { owner, repo, run_id } = context.payload.workflow_run; + const octokit = github.getOctokit(process.env.GITHUB_TOKEN); + await octokit.actions.cancelWorkflowRun({ + owner, + repo, + run_id + }); diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 42c43831647..4f836871262 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -12,6 +12,9 @@ jobs: e2e-ios: runs-on: macos-latest steps: + - name: Cancel Previous Workflow + uses: ./.github/actions/cancel-previous-run + - name: ci/checkout-repo uses: actions/checkout@v4 with: From 798864971ba7c2a765f92e03cbaaae8e5fd3e337 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 11 Feb 2024 02:15:44 +0530 Subject: [PATCH 030/362] add cancel run logic --- .github/workflows/e2e-detox.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 4f836871262..a6a6c1c3db6 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -12,14 +12,14 @@ jobs: e2e-ios: runs-on: macos-latest steps: - - name: Cancel Previous Workflow - uses: ./.github/actions/cancel-previous-run - - name: ci/checkout-repo uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} + - name: Cancel Previous Workflow + uses: ./.github/actions/cancel-previous-run + - name: Brew install run: | brew tap wix/brew From c2d209965bb325888fd7454a96bb19a555b33e16 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 11 Feb 2024 02:17:11 +0530 Subject: [PATCH 031/362] add cancel run logic --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index a6a6c1c3db6..0bf7b40776d 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -20,7 +20,7 @@ jobs: - name: Cancel Previous Workflow uses: ./.github/actions/cancel-previous-run - - name: Brew install + - name: Brew install applesimutils run: | brew tap wix/brew brew install applesimutils From f30581b87919dce1eb5d83d6852e15f49f767bc4 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 11 Feb 2024 02:17:57 +0530 Subject: [PATCH 032/362] Revert "add cancel run logic" This reverts commit ba736657e0f4fcd0dea44da8c219e3010acf1841. --- .../actions/cancel-previous-run/action.yaml | 29 ------------------- 1 file changed, 29 deletions(-) delete mode 100644 .github/actions/cancel-previous-run/action.yaml diff --git a/.github/actions/cancel-previous-run/action.yaml b/.github/actions/cancel-previous-run/action.yaml deleted file mode 100644 index 2f1ec710df2..00000000000 --- a/.github/actions/cancel-previous-run/action.yaml +++ /dev/null @@ -1,29 +0,0 @@ -name: Cancel Previous Workflow - -on: - workflow_run: - workflows: - - Detox E2E Tests - types: - - requested - -jobs: - cancel-previous: - runs-on: ubuntu-latest - steps: - - name: Is there a new commit? - if: github.event.workflow_run.event != 'push' - run: exit 0 - - - name: Cancel active workflow on previous commit - uses: actions/github-script@v4 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const { owner, repo, run_id } = context.payload.workflow_run; - const octokit = github.getOctokit(process.env.GITHUB_TOKEN); - await octokit.actions.cancelWorkflowRun({ - owner, - repo, - run_id - }); From faccddebbe41140dc15f3a07af2d4b56c3ca4803 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 11 Feb 2024 02:18:35 +0530 Subject: [PATCH 033/362] Revert "add cancel run logic" This reverts commit 798864971ba7c2a765f92e03cbaaae8e5fd3e337. --- .github/workflows/e2e-detox.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 0bf7b40776d..4f836871262 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -12,15 +12,15 @@ jobs: e2e-ios: runs-on: macos-latest steps: + - name: Cancel Previous Workflow + uses: ./.github/actions/cancel-previous-run + - name: ci/checkout-repo uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} - - name: Cancel Previous Workflow - uses: ./.github/actions/cancel-previous-run - - - name: Brew install applesimutils + - name: Brew install run: | brew tap wix/brew brew install applesimutils From 01cc0427351b77555427b3cf7de839763a1fc6c6 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 11 Feb 2024 02:20:09 +0530 Subject: [PATCH 034/362] remove cancel logic --- .github/workflows/e2e-detox.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 4f836871262..dd569dbe69f 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -12,8 +12,6 @@ jobs: e2e-ios: runs-on: macos-latest steps: - - name: Cancel Previous Workflow - uses: ./.github/actions/cancel-previous-run - name: ci/checkout-repo uses: actions/checkout@v4 From 3c85086aaebce4d9f2114b18e8f1ced4bc015543 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 11 Feb 2024 04:13:44 +0530 Subject: [PATCH 035/362] correct path --- detox/.detoxrc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 2c02b8c927d..bd4775d3906 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -8,7 +8,7 @@ "apps": { "ios.debug": { "type": "ios.app", - "binaryPath": "../Mattermost.app" + "binaryPath": "../ mobile-artifacts/Mattermost.app" }, "ios.release": { "type": "ios.app", From 554f8084af740794c6fae2fc541c8d2b63d3c4c7 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 11 Feb 2024 09:08:09 +0530 Subject: [PATCH 036/362] correct path --- detox/.detoxrc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index bd4775d3906..1b12f21ca65 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -8,7 +8,7 @@ "apps": { "ios.debug": { "type": "ios.app", - "binaryPath": "../ mobile-artifacts/Mattermost.app" + "binaryPath": "../mobile-artifacts/Mattermost.app" }, "ios.release": { "type": "ios.app", From 09c0abe833464d7d99759056871d62955d9ba89a Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 11 Feb 2024 22:51:43 +0530 Subject: [PATCH 037/362] fix login issue --- detox/e2e/support/ui/screen/login.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/detox/e2e/support/ui/screen/login.ts b/detox/e2e/support/ui/screen/login.ts index 1637bd6c8e2..7e8d1b6c65a 100644 --- a/detox/e2e/support/ui/screen/login.ts +++ b/detox/e2e/support/ui/screen/login.ts @@ -61,7 +61,7 @@ class LoginScreen { login = async (user: any = {}) => { await this.toBeVisible(); await this.usernameInput.typeText(user.newUser.email); - await this.passwordInput.typeText(`${user.newUser.password}\n`); + await this.passwordInput.typeText(`${user.newUser.password}`); await this.signinButton.tap(); await wait(timeouts.ONE_SEC); }; @@ -69,7 +69,7 @@ class LoginScreen { loginAsAdmin = async (user: any = {}) => { await this.toBeVisible(); await this.usernameInput.typeText(user.username); - await this.passwordInput.typeText(`${user.password}\n`); + await this.passwordInput.typeText(`${user.password}`); await this.signinButton.tap(); await wait(timeouts.ONE_SEC); }; From 391073cbb1632d5013c20b6513b4e66ffdf4259d Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 12 Feb 2024 01:10:33 +0530 Subject: [PATCH 038/362] macos 14 runner --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index dd569dbe69f..faf2ff98066 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -10,7 +10,7 @@ on: jobs: e2e-ios: - runs-on: macos-latest + runs-on: macos-14 steps: - name: ci/checkout-repo From f76bc9797ad25f41d125f77bb31d23bdc60df0f1 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 12 Feb 2024 13:40:14 +0530 Subject: [PATCH 039/362] remove macos 14 runner --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index faf2ff98066..dd569dbe69f 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -10,7 +10,7 @@ on: jobs: e2e-ios: - runs-on: macos-14 + runs-on: macos-latest steps: - name: ci/checkout-repo From 4610fa1d3f68f6c3325415fbf220f1bcbd119fb4 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 12 Feb 2024 14:49:15 +0530 Subject: [PATCH 040/362] test-1 --- detox/e2e/support/ui/screen/server.ts | 6 +++--- detox/e2e/test/account/about.e2e.ts | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/detox/e2e/support/ui/screen/server.ts b/detox/e2e/support/ui/screen/server.ts index 527c9663a9c..06ce36c2dec 100644 --- a/detox/e2e/support/ui/screen/server.ts +++ b/detox/e2e/support/ui/screen/server.ts @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import {Alert} from '@support/ui/component'; +// import {Alert} from '@support/ui/component'; import {isAndroid, isIos, timeouts, wait} from '@support/utils'; import {expect} from 'detox'; @@ -59,8 +59,8 @@ class ServerScreen { // if (serverUrl.includes('127.0.0.1')) { // # Tap alert okay button - await waitFor(Alert.okayButton).toExist().withTimeout(timeouts.TEN_SEC); - await Alert.okayButton.tap(); + // await waitFor(Alert.okayButton).toExist().withTimeout(timeouts.TEN_SEC); + // await Alert.okayButton.tap(); // } } diff --git a/detox/e2e/test/account/about.e2e.ts b/detox/e2e/test/account/about.e2e.ts index b91ecf1cab5..fe99daebaed 100644 --- a/detox/e2e/test/account/about.e2e.ts +++ b/detox/e2e/test/account/about.e2e.ts @@ -69,7 +69,6 @@ describe('Account - Settings - About', () => { await expect(AboutScreen.databaseSchemaVersionTitle).toHaveText('Database Schema Version:'); await expect(AboutScreen.databaseSchemaVersionValue).toBeVisible(); await expect(AboutScreen.copyInfoButton).toBeVisible(); - await expect(AboutScreen.copyInfoButton).toHaveText('Copy info'); if (isLicensed) { await expect(AboutScreen.licensee).toBeVisible(); } else { From 07e58118a6e2c4cfe77d8c2b7d3b2c8018dd4ade Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 12 Feb 2024 16:09:36 +0530 Subject: [PATCH 041/362] test-2 --- .github/workflows/e2e-detox.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index dd569dbe69f..fc832fb5bad 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -22,6 +22,7 @@ jobs: run: | brew tap wix/brew brew install applesimutils + xcrun simctl create "iPhone 15" com.apple.CoreSimulator.SimDeviceType.iPhone-15 -r iOS-15.0 - name: ci/prepare-ios-build uses: ./.github/actions/prepare-ios-build From 35660d1035adcf4e9692b259165360f5b26b17dd Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 12 Feb 2024 16:45:58 +0530 Subject: [PATCH 042/362] test-3 --- .github/workflows/e2e-detox.yml | 68 ++++++++++++++++----------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index fc832fb5bad..df2cb89c3b6 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -10,7 +10,7 @@ on: jobs: e2e-ios: - runs-on: macos-latest + runs-on: macos-13 steps: - name: ci/checkout-repo @@ -22,43 +22,43 @@ jobs: run: | brew tap wix/brew brew install applesimutils - xcrun simctl create "iPhone 15" com.apple.CoreSimulator.SimDeviceType.iPhone-15 -r iOS-15.0 + applesimutils --list | grep -i "iPhone 15" - - name: ci/prepare-ios-build - uses: ./.github/actions/prepare-ios-build + # - name: ci/prepare-ios-build + # uses: ./.github/actions/prepare-ios-build - - name: ci/build-ios-simulator - env: - TAG: "${{ github.ref_name }}" - AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" - AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" - MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}" - GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" - run: bundle exec fastlane ios simulator --env ios.simulator - working-directory: ./fastlane + # - name: ci/build-ios-simulator + # env: + # TAG: "${{ github.ref_name }}" + # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" + # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" + # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}" + # GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" + # run: bundle exec fastlane ios simulator --env ios.simulator + # working-directory: ./fastlane - - name: ci/upload-ios-pr-simulator - uses: actions/upload-artifact@v4 - with: - name: ios-build-simulator-${{ github.run_id }} - path: Mattermost-simulator-x86_64.app.zip + # - name: ci/upload-ios-pr-simulator + # uses: actions/upload-artifact@v4 + # with: + # name: ios-build-simulator-${{ github.run_id }} + # path: Mattermost-simulator-x86_64.app.zip - - name: Download iOS build artifact - uses: actions/download-artifact@v4 - with: - name: ios-build-simulator-${{ github.run_id }} - path: mobile-artifacts + # - name: Download iOS build artifact + # uses: actions/download-artifact@v4 + # with: + # name: ios-build-simulator-${{ github.run_id }} + # path: mobile-artifacts - - name: Unzip artifact - run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ - - - name: Run react-native - run: npm run start & + # - name: Unzip artifact + # run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ - - name: Install detox dependancies - run: | - ls -l mobile-artifacts/ - cd detox && npm install + # - name: Run react-native + # run: npm run start & + + # - name: Install detox dependancies + # run: | + # ls -l mobile-artifacts/ + # cd detox && npm install - - name: Run detox e2e - run: npm run e2e:ios + # - name: Run detox e2e + # run: npm run e2e:ios From d287c5e46df07cd6d0ab5a103ce16f38b20790a8 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 12 Feb 2024 16:53:23 +0530 Subject: [PATCH 043/362] test-4 --- .github/workflows/e2e-detox.yml | 67 +++++++++++++-------------- detox/.detoxrc.json | 5 +- detox/e2e/support/ui/screen/server.ts | 6 +-- 3 files changed, 37 insertions(+), 41 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index df2cb89c3b6..f92d6149c92 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -22,43 +22,42 @@ jobs: run: | brew tap wix/brew brew install applesimutils - applesimutils --list | grep -i "iPhone 15" - # - name: ci/prepare-ios-build - # uses: ./.github/actions/prepare-ios-build - - # - name: ci/build-ios-simulator - # env: - # TAG: "${{ github.ref_name }}" - # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" - # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" - # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}" - # GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" - # run: bundle exec fastlane ios simulator --env ios.simulator - # working-directory: ./fastlane - - # - name: ci/upload-ios-pr-simulator - # uses: actions/upload-artifact@v4 - # with: - # name: ios-build-simulator-${{ github.run_id }} - # path: Mattermost-simulator-x86_64.app.zip + - name: ci/prepare-ios-build + uses: ./.github/actions/prepare-ios-build + + - name: ci/build-ios-simulator + env: + TAG: "${{ github.ref_name }}" + AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" + AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" + MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}" + GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" + run: bundle exec fastlane ios simulator --env ios.simulator + working-directory: ./fastlane + + - name: ci/upload-ios-pr-simulator + uses: actions/upload-artifact@v4 + with: + name: ios-build-simulator-${{ github.run_id }} + path: Mattermost-simulator-x86_64.app.zip - # - name: Download iOS build artifact - # uses: actions/download-artifact@v4 - # with: - # name: ios-build-simulator-${{ github.run_id }} - # path: mobile-artifacts + - name: Download iOS build artifact + uses: actions/download-artifact@v4 + with: + name: ios-build-simulator-${{ github.run_id }} + path: mobile-artifacts - # - name: Unzip artifact - # run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ + - name: Unzip artifact + run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ - # - name: Run react-native - # run: npm run start & + - name: Run react-native + run: npm run start & - # - name: Install detox dependancies - # run: | - # ls -l mobile-artifacts/ - # cd detox && npm install + - name: Install detox dependancies + run: | + ls -l mobile-artifacts/ + cd detox && npm install - # - name: Run detox e2e - # run: npm run e2e:ios + - name: Run detox e2e + run: npm run e2e:ios diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 1b12f21ca65..8419f4d82f7 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -30,7 +30,7 @@ "ios.simulator": { "type": "ios.simulator", "device": { - "type": "iPhone 14" + "type": "iPhone 15" } }, "android.emulator": { @@ -58,9 +58,6 @@ "app": "android.release" } }, - "artifacts": { - "pathBuilder": "./e2e/path_builder.js" - }, "behavior": { "init": { "launchApp": false diff --git a/detox/e2e/support/ui/screen/server.ts b/detox/e2e/support/ui/screen/server.ts index 06ce36c2dec..527c9663a9c 100644 --- a/detox/e2e/support/ui/screen/server.ts +++ b/detox/e2e/support/ui/screen/server.ts @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -// import {Alert} from '@support/ui/component'; +import {Alert} from '@support/ui/component'; import {isAndroid, isIos, timeouts, wait} from '@support/utils'; import {expect} from 'detox'; @@ -59,8 +59,8 @@ class ServerScreen { // if (serverUrl.includes('127.0.0.1')) { // # Tap alert okay button - // await waitFor(Alert.okayButton).toExist().withTimeout(timeouts.TEN_SEC); - // await Alert.okayButton.tap(); + await waitFor(Alert.okayButton).toExist().withTimeout(timeouts.TEN_SEC); + await Alert.okayButton.tap(); // } } From 23682ce739bf1c9808bd3e0e60b50d73b3fae222 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 12 Feb 2024 18:21:05 +0530 Subject: [PATCH 044/362] test-5 --- .github/workflows/e2e-detox.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index f92d6149c92..542f3e43118 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -20,6 +20,7 @@ jobs: - name: Brew install run: | + brew update-reset brew tap wix/brew brew install applesimutils @@ -54,7 +55,7 @@ jobs: - name: Run react-native run: npm run start & - - name: Install detox dependancies + - name: Install detox dependencies run: | ls -l mobile-artifacts/ cd detox && npm install From 3bcdadd5f49e28fa4085d454a764ed1cead22fb0 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 12 Feb 2024 18:29:37 +0530 Subject: [PATCH 045/362] test-6 --- .github/workflows/e2e-detox.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 542f3e43118..c822b7b6896 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -20,6 +20,8 @@ jobs: - name: Brew install run: | + rm '/usr/local/bin/2to3' + brew link --overwrite python@3.11 brew update-reset brew tap wix/brew brew install applesimutils From bacb968b6ad1ff652d966eb82e075293b7c28b17 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 12 Feb 2024 19:16:44 +0530 Subject: [PATCH 046/362] test-7 --- .github/workflows/e2e-detox.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index c822b7b6896..c2ab5231655 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -19,6 +19,9 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} - name: Brew install + env: + HOMEBREW_NO_AUTO_UPDATE: "1" + shell: bash run: | rm '/usr/local/bin/2to3' brew link --overwrite python@3.11 From a4a4d4725df25589c68cc9a90fb8041460baecc4 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 12 Feb 2024 19:30:33 +0530 Subject: [PATCH 047/362] test-8 --- .github/workflows/e2e-detox.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index c2ab5231655..3c932c7a68b 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -10,7 +10,7 @@ on: jobs: e2e-ios: - runs-on: macos-13 + runs-on: macos-lates steps: - name: ci/checkout-repo @@ -23,9 +23,6 @@ jobs: HOMEBREW_NO_AUTO_UPDATE: "1" shell: bash run: | - rm '/usr/local/bin/2to3' - brew link --overwrite python@3.11 - brew update-reset brew tap wix/brew brew install applesimutils From 7327cb10a747db9841b44dd6c240ace0d29a1d92 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 12 Feb 2024 22:11:32 +0530 Subject: [PATCH 048/362] test-9 --- .github/workflows/e2e-detox.yml | 65 +++++++++++++++++---------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 3c932c7a68b..2119503f691 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -10,7 +10,7 @@ on: jobs: e2e-ios: - runs-on: macos-lates + runs-on: macos-latest steps: - name: ci/checkout-repo @@ -25,42 +25,43 @@ jobs: run: | brew tap wix/brew brew install applesimutils + applesimutils --list | grep -i "iPhone 15" - - name: ci/prepare-ios-build - uses: ./.github/actions/prepare-ios-build + # - name: ci/prepare-ios-build + # uses: ./.github/actions/prepare-ios-build - - name: ci/build-ios-simulator - env: - TAG: "${{ github.ref_name }}" - AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" - AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" - MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}" - GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" - run: bundle exec fastlane ios simulator --env ios.simulator - working-directory: ./fastlane + # - name: ci/build-ios-simulator + # env: + # TAG: "${{ github.ref_name }}" + # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" + # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" + # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}" + # GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" + # run: bundle exec fastlane ios simulator --env ios.simulator + # working-directory: ./fastlane - - name: ci/upload-ios-pr-simulator - uses: actions/upload-artifact@v4 - with: - name: ios-build-simulator-${{ github.run_id }} - path: Mattermost-simulator-x86_64.app.zip + # - name: ci/upload-ios-pr-simulator + # uses: actions/upload-artifact@v4 + # with: + # name: ios-build-simulator-${{ github.run_id }} + # path: Mattermost-simulator-x86_64.app.zip - - name: Download iOS build artifact - uses: actions/download-artifact@v4 - with: - name: ios-build-simulator-${{ github.run_id }} - path: mobile-artifacts + # - name: Download iOS build artifact + # uses: actions/download-artifact@v4 + # with: + # name: ios-build-simulator-${{ github.run_id }} + # path: mobile-artifacts - - name: Unzip artifact - run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ + # - name: Unzip artifact + # run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ - - name: Run react-native - run: npm run start & + # - name: Run react-native + # run: npm run start & - - name: Install detox dependencies - run: | - ls -l mobile-artifacts/ - cd detox && npm install + # - name: Install detox dependencies + # run: | + # ls -l mobile-artifacts/ + # cd detox && npm install - - name: Run detox e2e - run: npm run e2e:ios + # - name: Run detox e2e + # run: npm run e2e:ios From 2d63d6c2095598100f1b437270d718c73a5977ad Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 12 Feb 2024 22:16:48 +0530 Subject: [PATCH 049/362] test-10 --- .github/workflows/e2e-detox.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 2119503f691..32d18ae0d9b 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -19,9 +19,6 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} - name: Brew install - env: - HOMEBREW_NO_AUTO_UPDATE: "1" - shell: bash run: | brew tap wix/brew brew install applesimutils From 05b12aabd81a03e9c23f24437f8e8257279e5285 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 12 Feb 2024 22:28:34 +0530 Subject: [PATCH 050/362] test-11 mac 13 --- .github/workflows/e2e-detox.yml | 69 ++++++++++++++++----------------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 32d18ae0d9b..9d047def79d 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -10,7 +10,7 @@ on: jobs: e2e-ios: - runs-on: macos-latest + runs-on: macos-13 steps: - name: ci/checkout-repo @@ -24,41 +24,40 @@ jobs: brew install applesimutils applesimutils --list | grep -i "iPhone 15" - # - name: ci/prepare-ios-build - # uses: ./.github/actions/prepare-ios-build - - # - name: ci/build-ios-simulator - # env: - # TAG: "${{ github.ref_name }}" - # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" - # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" - # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}" - # GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" - # run: bundle exec fastlane ios simulator --env ios.simulator - # working-directory: ./fastlane - - # - name: ci/upload-ios-pr-simulator - # uses: actions/upload-artifact@v4 - # with: - # name: ios-build-simulator-${{ github.run_id }} - # path: Mattermost-simulator-x86_64.app.zip - - # - name: Download iOS build artifact - # uses: actions/download-artifact@v4 - # with: - # name: ios-build-simulator-${{ github.run_id }} - # path: mobile-artifacts + - name: ci/prepare-ios-build + uses: ./.github/actions/prepare-ios-build + + - name: ci/build-ios-simulator + env: + TAG: "${{ github.ref_name }}" + AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" + AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" + MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}" + GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" + run: bundle exec fastlane ios simulator --env ios.simulator + working-directory: ./fastlane + + - name: ci/upload-ios-pr-simulator + uses: actions/upload-artifact@v4 + with: + name: ios-build-simulator-${{ github.run_id }} + path: Mattermost-simulator-x86_64.app.zip - # - name: Unzip artifact - # run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ + - name: Download iOS build artifact + uses: actions/download-artifact@v4 + with: + name: ios-build-simulator-${{ github.run_id }} + path: mobile-artifacts - # - name: Run react-native - # run: npm run start & + - name: Unzip artifact + run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ - # - name: Install detox dependencies - # run: | - # ls -l mobile-artifacts/ - # cd detox && npm install + - name: Run react-native + run: npm run start & - # - name: Run detox e2e - # run: npm run e2e:ios + - name: Install detox dependancies + run: | + ls -l mobile-artifacts/ + cd detox && npm install + - name: Run detox e2e + run: npm run e2e:ios From ee4443ddd8e7ad34030a14758bf161a69a6fb2a7 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 12 Feb 2024 22:41:26 +0530 Subject: [PATCH 051/362] test-11 mac-latest runner --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 9d047def79d..953865973c5 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -10,7 +10,7 @@ on: jobs: e2e-ios: - runs-on: macos-13 + runs-on: macos-latest steps: - name: ci/checkout-repo From 27fe5eb8bbe5d44ccea416583b803d005bda8bb4 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 12 Feb 2024 22:47:41 +0530 Subject: [PATCH 052/362] test-11 mac-latest runner --- .github/workflows/e2e-detox.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 953865973c5..5f2043cf353 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -22,6 +22,9 @@ jobs: run: | brew tap wix/brew brew install applesimutils + + - name: Run applesimutils command + run: | applesimutils --list | grep -i "iPhone 15" - name: ci/prepare-ios-build From 27082316a00c363c008057373dbb81b895315f71 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 12 Feb 2024 23:17:29 +0530 Subject: [PATCH 053/362] working with iphone 14 --- .github/workflows/e2e-detox.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 5f2043cf353..6cdd2519ff9 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -23,10 +23,6 @@ jobs: brew tap wix/brew brew install applesimutils - - name: Run applesimutils command - run: | - applesimutils --list | grep -i "iPhone 15" - - name: ci/prepare-ios-build uses: ./.github/actions/prepare-ios-build From 3c16679a5c7487ade2da92b99b42ec4ed8fac84e Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 13 Feb 2024 02:06:15 +0530 Subject: [PATCH 054/362] test Pro max and iOS 16.2 --- detox/.detoxrc.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 8419f4d82f7..ff2d98e9645 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -30,7 +30,8 @@ "ios.simulator": { "type": "ios.simulator", "device": { - "type": "iPhone 15" + "platformVersion": "16.2", + "type": "iPhone 14 Pro Max" } }, "android.emulator": { From ab9fa6845c529e2f0d03db5179a43ad772d26b26 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 13 Feb 2024 02:20:45 +0530 Subject: [PATCH 055/362] make e2e 12-large --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 6cdd2519ff9..5a102350afd 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -10,7 +10,7 @@ on: jobs: e2e-ios: - runs-on: macos-latest + runs-on: macos-12-large steps: - name: ci/checkout-repo From 462db9bd8630638df83c4a6e25a5def446434258 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 13 Feb 2024 11:53:24 +0530 Subject: [PATCH 056/362] test macos-13-xlarge and ruby 2.7.7 --- .../actions/prepare-mobile-build/action.yaml | 22 ++++++++++++++++--- .github/workflows/e2e-detox.yml | 2 +- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/.github/actions/prepare-mobile-build/action.yaml b/.github/actions/prepare-mobile-build/action.yaml index d45291dad65..7e8de2ffb37 100644 --- a/.github/actions/prepare-mobile-build/action.yaml +++ b/.github/actions/prepare-mobile-build/action.yaml @@ -4,9 +4,25 @@ description: Action to prepare environment for mobile build runs: using: composite steps: - - uses: ruby/setup-ruby@9669f3ee51dc3f4eda8447ab696b3ab19a90d14b # v1.144.0 - with: - ruby-version: "2.7.7" + - name: Install Ruby using ruby-build + run: | + # Install rbenv and ruby-build if not already installed + if [ ! -d "$HOME/.rbenv" ]; then + git clone https://github.com/rbenv/rbenv.git $HOME/.rbenv + echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> $HOME/.bash_profile + echo 'eval "$(rbenv init -)"' >> $HOME/.bash_profile + source $HOME/.bash_profile + fi + + if [ ! -d "$HOME/.rbenv/plugins/ruby-build" ]; then + git clone https://github.com/rbenv/ruby-build.git $HOME/.rbenv/plugins/ruby-build + fi + + # Install Ruby 2.7.7 + rbenv install 2.7.7 + + # Mark Ruby installation as complete + touch $RUNNER_TOOL_CACHE/Ruby/2.7.7/arm64.complete - name: ci/setup-fastlane-dependencies shell: bash diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 5a102350afd..8f0c2bb4786 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -10,7 +10,7 @@ on: jobs: e2e-ios: - runs-on: macos-12-large + runs-on: macos-13-xlarge steps: - name: ci/checkout-repo From 32a0f5e85521cec78f5b198af4f34b5c23ce3017 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 13 Feb 2024 11:57:34 +0530 Subject: [PATCH 057/362] mac-13 test --- .github/actions/prepare-mobile-build/action.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/actions/prepare-mobile-build/action.yaml b/.github/actions/prepare-mobile-build/action.yaml index 7e8de2ffb37..b3b83982855 100644 --- a/.github/actions/prepare-mobile-build/action.yaml +++ b/.github/actions/prepare-mobile-build/action.yaml @@ -5,6 +5,7 @@ runs: using: composite steps: - name: Install Ruby using ruby-build + shell: bash run: | # Install rbenv and ruby-build if not already installed if [ ! -d "$HOME/.rbenv" ]; then @@ -23,6 +24,12 @@ runs: # Mark Ruby installation as complete touch $RUNNER_TOOL_CACHE/Ruby/2.7.7/arm64.complete + env: + RUNNER_TOOL_CACHE: $RUNNER_TOOL_CACHE + + - uses: ruby/setup-ruby@9669f3ee51dc3f4eda8447ab696b3ab19a90d14b # v1.144.0 + with: + ruby-version: "2.7.7" - name: ci/setup-fastlane-dependencies shell: bash From e97c467007947aed84a06affab06a35c9d76da99 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 13 Feb 2024 12:02:57 +0530 Subject: [PATCH 058/362] mac-13 tes-2 --- .github/actions/prepare-mobile-build/action.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/actions/prepare-mobile-build/action.yaml b/.github/actions/prepare-mobile-build/action.yaml index b3b83982855..ea29f51ff3c 100644 --- a/.github/actions/prepare-mobile-build/action.yaml +++ b/.github/actions/prepare-mobile-build/action.yaml @@ -5,7 +5,7 @@ runs: using: composite steps: - name: Install Ruby using ruby-build - shell: bash + shell: bash run: | # Install rbenv and ruby-build if not already installed if [ ! -d "$HOME/.rbenv" ]; then @@ -22,6 +22,9 @@ runs: # Install Ruby 2.7.7 rbenv install 2.7.7 + # Create the directory structure if it doesn't exist + mkdir -p $RUNNER_TOOL_CACHE/Ruby/2.7.7/ + # Mark Ruby installation as complete touch $RUNNER_TOOL_CACHE/Ruby/2.7.7/arm64.complete env: From e18dd221f5a999ea61e8742b234b61672709cd01 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 13 Feb 2024 12:23:54 +0530 Subject: [PATCH 059/362] mac-13 tes-3 --- .github/actions/prepare-mobile-build/action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/prepare-mobile-build/action.yaml b/.github/actions/prepare-mobile-build/action.yaml index ea29f51ff3c..ec028cdc085 100644 --- a/.github/actions/prepare-mobile-build/action.yaml +++ b/.github/actions/prepare-mobile-build/action.yaml @@ -5,7 +5,7 @@ runs: using: composite steps: - name: Install Ruby using ruby-build - shell: bash + shell: bash run: | # Install rbenv and ruby-build if not already installed if [ ! -d "$HOME/.rbenv" ]; then From 625b0fbf5aca0b652bbfc324e3d1f51ab0705a70 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 13 Feb 2024 12:40:12 +0530 Subject: [PATCH 060/362] mac-13 tes-4 --- .github/workflows/e2e-detox.yml | 36 ++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 8f0c2bb4786..df0e5af14ed 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -18,13 +18,43 @@ jobs: with: ref: ${{ github.event.pull_request.head.sha }} - - name: Brew install + - name: ci/install-os-deps + env: + HOMEBREW_NO_AUTO_UPDATE: "1" + shell: bash run: | + echo "::group::install-os-deps" brew tap wix/brew brew install applesimutils + brew install watchman + echo "::endgroup::" + + # Install Ruby 2.7.7 on self-hosted macOS-13-arm64 runners + - name: Install Ruby 2.7.7 (self-hosted) + if: ${{ runner.os == 'macOS' && runner.osVersion == '13' }} + run: | + brew install rbenv + rbenv install 2.7.7 + rbenv global 2.7.7 + echo "::add-path::$(rbenv root)/shims" - - name: ci/prepare-ios-build - uses: ./.github/actions/prepare-ios-build + # Use ruby/setup-ruby for supported macOS images + - name: Install Ruby 2.7.7 (supported images) + if: ${{ runner.os == 'macOS' && runner.osVersion != '13' }} + uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.7.7 + + - name: ci/setup-fastlane-dependencies + shell: bash + run: | + echo "::group::setup-fastlane-dependencies" + bundle install + echo "::endgroup::" + working-directory: ./fastlane + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps - name: ci/build-ios-simulator env: From 0c42d4c9478b3360a6081712bf801bda18fed9b5 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 13 Feb 2024 12:44:09 +0530 Subject: [PATCH 061/362] mac-13 tes-5 --- .../actions/prepare-mobile-build/action.yaml | 35 ++++++------------- .github/workflows/e2e-detox.yml | 31 ++-------------- 2 files changed, 12 insertions(+), 54 deletions(-) diff --git a/.github/actions/prepare-mobile-build/action.yaml b/.github/actions/prepare-mobile-build/action.yaml index ec028cdc085..26ff3cdc024 100644 --- a/.github/actions/prepare-mobile-build/action.yaml +++ b/.github/actions/prepare-mobile-build/action.yaml @@ -4,35 +4,20 @@ description: Action to prepare environment for mobile build runs: using: composite steps: - - name: Install Ruby using ruby-build - shell: bash + - name: Install Ruby 2.7.7 (self-hosted) + if: ${{ runner.os == 'macOS' && runner.osVersion == '13' }} run: | - # Install rbenv and ruby-build if not already installed - if [ ! -d "$HOME/.rbenv" ]; then - git clone https://github.com/rbenv/rbenv.git $HOME/.rbenv - echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> $HOME/.bash_profile - echo 'eval "$(rbenv init -)"' >> $HOME/.bash_profile - source $HOME/.bash_profile - fi - - if [ ! -d "$HOME/.rbenv/plugins/ruby-build" ]; then - git clone https://github.com/rbenv/ruby-build.git $HOME/.rbenv/plugins/ruby-build - fi - - # Install Ruby 2.7.7 + brew install rbenv rbenv install 2.7.7 + rbenv global 2.7.7 + echo "::add-path::$(rbenv root)/shims" - # Create the directory structure if it doesn't exist - mkdir -p $RUNNER_TOOL_CACHE/Ruby/2.7.7/ - - # Mark Ruby installation as complete - touch $RUNNER_TOOL_CACHE/Ruby/2.7.7/arm64.complete - env: - RUNNER_TOOL_CACHE: $RUNNER_TOOL_CACHE - - - uses: ruby/setup-ruby@9669f3ee51dc3f4eda8447ab696b3ab19a90d14b # v1.144.0 + # Use ruby/setup-ruby for supported macOS images + - name: Install Ruby 2.7.7 (supported images) + if: ${{ runner.os == 'macOS' && runner.osVersion != '13' }} + uses: ruby/setup-ruby@v1 with: - ruby-version: "2.7.7" + ruby-version: 2.7.7 - name: ci/setup-fastlane-dependencies shell: bash diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index df0e5af14ed..0e9176dbc73 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -23,38 +23,11 @@ jobs: HOMEBREW_NO_AUTO_UPDATE: "1" shell: bash run: | - echo "::group::install-os-deps" brew tap wix/brew brew install applesimutils - brew install watchman - echo "::endgroup::" - # Install Ruby 2.7.7 on self-hosted macOS-13-arm64 runners - - name: Install Ruby 2.7.7 (self-hosted) - if: ${{ runner.os == 'macOS' && runner.osVersion == '13' }} - run: | - brew install rbenv - rbenv install 2.7.7 - rbenv global 2.7.7 - echo "::add-path::$(rbenv root)/shims" - - # Use ruby/setup-ruby for supported macOS images - - name: Install Ruby 2.7.7 (supported images) - if: ${{ runner.os == 'macOS' && runner.osVersion != '13' }} - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.7.7 - - - name: ci/setup-fastlane-dependencies - shell: bash - run: | - echo "::group::setup-fastlane-dependencies" - bundle install - echo "::endgroup::" - working-directory: ./fastlane - - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps + - name: ci/prepare-ios-build + uses: ./.github/actions/prepare-ios-build - name: ci/build-ios-simulator env: From e083afe97d16ddf92720263e240d8692935b7e64 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 13 Feb 2024 12:48:35 +0530 Subject: [PATCH 062/362] mac-13 tes-6 --- .github/actions/prepare-mobile-build/action.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/actions/prepare-mobile-build/action.yaml b/.github/actions/prepare-mobile-build/action.yaml index 26ff3cdc024..f0e7158aea8 100644 --- a/.github/actions/prepare-mobile-build/action.yaml +++ b/.github/actions/prepare-mobile-build/action.yaml @@ -6,6 +6,7 @@ runs: steps: - name: Install Ruby 2.7.7 (self-hosted) if: ${{ runner.os == 'macOS' && runner.osVersion == '13' }} + shell: bash run: | brew install rbenv rbenv install 2.7.7 @@ -15,6 +16,7 @@ runs: # Use ruby/setup-ruby for supported macOS images - name: Install Ruby 2.7.7 (supported images) if: ${{ runner.os == 'macOS' && runner.osVersion != '13' }} + shell: bash uses: ruby/setup-ruby@v1 with: ruby-version: 2.7.7 From 547165f884e45f674fe4d83dafd8e16c099ed27a Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 13 Feb 2024 12:58:04 +0530 Subject: [PATCH 063/362] mac-13 tes-7 --- .github/actions/prepare-mobile-build/action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/prepare-mobile-build/action.yaml b/.github/actions/prepare-mobile-build/action.yaml index f0e7158aea8..55b6568a76f 100644 --- a/.github/actions/prepare-mobile-build/action.yaml +++ b/.github/actions/prepare-mobile-build/action.yaml @@ -30,4 +30,4 @@ runs: working-directory: ./fastlane - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps + run: ./.github/actions/prepare-node-deps From 2c21acc8921f4b85f527982dc778e379316334b1 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 13 Feb 2024 15:08:28 +0530 Subject: [PATCH 064/362] mac-12 and 14 pro --- .../actions/prepare-mobile-build/action.yaml | 19 +++---------------- .github/workflows/e2e-detox.yml | 7 ++----- detox/.detoxrc.json | 3 +-- 3 files changed, 6 insertions(+), 23 deletions(-) diff --git a/.github/actions/prepare-mobile-build/action.yaml b/.github/actions/prepare-mobile-build/action.yaml index 55b6568a76f..d45291dad65 100644 --- a/.github/actions/prepare-mobile-build/action.yaml +++ b/.github/actions/prepare-mobile-build/action.yaml @@ -4,22 +4,9 @@ description: Action to prepare environment for mobile build runs: using: composite steps: - - name: Install Ruby 2.7.7 (self-hosted) - if: ${{ runner.os == 'macOS' && runner.osVersion == '13' }} - shell: bash - run: | - brew install rbenv - rbenv install 2.7.7 - rbenv global 2.7.7 - echo "::add-path::$(rbenv root)/shims" - - # Use ruby/setup-ruby for supported macOS images - - name: Install Ruby 2.7.7 (supported images) - if: ${{ runner.os == 'macOS' && runner.osVersion != '13' }} - shell: bash - uses: ruby/setup-ruby@v1 + - uses: ruby/setup-ruby@9669f3ee51dc3f4eda8447ab696b3ab19a90d14b # v1.144.0 with: - ruby-version: 2.7.7 + ruby-version: "2.7.7" - name: ci/setup-fastlane-dependencies shell: bash @@ -30,4 +17,4 @@ runs: working-directory: ./fastlane - name: ci/prepare-node-deps - run: ./.github/actions/prepare-node-deps + uses: ./.github/actions/prepare-node-deps diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 0e9176dbc73..5a102350afd 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -10,7 +10,7 @@ on: jobs: e2e-ios: - runs-on: macos-13-xlarge + runs-on: macos-12-large steps: - name: ci/checkout-repo @@ -18,10 +18,7 @@ jobs: with: ref: ${{ github.event.pull_request.head.sha }} - - name: ci/install-os-deps - env: - HOMEBREW_NO_AUTO_UPDATE: "1" - shell: bash + - name: Brew install run: | brew tap wix/brew brew install applesimutils diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index ff2d98e9645..9010760526a 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -30,8 +30,7 @@ "ios.simulator": { "type": "ios.simulator", "device": { - "platformVersion": "16.2", - "type": "iPhone 14 Pro Max" + "type": "iPhone 14 Pro" } }, "android.emulator": { From 5c9afa80498d87acd2192bedb78044771a2a41cc Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 13 Feb 2024 15:21:25 +0530 Subject: [PATCH 065/362] mac-12 and 14 pro --- detox/e2e/support/ui/screen/login.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/detox/e2e/support/ui/screen/login.ts b/detox/e2e/support/ui/screen/login.ts index 7e8d1b6c65a..2d212f6fbfd 100644 --- a/detox/e2e/support/ui/screen/login.ts +++ b/detox/e2e/support/ui/screen/login.ts @@ -61,16 +61,18 @@ class LoginScreen { login = async (user: any = {}) => { await this.toBeVisible(); await this.usernameInput.typeText(user.newUser.email); - await this.passwordInput.typeText(`${user.newUser.password}`); - await this.signinButton.tap(); - await wait(timeouts.ONE_SEC); + await this.passwordInput.typeText(`${user.newUser.password}\n`); + + // await this.signinButton.tap(); + await wait(timeouts.FOUR_SEC); }; loginAsAdmin = async (user: any = {}) => { await this.toBeVisible(); await this.usernameInput.typeText(user.username); - await this.passwordInput.typeText(`${user.password}`); - await this.signinButton.tap(); + await this.passwordInput.typeText(`${user.password}\n`); + + // await this.signinButton.tap(); await wait(timeouts.ONE_SEC); }; } From c71699a4559fcbe34d0f4f7f4d84f03260730cf4 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 13 Feb 2024 15:42:28 +0530 Subject: [PATCH 066/362] remove notification alert check --- detox/e2e/support/ui/screen/server.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/detox/e2e/support/ui/screen/server.ts b/detox/e2e/support/ui/screen/server.ts index 527c9663a9c..06ce36c2dec 100644 --- a/detox/e2e/support/ui/screen/server.ts +++ b/detox/e2e/support/ui/screen/server.ts @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import {Alert} from '@support/ui/component'; +// import {Alert} from '@support/ui/component'; import {isAndroid, isIos, timeouts, wait} from '@support/utils'; import {expect} from 'detox'; @@ -59,8 +59,8 @@ class ServerScreen { // if (serverUrl.includes('127.0.0.1')) { // # Tap alert okay button - await waitFor(Alert.okayButton).toExist().withTimeout(timeouts.TEN_SEC); - await Alert.okayButton.tap(); + // await waitFor(Alert.okayButton).toExist().withTimeout(timeouts.TEN_SEC); + // await Alert.okayButton.tap(); // } } From 74f0285fa905040e5e24760284df941da85a2c05 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 22 Feb 2024 20:07:14 +0530 Subject: [PATCH 067/362] try catch to tap on notification alert --- detox/e2e/support/ui/screen/server.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/detox/e2e/support/ui/screen/server.ts b/detox/e2e/support/ui/screen/server.ts index 06ce36c2dec..71e5f9cd74a 100644 --- a/detox/e2e/support/ui/screen/server.ts +++ b/detox/e2e/support/ui/screen/server.ts @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -// import {Alert} from '@support/ui/component'; +import {Alert} from '@support/ui/component'; import {isAndroid, isIos, timeouts, wait} from '@support/utils'; import {expect} from 'detox'; @@ -56,13 +56,16 @@ class ServerScreen { } if (isIos()) { await this.tapConnectButton(); - - // if (serverUrl.includes('127.0.0.1')) { - // # Tap alert okay button - // await waitFor(Alert.okayButton).toExist().withTimeout(timeouts.TEN_SEC); - // await Alert.okayButton.tap(); - - // } + if (serverUrl.includes('127.0.0.1') || !process.env.CI) { + try { + // # Tap alert okay button + await waitFor(Alert.okayButton).toExist().withTimeout(timeouts.TEN_SEC); + await Alert.okayButton.tap(); + } catch (error) { + /* eslint-disable no-console */ + console.log('Alert button did not appear!'); + } + } } await waitFor(this.usernameInput).toExist().withTimeout(timeouts.ONE_SEC); }; From 28ae4194d0e1bd9da9d56e23fe0ba2b8b0344177 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 22 Feb 2024 20:13:17 +0530 Subject: [PATCH 068/362] update runner --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 5a102350afd..cde76d42cfd 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -10,7 +10,7 @@ on: jobs: e2e-ios: - runs-on: macos-12-large + runs-on: macos-14-large steps: - name: ci/checkout-repo From e40c1845965c98c24476a2271094af0391feaab8 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 28 Feb 2024 14:41:36 +0530 Subject: [PATCH 069/362] test fix --- detox/e2e/support/ui/screen/create_or_edit_channel.ts | 2 ++ detox/e2e/test/autocomplete/edit_post.e2e.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/detox/e2e/support/ui/screen/create_or_edit_channel.ts b/detox/e2e/support/ui/screen/create_or_edit_channel.ts index 70f5dc9de4e..d8f6fb1fd89 100644 --- a/detox/e2e/support/ui/screen/create_or_edit_channel.ts +++ b/detox/e2e/support/ui/screen/create_or_edit_channel.ts @@ -59,6 +59,8 @@ class CreateOrEditChannelScreen { openEditChannel = async () => { // # Open edit channel screen + await ChannelInfoScreen.scrollView.tap({x: 1, y: 1}); + await ChannelInfoScreen.scrollView.scroll(100, 'down'); await ChannelInfoScreen.editChannelOption.tap(); return this.toBeVisible(); diff --git a/detox/e2e/test/autocomplete/edit_post.e2e.ts b/detox/e2e/test/autocomplete/edit_post.e2e.ts index fa81bd8f306..f9ec0ba3ee8 100644 --- a/detox/e2e/test/autocomplete/edit_post.e2e.ts +++ b/detox/e2e/test/autocomplete/edit_post.e2e.ts @@ -67,7 +67,7 @@ describe('Autocomplete - Edit Post', () => { await expect(Autocomplete.sectionAtMentionList).not.toBeVisible(); // # Type in "@" to activate at-mention autocomplete - await EditPostScreen.messageInput.typeText('@'); + await EditPostScreen.messageInput.typeText(' @'); // * Verify at-mention list is displayed await expect(Autocomplete.sectionAtMentionList).toBeVisible(); From dda05082899ab09d26f988a6791ed3a5e3cede04 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 28 Feb 2024 20:50:13 +0530 Subject: [PATCH 070/362] test fix --- .github/actions/prepare-ios-build/action.yaml | 1 + .github/workflows/e2e-detox.yml | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index 2f34a90a9a3..6f30a8c4aaa 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -10,6 +10,7 @@ runs: shell: bash run: | echo "::group::install-os-deps" + rm '/usr/local/bin/2to3' brew install watchman echo "::endgroup::" diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index cde76d42cfd..f8a3cea5d34 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -14,9 +14,7 @@ jobs: steps: - name: ci/checkout-repo - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.sha }} + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 - name: Brew install run: | @@ -37,7 +35,7 @@ jobs: working-directory: ./fastlane - name: ci/upload-ios-pr-simulator - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ios-build-simulator-${{ github.run_id }} path: Mattermost-simulator-x86_64.app.zip From c3bdbd1e97b222e7a62cd1de27c313c3b58e2aba Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 28 Feb 2024 20:59:55 +0530 Subject: [PATCH 071/362] test fix --- .github/workflows/e2e-detox.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index f8a3cea5d34..6a0c439cad4 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -16,14 +16,14 @@ jobs: - name: ci/checkout-repo uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + - name: ci/prepare-ios-build + uses: ./.github/actions/prepare-ios-build + - name: Brew install run: | brew tap wix/brew brew install applesimutils - - name: ci/prepare-ios-build - uses: ./.github/actions/prepare-ios-build - - name: ci/build-ios-simulator env: TAG: "${{ github.ref_name }}" From d7cab061002a014f15b05cb0be7a1c36040f9a2d Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 28 Feb 2024 21:20:31 +0530 Subject: [PATCH 072/362] fix detoc/package-lock --- detox/.detoxrc.json | 2 +- detox/package-lock.json | 8121 +-------------------------------------- 2 files changed, 2 insertions(+), 8121 deletions(-) diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 9010760526a..72ff2885bc6 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -30,7 +30,7 @@ "ios.simulator": { "type": "ios.simulator", "device": { - "type": "iPhone 14 Pro" + "type": "iPhone 15 Pro" } }, "android.emulator": { diff --git a/detox/package-lock.json b/detox/package-lock.json index 711ba9ce401..3012ba0dc9d 100644 --- a/detox/package-lock.json +++ b/detox/package-lock.json @@ -1,6 +1,6 @@ { "name": "mattermost-mobile-e2e", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -10831,8124 +10831,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@aws-crypto/crc32": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", - "dev": true, - "requires": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@aws-crypto/crc32c": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz", - "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==", - "dev": true, - "requires": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@aws-crypto/ie11-detection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", - "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", - "dev": true, - "requires": { - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@aws-crypto/sha1-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz", - "integrity": "sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==", - "dev": true, - "requires": { - "@aws-crypto/ie11-detection": "^3.0.0", - "@aws-crypto/supports-web-crypto": "^3.0.0", - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@aws-crypto/sha256-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", - "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", - "dev": true, - "requires": { - "@aws-crypto/ie11-detection": "^3.0.0", - "@aws-crypto/sha256-js": "^3.0.0", - "@aws-crypto/supports-web-crypto": "^3.0.0", - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@aws-crypto/sha256-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", - "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", - "dev": true, - "requires": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@aws-crypto/supports-web-crypto": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", - "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", - "dev": true, - "requires": { - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@aws-crypto/util": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", - "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", - "dev": true, - "requires": { - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@aws-sdk/client-s3": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.445.0.tgz", - "integrity": "sha512-2G+3MnO78irZRjlfkdvtlKRQ3yuOfrRMg8mztKpMw0q/9WHtwCcmaUUpl1bXwJ+BcNTVHopLQXdbzCeaxxI92w==", - "dev": true, - "requires": { - "@aws-crypto/sha1-browser": "3.0.0", - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.445.0", - "@aws-sdk/core": "3.445.0", - "@aws-sdk/credential-provider-node": "3.445.0", - "@aws-sdk/middleware-bucket-endpoint": "3.433.0", - "@aws-sdk/middleware-expect-continue": "3.433.0", - "@aws-sdk/middleware-flexible-checksums": "3.433.0", - "@aws-sdk/middleware-host-header": "3.433.0", - "@aws-sdk/middleware-location-constraint": "3.433.0", - "@aws-sdk/middleware-logger": "3.433.0", - "@aws-sdk/middleware-recursion-detection": "3.433.0", - "@aws-sdk/middleware-sdk-s3": "3.440.0", - "@aws-sdk/middleware-signing": "3.433.0", - "@aws-sdk/middleware-ssec": "3.433.0", - "@aws-sdk/middleware-user-agent": "3.438.0", - "@aws-sdk/region-config-resolver": "3.433.0", - "@aws-sdk/signature-v4-multi-region": "3.437.0", - "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.438.0", - "@aws-sdk/util-user-agent-browser": "3.433.0", - "@aws-sdk/util-user-agent-node": "3.437.0", - "@aws-sdk/xml-builder": "3.310.0", - "@smithy/config-resolver": "^2.0.16", - "@smithy/eventstream-serde-browser": "^2.0.12", - "@smithy/eventstream-serde-config-resolver": "^2.0.12", - "@smithy/eventstream-serde-node": "^2.0.12", - "@smithy/fetch-http-handler": "^2.2.4", - "@smithy/hash-blob-browser": "^2.0.12", - "@smithy/hash-node": "^2.0.12", - "@smithy/hash-stream-node": "^2.0.12", - "@smithy/invalid-dependency": "^2.0.12", - "@smithy/md5-js": "^2.0.12", - "@smithy/middleware-content-length": "^2.0.14", - "@smithy/middleware-endpoint": "^2.1.3", - "@smithy/middleware-retry": "^2.0.18", - "@smithy/middleware-serde": "^2.0.12", - "@smithy/middleware-stack": "^2.0.6", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/node-http-handler": "^2.1.8", - "@smithy/protocol-http": "^3.0.8", - "@smithy/smithy-client": "^2.1.12", - "@smithy/types": "^2.4.0", - "@smithy/url-parser": "^2.0.12", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.16", - "@smithy/util-defaults-mode-node": "^2.0.21", - "@smithy/util-endpoints": "^1.0.2", - "@smithy/util-retry": "^2.0.5", - "@smithy/util-stream": "^2.0.17", - "@smithy/util-utf8": "^2.0.0", - "@smithy/util-waiter": "^2.0.12", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/client-sso": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.445.0.tgz", - "integrity": "sha512-me4LvqNnu6kxi+sW7t0AgMv1Yi64ikas0x2+5jv23o6Csg32w0S0xOjCTKQYahOA5CMFunWvlkFIfxbqs+Uo7w==", - "dev": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.445.0", - "@aws-sdk/middleware-host-header": "3.433.0", - "@aws-sdk/middleware-logger": "3.433.0", - "@aws-sdk/middleware-recursion-detection": "3.433.0", - "@aws-sdk/middleware-user-agent": "3.438.0", - "@aws-sdk/region-config-resolver": "3.433.0", - "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.438.0", - "@aws-sdk/util-user-agent-browser": "3.433.0", - "@aws-sdk/util-user-agent-node": "3.437.0", - "@smithy/config-resolver": "^2.0.16", - "@smithy/fetch-http-handler": "^2.2.4", - "@smithy/hash-node": "^2.0.12", - "@smithy/invalid-dependency": "^2.0.12", - "@smithy/middleware-content-length": "^2.0.14", - "@smithy/middleware-endpoint": "^2.1.3", - "@smithy/middleware-retry": "^2.0.18", - "@smithy/middleware-serde": "^2.0.12", - "@smithy/middleware-stack": "^2.0.6", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/node-http-handler": "^2.1.8", - "@smithy/protocol-http": "^3.0.8", - "@smithy/smithy-client": "^2.1.12", - "@smithy/types": "^2.4.0", - "@smithy/url-parser": "^2.0.12", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.16", - "@smithy/util-defaults-mode-node": "^2.0.21", - "@smithy/util-endpoints": "^1.0.2", - "@smithy/util-retry": "^2.0.5", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/client-sts": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.445.0.tgz", - "integrity": "sha512-ogbdqrS8x9O5BTot826iLnTQ6i4/F5BSi/74gycneCxYmAnYnyUBNOWVnynv6XZiEWyDJQCU2UtMd52aNGW1GA==", - "dev": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.445.0", - "@aws-sdk/credential-provider-node": "3.445.0", - "@aws-sdk/middleware-host-header": "3.433.0", - "@aws-sdk/middleware-logger": "3.433.0", - "@aws-sdk/middleware-recursion-detection": "3.433.0", - "@aws-sdk/middleware-sdk-sts": "3.433.0", - "@aws-sdk/middleware-signing": "3.433.0", - "@aws-sdk/middleware-user-agent": "3.438.0", - "@aws-sdk/region-config-resolver": "3.433.0", - "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.438.0", - "@aws-sdk/util-user-agent-browser": "3.433.0", - "@aws-sdk/util-user-agent-node": "3.437.0", - "@smithy/config-resolver": "^2.0.16", - "@smithy/fetch-http-handler": "^2.2.4", - "@smithy/hash-node": "^2.0.12", - "@smithy/invalid-dependency": "^2.0.12", - "@smithy/middleware-content-length": "^2.0.14", - "@smithy/middleware-endpoint": "^2.1.3", - "@smithy/middleware-retry": "^2.0.18", - "@smithy/middleware-serde": "^2.0.12", - "@smithy/middleware-stack": "^2.0.6", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/node-http-handler": "^2.1.8", - "@smithy/protocol-http": "^3.0.8", - "@smithy/smithy-client": "^2.1.12", - "@smithy/types": "^2.4.0", - "@smithy/url-parser": "^2.0.12", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.16", - "@smithy/util-defaults-mode-node": "^2.0.21", - "@smithy/util-endpoints": "^1.0.2", - "@smithy/util-retry": "^2.0.5", - "@smithy/util-utf8": "^2.0.0", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/core": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.445.0.tgz", - "integrity": "sha512-6GYLElUG1QTOdmXG8zXa+Ull9IUeSeItKDYHKzHYfIkbsagMfYlf7wm9XIYlatjtgodNfZ3gPHAJfRyPmwKrsg==", - "dev": true, - "requires": { - "@smithy/smithy-client": "^2.1.12", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-env": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.433.0.tgz", - "integrity": "sha512-Vl7Qz5qYyxBurMn6hfSiNJeUHSqfVUlMt0C1Bds3tCkl3IzecRWwyBOlxtxO3VCrgVeW3HqswLzCvhAFzPH6nQ==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-ini": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.445.0.tgz", - "integrity": "sha512-R7IYSGjNZ5KKJwQJ2HNPemjpAMWvdce91i8w+/aHfqeGfTXrmYJu99PeGRyyBTKEumBaojyjTRvmO8HzS+/l7g==", - "dev": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.433.0", - "@aws-sdk/credential-provider-process": "3.433.0", - "@aws-sdk/credential-provider-sso": "3.445.0", - "@aws-sdk/credential-provider-web-identity": "3.433.0", - "@aws-sdk/types": "3.433.0", - "@smithy/credential-provider-imds": "^2.0.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-node": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.445.0.tgz", - "integrity": "sha512-zI4k4foSjQRKNEsouculRcz7IbLfuqdFxypDLYwn+qPNMqJwWJ7VxOOeBSPUpHFcd7CLSfbHN2JAhQ7M02gPTA==", - "dev": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.433.0", - "@aws-sdk/credential-provider-ini": "3.445.0", - "@aws-sdk/credential-provider-process": "3.433.0", - "@aws-sdk/credential-provider-sso": "3.445.0", - "@aws-sdk/credential-provider-web-identity": "3.433.0", - "@aws-sdk/types": "3.433.0", - "@smithy/credential-provider-imds": "^2.0.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-process": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.433.0.tgz", - "integrity": "sha512-W7FcGlQjio9Y/PepcZGRyl5Bpwb0uWU7qIUCh+u4+q2mW4D5ZngXg8V/opL9/I/p4tUH9VXZLyLGwyBSkdhL+A==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-sso": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.445.0.tgz", - "integrity": "sha512-gJz7kAiDecdhtApgXnxfZsXKsww8BnifDF9MAx9Dr4X6no47qYsCCS3XPuEyRiF9VebXvHOH0H260Zp3bVyniQ==", - "dev": true, - "requires": { - "@aws-sdk/client-sso": "3.445.0", - "@aws-sdk/token-providers": "3.438.0", - "@aws-sdk/types": "3.433.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-web-identity": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.433.0.tgz", - "integrity": "sha512-RlwjP1I5wO+aPpwyCp23Mk8nmRbRL33hqRASy73c4JA2z2YiRua+ryt6MalIxehhwQU6xvXUKulJnPG9VaMFZg==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/lib-storage": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.445.0.tgz", - "integrity": "sha512-sCP3lh71oMkx/B3+tSOGr81cff1Z1Yy5ejh5xa/YuH6OefQUFBM7/EC0CJiNfVXemh3D6O+biKETL+t2rAiZoQ==", - "dev": true, - "requires": { - "@smithy/abort-controller": "^2.0.1", - "@smithy/middleware-endpoint": "^2.1.3", - "@smithy/smithy-client": "^2.1.12", - "buffer": "5.6.0", - "events": "3.3.0", - "stream-browserify": "3.0.0", - "tslib": "^2.5.0" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - } - } - }, - "@aws-sdk/middleware-bucket-endpoint": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.433.0.tgz", - "integrity": "sha512-Lk1xIu2tWTRa1zDw5hCF1RrpWQYSodUhrS/q3oKz8IAoFqEy+lNaD5jx+fycuZb5EkE4IzWysT+8wVkd0mAnOg==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-arn-parser": "3.310.0", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/protocol-http": "^3.0.8", - "@smithy/types": "^2.4.0", - "@smithy/util-config-provider": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-expect-continue": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.433.0.tgz", - "integrity": "sha512-Uq2rPIsjz0CR2sulM/HyYr5WiqiefrSRLdwUZuA7opxFSfE808w5DBWSprHxbH3rbDSQR4nFiOiVYIH8Eth7nA==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-flexible-checksums": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.433.0.tgz", - "integrity": "sha512-Ptssx373+I7EzFUWjp/i/YiNFt6I6sDuRHz6DOUR9nmmRTlHHqmdcBXlJL2d9wwFxoBRCN8/PXGsTc/DJ4c95Q==", - "dev": true, - "requires": { - "@aws-crypto/crc32": "3.0.0", - "@aws-crypto/crc32c": "3.0.0", - "@aws-sdk/types": "3.433.0", - "@smithy/is-array-buffer": "^2.0.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/types": "^2.4.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-host-header": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.433.0.tgz", - "integrity": "sha512-mBTq3UWv1UzeHG+OfUQ2MB/5GEkt5LTKFaUqzL7ESwzW8XtpBgXnjZvIwu3Vcd3sEetMwijwaGiJhY0ae/YyaA==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-location-constraint": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.433.0.tgz", - "integrity": "sha512-2YD860TGntwZifIUbxm+lFnNJJhByR/RB/+fV1I8oGKg+XX2rZU+94pRfHXRywoZKlCA0L+LGDA1I56jxrB9sw==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-logger": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.433.0.tgz", - "integrity": "sha512-We346Fb5xGonTGVZC9Nvqtnqy74VJzYuTLLiuuftA5sbNzftBDy/22QCfvYSTOAl3bvif+dkDUzQY2ihc5PwOQ==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-recursion-detection": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.433.0.tgz", - "integrity": "sha512-HEvYC9PQlWY/ccUYtLvAlwwf1iCif2TSAmLNr3YTBRVa98x6jKL0hlCrHWYklFeqOGSKy6XhE+NGJMUII0/HaQ==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-sdk-s3": { - "version": "3.440.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.440.0.tgz", - "integrity": "sha512-DVTSr+82Z8jR9xTwDN3YHzxX7qvi0n96V92OfxvSRDq2BldCEx/KEL1orUZjw97SAXhINOlUWjRR7j4HpwWQtQ==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-arn-parser": "3.310.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/smithy-client": "^2.1.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-sdk-sts": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.433.0.tgz", - "integrity": "sha512-ORYbJnBejUyonFl5FwIqhvI3Cq6sAp9j+JpkKZtFNma9tFPdrhmYgfCeNH32H/wGTQV/tUoQ3luh0gA4cuk6DA==", - "dev": true, - "requires": { - "@aws-sdk/middleware-signing": "3.433.0", - "@aws-sdk/types": "3.433.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-signing": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.433.0.tgz", - "integrity": "sha512-jxPvt59NZo/epMNLNTu47ikmP8v0q217I6bQFGJG7JVFnfl36zDktMwGw+0xZR80qiK47/2BWrNpta61Zd2FxQ==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.4.0", - "@smithy/util-middleware": "^2.0.5", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-ssec": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.433.0.tgz", - "integrity": "sha512-2AMaPx0kYfCiekxoL7aqFqSSoA9du+yI4zefpQNLr+1cZOerYiDxdsZ4mbqStR1CVFaX6U6hrYokXzjInsvETw==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-user-agent": { - "version": "3.438.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.438.0.tgz", - "integrity": "sha512-a+xHT1wOxT6EA6YyLmrfaroKWOkwwyiktUfXKM0FsUutGzNi4fKhb5NZ2al58NsXzHgHFrasSDp+Lqbd/X2cEw==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.438.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/region-config-resolver": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.433.0.tgz", - "integrity": "sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==", - "dev": true, - "requires": { - "@smithy/node-config-provider": "^2.1.3", - "@smithy/types": "^2.4.0", - "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.5", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/signature-v4-multi-region": { - "version": "3.437.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.437.0.tgz", - "integrity": "sha512-MmrqudssOs87JgVg7HGVdvJws/t4kcOrJJd+975ki+DPeSoyK2U4zBDfDkJ+n0tFuZBs3sLwLh0QXE7BV28rRA==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/token-providers": { - "version": "3.438.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.438.0.tgz", - "integrity": "sha512-G2fUfTtU6/1ayYRMu0Pd9Ln4qYSvwJOWCqJMdkDgvXSwdgcOSOLsnAIk1AHGJDAvgLikdCzuyOsdJiexr9Vnww==", - "dev": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.433.0", - "@aws-sdk/middleware-logger": "3.433.0", - "@aws-sdk/middleware-recursion-detection": "3.433.0", - "@aws-sdk/middleware-user-agent": "3.438.0", - "@aws-sdk/region-config-resolver": "3.433.0", - "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.438.0", - "@aws-sdk/util-user-agent-browser": "3.433.0", - "@aws-sdk/util-user-agent-node": "3.437.0", - "@smithy/config-resolver": "^2.0.16", - "@smithy/fetch-http-handler": "^2.2.4", - "@smithy/hash-node": "^2.0.12", - "@smithy/invalid-dependency": "^2.0.12", - "@smithy/middleware-content-length": "^2.0.14", - "@smithy/middleware-endpoint": "^2.1.3", - "@smithy/middleware-retry": "^2.0.18", - "@smithy/middleware-serde": "^2.0.12", - "@smithy/middleware-stack": "^2.0.6", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/node-http-handler": "^2.1.8", - "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/smithy-client": "^2.1.12", - "@smithy/types": "^2.4.0", - "@smithy/url-parser": "^2.0.12", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.16", - "@smithy/util-defaults-mode-node": "^2.0.21", - "@smithy/util-endpoints": "^1.0.2", - "@smithy/util-retry": "^2.0.5", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/types": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.433.0.tgz", - "integrity": "sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-arn-parser": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.310.0.tgz", - "integrity": "sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-endpoints": { - "version": "3.438.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.438.0.tgz", - "integrity": "sha512-6VyPTq1kN3GWxwFt5DdZfOsr6cJZPLjWh0troY/0uUv3hK74C9o3Y0Xf/z8UAUvQFkVqZse12O0/BgPVMImvfA==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/util-endpoints": "^1.0.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-locate-window": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", - "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-user-agent-browser": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.433.0.tgz", - "integrity": "sha512-2Cf/Lwvxbt5RXvWFXrFr49vXv0IddiUwrZoAiwhDYxvsh+BMnh+NUFot+ZQaTrk/8IPZVDeLPWZRdVy00iaVXQ==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/types": "^2.4.0", - "bowser": "^2.11.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-user-agent-node": { - "version": "3.437.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.437.0.tgz", - "integrity": "sha512-JVEcvWaniamtYVPem4UthtCNoTBCfFTwYj7Y3CrWZ2Qic4TqrwLkAfaBGtI2TGrhIClVr77uzLI6exqMTN7orA==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", - "dev": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/xml-builder": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.310.0.tgz", - "integrity": "sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - } - }, - "@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", - "dev": true - }, - "@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", - "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz", - "integrity": "sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.0" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", - "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "requires": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", - "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-module-transforms": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", - "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - } - }, - "@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - } - }, - "@babel/helpers": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", - "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.13", - "@babel/types": "^7.20.7" - } - }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", - "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz", - "integrity": "sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz", - "integrity": "sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz", - "integrity": "sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", - "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" - } - }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz", - "integrity": "sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz", - "integrity": "sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/preset-env": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.20.tgz", - "integrity": "sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.20", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.15", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.15", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.15", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.15", - "@babel/plugin-transform-modules-systemjs": "^7.22.11", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.22.15", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.19", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "@babel/runtime": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", - "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@flatten-js/interval-tree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@flatten-js/interval-tree/-/interval-tree-1.1.2.tgz", - "integrity": "sha512-OwLoV9E/XM6b7bes2rSFnGNjyRy7vcoIHFTnmBR2WAaZTf0Fe4EX4GdA65vU1KgFAasti7iRSg2dZfYd1Zt00Q==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - } - }, - "@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "requires": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - } - }, - "@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3" - } - }, - "@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - } - }, - "@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", - "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@kurkle/color": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", - "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@oozcitak/dom": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", - "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", - "dev": true, - "requires": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/url": "1.0.4", - "@oozcitak/util": "8.3.8" - } - }, - "@oozcitak/infra": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", - "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", - "dev": true, - "requires": { - "@oozcitak/util": "8.3.8" - } - }, - "@oozcitak/url": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", - "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", - "dev": true, - "requires": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/util": "8.3.8" - } - }, - "@oozcitak/util": { - "version": "8.3.8", - "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", - "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", - "dev": true - }, - "@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", - "dev": true, - "peer": true - }, - "@servie/events": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@servie/events/-/events-1.0.0.tgz", - "integrity": "sha512-sBSO19KzdrJCM3gdx6eIxV8M9Gxfgg6iDQmH5TIAGaUu+X9VDdsINXJOnoiZ1Kx3TrHdH4bt5UVglkjsEGBcvw==", - "dev": true - }, - "@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^3.0.0" - } - }, - "@smithy/abort-controller": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.12.tgz", - "integrity": "sha512-YIJyefe1mi3GxKdZxEBEuzYOeQ9xpYfqnFmWzojCssRAuR7ycxwpoRQgp965vuW426xUAQhCV5rCaWElQ7XsaA==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/chunked-blob-reader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.0.0.tgz", - "integrity": "sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/chunked-blob-reader-native": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.0.tgz", - "integrity": "sha512-HM8V2Rp1y8+1343tkZUKZllFhEQPNmpNdgFAncbTsxkZ18/gqjk23XXv3qGyXWp412f3o43ZZ1UZHVcHrpRnCQ==", - "dev": true, - "requires": { - "@smithy/util-base64": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/config-resolver": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.16.tgz", - "integrity": "sha512-1k+FWHQDt2pfpXhJsOmNMmlAZ3NUQ98X5tYsjQhVGq+0X6cOBMhfh6Igd0IX3Ut6lEO6DQAdPMI/blNr3JZfMQ==", - "dev": true, - "requires": { - "@smithy/node-config-provider": "^2.1.3", - "@smithy/types": "^2.4.0", - "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.5", - "tslib": "^2.5.0" - } - }, - "@smithy/credential-provider-imds": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.18.tgz", - "integrity": "sha512-QnPBi6D2zj6AHJdUTo5zXmk8vwHJ2bNevhcVned1y+TZz/OI5cizz5DsYNkqFUIDn8tBuEyKNgbmKVNhBbuY3g==", - "dev": true, - "requires": { - "@smithy/node-config-provider": "^2.1.3", - "@smithy/property-provider": "^2.0.13", - "@smithy/types": "^2.4.0", - "@smithy/url-parser": "^2.0.12", - "tslib": "^2.5.0" - } - }, - "@smithy/eventstream-codec": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz", - "integrity": "sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A==", - "dev": true, - "requires": { - "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.4.0", - "@smithy/util-hex-encoding": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/eventstream-serde-browser": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.12.tgz", - "integrity": "sha512-0pi8QlU/pwutNshoeJcbKR1p7Ie5STd8UFAMX5xhSoSJjNlxIv/OsHbF023jscMRN2Prrqd6ToGgdCnsZVQjvg==", - "dev": true, - "requires": { - "@smithy/eventstream-serde-universal": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/eventstream-serde-config-resolver": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.12.tgz", - "integrity": "sha512-I0XfwQkIX3gAnbrU5rLMkBSjTM9DHttdbLwf12CXmj7SSI5dT87PxtKLRrZGanaCMbdf2yCep+MW5/4M7IbvQA==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/eventstream-serde-node": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.12.tgz", - "integrity": "sha512-vf1vMHGOkG3uqN9x1zKOhnvW/XgvhJXWqjV6zZiT2FMjlEayugQ1mzpSqr7uf89+BzjTzuZKERmOsEAmewLbxw==", - "dev": true, - "requires": { - "@smithy/eventstream-serde-universal": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/eventstream-serde-universal": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.12.tgz", - "integrity": "sha512-xZ3ZNpCxIND+q+UCy7y1n1/5VQEYicgSTNCcPqsKawX+Vd+6OcFX7gUHMyPzL8cZr+GdmJuxNleqHlH4giK2tw==", - "dev": true, - "requires": { - "@smithy/eventstream-codec": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/fetch-http-handler": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.4.tgz", - "integrity": "sha512-gIPRFEGi+c6V52eauGKrjDzPWF2Cu7Z1r5F8A3j2wcwz25sPG/t8kjsbEhli/tS/2zJp/ybCZXe4j4ro3yv/HA==", - "dev": true, - "requires": { - "@smithy/protocol-http": "^3.0.8", - "@smithy/querystring-builder": "^2.0.12", - "@smithy/types": "^2.4.0", - "@smithy/util-base64": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/hash-blob-browser": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.12.tgz", - "integrity": "sha512-riLnV16f27yyePX8UF0deRHAeccUK8SrOxyTykSTrnVkgS3DsjNapZtTbd8OGNKEbI60Ncdb5GwN3rHZudXvog==", - "dev": true, - "requires": { - "@smithy/chunked-blob-reader": "^2.0.0", - "@smithy/chunked-blob-reader-native": "^2.0.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/hash-node": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.12.tgz", - "integrity": "sha512-fDZnTr5j9t5qcbeJ037aMZXxMka13Znqwrgy3PAqYj6Dm3XHXHftTH3q+NWgayUxl1992GFtQt1RuEzRMy3NnQ==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/hash-stream-node": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.0.12.tgz", - "integrity": "sha512-x/DrSynPKrW0k00q7aZ/vy531a3mRw79mOajHp+cIF0TrA1SqEMFoy/B8X0XtoAtlJWt/vvgeDNqt/KAeaAqMw==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/invalid-dependency": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.12.tgz", - "integrity": "sha512-p5Y+iMHV3SoEpy3VSR7mifbreHQwVSvHSAz/m4GdoXfOzKzaYC8hYv10Ks7Deblkf7lhas8U+lAp9ThbBM+ZXA==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/is-array-buffer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", - "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/md5-js": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.12.tgz", - "integrity": "sha512-OgDt+Xnrw+W5z3MSl5KZZzebqmXrYl9UdbCiBYnnjErmNywwSjV6QB/Oic3/7hnsPniSU81n7Rvlhz2kH4EREQ==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-content-length": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.14.tgz", - "integrity": "sha512-poUNgKTw9XwPXfX9nEHpVgrMNVpaSMZbshqvPxFVoalF4wp6kRzYKOfdesSVectlQ51VtigoLfbXcdyPwvxgTg==", - "dev": true, - "requires": { - "@smithy/protocol-http": "^3.0.8", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-endpoint": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.3.tgz", - "integrity": "sha512-ZrQ0/YX6hNVTxqMEHtEaDbDv6pNeEji/a5Vk3HuFC5R3ZY8lfoATyxmOGxBVYnF3NUvZLNC7umEv1WzWGWvCGQ==", - "dev": true, - "requires": { - "@smithy/middleware-serde": "^2.0.12", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/shared-ini-file-loader": "^2.2.2", - "@smithy/types": "^2.4.0", - "@smithy/url-parser": "^2.0.12", - "@smithy/util-middleware": "^2.0.5", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-retry": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.18.tgz", - "integrity": "sha512-VyrHQRldGSb3v9oFOB5yPxmLT7U2sQic2ytylOnYlnsmVOLlFIaI6sW22c+w2675yq+XZ6HOuzV7x2OBYCWRNA==", - "dev": true, - "requires": { - "@smithy/node-config-provider": "^2.1.3", - "@smithy/protocol-http": "^3.0.8", - "@smithy/service-error-classification": "^2.0.5", - "@smithy/types": "^2.4.0", - "@smithy/util-middleware": "^2.0.5", - "@smithy/util-retry": "^2.0.5", - "tslib": "^2.5.0", - "uuid": "^8.3.2" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - } - } - }, - "@smithy/middleware-serde": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.12.tgz", - "integrity": "sha512-IBeco157lIScecq2Z+n0gq56i4MTnfKxS7rbfrAORveDJgnbBAaEQgYqMqp/cYqKrpvEXcyTjwKHrBjCCIZh2A==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-stack": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.6.tgz", - "integrity": "sha512-YSvNZeOKWLJ0M/ycxwDIe2Ztkp6Qixmcml1ggsSv2fdHKGkBPhGrX5tMzPGMI1yyx55UEYBi2OB4s+RriXX48A==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/node-config-provider": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.3.tgz", - "integrity": "sha512-J6lXvRHGVnSX3n1PYi+e1L5HN73DkkJpUviV3Ebf+8wSaIjAf+eVNbzyvh/S5EQz7nf4KVfwbD5vdoZMAthAEQ==", - "dev": true, - "requires": { - "@smithy/property-provider": "^2.0.13", - "@smithy/shared-ini-file-loader": "^2.2.2", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/node-http-handler": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.8.tgz", - "integrity": "sha512-KZylM7Wff/So5SmCiwg2kQNXJ+RXgz34wkxS7WNwIUXuZrZZpY/jKJCK+ZaGyuESDu3TxcaY+zeYGJmnFKbQsA==", - "dev": true, - "requires": { - "@smithy/abort-controller": "^2.0.12", - "@smithy/protocol-http": "^3.0.8", - "@smithy/querystring-builder": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/property-provider": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.13.tgz", - "integrity": "sha512-VJqUf2CbsQX6uUiC5dUPuoEATuFjkbkW3lJHbRnpk9EDC9X+iKqhfTK+WP+lve5EQ9TcCI1Q6R7hrg41FyC54w==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/protocol-http": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", - "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/querystring-builder": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.12.tgz", - "integrity": "sha512-cDbF07IuCjiN8CdGvPzfJjXIrmDSelScRfyJYrYBNBbKl2+k7QD/KqiHhtRyEKgID5mmEVrV6KE6L/iPJ98sFw==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "@smithy/util-uri-escape": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/querystring-parser": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.12.tgz", - "integrity": "sha512-fytyTcXaMzPBuNtPlhj5v6dbl4bJAnwKZFyyItAGt4Tgm9HFPZNo7a9r1SKPr/qdxUEBzvL9Rh+B9SkTX3kFxg==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/service-error-classification": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.5.tgz", - "integrity": "sha512-M0SeJnEgD2ywJyV99Fb1yKFzmxDe9JfpJiYTVSRMyRLc467BPU0qsuuDPzMCdB1mU8M8u1rVOdkqdoyFN8UFTw==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0" - } - }, - "@smithy/shared-ini-file-loader": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.2.tgz", - "integrity": "sha512-noyQUPn7b1M8uB0GEXc/Zyxq+5K2b7aaqWnLp+hgJ7+xu/FCvtyWy5eWLDjQEsHnAet2IZhS5QF8872OR69uNg==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/signature-v4": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.12.tgz", - "integrity": "sha512-6Kc2lCZEVmb1nNYngyNbWpq0d82OZwITH11SW/Q0U6PX5fH7B2cIcFe7o6eGEFPkTZTP8itTzmYiGcECL0D0Lw==", - "dev": true, - "requires": { - "@smithy/eventstream-codec": "^2.0.12", - "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.4.0", - "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-middleware": "^2.0.5", - "@smithy/util-uri-escape": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/smithy-client": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.12.tgz", - "integrity": "sha512-XXqhridfkKnpj+lt8vM6HRlZbqUAqBjVC74JIi13F/AYQd/zTj9SOyGfxnbp4mjY9q28LityxIuV8CTinr9r5w==", - "dev": true, - "requires": { - "@smithy/middleware-stack": "^2.0.6", - "@smithy/types": "^2.4.0", - "@smithy/util-stream": "^2.0.17", - "tslib": "^2.5.0" - } - }, - "@smithy/types": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", - "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/url-parser": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.12.tgz", - "integrity": "sha512-qgkW2mZqRvlNUcBkxYB/gYacRaAdck77Dk3/g2iw0S9F0EYthIS3loGfly8AwoWpIvHKhkTsCXXQfzksgZ4zIA==", - "dev": true, - "requires": { - "@smithy/querystring-parser": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-base64": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", - "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", - "dev": true, - "requires": { - "@smithy/util-buffer-from": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-body-length-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", - "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-body-length-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", - "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-buffer-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", - "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", - "dev": true, - "requires": { - "@smithy/is-array-buffer": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-config-provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", - "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-defaults-mode-browser": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.16.tgz", - "integrity": "sha512-Uv5Cu8nVkuvLn0puX+R9zWbSNpLIR3AxUlPoLJ7hC5lvir8B2WVqVEkJLwtixKAncVLasnTVjPDCidtAUTGEQw==", - "dev": true, - "requires": { - "@smithy/property-provider": "^2.0.13", - "@smithy/smithy-client": "^2.1.12", - "@smithy/types": "^2.4.0", - "bowser": "^2.11.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-defaults-mode-node": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.21.tgz", - "integrity": "sha512-cUEsttVZ79B7Al2rWK2FW03HBpD9LyuqFtm+1qFty5u9sHSdesr215gS2Ln53fTopNiPgeXpdoM3IgjvIO0rJw==", - "dev": true, - "requires": { - "@smithy/config-resolver": "^2.0.16", - "@smithy/credential-provider-imds": "^2.0.18", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/property-provider": "^2.0.13", - "@smithy/smithy-client": "^2.1.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-endpoints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.2.tgz", - "integrity": "sha512-QEdq+sP68IJHAMVB2ugKVVZEWeKQtZLuf+akHzc8eTVElsZ2ZdVLWC6Cp+uKjJ/t4yOj1qu6ZzyxJQEQ8jdEjg==", - "dev": true, - "requires": { - "@smithy/node-config-provider": "^2.1.3", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-hex-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", - "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-middleware": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.5.tgz", - "integrity": "sha512-1lyT3TcaMJQe+OFfVI+TlomDkPuVzb27NZYdYtmSTltVmLaUjdCyt4KE+OH1CnhZKsz4/cdCL420Lg9UH5Z2Mw==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-retry": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.5.tgz", - "integrity": "sha512-x3t1+MQAJ6QONk3GTbJNcugCFDVJ+Bkro5YqQQK1EyVesajNDqxFtCx9WdOFNGm/Cbm7tUdwVEmfKQOJoU2Vtw==", - "dev": true, - "requires": { - "@smithy/service-error-classification": "^2.0.5", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-stream": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.17.tgz", - "integrity": "sha512-fP/ZQ27rRvHsqItds8yB7jerwMpZFTL3QqbQbidUiG0+mttMoKdP0ZqnvM8UK5q0/dfc3/pN7g4XKPXOU7oRWw==", - "dev": true, - "requires": { - "@smithy/fetch-http-handler": "^2.2.4", - "@smithy/node-http-handler": "^2.1.8", - "@smithy/types": "^2.4.0", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-uri-escape": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", - "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-utf8": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", - "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", - "dev": true, - "requires": { - "@smithy/util-buffer-from": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-waiter": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.12.tgz", - "integrity": "sha512-3sENmyVa1NnOPoiT2NCApPmu7ukP7S/v7kL9IxNmnygkDldn7/yK0TP42oPJLwB2k3mospNsSePIlqdXEUyPHA==", - "dev": true, - "requires": { - "@smithy/abort-controller": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@types/babel__core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", - "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.5", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", - "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", - "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", - "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.5.5", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.5.tgz", - "integrity": "sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/tough-cookie": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", - "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", - "dev": true - }, - "@types/uuid": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.4.tgz", - "integrity": "sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA==", - "dev": true - }, - "@types/yargs": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", - "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-parser": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/ansi-parser/-/ansi-parser-3.2.10.tgz", - "integrity": "sha512-CGKGIbd678lm15IXJXI1cTyOVAnMQw0jES+klW/yIc+GzYccsYanLMhczPIIj2hE64B79g75QfiuWrEWd6nJdg==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "axios": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", - "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", - "dev": true, - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "axios-cookiejar-support": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/axios-cookiejar-support/-/axios-cookiejar-support-4.0.7.tgz", - "integrity": "sha512-9vpE3y/a2l2Vs2XEJE4L2z0GWnlpJ4Xj+kDaoCtrpPfS1J3oikXBrxRJX6H62/ZcelOGe+519yW7mqXCIoPXuw==", - "dev": true, - "requires": { - "http-cookie-agent": "^5.0.4" - } - }, - "babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "requires": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-module-resolver": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.0.tgz", - "integrity": "sha512-g0u+/ChLSJ5+PzYwLwP8Rp8Rcfowz58TJNCe+L/ui4rpzE/mg//JVX0EWBUYoxaextqnwuGHzfGp2hh0PPV25Q==", - "dev": true, - "requires": { - "find-babel-config": "^2.0.0", - "glob": "^8.0.3", - "pkg-up": "^3.1.0", - "reselect": "^4.1.7", - "resolve": "^1.22.1" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", - "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", - "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.31.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", - "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.2" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bootstrap": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", - "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", - "dev": true, - "requires": {} - }, - "bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.21.11", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", - "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001538", - "electron-to-chromium": "^1.4.526", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "bunyamin": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/bunyamin/-/bunyamin-1.5.2.tgz", - "integrity": "sha512-Xp2nfqk33zt3nX90OSTkLVOc5N+1zdR3MWvfLHoIrm3cGRkdxPTPYB9CCgrDV8oum5rbghJjAbmXFXOrRXvMtg==", - "dev": true, - "requires": { - "@flatten-js/interval-tree": "^1.1.2", - "multi-sort-stream": "^1.0.4", - "stream-json": "^1.7.5", - "trace-event-lib": "^1.3.1" - } - }, - "bunyan": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", - "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", - "dev": true, - "requires": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "bunyan-debug-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bunyan-debug-stream/-/bunyan-debug-stream-3.1.0.tgz", - "integrity": "sha512-VaFYbDVdiSn3ZpdozrjZ8mFpxHXl26t11C1DKRQtbo0EgffqeFNrRLOGIESKVeGEvVu4qMxMSSxzNlSw7oTj7w==", - "dev": true, - "requires": { - "chalk": "^4.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/byte-length/-/byte-length-1.0.2.tgz", - "integrity": "sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==", - "dev": true - }, - "caf": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/caf/-/caf-15.0.1.tgz", - "integrity": "sha512-Xp/IK6vMwujxWZXra7djdYzPdPnEQKa7Mudu2wZgDQ3TJry1I0TgtjEgwZHpoBcMp68j4fb0/FZ1SJyMEgJrXQ==", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001538", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", - "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chart.js": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.2.1.tgz", - "integrity": "sha512-6YbpQ0nt3NovAgOzbkSSeeAQu/3za1319dPUQTXn9WcOpywM8rGKxJHrhS8V8xEkAlk8YhEfjbuAPfUyp6jIsw==", - "dev": true, - "requires": { - "@kurkle/color": "^0.3.0" - } - }, - "child-process-promise": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/child-process-promise/-/child-process-promise-2.2.1.tgz", - "integrity": "sha512-Fi4aNdqBsr0mv+jgWxcZ/7rAIC2mgihrptyVI4foh/rrjY/3BNjfP9+oaiFx/fzim+1ZyCNBae0DlyfQhSugog==", - "dev": true, - "requires": { - "cross-spawn": "^4.0.2", - "node-version": "^1.0.0", - "promise-polyfill": "^6.0.1" - } - }, - "ci-info": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", - "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "client-oauth2": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/client-oauth2/-/client-oauth2-4.3.3.tgz", - "integrity": "sha512-k8AvUYJon0vv75ufoVo4nALYb/qwFFicO3I0+39C6xEdflqVtr+f9cy+0ZxAduoVSTfhP5DX2tY2XICAd5hy6Q==", - "dev": true, - "requires": { - "popsicle": "^12.0.5", - "safe-buffer": "^5.2.0" - } - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "core-js-compat": { - "version": "3.32.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.2.tgz", - "integrity": "sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==", - "dev": true, - "requires": { - "browserslist": "^4.21.10" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - } - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "requires": {} - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "detox": { - "version": "20.17.1", - "resolved": "https://registry.npmjs.org/detox/-/detox-20.17.1.tgz", - "integrity": "sha512-10pey6CR9D5GSloRkH60ObBGZ8VS11H7iuBNY7qq6jO2swiqqckHhPLRXfH9+WGR7l3vDnfU+G/gQs7JxQkJwA==", - "dev": true, - "requires": { - "ajv": "^8.6.3", - "bunyan": "^1.8.12", - "bunyan-debug-stream": "^3.1.0", - "caf": "^15.0.1", - "chalk": "^4.0.0", - "child-process-promise": "^2.2.0", - "execa": "^5.1.1", - "find-up": "^5.0.0", - "fs-extra": "^11.0.0", - "funpermaproxy": "^1.1.0", - "glob": "^8.0.3", - "ini": "^1.3.4", - "jest-environment-emit": "^1.0.5", - "json-cycle": "^1.3.0", - "lodash": "^4.17.11", - "multi-sort-stream": "^1.0.3", - "multipipe": "^4.0.0", - "node-ipc": "9.2.1", - "proper-lockfile": "^3.0.2", - "resolve-from": "^5.0.0", - "sanitize-filename": "^1.6.1", - "semver": "^7.0.0", - "serialize-error": "^8.0.1", - "shell-quote": "^1.7.2", - "signal-exit": "^3.0.3", - "stream-json": "^1.7.4", - "strip-ansi": "^6.0.1", - "telnet-client": "1.2.8", - "tempfile": "^2.0.0", - "trace-event-lib": "^1.3.1", - "which": "^1.3.1", - "ws": "^7.0.0", - "yargs": "^17.0.0", - "yargs-parser": "^21.0.0", - "yargs-unparser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true - }, - "diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true - }, - "diff2html": { - "version": "3.4.43", - "resolved": "https://registry.npmjs.org/diff2html/-/diff2html-3.4.43.tgz", - "integrity": "sha512-cBiJKvyhY3bv+q9VHA7YyNdPk1PA+P9lArpp0MJlcpn1x4eiXYtK3ILNpcHXfgPTCdjjCilGvX9qBelGWtyMCg==", - "dev": true, - "requires": { - "diff": "5.1.0", - "highlight.js": "11.8.0", - "hogan.js": "3.0.2" - } - }, - "dtrace-provider": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", - "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.14.0" - } - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "easy-stack": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", - "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.527", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.527.tgz", - "integrity": "sha512-EafxEiEDzk2aLrdbtVczylHflHdHkNrpGNHIgDyA63sUQLQVS2ayj2hPw3RsVB42qkwURH+T2OxV7kGPUuYszA==", - "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "event-pubsub": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", - "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "exeunt": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/exeunt/-/exeunt-1.1.0.tgz", - "integrity": "sha512-dd++Yn/0Fp+gtJ04YHov7MeAii+LFivJc6KqnJNfplzLVUkUDrfKoQDTLlCgzcW15vY5hKlHasWeIsQJ8agHsw==", - "dev": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-xml-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", - "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", - "dev": true, - "requires": { - "strnum": "^1.0.5" - } - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-babel-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.0.0.tgz", - "integrity": "sha512-dOKT7jvF3hGzlW60Gc3ONox/0rRZ/tz7WCil0bqA1In/3I8f1BctpXahRnEKDySZqci7u+dqq93sZST9fOJpFw==", - "dev": true, - "requires": { - "json5": "^2.1.1", - "path-exists": "^4.0.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "funpermaproxy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/funpermaproxy/-/funpermaproxy-1.1.0.tgz", - "integrity": "sha512-2Sp1hWuO8m5fqeFDusyhKqYPT+7rGLw34N3qonDcdRP8+n7M7Gl/yKp/q7oCxnnJ6pWCectOmLFJpsMU/++KrQ==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "highlight.js": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz", - "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==", - "dev": true, - "optional": true - }, - "hogan.js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", - "integrity": "sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==", - "dev": true, - "requires": { - "mkdirp": "0.3.0", - "nopt": "1.0.10" - }, - "dependencies": { - "mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==", - "dev": true - } - } - }, - "holderjs": { - "version": "2.9.9", - "resolved": "https://registry.npmjs.org/holderjs/-/holderjs-2.9.9.tgz", - "integrity": "sha512-ceWPz1MrR3dxOoZXiom+G48+l1VPG3TcjBw9fq5iwCiZAMvYX8Aia13GOxT7DoV/AcSyTH7Vvr11ygjZP9qn4w==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-cookie-agent": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/http-cookie-agent/-/http-cookie-agent-5.0.4.tgz", - "integrity": "sha512-OtvikW69RvfyP6Lsequ0fN5R49S+8QcS9zwd58k6VSr6r57T8G29BkPdyrBcSwLq6ExLs9V+rBlfxu7gDstJag==", - "dev": true, - "requires": { - "agent-base": "^7.1.0" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - } - }, - "jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-emit": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/jest-environment-emit/-/jest-environment-emit-1.0.5.tgz", - "integrity": "sha512-OsQ08AhYxkkyDBTIow+9ogNmJheQIGWQKp0Nku+1ToLWjAj2Pd6LmypN8HgUIqYHs4HFcqkQ25kaf1qExmoZpg==", - "dev": true, - "requires": { - "bunyamin": "^1.5.0", - "bunyan": "^2.0.5", - "bunyan-debug-stream": "^3.1.0", - "funpermaproxy": "^1.1.0", - "lodash.merge": "^4.6.2", - "node-ipc": "9.2.1", - "strip-ansi": "^6.0.0", - "tslib": "^2.5.3" - }, - "dependencies": { - "bunyan": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-2.0.5.tgz", - "integrity": "sha512-Jvl74TdxCN6rSP9W1I6+UOUtwslTDqsSFkDqZlFb/ilaSvQ+bZAnXT/GT97IZ5L+Vph0joPZPhxUyn6FLNmFAA==", - "dev": true, - "requires": { - "dtrace-provider": "~0.8", - "exeunt": "1.1.0", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - } - } - }, - "jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true - }, - "jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-html-reporters": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/jest-html-reporters/-/jest-html-reporters-3.1.4.tgz", - "integrity": "sha512-7lLrKDKDNBNDprd5lP241HRx2mRXb/XQOuYFxX/MxydgHtYRE/lEtK2+J5XLiNTs9JL/rUjWsWhIBOBs9j3wcg==", - "dev": true, - "requires": { - "fs-extra": "^10.0.0", - "open": "^8.0.3" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, - "jest-junit": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz", - "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "strip-ansi": "^6.0.1", - "uuid": "^8.3.2", - "xml": "^1.0.1" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - } - } - }, - "jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true - }, - "jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "requires": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - } - }, - "jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "jest-stare": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jest-stare/-/jest-stare-2.5.1.tgz", - "integrity": "sha512-++3JWdY2zJNPFCN6ao1oeW0Qg8oKVYT9XaMUr8RaNDHDGKOQMNjmMrVz9E/4E43ZDU2mPTtk9U8pS+KjSuxPKg==", - "dev": true, - "requires": { - "@jest/reporters": "^29.0.0", - "@jest/test-result": "^29.0.0", - "@jest/types": "^29.0.0", - "@types/jest": "^29.0.0", - "ansi-parser": "^3.2.10", - "bootstrap": "^5.0.0", - "chalk": "^4.1.0", - "chart.js": "^4.1.2", - "diff2html": "^3.4.40", - "holderjs": "^2.9.7", - "jquery": "^3.5.1", - "moment": "^2.27.0", - "mustache": "^4.0.0", - "pkg-up": "^3.0.0", - "popper.js": "^1.16.1", - "yargs": "^17.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jquery": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz", - "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==", - "dev": true - }, - "js-message": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", - "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", - "dev": true - }, - "js-queue": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.2.tgz", - "integrity": "sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==", - "dev": true, - "requires": { - "easy-stack": "^1.0.1" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-cycle": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/json-cycle/-/json-cycle-1.3.0.tgz", - "integrity": "sha512-FD/SedD78LCdSvJaOUQAXseT8oQBb5z6IVYaQaCrVUlu9zOAr1BDdKyVYQaSD/GDsAMrXpKcOyBD4LIl8nfjHw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "junit-report-merger": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/junit-report-merger/-/junit-report-merger-6.0.2.tgz", - "integrity": "sha512-Jk9PXeaJhbgo3aUNza2r24JgxYzLUtCk2kwrub8fbmDuWUdXhT/nfbM2MlU3JQiFbjVud1bzBWdzr9/GGBWfmA==", - "dev": true, - "requires": { - "commander": "~10.0.0", - "fast-glob": "~3.2.11", - "xmlbuilder2": "3.1.1" - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "make-error-cause": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-2.3.0.tgz", - "integrity": "sha512-etgt+n4LlOkGSJbBTV9VROHA5R7ekIPS4vfh+bCAoJgRrJWdqJCBbpS3osRJ/HrT7R68MzMiY3L3sDJ/Fd8aBg==", - "dev": true, - "requires": { - "make-error": "^1.3.5" - } - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, - "optional": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "dev": true - }, - "moment-timezone": { - "version": "0.5.43", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", - "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", - "dev": true, - "requires": { - "moment": "^2.29.4" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "multi-sort-stream": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multi-sort-stream/-/multi-sort-stream-1.0.4.tgz", - "integrity": "sha512-hAZ8JOEQFbgdLe8HWZbb7gdZg0/yAIHF00Qfo3kd0rXFv96nXe+/bPTrKHZ2QMHugGX4FiAyET1Lt+jiB+7Qlg==", - "dev": true - }, - "multipipe": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-4.0.0.tgz", - "integrity": "sha512-jzcEAzFXoWwWwUbvHCNPwBlTz3WCWe/jPcXSmTfbo/VjRwRTfvLZ/bdvtiTdqCe8d4otCSsPCbhGYcX+eggpKQ==", - "dev": true, - "requires": { - "duplexer2": "^0.1.2", - "object-assign": "^4.1.0" - } - }, - "mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "dev": true - }, - "mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", - "dev": true, - "optional": true, - "requires": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.6" - } - } - } - }, - "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "dev": true, - "optional": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", - "dev": true, - "optional": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-ipc": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.2.1.tgz", - "integrity": "sha512-mJzaM6O3xHf9VT8BULvJSbdVbmHUKRNOH7zDDkCrA1/T+CVjq2WVIDfLt0azZRXpgArJtl3rtmEozrbXPZ9GaQ==", - "dev": true, - "requires": { - "event-pubsub": "4.3.0", - "js-message": "1.0.7", - "js-queue": "2.0.2" - } - }, - "node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node-version": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.2.0.tgz", - "integrity": "sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==", - "dev": true - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - } - } - }, - "popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "dev": true - }, - "popsicle": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/popsicle/-/popsicle-12.1.0.tgz", - "integrity": "sha512-muNC/cIrWhfR6HqqhHazkxjob3eyECBe8uZYSQ/N5vixNAgssacVleerXnE8Are5fspR0a+d2qWaBR1g7RYlmw==", - "dev": true, - "requires": { - "popsicle-content-encoding": "^1.0.0", - "popsicle-cookie-jar": "^1.0.0", - "popsicle-redirects": "^1.1.0", - "popsicle-transport-http": "^1.0.8", - "popsicle-transport-xhr": "^2.0.0", - "popsicle-user-agent": "^1.0.0", - "servie": "^4.3.3", - "throwback": "^4.1.0" - } - }, - "popsicle-content-encoding": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/popsicle-content-encoding/-/popsicle-content-encoding-1.0.0.tgz", - "integrity": "sha512-4Df+vTfM8wCCJVTzPujiI6eOl3SiWQkcZg0AMrOkD1enMXsF3glIkFUZGvour1Sj7jOWCsNSEhBxpbbhclHhzw==", - "dev": true, - "requires": {} - }, - "popsicle-cookie-jar": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/popsicle-cookie-jar/-/popsicle-cookie-jar-1.0.0.tgz", - "integrity": "sha512-vrlOGvNVELko0+J8NpGC5lHWDGrk8LQJq9nwAMIVEVBfN1Lib3BLxAaLRGDTuUnvl45j5N9dT2H85PULz6IjjQ==", - "dev": true, - "requires": { - "@types/tough-cookie": "^2.3.5", - "tough-cookie": "^3.0.1" - }, - "dependencies": { - "@types/tough-cookie": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.8.tgz", - "integrity": "sha512-7axfYN8SW9pWg78NgenHasSproWQee5rzyPVLC9HpaQSDgNArsnKJD88EaMfi4Pl48AyciO3agYCFqpHS1gLpg==", - "dev": true - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "popsicle-redirects": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/popsicle-redirects/-/popsicle-redirects-1.1.1.tgz", - "integrity": "sha512-mC2HrKjdTAWDalOjGxlXw9j6Qxrz/Yd2ui6bPxpi2IQDYWpF4gUAMxbA8EpSWJhLi0PuWKDwTHHPrUPGutAoIA==", - "dev": true, - "requires": {} - }, - "popsicle-transport-http": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/popsicle-transport-http/-/popsicle-transport-http-1.2.1.tgz", - "integrity": "sha512-i5r3IGHkGiBDm1oPFvOfEeSGWR0lQJcsdTqwvvDjXqcTHYJJi4iSi3ecXIttDiTBoBtRAFAE9nF91fspQr63FQ==", - "dev": true, - "requires": { - "make-error-cause": "^2.2.0" - } - }, - "popsicle-transport-xhr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/popsicle-transport-xhr/-/popsicle-transport-xhr-2.0.0.tgz", - "integrity": "sha512-5Sbud4Widngf1dodJE5cjEYXkzEUIl8CzyYRYR57t6vpy9a9KPGQX6KBKdPjmBZlR5A06pOBXuJnVr23l27rtA==", - "dev": true, - "requires": {} - }, - "popsicle-user-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/popsicle-user-agent/-/popsicle-user-agent-1.0.0.tgz", - "integrity": "sha512-epKaq3TTfTzXcxBxjpoKYMcTTcAX8Rykus6QZu77XNhJuRHSRxMd+JJrbX/3PFI0opFGSN0BabbAYCbGxbu0mA==", - "dev": true, - "requires": {} - }, - "pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "promise-polyfill": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz", - "integrity": "sha512-g0LWaH0gFsxovsU7R5LrrhHhWAWiHRnh1GPrhXnPgYsDkIqjRYUYSZEsej/wtleDrz5xVSIDbeKfidztp2XHFQ==", - "dev": true - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "proper-lockfile": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-3.2.0.tgz", - "integrity": "sha512-iMghHHXv2bsxl6NchhEaFck8tvX3F9cknEEh1SUpguUOBjN7PAAW9BLzmbc1g/mCD1gY3EE2EABBHPJfFdHFmA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "pure-rand": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.3.tgz", - "integrity": "sha512-KddyFewCsO0j3+np81IQ+SweXLDnDQTs5s67BOnrYmYe/yNmUhttQyGsYzy8yUnoljGAQ9sl38YB4vH8ur7Y+w==", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dev": true, - "requires": { - "minimatch": "^3.0.5" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "requires": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "reselect": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz", - "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", - "dev": true, - "optional": true, - "requires": { - "glob": "^6.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", - "dev": true, - "optional": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "dev": true, - "optional": true - }, - "sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "requires": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "serialize-error": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", - "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - }, - "dependencies": { - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "servie": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/servie/-/servie-4.3.3.tgz", - "integrity": "sha512-b0IrY3b1gVMsWvJppCf19g1p3JSnS0hQi6xu4Hi40CIhf0Lx8pQHcvBL+xunShpmOiQzg1NOia812NAWdSaShw==", - "dev": true, - "requires": { - "@servie/events": "^1.0.0", - "byte-length": "^1.0.2", - "ts-expect": "^1.1.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", - "dev": true - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "requires": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "stream-chain": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", - "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", - "dev": true - }, - "stream-json": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.7.5.tgz", - "integrity": "sha512-NSkoVduGakxZ8a+pTPUlcGEeAGQpWL9rKJhOFCV+J/QtdQUEU5vtBgVg6eJXn8JB8RZvpbJWZGvXkhz70MLWoA==", - "dev": true, - "requires": { - "stream-chain": "^2.2.5" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "telnet-client": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/telnet-client/-/telnet-client-1.2.8.tgz", - "integrity": "sha512-W+w4k3QAmULVNhBVT2Fei369kGZCh/TH25M7caJAXW+hLxwoQRuw0di3cX4l0S9fgH3Mvq7u+IFMoBDpEw/eIg==", - "dev": true, - "requires": { - "bluebird": "^3.5.4" - } - }, - "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", - "dev": true - }, - "tempfile": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", - "integrity": "sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==", - "dev": true, - "requires": { - "temp-dir": "^1.0.0", - "uuid": "^3.0.1" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "throwback": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throwback/-/throwback-4.1.0.tgz", - "integrity": "sha512-dLFe8bU8SeH0xeqeKL7BNo8XoPC/o91nz9/ooeplZPiso+DZukhoyZcSz9TFnUNScm+cA9qjU1m1853M6sPOng==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "dependencies": { - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true - } - } - }, - "trace-event-lib": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/trace-event-lib/-/trace-event-lib-1.3.1.tgz", - "integrity": "sha512-RO/TD5E9RNqU6MhOfi/njFWKYhrzOJCpRXlEQHgXwM+6boLSrQnOZ9xbHwOXzC+Luyixc7LNNSiTsqTVeF7I1g==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0", - "lodash": "^4.17.21" - } - }, - "truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dev": true, - "requires": { - "utf8-byte-length": "^1.0.1" - } - }, - "ts-expect": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-expect/-/ts-expect-1.3.0.tgz", - "integrity": "sha512-e4g0EJtAjk64xgnFPD6kTBUtpnMVzDrMb12N1YZV0VvSlhnVT3SGxiYTLdGy8Q5cYHOIC/FAHmZ10eGrAguicQ==", - "dev": true - }, - "ts-jest": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", - "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true - }, - "v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} - }, - "xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "dev": true - }, - "xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, - "xmlbuilder2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.1.1.tgz", - "integrity": "sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==", - "dev": true, - "requires": { - "@oozcitak/dom": "1.15.10", - "@oozcitak/infra": "1.0.8", - "@oozcitak/util": "8.3.8", - "js-yaml": "3.14.1" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } From 038ce897ca445f127b6c8ec3e98c928fcee40877 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 28 Feb 2024 21:30:00 +0530 Subject: [PATCH 073/362] remove rm python --- .github/actions/prepare-ios-build/action.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index 6f30a8c4aaa..2f34a90a9a3 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -10,7 +10,6 @@ runs: shell: bash run: | echo "::group::install-os-deps" - rm '/usr/local/bin/2to3' brew install watchman echo "::endgroup::" From 31c86c411df202ec72e39232839f261fca2d5cfd Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 28 Feb 2024 21:57:57 +0530 Subject: [PATCH 074/362] install python 3.11 --- .github/workflows/e2e-detox.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 6a0c439cad4..1d7da6b3e9c 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -16,6 +16,10 @@ jobs: - name: ci/checkout-repo uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + - name: ci/prepare-ios-build uses: ./.github/actions/prepare-ios-build From 501925d007e19776016f5f1f922baf64dbf60b26 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 6 Mar 2024 15:32:35 +0530 Subject: [PATCH 075/362] pin watchman version --- .github/actions/prepare-ios-build/action.yaml | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index 2f34a90a9a3..13881b0f4c5 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -10,7 +10,33 @@ runs: shell: bash run: | echo "::group::install-os-deps" - brew install watchman + VERSION="v2024.01.22.00" + + # Download the source code + curl -LO https://github.com/facebook/watchman/archive/${VERSION}.tar.gz + + # Extract the archive + tar -xf ${VERSION}.tar.gz + + # Move to the extracted directory + cd watchman-${VERSION} + + # Install dependencies using Homebrew (assuming you have Homebrew installed) + brew install openssl boost + + # Configure and build Watchman + ./autogen.sh + ./configure + make + + # Install Watchman (requires root privileges) + make install + + # Remove the downloaded archive and extracted directory (optional) + rm -rf ../${VERSION}.tar.gz watchman-${VERSION} + + echo "Watchman version ${VERSION} has been installed." + echo "::endgroup::" - name: ci/prepare-mobile-build From 99bf3cffd7f761071cdc15192f9f2a965e3a4b45 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 6 Mar 2024 15:33:39 +0530 Subject: [PATCH 076/362] remove python setup --- .github/actions/prepare-ios-build/action.yaml | 4 ++-- .github/workflows/e2e-detox.yml | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index 13881b0f4c5..b66faab136f 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -19,7 +19,7 @@ runs: tar -xf ${VERSION}.tar.gz # Move to the extracted directory - cd watchman-${VERSION} + cd watchman-${VERSION:1} # Install dependencies using Homebrew (assuming you have Homebrew installed) brew install openssl boost @@ -33,7 +33,7 @@ runs: make install # Remove the downloaded archive and extracted directory (optional) - rm -rf ../${VERSION}.tar.gz watchman-${VERSION} + rm -rf ../${VERSION}.tar.gz watchman-${VERSION:1} echo "Watchman version ${VERSION} has been installed." diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 1d7da6b3e9c..6a0c439cad4 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -16,10 +16,6 @@ jobs: - name: ci/checkout-repo uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 - - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: ci/prepare-ios-build uses: ./.github/actions/prepare-ios-build From a0342a40e40a9edd895cd4b11ef42823649ea15f Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 6 Mar 2024 16:06:31 +0530 Subject: [PATCH 077/362] install watchman --- .github/actions/prepare-ios-build/action.yaml | 28 +------------------ 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index b66faab136f..2f34a90a9a3 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -10,33 +10,7 @@ runs: shell: bash run: | echo "::group::install-os-deps" - VERSION="v2024.01.22.00" - - # Download the source code - curl -LO https://github.com/facebook/watchman/archive/${VERSION}.tar.gz - - # Extract the archive - tar -xf ${VERSION}.tar.gz - - # Move to the extracted directory - cd watchman-${VERSION:1} - - # Install dependencies using Homebrew (assuming you have Homebrew installed) - brew install openssl boost - - # Configure and build Watchman - ./autogen.sh - ./configure - make - - # Install Watchman (requires root privileges) - make install - - # Remove the downloaded archive and extracted directory (optional) - rm -rf ../${VERSION}.tar.gz watchman-${VERSION:1} - - echo "Watchman version ${VERSION} has been installed." - + brew install watchman echo "::endgroup::" - name: ci/prepare-mobile-build From d704eeb37a564deb49e651437e4a5f5fcee9a93d Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 6 Mar 2024 16:11:24 +0530 Subject: [PATCH 078/362] install watchman version 2024.01.22.00 --- .github/actions/prepare-ios-build/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index 2f34a90a9a3..e1ab592cf4a 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -6,11 +6,11 @@ runs: steps: - name: ci/install-os-deps env: - HOMEBREW_NO_AUTO_UPDATE: "1" + HOMEBREW_NO_AUTO_UPDATE: 1 shell: bash run: | echo "::group::install-os-deps" - brew install watchman + brew install watchman --revision=2024.01.22.00@7fa892d echo "::endgroup::" - name: ci/prepare-mobile-build From 789973e6e2e6e0832507d5595528926512ba00f8 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 6 Mar 2024 16:19:51 +0530 Subject: [PATCH 079/362] install watchman version 2024.01.22.00_1 --- .github/actions/prepare-ios-build/action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index e1ab592cf4a..9dbf85a02b0 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -10,7 +10,7 @@ runs: shell: bash run: | echo "::group::install-os-deps" - brew install watchman --revision=2024.01.22.00@7fa892d + brew install --HEAD facebook/fb/watchman@2024.01.22.00_1 echo "::endgroup::" - name: ci/prepare-mobile-build From 04d7a0dc38801042678fbdcfefe5141086ccc898 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 6 Mar 2024 16:26:24 +0530 Subject: [PATCH 080/362] install watchman using curl --- .github/actions/prepare-ios-build/action.yaml | 6 +++--- .github/workflows/e2e-detox.yml | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index 9dbf85a02b0..77b1919a7b7 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -5,12 +5,12 @@ runs: using: composite steps: - name: ci/install-os-deps - env: - HOMEBREW_NO_AUTO_UPDATE: 1 shell: bash run: | echo "::group::install-os-deps" - brew install --HEAD facebook/fb/watchman@2024.01.22.00_1 + curl -Lo /usr/local/bin/watchman https://github.com/facebook/watchman/releases/download/2024.01.22.00_1/watchman-macos-2024.01.22.00_1.zip + unzip -o /usr/local/bin/watchman + chmod +x /usr/local/bin/watchman echo "::endgroup::" - name: ci/prepare-mobile-build diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 6a0c439cad4..7365af427cf 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -20,6 +20,8 @@ jobs: uses: ./.github/actions/prepare-ios-build - name: Brew install + env: + HOMEBREW_NO_AUTO_UPDATE: 1 run: | brew tap wix/brew brew install applesimutils From c5f464649e4b4c2070dbbddce29bc365cfe19a9b Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 6 Mar 2024 16:27:47 +0530 Subject: [PATCH 081/362] install watchman using curl --- .github/actions/prepare-ios-build/action.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index 77b1919a7b7..f1da6c0a363 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -8,9 +8,10 @@ runs: shell: bash run: | echo "::group::install-os-deps" - curl -Lo /usr/local/bin/watchman https://github.com/facebook/watchman/releases/download/2024.01.22.00_1/watchman-macos-2024.01.22.00_1.zip - unzip -o /usr/local/bin/watchman - chmod +x /usr/local/bin/watchman + curl -Lo watchman.zip https://github.com/facebook/watchman/releases/download/2024.01.22.00_1/watchman-macos-2024.01.22.00_1.zip + unzip -o watchman.zip + chmod +x watchman + mv watchman /usr/local/bin/ echo "::endgroup::" - name: ci/prepare-mobile-build From c00b2a0694434fe69ec455d9aacc24ba6c722ba1 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 6 Mar 2024 16:43:45 +0530 Subject: [PATCH 082/362] install watchman using curl --- .github/actions/prepare-ios-build/action.yaml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index f1da6c0a363..01c2715fb9f 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -8,10 +8,13 @@ runs: shell: bash run: | echo "::group::install-os-deps" - curl -Lo watchman.zip https://github.com/facebook/watchman/releases/download/2024.01.22.00_1/watchman-macos-2024.01.22.00_1.zip - unzip -o watchman.zip - chmod +x watchman - mv watchman /usr/local/bin/ + wget https://github.com/facebook/watchman/archive/v2024.01.22.00.tar.gz + tar xvf v2024.01.22.00.tar.gz + cd watchman-2024.01.22.00 + ./autogen.sh + ./configure + make + sudo make install echo "::endgroup::" - name: ci/prepare-mobile-build From 3421b7a071da401da7d3e1e92acc96467eddf383 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 6 Mar 2024 16:58:15 +0530 Subject: [PATCH 083/362] no auto update for watchman --- .github/actions/prepare-ios-build/action.yaml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index 01c2715fb9f..eabcefa3778 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -8,13 +8,7 @@ runs: shell: bash run: | echo "::group::install-os-deps" - wget https://github.com/facebook/watchman/archive/v2024.01.22.00.tar.gz - tar xvf v2024.01.22.00.tar.gz - cd watchman-2024.01.22.00 - ./autogen.sh - ./configure - make - sudo make install + HOMEBREW_NO_AUTO_UPDATE=1 brew install watchman echo "::endgroup::" - name: ci/prepare-mobile-build From 3fcf15fac15a443267af8e5b2e6e5e9c3fb0d718 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 6 Mar 2024 17:10:10 +0530 Subject: [PATCH 084/362] install from fb --- .github/actions/prepare-ios-build/action.yaml | 2 +- .github/workflows/e2e-detox.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index eabcefa3778..0f45cbb8539 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -8,7 +8,7 @@ runs: shell: bash run: | echo "::group::install-os-deps" - HOMEBREW_NO_AUTO_UPDATE=1 brew install watchman + brew install facebook/fb/watchman echo "::endgroup::" - name: ci/prepare-mobile-build diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 7365af427cf..967b3e311ab 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -16,9 +16,6 @@ jobs: - name: ci/checkout-repo uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 - - name: ci/prepare-ios-build - uses: ./.github/actions/prepare-ios-build - - name: Brew install env: HOMEBREW_NO_AUTO_UPDATE: 1 @@ -26,6 +23,9 @@ jobs: brew tap wix/brew brew install applesimutils + - name: ci/prepare-ios-build + uses: ./.github/actions/prepare-ios-build + - name: ci/build-ios-simulator env: TAG: "${{ github.ref_name }}" From 7e2b69d3b2087e38cc87588433daac560fe372f6 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 6 Mar 2024 17:37:54 +0530 Subject: [PATCH 085/362] install from fb --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 967b3e311ab..89ec9cca82e 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -37,7 +37,7 @@ jobs: working-directory: ./fastlane - name: ci/upload-ios-pr-simulator - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@v4 with: name: ios-build-simulator-${{ github.run_id }} path: Mattermost-simulator-x86_64.app.zip From 87ba3f738ad2034ebd71db78e61586eb56638a20 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 6 Mar 2024 23:46:56 +0530 Subject: [PATCH 086/362] upload report --- .github/workflows/e2e-detox.yml | 6 ++++++ detox/package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 89ec9cca82e..cedb4d27322 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -60,3 +60,9 @@ jobs: cd detox && npm install - name: Run detox e2e run: npm run e2e:ios + + - name: Upload iOS Report + uses: actions/upload-artifact@v3 + with: + name: ${{ github.run_id }}-IOS-report + path: detox/artifacts/ios-report.html diff --git a/detox/package.json b/detox/package.json index 0ac26ae7f46..f00a8de6706 100644 --- a/detox/package.json +++ b/detox/package.json @@ -47,7 +47,7 @@ "e2e:android-build-release": "detox build -c android.emu.release", "e2e:android-test-release": "detox test -c android.emu.release --record-logs failing --take-screenshots failing", "e2e:ios-build": "IOS=true detox build -c ios.sim.debug", - "e2e:ios-test": "IOS=true detox test -c ios.sim.debug", + "e2e:ios-test": "IOS=true detox test -c ios.sim.debug --maxWorkers 3", "e2e:ios-build-release": "detox build -c ios.sim.release", "e2e:ios-test-release": "IOS=true detox test -c ios.sim.release --record-logs failing --take-screenshots failing", "check": "npm run lint && npm run tsc", From 4b4a1e1302e98382503d786b87dc52c26684074f Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 7 Mar 2024 02:11:06 +0530 Subject: [PATCH 087/362] upload report --- detox/e2e/support/test_config.ts | 14 +++++++------- detox/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/detox/e2e/support/test_config.ts b/detox/e2e/support/test_config.ts index aa395186841..5b5cdf62294 100644 --- a/detox/e2e/support/test_config.ts +++ b/detox/e2e/support/test_config.ts @@ -1,15 +1,15 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -export const serverOneUrl = process.env.SITE_1_URL || (process.env.IOS === 'true' ? 'https://mobile-e2e-instance.test.mattermost.cloud' : 'http://10.0.2.2:8065'); -export const siteOneUrl = process.env.SITE_1_URL || 'https://mobile-e2e-instance.test.mattermost.cloud'; -export const serverTwoUrl = process.env.SITE_2_URL || 'https://mobile02.test.mattermost.cloud'; -export const siteTwoUrl = process.env.SITE_2_URL || 'https://mobile02.test.mattermost.cloud'; -export const serverThreeUrl = process.env.SITE_3_URL || 'https://mobile03.test.mattermost.cloud'; -export const siteThreeUrl = process.env.SITE_3_URL || 'https://mobile03.test.mattermost.cloud'; +export const serverOneUrl = process.env.SITE_1_URL || (process.env.IOS === 'true' ? 'https://mobile-e2e.test.mattermost.cloud' : 'http://10.0.2.2:8065'); +export const siteOneUrl = process.env.SITE_1_URL || 'https://mobile-e2e.test.mattermost.cloud'; +export const serverTwoUrl = process.env.SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud/'; +export const siteTwoUrl = process.env.SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud/'; +export const serverThreeUrl = process.env.SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud/'; +export const siteThreeUrl = process.env.SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud/'; export const smtpUrl = process.env.SMTP_URL || 'http://127.0.0.1:9001'; export const adminEmail = process.env.ADMIN_EMAIL || 'success+sysadmin@simulator.amazonses.com'; export const adminUsername = process.env.ADMIN_USERNAME || 'admin'; -export const adminPassword = process.env.ADMIN_PASSWORD || 'admin@xj9k74o1ttdy3e1kh43m9pu63h'; +export const adminPassword = process.env.ADMIN_PASSWORD || 'admin@suz4ziqx9jbnjx4bwmfitfknpa'; export const ldapServer = process.env.LDAP_SERVER || '127.0.0.1'; export const ldapPort = process.env.LDAP_PORT || 389; diff --git a/detox/package.json b/detox/package.json index f00a8de6706..0ac26ae7f46 100644 --- a/detox/package.json +++ b/detox/package.json @@ -47,7 +47,7 @@ "e2e:android-build-release": "detox build -c android.emu.release", "e2e:android-test-release": "detox test -c android.emu.release --record-logs failing --take-screenshots failing", "e2e:ios-build": "IOS=true detox build -c ios.sim.debug", - "e2e:ios-test": "IOS=true detox test -c ios.sim.debug --maxWorkers 3", + "e2e:ios-test": "IOS=true detox test -c ios.sim.debug", "e2e:ios-build-release": "detox build -c ios.sim.release", "e2e:ios-test-release": "IOS=true detox test -c ios.sim.release --record-logs failing --take-screenshots failing", "check": "npm run lint && npm run tsc", From 5f315c52978c05c0c3973ea8d76366f4563ed97b Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 7 Mar 2024 12:43:18 +0530 Subject: [PATCH 088/362] split tests --- .github/actions/generate-specs/action.yml | 32 +++++ .github/actions/generate-specs/split-tests.go | 114 ++++++++++++++++++ .github/workflows/e2e-detox.yml | 85 ++++++++----- detox/e2e/test/autocomplete/edit_post.e2e.ts | 2 +- detox/e2e/test/teams/invite_people.e2e.ts | 21 ++-- split.go | 114 ++++++++++++++++++ 6 files changed, 328 insertions(+), 40 deletions(-) create mode 100644 .github/actions/generate-specs/action.yml create mode 100644 .github/actions/generate-specs/split-tests.go create mode 100644 split.go diff --git a/.github/actions/generate-specs/action.yml b/.github/actions/generate-specs/action.yml new file mode 100644 index 00000000000..b9dd910bb31 --- /dev/null +++ b/.github/actions/generate-specs/action.yml @@ -0,0 +1,32 @@ +# Copyright 2024 Mattermost, Inc. +name: "generate-specs" +description: This action used to split Detox integration tests based on the parallelism provided + +inputs: + directory: + description: The directory of the test suite + required: true + search_path: + description: The path to look for from within the directory + required: true + parallelism: + description: The parallelism for the tests + required: true +outputs: + specs: + description: The specs generated for the strategy + value: ${{ steps.generate-specs.outputs.specs }} +runs: + using: "composite" + steps: + - name: ci/generate-specs + id: generate-specs + env: + PARALLELISM: ${{ inputs.parallelism }} + SEARCH_PATH: ${{ inputs.search_path }} + DIRECTORY: ${{ inputs.directory }} + run: | + set -e + go run ${{ github.action_path }}/split-tests.go > output.json + echo "specs=$(cat output.json)" >> $GITHUB_OUTPUT + shell: bash \ No newline at end of file diff --git a/.github/actions/generate-specs/split-tests.go b/.github/actions/generate-specs/split-tests.go new file mode 100644 index 00000000000..001f1719f11 --- /dev/null +++ b/.github/actions/generate-specs/split-tests.go @@ -0,0 +1,114 @@ +package main + +import ( + "encoding/json" + "fmt" + "io/fs" + "math" + "os" + "path/filepath" + "regexp" + "strconv" + "strings" +) + +type Specs struct { + searchPath string + directory string + parallelism int + rawFiles []string + groupedFiles []SpecGroup +} + +type SpecGroup struct { + RunID string `json:"runId"` + Specs string `json:"specs"` +} + +type Output struct { + Include []SpecGroup `json:"include"` +} + +func newSpecGroup(runId string, specs string) *SpecGroup { + return &SpecGroup{ + RunID: runId, + Specs: specs, + } +} + +func newSpecs(directory string, searchPath string, parallelism int) *Specs { + return &Specs{ + directory: directory, + searchPath: searchPath, + parallelism: parallelism, + } +} + +func (s *Specs) findFiles() { + fileSystem := os.DirFS(filepath.Join(s.directory, s.searchPath)) + err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + + // Find all files matching *.e2e.ts + r := regexp.MustCompile(`.*\.e2e\.ts$`) + if r.MatchString(path) { + s.rawFiles = append(s.rawFiles, filepath.Join(s.searchPath, path)) + } + + return nil + }) + if err != nil { + panic(err) + } +} + +func (s *Specs) generateSplits() { + // Split to chunks based on the parallelism provided + chunkSize := int(math.Ceil(float64(len(s.rawFiles)) / float64(s.parallelism))) + runNo := 1 + + for i := 0; i <= len(s.rawFiles); i += chunkSize { + end := i + chunkSize + if end > len(s.rawFiles) { + end = len(s.rawFiles) + } + + fileGroup := strings.Join(s.rawFiles[i:end], " ") + specFileGroup := newSpecGroup(strconv.Itoa(runNo), fileGroup) + s.groupedFiles = append(s.groupedFiles, *specFileGroup) + + // Break when we reach the end to avoid duplicate groups + if end == len(s.rawFiles) { + break + } + + runNo++ + } +} + +func (s *Specs) dumpSplits() { + // Dump json format for GitHub actions + o := &Output{ + Include: s.groupedFiles, + } + + b, err := json.Marshal(o) + if err != nil { + panic(err) + } + + fmt.Println(string(b)) +} + +func main() { + searchPath := os.Getenv("SEARCH_PATH") + directory := os.Getenv("DIRECTORY") + parallelism, _ := strconv.Atoi(os.Getenv("PARALLELISM")) + + specs := newSpecs(directory, searchPath, parallelism) + specs.findFiles() + specs.generateSplits() + specs.dumpSplits() +} diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index cedb4d27322..c113d142365 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -8,25 +8,38 @@ on: branches: - main +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: true + jobs: - e2e-ios: - runs-on: macos-14-large + + generate-specs: + runs-on: ubuntu-22.04 + outputs: + specs: ${{ steps.generate-specs.outputs.specs }} steps: + - name: Checkout Repository + uses: actions/checkout@v3 - - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + - name: Generate Test Specs + id: generate-specs + uses: ./.github/actions/generate-specs + with: + parallelism: 5 + directory: detox/e2e + search_path: test - - name: Brew install - env: - HOMEBREW_NO_AUTO_UPDATE: 1 - run: | - brew tap wix/brew - brew install applesimutils + build-ios-simulator: + runs-on: macos-14-large + steps: + - name: Checkout Repository + uses: actions/checkout@v3 - - name: ci/prepare-ios-build + - name: Prepare iOS Build uses: ./.github/actions/prepare-ios-build - - name: ci/build-ios-simulator + - name: Build iOS Simulator env: TAG: "${{ github.ref_name }}" AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" @@ -36,33 +49,51 @@ jobs: run: bundle exec fastlane ios simulator --env ios.simulator working-directory: ./fastlane - - name: ci/upload-ios-pr-simulator - uses: actions/upload-artifact@v4 + - name: Upload iOS Simulator Build + uses: actions/upload-artifact@v3 with: name: ios-build-simulator-${{ github.run_id }} path: Mattermost-simulator-x86_64.app.zip - - name: Download iOS build artifact - uses: actions/download-artifact@v4 + e2e-ios: + runs-on: macos-14-large + name: test-detox-e2e-${{ matrix.runId }} + needs: + - generate-specs + - build-ios-simulator + strategy: + fail-fast: false + matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} + steps: + - name: Checkout Repository + uses: actions/checkout@v3 + + - name: Install Homebrew Dependencies + run: | + brew tap wix/brew + brew install applesimutils + + - name: Download iOS Simulator Build + uses: actions/download-artifact@v3 with: name: ios-build-simulator-${{ github.run_id }} path: mobile-artifacts - - name: Unzip artifact + - name: Unzip iOS Simulator Build run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ - - name: Run react-native + - name: Start React Native Metro Server run: npm run start & - - name: Install detox dependancies - run: | - ls -l mobile-artifacts/ - cd detox && npm install - - name: Run detox e2e - run: npm run e2e:ios + - name: Install Detox Dependencies + run: cd detox && npm install + + - name: Run Detox E2E Tests + run: npm run e2e:ios-test -- "${{ matrix.specs }}" - - name: Upload iOS Report + - name: Upload iOS Test Report + if: always() uses: actions/upload-artifact@v3 with: - name: ${{ github.run_id }}-IOS-report - path: detox/artifacts/ios-report.html + name: ios-results-${{ matrix.runId }} + path: detox/artifacts/ios-report.html \ No newline at end of file diff --git a/detox/e2e/test/autocomplete/edit_post.e2e.ts b/detox/e2e/test/autocomplete/edit_post.e2e.ts index f9ec0ba3ee8..51a5af981da 100644 --- a/detox/e2e/test/autocomplete/edit_post.e2e.ts +++ b/detox/e2e/test/autocomplete/edit_post.e2e.ts @@ -89,7 +89,7 @@ describe('Autocomplete - Edit Post', () => { await expect(Autocomplete.flatEmojiSuggestionList).not.toBeVisible(); // # Type in ":" followed by 2 characters to activate emoji suggestion autocomplete - await EditPostScreen.messageInput.typeText(':sm'); + await EditPostScreen.messageInput.typeText(':smil'); // * Verify emoji suggestion list is displayed await expect(Autocomplete.flatEmojiSuggestionList).toBeVisible(); diff --git a/detox/e2e/test/teams/invite_people.e2e.ts b/detox/e2e/test/teams/invite_people.e2e.ts index c74dfef7cc0..2edaf751d54 100644 --- a/detox/e2e/test/teams/invite_people.e2e.ts +++ b/detox/e2e/test/teams/invite_people.e2e.ts @@ -202,9 +202,6 @@ describe('Teams - Invite', () => { it('MM-T5365 - should handle both sent and not sent invites', async () => { const {user: testUser2} = await User.apiCreateUser(siteOneUrl, {prefix: 'i'}); - const username1 = ` @${testUser1.username}`; - const username2 = ` @${testUser2.username}`; - // # Search for an existent user await Invite.searchBarInput.replaceText(testUser2.username); @@ -218,31 +215,31 @@ describe('Teams - Invite', () => { await expect(Invite.getSelectedItem(testUser2.id)).toBeVisible(); // # Search for a existent user already in team - await Invite.searchBarInput.replaceText(testUser1.username); + await Invite.searchBarInput.replaceText(testUser.username); // # Wait for user item in search list - await waitFor(Invite.getSearchListUserItem(testUser1.id)).toExist().withTimeout(timeouts.TWO_SEC); + await waitFor(Invite.getSearchListUserItem(testUser.id)).toExist().withTimeout(timeouts.TWO_SEC); // # Select user item - await Invite.getSearchListUserItem(testUser1.id).tap(); + await Invite.getSearchListUserItem(testUser.id).tap(); // * Validate user is added to selected items - await expect(Invite.getSelectedItem(testUser1.id)).toBeVisible(); + await expect(Invite.getSelectedItem(testUser.id)).toBeVisible(); // # Send invitation await Invite.sendButton.tap(); // * Validate summary - await waitFor(Invite.screenSummary).toBeVisible().withTimeout(timeouts.TEN_SEC); + waitFor(Invite.screenSummary).toBeVisible(); // * Validate summary report not sent await expect(Invite.getSummaryReportNotSent()).toBeVisible(); - await expect(Invite.getSummaryReportUserItem(testUser1.id)).toBeVisible(); - await expect(Invite.getSummaryReportUserItemText(testUser1.id)).toHaveText(username1); + await expect(Invite.getSummaryReportUserItem(testUser.id)).toBeVisible(); + await expect(Invite.getSummaryReportUserItemText(testUser.id)).toBeVisible(); // * Validate summary report sent - await waitFor(Invite.getSummaryReportSent()).toBeVisible().withTimeout(timeouts.TEN_SEC); + waitFor(Invite.getSummaryReportSent()).toBeVisible(); await expect(Invite.getSummaryReportUserItem(testUser2.id)).toBeVisible(); - await expect(Invite.getSummaryReportUserItemText(testUser2.id)).toHaveText(username2); + await expect(Invite.getSummaryReportUserItemText(testUser2.id)).toBeVisible(); }); }); diff --git a/split.go b/split.go new file mode 100644 index 00000000000..001f1719f11 --- /dev/null +++ b/split.go @@ -0,0 +1,114 @@ +package main + +import ( + "encoding/json" + "fmt" + "io/fs" + "math" + "os" + "path/filepath" + "regexp" + "strconv" + "strings" +) + +type Specs struct { + searchPath string + directory string + parallelism int + rawFiles []string + groupedFiles []SpecGroup +} + +type SpecGroup struct { + RunID string `json:"runId"` + Specs string `json:"specs"` +} + +type Output struct { + Include []SpecGroup `json:"include"` +} + +func newSpecGroup(runId string, specs string) *SpecGroup { + return &SpecGroup{ + RunID: runId, + Specs: specs, + } +} + +func newSpecs(directory string, searchPath string, parallelism int) *Specs { + return &Specs{ + directory: directory, + searchPath: searchPath, + parallelism: parallelism, + } +} + +func (s *Specs) findFiles() { + fileSystem := os.DirFS(filepath.Join(s.directory, s.searchPath)) + err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + + // Find all files matching *.e2e.ts + r := regexp.MustCompile(`.*\.e2e\.ts$`) + if r.MatchString(path) { + s.rawFiles = append(s.rawFiles, filepath.Join(s.searchPath, path)) + } + + return nil + }) + if err != nil { + panic(err) + } +} + +func (s *Specs) generateSplits() { + // Split to chunks based on the parallelism provided + chunkSize := int(math.Ceil(float64(len(s.rawFiles)) / float64(s.parallelism))) + runNo := 1 + + for i := 0; i <= len(s.rawFiles); i += chunkSize { + end := i + chunkSize + if end > len(s.rawFiles) { + end = len(s.rawFiles) + } + + fileGroup := strings.Join(s.rawFiles[i:end], " ") + specFileGroup := newSpecGroup(strconv.Itoa(runNo), fileGroup) + s.groupedFiles = append(s.groupedFiles, *specFileGroup) + + // Break when we reach the end to avoid duplicate groups + if end == len(s.rawFiles) { + break + } + + runNo++ + } +} + +func (s *Specs) dumpSplits() { + // Dump json format for GitHub actions + o := &Output{ + Include: s.groupedFiles, + } + + b, err := json.Marshal(o) + if err != nil { + panic(err) + } + + fmt.Println(string(b)) +} + +func main() { + searchPath := os.Getenv("SEARCH_PATH") + directory := os.Getenv("DIRECTORY") + parallelism, _ := strconv.Atoi(os.Getenv("PARALLELISM")) + + specs := newSpecs(directory, searchPath, parallelism) + specs.findFiles() + specs.generateSplits() + specs.dumpSplits() +} From 36470ee5161b8e01c68d1aa4fb11055110dd8b0e Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 7 Mar 2024 13:05:24 +0530 Subject: [PATCH 089/362] split tests --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index c113d142365..3f6ba1d64c6 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -89,7 +89,7 @@ jobs: run: cd detox && npm install - name: Run Detox E2E Tests - run: npm run e2e:ios-test -- "${{ matrix.specs }}" + run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} - name: Upload iOS Test Report if: always() From d02da9080231625841dde68b4a17f2d87047de83 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 7 Mar 2024 13:36:19 +0530 Subject: [PATCH 090/362] 10 parallel detox-e2e jobs --- .github/workflows/e2e-detox.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 3f6ba1d64c6..8aea948cab1 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -20,13 +20,13 @@ jobs: specs: ${{ steps.generate-specs.outputs.specs }} steps: - name: Checkout Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Generate Test Specs id: generate-specs uses: ./.github/actions/generate-specs with: - parallelism: 5 + parallelism: 10 directory: detox/e2e search_path: test @@ -34,7 +34,7 @@ jobs: runs-on: macos-14-large steps: - name: Checkout Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Prepare iOS Build uses: ./.github/actions/prepare-ios-build @@ -66,7 +66,7 @@ jobs: matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} steps: - name: Checkout Repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Homebrew Dependencies run: | From 8da7c0f549dc2a3aa01242c5423148f878c712c5 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 7 Mar 2024 15:15:48 +0530 Subject: [PATCH 091/362] 10 parallel detox-e2e jobs --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 8aea948cab1..6eea0533acc 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -96,4 +96,4 @@ jobs: uses: actions/upload-artifact@v3 with: name: ios-results-${{ matrix.runId }} - path: detox/artifacts/ios-report.html \ No newline at end of file + path: detox/artifacts/jest-stare/ From 7c1f9badec00d29ee8ee48bedbd90ab19f9891d3 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 8 Mar 2024 02:04:14 +0530 Subject: [PATCH 092/362] save artifacts --- .github/workflows/e2e-detox.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 6eea0533acc..4aa1fe46811 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -50,7 +50,7 @@ jobs: working-directory: ./fastlane - name: Upload iOS Simulator Build - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ios-build-simulator-${{ github.run_id }} path: Mattermost-simulator-x86_64.app.zip @@ -74,7 +74,7 @@ jobs: brew install applesimutils - name: Download iOS Simulator Build - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ios-build-simulator-${{ github.run_id }} path: mobile-artifacts @@ -93,7 +93,7 @@ jobs: - name: Upload iOS Test Report if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ios-results-${{ matrix.runId }} - path: detox/artifacts/jest-stare/ + path: detox/artifacts/ From fed7e7c9350de2919191a97aa267b39d4f1cfc48 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 11 Mar 2024 21:03:09 +0530 Subject: [PATCH 093/362] add download report job --- .github/workflows/e2e-detox.yml | 29 +++++++++++++++++++++++++---- detox/package.json | 1 + detox/save_report.js | 18 ++++++++++++++++-- detox/utils/report.js | 2 +- 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 4aa1fe46811..fe50caa57fc 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -42,9 +42,9 @@ jobs: - name: Build iOS Simulator env: TAG: "${{ github.ref_name }}" - AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" - AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" - MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}" + # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" + # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" + # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}" GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" run: bundle exec fastlane ios simulator --env ios.simulator working-directory: ./fastlane @@ -56,6 +56,8 @@ jobs: path: Mattermost-simulator-x86_64.app.zip e2e-ios: + env: + IOS: true runs-on: macos-14-large name: test-detox-e2e-${{ matrix.runId }} needs: @@ -86,7 +88,7 @@ jobs: run: npm run start & - name: Install Detox Dependencies - run: cd detox && npm install + run: cd detox && npm ci - name: Run Detox E2E Tests run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} @@ -97,3 +99,22 @@ jobs: with: name: ios-results-${{ matrix.runId }} path: detox/artifacts/ + + + download-e2e-results: + runs-on: ubuntu-22.04 + needs: + - e2e-ios + - generate-specs + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Download iOS E2E Test Results + uses: actions/download-artifact@v4 + with: + name: ios-results-${{ needs.e2e-ios.outputs.matrix.runId }} + path: detox/artifacts/ + + - name: Save report Detox Dependencies + run: cd detox && npm run e2e:save-report diff --git a/detox/package.json b/detox/package.json index 0ac26ae7f46..3a716b031aa 100644 --- a/detox/package.json +++ b/detox/package.json @@ -53,6 +53,7 @@ "check": "npm run lint && npm run tsc", "clean-detox": "detox clean", "lint": "eslint --ignore-pattern node_modules --quiet .", + "e2e:save-report": "node save_report.js", "start:webhook": "node webhook_server.js", "tsc": "NODE_OPTIONS=--max_old_space_size=12000 tsc --noEmit" } diff --git a/detox/save_report.js b/detox/save_report.js index a9803b08944..a8f61b8aa0e 100644 --- a/detox/save_report.js +++ b/detox/save_report.js @@ -33,6 +33,7 @@ const os = require('os'); const path = require('path'); +const fs = require('fs'); const fse = require('fs-extra'); const {mergeFiles} = require('junit-report-merger'); @@ -96,7 +97,7 @@ const saveReport = async () => { // Merge all XML reports into one single XML report const platform = process.env.IOS === 'true' ? 'ios' : 'android'; const combinedFilePath = `${ARTIFACTS_DIR}/${platform}-combined.xml`; - await mergeFiles(path.join(__dirname, combinedFilePath), [`${ARTIFACTS_DIR}/${platform}-junit*.xml`]); + await mergeFiles(path.join(__dirname, combinedFilePath), [`${ARTIFACTS_DIR}/ios-results*/${platform}-junit*.xml`]); console.log(`Merged, check ${combinedFilePath}`); // Read XML from a file @@ -112,9 +113,22 @@ const saveReport = async () => { // Generate jest-stare report const jestStareOutputDir = path.join(__dirname, `${ARTIFACTS_DIR}/jest-stare`); const jestStareCombinedFilePath = `${jestStareOutputDir}/${platform}-combined.json`; - await mergeJestStareJsonFiles(jestStareCombinedFilePath, [`${ARTIFACTS_DIR}/jest-stare/${platform}-data*.json`]); + if (!fs.existsSync(jestStareOutputDir)) { + fs.mkdirSync(jestStareOutputDir, { recursive: true }); + } + // 'ios-results-*' is the path in CI where the parallel detox jobs save artifacts + await mergeJestStareJsonFiles(jestStareCombinedFilePath, [`${ARTIFACTS_DIR}/ios-results*/jest-stare/${platform}-data*.json`]); generateJestStareHtmlReport(jestStareOutputDir, `${platform}-report.html`, jestStareCombinedFilePath); + if (process.env.CI) { + // Delete folders starting with "iOS-results-" only in CI environment + const entries = fs.readdirSync(ARTIFACTS_DIR, { withFileTypes: true }); + for (const entry of entries) { + if (entry.isDirectory() && entry.name.startsWith('ios-results-')) { + fs.rmSync(path.join(ARTIFACTS_DIR, entry.name), { recursive: true }); + } + } + } const result = await saveArtifacts(); if (result && result.success) { console.log('Successfully uploaded artifacts to S3:', result.reportLink); diff --git a/detox/utils/report.js b/detox/utils/report.js index 7fca48ee5e5..0da8ae31435 100644 --- a/detox/utils/report.js +++ b/detox/utils/report.js @@ -184,7 +184,7 @@ function removeOldGeneratedReports() { ].forEach((file) => fse.removeSync(`${ARTIFACTS_DIR}/${file}`)); } -function writeJsonToFile(jsonObject, filename, dir) { +async function writeJsonToFile(jsonObject, filename, dir) { fse.writeJson(`${dir}/${filename}`, jsonObject). then(() => console.log('Successfully written:', filename)). catch((err) => console.error(err)); From d1b4fa17776d94ff122eebf5f958170421613c97 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 11 Mar 2024 21:32:19 +0530 Subject: [PATCH 094/362] add download report job --- .github/workflows/e2e-detox.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index fe50caa57fc..56776c2112a 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -13,7 +13,6 @@ concurrency: cancel-in-progress: true jobs: - generate-specs: runs-on: ubuntu-22.04 outputs: @@ -42,11 +41,11 @@ jobs: - name: Build iOS Simulator env: TAG: "${{ github.ref_name }}" - # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" - # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" + AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" + AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}" GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" - run: bundle exec fastlane ios simulator --env ios.simulator + run: bundle exec fastlane ios simulator --env ios.simulator || true working-directory: ./fastlane - name: Upload iOS Simulator Build From cc624e0653979f72e0499d7a03ea927531020461 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 11 Mar 2024 22:24:10 +0530 Subject: [PATCH 095/362] add download report job --- .github/workflows/e2e-detox.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 56776c2112a..31860955c4f 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -103,8 +103,8 @@ jobs: download-e2e-results: runs-on: ubuntu-22.04 needs: - - e2e-ios - generate-specs + - e2e-ios steps: - name: Checkout Repository uses: actions/checkout@v4 @@ -114,6 +114,7 @@ jobs: with: name: ios-results-${{ needs.e2e-ios.outputs.matrix.runId }} path: detox/artifacts/ + continue-on-error: true - name: Save report Detox Dependencies run: cd detox && npm run e2e:save-report From 4707c2c073f2dad0d578ca901cdbc1703b93c359 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 11 Mar 2024 23:30:10 +0530 Subject: [PATCH 096/362] add android job --- .github/workflows/e2e-detox.yml | 67 ++++++++++++++++++++++++++++++++- detox/save_report.js | 13 ++++--- 2 files changed, 72 insertions(+), 8 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 31860955c4f..619bc52eb0e 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -43,7 +43,6 @@ jobs: TAG: "${{ github.ref_name }}" AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" - # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_BETA_MATTERMOST_WEBHOOK_URL }}" GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" run: bundle exec fastlane ios simulator --env ios.simulator || true working-directory: ./fastlane @@ -99,9 +98,74 @@ jobs: name: ios-results-${{ matrix.runId }} path: detox/artifacts/ + build-android-apk: + runs-on: macos-14-large + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: ci/prepare-android-build + uses: ./.github/actions/prepare-android-build + env: + STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + + - name: Install Detox dependencies + run: cd detox && npm ci + + - name: Build android apk + run: | + cd detox + npm run e2e:android-build + + - name: Upload Android APK + uses: actions/upload-artifact@v4 + with: + name: android-build-apk-${{ github.run_id }} + path: android/app/build/outputs/apk/debug/app-debug.apk + + e2e-android: + env: + IOS: false + runs-on: macos-14-large + name: test-detox-e2e-${{ matrix.runId }} + needs: + - generate-specs + - build-android-apk + strategy: + fail-fast: false + matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Download Android APK + uses: actions/download-artifact@v4 + with: + name: android-build-apk-${{ github.run_id }} + path: android/app/build/outputs/apk/debug/app-debug.apk + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm ci + + - name: Run Detox E2E Tests + run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} + + - name: Upload iOS Test Report + if: always() + uses: actions/upload-artifact@v4 + with: + name: ios-results-${{ matrix.runId }} + path: detox/artifacts download-e2e-results: runs-on: ubuntu-22.04 + if: always() needs: - generate-specs - e2e-ios @@ -114,7 +178,6 @@ jobs: with: name: ios-results-${{ needs.e2e-ios.outputs.matrix.runId }} path: detox/artifacts/ - continue-on-error: true - name: Save report Detox Dependencies run: cd detox && npm run e2e:save-report diff --git a/detox/save_report.js b/detox/save_report.js index a8f61b8aa0e..2066fab7b9f 100644 --- a/detox/save_report.js +++ b/detox/save_report.js @@ -31,9 +31,9 @@ * - TYPE=[type], e.g. "MASTER", "PR", "RELEASE", "GEKIDOU" */ +const fs = require('fs'); const os = require('os'); const path = require('path'); -const fs = require('fs'); const fse = require('fs-extra'); const {mergeFiles} = require('junit-report-merger'); @@ -114,19 +114,20 @@ const saveReport = async () => { const jestStareOutputDir = path.join(__dirname, `${ARTIFACTS_DIR}/jest-stare`); const jestStareCombinedFilePath = `${jestStareOutputDir}/${platform}-combined.json`; if (!fs.existsSync(jestStareOutputDir)) { - fs.mkdirSync(jestStareOutputDir, { recursive: true }); + fs.mkdirSync(jestStareOutputDir, {recursive: true}); } + // 'ios-results-*' is the path in CI where the parallel detox jobs save artifacts await mergeJestStareJsonFiles(jestStareCombinedFilePath, [`${ARTIFACTS_DIR}/ios-results*/jest-stare/${platform}-data*.json`]); generateJestStareHtmlReport(jestStareOutputDir, `${platform}-report.html`, jestStareCombinedFilePath); if (process.env.CI) { // Delete folders starting with "iOS-results-" only in CI environment - const entries = fs.readdirSync(ARTIFACTS_DIR, { withFileTypes: true }); + const entries = fs.readdirSync(ARTIFACTS_DIR, {withFileTypes: true}); for (const entry of entries) { - if (entry.isDirectory() && entry.name.startsWith('ios-results-')) { - fs.rmSync(path.join(ARTIFACTS_DIR, entry.name), { recursive: true }); - } + if (entry.isDirectory() && entry.name.startsWith('ios-results-')) { + fs.rmSync(path.join(ARTIFACTS_DIR, entry.name), {recursive: true}); + } } } const result = await saveArtifacts(); From 9a83ca1d8cf443ca25897b288100fb6138a3dfd4 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 12 Mar 2024 06:54:31 +0530 Subject: [PATCH 097/362] fix lint --- .github/workflows/e2e-detox.yml | 1 + detox/save_report.js | 13 +++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 31860955c4f..d6020ab2391 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -102,6 +102,7 @@ jobs: download-e2e-results: runs-on: ubuntu-22.04 + if: always() needs: - generate-specs - e2e-ios diff --git a/detox/save_report.js b/detox/save_report.js index a8f61b8aa0e..2066fab7b9f 100644 --- a/detox/save_report.js +++ b/detox/save_report.js @@ -31,9 +31,9 @@ * - TYPE=[type], e.g. "MASTER", "PR", "RELEASE", "GEKIDOU" */ +const fs = require('fs'); const os = require('os'); const path = require('path'); -const fs = require('fs'); const fse = require('fs-extra'); const {mergeFiles} = require('junit-report-merger'); @@ -114,19 +114,20 @@ const saveReport = async () => { const jestStareOutputDir = path.join(__dirname, `${ARTIFACTS_DIR}/jest-stare`); const jestStareCombinedFilePath = `${jestStareOutputDir}/${platform}-combined.json`; if (!fs.existsSync(jestStareOutputDir)) { - fs.mkdirSync(jestStareOutputDir, { recursive: true }); + fs.mkdirSync(jestStareOutputDir, {recursive: true}); } + // 'ios-results-*' is the path in CI where the parallel detox jobs save artifacts await mergeJestStareJsonFiles(jestStareCombinedFilePath, [`${ARTIFACTS_DIR}/ios-results*/jest-stare/${platform}-data*.json`]); generateJestStareHtmlReport(jestStareOutputDir, `${platform}-report.html`, jestStareCombinedFilePath); if (process.env.CI) { // Delete folders starting with "iOS-results-" only in CI environment - const entries = fs.readdirSync(ARTIFACTS_DIR, { withFileTypes: true }); + const entries = fs.readdirSync(ARTIFACTS_DIR, {withFileTypes: true}); for (const entry of entries) { - if (entry.isDirectory() && entry.name.startsWith('ios-results-')) { - fs.rmSync(path.join(ARTIFACTS_DIR, entry.name), { recursive: true }); - } + if (entry.isDirectory() && entry.name.startsWith('ios-results-')) { + fs.rmSync(path.join(ARTIFACTS_DIR, entry.name), {recursive: true}); + } } } const result = await saveArtifacts(); From 3877201f80673b9f9deaeb62f705d0c0f8d2507a Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 12 Mar 2024 06:56:20 +0530 Subject: [PATCH 098/362] edit pull request --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 619bc52eb0e..0837210596a 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -6,7 +6,7 @@ on: - main pull_request: branches: - - main + - add_e2e_CI concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} From 3a7935c3645991eb656cc7c447b2e50609cd3ab1 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 12 Mar 2024 07:34:20 +0530 Subject: [PATCH 099/362] add android job --- .github/workflows/e2e-detox.yml | 160 ++++++++++++++++---------------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 6cc4b267179..180122c0076 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -29,74 +29,74 @@ jobs: directory: detox/e2e search_path: test - build-ios-simulator: - runs-on: macos-14-large - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - - name: Prepare iOS Build - uses: ./.github/actions/prepare-ios-build - - - name: Build iOS Simulator - env: - TAG: "${{ github.ref_name }}" - AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" - AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" - GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" - run: bundle exec fastlane ios simulator --env ios.simulator || true - working-directory: ./fastlane - - - name: Upload iOS Simulator Build - uses: actions/upload-artifact@v4 - with: - name: ios-build-simulator-${{ github.run_id }} - path: Mattermost-simulator-x86_64.app.zip - - e2e-ios: - env: - IOS: true - runs-on: macos-14-large - name: test-detox-e2e-${{ matrix.runId }} - needs: - - generate-specs - - build-ios-simulator - strategy: - fail-fast: false - matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - - name: Install Homebrew Dependencies - run: | - brew tap wix/brew - brew install applesimutils - - - name: Download iOS Simulator Build - uses: actions/download-artifact@v4 - with: - name: ios-build-simulator-${{ github.run_id }} - path: mobile-artifacts - - - name: Unzip iOS Simulator Build - run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ - - - name: Start React Native Metro Server - run: npm run start & - - - name: Install Detox Dependencies - run: cd detox && npm ci - - - name: Run Detox E2E Tests - run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} - - - name: Upload iOS Test Report - if: always() - uses: actions/upload-artifact@v4 - with: - name: ios-results-${{ matrix.runId }} - path: detox/artifacts/ + # build-ios-simulator: + # runs-on: macos-14-large + # steps: + # - name: Checkout Repository + # uses: actions/checkout@v4 + + # - name: Prepare iOS Build + # uses: ./.github/actions/prepare-ios-build + + # - name: Build iOS Simulator + # env: + # TAG: "${{ github.ref_name }}" + # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" + # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" + # GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" + # run: bundle exec fastlane ios simulator --env ios.simulator || true + # working-directory: ./fastlane + + # - name: Upload iOS Simulator Build + # uses: actions/upload-artifact@v4 + # with: + # name: ios-build-simulator-${{ github.run_id }} + # path: Mattermost-simulator-x86_64.app.zip + + # e2e-ios: + # env: + # IOS: true + # runs-on: macos-14-large + # name: test-detox-e2e-${{ matrix.runId }} + # needs: + # - generate-specs + # - build-ios-simulator + # strategy: + # fail-fast: false + # matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} + # steps: + # - name: Checkout Repository + # uses: actions/checkout@v4 + + # - name: Install Homebrew Dependencies + # run: | + # brew tap wix/brew + # brew install applesimutils + + # - name: Download iOS Simulator Build + # uses: actions/download-artifact@v4 + # with: + # name: ios-build-simulator-${{ github.run_id }} + # path: mobile-artifacts + + # - name: Unzip iOS Simulator Build + # run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ + + # - name: Start React Native Metro Server + # run: npm run start & + + # - name: Install Detox Dependencies + # run: cd detox && npm ci + + # - name: Run Detox E2E Tests + # run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} + + # - name: Upload iOS Test Report + # if: always() + # uses: actions/upload-artifact@v4 + # with: + # name: ios-results-${{ matrix.runId }} + # path: detox/artifacts/ build-android-apk: runs-on: macos-14-large @@ -112,19 +112,20 @@ jobs: STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - name: Install Detox dependencies - run: cd detox && npm ci - - - name: Build android apk - run: | - cd detox - npm run e2e:android-build + - name: ci/build-android-pr + env: + BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" + AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" + AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" + MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" + run: bundle exec fastlane android build --env android.pr + working-directory: ./fastlane - - name: Upload Android APK - uses: actions/upload-artifact@v4 + - name: ci/upload-android-pr-build + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: - name: android-build-apk-${{ github.run_id }} - path: android/app/build/outputs/apk/debug/app-debug.apk + name: android-build-pr-${{ github.run_id }} + path: "*.apk" e2e-android: env: @@ -168,7 +169,6 @@ jobs: if: always() needs: - generate-specs - - e2e-ios steps: - name: Checkout Repository uses: actions/checkout@v4 From fe7da7491836f84ce2163bcdceeea9a86824f3af Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 12 Mar 2024 07:56:53 +0530 Subject: [PATCH 100/362] add android job --- .github/workflows/e2e-detox.yml | 45 ++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 180122c0076..72b05465a51 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -99,7 +99,7 @@ jobs: # path: detox/artifacts/ build-android-apk: - runs-on: macos-14-large + runs-on: ubuntu-22.04 steps: - name: Checkout Repository uses: actions/checkout@v4 @@ -130,7 +130,7 @@ jobs: e2e-android: env: IOS: false - runs-on: macos-14-large + runs-on: ubuntu-22.04 name: test-detox-e2e-${{ matrix.runId }} needs: - generate-specs @@ -141,7 +141,7 @@ jobs: steps: - name: Checkout Repository uses: actions/checkout@v4 - + - name: Download Android APK uses: actions/download-artifact@v4 with: @@ -178,6 +178,43 @@ jobs: with: name: ios-results-${{ needs.e2e-ios.outputs.matrix.runId }} path: detox/artifacts/ + continue-on-error: true + + - name: Download Android E2E Test Results + uses: actions/download-artifact@v4 + with: + name: android-results-${{ needs.e2e-android.outputs.matrix.runId }} + path: detox/artifacts/ + continue-on-error: true + + - name: Check for downloaded artifacts + id: check-artifacts + run: | + ios_artifacts_found=false + android_artifacts_found=false + + if compgen -G "detox/artifacts/ios-results-*" > /dev/null; then + ios_artifacts_found=true + fi + + if compgen -G "detox/artifacts/android-results-*" > /dev/null; then + android_artifacts_found=true + fi + + echo "::set-output name=ios_artifacts_found::$ios_artifacts_found" + echo "::set-output name=android_artifacts_found::$android_artifacts_found" - name: Save report Detox Dependencies - run: cd detox && npm run e2e:save-report + if: steps.check-artifacts.outputs.ios_artifacts_found == 'true' || steps.check-artifacts.outputs.android_artifacts_found == 'true' + run: | + ios_artifacts_found=${{ steps.check-artifacts.outputs.ios_artifacts_found }} + android_artifacts_found=${{ steps.check-artifacts.outputs.android_artifacts_found }} + + if [ "$ios_artifacts_found" == "true" ]; then + echo "iOS artifacts found, running with IOS=true" + IOS=true npm run e2e:save-report + + if [ "$android_artifacts_found" == "true" ]; then + echo "Android artifacts found, running with IOS=false" + IOS=false npm run e2e:save-report + working-directory: detox From 1cd30b563e2797a0616a3840f3085ef7a4534b8c Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 12 Mar 2024 08:20:51 +0530 Subject: [PATCH 101/362] build apk --- .github/workflows/e2e-detox.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 72b05465a51..bc6782e0ac6 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -112,20 +112,19 @@ jobs: STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - name: ci/build-android-pr - env: - BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" - AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" - AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" - MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" - run: bundle exec fastlane android build --env android.pr - working-directory: ./fastlane - - - name: ci/upload-android-pr-build - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + - name: Install Detox dependencies + run: cd detox && npm ci + + - name: Build android apk + run: | + cd detox + npm run e2e:android-build + + - name: Upload Android APK + uses: actions/upload-artifact@v4 with: - name: android-build-pr-${{ github.run_id }} - path: "*.apk" + name: android-build-apk-${{ github.run_id }} + path: android/app/build/outputs/apk/debug/app-debug.apk e2e-android: env: @@ -169,6 +168,7 @@ jobs: if: always() needs: - generate-specs + - e2e-android steps: - name: Checkout Repository uses: actions/checkout@v4 @@ -201,8 +201,8 @@ jobs: android_artifacts_found=true fi - echo "::set-output name=ios_artifacts_found::$ios_artifacts_found" - echo "::set-output name=android_artifacts_found::$android_artifacts_found" + echo "ios_artifacts_found=$ios_artifacts_found" >> $GITHUB_OUTPUT + echo "android_artifacts_found=$android_artifacts_found" >> $GITHUB_OUTPUT - name: Save report Detox Dependencies if: steps.check-artifacts.outputs.ios_artifacts_found == 'true' || steps.check-artifacts.outputs.android_artifacts_found == 'true' From bd493f583c9f1395683aade9c832d397f0c948c2 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 12 Mar 2024 12:17:33 +0530 Subject: [PATCH 102/362] build apk --- .github/workflows/e2e-detox.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index bc6782e0ac6..7181cd07b64 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -129,6 +129,7 @@ jobs: e2e-android: env: IOS: false + GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" runs-on: ubuntu-22.04 name: test-detox-e2e-${{ matrix.runId }} needs: From 7b3a13a352ca98c2f96670c3a4ce233179e1a0cb Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 12 Mar 2024 15:34:07 +0530 Subject: [PATCH 103/362] build apk --- .github/workflows/e2e-detox.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 7181cd07b64..a67bcc0c34b 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -104,6 +104,13 @@ jobs: - name: Checkout Repository uses: actions/checkout@v4 + - name: Free up space + run: | + sudo rm -rf /usr/share/dotnet + sudo rm -rf /opt/ghc + sudo rm -rf "/usr/local/share/boost" + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + - name: ci/prepare-android-build uses: ./.github/actions/prepare-android-build env: @@ -142,6 +149,13 @@ jobs: - name: Checkout Repository uses: actions/checkout@v4 + - name: Free up space + run: | + sudo rm -rf /usr/share/dotnet + sudo rm -rf /opt/ghc + sudo rm -rf "/usr/local/share/boost" + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + - name: Download Android APK uses: actions/download-artifact@v4 with: From 428d09e412ecfcf2f170b06362627fc86cc7d449 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 12 Mar 2024 15:34:07 +0530 Subject: [PATCH 104/362] build apk --- .github/workflows/e2e-detox.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index a67bcc0c34b..4d756f2a0d5 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -104,7 +104,7 @@ jobs: - name: Checkout Repository uses: actions/checkout@v4 - - name: Free up space + - name: Free up space on the runner run: | sudo rm -rf /usr/share/dotnet sudo rm -rf /opt/ghc @@ -149,7 +149,7 @@ jobs: - name: Checkout Repository uses: actions/checkout@v4 - - name: Free up space + - name: Free up space on the runner run: | sudo rm -rf /usr/share/dotnet sudo rm -rf /opt/ghc @@ -162,6 +162,12 @@ jobs: name: android-build-apk-${{ github.run_id }} path: android/app/build/outputs/apk/debug/app-debug.apk + - name: Check APK + run: | + ls -l android/app/build/ + ls -l outputs/apk/ + ls -l debug/app-debug.apk + - name: Start React Native Metro Server run: npm run start & @@ -169,7 +175,7 @@ jobs: run: cd detox && npm ci - name: Run Detox E2E Tests - run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} + run: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - name: Upload iOS Test Report if: always() From 48690dcf32ccddb9a8733ac936c61127df0417fd Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 12 Mar 2024 17:53:43 +0530 Subject: [PATCH 105/362] run android --- .github/workflows/e2e-detox.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 4d756f2a0d5..73d91a9e033 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -162,12 +162,6 @@ jobs: name: android-build-apk-${{ github.run_id }} path: android/app/build/outputs/apk/debug/app-debug.apk - - name: Check APK - run: | - ls -l android/app/build/ - ls -l outputs/apk/ - ls -l debug/app-debug.apk - - name: Start React Native Metro Server run: npm run start & From 81b2a3b5103d2b65523a52b28e41fc2acab60e6a Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 07:47:04 +0530 Subject: [PATCH 106/362] init --- .github/actions/generate-specs/action.yml | 32 ++++ .github/actions/generate-specs/split-tests.go | 114 +++++++++++++ .github/workflows/e2e-detox.yml | 155 ++++++++++++++++++ detox/.detoxrc.json | 2 +- detox/e2e/support/server_api/user.ts | 2 +- detox/e2e/support/test_config.ts | 18 +- .../ui/screen/create_or_edit_channel.ts | 2 + detox/e2e/support/ui/screen/login.ts | 16 +- detox/e2e/support/ui/screen/server.ts | 18 +- .../convert_to_private_channel.e2e.ts | 2 +- .../test/server_login/login_by_email.e2e.ts | 16 +- detox/e2e/test/teams/invite_people.e2e.ts | 21 +-- detox/save_report.js | 19 ++- 13 files changed, 375 insertions(+), 42 deletions(-) create mode 100644 .github/actions/generate-specs/action.yml create mode 100644 .github/actions/generate-specs/split-tests.go create mode 100644 .github/workflows/e2e-detox.yml diff --git a/.github/actions/generate-specs/action.yml b/.github/actions/generate-specs/action.yml new file mode 100644 index 00000000000..eea47f70489 --- /dev/null +++ b/.github/actions/generate-specs/action.yml @@ -0,0 +1,32 @@ +# Copyright 2024 Mattermost, Inc. +name: "generate-specs" +description: This action used to split Detox integration tests based on the parallelism provided + +inputs: + directory: + description: The directory of the test suite + required: true + search_path: + description: The path to look for from within the directory + required: true + parallelism: + description: The parallelism for the tests + required: true +outputs: + specs: + description: The specs generated for the strategy + value: ${{ steps.generate-specs.outputs.specs }} +runs: + using: "composite" + steps: + - name: ci/generate-specs + id: generate-specs + env: + PARALLELISM: ${{ inputs.parallelism }} + SEARCH_PATH: ${{ inputs.search_path }} + DIRECTORY: ${{ inputs.directory }} + run: | + set -e + go run ${{ github.action_path }}/split-tests.go > output.json + echo "specs=$(cat output.json)" >> $GITHUB_OUTPUT + shell: bash diff --git a/.github/actions/generate-specs/split-tests.go b/.github/actions/generate-specs/split-tests.go new file mode 100644 index 00000000000..001f1719f11 --- /dev/null +++ b/.github/actions/generate-specs/split-tests.go @@ -0,0 +1,114 @@ +package main + +import ( + "encoding/json" + "fmt" + "io/fs" + "math" + "os" + "path/filepath" + "regexp" + "strconv" + "strings" +) + +type Specs struct { + searchPath string + directory string + parallelism int + rawFiles []string + groupedFiles []SpecGroup +} + +type SpecGroup struct { + RunID string `json:"runId"` + Specs string `json:"specs"` +} + +type Output struct { + Include []SpecGroup `json:"include"` +} + +func newSpecGroup(runId string, specs string) *SpecGroup { + return &SpecGroup{ + RunID: runId, + Specs: specs, + } +} + +func newSpecs(directory string, searchPath string, parallelism int) *Specs { + return &Specs{ + directory: directory, + searchPath: searchPath, + parallelism: parallelism, + } +} + +func (s *Specs) findFiles() { + fileSystem := os.DirFS(filepath.Join(s.directory, s.searchPath)) + err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + + // Find all files matching *.e2e.ts + r := regexp.MustCompile(`.*\.e2e\.ts$`) + if r.MatchString(path) { + s.rawFiles = append(s.rawFiles, filepath.Join(s.searchPath, path)) + } + + return nil + }) + if err != nil { + panic(err) + } +} + +func (s *Specs) generateSplits() { + // Split to chunks based on the parallelism provided + chunkSize := int(math.Ceil(float64(len(s.rawFiles)) / float64(s.parallelism))) + runNo := 1 + + for i := 0; i <= len(s.rawFiles); i += chunkSize { + end := i + chunkSize + if end > len(s.rawFiles) { + end = len(s.rawFiles) + } + + fileGroup := strings.Join(s.rawFiles[i:end], " ") + specFileGroup := newSpecGroup(strconv.Itoa(runNo), fileGroup) + s.groupedFiles = append(s.groupedFiles, *specFileGroup) + + // Break when we reach the end to avoid duplicate groups + if end == len(s.rawFiles) { + break + } + + runNo++ + } +} + +func (s *Specs) dumpSplits() { + // Dump json format for GitHub actions + o := &Output{ + Include: s.groupedFiles, + } + + b, err := json.Marshal(o) + if err != nil { + panic(err) + } + + fmt.Println(string(b)) +} + +func main() { + searchPath := os.Getenv("SEARCH_PATH") + directory := os.Getenv("DIRECTORY") + parallelism, _ := strconv.Atoi(os.Getenv("PARALLELISM")) + + specs := newSpecs(directory, searchPath, parallelism) + specs.findFiles() + specs.generateSplits() + specs.dumpSplits() +} diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml new file mode 100644 index 00000000000..43c9d6b20f8 --- /dev/null +++ b/.github/workflows/e2e-detox.yml @@ -0,0 +1,155 @@ +name: Detox E2E Tests + +on: + push: + branches: + - main + - ios_detox_job + pull_request: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: true + +env: + DEVICE_NAME: "iPhone 15 Pro" + DEVICE_OS_VERSION: "iOS 17.2" + BRANCH: ${{ github.head_ref || github.ref_name }} + BUILD_ID: ${{ github.run_id }} + COMMIT_HASH: ${{ github.sha }} + AWS_REGION: 'us-east-1' + DETOX_AWS_S3_BUCKET: 'mattermost-detox-report' + DETOX_AWS_ACCESS_KEY_ID: ${{ secrets.MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID }} + DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }} + HEADLESS: 'false' + TYPE: 'PR' + PULL_REQUEST: 'https://github.com/mattermost/mattermost-mobile/pull/7822' + ZEPHYR_ENABLE: false + JIRA_PROJECT_KEY: 'MM' + ZEPHYR_API_KEY: ${{ secrets.MM_MOBILE_E2E_ZEPHYR_API_KEY }} + ZEPHYR_FOLDER_ID: '3233873' + TEST_CYCLE_LINK_PREFIX: ${{ secrets.MM_MOBILE_E2E_TEST_CYCLE_LINK_PREFIX }} + WEBHOOK_URL: ${{ secrets.MM_MOBILE_E2E_WEBHOOK_URL }} + FAILURE_MESSAGE: "Something has failed" + +jobs: + generate-specs: + runs-on: ubuntu-22.04 + outputs: + specs: ${{ steps.generate-specs.outputs.specs }} + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Generate Test Specs + id: generate-specs + uses: ./.github/actions/generate-specs + with: + parallelism: 10 + directory: detox/e2e + search_path: test + + build-ios-simulator: + runs-on: macos-14-large + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Prepare iOS Build + uses: ./.github/actions/prepare-ios-build + + - name: Build iOS Simulator + env: + TAG: "${{ github.ref_name }}" + AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" + AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" + GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" + run: bundle exec fastlane ios simulator --env ios.simulator || true + working-directory: ./fastlane + + - name: Upload iOS Simulator Build + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: ios-build-simulator-${{ github.run_id }} + path: Mattermost-simulator-x86_64.app.zip + + e2e-ios: + env: + IOS: true + runs-on: macos-14-large + name: test-detox-e2e-${{ matrix.runId }} + needs: + - generate-specs + - build-ios-simulator + strategy: + fail-fast: false + matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Set Build ID + run: echo "BUILD_ID=${{ github.run_id }}-${{ env.BUILD_SUFFIX }}" >> $GITHUB_ENV + + - name: Install Homebrew Dependencies + run: | + brew tap wix/brew + brew install applesimutils + + - name: Download iOS Simulator Build + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + name: ios-build-simulator-${{ github.run_id }} + path: mobile-artifacts + + - name: Unzip iOS Simulator Build + run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm ci + + - name: Run Detox E2E Tests + run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} + + - name: Upload iOS Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: ios-results-${{ matrix.runId }} + path: detox/artifacts/ + + download-e2e-results: + runs-on: ubuntu-22.04 + if: always() + needs: + - generate-specs + - e2e-ios + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Create artifacts directory + run: | + mkdir -p detox/artifacts/ + + - name: Download All Artifacts + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + path: detox/artifacts/ + pattern: ios-results-* + + - name: Save report Detox Dependencies + run: | + cd detox + npm ci + npm run e2e:save-report + env: + IOS: true diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 5a03db58c8f..17b146f42ed 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -30,7 +30,7 @@ "ios.simulator": { "type": "ios.simulator", "device": { - "type": "iPhone 14" + "type": "iPhone 15 Pro" } }, "android.emulator": { diff --git a/detox/e2e/support/server_api/user.ts b/detox/e2e/support/server_api/user.ts index 37c70c31aaf..afd1d046d32 100644 --- a/detox/e2e/support/server_api/user.ts +++ b/detox/e2e/support/server_api/user.ts @@ -48,7 +48,7 @@ export const apiCreateUser = async (baseUrl: string, {prefix = 'user', user = nu newUser, ); - return {user: {...response.data, password: newUser.password}}; + return {user: {...response.data, newUser}}; } catch (err) { return getResponseFromError(err); } diff --git a/detox/e2e/support/test_config.ts b/detox/e2e/support/test_config.ts index 54b087db837..124df1b4107 100644 --- a/detox/e2e/support/test_config.ts +++ b/detox/e2e/support/test_config.ts @@ -1,15 +1,15 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -export const serverOneUrl = process.env.SITE_1_URL || (process.env.IOS === 'true' ? 'http://127.0.0.1:8065' : 'http://10.0.2.2:8065'); -export const siteOneUrl = process.env.SITE_1_URL || 'http://127.0.0.1:8065'; -export const serverTwoUrl = process.env.SITE_2_URL || 'https://mobile02.test.mattermost.cloud'; -export const siteTwoUrl = process.env.SITE_2_URL || 'https://mobile02.test.mattermost.cloud'; -export const serverThreeUrl = process.env.SITE_3_URL || 'https://mobile03.test.mattermost.cloud'; -export const siteThreeUrl = process.env.SITE_3_URL || 'https://mobile03.test.mattermost.cloud'; +export const serverOneUrl = process.env.SITE_1_URL || (process.env.IOS === 'true' ? 'https://mobile-e2e.test.mattermost.cloud' : 'http://10.0.2.2:8065'); +export const siteOneUrl = process.env.SITE_1_URL || 'https://mobile-e2e.test.mattermost.cloud'; +export const serverTwoUrl = process.env.SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud'; +export const siteTwoUrl = process.env.SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud'; +export const serverThreeUrl = process.env.SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud'; +export const siteThreeUrl = process.env.SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud'; export const smtpUrl = process.env.SMTP_URL || 'http://127.0.0.1:9001'; -export const adminEmail = process.env.ADMIN_EMAIL || 'sysadmin@sample.mattermost.com'; -export const adminUsername = process.env.ADMIN_USERNAME || 'sysadmin'; -export const adminPassword = process.env.ADMIN_PASSWORD || 'Sys@dmin-sample1'; +export const adminEmail = process.env.ADMIN_EMAIL || 'success+sysadmin@simulator.amazonses.com'; +export const adminUsername = process.env.ADMIN_USERNAME || 'admin'; +export const adminPassword = process.env.ADMIN_PASSWORD || 'admin@suz4ziqx9jbnjx4bwmfitfknpa'; export const ldapServer = process.env.LDAP_SERVER || '127.0.0.1'; export const ldapPort = process.env.LDAP_PORT || 389; diff --git a/detox/e2e/support/ui/screen/create_or_edit_channel.ts b/detox/e2e/support/ui/screen/create_or_edit_channel.ts index 70f5dc9de4e..d8f6fb1fd89 100644 --- a/detox/e2e/support/ui/screen/create_or_edit_channel.ts +++ b/detox/e2e/support/ui/screen/create_or_edit_channel.ts @@ -59,6 +59,8 @@ class CreateOrEditChannelScreen { openEditChannel = async () => { // # Open edit channel screen + await ChannelInfoScreen.scrollView.tap({x: 1, y: 1}); + await ChannelInfoScreen.scrollView.scroll(100, 'down'); await ChannelInfoScreen.editChannelOption.tap(); return this.toBeVisible(); diff --git a/detox/e2e/support/ui/screen/login.ts b/detox/e2e/support/ui/screen/login.ts index 6a63024d995..2d212f6fbfd 100644 --- a/detox/e2e/support/ui/screen/login.ts +++ b/detox/e2e/support/ui/screen/login.ts @@ -60,9 +60,19 @@ class LoginScreen { login = async (user: any = {}) => { await this.toBeVisible(); - await this.usernameInput.replaceText(user.username); - await this.passwordInput.replaceText(user.password); - await this.signinButton.tap(); + await this.usernameInput.typeText(user.newUser.email); + await this.passwordInput.typeText(`${user.newUser.password}\n`); + + // await this.signinButton.tap(); + await wait(timeouts.FOUR_SEC); + }; + + loginAsAdmin = async (user: any = {}) => { + await this.toBeVisible(); + await this.usernameInput.typeText(user.username); + await this.passwordInput.typeText(`${user.password}\n`); + + // await this.signinButton.tap(); await wait(timeouts.ONE_SEC); }; } diff --git a/detox/e2e/support/ui/screen/server.ts b/detox/e2e/support/ui/screen/server.ts index 4bb74c2caf4..71e5f9cd74a 100644 --- a/detox/e2e/support/ui/screen/server.ts +++ b/detox/e2e/support/ui/screen/server.ts @@ -20,6 +20,8 @@ class ServerScreen { displayHelp: 'server_form.display_help', connectButton: 'server_form.connect.button', connectButtonDisabled: 'server_form.connect.button.disabled', + usernameInput: 'login_form.username.input', + usernameInputError: 'login_form.username.input.error', }; serverScreen = element(by.id(this.testID.serverScreen)); @@ -35,6 +37,7 @@ class ServerScreen { displayHelp = element(by.id(this.testID.displayHelp)); connectButton = element(by.id(this.testID.connectButton)); connectButtonDisabled = element(by.id(this.testID.connectButtonDisabled)); + usernameInput = element(by.id(this.testID.usernameInput)); toBeVisible = async () => { await waitFor(this.serverScreen).toExist().withTimeout(timeouts.TEN_SEC); @@ -53,13 +56,18 @@ class ServerScreen { } if (isIos()) { await this.tapConnectButton(); - - if (serverUrl.includes('127.0.0.1')) { - // # Tap alert okay button - await waitFor(Alert.okayButton).toExist().withTimeout(timeouts.TEN_SEC); - await Alert.okayButton.tap(); + if (serverUrl.includes('127.0.0.1') || !process.env.CI) { + try { + // # Tap alert okay button + await waitFor(Alert.okayButton).toExist().withTimeout(timeouts.TEN_SEC); + await Alert.okayButton.tap(); + } catch (error) { + /* eslint-disable no-console */ + console.log('Alert button did not appear!'); + } } } + await waitFor(this.usernameInput).toExist().withTimeout(timeouts.ONE_SEC); }; close = async () => { diff --git a/detox/e2e/test/channels/convert_to_private_channel.e2e.ts b/detox/e2e/test/channels/convert_to_private_channel.e2e.ts index 7579266ff2e..cacee2eee08 100644 --- a/detox/e2e/test/channels/convert_to_private_channel.e2e.ts +++ b/detox/e2e/test/channels/convert_to_private_channel.e2e.ts @@ -26,7 +26,7 @@ describe('Channels - Convert to Private Channel', () => { beforeAll(async () => { // # Log in to server as admin await ServerScreen.connectToServer(siteOneUrl, siteOneDisplayName); - await LoginScreen.login(getAdminAccount()); + await LoginScreen.loginAsAdmin(getAdminAccount()); }); beforeEach(async () => { diff --git a/detox/e2e/test/server_login/login_by_email.e2e.ts b/detox/e2e/test/server_login/login_by_email.e2e.ts index 21323e0989b..e58704a592b 100644 --- a/detox/e2e/test/server_login/login_by_email.e2e.ts +++ b/detox/e2e/test/server_login/login_by_email.e2e.ts @@ -60,15 +60,15 @@ describe('Server Login - Login by Email', () => { it('MM-T4677_2 - should show disabled signin button on empty username or password', async () => { // # Log in with empty username and non-empty password - await usernameInput.replaceText(''); - await passwordInput.replaceText('password'); + await usernameInput.clearText(); + await passwordInput.typeText('password'); // * Verify signin button is disabled await expect(signinButtonDisabled).toBeVisible(); // # Log in with non-empty username and empty password - await usernameInput.replaceText('username'); - await passwordInput.replaceText(''); + await usernameInput.typeText('username'); + await passwordInput.clearText(); // * Verify signin button is disabled await expect(signinButtonDisabled).toBeVisible(); @@ -76,8 +76,8 @@ describe('Server Login - Login by Email', () => { it('MM-T4677_3 - should show incorrect combination error on incorrect credentials', async () => { // # Log in with incorrect credentials - await usernameInput.replaceText('username'); - await passwordInput.replaceText('password'); + await usernameInput.typeText('username'); + await passwordInput.typeText('password'); await signinButton.tap(); // * Verify incorrect combination error @@ -87,8 +87,8 @@ describe('Server Login - Login by Email', () => { it('MM-T4677_4 - should show channel list screen on successful login', async () => { // # Log in to server with correct credentials const {team, user} = await Setup.apiInit(siteOneUrl); - await usernameInput.replaceText(user.username); - await passwordInput.replaceText(user.password); + await usernameInput.typeText(user.newUser.username); + await passwordInput.typeText(user.newUser.password); await signinButton.tap(); // * Verify on channel list screen and channel list header shows team display name and server display name diff --git a/detox/e2e/test/teams/invite_people.e2e.ts b/detox/e2e/test/teams/invite_people.e2e.ts index c74dfef7cc0..2edaf751d54 100644 --- a/detox/e2e/test/teams/invite_people.e2e.ts +++ b/detox/e2e/test/teams/invite_people.e2e.ts @@ -202,9 +202,6 @@ describe('Teams - Invite', () => { it('MM-T5365 - should handle both sent and not sent invites', async () => { const {user: testUser2} = await User.apiCreateUser(siteOneUrl, {prefix: 'i'}); - const username1 = ` @${testUser1.username}`; - const username2 = ` @${testUser2.username}`; - // # Search for an existent user await Invite.searchBarInput.replaceText(testUser2.username); @@ -218,31 +215,31 @@ describe('Teams - Invite', () => { await expect(Invite.getSelectedItem(testUser2.id)).toBeVisible(); // # Search for a existent user already in team - await Invite.searchBarInput.replaceText(testUser1.username); + await Invite.searchBarInput.replaceText(testUser.username); // # Wait for user item in search list - await waitFor(Invite.getSearchListUserItem(testUser1.id)).toExist().withTimeout(timeouts.TWO_SEC); + await waitFor(Invite.getSearchListUserItem(testUser.id)).toExist().withTimeout(timeouts.TWO_SEC); // # Select user item - await Invite.getSearchListUserItem(testUser1.id).tap(); + await Invite.getSearchListUserItem(testUser.id).tap(); // * Validate user is added to selected items - await expect(Invite.getSelectedItem(testUser1.id)).toBeVisible(); + await expect(Invite.getSelectedItem(testUser.id)).toBeVisible(); // # Send invitation await Invite.sendButton.tap(); // * Validate summary - await waitFor(Invite.screenSummary).toBeVisible().withTimeout(timeouts.TEN_SEC); + waitFor(Invite.screenSummary).toBeVisible(); // * Validate summary report not sent await expect(Invite.getSummaryReportNotSent()).toBeVisible(); - await expect(Invite.getSummaryReportUserItem(testUser1.id)).toBeVisible(); - await expect(Invite.getSummaryReportUserItemText(testUser1.id)).toHaveText(username1); + await expect(Invite.getSummaryReportUserItem(testUser.id)).toBeVisible(); + await expect(Invite.getSummaryReportUserItemText(testUser.id)).toBeVisible(); // * Validate summary report sent - await waitFor(Invite.getSummaryReportSent()).toBeVisible().withTimeout(timeouts.TEN_SEC); + waitFor(Invite.getSummaryReportSent()).toBeVisible(); await expect(Invite.getSummaryReportUserItem(testUser2.id)).toBeVisible(); - await expect(Invite.getSummaryReportUserItemText(testUser2.id)).toHaveText(username2); + await expect(Invite.getSummaryReportUserItemText(testUser2.id)).toBeVisible(); }); }); diff --git a/detox/save_report.js b/detox/save_report.js index a9803b08944..2066fab7b9f 100644 --- a/detox/save_report.js +++ b/detox/save_report.js @@ -31,6 +31,7 @@ * - TYPE=[type], e.g. "MASTER", "PR", "RELEASE", "GEKIDOU" */ +const fs = require('fs'); const os = require('os'); const path = require('path'); @@ -96,7 +97,7 @@ const saveReport = async () => { // Merge all XML reports into one single XML report const platform = process.env.IOS === 'true' ? 'ios' : 'android'; const combinedFilePath = `${ARTIFACTS_DIR}/${platform}-combined.xml`; - await mergeFiles(path.join(__dirname, combinedFilePath), [`${ARTIFACTS_DIR}/${platform}-junit*.xml`]); + await mergeFiles(path.join(__dirname, combinedFilePath), [`${ARTIFACTS_DIR}/ios-results*/${platform}-junit*.xml`]); console.log(`Merged, check ${combinedFilePath}`); // Read XML from a file @@ -112,9 +113,23 @@ const saveReport = async () => { // Generate jest-stare report const jestStareOutputDir = path.join(__dirname, `${ARTIFACTS_DIR}/jest-stare`); const jestStareCombinedFilePath = `${jestStareOutputDir}/${platform}-combined.json`; - await mergeJestStareJsonFiles(jestStareCombinedFilePath, [`${ARTIFACTS_DIR}/jest-stare/${platform}-data*.json`]); + if (!fs.existsSync(jestStareOutputDir)) { + fs.mkdirSync(jestStareOutputDir, {recursive: true}); + } + + // 'ios-results-*' is the path in CI where the parallel detox jobs save artifacts + await mergeJestStareJsonFiles(jestStareCombinedFilePath, [`${ARTIFACTS_DIR}/ios-results*/jest-stare/${platform}-data*.json`]); generateJestStareHtmlReport(jestStareOutputDir, `${platform}-report.html`, jestStareCombinedFilePath); + if (process.env.CI) { + // Delete folders starting with "iOS-results-" only in CI environment + const entries = fs.readdirSync(ARTIFACTS_DIR, {withFileTypes: true}); + for (const entry of entries) { + if (entry.isDirectory() && entry.name.startsWith('ios-results-')) { + fs.rmSync(path.join(ARTIFACTS_DIR, entry.name), {recursive: true}); + } + } + } const result = await saveArtifacts(); if (result && result.success) { console.log('Successfully uploaded artifacts to S3:', result.reportLink); From 442f5dfb735b6731d21a9ea1db5b7d29bfe6d4ae Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 08:03:26 +0530 Subject: [PATCH 107/362] brew link overwrite python@3.11 --- .github/actions/prepare-ios-build/action.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index a85e219a07b..581a0bdd636 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -11,6 +11,7 @@ runs: run: | echo "::group::install-os-deps" brew install --overwrite python@3.12 + brew link --overwrite python@3.11 brew install watchman echo "::endgroup::" From 63b6104456c105f6100200135f1de8630b0a0723 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 08:24:23 +0530 Subject: [PATCH 108/362] brew link overwrite python@3.11 --- .github/actions/prepare-ios-build/action.yaml | 1 + detox/e2e/support/ui/screen/login.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index 581a0bdd636..cb2f9450238 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -11,6 +11,7 @@ runs: run: | echo "::group::install-os-deps" brew install --overwrite python@3.12 + rm '/usr/local/bin/2to3-3.11' brew link --overwrite python@3.11 brew install watchman echo "::endgroup::" diff --git a/detox/e2e/support/ui/screen/login.ts b/detox/e2e/support/ui/screen/login.ts index 2d212f6fbfd..0c802d3e090 100644 --- a/detox/e2e/support/ui/screen/login.ts +++ b/detox/e2e/support/ui/screen/login.ts @@ -60,7 +60,7 @@ class LoginScreen { login = async (user: any = {}) => { await this.toBeVisible(); - await this.usernameInput.typeText(user.newUser.email); + await this.usernameInput.typeText(`${user.newUser.email}\n`); await this.passwordInput.typeText(`${user.newUser.password}\n`); // await this.signinButton.tap(); From 1e089d2bc2c773f69059aa009bddad2cc6b62ab7 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 08:25:03 +0530 Subject: [PATCH 109/362] install watchman@2024.01.22.00_1 --- .github/actions/prepare-ios-build/action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index cb2f9450238..c5766cd17e7 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -13,7 +13,7 @@ runs: brew install --overwrite python@3.12 rm '/usr/local/bin/2to3-3.11' brew link --overwrite python@3.11 - brew install watchman + brew install watchman@2024.01.22.00_1 echo "::endgroup::" - name: ci/prepare-mobile-build From 10ed9244ce20f634048241dd15d908453e4f554b Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 08:34:07 +0530 Subject: [PATCH 110/362] brew link --overwrite python@3.11 --- .github/actions/prepare-ios-build/action.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index c5766cd17e7..ae2d39ff6ed 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -12,8 +12,9 @@ runs: echo "::group::install-os-deps" brew install --overwrite python@3.12 rm '/usr/local/bin/2to3-3.11' + brew unlink python@3.11 || true brew link --overwrite python@3.11 - brew install watchman@2024.01.22.00_1 + brew install watchman echo "::endgroup::" - name: ci/prepare-mobile-build From 20e721dfd5760744f6d7f3181dc8468f34d831c1 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 09:00:42 +0530 Subject: [PATCH 111/362] cache deps and cache app --- .github/actions/prepare-ios-build/action.yaml | 16 +++++++++++ .../actions/prepare-mobile-build/action.yaml | 8 ++++++ .github/actions/prepare-node-deps/action.yaml | 8 ++++++ .github/workflows/e2e-detox.yml | 28 +++++++++++++++++-- 4 files changed, 58 insertions(+), 2 deletions(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index ae2d39ff6ed..80c9c9d0038 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -17,6 +17,14 @@ runs: brew install watchman echo "::endgroup::" + - name: Cache Homebrew + uses: actions/cache@v3 + with: + path: ~/Library/Caches/Homebrew + key: ${{ runner.os }}-homebrew-${{ hashFiles('**/Brewfile') }} + restore-keys: | + ${{ runner.os }}-homebrew- + - name: ci/prepare-mobile-build uses: ./.github/actions/prepare-mobile-build @@ -27,3 +35,11 @@ runs: npm run ios-gems npm run pod-install echo "::endgroup::" + + - name: Cache Pods + uses: actions/cache@v3 + with: + path: Pods + key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }} + restore-keys: | + ${{ runner.os }}-pods- diff --git a/.github/actions/prepare-mobile-build/action.yaml b/.github/actions/prepare-mobile-build/action.yaml index 5fdccce0d00..6133be0a886 100644 --- a/.github/actions/prepare-mobile-build/action.yaml +++ b/.github/actions/prepare-mobile-build/action.yaml @@ -15,5 +15,13 @@ runs: echo "::endgroup::" working-directory: ./fastlane + - name: Cache Ruby gems + uses: actions/cache@v3 + with: + path: vendor/bundle + key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }} + restore-keys: | + ${{ runner.os }}-gems- + - name: ci/prepare-node-deps uses: ./.github/actions/prepare-node-deps diff --git a/.github/actions/prepare-node-deps/action.yaml b/.github/actions/prepare-node-deps/action.yaml index bb621a052da..e6f574908c5 100644 --- a/.github/actions/prepare-node-deps/action.yaml +++ b/.github/actions/prepare-node-deps/action.yaml @@ -21,6 +21,14 @@ runs: node node_modules/\@sentry/cli/scripts/install.js echo "::endgroup::" + - name: Cache Node.js modules + uses: actions/cache@v3 + with: + path: ~/.npm + key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.OS }}-node- + - name: ci/patch-npm-dependencies shell: bash run: | diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 43c9d6b20f8..a6dd0ec9133 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -51,8 +51,32 @@ jobs: directory: detox/e2e search_path: test + cache-ios-build: + runs-on: macos-14-large + outputs: + cache-hit: ${{ steps.cache.outputs.cache-hit }} + steps: + - name: Checkout Repository + uses: actions/checkout@v3 + + - name: Cache iOS Build + id: cache + uses: actions/cache@v3 + with: + path: Mattermost-simulator-x86_64.app.zip + key: ${{ runner.os }}-ios-build-${{ hashFiles('iOS/**') }} + + - name: Upload iOS Simulator Build + if: steps.cache.outputs.cache-hit != 'true' + uses: actions/upload-artifact@v3 + with: + name: ios-build-simulator + path: Mattermost-simulator-x86_64.app.zip + build-ios-simulator: runs-on: macos-14-large + needs: cache-ios-build + if: ${{ needs.cache-ios-build.outputs.cache-hit != 'true' || (github.event_name == 'pull_request' && contains(github.event.pull_request.head.ref, 'iOS')) }} steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -99,9 +123,9 @@ jobs: brew install applesimutils - name: Download iOS Simulator Build - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: - name: ios-build-simulator-${{ github.run_id }} + name: ios-build-simulator path: mobile-artifacts - name: Unzip iOS Simulator Build From 75f2212e24da7613cf45355e171e8aa9362a1f0e Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 09:09:57 +0530 Subject: [PATCH 112/362] update actions from v3 to v4 --- .github/actions/prepare-ios-build/action.yaml | 4 ++-- .github/actions/prepare-mobile-build/action.yaml | 2 +- .github/actions/prepare-node-deps/action.yaml | 2 +- .github/workflows/build-android-beta.yml | 6 +++--- .github/workflows/build-android-release.yml | 6 +++--- .github/workflows/build-ios-beta.yml | 10 +++++----- .github/workflows/build-ios-release.yml | 10 +++++----- .github/workflows/build-pr.yml | 10 +++++----- .github/workflows/ci.yml | 2 +- .github/workflows/e2e-detox.yml | 4 ++-- .github/workflows/github-release.yml | 12 ++++++------ 11 files changed, 34 insertions(+), 34 deletions(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index 80c9c9d0038..dadd05d16a3 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -18,7 +18,7 @@ runs: echo "::endgroup::" - name: Cache Homebrew - uses: actions/cache@v3 + uses: actions/cache@cd7d8d697e10461458bc61a30d094dc601a8b017 # 4.1.3 with: path: ~/Library/Caches/Homebrew key: ${{ runner.os }}-homebrew-${{ hashFiles('**/Brewfile') }} @@ -37,7 +37,7 @@ runs: echo "::endgroup::" - name: Cache Pods - uses: actions/cache@v3 + uses: actions/cache@cd7d8d697e10461458bc61a30d094dc601a8b017 # 4.1.3 with: path: Pods key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }} diff --git a/.github/actions/prepare-mobile-build/action.yaml b/.github/actions/prepare-mobile-build/action.yaml index 6133be0a886..7b132a6ab6e 100644 --- a/.github/actions/prepare-mobile-build/action.yaml +++ b/.github/actions/prepare-mobile-build/action.yaml @@ -16,7 +16,7 @@ runs: working-directory: ./fastlane - name: Cache Ruby gems - uses: actions/cache@v3 + uses: actions/cache@cd7d8d697e10461458bc61a30d094dc601a8b017 # 4.1.3 with: path: vendor/bundle key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }} diff --git a/.github/actions/prepare-node-deps/action.yaml b/.github/actions/prepare-node-deps/action.yaml index e6f574908c5..bc7e4f75292 100644 --- a/.github/actions/prepare-node-deps/action.yaml +++ b/.github/actions/prepare-node-deps/action.yaml @@ -22,7 +22,7 @@ runs: echo "::endgroup::" - name: Cache Node.js modules - uses: actions/cache@v3 + uses: actions/cache@cd7d8d697e10461458bc61a30d094dc601a8b017 # 4.1.3 with: path: ~/.npm key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }} diff --git a/.github/workflows/build-android-beta.yml b/.github/workflows/build-android-beta.yml index 2f6bfaa6e74..2b9f80912e5 100644 --- a/.github/workflows/build-android-beta.yml +++ b/.github/workflows/build-android-beta.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ci/test uses: ./.github/actions/test @@ -26,7 +26,7 @@ jobs: - test steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ci/prepare-android-build uses: ./.github/actions/prepare-android-build @@ -54,7 +54,7 @@ jobs: working-directory: ./fastlane - name: ci/upload-android-beta-build - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: android-build-beta-${{ github.run_id }} path: "*.apk" diff --git a/.github/workflows/build-android-release.yml b/.github/workflows/build-android-release.yml index 0dbdf6dfa72..d570d66c2d2 100644 --- a/.github/workflows/build-android-release.yml +++ b/.github/workflows/build-android-release.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ci/test uses: ./.github/actions/test @@ -26,7 +26,7 @@ jobs: - test steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ci/prepare-android-build uses: ./.github/actions/prepare-android-build @@ -54,7 +54,7 @@ jobs: working-directory: ./fastlane - name: ci/upload-android-release-build - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: android-build-release-${{ github.run_id }} path: "*.apk" diff --git a/.github/workflows/build-ios-beta.yml b/.github/workflows/build-ios-beta.yml index f08c815d438..4c71a3108fc 100644 --- a/.github/workflows/build-ios-beta.yml +++ b/.github/workflows/build-ios-beta.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ci/test uses: ./.github/actions/test @@ -28,7 +28,7 @@ jobs: - test steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ci/prepare-ios-build uses: ./.github/actions/prepare-ios-build @@ -44,7 +44,7 @@ jobs: working-directory: ./fastlane - name: ci/upload-ios-pr-simulator - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: ios-build-simulator-${{ github.run_id }} path: Mattermost-simulator-x86_64.app.zip @@ -56,7 +56,7 @@ jobs: - test steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ci/output-ssh-private-key shell: bash @@ -93,7 +93,7 @@ jobs: working-directory: ./fastlane - name: ci/upload-ios-beta-build - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: ios-build-beta-${{ github.run_id }} path: "*.ipa" diff --git a/.github/workflows/build-ios-release.yml b/.github/workflows/build-ios-release.yml index 33034450b6f..0143b5c8962 100644 --- a/.github/workflows/build-ios-release.yml +++ b/.github/workflows/build-ios-release.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ci/test uses: ./.github/actions/test @@ -28,7 +28,7 @@ jobs: - test steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ci/prepare-ios-build uses: ./.github/actions/prepare-ios-build @@ -65,7 +65,7 @@ jobs: working-directory: ./fastlane - name: ci/upload-ios-release-build - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: ios-build-release-${{ github.run_id }} path: "*.ipa" @@ -77,7 +77,7 @@ jobs: - test steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ci/prepare-ios-build uses: ./.github/actions/prepare-ios-build @@ -93,7 +93,7 @@ jobs: working-directory: ./fastlane - name: ci/upload-ios-pr-simulator - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: ios-build-simulator-${{ github.run_id }} path: Mattermost-simulator-x86_64.app.zip diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml index 1dbfc5badcb..e8b01b65de1 100644 --- a/.github/workflows/build-pr.yml +++ b/.github/workflows/build-pr.yml @@ -15,7 +15,7 @@ jobs: if: ${{ github.event.label.name == 'Build Apps for PR' || github.event.label.name == 'Build App for iOS' || github.event.label.name == 'Build App for Android' }} steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: ref: ${{ github.event.pull_request.head.sha }} - name: ci/test @@ -28,7 +28,7 @@ jobs: - test steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: ref: ${{ github.event.pull_request.head.sha }} @@ -60,7 +60,7 @@ jobs: working-directory: ./fastlane - name: ci/upload-ios-pr-build - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: ios-build-pr-${{ github.run_id }} path: "*.ipa" @@ -72,7 +72,7 @@ jobs: - test steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: ref: ${{ github.event.pull_request.head.sha }} @@ -94,7 +94,7 @@ jobs: working-directory: ./fastlane - name: ci/upload-android-pr-build - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: android-build-pr-${{ github.run_id }} path: "*.apk" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1f0b9350383..57e9448c263 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,6 +16,6 @@ jobs: runs-on: ubuntu-22.04 steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ci/test uses: ./.github/actions/test diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index a6dd0ec9133..75ae350a28a 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -57,11 +57,11 @@ jobs: cache-hit: ${{ steps.cache.outputs.cache-hit }} steps: - name: Checkout Repository - uses: actions/checkout@v3 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Cache iOS Build id: cache - uses: actions/cache@v3 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: Mattermost-simulator-x86_64.app.zip key: ${{ runner.os }}-ios-build-${{ hashFiles('iOS/**') }} diff --git a/.github/workflows/github-release.yml b/.github/workflows/github-release.yml index a888ad588a5..4af6d839cea 100644 --- a/.github/workflows/github-release.yml +++ b/.github/workflows/github-release.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ci/test uses: ./.github/actions/test @@ -20,7 +20,7 @@ jobs: - test steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ci/prepare-ios-build uses: ./.github/actions/prepare-ios-build @@ -42,7 +42,7 @@ jobs: working-directory: ./fastlane - name: ci/upload-ios-unsigned - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: path: Mattermost-unsigned.ipa name: Mattermost-unsigned.ipa @@ -53,7 +53,7 @@ jobs: - test steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: ci/prepare-android-build uses: ./.github/actions/prepare-android-build @@ -68,7 +68,7 @@ jobs: working-directory: ./fastlane - name: ci/upload-android-unsigned-build - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: path: Mattermost-unsigned.apk name: Mattermost-unsigned.apk @@ -80,7 +80,7 @@ jobs: - build-android-unsigned steps: - name: ci/checkout-repo - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - uses: ruby/setup-ruby@22fdc77bf4148f810455b226c90fb81b5cbc00a7 # v1.171.0 From 66b5d1d4a0c99a9cb930696e74c221b681d216d6 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 09:24:07 +0530 Subject: [PATCH 113/362] fix cache step --- .github/actions/prepare-ios-build/action.yaml | 4 +- .../actions/prepare-mobile-build/action.yaml | 2 +- .github/workflows/e2e-detox.yml | 2 +- detox/e2e/support/ui/screen/server.ts | 4 +- detox/e2e/test/account/about.e2e.ts | 1 - detox/e2e/test/autocomplete/edit_post.e2e.ts | 4 +- detox/package-lock.json | 8182 +---------------- detox/package.json | 5 +- detox/utils/report.js | 2 +- package-lock.json | 117 +- package.json | 2 +- 11 files changed, 245 insertions(+), 8080 deletions(-) diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index dadd05d16a3..710b71325e8 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -18,7 +18,7 @@ runs: echo "::endgroup::" - name: Cache Homebrew - uses: actions/cache@cd7d8d697e10461458bc61a30d094dc601a8b017 # 4.1.3 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: ~/Library/Caches/Homebrew key: ${{ runner.os }}-homebrew-${{ hashFiles('**/Brewfile') }} @@ -37,7 +37,7 @@ runs: echo "::endgroup::" - name: Cache Pods - uses: actions/cache@cd7d8d697e10461458bc61a30d094dc601a8b017 # 4.1.3 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: Pods key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }} diff --git a/.github/actions/prepare-mobile-build/action.yaml b/.github/actions/prepare-mobile-build/action.yaml index 7b132a6ab6e..a16c6ca2df9 100644 --- a/.github/actions/prepare-mobile-build/action.yaml +++ b/.github/actions/prepare-mobile-build/action.yaml @@ -16,7 +16,7 @@ runs: working-directory: ./fastlane - name: Cache Ruby gems - uses: actions/cache@cd7d8d697e10461458bc61a30d094dc601a8b017 # 4.1.3 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: vendor/bundle key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }} diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 75ae350a28a..b7bd6b9d8fb 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -68,7 +68,7 @@ jobs: - name: Upload iOS Simulator Build if: steps.cache.outputs.cache-hit != 'true' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: ios-build-simulator path: Mattermost-simulator-x86_64.app.zip diff --git a/detox/e2e/support/ui/screen/server.ts b/detox/e2e/support/ui/screen/server.ts index 71e5f9cd74a..119e9417243 100644 --- a/detox/e2e/support/ui/screen/server.ts +++ b/detox/e2e/support/ui/screen/server.ts @@ -48,9 +48,9 @@ class ServerScreen { connectToServer = async (serverUrl: string, serverDisplayName: string) => { await this.toBeVisible(); - await this.serverUrlInput.replaceText(serverUrl); + await this.serverUrlInput.typeText(serverUrl); await this.serverUrlInput.tapReturnKey(); - await this.serverDisplayNameInput.replaceText(serverDisplayName); + await this.serverDisplayNameInput.typeText(serverDisplayName); if (isAndroid()) { await this.serverDisplayNameInput.tapReturnKey(); } diff --git a/detox/e2e/test/account/about.e2e.ts b/detox/e2e/test/account/about.e2e.ts index b91ecf1cab5..fe99daebaed 100644 --- a/detox/e2e/test/account/about.e2e.ts +++ b/detox/e2e/test/account/about.e2e.ts @@ -69,7 +69,6 @@ describe('Account - Settings - About', () => { await expect(AboutScreen.databaseSchemaVersionTitle).toHaveText('Database Schema Version:'); await expect(AboutScreen.databaseSchemaVersionValue).toBeVisible(); await expect(AboutScreen.copyInfoButton).toBeVisible(); - await expect(AboutScreen.copyInfoButton).toHaveText('Copy info'); if (isLicensed) { await expect(AboutScreen.licensee).toBeVisible(); } else { diff --git a/detox/e2e/test/autocomplete/edit_post.e2e.ts b/detox/e2e/test/autocomplete/edit_post.e2e.ts index fa81bd8f306..51a5af981da 100644 --- a/detox/e2e/test/autocomplete/edit_post.e2e.ts +++ b/detox/e2e/test/autocomplete/edit_post.e2e.ts @@ -67,7 +67,7 @@ describe('Autocomplete - Edit Post', () => { await expect(Autocomplete.sectionAtMentionList).not.toBeVisible(); // # Type in "@" to activate at-mention autocomplete - await EditPostScreen.messageInput.typeText('@'); + await EditPostScreen.messageInput.typeText(' @'); // * Verify at-mention list is displayed await expect(Autocomplete.sectionAtMentionList).toBeVisible(); @@ -89,7 +89,7 @@ describe('Autocomplete - Edit Post', () => { await expect(Autocomplete.flatEmojiSuggestionList).not.toBeVisible(); // # Type in ":" followed by 2 characters to activate emoji suggestion autocomplete - await EditPostScreen.messageInput.typeText(':sm'); + await EditPostScreen.messageInput.typeText(':smil'); // * Verify emoji suggestion list is displayed await expect(Autocomplete.flatEmojiSuggestionList).toBeVisible(); diff --git a/detox/package-lock.json b/detox/package-lock.json index 0448a8bcc3e..a73341c5bb4 100644 --- a/detox/package-lock.json +++ b/detox/package-lock.json @@ -1,6 +1,6 @@ { "name": "mattermost-mobile-e2e", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -22,7 +22,7 @@ "babel-plugin-module-resolver": "5.0.0", "client-oauth2": "4.3.3", "deepmerge": "4.3.1", - "detox": "20.11.4", + "detox": "20.19.3", "form-data": "4.0.0", "jest": "29.7.0", "jest-circus": "29.7.0", @@ -2672,6 +2672,12 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@flatten-js/interval-tree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@flatten-js/interval-tree/-/interval-tree-1.1.2.tgz", + "integrity": "sha512-OwLoV9E/XM6b7bes2rSFnGNjyRy7vcoIHFTnmBR2WAaZTf0Fe4EX4GdA65vU1KgFAasti7iRSg2dZfYd1Zt00Q==", + "dev": true + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -4898,6 +4904,33 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/bunyamin": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/bunyamin/-/bunyamin-1.5.2.tgz", + "integrity": "sha512-Xp2nfqk33zt3nX90OSTkLVOc5N+1zdR3MWvfLHoIrm3cGRkdxPTPYB9CCgrDV8oum5rbghJjAbmXFXOrRXvMtg==", + "dev": true, + "dependencies": { + "@flatten-js/interval-tree": "^1.1.2", + "multi-sort-stream": "^1.0.4", + "stream-json": "^1.7.5", + "trace-event-lib": "^1.3.1" + }, + "engines": { + "node": ">=14.18.2" + }, + "peerDependencies": { + "@types/bunyan": "^1.8.8", + "bunyan": "^1.8.15 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@types/bunyan": { + "optional": true + }, + "bunyan": { + "optional": true + } + } + }, "node_modules/bunyan": { "version": "1.8.15", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", @@ -5425,9 +5458,9 @@ } }, "node_modules/detox": { - "version": "20.11.4", - "resolved": "https://registry.npmjs.org/detox/-/detox-20.11.4.tgz", - "integrity": "sha512-P48KAtK8qIDOxJKUl4q/syPkuHz67kAeFlNodBZg5aO4hJiH+RsbEkQfJSYkTCeZV800EcmUQwZK2M5amLoYaw==", + "version": "20.19.3", + "resolved": "https://registry.npmjs.org/detox/-/detox-20.19.3.tgz", + "integrity": "sha512-5axCZVfVNB4SgKej4ONIAVXkPgvWXd5ULSTemmWGA8oLRmlZpELrhBXgAcTP4MEY/tArG1v0Cx4NWyoda/Lyiw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -5443,6 +5476,7 @@ "funpermaproxy": "^1.1.0", "glob": "^8.0.3", "ini": "^1.3.4", + "jest-environment-emit": "^1.0.5", "json-cycle": "^1.3.0", "lodash": "^4.17.11", "multi-sort-stream": "^1.0.3", @@ -5470,7 +5504,7 @@ "detox": "local-cli/cli.js" }, "engines": { - "node": ">=14.5.0" + "node": ">=18" }, "peerDependencies": { "jest": "29.x.x || 28.x.x || ^27.2.5" @@ -5830,6 +5864,15 @@ "node": ">= 8" } }, + "node_modules/exeunt": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/exeunt/-/exeunt-1.1.0.tgz", + "integrity": "sha512-dd++Yn/0Fp+gtJ04YHov7MeAii+LFivJc6KqnJNfplzLVUkUDrfKoQDTLlCgzcW15vY5hKlHasWeIsQJ8agHsw==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -7112,6 +7155,70 @@ "node": ">=8" } }, + "node_modules/jest-environment-emit": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/jest-environment-emit/-/jest-environment-emit-1.0.5.tgz", + "integrity": "sha512-OsQ08AhYxkkyDBTIow+9ogNmJheQIGWQKp0Nku+1ToLWjAj2Pd6LmypN8HgUIqYHs4HFcqkQ25kaf1qExmoZpg==", + "dev": true, + "dependencies": { + "bunyamin": "^1.5.0", + "bunyan": "^2.0.5", + "bunyan-debug-stream": "^3.1.0", + "funpermaproxy": "^1.1.0", + "lodash.merge": "^4.6.2", + "node-ipc": "9.2.1", + "strip-ansi": "^6.0.0", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16.14.0" + }, + "peerDependencies": { + "@jest/environment": ">=27.2.5", + "@jest/types": ">=27.2.5", + "jest": ">=27.2.5", + "jest-environment-jsdom": ">=27.2.5", + "jest-environment-node": ">=27.2.5" + }, + "peerDependenciesMeta": { + "@jest/environment": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "jest-environment-node": { + "optional": true + } + } + }, + "node_modules/jest-environment-emit/node_modules/bunyan": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-2.0.5.tgz", + "integrity": "sha512-Jvl74TdxCN6rSP9W1I6+UOUtwslTDqsSFkDqZlFb/ilaSvQ+bZAnXT/GT97IZ5L+Vph0joPZPhxUyn6FLNmFAA==", + "dev": true, + "engines": [ + "node >=0.10.0" + ], + "dependencies": { + "exeunt": "1.1.0" + }, + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, "node_modules/jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", @@ -8512,6 +8619,12 @@ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -10718,8062 +10831,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@aws-crypto/crc32": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", - "dev": true, - "requires": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@aws-crypto/crc32c": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz", - "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==", - "dev": true, - "requires": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@aws-crypto/ie11-detection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", - "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", - "dev": true, - "requires": { - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@aws-crypto/sha1-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz", - "integrity": "sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==", - "dev": true, - "requires": { - "@aws-crypto/ie11-detection": "^3.0.0", - "@aws-crypto/supports-web-crypto": "^3.0.0", - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@aws-crypto/sha256-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", - "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", - "dev": true, - "requires": { - "@aws-crypto/ie11-detection": "^3.0.0", - "@aws-crypto/sha256-js": "^3.0.0", - "@aws-crypto/supports-web-crypto": "^3.0.0", - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@aws-crypto/sha256-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", - "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", - "dev": true, - "requires": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@aws-crypto/supports-web-crypto": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", - "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", - "dev": true, - "requires": { - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@aws-crypto/util": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", - "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", - "dev": true, - "requires": { - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@aws-sdk/client-s3": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.445.0.tgz", - "integrity": "sha512-2G+3MnO78irZRjlfkdvtlKRQ3yuOfrRMg8mztKpMw0q/9WHtwCcmaUUpl1bXwJ+BcNTVHopLQXdbzCeaxxI92w==", - "dev": true, - "requires": { - "@aws-crypto/sha1-browser": "3.0.0", - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.445.0", - "@aws-sdk/core": "3.445.0", - "@aws-sdk/credential-provider-node": "3.445.0", - "@aws-sdk/middleware-bucket-endpoint": "3.433.0", - "@aws-sdk/middleware-expect-continue": "3.433.0", - "@aws-sdk/middleware-flexible-checksums": "3.433.0", - "@aws-sdk/middleware-host-header": "3.433.0", - "@aws-sdk/middleware-location-constraint": "3.433.0", - "@aws-sdk/middleware-logger": "3.433.0", - "@aws-sdk/middleware-recursion-detection": "3.433.0", - "@aws-sdk/middleware-sdk-s3": "3.440.0", - "@aws-sdk/middleware-signing": "3.433.0", - "@aws-sdk/middleware-ssec": "3.433.0", - "@aws-sdk/middleware-user-agent": "3.438.0", - "@aws-sdk/region-config-resolver": "3.433.0", - "@aws-sdk/signature-v4-multi-region": "3.437.0", - "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.438.0", - "@aws-sdk/util-user-agent-browser": "3.433.0", - "@aws-sdk/util-user-agent-node": "3.437.0", - "@aws-sdk/xml-builder": "3.310.0", - "@smithy/config-resolver": "^2.0.16", - "@smithy/eventstream-serde-browser": "^2.0.12", - "@smithy/eventstream-serde-config-resolver": "^2.0.12", - "@smithy/eventstream-serde-node": "^2.0.12", - "@smithy/fetch-http-handler": "^2.2.4", - "@smithy/hash-blob-browser": "^2.0.12", - "@smithy/hash-node": "^2.0.12", - "@smithy/hash-stream-node": "^2.0.12", - "@smithy/invalid-dependency": "^2.0.12", - "@smithy/md5-js": "^2.0.12", - "@smithy/middleware-content-length": "^2.0.14", - "@smithy/middleware-endpoint": "^2.1.3", - "@smithy/middleware-retry": "^2.0.18", - "@smithy/middleware-serde": "^2.0.12", - "@smithy/middleware-stack": "^2.0.6", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/node-http-handler": "^2.1.8", - "@smithy/protocol-http": "^3.0.8", - "@smithy/smithy-client": "^2.1.12", - "@smithy/types": "^2.4.0", - "@smithy/url-parser": "^2.0.12", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.16", - "@smithy/util-defaults-mode-node": "^2.0.21", - "@smithy/util-endpoints": "^1.0.2", - "@smithy/util-retry": "^2.0.5", - "@smithy/util-stream": "^2.0.17", - "@smithy/util-utf8": "^2.0.0", - "@smithy/util-waiter": "^2.0.12", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/client-sso": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.445.0.tgz", - "integrity": "sha512-me4LvqNnu6kxi+sW7t0AgMv1Yi64ikas0x2+5jv23o6Csg32w0S0xOjCTKQYahOA5CMFunWvlkFIfxbqs+Uo7w==", - "dev": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.445.0", - "@aws-sdk/middleware-host-header": "3.433.0", - "@aws-sdk/middleware-logger": "3.433.0", - "@aws-sdk/middleware-recursion-detection": "3.433.0", - "@aws-sdk/middleware-user-agent": "3.438.0", - "@aws-sdk/region-config-resolver": "3.433.0", - "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.438.0", - "@aws-sdk/util-user-agent-browser": "3.433.0", - "@aws-sdk/util-user-agent-node": "3.437.0", - "@smithy/config-resolver": "^2.0.16", - "@smithy/fetch-http-handler": "^2.2.4", - "@smithy/hash-node": "^2.0.12", - "@smithy/invalid-dependency": "^2.0.12", - "@smithy/middleware-content-length": "^2.0.14", - "@smithy/middleware-endpoint": "^2.1.3", - "@smithy/middleware-retry": "^2.0.18", - "@smithy/middleware-serde": "^2.0.12", - "@smithy/middleware-stack": "^2.0.6", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/node-http-handler": "^2.1.8", - "@smithy/protocol-http": "^3.0.8", - "@smithy/smithy-client": "^2.1.12", - "@smithy/types": "^2.4.0", - "@smithy/url-parser": "^2.0.12", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.16", - "@smithy/util-defaults-mode-node": "^2.0.21", - "@smithy/util-endpoints": "^1.0.2", - "@smithy/util-retry": "^2.0.5", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/client-sts": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.445.0.tgz", - "integrity": "sha512-ogbdqrS8x9O5BTot826iLnTQ6i4/F5BSi/74gycneCxYmAnYnyUBNOWVnynv6XZiEWyDJQCU2UtMd52aNGW1GA==", - "dev": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.445.0", - "@aws-sdk/credential-provider-node": "3.445.0", - "@aws-sdk/middleware-host-header": "3.433.0", - "@aws-sdk/middleware-logger": "3.433.0", - "@aws-sdk/middleware-recursion-detection": "3.433.0", - "@aws-sdk/middleware-sdk-sts": "3.433.0", - "@aws-sdk/middleware-signing": "3.433.0", - "@aws-sdk/middleware-user-agent": "3.438.0", - "@aws-sdk/region-config-resolver": "3.433.0", - "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.438.0", - "@aws-sdk/util-user-agent-browser": "3.433.0", - "@aws-sdk/util-user-agent-node": "3.437.0", - "@smithy/config-resolver": "^2.0.16", - "@smithy/fetch-http-handler": "^2.2.4", - "@smithy/hash-node": "^2.0.12", - "@smithy/invalid-dependency": "^2.0.12", - "@smithy/middleware-content-length": "^2.0.14", - "@smithy/middleware-endpoint": "^2.1.3", - "@smithy/middleware-retry": "^2.0.18", - "@smithy/middleware-serde": "^2.0.12", - "@smithy/middleware-stack": "^2.0.6", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/node-http-handler": "^2.1.8", - "@smithy/protocol-http": "^3.0.8", - "@smithy/smithy-client": "^2.1.12", - "@smithy/types": "^2.4.0", - "@smithy/url-parser": "^2.0.12", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.16", - "@smithy/util-defaults-mode-node": "^2.0.21", - "@smithy/util-endpoints": "^1.0.2", - "@smithy/util-retry": "^2.0.5", - "@smithy/util-utf8": "^2.0.0", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/core": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.445.0.tgz", - "integrity": "sha512-6GYLElUG1QTOdmXG8zXa+Ull9IUeSeItKDYHKzHYfIkbsagMfYlf7wm9XIYlatjtgodNfZ3gPHAJfRyPmwKrsg==", - "dev": true, - "requires": { - "@smithy/smithy-client": "^2.1.12", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-env": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.433.0.tgz", - "integrity": "sha512-Vl7Qz5qYyxBurMn6hfSiNJeUHSqfVUlMt0C1Bds3tCkl3IzecRWwyBOlxtxO3VCrgVeW3HqswLzCvhAFzPH6nQ==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-ini": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.445.0.tgz", - "integrity": "sha512-R7IYSGjNZ5KKJwQJ2HNPemjpAMWvdce91i8w+/aHfqeGfTXrmYJu99PeGRyyBTKEumBaojyjTRvmO8HzS+/l7g==", - "dev": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.433.0", - "@aws-sdk/credential-provider-process": "3.433.0", - "@aws-sdk/credential-provider-sso": "3.445.0", - "@aws-sdk/credential-provider-web-identity": "3.433.0", - "@aws-sdk/types": "3.433.0", - "@smithy/credential-provider-imds": "^2.0.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-node": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.445.0.tgz", - "integrity": "sha512-zI4k4foSjQRKNEsouculRcz7IbLfuqdFxypDLYwn+qPNMqJwWJ7VxOOeBSPUpHFcd7CLSfbHN2JAhQ7M02gPTA==", - "dev": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.433.0", - "@aws-sdk/credential-provider-ini": "3.445.0", - "@aws-sdk/credential-provider-process": "3.433.0", - "@aws-sdk/credential-provider-sso": "3.445.0", - "@aws-sdk/credential-provider-web-identity": "3.433.0", - "@aws-sdk/types": "3.433.0", - "@smithy/credential-provider-imds": "^2.0.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-process": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.433.0.tgz", - "integrity": "sha512-W7FcGlQjio9Y/PepcZGRyl5Bpwb0uWU7qIUCh+u4+q2mW4D5ZngXg8V/opL9/I/p4tUH9VXZLyLGwyBSkdhL+A==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-sso": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.445.0.tgz", - "integrity": "sha512-gJz7kAiDecdhtApgXnxfZsXKsww8BnifDF9MAx9Dr4X6no47qYsCCS3XPuEyRiF9VebXvHOH0H260Zp3bVyniQ==", - "dev": true, - "requires": { - "@aws-sdk/client-sso": "3.445.0", - "@aws-sdk/token-providers": "3.438.0", - "@aws-sdk/types": "3.433.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-web-identity": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.433.0.tgz", - "integrity": "sha512-RlwjP1I5wO+aPpwyCp23Mk8nmRbRL33hqRASy73c4JA2z2YiRua+ryt6MalIxehhwQU6xvXUKulJnPG9VaMFZg==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/lib-storage": { - "version": "3.445.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.445.0.tgz", - "integrity": "sha512-sCP3lh71oMkx/B3+tSOGr81cff1Z1Yy5ejh5xa/YuH6OefQUFBM7/EC0CJiNfVXemh3D6O+biKETL+t2rAiZoQ==", - "dev": true, - "requires": { - "@smithy/abort-controller": "^2.0.1", - "@smithy/middleware-endpoint": "^2.1.3", - "@smithy/smithy-client": "^2.1.12", - "buffer": "5.6.0", - "events": "3.3.0", - "stream-browserify": "3.0.0", - "tslib": "^2.5.0" - }, - "dependencies": { - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - } - } - }, - "@aws-sdk/middleware-bucket-endpoint": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.433.0.tgz", - "integrity": "sha512-Lk1xIu2tWTRa1zDw5hCF1RrpWQYSodUhrS/q3oKz8IAoFqEy+lNaD5jx+fycuZb5EkE4IzWysT+8wVkd0mAnOg==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-arn-parser": "3.310.0", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/protocol-http": "^3.0.8", - "@smithy/types": "^2.4.0", - "@smithy/util-config-provider": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-expect-continue": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.433.0.tgz", - "integrity": "sha512-Uq2rPIsjz0CR2sulM/HyYr5WiqiefrSRLdwUZuA7opxFSfE808w5DBWSprHxbH3rbDSQR4nFiOiVYIH8Eth7nA==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-flexible-checksums": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.433.0.tgz", - "integrity": "sha512-Ptssx373+I7EzFUWjp/i/YiNFt6I6sDuRHz6DOUR9nmmRTlHHqmdcBXlJL2d9wwFxoBRCN8/PXGsTc/DJ4c95Q==", - "dev": true, - "requires": { - "@aws-crypto/crc32": "3.0.0", - "@aws-crypto/crc32c": "3.0.0", - "@aws-sdk/types": "3.433.0", - "@smithy/is-array-buffer": "^2.0.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/types": "^2.4.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-host-header": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.433.0.tgz", - "integrity": "sha512-mBTq3UWv1UzeHG+OfUQ2MB/5GEkt5LTKFaUqzL7ESwzW8XtpBgXnjZvIwu3Vcd3sEetMwijwaGiJhY0ae/YyaA==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-location-constraint": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.433.0.tgz", - "integrity": "sha512-2YD860TGntwZifIUbxm+lFnNJJhByR/RB/+fV1I8oGKg+XX2rZU+94pRfHXRywoZKlCA0L+LGDA1I56jxrB9sw==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-logger": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.433.0.tgz", - "integrity": "sha512-We346Fb5xGonTGVZC9Nvqtnqy74VJzYuTLLiuuftA5sbNzftBDy/22QCfvYSTOAl3bvif+dkDUzQY2ihc5PwOQ==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-recursion-detection": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.433.0.tgz", - "integrity": "sha512-HEvYC9PQlWY/ccUYtLvAlwwf1iCif2TSAmLNr3YTBRVa98x6jKL0hlCrHWYklFeqOGSKy6XhE+NGJMUII0/HaQ==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-sdk-s3": { - "version": "3.440.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.440.0.tgz", - "integrity": "sha512-DVTSr+82Z8jR9xTwDN3YHzxX7qvi0n96V92OfxvSRDq2BldCEx/KEL1orUZjw97SAXhINOlUWjRR7j4HpwWQtQ==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-arn-parser": "3.310.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/smithy-client": "^2.1.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-sdk-sts": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.433.0.tgz", - "integrity": "sha512-ORYbJnBejUyonFl5FwIqhvI3Cq6sAp9j+JpkKZtFNma9tFPdrhmYgfCeNH32H/wGTQV/tUoQ3luh0gA4cuk6DA==", - "dev": true, - "requires": { - "@aws-sdk/middleware-signing": "3.433.0", - "@aws-sdk/types": "3.433.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-signing": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.433.0.tgz", - "integrity": "sha512-jxPvt59NZo/epMNLNTu47ikmP8v0q217I6bQFGJG7JVFnfl36zDktMwGw+0xZR80qiK47/2BWrNpta61Zd2FxQ==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.4.0", - "@smithy/util-middleware": "^2.0.5", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-ssec": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.433.0.tgz", - "integrity": "sha512-2AMaPx0kYfCiekxoL7aqFqSSoA9du+yI4zefpQNLr+1cZOerYiDxdsZ4mbqStR1CVFaX6U6hrYokXzjInsvETw==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-user-agent": { - "version": "3.438.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.438.0.tgz", - "integrity": "sha512-a+xHT1wOxT6EA6YyLmrfaroKWOkwwyiktUfXKM0FsUutGzNi4fKhb5NZ2al58NsXzHgHFrasSDp+Lqbd/X2cEw==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.438.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/region-config-resolver": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.433.0.tgz", - "integrity": "sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==", - "dev": true, - "requires": { - "@smithy/node-config-provider": "^2.1.3", - "@smithy/types": "^2.4.0", - "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.5", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/signature-v4-multi-region": { - "version": "3.437.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.437.0.tgz", - "integrity": "sha512-MmrqudssOs87JgVg7HGVdvJws/t4kcOrJJd+975ki+DPeSoyK2U4zBDfDkJ+n0tFuZBs3sLwLh0QXE7BV28rRA==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/token-providers": { - "version": "3.438.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.438.0.tgz", - "integrity": "sha512-G2fUfTtU6/1ayYRMu0Pd9Ln4qYSvwJOWCqJMdkDgvXSwdgcOSOLsnAIk1AHGJDAvgLikdCzuyOsdJiexr9Vnww==", - "dev": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.433.0", - "@aws-sdk/middleware-logger": "3.433.0", - "@aws-sdk/middleware-recursion-detection": "3.433.0", - "@aws-sdk/middleware-user-agent": "3.438.0", - "@aws-sdk/region-config-resolver": "3.433.0", - "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.438.0", - "@aws-sdk/util-user-agent-browser": "3.433.0", - "@aws-sdk/util-user-agent-node": "3.437.0", - "@smithy/config-resolver": "^2.0.16", - "@smithy/fetch-http-handler": "^2.2.4", - "@smithy/hash-node": "^2.0.12", - "@smithy/invalid-dependency": "^2.0.12", - "@smithy/middleware-content-length": "^2.0.14", - "@smithy/middleware-endpoint": "^2.1.3", - "@smithy/middleware-retry": "^2.0.18", - "@smithy/middleware-serde": "^2.0.12", - "@smithy/middleware-stack": "^2.0.6", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/node-http-handler": "^2.1.8", - "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.8", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/smithy-client": "^2.1.12", - "@smithy/types": "^2.4.0", - "@smithy/url-parser": "^2.0.12", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.16", - "@smithy/util-defaults-mode-node": "^2.0.21", - "@smithy/util-endpoints": "^1.0.2", - "@smithy/util-retry": "^2.0.5", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/types": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.433.0.tgz", - "integrity": "sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-arn-parser": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.310.0.tgz", - "integrity": "sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-endpoints": { - "version": "3.438.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.438.0.tgz", - "integrity": "sha512-6VyPTq1kN3GWxwFt5DdZfOsr6cJZPLjWh0troY/0uUv3hK74C9o3Y0Xf/z8UAUvQFkVqZse12O0/BgPVMImvfA==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/util-endpoints": "^1.0.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-locate-window": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", - "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-user-agent-browser": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.433.0.tgz", - "integrity": "sha512-2Cf/Lwvxbt5RXvWFXrFr49vXv0IddiUwrZoAiwhDYxvsh+BMnh+NUFot+ZQaTrk/8IPZVDeLPWZRdVy00iaVXQ==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/types": "^2.4.0", - "bowser": "^2.11.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-user-agent-node": { - "version": "3.437.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.437.0.tgz", - "integrity": "sha512-JVEcvWaniamtYVPem4UthtCNoTBCfFTwYj7Y3CrWZ2Qic4TqrwLkAfaBGtI2TGrhIClVr77uzLI6exqMTN7orA==", - "dev": true, - "requires": { - "@aws-sdk/types": "3.433.0", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", - "dev": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/xml-builder": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.310.0.tgz", - "integrity": "sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - } - }, - "@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", - "dev": true - }, - "@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", - "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz", - "integrity": "sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.0" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", - "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "requires": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", - "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-module-transforms": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", - "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - } - }, - "@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - } - }, - "@babel/helpers": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", - "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.13", - "@babel/types": "^7.20.7" - } - }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", - "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz", - "integrity": "sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz", - "integrity": "sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz", - "integrity": "sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", - "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" - } - }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz", - "integrity": "sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz", - "integrity": "sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/preset-env": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.20.tgz", - "integrity": "sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.20", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.15", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.15", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.15", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.15", - "@babel/plugin-transform-modules-systemjs": "^7.22.11", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.22.15", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.19", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "@babel/runtime": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", - "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - } - }, - "@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "requires": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - } - }, - "@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3" - } - }, - "@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - } - }, - "@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", - "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@kurkle/color": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", - "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@oozcitak/dom": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", - "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", - "dev": true, - "requires": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/url": "1.0.4", - "@oozcitak/util": "8.3.8" - } - }, - "@oozcitak/infra": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", - "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", - "dev": true, - "requires": { - "@oozcitak/util": "8.3.8" - } - }, - "@oozcitak/url": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", - "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", - "dev": true, - "requires": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/util": "8.3.8" - } - }, - "@oozcitak/util": { - "version": "8.3.8", - "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", - "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", - "dev": true - }, - "@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", - "dev": true, - "peer": true - }, - "@servie/events": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@servie/events/-/events-1.0.0.tgz", - "integrity": "sha512-sBSO19KzdrJCM3gdx6eIxV8M9Gxfgg6iDQmH5TIAGaUu+X9VDdsINXJOnoiZ1Kx3TrHdH4bt5UVglkjsEGBcvw==", - "dev": true - }, - "@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^3.0.0" - } - }, - "@smithy/abort-controller": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.12.tgz", - "integrity": "sha512-YIJyefe1mi3GxKdZxEBEuzYOeQ9xpYfqnFmWzojCssRAuR7ycxwpoRQgp965vuW426xUAQhCV5rCaWElQ7XsaA==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/chunked-blob-reader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.0.0.tgz", - "integrity": "sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/chunked-blob-reader-native": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.0.tgz", - "integrity": "sha512-HM8V2Rp1y8+1343tkZUKZllFhEQPNmpNdgFAncbTsxkZ18/gqjk23XXv3qGyXWp412f3o43ZZ1UZHVcHrpRnCQ==", - "dev": true, - "requires": { - "@smithy/util-base64": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/config-resolver": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.16.tgz", - "integrity": "sha512-1k+FWHQDt2pfpXhJsOmNMmlAZ3NUQ98X5tYsjQhVGq+0X6cOBMhfh6Igd0IX3Ut6lEO6DQAdPMI/blNr3JZfMQ==", - "dev": true, - "requires": { - "@smithy/node-config-provider": "^2.1.3", - "@smithy/types": "^2.4.0", - "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.5", - "tslib": "^2.5.0" - } - }, - "@smithy/credential-provider-imds": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.18.tgz", - "integrity": "sha512-QnPBi6D2zj6AHJdUTo5zXmk8vwHJ2bNevhcVned1y+TZz/OI5cizz5DsYNkqFUIDn8tBuEyKNgbmKVNhBbuY3g==", - "dev": true, - "requires": { - "@smithy/node-config-provider": "^2.1.3", - "@smithy/property-provider": "^2.0.13", - "@smithy/types": "^2.4.0", - "@smithy/url-parser": "^2.0.12", - "tslib": "^2.5.0" - } - }, - "@smithy/eventstream-codec": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz", - "integrity": "sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A==", - "dev": true, - "requires": { - "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.4.0", - "@smithy/util-hex-encoding": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/eventstream-serde-browser": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.12.tgz", - "integrity": "sha512-0pi8QlU/pwutNshoeJcbKR1p7Ie5STd8UFAMX5xhSoSJjNlxIv/OsHbF023jscMRN2Prrqd6ToGgdCnsZVQjvg==", - "dev": true, - "requires": { - "@smithy/eventstream-serde-universal": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/eventstream-serde-config-resolver": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.12.tgz", - "integrity": "sha512-I0XfwQkIX3gAnbrU5rLMkBSjTM9DHttdbLwf12CXmj7SSI5dT87PxtKLRrZGanaCMbdf2yCep+MW5/4M7IbvQA==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/eventstream-serde-node": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.12.tgz", - "integrity": "sha512-vf1vMHGOkG3uqN9x1zKOhnvW/XgvhJXWqjV6zZiT2FMjlEayugQ1mzpSqr7uf89+BzjTzuZKERmOsEAmewLbxw==", - "dev": true, - "requires": { - "@smithy/eventstream-serde-universal": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/eventstream-serde-universal": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.12.tgz", - "integrity": "sha512-xZ3ZNpCxIND+q+UCy7y1n1/5VQEYicgSTNCcPqsKawX+Vd+6OcFX7gUHMyPzL8cZr+GdmJuxNleqHlH4giK2tw==", - "dev": true, - "requires": { - "@smithy/eventstream-codec": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/fetch-http-handler": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.4.tgz", - "integrity": "sha512-gIPRFEGi+c6V52eauGKrjDzPWF2Cu7Z1r5F8A3j2wcwz25sPG/t8kjsbEhli/tS/2zJp/ybCZXe4j4ro3yv/HA==", - "dev": true, - "requires": { - "@smithy/protocol-http": "^3.0.8", - "@smithy/querystring-builder": "^2.0.12", - "@smithy/types": "^2.4.0", - "@smithy/util-base64": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/hash-blob-browser": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.12.tgz", - "integrity": "sha512-riLnV16f27yyePX8UF0deRHAeccUK8SrOxyTykSTrnVkgS3DsjNapZtTbd8OGNKEbI60Ncdb5GwN3rHZudXvog==", - "dev": true, - "requires": { - "@smithy/chunked-blob-reader": "^2.0.0", - "@smithy/chunked-blob-reader-native": "^2.0.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/hash-node": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.12.tgz", - "integrity": "sha512-fDZnTr5j9t5qcbeJ037aMZXxMka13Znqwrgy3PAqYj6Dm3XHXHftTH3q+NWgayUxl1992GFtQt1RuEzRMy3NnQ==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/hash-stream-node": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.0.12.tgz", - "integrity": "sha512-x/DrSynPKrW0k00q7aZ/vy531a3mRw79mOajHp+cIF0TrA1SqEMFoy/B8X0XtoAtlJWt/vvgeDNqt/KAeaAqMw==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/invalid-dependency": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.12.tgz", - "integrity": "sha512-p5Y+iMHV3SoEpy3VSR7mifbreHQwVSvHSAz/m4GdoXfOzKzaYC8hYv10Ks7Deblkf7lhas8U+lAp9ThbBM+ZXA==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/is-array-buffer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", - "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/md5-js": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.12.tgz", - "integrity": "sha512-OgDt+Xnrw+W5z3MSl5KZZzebqmXrYl9UdbCiBYnnjErmNywwSjV6QB/Oic3/7hnsPniSU81n7Rvlhz2kH4EREQ==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-content-length": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.14.tgz", - "integrity": "sha512-poUNgKTw9XwPXfX9nEHpVgrMNVpaSMZbshqvPxFVoalF4wp6kRzYKOfdesSVectlQ51VtigoLfbXcdyPwvxgTg==", - "dev": true, - "requires": { - "@smithy/protocol-http": "^3.0.8", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-endpoint": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.3.tgz", - "integrity": "sha512-ZrQ0/YX6hNVTxqMEHtEaDbDv6pNeEji/a5Vk3HuFC5R3ZY8lfoATyxmOGxBVYnF3NUvZLNC7umEv1WzWGWvCGQ==", - "dev": true, - "requires": { - "@smithy/middleware-serde": "^2.0.12", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/shared-ini-file-loader": "^2.2.2", - "@smithy/types": "^2.4.0", - "@smithy/url-parser": "^2.0.12", - "@smithy/util-middleware": "^2.0.5", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-retry": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.18.tgz", - "integrity": "sha512-VyrHQRldGSb3v9oFOB5yPxmLT7U2sQic2ytylOnYlnsmVOLlFIaI6sW22c+w2675yq+XZ6HOuzV7x2OBYCWRNA==", - "dev": true, - "requires": { - "@smithy/node-config-provider": "^2.1.3", - "@smithy/protocol-http": "^3.0.8", - "@smithy/service-error-classification": "^2.0.5", - "@smithy/types": "^2.4.0", - "@smithy/util-middleware": "^2.0.5", - "@smithy/util-retry": "^2.0.5", - "tslib": "^2.5.0", - "uuid": "^8.3.2" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - } - } - }, - "@smithy/middleware-serde": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.12.tgz", - "integrity": "sha512-IBeco157lIScecq2Z+n0gq56i4MTnfKxS7rbfrAORveDJgnbBAaEQgYqMqp/cYqKrpvEXcyTjwKHrBjCCIZh2A==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-stack": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.6.tgz", - "integrity": "sha512-YSvNZeOKWLJ0M/ycxwDIe2Ztkp6Qixmcml1ggsSv2fdHKGkBPhGrX5tMzPGMI1yyx55UEYBi2OB4s+RriXX48A==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/node-config-provider": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.3.tgz", - "integrity": "sha512-J6lXvRHGVnSX3n1PYi+e1L5HN73DkkJpUviV3Ebf+8wSaIjAf+eVNbzyvh/S5EQz7nf4KVfwbD5vdoZMAthAEQ==", - "dev": true, - "requires": { - "@smithy/property-provider": "^2.0.13", - "@smithy/shared-ini-file-loader": "^2.2.2", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/node-http-handler": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.8.tgz", - "integrity": "sha512-KZylM7Wff/So5SmCiwg2kQNXJ+RXgz34wkxS7WNwIUXuZrZZpY/jKJCK+ZaGyuESDu3TxcaY+zeYGJmnFKbQsA==", - "dev": true, - "requires": { - "@smithy/abort-controller": "^2.0.12", - "@smithy/protocol-http": "^3.0.8", - "@smithy/querystring-builder": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/property-provider": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.13.tgz", - "integrity": "sha512-VJqUf2CbsQX6uUiC5dUPuoEATuFjkbkW3lJHbRnpk9EDC9X+iKqhfTK+WP+lve5EQ9TcCI1Q6R7hrg41FyC54w==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/protocol-http": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", - "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/querystring-builder": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.12.tgz", - "integrity": "sha512-cDbF07IuCjiN8CdGvPzfJjXIrmDSelScRfyJYrYBNBbKl2+k7QD/KqiHhtRyEKgID5mmEVrV6KE6L/iPJ98sFw==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "@smithy/util-uri-escape": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/querystring-parser": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.12.tgz", - "integrity": "sha512-fytyTcXaMzPBuNtPlhj5v6dbl4bJAnwKZFyyItAGt4Tgm9HFPZNo7a9r1SKPr/qdxUEBzvL9Rh+B9SkTX3kFxg==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/service-error-classification": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.5.tgz", - "integrity": "sha512-M0SeJnEgD2ywJyV99Fb1yKFzmxDe9JfpJiYTVSRMyRLc467BPU0qsuuDPzMCdB1mU8M8u1rVOdkqdoyFN8UFTw==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0" - } - }, - "@smithy/shared-ini-file-loader": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.2.tgz", - "integrity": "sha512-noyQUPn7b1M8uB0GEXc/Zyxq+5K2b7aaqWnLp+hgJ7+xu/FCvtyWy5eWLDjQEsHnAet2IZhS5QF8872OR69uNg==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/signature-v4": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.12.tgz", - "integrity": "sha512-6Kc2lCZEVmb1nNYngyNbWpq0d82OZwITH11SW/Q0U6PX5fH7B2cIcFe7o6eGEFPkTZTP8itTzmYiGcECL0D0Lw==", - "dev": true, - "requires": { - "@smithy/eventstream-codec": "^2.0.12", - "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.4.0", - "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-middleware": "^2.0.5", - "@smithy/util-uri-escape": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/smithy-client": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.12.tgz", - "integrity": "sha512-XXqhridfkKnpj+lt8vM6HRlZbqUAqBjVC74JIi13F/AYQd/zTj9SOyGfxnbp4mjY9q28LityxIuV8CTinr9r5w==", - "dev": true, - "requires": { - "@smithy/middleware-stack": "^2.0.6", - "@smithy/types": "^2.4.0", - "@smithy/util-stream": "^2.0.17", - "tslib": "^2.5.0" - } - }, - "@smithy/types": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", - "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/url-parser": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.12.tgz", - "integrity": "sha512-qgkW2mZqRvlNUcBkxYB/gYacRaAdck77Dk3/g2iw0S9F0EYthIS3loGfly8AwoWpIvHKhkTsCXXQfzksgZ4zIA==", - "dev": true, - "requires": { - "@smithy/querystring-parser": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-base64": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", - "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", - "dev": true, - "requires": { - "@smithy/util-buffer-from": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-body-length-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", - "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-body-length-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", - "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-buffer-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", - "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", - "dev": true, - "requires": { - "@smithy/is-array-buffer": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-config-provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", - "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-defaults-mode-browser": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.16.tgz", - "integrity": "sha512-Uv5Cu8nVkuvLn0puX+R9zWbSNpLIR3AxUlPoLJ7hC5lvir8B2WVqVEkJLwtixKAncVLasnTVjPDCidtAUTGEQw==", - "dev": true, - "requires": { - "@smithy/property-provider": "^2.0.13", - "@smithy/smithy-client": "^2.1.12", - "@smithy/types": "^2.4.0", - "bowser": "^2.11.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-defaults-mode-node": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.21.tgz", - "integrity": "sha512-cUEsttVZ79B7Al2rWK2FW03HBpD9LyuqFtm+1qFty5u9sHSdesr215gS2Ln53fTopNiPgeXpdoM3IgjvIO0rJw==", - "dev": true, - "requires": { - "@smithy/config-resolver": "^2.0.16", - "@smithy/credential-provider-imds": "^2.0.18", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/property-provider": "^2.0.13", - "@smithy/smithy-client": "^2.1.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-endpoints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.2.tgz", - "integrity": "sha512-QEdq+sP68IJHAMVB2ugKVVZEWeKQtZLuf+akHzc8eTVElsZ2ZdVLWC6Cp+uKjJ/t4yOj1qu6ZzyxJQEQ8jdEjg==", - "dev": true, - "requires": { - "@smithy/node-config-provider": "^2.1.3", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-hex-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", - "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-middleware": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.5.tgz", - "integrity": "sha512-1lyT3TcaMJQe+OFfVI+TlomDkPuVzb27NZYdYtmSTltVmLaUjdCyt4KE+OH1CnhZKsz4/cdCL420Lg9UH5Z2Mw==", - "dev": true, - "requires": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-retry": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.5.tgz", - "integrity": "sha512-x3t1+MQAJ6QONk3GTbJNcugCFDVJ+Bkro5YqQQK1EyVesajNDqxFtCx9WdOFNGm/Cbm7tUdwVEmfKQOJoU2Vtw==", - "dev": true, - "requires": { - "@smithy/service-error-classification": "^2.0.5", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-stream": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.17.tgz", - "integrity": "sha512-fP/ZQ27rRvHsqItds8yB7jerwMpZFTL3QqbQbidUiG0+mttMoKdP0ZqnvM8UK5q0/dfc3/pN7g4XKPXOU7oRWw==", - "dev": true, - "requires": { - "@smithy/fetch-http-handler": "^2.2.4", - "@smithy/node-http-handler": "^2.1.8", - "@smithy/types": "^2.4.0", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-uri-escape": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", - "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", - "dev": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-utf8": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", - "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", - "dev": true, - "requires": { - "@smithy/util-buffer-from": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-waiter": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.12.tgz", - "integrity": "sha512-3sENmyVa1NnOPoiT2NCApPmu7ukP7S/v7kL9IxNmnygkDldn7/yK0TP42oPJLwB2k3mospNsSePIlqdXEUyPHA==", - "dev": true, - "requires": { - "@smithy/abort-controller": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" - } - }, - "@types/babel__core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", - "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.5", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", - "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", - "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", - "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.5.5", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.5.tgz", - "integrity": "sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/tough-cookie": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", - "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", - "dev": true - }, - "@types/uuid": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.4.tgz", - "integrity": "sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA==", - "dev": true - }, - "@types/yargs": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", - "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-parser": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/ansi-parser/-/ansi-parser-3.2.10.tgz", - "integrity": "sha512-CGKGIbd678lm15IXJXI1cTyOVAnMQw0jES+klW/yIc+GzYccsYanLMhczPIIj2hE64B79g75QfiuWrEWd6nJdg==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "axios": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", - "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", - "dev": true, - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "axios-cookiejar-support": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/axios-cookiejar-support/-/axios-cookiejar-support-4.0.7.tgz", - "integrity": "sha512-9vpE3y/a2l2Vs2XEJE4L2z0GWnlpJ4Xj+kDaoCtrpPfS1J3oikXBrxRJX6H62/ZcelOGe+519yW7mqXCIoPXuw==", - "dev": true, - "requires": { - "http-cookie-agent": "^5.0.4" - } - }, - "babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "requires": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-module-resolver": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.0.tgz", - "integrity": "sha512-g0u+/ChLSJ5+PzYwLwP8Rp8Rcfowz58TJNCe+L/ui4rpzE/mg//JVX0EWBUYoxaextqnwuGHzfGp2hh0PPV25Q==", - "dev": true, - "requires": { - "find-babel-config": "^2.0.0", - "glob": "^8.0.3", - "pkg-up": "^3.1.0", - "reselect": "^4.1.7", - "resolve": "^1.22.1" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", - "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", - "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.31.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", - "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.2" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bootstrap": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", - "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", - "dev": true, - "requires": {} - }, - "bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.21.11", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", - "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001538", - "electron-to-chromium": "^1.4.526", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "bunyan": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", - "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", - "dev": true, - "requires": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "bunyan-debug-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bunyan-debug-stream/-/bunyan-debug-stream-3.1.0.tgz", - "integrity": "sha512-VaFYbDVdiSn3ZpdozrjZ8mFpxHXl26t11C1DKRQtbo0EgffqeFNrRLOGIESKVeGEvVu4qMxMSSxzNlSw7oTj7w==", - "dev": true, - "requires": { - "chalk": "^4.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/byte-length/-/byte-length-1.0.2.tgz", - "integrity": "sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==", - "dev": true - }, - "caf": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/caf/-/caf-15.0.1.tgz", - "integrity": "sha512-Xp/IK6vMwujxWZXra7djdYzPdPnEQKa7Mudu2wZgDQ3TJry1I0TgtjEgwZHpoBcMp68j4fb0/FZ1SJyMEgJrXQ==", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001538", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", - "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chart.js": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.2.1.tgz", - "integrity": "sha512-6YbpQ0nt3NovAgOzbkSSeeAQu/3za1319dPUQTXn9WcOpywM8rGKxJHrhS8V8xEkAlk8YhEfjbuAPfUyp6jIsw==", - "dev": true, - "requires": { - "@kurkle/color": "^0.3.0" - } - }, - "child-process-promise": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/child-process-promise/-/child-process-promise-2.2.1.tgz", - "integrity": "sha512-Fi4aNdqBsr0mv+jgWxcZ/7rAIC2mgihrptyVI4foh/rrjY/3BNjfP9+oaiFx/fzim+1ZyCNBae0DlyfQhSugog==", - "dev": true, - "requires": { - "cross-spawn": "^4.0.2", - "node-version": "^1.0.0", - "promise-polyfill": "^6.0.1" - } - }, - "ci-info": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", - "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "client-oauth2": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/client-oauth2/-/client-oauth2-4.3.3.tgz", - "integrity": "sha512-k8AvUYJon0vv75ufoVo4nALYb/qwFFicO3I0+39C6xEdflqVtr+f9cy+0ZxAduoVSTfhP5DX2tY2XICAd5hy6Q==", - "dev": true, - "requires": { - "popsicle": "^12.0.5", - "safe-buffer": "^5.2.0" - } - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "core-js-compat": { - "version": "3.32.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.2.tgz", - "integrity": "sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==", - "dev": true, - "requires": { - "browserslist": "^4.21.10" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - } - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "requires": {} - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "detox": { - "version": "20.11.4", - "resolved": "https://registry.npmjs.org/detox/-/detox-20.11.4.tgz", - "integrity": "sha512-P48KAtK8qIDOxJKUl4q/syPkuHz67kAeFlNodBZg5aO4hJiH+RsbEkQfJSYkTCeZV800EcmUQwZK2M5amLoYaw==", - "dev": true, - "requires": { - "ajv": "^8.6.3", - "bunyan": "^1.8.12", - "bunyan-debug-stream": "^3.1.0", - "caf": "^15.0.1", - "chalk": "^4.0.0", - "child-process-promise": "^2.2.0", - "execa": "^5.1.1", - "find-up": "^5.0.0", - "fs-extra": "^11.0.0", - "funpermaproxy": "^1.1.0", - "glob": "^8.0.3", - "ini": "^1.3.4", - "json-cycle": "^1.3.0", - "lodash": "^4.17.11", - "multi-sort-stream": "^1.0.3", - "multipipe": "^4.0.0", - "node-ipc": "9.2.1", - "proper-lockfile": "^3.0.2", - "resolve-from": "^5.0.0", - "sanitize-filename": "^1.6.1", - "semver": "^7.0.0", - "serialize-error": "^8.0.1", - "shell-quote": "^1.7.2", - "signal-exit": "^3.0.3", - "stream-json": "^1.7.4", - "strip-ansi": "^6.0.1", - "telnet-client": "1.2.8", - "tempfile": "^2.0.0", - "trace-event-lib": "^1.3.1", - "which": "^1.3.1", - "ws": "^7.0.0", - "yargs": "^17.0.0", - "yargs-parser": "^21.0.0", - "yargs-unparser": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true - }, - "diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true - }, - "diff2html": { - "version": "3.4.43", - "resolved": "https://registry.npmjs.org/diff2html/-/diff2html-3.4.43.tgz", - "integrity": "sha512-cBiJKvyhY3bv+q9VHA7YyNdPk1PA+P9lArpp0MJlcpn1x4eiXYtK3ILNpcHXfgPTCdjjCilGvX9qBelGWtyMCg==", - "dev": true, - "requires": { - "diff": "5.1.0", - "highlight.js": "11.8.0", - "hogan.js": "3.0.2" - } - }, - "dtrace-provider": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", - "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.14.0" - } - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "easy-stack": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", - "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.527", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.527.tgz", - "integrity": "sha512-EafxEiEDzk2aLrdbtVczylHflHdHkNrpGNHIgDyA63sUQLQVS2ayj2hPw3RsVB42qkwURH+T2OxV7kGPUuYszA==", - "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "event-pubsub": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", - "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-xml-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", - "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", - "dev": true, - "requires": { - "strnum": "^1.0.5" - } - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-babel-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.0.0.tgz", - "integrity": "sha512-dOKT7jvF3hGzlW60Gc3ONox/0rRZ/tz7WCil0bqA1In/3I8f1BctpXahRnEKDySZqci7u+dqq93sZST9fOJpFw==", - "dev": true, - "requires": { - "json5": "^2.1.1", - "path-exists": "^4.0.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "funpermaproxy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/funpermaproxy/-/funpermaproxy-1.1.0.tgz", - "integrity": "sha512-2Sp1hWuO8m5fqeFDusyhKqYPT+7rGLw34N3qonDcdRP8+n7M7Gl/yKp/q7oCxnnJ6pWCectOmLFJpsMU/++KrQ==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "highlight.js": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz", - "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==", - "dev": true, - "optional": true - }, - "hogan.js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", - "integrity": "sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==", - "dev": true, - "requires": { - "mkdirp": "0.3.0", - "nopt": "1.0.10" - }, - "dependencies": { - "mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==", - "dev": true - } - } - }, - "holderjs": { - "version": "2.9.9", - "resolved": "https://registry.npmjs.org/holderjs/-/holderjs-2.9.9.tgz", - "integrity": "sha512-ceWPz1MrR3dxOoZXiom+G48+l1VPG3TcjBw9fq5iwCiZAMvYX8Aia13GOxT7DoV/AcSyTH7Vvr11ygjZP9qn4w==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-cookie-agent": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/http-cookie-agent/-/http-cookie-agent-5.0.4.tgz", - "integrity": "sha512-OtvikW69RvfyP6Lsequ0fN5R49S+8QcS9zwd58k6VSr6r57T8G29BkPdyrBcSwLq6ExLs9V+rBlfxu7gDstJag==", - "dev": true, - "requires": { - "agent-base": "^7.1.0" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - } - }, - "jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true - }, - "jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-html-reporters": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/jest-html-reporters/-/jest-html-reporters-3.1.4.tgz", - "integrity": "sha512-7lLrKDKDNBNDprd5lP241HRx2mRXb/XQOuYFxX/MxydgHtYRE/lEtK2+J5XLiNTs9JL/rUjWsWhIBOBs9j3wcg==", - "dev": true, - "requires": { - "fs-extra": "^10.0.0", - "open": "^8.0.3" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, - "jest-junit": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz", - "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "strip-ansi": "^6.0.1", - "uuid": "^8.3.2", - "xml": "^1.0.1" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - } - } - }, - "jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true - }, - "jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "requires": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - } - }, - "jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "jest-stare": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jest-stare/-/jest-stare-2.5.1.tgz", - "integrity": "sha512-++3JWdY2zJNPFCN6ao1oeW0Qg8oKVYT9XaMUr8RaNDHDGKOQMNjmMrVz9E/4E43ZDU2mPTtk9U8pS+KjSuxPKg==", - "dev": true, - "requires": { - "@jest/reporters": "^29.0.0", - "@jest/test-result": "^29.0.0", - "@jest/types": "^29.0.0", - "@types/jest": "^29.0.0", - "ansi-parser": "^3.2.10", - "bootstrap": "^5.0.0", - "chalk": "^4.1.0", - "chart.js": "^4.1.2", - "diff2html": "^3.4.40", - "holderjs": "^2.9.7", - "jquery": "^3.5.1", - "moment": "^2.27.0", - "mustache": "^4.0.0", - "pkg-up": "^3.0.0", - "popper.js": "^1.16.1", - "yargs": "^17.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jquery": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz", - "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==", - "dev": true - }, - "js-message": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", - "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", - "dev": true - }, - "js-queue": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.2.tgz", - "integrity": "sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==", - "dev": true, - "requires": { - "easy-stack": "^1.0.1" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-cycle": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/json-cycle/-/json-cycle-1.3.0.tgz", - "integrity": "sha512-FD/SedD78LCdSvJaOUQAXseT8oQBb5z6IVYaQaCrVUlu9zOAr1BDdKyVYQaSD/GDsAMrXpKcOyBD4LIl8nfjHw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "junit-report-merger": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/junit-report-merger/-/junit-report-merger-6.0.2.tgz", - "integrity": "sha512-Jk9PXeaJhbgo3aUNza2r24JgxYzLUtCk2kwrub8fbmDuWUdXhT/nfbM2MlU3JQiFbjVud1bzBWdzr9/GGBWfmA==", - "dev": true, - "requires": { - "commander": "~10.0.0", - "fast-glob": "~3.2.11", - "xmlbuilder2": "3.1.1" - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "make-error-cause": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-2.3.0.tgz", - "integrity": "sha512-etgt+n4LlOkGSJbBTV9VROHA5R7ekIPS4vfh+bCAoJgRrJWdqJCBbpS3osRJ/HrT7R68MzMiY3L3sDJ/Fd8aBg==", - "dev": true, - "requires": { - "make-error": "^1.3.5" - } - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, - "optional": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "dev": true - }, - "moment-timezone": { - "version": "0.5.43", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", - "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", - "dev": true, - "requires": { - "moment": "^2.29.4" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "multi-sort-stream": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multi-sort-stream/-/multi-sort-stream-1.0.4.tgz", - "integrity": "sha512-hAZ8JOEQFbgdLe8HWZbb7gdZg0/yAIHF00Qfo3kd0rXFv96nXe+/bPTrKHZ2QMHugGX4FiAyET1Lt+jiB+7Qlg==", - "dev": true - }, - "multipipe": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-4.0.0.tgz", - "integrity": "sha512-jzcEAzFXoWwWwUbvHCNPwBlTz3WCWe/jPcXSmTfbo/VjRwRTfvLZ/bdvtiTdqCe8d4otCSsPCbhGYcX+eggpKQ==", - "dev": true, - "requires": { - "duplexer2": "^0.1.2", - "object-assign": "^4.1.0" - } - }, - "mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "dev": true - }, - "mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", - "dev": true, - "optional": true, - "requires": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.6" - } - } - } - }, - "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "dev": true, - "optional": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", - "dev": true, - "optional": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-ipc": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.2.1.tgz", - "integrity": "sha512-mJzaM6O3xHf9VT8BULvJSbdVbmHUKRNOH7zDDkCrA1/T+CVjq2WVIDfLt0azZRXpgArJtl3rtmEozrbXPZ9GaQ==", - "dev": true, - "requires": { - "event-pubsub": "4.3.0", - "js-message": "1.0.7", - "js-queue": "2.0.2" - } - }, - "node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node-version": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.2.0.tgz", - "integrity": "sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==", - "dev": true - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - } - } - }, - "popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "dev": true - }, - "popsicle": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/popsicle/-/popsicle-12.1.0.tgz", - "integrity": "sha512-muNC/cIrWhfR6HqqhHazkxjob3eyECBe8uZYSQ/N5vixNAgssacVleerXnE8Are5fspR0a+d2qWaBR1g7RYlmw==", - "dev": true, - "requires": { - "popsicle-content-encoding": "^1.0.0", - "popsicle-cookie-jar": "^1.0.0", - "popsicle-redirects": "^1.1.0", - "popsicle-transport-http": "^1.0.8", - "popsicle-transport-xhr": "^2.0.0", - "popsicle-user-agent": "^1.0.0", - "servie": "^4.3.3", - "throwback": "^4.1.0" - } - }, - "popsicle-content-encoding": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/popsicle-content-encoding/-/popsicle-content-encoding-1.0.0.tgz", - "integrity": "sha512-4Df+vTfM8wCCJVTzPujiI6eOl3SiWQkcZg0AMrOkD1enMXsF3glIkFUZGvour1Sj7jOWCsNSEhBxpbbhclHhzw==", - "dev": true, - "requires": {} - }, - "popsicle-cookie-jar": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/popsicle-cookie-jar/-/popsicle-cookie-jar-1.0.0.tgz", - "integrity": "sha512-vrlOGvNVELko0+J8NpGC5lHWDGrk8LQJq9nwAMIVEVBfN1Lib3BLxAaLRGDTuUnvl45j5N9dT2H85PULz6IjjQ==", - "dev": true, - "requires": { - "@types/tough-cookie": "^2.3.5", - "tough-cookie": "^3.0.1" - }, - "dependencies": { - "@types/tough-cookie": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.8.tgz", - "integrity": "sha512-7axfYN8SW9pWg78NgenHasSproWQee5rzyPVLC9HpaQSDgNArsnKJD88EaMfi4Pl48AyciO3agYCFqpHS1gLpg==", - "dev": true - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "popsicle-redirects": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/popsicle-redirects/-/popsicle-redirects-1.1.1.tgz", - "integrity": "sha512-mC2HrKjdTAWDalOjGxlXw9j6Qxrz/Yd2ui6bPxpi2IQDYWpF4gUAMxbA8EpSWJhLi0PuWKDwTHHPrUPGutAoIA==", - "dev": true, - "requires": {} - }, - "popsicle-transport-http": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/popsicle-transport-http/-/popsicle-transport-http-1.2.1.tgz", - "integrity": "sha512-i5r3IGHkGiBDm1oPFvOfEeSGWR0lQJcsdTqwvvDjXqcTHYJJi4iSi3ecXIttDiTBoBtRAFAE9nF91fspQr63FQ==", - "dev": true, - "requires": { - "make-error-cause": "^2.2.0" - } - }, - "popsicle-transport-xhr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/popsicle-transport-xhr/-/popsicle-transport-xhr-2.0.0.tgz", - "integrity": "sha512-5Sbud4Widngf1dodJE5cjEYXkzEUIl8CzyYRYR57t6vpy9a9KPGQX6KBKdPjmBZlR5A06pOBXuJnVr23l27rtA==", - "dev": true, - "requires": {} - }, - "popsicle-user-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/popsicle-user-agent/-/popsicle-user-agent-1.0.0.tgz", - "integrity": "sha512-epKaq3TTfTzXcxBxjpoKYMcTTcAX8Rykus6QZu77XNhJuRHSRxMd+JJrbX/3PFI0opFGSN0BabbAYCbGxbu0mA==", - "dev": true, - "requires": {} - }, - "pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "promise-polyfill": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz", - "integrity": "sha512-g0LWaH0gFsxovsU7R5LrrhHhWAWiHRnh1GPrhXnPgYsDkIqjRYUYSZEsej/wtleDrz5xVSIDbeKfidztp2XHFQ==", - "dev": true - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "proper-lockfile": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-3.2.0.tgz", - "integrity": "sha512-iMghHHXv2bsxl6NchhEaFck8tvX3F9cknEEh1SUpguUOBjN7PAAW9BLzmbc1g/mCD1gY3EE2EABBHPJfFdHFmA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "pure-rand": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.3.tgz", - "integrity": "sha512-KddyFewCsO0j3+np81IQ+SweXLDnDQTs5s67BOnrYmYe/yNmUhttQyGsYzy8yUnoljGAQ9sl38YB4vH8ur7Y+w==", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dev": true, - "requires": { - "minimatch": "^3.0.5" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "requires": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "reselect": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz", - "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", - "dev": true, - "optional": true, - "requires": { - "glob": "^6.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", - "dev": true, - "optional": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "dev": true, - "optional": true - }, - "sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "requires": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "serialize-error": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", - "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - }, - "dependencies": { - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "servie": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/servie/-/servie-4.3.3.tgz", - "integrity": "sha512-b0IrY3b1gVMsWvJppCf19g1p3JSnS0hQi6xu4Hi40CIhf0Lx8pQHcvBL+xunShpmOiQzg1NOia812NAWdSaShw==", - "dev": true, - "requires": { - "@servie/events": "^1.0.0", - "byte-length": "^1.0.2", - "ts-expect": "^1.1.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", - "dev": true - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "requires": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "stream-chain": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", - "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", - "dev": true - }, - "stream-json": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.7.5.tgz", - "integrity": "sha512-NSkoVduGakxZ8a+pTPUlcGEeAGQpWL9rKJhOFCV+J/QtdQUEU5vtBgVg6eJXn8JB8RZvpbJWZGvXkhz70MLWoA==", - "dev": true, - "requires": { - "stream-chain": "^2.2.5" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "telnet-client": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/telnet-client/-/telnet-client-1.2.8.tgz", - "integrity": "sha512-W+w4k3QAmULVNhBVT2Fei369kGZCh/TH25M7caJAXW+hLxwoQRuw0di3cX4l0S9fgH3Mvq7u+IFMoBDpEw/eIg==", - "dev": true, - "requires": { - "bluebird": "^3.5.4" - } - }, - "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", - "dev": true - }, - "tempfile": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", - "integrity": "sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==", - "dev": true, - "requires": { - "temp-dir": "^1.0.0", - "uuid": "^3.0.1" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "throwback": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throwback/-/throwback-4.1.0.tgz", - "integrity": "sha512-dLFe8bU8SeH0xeqeKL7BNo8XoPC/o91nz9/ooeplZPiso+DZukhoyZcSz9TFnUNScm+cA9qjU1m1853M6sPOng==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "dependencies": { - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true - } - } - }, - "trace-event-lib": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/trace-event-lib/-/trace-event-lib-1.3.1.tgz", - "integrity": "sha512-RO/TD5E9RNqU6MhOfi/njFWKYhrzOJCpRXlEQHgXwM+6boLSrQnOZ9xbHwOXzC+Luyixc7LNNSiTsqTVeF7I1g==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0", - "lodash": "^4.17.21" - } - }, - "truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dev": true, - "requires": { - "utf8-byte-length": "^1.0.1" - } - }, - "ts-expect": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-expect/-/ts-expect-1.3.0.tgz", - "integrity": "sha512-e4g0EJtAjk64xgnFPD6kTBUtpnMVzDrMb12N1YZV0VvSlhnVT3SGxiYTLdGy8Q5cYHOIC/FAHmZ10eGrAguicQ==", - "dev": true - }, - "ts-jest": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", - "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true - }, - "v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} - }, - "xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "dev": true - }, - "xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, - "xmlbuilder2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.1.1.tgz", - "integrity": "sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==", - "dev": true, - "requires": { - "@oozcitak/dom": "1.15.10", - "@oozcitak/infra": "1.0.8", - "@oozcitak/util": "8.3.8", - "js-yaml": "3.14.1" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } diff --git a/detox/package.json b/detox/package.json index e92c0286088..b2daf8a3e51 100644 --- a/detox/package.json +++ b/detox/package.json @@ -20,7 +20,7 @@ "babel-plugin-module-resolver": "5.0.0", "client-oauth2": "4.3.3", "deepmerge": "4.3.1", - "detox": "20.11.4", + "detox": "20.19.3", "form-data": "4.0.0", "jest": "29.7.0", "jest-circus": "29.7.0", @@ -46,11 +46,14 @@ "e2e:android-test": "detox test -c android.emu.debug", "e2e:android-build-release": "detox build -c android.emu.release", "e2e:android-test-release": "detox test -c android.emu.release --record-logs failing --take-screenshots failing", + "e2e:ios-build": "IOS=true detox build -c ios.sim.debug", "e2e:ios-test": "IOS=true detox test -c ios.sim.debug", "e2e:ios-build-release": "detox build -c ios.sim.release", "e2e:ios-test-release": "IOS=true detox test -c ios.sim.release --record-logs failing --take-screenshots failing", "check": "npm run lint && npm run tsc", + "clean-detox": "detox clean", "lint": "eslint --ignore-pattern node_modules --quiet .", + "e2e:save-report": "node save_report.js", "start:webhook": "node webhook_server.js", "tsc": "NODE_OPTIONS=--max_old_space_size=12000 tsc --noEmit" } diff --git a/detox/utils/report.js b/detox/utils/report.js index 7fca48ee5e5..0da8ae31435 100644 --- a/detox/utils/report.js +++ b/detox/utils/report.js @@ -184,7 +184,7 @@ function removeOldGeneratedReports() { ].forEach((file) => fse.removeSync(`${ARTIFACTS_DIR}/${file}`)); } -function writeJsonToFile(jsonObject, filename, dir) { +async function writeJsonToFile(jsonObject, filename, dir) { fse.writeJson(`${dir}/${filename}`, jsonObject). then(() => console.log('Successfully written:', filename)). catch((err) => console.error(err)); diff --git a/package-lock.json b/package-lock.json index c818f5f2b70..82e5141b137 100644 --- a/package-lock.json +++ b/package-lock.json @@ -151,7 +151,7 @@ "babel-loader": "9.1.3", "babel-plugin-module-resolver": "5.0.0", "deep-freeze": "0.0.1", - "detox": "20.13.5", + "detox": "20.19.3", "eslint": "8.54.0", "eslint-plugin-header": "3.1.1", "eslint-plugin-import": "2.29.0", @@ -2440,6 +2440,12 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@flatten-js/interval-tree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@flatten-js/interval-tree/-/interval-tree-1.1.2.tgz", + "integrity": "sha512-OwLoV9E/XM6b7bes2rSFnGNjyRy7vcoIHFTnmBR2WAaZTf0Fe4EX4GdA65vU1KgFAasti7iRSg2dZfYd1Zt00Q==", + "dev": true + }, "node_modules/@formatjs/ecma402-abstract": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.0.tgz", @@ -8036,6 +8042,33 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/bunyamin": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/bunyamin/-/bunyamin-1.5.2.tgz", + "integrity": "sha512-Xp2nfqk33zt3nX90OSTkLVOc5N+1zdR3MWvfLHoIrm3cGRkdxPTPYB9CCgrDV8oum5rbghJjAbmXFXOrRXvMtg==", + "dev": true, + "dependencies": { + "@flatten-js/interval-tree": "^1.1.2", + "multi-sort-stream": "^1.0.4", + "stream-json": "^1.7.5", + "trace-event-lib": "^1.3.1" + }, + "engines": { + "node": ">=14.18.2" + }, + "peerDependencies": { + "@types/bunyan": "^1.8.8", + "bunyan": "^1.8.15 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@types/bunyan": { + "optional": true + }, + "bunyan": { + "optional": true + } + } + }, "node_modules/bunyan": { "version": "1.8.15", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", @@ -9138,9 +9171,9 @@ } }, "node_modules/detox": { - "version": "20.13.5", - "resolved": "https://registry.npmjs.org/detox/-/detox-20.13.5.tgz", - "integrity": "sha512-V0t1QuRI5rsiXEPBakjjjGGo8Y5kLi4KXhLrcvnpO8id6m7UtObj91wj+4cCnMRX2eSohXu9wR+HbD6IKcO9sA==", + "version": "20.19.3", + "resolved": "https://registry.npmjs.org/detox/-/detox-20.19.3.tgz", + "integrity": "sha512-5axCZVfVNB4SgKej4ONIAVXkPgvWXd5ULSTemmWGA8oLRmlZpELrhBXgAcTP4MEY/tArG1v0Cx4NWyoda/Lyiw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -9156,6 +9189,7 @@ "funpermaproxy": "^1.1.0", "glob": "^8.0.3", "ini": "^1.3.4", + "jest-environment-emit": "^1.0.5", "json-cycle": "^1.3.0", "lodash": "^4.17.11", "multi-sort-stream": "^1.0.3", @@ -9183,7 +9217,7 @@ "detox": "local-cli/cli.js" }, "engines": { - "node": ">=14.5.0" + "node": ">=18" }, "peerDependencies": { "jest": "29.x.x || 28.x.x || ^27.2.5" @@ -10763,6 +10797,15 @@ "node": ">= 8" } }, + "node_modules/exeunt": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/exeunt/-/exeunt-1.1.0.tgz", + "integrity": "sha512-dd++Yn/0Fp+gtJ04YHov7MeAii+LFivJc6KqnJNfplzLVUkUDrfKoQDTLlCgzcW15vY5hKlHasWeIsQJ8agHsw==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -13088,6 +13131,70 @@ "node": ">=8" } }, + "node_modules/jest-environment-emit": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/jest-environment-emit/-/jest-environment-emit-1.0.7.tgz", + "integrity": "sha512-/0AYqbL3zrfRTtGyzTZwgRxQZiDXEM8ZUfY7Uscla/XGs9vszx4f0XTSZqAk3CQaiwYAoKvFZkB2vSKm1Q08fQ==", + "dev": true, + "dependencies": { + "bunyamin": "^1.5.2", + "bunyan": "^2.0.5", + "bunyan-debug-stream": "^3.1.0", + "funpermaproxy": "^1.1.0", + "lodash.merge": "^4.6.2", + "node-ipc": "9.2.1", + "strip-ansi": "^6.0.0", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16.14.0" + }, + "peerDependencies": { + "@jest/environment": ">=27.2.5", + "@jest/types": ">=27.2.5", + "jest": ">=27.2.5", + "jest-environment-jsdom": ">=27.2.5", + "jest-environment-node": ">=27.2.5" + }, + "peerDependenciesMeta": { + "@jest/environment": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "jest-environment-node": { + "optional": true + } + } + }, + "node_modules/jest-environment-emit/node_modules/bunyan": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-2.0.5.tgz", + "integrity": "sha512-Jvl74TdxCN6rSP9W1I6+UOUtwslTDqsSFkDqZlFb/ilaSvQ+bZAnXT/GT97IZ5L+Vph0joPZPhxUyn6FLNmFAA==", + "dev": true, + "engines": [ + "node >=0.10.0" + ], + "dependencies": { + "exeunt": "1.1.0" + }, + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, "node_modules/jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", diff --git a/package.json b/package.json index 4c2a1c7838d..d61134063b9 100644 --- a/package.json +++ b/package.json @@ -152,7 +152,7 @@ "babel-loader": "9.1.3", "babel-plugin-module-resolver": "5.0.0", "deep-freeze": "0.0.1", - "detox": "20.13.5", + "detox": "20.19.3", "eslint": "8.54.0", "eslint-plugin-header": "3.1.1", "eslint-plugin-import": "2.29.0", From 64c9d9d9bacaadf09f75a5c5df126338b078c001 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 09:33:20 +0530 Subject: [PATCH 114/362] fix cache step --- .github/workflows/e2e-detox.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index b7bd6b9d8fb..1962b914dd8 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -59,6 +59,12 @@ jobs: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Download Existing iOS Simulator Build + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + name: ios-build-simulator-${{ github.run_id }} + path: . + - name: Cache iOS Build id: cache uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 @@ -70,7 +76,7 @@ jobs: if: steps.cache.outputs.cache-hit != 'true' uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: - name: ios-build-simulator + name: ios-build-simulator-${{ github.run_id }} path: Mattermost-simulator-x86_64.app.zip build-ios-simulator: From cda8b1ab73b20dbd9376f0e2e7b87657ef490865 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 09:34:50 +0530 Subject: [PATCH 115/362] fix cache step --- .github/workflows/e2e-detox.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 1962b914dd8..b20989a8b52 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -64,7 +64,8 @@ jobs: with: name: ios-build-simulator-${{ github.run_id }} path: . - + continue-on-error: true + - name: Cache iOS Build id: cache uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 From 8a3d11de5620b5b5569b720b1ec672a903f16943 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 09:45:08 +0530 Subject: [PATCH 116/362] fix cache step --- .github/actions/prepare-node-deps/action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/prepare-node-deps/action.yaml b/.github/actions/prepare-node-deps/action.yaml index bc7e4f75292..7df0bad7797 100644 --- a/.github/actions/prepare-node-deps/action.yaml +++ b/.github/actions/prepare-node-deps/action.yaml @@ -22,7 +22,7 @@ runs: echo "::endgroup::" - name: Cache Node.js modules - uses: actions/cache@cd7d8d697e10461458bc61a30d094dc601a8b017 # 4.1.3 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: ~/.npm key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }} From 8b4165775be54bc7aaf3fb227aa19aa32d0d2427 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 09:49:29 +0530 Subject: [PATCH 117/362] fix cache step --- .github/workflows/e2e-detox.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index b20989a8b52..a27d26505d4 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -4,10 +4,10 @@ on: push: branches: - main - - ios_detox_job pull_request: branches: - main + types: [labeled, opened, reopened] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} @@ -62,9 +62,8 @@ jobs: - name: Download Existing iOS Simulator Build uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: - name: ios-build-simulator-${{ github.run_id }} - path: . - continue-on-error: true + name: ios-build-simulator + path: . - name: Cache iOS Build id: cache @@ -77,9 +76,8 @@ jobs: if: steps.cache.outputs.cache-hit != 'true' uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: - name: ios-build-simulator-${{ github.run_id }} + name: ios-build-simulator path: Mattermost-simulator-x86_64.app.zip - build-ios-simulator: runs-on: macos-14-large needs: cache-ios-build From 5f2c78038e0fbbabdb61aac350b337739e5723d7 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 09:51:00 +0530 Subject: [PATCH 118/362] fix cache step --- .github/workflows/e2e-detox.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index a27d26505d4..8175caed93b 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - ios_detox_job pull_request: branches: - main From e6b3b1b9ddae176d7b2c2ca00fbc5b8f626562d0 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 09:53:01 +0530 Subject: [PATCH 119/362] remove ios app cache step --- .github/workflows/e2e-detox.yml | 35 ++------------------------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 8175caed93b..9c165dc42ea 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -4,11 +4,9 @@ on: push: branches: - main - - ios_detox_job pull_request: branches: - main - types: [labeled, opened, reopened] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} @@ -52,37 +50,8 @@ jobs: directory: detox/e2e search_path: test - cache-ios-build: - runs-on: macos-14-large - outputs: - cache-hit: ${{ steps.cache.outputs.cache-hit }} - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Download Existing iOS Simulator Build - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - name: ios-build-simulator - path: . - - - name: Cache iOS Build - id: cache - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 - with: - path: Mattermost-simulator-x86_64.app.zip - key: ${{ runner.os }}-ios-build-${{ hashFiles('iOS/**') }} - - - name: Upload iOS Simulator Build - if: steps.cache.outputs.cache-hit != 'true' - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: ios-build-simulator - path: Mattermost-simulator-x86_64.app.zip build-ios-simulator: runs-on: macos-14-large - needs: cache-ios-build - if: ${{ needs.cache-ios-build.outputs.cache-hit != 'true' || (github.event_name == 'pull_request' && contains(github.event.pull_request.head.ref, 'iOS')) }} steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -131,7 +100,7 @@ jobs: - name: Download iOS Simulator Build uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: - name: ios-build-simulator + name: ios-build-simulator-${{ github.run_id }} path: mobile-artifacts - name: Unzip iOS Simulator Build @@ -182,4 +151,4 @@ jobs: npm ci npm run e2e:save-report env: - IOS: true + IOS: true From 5de63d98e5d85417fff33654c141cbe75392c6b8 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 10:15:20 +0530 Subject: [PATCH 120/362] add avd config --- .github/workflows/e2e-detox.yml | 21 ++++++++++++++++----- detox/.detoxrc.json | 2 +- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 73d91a9e033..8f06ede94ef 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -137,6 +137,9 @@ jobs: env: IOS: false GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" + ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' + ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' + ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' runs-on: ubuntu-22.04 name: test-detox-e2e-${{ matrix.runId }} needs: @@ -149,6 +152,14 @@ jobs: - name: Checkout Repository uses: actions/checkout@v4 + - name: Set up Android SDK + uses: android-actions/setup-android@v2 + with: + android-sdk-tools: 'latest' + android-emulator-image: '${{ env.ANDROID_EMULATOR_IMAGE }}' + android-emulator-name: '${{ env.ANDROID_EMULATOR_NAME }}' + android-emulator-device: '${{ env.ANDROID_EMULATOR_DEVICE }}' + - name: Free up space on the runner run: | sudo rm -rf /usr/share/dotnet @@ -161,21 +172,21 @@ jobs: with: name: android-build-apk-${{ github.run_id }} path: android/app/build/outputs/apk/debug/app-debug.apk - + - name: Start React Native Metro Server run: npm run start & - + - name: Install Detox Dependencies run: cd detox && npm ci - + - name: Run Detox E2E Tests run: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - name: Upload iOS Test Report + - name: Upload Android Test Report if: always() uses: actions/upload-artifact@v4 with: - name: ios-results-${{ matrix.runId }} + name: android-results-${{ matrix.runId }} path: detox/artifacts download-e2e-results: diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 72ff2885bc6..d131e0d5f21 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -36,7 +36,7 @@ "android.emulator": { "type": "android.emulator", "device": { - "avdName": "detox_pixel_4_xl_api_31" + "avdName": "pixel_6_pro" } } }, From 1d37a27b361d90f511ba3c9d6222b88fcb0e4f24 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 10:37:40 +0530 Subject: [PATCH 121/362] fix package-lock --- detox/package-lock.json | 2114 ++++++++++++++++++++------------------- 1 file changed, 1061 insertions(+), 1053 deletions(-) diff --git a/detox/package-lock.json b/detox/package-lock.json index a73341c5bb4..803132516c7 100644 --- a/detox/package-lock.json +++ b/detox/package-lock.json @@ -44,13 +44,13 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -504,25 +504,6 @@ "@aws-sdk/client-s3": "^3.0.0" } }, - "node_modules/@aws-sdk/lib-storage/node_modules/buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "node_modules/@aws-sdk/lib-storage/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { "version": "3.433.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.433.0.tgz", @@ -833,12 +814,12 @@ } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", - "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.535.0.tgz", + "integrity": "sha512-PHJ3SL6d2jpcgbqdgiPxkXpu7Drc2PYViwxSIqvvMKhDwzSB1W3mMvtpzwKM4IE7zLFodZo0GKjJ9AsoXndXhA==", "dev": true, "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" @@ -901,48 +882,48 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", + "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.1", + "@babel/parser": "^7.24.1", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -953,34 +934,20 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", @@ -994,26 +961,26 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", - "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -1021,27 +988,18 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", + "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" @@ -1053,24 +1011,15 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz", - "integrity": "sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1080,9 +1029,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", - "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -1105,13 +1054,13 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -1130,33 +1079,33 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", - "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", - "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -1185,9 +1134,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1211,13 +1160,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -1264,9 +1213,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1282,9 +1231,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1305,37 +1254,38 @@ } }, "node_modules/@babel/helpers": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", - "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", + "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.13", - "@babel/types": "^7.20.7" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1345,12 +1295,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1360,14 +1310,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" + "@babel/plugin-transform-optional-chaining": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -1380,6 +1330,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -1480,12 +1431,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1495,12 +1446,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1534,12 +1485,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1651,12 +1602,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1682,12 +1633,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1697,14 +1648,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", - "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1715,14 +1666,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1732,12 +1683,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1747,12 +1698,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz", - "integrity": "sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", + "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1762,13 +1713,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1778,13 +1729,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz", + "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1795,18 +1746,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -1818,13 +1768,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1834,12 +1784,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz", - "integrity": "sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1849,13 +1799,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1865,12 +1815,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1880,12 +1830,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1896,13 +1846,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1912,12 +1862,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1928,12 +1878,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1943,14 +1894,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1960,12 +1911,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1976,12 +1927,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1991,12 +1942,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -2007,12 +1958,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2022,13 +1973,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2055,15 +2006,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", - "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -2073,13 +2024,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2105,12 +2056,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2120,12 +2071,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -2136,12 +2087,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -2152,16 +2103,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" + "@babel/plugin-transform-parameters": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -2171,13 +2121,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -2187,12 +2137,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -2203,12 +2153,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz", - "integrity": "sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -2220,12 +2170,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2235,13 +2185,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2251,14 +2201,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -2269,12 +2219,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2284,12 +2234,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "regenerator-transform": "^0.15.2" }, "engines": { @@ -2300,12 +2250,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2334,22 +2284,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2359,12 +2300,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { @@ -2375,12 +2316,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2390,12 +2331,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2405,12 +2346,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2420,12 +2361,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2435,13 +2376,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2451,13 +2392,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2467,13 +2408,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -2576,15 +2517,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", @@ -2606,9 +2538,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", - "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", + "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2618,34 +2550,34 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5", - "debug": "^4.1.0", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -2653,13 +2585,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -3111,14 +3043,14 @@ } }, "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", - "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", "dev": true, "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" }, @@ -3151,9 +3083,9 @@ } }, "node_modules/@jest/reporters/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3314,12 +3246,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3429,46 +3355,47 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -3565,9 +3492,9 @@ } }, "node_modules/@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "dev": true, "peer": true, "funding": { @@ -3588,9 +3515,9 @@ "dev": true }, "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "dependencies": { "type-detect": "4.0.8" @@ -3606,268 +3533,269 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.12.tgz", - "integrity": "sha512-YIJyefe1mi3GxKdZxEBEuzYOeQ9xpYfqnFmWzojCssRAuR7ycxwpoRQgp965vuW426xUAQhCV5rCaWElQ7XsaA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.2.0.tgz", + "integrity": "sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==", "dev": true, "dependencies": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/chunked-blob-reader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.0.0.tgz", - "integrity": "sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.2.0.tgz", + "integrity": "sha512-3GJNvRwXBGdkDZZOGiziVYzDpn4j6zfyULHMDKAGIUo72yHALpE9CbhfQp/XcLNVoc1byfMpn6uW5H2BqPjgaQ==", "dev": true, "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" } }, "node_modules/@smithy/chunked-blob-reader-native": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.0.tgz", - "integrity": "sha512-HM8V2Rp1y8+1343tkZUKZllFhEQPNmpNdgFAncbTsxkZ18/gqjk23XXv3qGyXWp412f3o43ZZ1UZHVcHrpRnCQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.2.0.tgz", + "integrity": "sha512-VNB5+1oCgX3Fzs072yuRsUoC2N4Zg/LJ11DTxX3+Qu+Paa6AmbIF0E9sc2wthz9Psrk/zcOlTCyuposlIhPjZQ==", "dev": true, "dependencies": { - "@smithy/util-base64": "^2.0.0", - "tslib": "^2.5.0" + "@smithy/util-base64": "^2.3.0", + "tslib": "^2.6.2" } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.16.tgz", - "integrity": "sha512-1k+FWHQDt2pfpXhJsOmNMmlAZ3NUQ98X5tYsjQhVGq+0X6cOBMhfh6Igd0IX3Ut6lEO6DQAdPMI/blNr3JZfMQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.2.0.tgz", + "integrity": "sha512-fsiMgd8toyUba6n1WRmr+qACzXltpdDkPTAaDqc8QqPBUzO+/JKwL6bUBseHVi8tu9l+3JOK+tSf7cay+4B3LA==", "dev": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.3", - "@smithy/types": "^2.4.0", - "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.5", - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^2.3.0", + "@smithy/types": "^2.12.0", + "@smithy/util-config-provider": "^2.3.0", + "@smithy/util-middleware": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.18.tgz", - "integrity": "sha512-QnPBi6D2zj6AHJdUTo5zXmk8vwHJ2bNevhcVned1y+TZz/OI5cizz5DsYNkqFUIDn8tBuEyKNgbmKVNhBbuY3g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.3.0.tgz", + "integrity": "sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==", "dev": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.3", - "@smithy/property-provider": "^2.0.13", - "@smithy/types": "^2.4.0", - "@smithy/url-parser": "^2.0.12", - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^2.3.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz", - "integrity": "sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.2.0.tgz", + "integrity": "sha512-8janZoJw85nJmQZc4L8TuePp2pk1nxLgkxIR0TUjKJ5Dkj5oelB9WtiSSGXCQvNsJl0VSTvK/2ueMXxvpa9GVw==", "dev": true, "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.4.0", - "@smithy/util-hex-encoding": "^2.0.0", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "@smithy/util-hex-encoding": "^2.2.0", + "tslib": "^2.6.2" } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.12.tgz", - "integrity": "sha512-0pi8QlU/pwutNshoeJcbKR1p7Ie5STd8UFAMX5xhSoSJjNlxIv/OsHbF023jscMRN2Prrqd6ToGgdCnsZVQjvg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.2.0.tgz", + "integrity": "sha512-UaPf8jKbcP71BGiO0CdeLmlg+RhWnlN8ipsMSdwvqBFigl5nil3rHOI/5GE3tfiuX8LvY5Z9N0meuU7Rab7jWw==", "dev": true, "dependencies": { - "@smithy/eventstream-serde-universal": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/eventstream-serde-universal": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.12.tgz", - "integrity": "sha512-I0XfwQkIX3gAnbrU5rLMkBSjTM9DHttdbLwf12CXmj7SSI5dT87PxtKLRrZGanaCMbdf2yCep+MW5/4M7IbvQA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.2.0.tgz", + "integrity": "sha512-RHhbTw/JW3+r8QQH7PrganjNCiuiEZmpi6fYUAetFfPLfZ6EkiA08uN3EFfcyKubXQxOwTeJRZSQmDDCdUshaA==", "dev": true, "dependencies": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.12.tgz", - "integrity": "sha512-vf1vMHGOkG3uqN9x1zKOhnvW/XgvhJXWqjV6zZiT2FMjlEayugQ1mzpSqr7uf89+BzjTzuZKERmOsEAmewLbxw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.2.0.tgz", + "integrity": "sha512-zpQMtJVqCUMn+pCSFcl9K/RPNtQE0NuMh8sKpCdEHafhwRsjP50Oq/4kMmvxSRy6d8Jslqd8BLvDngrUtmN9iA==", "dev": true, "dependencies": { - "@smithy/eventstream-serde-universal": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/eventstream-serde-universal": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.12.tgz", - "integrity": "sha512-xZ3ZNpCxIND+q+UCy7y1n1/5VQEYicgSTNCcPqsKawX+Vd+6OcFX7gUHMyPzL8cZr+GdmJuxNleqHlH4giK2tw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.2.0.tgz", + "integrity": "sha512-pvoe/vvJY0mOpuF84BEtyZoYfbehiFj8KKWk1ds2AT0mTLYFVs+7sBJZmioOFdBXKd48lfrx1vumdPdmGlCLxA==", "dev": true, "dependencies": { - "@smithy/eventstream-codec": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/eventstream-codec": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.4.tgz", - "integrity": "sha512-gIPRFEGi+c6V52eauGKrjDzPWF2Cu7Z1r5F8A3j2wcwz25sPG/t8kjsbEhli/tS/2zJp/ybCZXe4j4ro3yv/HA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.5.0.tgz", + "integrity": "sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==", "dev": true, "dependencies": { - "@smithy/protocol-http": "^3.0.8", - "@smithy/querystring-builder": "^2.0.12", - "@smithy/types": "^2.4.0", - "@smithy/util-base64": "^2.0.0", - "tslib": "^2.5.0" + "@smithy/protocol-http": "^3.3.0", + "@smithy/querystring-builder": "^2.2.0", + "@smithy/types": "^2.12.0", + "@smithy/util-base64": "^2.3.0", + "tslib": "^2.6.2" } }, "node_modules/@smithy/hash-blob-browser": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.12.tgz", - "integrity": "sha512-riLnV16f27yyePX8UF0deRHAeccUK8SrOxyTykSTrnVkgS3DsjNapZtTbd8OGNKEbI60Ncdb5GwN3rHZudXvog==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.2.0.tgz", + "integrity": "sha512-SGPoVH8mdXBqrkVCJ1Hd1X7vh1zDXojNN1yZyZTZsCno99hVue9+IYzWDjq/EQDDXxmITB0gBmuyPh8oAZSTcg==", "dev": true, "dependencies": { - "@smithy/chunked-blob-reader": "^2.0.0", - "@smithy/chunked-blob-reader-native": "^2.0.0", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/chunked-blob-reader": "^2.2.0", + "@smithy/chunked-blob-reader-native": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" } }, "node_modules/@smithy/hash-node": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.12.tgz", - "integrity": "sha512-fDZnTr5j9t5qcbeJ037aMZXxMka13Znqwrgy3PAqYj6Dm3XHXHftTH3q+NWgayUxl1992GFtQt1RuEzRMy3NnQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.2.0.tgz", + "integrity": "sha512-zLWaC/5aWpMrHKpoDF6nqpNtBhlAYKF/7+9yMN7GpdR8CzohnWfGtMznPybnwSS8saaXBMxIGwJqR4HmRp6b3g==", "dev": true, "dependencies": { - "@smithy/types": "^2.4.0", - "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "@smithy/util-buffer-from": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/hash-stream-node": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.0.12.tgz", - "integrity": "sha512-x/DrSynPKrW0k00q7aZ/vy531a3mRw79mOajHp+cIF0TrA1SqEMFoy/B8X0XtoAtlJWt/vvgeDNqt/KAeaAqMw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.2.0.tgz", + "integrity": "sha512-aT+HCATOSRMGpPI7bi7NSsTNVZE/La9IaxLXWoVAYMxHT5hGO3ZOGEMZQg8A6nNL+pdFGtZQtND1eoY084HgHQ==", "dev": true, "dependencies": { - "@smithy/types": "^2.4.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.12.tgz", - "integrity": "sha512-p5Y+iMHV3SoEpy3VSR7mifbreHQwVSvHSAz/m4GdoXfOzKzaYC8hYv10Ks7Deblkf7lhas8U+lAp9ThbBM+ZXA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.2.0.tgz", + "integrity": "sha512-nEDASdbKFKPXN2O6lOlTgrEEOO9NHIeO+HVvZnkqc8h5U9g3BIhWsvzFo+UcUbliMHvKNPD/zVxDrkP1Sbgp8Q==", "dev": true, "dependencies": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" } }, "node_modules/@smithy/is-array-buffer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", - "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "dev": true, "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/md5-js": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.12.tgz", - "integrity": "sha512-OgDt+Xnrw+W5z3MSl5KZZzebqmXrYl9UdbCiBYnnjErmNywwSjV6QB/Oic3/7hnsPniSU81n7Rvlhz2kH4EREQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.2.0.tgz", + "integrity": "sha512-M26XTtt9IIusVMOWEAhIvFIr9jYj4ISPPGJROqw6vXngO3IYJCnVVSMFn4Tx1rUTG5BiKJNg9u2nxmBiZC5IlQ==", "dev": true, "dependencies": { - "@smithy/types": "^2.4.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.14.tgz", - "integrity": "sha512-poUNgKTw9XwPXfX9nEHpVgrMNVpaSMZbshqvPxFVoalF4wp6kRzYKOfdesSVectlQ51VtigoLfbXcdyPwvxgTg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.2.0.tgz", + "integrity": "sha512-5bl2LG1Ah/7E5cMSC+q+h3IpVHMeOkG0yLRyQT1p2aMJkSrZG7RlXHPuAgb7EyaFeidKEnnd/fNaLLaKlHGzDQ==", "dev": true, "dependencies": { - "@smithy/protocol-http": "^3.0.8", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/protocol-http": "^3.3.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.3.tgz", - "integrity": "sha512-ZrQ0/YX6hNVTxqMEHtEaDbDv6pNeEji/a5Vk3HuFC5R3ZY8lfoATyxmOGxBVYnF3NUvZLNC7umEv1WzWGWvCGQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.5.0.tgz", + "integrity": "sha512-OBhI9ZEAG8Xen0xsFJwwNOt44WE2CWkfYIxTognC8x42Lfsdf0VN/wCMqpdkySMDio/vts10BiovAxQp0T0faA==", "dev": true, "dependencies": { - "@smithy/middleware-serde": "^2.0.12", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/shared-ini-file-loader": "^2.2.2", - "@smithy/types": "^2.4.0", - "@smithy/url-parser": "^2.0.12", - "@smithy/util-middleware": "^2.0.5", - "tslib": "^2.5.0" + "@smithy/middleware-serde": "^2.3.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-middleware": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/middleware-retry": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.18.tgz", - "integrity": "sha512-VyrHQRldGSb3v9oFOB5yPxmLT7U2sQic2ytylOnYlnsmVOLlFIaI6sW22c+w2675yq+XZ6HOuzV7x2OBYCWRNA==", - "dev": true, - "dependencies": { - "@smithy/node-config-provider": "^2.1.3", - "@smithy/protocol-http": "^3.0.8", - "@smithy/service-error-classification": "^2.0.5", - "@smithy/types": "^2.4.0", - "@smithy/util-middleware": "^2.0.5", - "@smithy/util-retry": "^2.0.5", - "tslib": "^2.5.0", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.2.0.tgz", + "integrity": "sha512-PsjDOLpbevgn37yJbawmfVoanru40qVA8UEf2+YA1lvOefmhuhL6ZbKtGsLAWDRnE1OlAmedsbA/htH6iSZjNA==", + "dev": true, + "dependencies": { + "@smithy/node-config-provider": "^2.3.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/service-error-classification": "^2.1.5", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "tslib": "^2.6.2", "uuid": "^8.3.2" }, "engines": { @@ -3884,405 +3812,408 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.12.tgz", - "integrity": "sha512-IBeco157lIScecq2Z+n0gq56i4MTnfKxS7rbfrAORveDJgnbBAaEQgYqMqp/cYqKrpvEXcyTjwKHrBjCCIZh2A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.3.0.tgz", + "integrity": "sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==", "dev": true, "dependencies": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/middleware-stack": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.6.tgz", - "integrity": "sha512-YSvNZeOKWLJ0M/ycxwDIe2Ztkp6Qixmcml1ggsSv2fdHKGkBPhGrX5tMzPGMI1yyx55UEYBi2OB4s+RriXX48A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.2.0.tgz", + "integrity": "sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==", "dev": true, "dependencies": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/node-config-provider": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.3.tgz", - "integrity": "sha512-J6lXvRHGVnSX3n1PYi+e1L5HN73DkkJpUviV3Ebf+8wSaIjAf+eVNbzyvh/S5EQz7nf4KVfwbD5vdoZMAthAEQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.3.0.tgz", + "integrity": "sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==", "dev": true, "dependencies": { - "@smithy/property-provider": "^2.0.13", - "@smithy/shared-ini-file-loader": "^2.2.2", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/property-provider": "^2.2.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/node-http-handler": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.8.tgz", - "integrity": "sha512-KZylM7Wff/So5SmCiwg2kQNXJ+RXgz34wkxS7WNwIUXuZrZZpY/jKJCK+ZaGyuESDu3TxcaY+zeYGJmnFKbQsA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.5.0.tgz", + "integrity": "sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==", "dev": true, "dependencies": { - "@smithy/abort-controller": "^2.0.12", - "@smithy/protocol-http": "^3.0.8", - "@smithy/querystring-builder": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/abort-controller": "^2.2.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/querystring-builder": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/property-provider": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.13.tgz", - "integrity": "sha512-VJqUf2CbsQX6uUiC5dUPuoEATuFjkbkW3lJHbRnpk9EDC9X+iKqhfTK+WP+lve5EQ9TcCI1Q6R7hrg41FyC54w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.2.0.tgz", + "integrity": "sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==", "dev": true, "dependencies": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/protocol-http": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", - "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.3.0.tgz", + "integrity": "sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==", "dev": true, "dependencies": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/querystring-builder": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.12.tgz", - "integrity": "sha512-cDbF07IuCjiN8CdGvPzfJjXIrmDSelScRfyJYrYBNBbKl2+k7QD/KqiHhtRyEKgID5mmEVrV6KE6L/iPJ98sFw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.2.0.tgz", + "integrity": "sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==", "dev": true, "dependencies": { - "@smithy/types": "^2.4.0", - "@smithy/util-uri-escape": "^2.0.0", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "@smithy/util-uri-escape": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/querystring-parser": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.12.tgz", - "integrity": "sha512-fytyTcXaMzPBuNtPlhj5v6dbl4bJAnwKZFyyItAGt4Tgm9HFPZNo7a9r1SKPr/qdxUEBzvL9Rh+B9SkTX3kFxg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.2.0.tgz", + "integrity": "sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==", "dev": true, "dependencies": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/service-error-classification": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.5.tgz", - "integrity": "sha512-M0SeJnEgD2ywJyV99Fb1yKFzmxDe9JfpJiYTVSRMyRLc467BPU0qsuuDPzMCdB1mU8M8u1rVOdkqdoyFN8UFTw==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.5.tgz", + "integrity": "sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==", "dev": true, "dependencies": { - "@smithy/types": "^2.4.0" + "@smithy/types": "^2.12.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.2.tgz", - "integrity": "sha512-noyQUPn7b1M8uB0GEXc/Zyxq+5K2b7aaqWnLp+hgJ7+xu/FCvtyWy5eWLDjQEsHnAet2IZhS5QF8872OR69uNg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.4.0.tgz", + "integrity": "sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==", "dev": true, "dependencies": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/signature-v4": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.12.tgz", - "integrity": "sha512-6Kc2lCZEVmb1nNYngyNbWpq0d82OZwITH11SW/Q0U6PX5fH7B2cIcFe7o6eGEFPkTZTP8itTzmYiGcECL0D0Lw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.2.0.tgz", + "integrity": "sha512-+B5TNzj/fRZzVW3z8UUJOkNx15+4E0CLuvJmJUA1JUIZFp3rdJ/M2H5r2SqltaVPXL0oIxv/6YK92T9TsFGbFg==", "dev": true, "dependencies": { - "@smithy/eventstream-codec": "^2.0.12", - "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.4.0", - "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-middleware": "^2.0.5", - "@smithy/util-uri-escape": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" + "@smithy/eventstream-codec": "^2.2.0", + "@smithy/is-array-buffer": "^2.2.0", + "@smithy/types": "^2.12.0", + "@smithy/util-hex-encoding": "^2.2.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-uri-escape": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/smithy-client": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.12.tgz", - "integrity": "sha512-XXqhridfkKnpj+lt8vM6HRlZbqUAqBjVC74JIi13F/AYQd/zTj9SOyGfxnbp4mjY9q28LityxIuV8CTinr9r5w==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.5.0.tgz", + "integrity": "sha512-DDXWHWdimtS3y/Kw1Jo46KQ0ZYsDKcldFynQERUGBPDpkW1lXOTHy491ALHjwfiBQvzsVKVxl5+ocXNIgJuX4g==", "dev": true, "dependencies": { - "@smithy/middleware-stack": "^2.0.6", - "@smithy/types": "^2.4.0", - "@smithy/util-stream": "^2.0.17", - "tslib": "^2.5.0" + "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/types": "^2.12.0", + "@smithy/util-stream": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/types": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", - "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz", + "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==", "dev": true, "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/url-parser": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.12.tgz", - "integrity": "sha512-qgkW2mZqRvlNUcBkxYB/gYacRaAdck77Dk3/g2iw0S9F0EYthIS3loGfly8AwoWpIvHKhkTsCXXQfzksgZ4zIA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.2.0.tgz", + "integrity": "sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==", "dev": true, "dependencies": { - "@smithy/querystring-parser": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/querystring-parser": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" } }, "node_modules/@smithy/util-base64": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", - "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.3.0.tgz", + "integrity": "sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==", "dev": true, "dependencies": { - "@smithy/util-buffer-from": "^2.0.0", - "tslib": "^2.5.0" + "@smithy/util-buffer-from": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-body-length-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", - "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.2.0.tgz", + "integrity": "sha512-dtpw9uQP7W+n3vOtx0CfBD5EWd7EPdIdsQnWTDoFf77e3VUf05uA7R7TGipIo8e4WL2kuPdnsr3hMQn9ziYj5w==", "dev": true, "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" } }, "node_modules/@smithy/util-body-length-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", - "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.3.0.tgz", + "integrity": "sha512-ITWT1Wqjubf2CJthb0BuT9+bpzBfXeMokH/AAa5EJQgbv9aPMVfnM76iFIZVFf50hYXGbtiV71BHAthNWd6+dw==", "dev": true, "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-buffer-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", - "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "dev": true, "dependencies": { - "@smithy/is-array-buffer": "^2.0.0", - "tslib": "^2.5.0" + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-config-provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", - "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.3.0.tgz", + "integrity": "sha512-HZkzrRcuFN1k70RLqlNK4FnPXKOpkik1+4JaBoHNJn+RnJGYqaa3c5/+XtLOXhlKzlRgNvyaLieHTW2VwGN0VQ==", "dev": true, "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.16.tgz", - "integrity": "sha512-Uv5Cu8nVkuvLn0puX+R9zWbSNpLIR3AxUlPoLJ7hC5lvir8B2WVqVEkJLwtixKAncVLasnTVjPDCidtAUTGEQw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.2.0.tgz", + "integrity": "sha512-2okTdZaCBvOJszAPU/KSvlimMe35zLOKbQpHhamFJmR7t95HSe0K3C92jQPjKY3PmDBD+7iMkOnuW05F5OlF4g==", "dev": true, "dependencies": { - "@smithy/property-provider": "^2.0.13", - "@smithy/smithy-client": "^2.1.12", - "@smithy/types": "^2.4.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", "bowser": "^2.11.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">= 10.0.0" } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.21.tgz", - "integrity": "sha512-cUEsttVZ79B7Al2rWK2FW03HBpD9LyuqFtm+1qFty5u9sHSdesr215gS2Ln53fTopNiPgeXpdoM3IgjvIO0rJw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.3.0.tgz", + "integrity": "sha512-hfKXnNLmsW9cmLb/JXKIvtuO6Cf4SuqN5PN1C2Ru/TBIws+m1wSgb+A53vo0r66xzB6E82inKG2J7qtwdi+Kkw==", "dev": true, "dependencies": { - "@smithy/config-resolver": "^2.0.16", - "@smithy/credential-provider-imds": "^2.0.18", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/property-provider": "^2.0.13", - "@smithy/smithy-client": "^2.1.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/config-resolver": "^2.2.0", + "@smithy/credential-provider-imds": "^2.3.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">= 10.0.0" } }, "node_modules/@smithy/util-endpoints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.2.tgz", - "integrity": "sha512-QEdq+sP68IJHAMVB2ugKVVZEWeKQtZLuf+akHzc8eTVElsZ2ZdVLWC6Cp+uKjJ/t4yOj1qu6ZzyxJQEQ8jdEjg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.2.0.tgz", + "integrity": "sha512-BuDHv8zRjsE5zXd3PxFXFknzBG3owCpjq8G3FcsXW3CykYXuEqM3nTSsmLzw5q+T12ZYuDlVUZKBdpNbhVtlrQ==", "dev": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.3", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^2.3.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@smithy/util-hex-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", - "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.2.0.tgz", + "integrity": "sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==", "dev": true, "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-middleware": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.5.tgz", - "integrity": "sha512-1lyT3TcaMJQe+OFfVI+TlomDkPuVzb27NZYdYtmSTltVmLaUjdCyt4KE+OH1CnhZKsz4/cdCL420Lg9UH5Z2Mw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.2.0.tgz", + "integrity": "sha512-L1qpleXf9QD6LwLCJ5jddGkgWyuSvWBkJwWAZ6kFkdifdso+sk3L3O1HdmPvCdnCK3IS4qWyPxev01QMnfHSBw==", "dev": true, "dependencies": { - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-retry": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.5.tgz", - "integrity": "sha512-x3t1+MQAJ6QONk3GTbJNcugCFDVJ+Bkro5YqQQK1EyVesajNDqxFtCx9WdOFNGm/Cbm7tUdwVEmfKQOJoU2Vtw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.2.0.tgz", + "integrity": "sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g==", "dev": true, "dependencies": { - "@smithy/service-error-classification": "^2.0.5", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/service-error-classification": "^2.1.5", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@smithy/util-stream": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.17.tgz", - "integrity": "sha512-fP/ZQ27rRvHsqItds8yB7jerwMpZFTL3QqbQbidUiG0+mttMoKdP0ZqnvM8UK5q0/dfc3/pN7g4XKPXOU7oRWw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.2.0.tgz", + "integrity": "sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==", "dev": true, "dependencies": { - "@smithy/fetch-http-handler": "^2.2.4", - "@smithy/node-http-handler": "^2.1.8", - "@smithy/types": "^2.4.0", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-buffer-from": "^2.2.0", + "@smithy/util-hex-encoding": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-uri-escape": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", - "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.2.0.tgz", + "integrity": "sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==", "dev": true, "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-utf8": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", - "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "dev": true, "dependencies": { - "@smithy/util-buffer-from": "^2.0.0", - "tslib": "^2.5.0" + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-waiter": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.12.tgz", - "integrity": "sha512-3sENmyVa1NnOPoiT2NCApPmu7ukP7S/v7kL9IxNmnygkDldn7/yK0TP42oPJLwB2k3mospNsSePIlqdXEUyPHA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.2.0.tgz", + "integrity": "sha512-IHk53BVw6MPMi2Gsn+hCng8rFA3ZmR3Rk7GllxDUW9qFJl/hiSvskn7XldkECapQVkIg/1dHpMAxI9xSTaLLSA==", "dev": true, "dependencies": { - "@smithy/abort-controller": "^2.0.12", - "@smithy/types": "^2.4.0", - "tslib": "^2.5.0" + "@smithy/abort-controller": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@types/babel__core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", - "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -4293,18 +4224,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.5", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", - "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", - "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -4312,42 +4243,42 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", - "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" @@ -4364,15 +4295,18 @@ } }, "node_modules/@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "dev": true + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, "node_modules/@types/tough-cookie": { @@ -4388,18 +4322,18 @@ "dev": true }, "node_modules/@types/yargs": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", - "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, "node_modules/abbrev": { @@ -4675,48 +4609,71 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", - "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", + "@babel/helper-define-polyfill-provider": "^0.6.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", - "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.31.0" + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", - "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2" + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4794,9 +4751,9 @@ "dev": true }, "node_modules/bootstrap": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", - "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", "dev": true, "funding": [ { @@ -4809,7 +4766,7 @@ } ], "peerDependencies": { - "@popperjs/core": "^2.11.6" + "@popperjs/core": "^2.11.8" } }, "node_modules/bowser": { @@ -4846,9 +4803,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.11", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", - "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -4865,9 +4822,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001538", - "electron-to-chromium": "^1.4.526", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -4898,6 +4855,16 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -5065,9 +5032,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001538", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", - "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "version": "1.0.30001600", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", + "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", "dev": true, "funding": [ { @@ -5108,15 +5075,15 @@ } }, "node_modules/chart.js": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.2.1.tgz", - "integrity": "sha512-6YbpQ0nt3NovAgOzbkSSeeAQu/3za1319dPUQTXn9WcOpywM8rGKxJHrhS8V8xEkAlk8YhEfjbuAPfUyp6jIsw==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.2.tgz", + "integrity": "sha512-6GD7iKwFpP5kbSD4MeRRRlTnQvxfQREy36uEtm1hzHzcOqwWx0YEHuspuoNlslu+nciLIB7fjjsHkUv/FzFcOg==", "dev": true, "dependencies": { "@kurkle/color": "^0.3.0" }, "engines": { - "pnpm": "^7.0.0" + "pnpm": ">=8" } }, "node_modules/child-process-promise": { @@ -5131,9 +5098,9 @@ } }, "node_modules/ci-info": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", - "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -5189,9 +5156,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "node_modules/color-convert": { @@ -5237,18 +5204,18 @@ "dev": true }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/core-js-compat": { - "version": "3.32.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.2.tgz", - "integrity": "sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", "dev": true, "dependencies": { - "browserslist": "^4.21.10" + "browserslist": "^4.23.0" }, "funding": { "type": "opencollective", @@ -5632,9 +5599,9 @@ } }, "node_modules/detox/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5683,9 +5650,9 @@ } }, "node_modules/diff2html": { - "version": "3.4.43", - "resolved": "https://registry.npmjs.org/diff2html/-/diff2html-3.4.43.tgz", - "integrity": "sha512-cBiJKvyhY3bv+q9VHA7YyNdPk1PA+P9lArpp0MJlcpn1x4eiXYtK3ILNpcHXfgPTCdjjCilGvX9qBelGWtyMCg==", + "version": "3.4.47", + "resolved": "https://registry.npmjs.org/diff2html/-/diff2html-3.4.47.tgz", + "integrity": "sha512-2llDp8750FRUJl8n7apM0tlcqZYxbDHTw7qhzv/kGddByHRpn3Xg/sWHHIy34h492aGSpStEULydxqrITYpuoA==", "dev": true, "dependencies": { "diff": "5.1.0", @@ -5695,7 +5662,7 @@ "node": ">=12" }, "optionalDependencies": { - "highlight.js": "11.8.0" + "highlight.js": "11.9.0" } }, "node_modules/dtrace-provider": { @@ -5731,9 +5698,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.527", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.527.tgz", - "integrity": "sha512-EafxEiEDzk2aLrdbtVczylHflHdHkNrpGNHIgDyA63sUQLQVS2ayj2hPw3RsVB42qkwURH+T2OxV7kGPUuYszA==", + "version": "1.4.715", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.715.tgz", + "integrity": "sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==", "dev": true }, "node_modules/emittery": { @@ -5764,9 +5731,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -5812,6 +5779,15 @@ "node": ">=4.0.0" } }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -5949,9 +5925,9 @@ } }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -6014,9 +5990,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { @@ -6048,9 +6024,9 @@ } }, "node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -6068,9 +6044,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -6082,10 +6058,13 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/funpermaproxy": { "version": "1.1.0", @@ -6176,23 +6155,11 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -6202,10 +6169,22 @@ "node": ">=4" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/highlight.js": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz", - "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz", + "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==", "dev": true, "optional": true, "engines": { @@ -6285,10 +6264,24 @@ } }, "node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/import-local": { "version": "3.1.0", @@ -6349,15 +6342,6 @@ "node": ">= 0.10" } }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -6365,12 +6349,12 @@ "dev": true }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6485,9 +6469,9 @@ "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "engines": { "node": ">=8" @@ -6510,17 +6494,17 @@ } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-report/node_modules/has-flag": { @@ -6559,9 +6543,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -7156,12 +7140,12 @@ } }, "node_modules/jest-environment-emit": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/jest-environment-emit/-/jest-environment-emit-1.0.5.tgz", - "integrity": "sha512-OsQ08AhYxkkyDBTIow+9ogNmJheQIGWQKp0Nku+1ToLWjAj2Pd6LmypN8HgUIqYHs4HFcqkQ25kaf1qExmoZpg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/jest-environment-emit/-/jest-environment-emit-1.0.7.tgz", + "integrity": "sha512-/0AYqbL3zrfRTtGyzTZwgRxQZiDXEM8ZUfY7Uscla/XGs9vszx4f0XTSZqAk3CQaiwYAoKvFZkB2vSKm1Q08fQ==", "dev": true, "dependencies": { - "bunyamin": "^1.5.0", + "bunyamin": "^1.5.2", "bunyan": "^2.0.5", "bunyan-debug-stream": "^3.1.0", "funpermaproxy": "^1.1.0", @@ -7998,9 +7982,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -8445,9 +8429,9 @@ } }, "node_modules/jquery": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz", - "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", "dev": true }, "node_modules/js-message": { @@ -8503,9 +8487,9 @@ } }, "node_modules/json-cycle": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/json-cycle/-/json-cycle-1.3.0.tgz", - "integrity": "sha512-FD/SedD78LCdSvJaOUQAXseT8oQBb5z6IVYaQaCrVUlu9zOAr1BDdKyVYQaSD/GDsAMrXpKcOyBD4LIl8nfjHw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/json-cycle/-/json-cycle-1.5.0.tgz", + "integrity": "sha512-GOehvd5PO2FeZ5T4c+RxobeT5a1PiGpF4u9/3+UvrMU4bhnVqzJY7hm39wg8PDCqkU91fWGH8qjWR4bn+wgq9w==", "dev": true, "engines": { "node": ">= 4" @@ -8635,20 +8619,53 @@ } }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -8744,9 +8761,9 @@ } }, "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "optional": true, "funding": { @@ -8766,9 +8783,9 @@ } }, "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "dev": true, "engines": { "node": "*" @@ -8846,9 +8863,9 @@ } }, "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", + "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==", "dev": true, "optional": true }, @@ -8889,9 +8906,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/node-version": { @@ -8973,9 +8990,9 @@ } }, "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "dependencies": { "define-lazy-prop": "^2.0.0", @@ -9110,9 +9127,9 @@ } }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, "engines": { "node": ">= 6" @@ -9215,19 +9232,22 @@ } }, "node_modules/popsicle": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/popsicle/-/popsicle-12.1.0.tgz", - "integrity": "sha512-muNC/cIrWhfR6HqqhHazkxjob3eyECBe8uZYSQ/N5vixNAgssacVleerXnE8Are5fspR0a+d2qWaBR1g7RYlmw==", + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/popsicle/-/popsicle-12.1.2.tgz", + "integrity": "sha512-xE2vEUa15TiHvFhGmKTtdKk9aSLL5CHX8Vw5kHfVM3R0YHiaTon6Ybsamw0XYqMR+Ng2RijX88iYUKPBMpLBww==", "dev": true, "dependencies": { "popsicle-content-encoding": "^1.0.0", - "popsicle-cookie-jar": "^1.0.0", + "popsicle-cookie-jar": "^1.0.1", "popsicle-redirects": "^1.1.0", - "popsicle-transport-http": "^1.0.8", + "popsicle-transport-http": "^1.1.0", "popsicle-transport-xhr": "^2.0.0", "popsicle-user-agent": "^1.0.0", "servie": "^4.3.3", "throwback": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/popsicle-content-encoding": { @@ -9240,38 +9260,21 @@ } }, "node_modules/popsicle-cookie-jar": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/popsicle-cookie-jar/-/popsicle-cookie-jar-1.0.0.tgz", - "integrity": "sha512-vrlOGvNVELko0+J8NpGC5lHWDGrk8LQJq9nwAMIVEVBfN1Lib3BLxAaLRGDTuUnvl45j5N9dT2H85PULz6IjjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/popsicle-cookie-jar/-/popsicle-cookie-jar-1.0.1.tgz", + "integrity": "sha512-QVIZhADP8nDbXIQW6wq8GU9IOSE8INUACO/9KD9TFKQ7qq8r/y3qUDz59xIi6p6TH19lCJJyBAPSXP1liIoySw==", "dev": true, "dependencies": { - "@types/tough-cookie": "^2.3.5", - "tough-cookie": "^3.0.1" + "@types/tough-cookie": "^4.0.2", + "tough-cookie": "^4.1.3" + }, + "engines": { + "node": ">=8" }, "peerDependencies": { "servie": "^4.0.0" } }, - "node_modules/popsicle-cookie-jar/node_modules/@types/tough-cookie": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.8.tgz", - "integrity": "sha512-7axfYN8SW9pWg78NgenHasSproWQee5rzyPVLC9HpaQSDgNArsnKJD88EaMfi4Pl48AyciO3agYCFqpHS1gLpg==", - "dev": true - }, - "node_modules/popsicle-cookie-jar/node_modules/tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "dependencies": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/popsicle-redirects": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/popsicle-redirects/-/popsicle-redirects-1.1.1.tgz", @@ -9392,18 +9395,18 @@ "dev": true }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/pure-rand": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.3.tgz", - "integrity": "sha512-KddyFewCsO0j3+np81IQ+SweXLDnDQTs5s67BOnrYmYe/yNmUhttQyGsYzy8yUnoljGAQ9sl38YB4vH8ur7Y+w==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { @@ -9449,9 +9452,9 @@ "dev": true }, "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -9522,9 +9525,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -9534,9 +9537,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "dev": true }, "node_modules/regenerator-transform": { @@ -9611,18 +9614,18 @@ "dev": true }, "node_modules/reselect": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz", - "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", "dev": true }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -9796,15 +9799,15 @@ } }, "node_modules/sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", "dev": true }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -9870,9 +9873,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10035,9 +10038,9 @@ "dev": true }, "node_modules/stream-json": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.7.5.tgz", - "integrity": "sha512-NSkoVduGakxZ8a+pTPUlcGEeAGQpWL9rKJhOFCV+J/QtdQUEU5vtBgVg6eJXn8JB8RZvpbJWZGvXkhz70MLWoA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.8.0.tgz", + "integrity": "sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==", "dev": true, "dependencies": { "stream-chain": "^2.2.5" @@ -10316,13 +10319,12 @@ } }, "node_modules/trace-event-lib": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/trace-event-lib/-/trace-event-lib-1.3.1.tgz", - "integrity": "sha512-RO/TD5E9RNqU6MhOfi/njFWKYhrzOJCpRXlEQHgXwM+6boLSrQnOZ9xbHwOXzC+Luyixc7LNNSiTsqTVeF7I1g==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/trace-event-lib/-/trace-event-lib-1.4.1.tgz", + "integrity": "sha512-TOgFolKG8JFY+9d5EohGWMvwvteRafcyfPWWNIqcuD1W/FUvxWcy2MSCZ/beYHM63oYPHYHCd3tkbgCctHVP7w==", "dev": true, "dependencies": { - "browser-process-hrtime": "^1.0.0", - "lodash": "^4.17.21" + "browser-process-hrtime": "^1.0.0" }, "engines": { "node": ">=12.0.0" @@ -10399,9 +10401,9 @@ } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -10459,6 +10461,12 @@ "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -10500,9 +10508,9 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -10583,14 +10591,14 @@ } }, "node_modules/v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "convert-source-map": "^2.0.0" }, "engines": { "node": ">=10.12.0" From 5b67fafb34f9268febb4564670a0453491209c63 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 10:40:48 +0530 Subject: [PATCH 122/362] remove split.go --- .github/actions/prepare-ios-build/action.yaml | 2 + .github/workflows/e2e-detox.yml | 2 + split.go | 114 ------------------ 3 files changed, 4 insertions(+), 114 deletions(-) delete mode 100644 split.go diff --git a/.github/actions/prepare-ios-build/action.yaml b/.github/actions/prepare-ios-build/action.yaml index 76a67474274..710b71325e8 100644 --- a/.github/actions/prepare-ios-build/action.yaml +++ b/.github/actions/prepare-ios-build/action.yaml @@ -5,6 +5,8 @@ runs: using: composite steps: - name: ci/install-os-deps + env: + HOMEBREW_NO_AUTO_UPDATE: "1" shell: bash run: | echo "::group::install-os-deps" diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 7dacd01190d..3c687d6aac4 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -134,6 +134,7 @@ jobs: sudo rm -rf /opt/ghc sudo rm -rf "/usr/local/share/boost" sudo rm -rf "$AGENT_TOOLSDIRECTORY" + - name: ci/prepare-android-build uses: ./.github/actions/prepare-android-build env: @@ -188,6 +189,7 @@ jobs: sudo rm -rf /opt/ghc sudo rm -rf "/usr/local/share/boost" sudo rm -rf "$AGENT_TOOLSDIRECTORY" + - name: Download Android APK uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: diff --git a/split.go b/split.go deleted file mode 100644 index 001f1719f11..00000000000 --- a/split.go +++ /dev/null @@ -1,114 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "io/fs" - "math" - "os" - "path/filepath" - "regexp" - "strconv" - "strings" -) - -type Specs struct { - searchPath string - directory string - parallelism int - rawFiles []string - groupedFiles []SpecGroup -} - -type SpecGroup struct { - RunID string `json:"runId"` - Specs string `json:"specs"` -} - -type Output struct { - Include []SpecGroup `json:"include"` -} - -func newSpecGroup(runId string, specs string) *SpecGroup { - return &SpecGroup{ - RunID: runId, - Specs: specs, - } -} - -func newSpecs(directory string, searchPath string, parallelism int) *Specs { - return &Specs{ - directory: directory, - searchPath: searchPath, - parallelism: parallelism, - } -} - -func (s *Specs) findFiles() { - fileSystem := os.DirFS(filepath.Join(s.directory, s.searchPath)) - err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error { - if err != nil { - return err - } - - // Find all files matching *.e2e.ts - r := regexp.MustCompile(`.*\.e2e\.ts$`) - if r.MatchString(path) { - s.rawFiles = append(s.rawFiles, filepath.Join(s.searchPath, path)) - } - - return nil - }) - if err != nil { - panic(err) - } -} - -func (s *Specs) generateSplits() { - // Split to chunks based on the parallelism provided - chunkSize := int(math.Ceil(float64(len(s.rawFiles)) / float64(s.parallelism))) - runNo := 1 - - for i := 0; i <= len(s.rawFiles); i += chunkSize { - end := i + chunkSize - if end > len(s.rawFiles) { - end = len(s.rawFiles) - } - - fileGroup := strings.Join(s.rawFiles[i:end], " ") - specFileGroup := newSpecGroup(strconv.Itoa(runNo), fileGroup) - s.groupedFiles = append(s.groupedFiles, *specFileGroup) - - // Break when we reach the end to avoid duplicate groups - if end == len(s.rawFiles) { - break - } - - runNo++ - } -} - -func (s *Specs) dumpSplits() { - // Dump json format for GitHub actions - o := &Output{ - Include: s.groupedFiles, - } - - b, err := json.Marshal(o) - if err != nil { - panic(err) - } - - fmt.Println(string(b)) -} - -func main() { - searchPath := os.Getenv("SEARCH_PATH") - directory := os.Getenv("DIRECTORY") - parallelism, _ := strconv.Atoi(os.Getenv("PARALLELISM")) - - specs := newSpecs(directory, searchPath, parallelism) - specs.findFiles() - specs.generateSplits() - specs.dumpSplits() -} From 5ab904a298f16255c7a40a618a1faecb9070b56e Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 11:21:01 +0530 Subject: [PATCH 123/362] fix package-lock --- detox/package-lock.json | 2 +- detox/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/detox/package-lock.json b/detox/package-lock.json index 803132516c7..0256bab0246 100644 --- a/detox/package-lock.json +++ b/detox/package-lock.json @@ -22,7 +22,7 @@ "babel-plugin-module-resolver": "5.0.0", "client-oauth2": "4.3.3", "deepmerge": "4.3.1", - "detox": "20.19.3", + "detox": "^20.19.3", "form-data": "4.0.0", "jest": "29.7.0", "jest-circus": "29.7.0", diff --git a/detox/package.json b/detox/package.json index b2daf8a3e51..abf578dfef8 100644 --- a/detox/package.json +++ b/detox/package.json @@ -20,7 +20,7 @@ "babel-plugin-module-resolver": "5.0.0", "client-oauth2": "4.3.3", "deepmerge": "4.3.1", - "detox": "20.19.3", + "detox": "^20.19.3", "form-data": "4.0.0", "jest": "29.7.0", "jest-circus": "29.7.0", From fd5655f7276e9b6722398cd393de1da73614fb93 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 14:02:45 +0530 Subject: [PATCH 124/362] build apk --- .github/workflows/e2e-detox.yml | 71 +++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 21 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 3c687d6aac4..65da255f7d8 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -122,18 +122,48 @@ jobs: # name: ios-results-${{ matrix.runId }} # path: detox/artifacts/ + # build-android-apk: + # runs-on: ubuntu-22.04 + # steps: + # - name: Checkout Repository + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + # - name: Free up space on the runner + # run: | + # sudo rm -rf /usr/share/dotnet + # sudo rm -rf /opt/ghc + # sudo rm -rf "/usr/local/share/boost" + # sudo rm -rf "$AGENT_TOOLSDIRECTORY" + + # - name: ci/prepare-android-build + # uses: ./.github/actions/prepare-android-build + # env: + # STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + # STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + # STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + # MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + + # - name: Install Detox dependencies + # run: cd detox && npm ci + + # - name: Build android apk + # run: | + # cd detox + # npm run e2e:android-build + + # - name: Upload Android APK + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-build-apk-${{ github.run_id }} + # path: android/app/build/outputs/apk/debug/app-debug.apk + build-android-apk: runs-on: ubuntu-22.04 steps: - - name: Checkout Repository + - name: ci/checkout-repo uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Free up space on the runner - run: | - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf "/usr/local/share/boost" - sudo rm -rf "$AGENT_TOOLSDIRECTORY" + with: + ref: ${{ github.event.pull_request.head.sha }} - name: ci/prepare-android-build uses: ./.github/actions/prepare-android-build @@ -143,14 +173,16 @@ jobs: STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - name: Install Detox dependencies - run: cd detox && npm ci - - - name: Build android apk - run: | - cd detox - npm run e2e:android-build - - name: Upload Android APK + - name: ci/build-android-pr + env: + BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" + AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" + AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" + MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" + run: bundle exec fastlane android build --env android.pr + working-directory: ./fastlane + + - name: ci/upload-android-pr-build uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: android-build-apk-${{ github.run_id }} @@ -160,9 +192,6 @@ jobs: env: IOS: false GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' - ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' - ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' runs-on: ubuntu-22.04 name: test-detox-e2e-${{ matrix.runId }} needs: @@ -189,7 +218,6 @@ jobs: sudo rm -rf /opt/ghc sudo rm -rf "/usr/local/share/boost" sudo rm -rf "$AGENT_TOOLSDIRECTORY" - - name: Download Android APK uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: @@ -229,7 +257,8 @@ jobs: - name: Create artifacts directory run: | mkdir -p detox/artifacts/ - - name: Download All Artifacts + + - name: Download All Android Artifacts uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: path: detox/artifacts/ From fcc17feabf8a717989707eef12729ad315b8cd0c Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 14:04:27 +0530 Subject: [PATCH 125/362] npm i --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 9c165dc42ea..51737f17065 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -110,7 +110,7 @@ jobs: run: npm run start & - name: Install Detox Dependencies - run: cd detox && npm ci + run: cd detox && npm i - name: Run Detox E2E Tests run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} From e8f70ad58370aae5dd69f08f113db38fb316b687 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 14:21:32 +0530 Subject: [PATCH 126/362] .apk path --- .github/workflows/e2e-detox.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 65da255f7d8..ede7993069a 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -186,7 +186,7 @@ jobs: uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: android-build-apk-${{ github.run_id }} - path: android/app/build/outputs/apk/debug/app-debug.apk + path: "*.apk" e2e-android: env: @@ -218,11 +218,12 @@ jobs: sudo rm -rf /opt/ghc sudo rm -rf "/usr/local/share/boost" sudo rm -rf "$AGENT_TOOLSDIRECTORY" + - name: Download Android APK uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: name: android-build-apk-${{ github.run_id }} - path: android/app/build/outputs/apk/debug/app-debug.apk + path: android/app/build/outputs/apk/debug/ - name: Start React Native Metro Server run: npm run start & From d759422b8a5b508a4fa37a66f8482be0ee77d10f Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 14:30:48 +0530 Subject: [PATCH 127/362] prepare-node-deps --- .github/workflows/e2e-detox.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 51737f17065..c37a5849f2a 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -89,6 +89,9 @@ jobs: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + - name: Set Build ID run: echo "BUILD_ID=${{ github.run_id }}-${{ env.BUILD_SUFFIX }}" >> $GITHUB_ENV From d21f375ee3587110c3df5f9bad23e4fabd0a478e Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 14:39:39 +0530 Subject: [PATCH 128/362] prepare-node-deps --- .github/workflows/e2e-detox.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index ede7993069a..72703cc8796 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -204,6 +204,9 @@ jobs: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + - name: Set up Android SDK uses: android-actions/setup-android@v2 with: From 730d332176a3da8c62efca1b8ebc5f62c98043b1 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 16:20:01 +0530 Subject: [PATCH 129/362] fix detox path for ios --- detox/.detoxrc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 17b146f42ed..a658a99e834 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -8,7 +8,7 @@ "apps": { "ios.debug": { "type": "ios.app", - "binaryPath": "../ios/Build/Products/Debug-iphonesimulator/Mattermost.app" + "binaryPath": "../mobile-artifacts/Mattermost.app" }, "ios.release": { "type": "ios.app", From 85c0299ab82cb6ca2dbc46ece08fd0e0a4595c02 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 17:10:00 +0530 Subject: [PATCH 130/362] add android emulator --- .github/workflows/e2e-detox.yml | 110 ++++++++++++++++++++++---------- 1 file changed, 75 insertions(+), 35 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 830475306f3..f50050ab30b 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -79,7 +79,7 @@ jobs: # env: # IOS: true # runs-on: macos-14-large - # name: test-detox-e2e-${{ matrix.runId }} + # name: ios-detox-e2e-${{ matrix.runId }} # needs: # - generate-specs # - build-ios-simulator @@ -157,49 +157,51 @@ jobs: # name: android-build-apk-${{ github.run_id }} # path: android/app/build/outputs/apk/debug/app-debug.apk - build-android-apk: - runs-on: ubuntu-22.04 - steps: - - name: ci/checkout-repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - with: - ref: ${{ github.event.pull_request.head.sha }} + # build-android-apk: + # runs-on: ubuntu-22.04 + # steps: + # - name: ci/checkout-repo + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + # with: + # ref: ${{ github.event.pull_request.head.sha }} - - name: ci/prepare-android-build - uses: ./.github/actions/prepare-android-build - env: - STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" - STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" - STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" - MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + # - name: ci/prepare-android-build + # uses: ./.github/actions/prepare-android-build + # env: + # STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + # STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + # STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + # MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - name: ci/build-android-pr - env: - BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" - AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" - AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" - MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" - run: bundle exec fastlane android build --env android.pr - working-directory: ./fastlane - - - name: ci/upload-android-pr-build - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-build-apk-${{ github.run_id }} - path: "*.apk" + # - name: ci/build-android-pr + # env: + # BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" + # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" + # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" + # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" + # run: bundle exec fastlane android build --env android.pr + # working-directory: ./fastlane + + # - name: ci/upload-android-pr-build + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-build-apk-${{ github.run_id }} + # path: "*.apk" e2e-android: env: IOS: false GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" runs-on: ubuntu-22.04 - name: test-detox-e2e-${{ matrix.runId }} + name: android-detox-e2e-${{ matrix.runId }} needs: - generate-specs - - build-android-apk + # - build-android-apk strategy: fail-fast: false - matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} + matrix: + specs: ${{ fromJSON(needs.generate-specs.outputs.specs) }} + api-level: [29] steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -225,10 +227,39 @@ jobs: sudo rm -rf "/usr/local/share/boost" sudo rm -rf "$AGENT_TOOLSDIRECTORY" + - name: Enable KVM + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + + - name: Gradle cache + uses: gradle/actions/setup-gradle@v3 + + - name: AVD cache + uses: actions/cache@v4 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* + key: avd-${{ matrix.api-level }} + + - name: create AVD and generate snapshot for caching + if: steps.avd-cache.outputs.cache-hit != 'true' + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: ${{ matrix.api-level }} + force-avd-creation: false + emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + disable-animations: false + script: echo "Generated AVD snapshot for caching." + - name: Download Android APK uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: - name: android-build-apk-${{ github.run_id }} + # name: android-build-apk-${{ github.run_id }} + name: android-build-apk-8408768799 path: android/app/build/outputs/apk/debug/ - name: Start React Native Metro Server @@ -237,8 +268,17 @@ jobs: - name: Install Detox Dependencies run: cd detox && npm i - - name: Run Detox E2E Tests - run: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + - name: run tests + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: ${{ matrix.api-level }} + force-avd-creation: false + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + disable-animations: true + script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + + # - name: Run Detox E2E Tests + # run: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - name: Upload Android Test Report if: always() From 77f95ceedaea7cc574f265f7af1fc9b4cdbe38e8 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 17:12:44 +0530 Subject: [PATCH 131/362] add android emulator --- .github/workflows/e2e-detox.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index f50050ab30b..eb4d7fb9859 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -192,6 +192,7 @@ jobs: env: IOS: false GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" + API_LEVEL: 29 runs-on: ubuntu-22.04 name: android-detox-e2e-${{ matrix.runId }} needs: @@ -199,9 +200,7 @@ jobs: # - build-android-apk strategy: fail-fast: false - matrix: - specs: ${{ fromJSON(needs.generate-specs.outputs.specs) }} - api-level: [29] + matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -249,7 +248,7 @@ jobs: if: steps.avd-cache.outputs.cache-hit != 'true' uses: reactivecircus/android-emulator-runner@v2 with: - api-level: ${{ matrix.api-level }} + api-level: ${{ env.API_LEVEL }} force-avd-creation: false emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none disable-animations: false From 9838c894642c1965746f5b9e639c7dc132c10163 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 17:21:16 +0530 Subject: [PATCH 132/362] add android emulator --- .github/workflows/e2e-detox.yml | 61 ++++++++++++++++----------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index eb4d7fb9859..465b8914874 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -157,36 +157,36 @@ jobs: # name: android-build-apk-${{ github.run_id }} # path: android/app/build/outputs/apk/debug/app-debug.apk - # build-android-apk: - # runs-on: ubuntu-22.04 - # steps: - # - name: ci/checkout-repo - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - # with: - # ref: ${{ github.event.pull_request.head.sha }} - - # - name: ci/prepare-android-build - # uses: ./.github/actions/prepare-android-build - # env: - # STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" - # STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" - # STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" - # MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + build-android-apk: + runs-on: ubuntu-22.04 + steps: + - name: ci/checkout-repo + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + ref: ${{ github.event.pull_request.head.sha }} - # - name: ci/build-android-pr - # env: - # BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" - # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" - # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" - # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" - # run: bundle exec fastlane android build --env android.pr - # working-directory: ./fastlane + - name: ci/prepare-android-build + uses: ./.github/actions/prepare-android-build + env: + STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - # - name: ci/upload-android-pr-build - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: android-build-apk-${{ github.run_id }} - # path: "*.apk" + - name: ci/build-android-pr + env: + BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" + AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" + AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" + MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" + run: bundle exec fastlane android build --env android.pr + working-directory: ./fastlane + + - name: ci/upload-android-pr-build + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-build-apk-${{ github.run_id }} + path: "*.apk" e2e-android: env: @@ -197,7 +197,7 @@ jobs: name: android-detox-e2e-${{ matrix.runId }} needs: - generate-specs - # - build-android-apk + - build-android-apk strategy: fail-fast: false matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} @@ -257,8 +257,7 @@ jobs: - name: Download Android APK uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: - # name: android-build-apk-${{ github.run_id }} - name: android-build-apk-8408768799 + name: android-build-apk-${{ github.run_id }} path: android/app/build/outputs/apk/debug/ - name: Start React Native Metro Server From 59868c85406e74ed7feda86ad74021a2fbf0f09f Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 19:15:18 +0530 Subject: [PATCH 133/362] add android emulator --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 465b8914874..99f8132611a 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -269,7 +269,7 @@ jobs: - name: run tests uses: reactivecircus/android-emulator-runner@v2 with: - api-level: ${{ matrix.api-level }} + api-level: 29 force-avd-creation: false emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none disable-animations: true From 2473fb4d6f2efe0cda9fdd33b09926a2904db1bc Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 22:05:13 +0530 Subject: [PATCH 134/362] add android emulator --- .github/workflows/e2e-detox.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 99f8132611a..2d932cbfa88 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -193,6 +193,9 @@ jobs: IOS: false GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" API_LEVEL: 29 + ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' + ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' + ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' runs-on: ubuntu-22.04 name: android-detox-e2e-${{ matrix.runId }} needs: @@ -200,7 +203,7 @@ jobs: - build-android-apk strategy: fail-fast: false - matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} + matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -266,17 +269,16 @@ jobs: - name: Install Detox Dependencies run: cd detox && npm i - - name: run tests + - name: Run Detox E2E Tests uses: reactivecircus/android-emulator-runner@v2 with: - api-level: 29 + api-level: ${{ env.API_LEVEL }} force-avd-creation: false emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none disable-animations: true - script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - # - name: Run Detox E2E Tests - # run: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + script: | + # cd detox + # npm run e2e:android-test -- ${{ matrix.specs }} - name: Upload Android Test Report if: always() From 695c1470bb53c6620fbe3888b6b365dcf6ce2cc8 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 24 Mar 2024 22:23:21 +0530 Subject: [PATCH 135/362] add android emulator --- .github/workflows/e2e-detox.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 2d932cbfa88..3f58c66773c 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -277,8 +277,8 @@ jobs: emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none disable-animations: true script: | - # cd detox - # npm run e2e:android-test -- ${{ matrix.specs }} + cd detox + npm run e2e:android-test -- ${{ matrix.specs }} - name: Upload Android Test Report if: always() From 155e94ed4c42577cad626649438995033752cb61 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 25 Mar 2024 00:49:08 +0530 Subject: [PATCH 136/362] add android emulator --- .github/workflows/e2e-detox.yml | 55 ++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 3f58c66773c..b0906f4764b 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -192,7 +192,7 @@ jobs: env: IOS: false GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - API_LEVEL: 29 + API_LEVEL: 31 ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' @@ -235,8 +235,8 @@ jobs: sudo udevadm control --reload-rules sudo udevadm trigger --name-match=kvm - - name: Gradle cache - uses: gradle/actions/setup-gradle@v3 + # - name: Gradle cache + # uses: gradle/actions/setup-gradle@v3 - name: AVD cache uses: actions/cache@v4 @@ -245,17 +245,17 @@ jobs: path: | ~/.android/avd/* ~/.android/adb* - key: avd-${{ matrix.api-level }} - - - name: create AVD and generate snapshot for caching - if: steps.avd-cache.outputs.cache-hit != 'true' - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: ${{ env.API_LEVEL }} - force-avd-creation: false - emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - disable-animations: false - script: echo "Generated AVD snapshot for caching." + key: avd-${{ env.API_LEVEL }} + + # - name: create AVD and generate snapshot for caching + # if: steps.avd-cache.outputs.cache-hit != 'true' + # uses: reactivecircus/android-emulator-runner@v2 + # with: + # api-level: ${{ env.API_LEVEL }} + # force-avd-creation: false + # emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + # disable-animations: false + # script: echo "Generated AVD snapshot for caching." - name: Download Android APK uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 @@ -269,16 +269,27 @@ jobs: - name: Install Detox Dependencies run: cd detox && npm i - - name: Run Detox E2E Tests + - name: Detox test uses: reactivecircus/android-emulator-runner@v2 with: - api-level: ${{ env.API_LEVEL }} - force-avd-creation: false - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - disable-animations: true - script: | - cd detox - npm run e2e:android-test -- ${{ matrix.specs }} + api-level: 31 + arch: x86_64 + avd-name: pixel_6_pro + script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + + # - name: Run Detox E2E Tests + # run: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + + # - name: Run Detox E2E Tests + # uses: reactivecircus/android-emulator-runner@v2 + # with: + # api-level: ${{ env.API_LEVEL }} + # force-avd-creation: false + # emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + # disable-animations: true + # script: | + # cd detox + # npm run e2e:android-test -- ${{ matrix.specs }} - name: Upload Android Test Report if: always() From 0850c797c8caab534e51bc28fad8897ba464f214 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 25 Mar 2024 04:27:30 +0530 Subject: [PATCH 137/362] fix app name --- detox/.detoxrc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index d131e0d5f21..1cbb1255ce6 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -17,7 +17,7 @@ }, "android.debug": { "type": "android.apk", - "binaryPath": "../android/app/build/outputs/apk/debug/app-debug.apk", + "binaryPath": "../android/app/build/outputs/apk/debug/Mattermost-Beta.apk", "build": "cd .. && ./node_modules/.bin/jetify && cd android && ./gradlew clean && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug && cd ../detox" }, "android.release": { From 1f913463d8c7750e9debc9315747a947d3dd814e Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 25 Mar 2024 05:47:39 +0530 Subject: [PATCH 138/362] fix ap path for android --- .github/workflows/e2e-detox.yml | 25 +++++++++---------------- detox/.detoxrc.json | 2 +- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index b0906f4764b..4a86a3f3883 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -218,9 +218,9 @@ jobs: uses: android-actions/setup-android@v2 with: android-sdk-tools: 'latest' - android-emulator-image: '${{ env.ANDROID_EMULATOR_IMAGE }}' - android-emulator-name: '${{ env.ANDROID_EMULATOR_NAME }}' - android-emulator-device: '${{ env.ANDROID_EMULATOR_DEVICE }}' + android-emulator-image: ${{ env.ANDROID_EMULATOR_IMAGE }} + android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} + android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} - name: Free up space on the runner run: | @@ -235,8 +235,8 @@ jobs: sudo udevadm control --reload-rules sudo udevadm trigger --name-match=kvm - # - name: Gradle cache - # uses: gradle/actions/setup-gradle@v3 + - name: Gradle cache + uses: gradle/actions/setup-gradle@v3 - name: AVD cache uses: actions/cache@v4 @@ -247,22 +247,15 @@ jobs: ~/.android/adb* key: avd-${{ env.API_LEVEL }} - # - name: create AVD and generate snapshot for caching - # if: steps.avd-cache.outputs.cache-hit != 'true' - # uses: reactivecircus/android-emulator-runner@v2 - # with: - # api-level: ${{ env.API_LEVEL }} - # force-avd-creation: false - # emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - # disable-animations: false - # script: echo "Generated AVD snapshot for caching." - - name: Download Android APK uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: name: android-build-apk-${{ github.run_id }} - path: android/app/build/outputs/apk/debug/ + path: mobile-artifacts + - name: Unzip Android APK + run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ + - name: Start React Native Metro Server run: npm run start & diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 1cbb1255ce6..cc531ddb2ab 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -17,7 +17,7 @@ }, "android.debug": { "type": "android.apk", - "binaryPath": "../android/app/build/outputs/apk/debug/Mattermost-Beta.apk", + "binaryPath": "../mobile-artifacts/Mattermost-Beta.apk", "build": "cd .. && ./node_modules/.bin/jetify && cd android && ./gradlew clean && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug && cd ../detox" }, "android.release": { From f7d42472d3a71b03e2847a5246fe4094bfaaf295 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 25 Mar 2024 06:17:43 +0530 Subject: [PATCH 139/362] fix apk path for android --- .github/workflows/e2e-detox.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 4a86a3f3883..0af8ec6b137 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -252,9 +252,6 @@ jobs: with: name: android-build-apk-${{ github.run_id }} path: mobile-artifacts - - - name: Unzip Android APK - run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ - name: Start React Native Metro Server run: npm run start & From a802d08a8e67dfc810f0202bcf9578afbb97695c Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 25 Mar 2024 07:05:41 +0530 Subject: [PATCH 140/362] fix app name in .detoxrc --- detox/.detoxrc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index cc531ddb2ab..62e59f6ffaf 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -17,7 +17,7 @@ }, "android.debug": { "type": "android.apk", - "binaryPath": "../mobile-artifacts/Mattermost-Beta.apk", + "binaryPath": "../mobile-artifacts/Mattermost_Beta.apk", "build": "cd .. && ./node_modules/.bin/jetify && cd android && ./gradlew clean && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug && cd ../detox" }, "android.release": { From c0cec44fb77133097c593b428bfdcdec1b6f76a3 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 25 Mar 2024 07:46:31 +0530 Subject: [PATCH 141/362] build apk from detox cmd --- .github/workflows/e2e-detox.yml | 118 +++++++++++++++----------------- detox/.detoxrc.json | 2 +- 2 files changed, 56 insertions(+), 64 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 0af8ec6b137..1016f96a5f0 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -122,18 +122,48 @@ jobs: # name: ios-results-${{ matrix.runId }} # path: detox/artifacts/ + build-android-apk: + runs-on: ubuntu-22.04 + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Free up space on the runner + run: | + sudo rm -rf /usr/share/dotnet + sudo rm -rf /opt/ghc + sudo rm -rf "/usr/local/share/boost" + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + + - name: ci/prepare-android-build + uses: ./.github/actions/prepare-android-build + env: + STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + + - name: Install Detox dependencies + run: cd detox && npm ci + + - name: Build android apk + run: | + cd detox + npm run e2e:android-build + + - name: Upload Android APK + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-build-apk-${{ github.run_id }} + path: android/app/build + # build-android-apk: # runs-on: ubuntu-22.04 # steps: - # - name: Checkout Repository + # - name: ci/checkout-repo # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - # - name: Free up space on the runner - # run: | - # sudo rm -rf /usr/share/dotnet - # sudo rm -rf /opt/ghc - # sudo rm -rf "/usr/local/share/boost" - # sudo rm -rf "$AGENT_TOOLSDIRECTORY" + # with: + # ref: ${{ github.event.pull_request.head.sha }} # - name: ci/prepare-android-build # uses: ./.github/actions/prepare-android-build @@ -143,50 +173,20 @@ jobs: # STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" # MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - # - name: Install Detox dependencies - # run: cd detox && npm ci - - # - name: Build android apk - # run: | - # cd detox - # npm run e2e:android-build + # - name: ci/build-android-pr + # env: + # BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" + # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" + # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" + # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" + # run: bundle exec fastlane android build --env android.pr + # working-directory: ./fastlane - # - name: Upload Android APK + # - name: ci/upload-android-pr-build # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 # with: # name: android-build-apk-${{ github.run_id }} - # path: android/app/build/outputs/apk/debug/app-debug.apk - - build-android-apk: - runs-on: ubuntu-22.04 - steps: - - name: ci/checkout-repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - with: - ref: ${{ github.event.pull_request.head.sha }} - - - name: ci/prepare-android-build - uses: ./.github/actions/prepare-android-build - env: - STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" - STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" - STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" - MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - - name: ci/build-android-pr - env: - BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" - AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" - AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" - MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" - run: bundle exec fastlane android build --env android.pr - working-directory: ./fastlane - - - name: ci/upload-android-pr-build - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-build-apk-${{ github.run_id }} - path: "*.apk" + # path: "*.apk" e2e-android: env: @@ -208,6 +208,9 @@ jobs: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Install required libraries for emulator + run: sudo apt-get install libpulse0 libpulse-dev + - name: ci/prepare-node-deps uses: ./.github/actions/prepare-node-deps @@ -251,8 +254,11 @@ jobs: uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: name: android-build-apk-${{ github.run_id }} - path: mobile-artifacts + path: android/app/build + - name: List files in android/app/build + run: ls -l android/app/build + - name: Start React Native Metro Server run: npm run start & @@ -267,20 +273,6 @@ jobs: avd-name: pixel_6_pro script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - # - name: Run Detox E2E Tests - # run: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - # - name: Run Detox E2E Tests - # uses: reactivecircus/android-emulator-runner@v2 - # with: - # api-level: ${{ env.API_LEVEL }} - # force-avd-creation: false - # emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - # disable-animations: true - # script: | - # cd detox - # npm run e2e:android-test -- ${{ matrix.specs }} - - name: Upload Android Test Report if: always() uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 62e59f6ffaf..d131e0d5f21 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -17,7 +17,7 @@ }, "android.debug": { "type": "android.apk", - "binaryPath": "../mobile-artifacts/Mattermost_Beta.apk", + "binaryPath": "../android/app/build/outputs/apk/debug/app-debug.apk", "build": "cd .. && ./node_modules/.bin/jetify && cd android && ./gradlew clean && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug && cd ../detox" }, "android.release": { From ca076f43690eac9126da32b30893b1daf3e85d33 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 25 Mar 2024 10:41:12 +0530 Subject: [PATCH 142/362] new config --- .github/workflows/e2e-detox.yml | 349 +++++++++++++++++++++----------- detox/.detoxrc.json | 14 +- 2 files changed, 235 insertions(+), 128 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 1016f96a5f0..a9c5cf258ce 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -122,41 +122,6 @@ jobs: # name: ios-results-${{ matrix.runId }} # path: detox/artifacts/ - build-android-apk: - runs-on: ubuntu-22.04 - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Free up space on the runner - run: | - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf "/usr/local/share/boost" - sudo rm -rf "$AGENT_TOOLSDIRECTORY" - - - name: ci/prepare-android-build - uses: ./.github/actions/prepare-android-build - env: - STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" - STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" - STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" - MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - - name: Install Detox dependencies - run: cd detox && npm ci - - - name: Build android apk - run: | - cd detox - npm run e2e:android-build - - - name: Upload Android APK - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-build-apk-${{ github.run_id }} - path: android/app/build - # build-android-apk: # runs-on: ubuntu-22.04 # steps: @@ -188,50 +153,152 @@ jobs: # name: android-build-apk-${{ github.run_id }} # path: "*.apk" - e2e-android: + # e2e-android: + # env: + # IOS: false + # GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" + # API_LEVEL: 31 + # ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' + # ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' + # ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' + # runs-on: ubuntu-22.04 + # name: android-detox-e2e-${{ matrix.runId }} + # needs: + # - generate-specs + # - build-android-apk + # strategy: + # fail-fast: false + # matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} + # steps: + # - name: Checkout Repository + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + # - name: Install required libraries for emulator + # run: sudo apt-get install libpulse0 libpulse-dev + + # - name: ci/prepare-node-deps + # uses: ./.github/actions/prepare-node-deps + + # - name: Set Build ID + # run: echo "BUILD_ID=${{ github.run_id }}-${{ env.BUILD_SUFFIX }}" >> $GITHUB_ENV + + # - name: Set up Android SDK + # uses: android-actions/setup-android@v2 + # with: + # android-sdk-tools: 'latest' + # android-emulator-image: ${{ env.ANDROID_EMULATOR_IMAGE }} + # android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} + # android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} + + # - name: Free up space on the runner + # run: | + # sudo rm -rf /usr/share/dotnet + # sudo rm -rf /opt/ghc + # sudo rm -rf "/usr/local/share/boost" + # sudo rm -rf "$AGENT_TOOLSDIRECTORY" + + # - name: Enable KVM + # run: | + # echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + # sudo udevadm control --reload-rules + # sudo udevadm trigger --name-match=kvm + + # - name: Gradle cache + # uses: gradle/actions/setup-gradle@v3 + + # - name: AVD cache + # uses: actions/cache@v4 + # id: avd-cache + # with: + # path: | + # ~/.android/avd/* + # ~/.android/adb* + # key: avd-${{ env.API_LEVEL }} + + # - name: Download Android APK + # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # with: + # name: android-build-apk-${{ github.run_id }} + # path: android/app/build + + # - name: List files in android/app/build + # run: ls -l android/app/build + + # - name: Start React Native Metro Server + # run: npm run start & + + # - name: Install Detox Dependencies + # run: cd detox && npm i + + # - name: Detox test + # uses: reactivecircus/android-emulator-runner@v2 + # with: + # api-level: 31 + # arch: x86_64 + # avd-name: pixel_6_pro + # script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + + # - name: Upload Android Test Report + # if: always() + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-results-${{ matrix.runId }} + # path: detox/artifacts + + # download-e2e-results: + # runs-on: ubuntu-22.04 + # if: always() + # needs: + # - generate-specs + # # - e2e-ios + # - e2e-android + # steps: + # - name: Checkout Repository + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + # - name: ci/prepare-node-deps + # uses: ./.github/actions/prepare-node-deps + + # - name: Create artifacts directory + # run: | + # mkdir -p detox/artifacts/ + + # - name: Download All Android Artifacts + # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # with: + # path: detox/artifacts/ + # pattern: android-results-* + + # - name: Save report Detox Dependencies + # run: | + # cd detox + # npm ci + # npm run e2e:save-report + # env: + # IOS: false + + build: + runs-on: ubuntu-latest env: - IOS: false - GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - API_LEVEL: 31 - ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' - ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' - ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' - runs-on: ubuntu-22.04 - name: android-detox-e2e-${{ matrix.runId }} - needs: - - generate-specs - - build-android-apk - strategy: - fail-fast: false - matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} + API_LEVEL: 33 + ARCH: x86_64 + DETOX_CONFIGURATION: android.emu.release steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Checkout repository + uses: actions/checkout@v4 - name: Install required libraries for emulator run: sudo apt-get install libpulse0 libpulse-dev + - name: ci/prepare-android-build + uses: ./.github/actions/prepare-android-build + - name: ci/prepare-node-deps uses: ./.github/actions/prepare-node-deps - + - name: Set Build ID run: echo "BUILD_ID=${{ github.run_id }}-${{ env.BUILD_SUFFIX }}" >> $GITHUB_ENV - - name: Set up Android SDK - uses: android-actions/setup-android@v2 - with: - android-sdk-tools: 'latest' - android-emulator-image: ${{ env.ANDROID_EMULATOR_IMAGE }} - android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} - android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} - - - name: Free up space on the runner - run: | - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf "/usr/local/share/boost" - sudo rm -rf "$AGENT_TOOLSDIRECTORY" - - name: Enable KVM run: | echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules @@ -240,74 +307,114 @@ jobs: - name: Gradle cache uses: gradle/actions/setup-gradle@v3 - - - name: AVD cache - uses: actions/cache@v4 - id: avd-cache - with: - path: | - ~/.android/avd/* - ~/.android/adb* - key: avd-${{ env.API_LEVEL }} - - name: Download Android APK - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + - name: Cache Detox build + id: cache-detox-build + uses: actions/cache@v4 with: - name: android-build-apk-${{ github.run_id }} path: android/app/build - - - name: List files in android/app/build - run: ls -l android/app/build - - - name: Start React Native Metro Server - run: npm run start & + key: ${{ runner.os }}-detox-build + restore-keys: | + ${{ runner.os }}-detox-build - - name: Install Detox Dependencies - run: cd detox && npm i + - name: Detox build + run: | + cd detox + npx detox build --configuration ${{ env.DETOX_CONFIGURATION }} --if-missing - - name: Detox test - uses: reactivecircus/android-emulator-runner@v2 + - name: Upload Detox build + uses: actions/upload-artifact@v4 with: - api-level: 31 - arch: x86_64 - avd-name: pixel_6_pro - script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - - name: Upload Android Test Report - if: always() - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-results-${{ matrix.runId }} - path: detox/artifacts + name: detox-build + path: android/app/build/outputs/apk/release/ - download-e2e-results: - runs-on: ubuntu-22.04 - if: always() - needs: - - generate-specs - # - e2e-ios - - e2e-android + android-test: + needs: build + runs-on: ubuntu-latest + env: + API_LEVEL: 33 + ARCH: x86_64 + DETOX_CONFIGURATION: android.emu.release steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install required libraries for emulator + run: sudo apt-get install libpulse0 libpulse-dev + + - name: ci/prepare-android-build + uses: ./.github/actions/prepare-android-build - name: ci/prepare-node-deps uses: ./.github/actions/prepare-node-deps + + - name: Set Build ID + run: echo "BUILD_ID=${{ github.run_id }}-${{ env.BUILD_SUFFIX }}" >> $GITHUB_ENV - - name: Create artifacts directory + - name: Enable KVM run: | - mkdir -p detox/artifacts/ + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm - - name: Download All Android Artifacts - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + - name: Download Detox build + uses: actions/download-artifact@v4 with: - path: detox/artifacts/ - pattern: android-results-* + name: detox-build + path: android/app/build/outputs/apk/release/ + + - name: Display structure of downloaded files + run: ls -R android/app/build/outputs/ - - name: Save report Detox Dependencies + - name: AVD cache + uses: actions/cache@v4 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* + key: avd-${{ env.API_LEVEL }} + + - name: Create AVD and generate snapshot for caching + if: steps.avd-cache.outputs.cache-hit != 'true' + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: ${{ env.API_LEVEL }} + arch: ${{ env.ARCH }} + disable-animations: false + emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + force-avd-creation: false + script: echo 'Generated AVD snapshot for caching.' + + - name: Get device name + id: device run: | cd detox - npm ci - npm run e2e:save-report - env: - IOS: false + AVD_NAME=$(node -p "require('./.detoxrc').devices.android.device.avdName") + echo "AVD_NAME=$AVD_NAME" >> $GITHUB_OUTPUT + + - name: Detox test + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: ${{ env.API_LEVEL }} + arch: ${{ env.ARCH }} + avd-name: ${{ steps.device.outputs.AVD_NAME }} + disable-animations: true + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + force-avd-creation: false + script: > + cd detox + npx detox test + --configuration ${{ env.DETOX_CONFIGURATION }} + --headless + --record-logs failing + --record-videos failing + --take-screenshots failing + + - name: Upload artifacts + if: failure() + uses: actions/upload-artifact@v4 + with: + name: detox-artifacts + path: artifacts + retention-days: 14 diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index d131e0d5f21..a8878ce89ac 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -27,34 +27,34 @@ } }, "devices": { - "ios.simulator": { + "ios": { "type": "ios.simulator", "device": { "type": "iPhone 15 Pro" } }, - "android.emulator": { + "android": { "type": "android.emulator", "device": { - "avdName": "pixel_6_pro" + "avdName": "Pixel_6_Pro_API_33" } } }, "configurations": { "ios.sim.debug": { - "device": "ios.simulator", + "device": "ios", "app": "ios.debug" }, "ios.sim.release": { - "device": "ios.simulator", + "device": "ios", "app": "ios.release" }, "android.emu.debug": { - "device": "android.emulator", + "device": "android", "app": "android.debug" }, "android.emu.release": { - "device": "android.emulator", + "device": "android", "app": "android.release" } }, From b374167e33c42bdf584e4c02e774e0df4c119908 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 25 Mar 2024 10:49:03 +0530 Subject: [PATCH 143/362] new config --- .github/workflows/e2e-detox.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index a9c5cf258ce..b5eb1e47469 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -290,9 +290,6 @@ jobs: - name: Install required libraries for emulator run: sudo apt-get install libpulse0 libpulse-dev - - name: ci/prepare-android-build - uses: ./.github/actions/prepare-android-build - - name: ci/prepare-node-deps uses: ./.github/actions/prepare-node-deps @@ -342,9 +339,6 @@ jobs: - name: Install required libraries for emulator run: sudo apt-get install libpulse0 libpulse-dev - - name: ci/prepare-android-build - uses: ./.github/actions/prepare-android-build - - name: ci/prepare-node-deps uses: ./.github/actions/prepare-node-deps From 2c035c73167ffef58b42e666f29bf2d9c29def5a Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 25 Mar 2024 11:08:31 +0530 Subject: [PATCH 144/362] new config --- .github/workflows/e2e-detox.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index b5eb1e47469..dfb21501d79 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -287,6 +287,13 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Setup Java + uses: actions/setup-java@v4 + with: + cache: gradle + distribution: temurin + java-version: 17 + - name: Install required libraries for emulator run: sudo apt-get install libpulse0 libpulse-dev @@ -317,7 +324,7 @@ jobs: - name: Detox build run: | cd detox - npx detox build --configuration ${{ env.DETOX_CONFIGURATION }} --if-missing + npx detox build --configuration ${{ env.DETOX_CONFIGURATION }} --if-missing --clean - name: Upload Detox build uses: actions/upload-artifact@v4 @@ -336,6 +343,13 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Setup Java + uses: actions/setup-java@v4 + with: + cache: gradle + distribution: temurin + java-version: 17 + - name: Install required libraries for emulator run: sudo apt-get install libpulse0 libpulse-dev From 52d4e4b67bb3cc1514637eb1899df8a0655e42f8 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 25 Mar 2024 19:35:08 +0530 Subject: [PATCH 145/362] try detox build --- .github/workflows/e2e-detox.yml | 378 ++++++++++---------------------- 1 file changed, 117 insertions(+), 261 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index dfb21501d79..c64fe5f258e 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -122,233 +122,62 @@ jobs: # name: ios-results-${{ matrix.runId }} # path: detox/artifacts/ - # build-android-apk: - # runs-on: ubuntu-22.04 - # steps: - # - name: ci/checkout-repo - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - # with: - # ref: ${{ github.event.pull_request.head.sha }} - - # - name: ci/prepare-android-build - # uses: ./.github/actions/prepare-android-build - # env: - # STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" - # STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" - # STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" - # MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - # - name: ci/build-android-pr - # env: - # BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" - # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" - # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" - # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" - # run: bundle exec fastlane android build --env android.pr - # working-directory: ./fastlane - - # - name: ci/upload-android-pr-build - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: android-build-apk-${{ github.run_id }} - # path: "*.apk" - - # e2e-android: - # env: - # IOS: false - # GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - # API_LEVEL: 31 - # ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' - # ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' - # ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' - # runs-on: ubuntu-22.04 - # name: android-detox-e2e-${{ matrix.runId }} - # needs: - # - generate-specs - # - build-android-apk - # strategy: - # fail-fast: false - # matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} - # steps: - # - name: Checkout Repository - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - # - name: Install required libraries for emulator - # run: sudo apt-get install libpulse0 libpulse-dev - - # - name: ci/prepare-node-deps - # uses: ./.github/actions/prepare-node-deps - - # - name: Set Build ID - # run: echo "BUILD_ID=${{ github.run_id }}-${{ env.BUILD_SUFFIX }}" >> $GITHUB_ENV - - # - name: Set up Android SDK - # uses: android-actions/setup-android@v2 - # with: - # android-sdk-tools: 'latest' - # android-emulator-image: ${{ env.ANDROID_EMULATOR_IMAGE }} - # android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} - # android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} - - # - name: Free up space on the runner - # run: | - # sudo rm -rf /usr/share/dotnet - # sudo rm -rf /opt/ghc - # sudo rm -rf "/usr/local/share/boost" - # sudo rm -rf "$AGENT_TOOLSDIRECTORY" - - # - name: Enable KVM - # run: | - # echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - # sudo udevadm control --reload-rules - # sudo udevadm trigger --name-match=kvm - - # - name: Gradle cache - # uses: gradle/actions/setup-gradle@v3 - - # - name: AVD cache - # uses: actions/cache@v4 - # id: avd-cache - # with: - # path: | - # ~/.android/avd/* - # ~/.android/adb* - # key: avd-${{ env.API_LEVEL }} - - # - name: Download Android APK - # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - # with: - # name: android-build-apk-${{ github.run_id }} - # path: android/app/build - - # - name: List files in android/app/build - # run: ls -l android/app/build - - # - name: Start React Native Metro Server - # run: npm run start & - - # - name: Install Detox Dependencies - # run: cd detox && npm i - - # - name: Detox test - # uses: reactivecircus/android-emulator-runner@v2 - # with: - # api-level: 31 - # arch: x86_64 - # avd-name: pixel_6_pro - # script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - # - name: Upload Android Test Report - # if: always() - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: android-results-${{ matrix.runId }} - # path: detox/artifacts - - # download-e2e-results: - # runs-on: ubuntu-22.04 - # if: always() - # needs: - # - generate-specs - # # - e2e-ios - # - e2e-android - # steps: - # - name: Checkout Repository - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - # - name: ci/prepare-node-deps - # uses: ./.github/actions/prepare-node-deps - - # - name: Create artifacts directory - # run: | - # mkdir -p detox/artifacts/ - - # - name: Download All Android Artifacts - # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - # with: - # path: detox/artifacts/ - # pattern: android-results-* - - # - name: Save report Detox Dependencies - # run: | - # cd detox - # npm ci - # npm run e2e:save-report - # env: - # IOS: false - - build: - runs-on: ubuntu-latest - env: - API_LEVEL: 33 - ARCH: x86_64 - DETOX_CONFIGURATION: android.emu.release + build-android-apk: + runs-on: ubuntu-22.04 steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup Java - uses: actions/setup-java@v4 + - name: ci/checkout-repo + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: - cache: gradle - distribution: temurin - java-version: 17 - - - name: Install required libraries for emulator - run: sudo apt-get install libpulse0 libpulse-dev - - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps + ref: ${{ github.event.pull_request.head.sha }} - - name: Set Build ID - run: echo "BUILD_ID=${{ github.run_id }}-${{ env.BUILD_SUFFIX }}" >> $GITHUB_ENV - - - name: Enable KVM - run: | - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm - - - name: Gradle cache - uses: gradle/actions/setup-gradle@v3 - - - name: Cache Detox build - id: cache-detox-build - uses: actions/cache@v4 - with: - path: android/app/build - key: ${{ runner.os }}-detox-build - restore-keys: | - ${{ runner.os }}-detox-build + - name: ci/prepare-android-build + uses: ./.github/actions/prepare-android-build + env: + STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - name: Detox build run: | cd detox - npx detox build --configuration ${{ env.DETOX_CONFIGURATION }} --if-missing --clean - - - name: Upload Detox build - uses: actions/upload-artifact@v4 + npm ci + npm run e2e:android-build-release + + # - name: ci/build-android-pr + # env: + # BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" + # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" + # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" + # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" + # run: bundle exec fastlane android build --env android.pr + # working-directory: ./fastlane + + - name: ci/upload-android-pr-build + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: - name: detox-build - path: android/app/build/outputs/apk/release/ + name: android-build-apk-${{ github.run_id }} + path: "android/app/build/outputs/apk/release/app-release.apk" - android-test: - needs: build - runs-on: ubuntu-latest + e2e-android: env: - API_LEVEL: 33 - ARCH: x86_64 - DETOX_CONFIGURATION: android.emu.release + IOS: false + GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" + API_LEVEL: 31 + ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' + ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' + ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' + runs-on: ubuntu-22.04 + name: android-detox-e2e-${{ matrix.runId }} + needs: + - generate-specs + - build-android-apk + strategy: + fail-fast: false + matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup Java - uses: actions/setup-java@v4 - with: - cache: gradle - distribution: temurin - java-version: 17 + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Install required libraries for emulator run: sudo apt-get install libpulse0 libpulse-dev @@ -359,20 +188,29 @@ jobs: - name: Set Build ID run: echo "BUILD_ID=${{ github.run_id }}-${{ env.BUILD_SUFFIX }}" >> $GITHUB_ENV + - name: Set up Android SDK + uses: android-actions/setup-android@v2 + with: + android-sdk-tools: 'latest' + android-emulator-image: ${{ env.ANDROID_EMULATOR_IMAGE }} + android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} + android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} + + - name: Free up space on the runner + run: | + sudo rm -rf /usr/share/dotnet + sudo rm -rf /opt/ghc + sudo rm -rf "/usr/local/share/boost" + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + - name: Enable KVM run: | echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules sudo udevadm control --reload-rules sudo udevadm trigger --name-match=kvm - - name: Download Detox build - uses: actions/download-artifact@v4 - with: - name: detox-build - path: android/app/build/outputs/apk/release/ - - - name: Display structure of downloaded files - run: ls -R android/app/build/outputs/ + - name: Gradle cache + uses: gradle/actions/setup-gradle@v3 - name: AVD cache uses: actions/cache@v4 @@ -383,46 +221,64 @@ jobs: ~/.android/adb* key: avd-${{ env.API_LEVEL }} - - name: Create AVD and generate snapshot for caching - if: steps.avd-cache.outputs.cache-hit != 'true' - uses: reactivecircus/android-emulator-runner@v2 + - name: Download Android APK + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: - api-level: ${{ env.API_LEVEL }} - arch: ${{ env.ARCH }} - disable-animations: false - emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - force-avd-creation: false - script: echo 'Generated AVD snapshot for caching.' - - - name: Get device name - id: device - run: | - cd detox - AVD_NAME=$(node -p "require('./.detoxrc').devices.android.device.avdName") - echo "AVD_NAME=$AVD_NAME" >> $GITHUB_OUTPUT + name: android-build-apk-${{ github.run_id }} + path: android/app/build/outputs/apk/release/ + + - name: List files in android/app/build/outputs/apk/release/ + run: ls -l android/app/build/outputs/apk/release/ + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm i - name: Detox test uses: reactivecircus/android-emulator-runner@v2 with: - api-level: ${{ env.API_LEVEL }} - arch: ${{ env.ARCH }} - avd-name: ${{ steps.device.outputs.AVD_NAME }} - disable-animations: true - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - force-avd-creation: false - script: > - cd detox - npx detox test - --configuration ${{ env.DETOX_CONFIGURATION }} - --headless - --record-logs failing - --record-videos failing - --take-screenshots failing - - - name: Upload artifacts - if: failure() - uses: actions/upload-artifact@v4 + api-level: 31 + arch: x86_64 + avd-name: pixel_6_pro + script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + + - name: Upload Android Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: - name: detox-artifacts - path: artifacts - retention-days: 14 + name: android-results-${{ matrix.runId }} + path: detox/artifacts + + download-e2e-results: + runs-on: ubuntu-22.04 + if: always() + needs: + - generate-specs + # - e2e-ios + - e2e-android + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Create artifacts directory + run: | + mkdir -p detox/artifacts/ + + - name: Download All Android Artifacts + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + path: detox/artifacts/ + pattern: android-results-* + + - name: Save report Detox Dependencies + run: | + cd detox + npm ci + npm run e2e:save-report + env: + IOS: false From bd99e78f1a3cd10dad67159f6b0ea0403f1bc0dd Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 26 Mar 2024 10:24:24 +0530 Subject: [PATCH 146/362] test splits tests --- .github/actions/generate-specs/split-tests.go | 50 +++-- .github/workflows/e2e-detox.yml | 190 ++++++++++-------- 2 files changed, 140 insertions(+), 100 deletions(-) diff --git a/.github/actions/generate-specs/split-tests.go b/.github/actions/generate-specs/split-tests.go index 001f1719f11..85af2b98331 100644 --- a/.github/actions/generate-specs/split-tests.go +++ b/.github/actions/generate-specs/split-tests.go @@ -12,35 +12,46 @@ import ( "strings" ) +type DeviceInfo struct { + Device string + OSVersion string +} + type Specs struct { searchPath string directory string parallelism int rawFiles []string groupedFiles []SpecGroup + deviceInfo DeviceInfo } type SpecGroup struct { - RunID string `json:"runId"` - Specs string `json:"specs"` + RunID string `json:"runId"` + Specs string `json:"specs"` + Device string `json:"device"` + OSVersion string `json:"osVersion"` } type Output struct { Include []SpecGroup `json:"include"` } -func newSpecGroup(runId string, specs string) *SpecGroup { +func newSpecGroup(runId string, specs string, deviceInfo DeviceInfo) *SpecGroup { return &SpecGroup{ - RunID: runId, - Specs: specs, + RunID: runId, + Specs: specs, + Device: deviceInfo.Device, + OSVersion: deviceInfo.OSVersion, } } -func newSpecs(directory string, searchPath string, parallelism int) *Specs { +func newSpecs(directory string, searchPath string, parallelism int, deviceInfo DeviceInfo) *Specs { return &Specs{ directory: directory, searchPath: searchPath, parallelism: parallelism, + deviceInfo: deviceInfo, } } @@ -68,22 +79,18 @@ func (s *Specs) generateSplits() { // Split to chunks based on the parallelism provided chunkSize := int(math.Ceil(float64(len(s.rawFiles)) / float64(s.parallelism))) runNo := 1 - for i := 0; i <= len(s.rawFiles); i += chunkSize { end := i + chunkSize if end > len(s.rawFiles) { end = len(s.rawFiles) } - fileGroup := strings.Join(s.rawFiles[i:end], " ") - specFileGroup := newSpecGroup(strconv.Itoa(runNo), fileGroup) + specFileGroup := newSpecGroup(strconv.Itoa(runNo), fileGroup, s.deviceInfo) s.groupedFiles = append(s.groupedFiles, *specFileGroup) - // Break when we reach the end to avoid duplicate groups if end == len(s.rawFiles) { break } - runNo++ } } @@ -106,8 +113,27 @@ func main() { searchPath := os.Getenv("SEARCH_PATH") directory := os.Getenv("DIRECTORY") parallelism, _ := strconv.Atoi(os.Getenv("PARALLELISM")) + device := os.Getenv("DEVICE") + osVersion := os.Getenv("OS_VERSION") + + if envDevice, ok := os.LookupEnv("DEVICE"); ok { + device = envDevice + } else { + device = "iPhone 15" // Default device + } + + if envOSVersion, ok := os.LookupEnv("OS_VERSION"); ok { + osVersion = envOSVersion + } else { + osVersion = "17.2" // Default iOS version + } + + deviceInfo := DeviceInfo{ + Device: device, + OSVersion: osVersion, + } - specs := newSpecs(directory, searchPath, parallelism) + specs := newSpecs(directory, searchPath, parallelism, deviceInfo) specs.findFiles() specs.generateSplits() specs.dumpSplits() diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index c37a5849f2a..befeeb5bc53 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -7,14 +7,15 @@ on: pull_request: branches: - main + types: + - labeled + - opened concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} cancel-in-progress: true env: - DEVICE_NAME: "iPhone 15 Pro" - DEVICE_OS_VERSION: "iOS 17.2" BRANCH: ${{ github.head_ref || github.ref_name }} BUILD_ID: ${{ github.run_id }} COMMIT_HASH: ${{ github.sha }} @@ -24,7 +25,7 @@ env: DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }} HEADLESS: 'false' TYPE: 'PR' - PULL_REQUEST: 'https://github.com/mattermost/mattermost-mobile/pull/7822' + PULL_REQUEST: 'https://github.com/mattermost/mattermost-mobile/pull/${{ github.event.number }}' ZEPHYR_ENABLE: false JIRA_PROJECT_KEY: 'MM' ZEPHYR_API_KEY: ${{ secrets.MM_MOBILE_E2E_ZEPHYR_API_KEY }} @@ -36,6 +37,7 @@ env: jobs: generate-specs: runs-on: ubuntu-22.04 + if: (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) outputs: specs: ${{ steps.generate-specs.outputs.specs }} steps: @@ -49,39 +51,43 @@ jobs: parallelism: 10 directory: detox/e2e search_path: test - - build-ios-simulator: - runs-on: macos-14-large - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Prepare iOS Build - uses: ./.github/actions/prepare-ios-build - - - name: Build iOS Simulator - env: - TAG: "${{ github.ref_name }}" - AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" - AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" - GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" - run: bundle exec fastlane ios simulator --env ios.simulator || true - working-directory: ./fastlane - - - name: Upload iOS Simulator Build - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: ios-build-simulator-${{ github.run_id }} - path: Mattermost-simulator-x86_64.app.zip + device: iPhone 15 Pro + os_version: 17.4 + + # build-ios-simulator: + # runs-on: macos-14-large + # if: contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') + # steps: + # - name: Checkout Repository + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + # - name: Prepare iOS Build + # uses: ./.github/actions/prepare-ios-build + + # - name: Build iOS Simulator + # env: + # TAG: "${{ github.ref_name }}" + # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" + # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" + # GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" + # run: bundle exec fastlane ios simulator --env ios.simulator + # working-directory: ./fastlane + + # - name: Upload iOS Simulator Build + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: ios-build-simulator-${{ github.run_id }} + # path: Mattermost-simulator-x86_64.app.zip e2e-ios: env: IOS: true runs-on: macos-14-large - name: test-detox-e2e-${{ matrix.runId }} + name: ios-detox-e2e-${{ matrix.runId }}-${{ matrix.device }}-${{ matrix.os }} + if: contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') needs: - generate-specs - - build-ios-simulator + # - build-ios-simulator strategy: fail-fast: false matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} @@ -93,65 +99,73 @@ jobs: uses: ./.github/actions/prepare-node-deps - name: Set Build ID - run: echo "BUILD_ID=${{ github.run_id }}-${{ env.BUILD_SUFFIX }}" >> $GITHUB_ENV - - - name: Install Homebrew Dependencies run: | - brew tap wix/brew - brew install applesimutils - - - name: Download iOS Simulator Build - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - name: ios-build-simulator-${{ github.run_id }} - path: mobile-artifacts - - - name: Unzip iOS Simulator Build - run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ - - - name: Start React Native Metro Server - run: npm run start & - - - name: Install Detox Dependencies - run: cd detox && npm i - - - name: Run Detox E2E Tests - run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} - - - name: Upload iOS Test Report - if: always() - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: ios-results-${{ matrix.runId }} - path: detox/artifacts/ - - download-e2e-results: - runs-on: ubuntu-22.04 - if: always() - needs: - - generate-specs - - e2e-ios - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") + DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.os") + echo "BUILD_ID=${{ github.run_id }}-${{ matrix.device }}-${{ matrix.os }}" >> $GITHUB_ENV + echo "DEVICE_NAME=$DEVICE_NAME" >> $GITHUB_ENV + echo "DEVICE_OS_VERSION=$DEVICE_OS_VERSION" >> $GITHUB_ENV + + - name: Test step + run: echo ${{ fromJSON(needs.generate-specs.outputs.specs) }} - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps + # - name: Install Homebrew Dependencies + # run: | + # brew tap wix/brew + # brew install applesimutils + + # - name: Download iOS Simulator Build + # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # with: + # name: ios-build-simulator-${{ github.run_id }} + # path: mobile-artifacts + + # - name: Unzip iOS Simulator Build + # run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ + + # - name: Start React Native Metro Server + # run: npm run start & + + # - name: Install Detox Dependencies + # run: cd detox && npm i + + # - name: Run Detox E2E Tests + # run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} + + # - name: Upload iOS Test Report + # if: always() + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: ios-results-${{ matrix.runId }} + # path: detox/artifacts/ + + # download-e2e-results: + # runs-on: ubuntu-22.04 + # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) + # needs: + # - generate-specs + # - e2e-ios + # steps: + # - name: Checkout Repository + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - name: Create artifacts directory - run: | - mkdir -p detox/artifacts/ - - - name: Download All Artifacts - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - path: detox/artifacts/ - pattern: ios-results-* - - - name: Save report Detox Dependencies - run: | - cd detox - npm ci - npm run e2e:save-report - env: - IOS: true + # - name: ci/prepare-node-deps + # uses: ./.github/actions/prepare-node-deps + + # - name: Create artifacts directory + # run: | + # mkdir -p detox/artifacts/ + + # - name: Download All Artifacts + # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # with: + # path: detox/artifacts/ + # pattern: ios-results-* + + # - name: Save report Detox Dependencies + # run: | + # cd detox + # npm ci + # npm run e2e:save-report + # env: + # IOS: true From 5295b0eb5f5bf63013e438ec8a20d5253289733e Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 26 Mar 2024 10:29:01 +0530 Subject: [PATCH 147/362] test splits tests --- .github/workflows/e2e-detox.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index befeeb5bc53..66fb900528e 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -83,7 +83,7 @@ jobs: env: IOS: true runs-on: macos-14-large - name: ios-detox-e2e-${{ matrix.runId }}-${{ matrix.device }}-${{ matrix.os }} + name: ios-detox-e2e-${{ matrix.runId }}-${{ matrix.device }}-${{ matrix.osVersion }} if: contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') needs: - generate-specs @@ -100,9 +100,10 @@ jobs: - name: Set Build ID run: | + cd detox DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.os") - echo "BUILD_ID=${{ github.run_id }}-${{ matrix.device }}-${{ matrix.os }}" >> $GITHUB_ENV + echo "BUILD_ID=${{ github.run_id }}-${{ matrix.device }}-${{ matrix.osVersion }}" >> $GITHUB_ENV echo "DEVICE_NAME=$DEVICE_NAME" >> $GITHUB_ENV echo "DEVICE_OS_VERSION=$DEVICE_OS_VERSION" >> $GITHUB_ENV From 3dc97c7e5880f3e88565516d802bf006953ee6e4 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 26 Mar 2024 10:42:48 +0530 Subject: [PATCH 148/362] test splits tests --- .github/workflows/e2e-detox.yml | 87 +++++++++++++++++---------------- detox/.detoxrc.json | 3 +- 2 files changed, 47 insertions(+), 43 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 66fb900528e..1fe8a10e075 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -44,6 +44,15 @@ jobs: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Set Build ID + run: | + cd detox + DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") + DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.os") + echo "BUILD_ID=${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" >> $GITHUB_ENV + echo "DEVICE_NAME=$DEVICE_NAME" >> $GITHUB_ENV + echo "DEVICE_OS_VERSION=$DEVICE_OS_VERSION" >> $GITHUB_ENV + - name: Generate Test Specs id: generate-specs uses: ./.github/actions/generate-specs @@ -51,8 +60,8 @@ jobs: parallelism: 10 directory: detox/e2e search_path: test - device: iPhone 15 Pro - os_version: 17.4 + device: ${{ env.DEVICE_NAME }} + os_version: ${{ env.DEVICE_OS_VERSION }} # build-ios-simulator: # runs-on: macos-14-large @@ -95,20 +104,11 @@ jobs: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps - - - name: Set Build ID - run: | - cd detox - DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") - DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.os") - echo "BUILD_ID=${{ github.run_id }}-${{ matrix.device }}-${{ matrix.osVersion }}" >> $GITHUB_ENV - echo "DEVICE_NAME=$DEVICE_NAME" >> $GITHUB_ENV - echo "DEVICE_OS_VERSION=$DEVICE_OS_VERSION" >> $GITHUB_ENV + # - name: ci/prepare-node-deps + # uses: ./.github/actions/prepare-node-deps - name: Test step - run: echo ${{ fromJSON(needs.generate-specs.outputs.specs) }} + run: echo '${{ fromJSON(needs.generate-specs.outputs.specs) }}' | jq # - name: Install Homebrew Dependencies # run: | @@ -140,33 +140,36 @@ jobs: # name: ios-results-${{ matrix.runId }} # path: detox/artifacts/ - # download-e2e-results: - # runs-on: ubuntu-22.04 - # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) - # needs: - # - generate-specs - # - e2e-ios - # steps: - # - name: Checkout Repository - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - # - name: ci/prepare-node-deps - # uses: ./.github/actions/prepare-node-deps + download-e2e-results: + runs-on: ubuntu-22.04 + if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) + needs: + - generate-specs + - e2e-ios + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - # - name: Create artifacts directory - # run: | - # mkdir -p detox/artifacts/ - - # - name: Download All Artifacts - # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - # with: - # path: detox/artifacts/ - # pattern: ios-results-* + - name: Test step + run: echo ${{ env.BUILD_ID }} - # - name: Save report Detox Dependencies - # run: | - # cd detox - # npm ci - # npm run e2e:save-report - # env: - # IOS: true + # - name: ci/prepare-node-deps + # uses: ./.github/actions/prepare-node-deps + + # - name: Create artifacts directory + # run: | + # mkdir -p detox/artifacts/ + + # - name: Download All Artifacts + # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # with: + # path: detox/artifacts/ + # pattern: ios-results-* + + # - name: Save report Detox Dependencies + # run: | + # cd detox + # npm ci + # npm run e2e:save-report + # env: + # IOS: true diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index a658a99e834..c6a08e53f6c 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -30,7 +30,8 @@ "ios.simulator": { "type": "ios.simulator", "device": { - "type": "iPhone 15 Pro" + "type": "iPhone 15 Pro", + "os": "iOS 17.4" } }, "android.emulator": { From 2fc80b72a041a0a03dde967253b516ec82465762 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 26 Mar 2024 10:56:32 +0530 Subject: [PATCH 149/362] test splits tests --- .github/workflows/e2e-detox.yml | 41 ++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 1fe8a10e075..620effaf4b4 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -17,7 +17,6 @@ concurrency: env: BRANCH: ${{ github.head_ref || github.ref_name }} - BUILD_ID: ${{ github.run_id }} COMMIT_HASH: ${{ github.sha }} AWS_REGION: 'us-east-1' DETOX_AWS_S3_BUCKET: 'mattermost-detox-report' @@ -108,8 +107,11 @@ jobs: # uses: ./.github/actions/prepare-node-deps - name: Test step - run: echo '${{ fromJSON(needs.generate-specs.outputs.specs) }}' | jq - + run: echo "INPUT=${{ fromJSON(needs.generate-specs.outputs.specs) }}" >> $GITHUB_ENV + + - name: Test step + run: echo "${{ env.INPUT }}" + # - name: Install Homebrew Dependencies # run: | # brew tap wix/brew @@ -173,3 +175,36 @@ jobs: # npm run e2e:save-report # env: # IOS: true + + e2e-remove-label: + if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) + needs: [download-e2e-results] + runs-on: ubuntu-22.04 + steps: + - name: e2e/remove-label-from-pr + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + continue-on-error: true # Label might have been removed manually + with: + script: | + const iosLabel = 'E2E iOS tests for PR'; + const androidLabel = 'E2E Android tests for PR'; + const labels = context.payload.pull_request.labels.map(label => label.name); + + if (labels.includes(iosLabel)) { + github.rest.issues.removeLabel({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + name: iosLabel, + }); + } + + if (labels.includes(androidLabel)) { + github.rest.issues.removeLabel({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + name: androidLabel, + }); + } + \ No newline at end of file From 8e6dac9e22f6045caf107cae13410b6c01e3c641 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 26 Mar 2024 11:09:25 +0530 Subject: [PATCH 150/362] test splits tests --- .github/actions/generate-specs/action.yml | 11 +++++++++++ .github/actions/generate-specs/split-tests.go | 12 ------------ .github/workflows/e2e-detox.yml | 8 ++++++-- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/.github/actions/generate-specs/action.yml b/.github/actions/generate-specs/action.yml index eea47f70489..d25198532e0 100644 --- a/.github/actions/generate-specs/action.yml +++ b/.github/actions/generate-specs/action.yml @@ -12,6 +12,15 @@ inputs: parallelism: description: The parallelism for the tests required: true + device: + description: The name of Device used for the tests + required: false + default: iPhone 15 + os_version: + description: The os of the device used for the tests + required: false + default: iOS 17.1 + outputs: specs: description: The specs generated for the strategy @@ -25,6 +34,8 @@ runs: PARALLELISM: ${{ inputs.parallelism }} SEARCH_PATH: ${{ inputs.search_path }} DIRECTORY: ${{ inputs.directory }} + DEVICE: ${{ inputs.DEVICE }} + OS_VERSION: ${{ inputs.OS_VERSION }} run: | set -e go run ${{ github.action_path }}/split-tests.go > output.json diff --git a/.github/actions/generate-specs/split-tests.go b/.github/actions/generate-specs/split-tests.go index 85af2b98331..5ca973cf75c 100644 --- a/.github/actions/generate-specs/split-tests.go +++ b/.github/actions/generate-specs/split-tests.go @@ -116,18 +116,6 @@ func main() { device := os.Getenv("DEVICE") osVersion := os.Getenv("OS_VERSION") - if envDevice, ok := os.LookupEnv("DEVICE"); ok { - device = envDevice - } else { - device = "iPhone 15" // Default device - } - - if envOSVersion, ok := os.LookupEnv("OS_VERSION"); ok { - osVersion = envOSVersion - } else { - osVersion = "17.2" // Default iOS version - } - deviceInfo := DeviceInfo{ Device: device, OSVersion: osVersion, diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 620effaf4b4..1436e93aa01 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -51,6 +51,7 @@ jobs: echo "BUILD_ID=${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" >> $GITHUB_ENV echo "DEVICE_NAME=$DEVICE_NAME" >> $GITHUB_ENV echo "DEVICE_OS_VERSION=$DEVICE_OS_VERSION" >> $GITHUB_ENV + echo $BUILD_ID - name: Generate Test Specs id: generate-specs @@ -110,7 +111,9 @@ jobs: run: echo "INPUT=${{ fromJSON(needs.generate-specs.outputs.specs) }}" >> $GITHUB_ENV - name: Test step - run: echo "${{ env.INPUT }}" + run: | + echo "${{ env.INPUT }}" + echo "${{ env.BUILD_ID }}" # - name: Install Homebrew Dependencies # run: | @@ -178,7 +181,8 @@ jobs: e2e-remove-label: if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) - needs: [download-e2e-results] + needs: + - download-e2e-results runs-on: ubuntu-22.04 steps: - name: e2e/remove-label-from-pr From b187edc82621d590cff3ecf260bcde78d6c32ea5 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 26 Mar 2024 11:12:49 +0530 Subject: [PATCH 151/362] test splits tests --- .github/workflows/e2e-detox.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 1436e93aa01..ee33105700f 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -48,10 +48,10 @@ jobs: cd detox DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.os") - echo "BUILD_ID=${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" >> $GITHUB_ENV + echo "BUILD_ID=${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" echo "DEVICE_NAME=$DEVICE_NAME" >> $GITHUB_ENV echo "DEVICE_OS_VERSION=$DEVICE_OS_VERSION" >> $GITHUB_ENV - echo $BUILD_ID + echo "BUILD_ID=$(echo "$BUILD_ID" | sed 's/ /_/g')" >> $GITHUB_ENV - name: Generate Test Specs id: generate-specs From 990858ad0a4cba3c5cf64730e63fe0ecf0e5f469 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 26 Mar 2024 11:20:52 +0530 Subject: [PATCH 152/362] test splits tests --- .github/workflows/e2e-detox.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index ee33105700f..5b59a3a4f21 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -44,6 +44,7 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Set Build ID + id: build-id run: | cd detox DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") @@ -51,7 +52,7 @@ jobs: echo "BUILD_ID=${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" echo "DEVICE_NAME=$DEVICE_NAME" >> $GITHUB_ENV echo "DEVICE_OS_VERSION=$DEVICE_OS_VERSION" >> $GITHUB_ENV - echo "BUILD_ID=$(echo "$BUILD_ID" | sed 's/ /_/g')" >> $GITHUB_ENV + echo "BUILD_ID=$(echo $BUILD_ID | sed 's/ /_/g')" >> $GITHUB_ENV - name: Generate Test Specs id: generate-specs @@ -91,6 +92,7 @@ jobs: e2e-ios: env: IOS: true + BUILD_ID: ${{ needs.build-id.outputs.BUILD_ID }} runs-on: macos-14-large name: ios-detox-e2e-${{ matrix.runId }}-${{ matrix.device }}-${{ matrix.osVersion }} if: contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') @@ -107,12 +109,8 @@ jobs: # - name: ci/prepare-node-deps # uses: ./.github/actions/prepare-node-deps - - name: Test step - run: echo "INPUT=${{ fromJSON(needs.generate-specs.outputs.specs) }}" >> $GITHUB_ENV - - name: Test step run: | - echo "${{ env.INPUT }}" echo "${{ env.BUILD_ID }}" # - name: Install Homebrew Dependencies @@ -146,6 +144,8 @@ jobs: # path: detox/artifacts/ download-e2e-results: + env: + BUILD_ID: ${{ needs.build-id.outputs.BUILD_ID }} runs-on: ubuntu-22.04 if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) needs: From f00338b0433b7d5d4242eb348c35aea67605fc60 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 26 Mar 2024 11:23:57 +0530 Subject: [PATCH 153/362] test splits tests --- .github/workflows/e2e-detox.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 5b59a3a4f21..ef71da99787 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -49,10 +49,9 @@ jobs: cd detox DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.os") - echo "BUILD_ID=${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" + echo "BUILD_ID=${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" >> $GITHUB_ENV echo "DEVICE_NAME=$DEVICE_NAME" >> $GITHUB_ENV echo "DEVICE_OS_VERSION=$DEVICE_OS_VERSION" >> $GITHUB_ENV - echo "BUILD_ID=$(echo $BUILD_ID | sed 's/ /_/g')" >> $GITHUB_ENV - name: Generate Test Specs id: generate-specs @@ -112,6 +111,7 @@ jobs: - name: Test step run: | echo "${{ env.BUILD_ID }}" + echo "BUILD_ID=$(echo ${{ env.BUILD_ID }} | sed 's/ /_/g')" >> $GITHUB_ENV # - name: Install Homebrew Dependencies # run: | From f17e38d6ed937a51db489f4db0684853c0fe6d32 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 26 Mar 2024 11:29:18 +0530 Subject: [PATCH 154/362] test splits tests --- .github/workflows/e2e-detox.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index ef71da99787..6ed516f8376 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -39,6 +39,7 @@ jobs: if: (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) outputs: specs: ${{ steps.generate-specs.outputs.specs }} + build_id: ${{ steps.build-id.outputs.BUILD_ID }} steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -49,9 +50,10 @@ jobs: cd detox DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.os") - echo "BUILD_ID=${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" >> $GITHUB_ENV - echo "DEVICE_NAME=$DEVICE_NAME" >> $GITHUB_ENV - echo "DEVICE_OS_VERSION=$DEVICE_OS_VERSION" >> $GITHUB_ENV + BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" # Construct BUILD_ID + echo "BUILD_ID=${BUILD_ID}" >> $GITHUB_ENV # Set BUILD_ID as an environment variable + echo "DEVICE_NAME=${DEVICE_NAME}" >> $GITHUB_ENV + echo "DEVICE_OS_VERSION=${DEVICE_OS_VERSION}" >> $GITHUB_ENV - name: Generate Test Specs id: generate-specs @@ -91,7 +93,7 @@ jobs: e2e-ios: env: IOS: true - BUILD_ID: ${{ needs.build-id.outputs.BUILD_ID }} + BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} runs-on: macos-14-large name: ios-detox-e2e-${{ matrix.runId }}-${{ matrix.device }}-${{ matrix.osVersion }} if: contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') @@ -145,7 +147,7 @@ jobs: download-e2e-results: env: - BUILD_ID: ${{ needs.build-id.outputs.BUILD_ID }} + BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} runs-on: ubuntu-22.04 if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) needs: From a7cde32878782b5667d6f01cdb2a99dcdce2a557 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 26 Mar 2024 11:35:13 +0530 Subject: [PATCH 155/362] test splits tests --- .github/workflows/e2e-detox.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 6ed516f8376..cc1f993e7d1 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -39,7 +39,7 @@ jobs: if: (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) outputs: specs: ${{ steps.generate-specs.outputs.specs }} - build_id: ${{ steps.build-id.outputs.BUILD_ID }} + build_id: ${{ steps.generate-specs.outputs.BUILD_ID }} steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -50,8 +50,9 @@ jobs: cd detox DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.os") - BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" # Construct BUILD_ID - echo "BUILD_ID=${BUILD_ID}" >> $GITHUB_ENV # Set BUILD_ID as an environment variable + BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" + + echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV echo "DEVICE_NAME=${DEVICE_NAME}" >> $GITHUB_ENV echo "DEVICE_OS_VERSION=${DEVICE_OS_VERSION}" >> $GITHUB_ENV @@ -113,7 +114,7 @@ jobs: - name: Test step run: | echo "${{ env.BUILD_ID }}" - echo "BUILD_ID=$(echo ${{ env.BUILD_ID }} | sed 's/ /_/g')" >> $GITHUB_ENV + echo "BUILD_ID=$(echo ${{ env.BUILD_ID }} | sed 's/ /_/g')" # - name: Install Homebrew Dependencies # run: | From 1b2f8f67b94372251b065c625bf7bb096c2bb5f3 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 26 Mar 2024 11:37:09 +0530 Subject: [PATCH 156/362] test splits tests --- .github/workflows/e2e-detox.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index cc1f993e7d1..b4dc229fb90 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -94,7 +94,7 @@ jobs: e2e-ios: env: IOS: true - BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} + BUILD_ID: ${{ needs.generate-specs.outputs.BUILD_ID }} runs-on: macos-14-large name: ios-detox-e2e-${{ matrix.runId }}-${{ matrix.device }}-${{ matrix.osVersion }} if: contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') @@ -148,7 +148,7 @@ jobs: download-e2e-results: env: - BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} + BUILD_ID: ${{ needs.generate-specs.outputs.BUILD_ID }} runs-on: ubuntu-22.04 if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) needs: From 38ed24540699ec94c8f66e442dce50513d84217b Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 26 Mar 2024 11:41:03 +0530 Subject: [PATCH 157/362] test splits tests --- .github/workflows/e2e-detox.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index b4dc229fb90..f21c2ded525 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -39,7 +39,7 @@ jobs: if: (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) outputs: specs: ${{ steps.generate-specs.outputs.specs }} - build_id: ${{ steps.generate-specs.outputs.BUILD_ID }} + BUILD_ID: ${{ steps.generate-specs.outputs.BUILD_ID }} steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -94,7 +94,6 @@ jobs: e2e-ios: env: IOS: true - BUILD_ID: ${{ needs.generate-specs.outputs.BUILD_ID }} runs-on: macos-14-large name: ios-detox-e2e-${{ matrix.runId }}-${{ matrix.device }}-${{ matrix.osVersion }} if: contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') @@ -114,7 +113,7 @@ jobs: - name: Test step run: | echo "${{ env.BUILD_ID }}" - echo "BUILD_ID=$(echo ${{ env.BUILD_ID }} | sed 's/ /_/g')" + echo "output of step dirctly BUILD_ID: ${{ needs.generate-specs.outputs.BUILD_ID }}" # - name: Install Homebrew Dependencies # run: | @@ -147,8 +146,6 @@ jobs: # path: detox/artifacts/ download-e2e-results: - env: - BUILD_ID: ${{ needs.generate-specs.outputs.BUILD_ID }} runs-on: ubuntu-22.04 if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) needs: From 3ab077d034dcb4c1bf1a33c2a810c3b9f998ed65 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 26 Mar 2024 18:36:54 +0530 Subject: [PATCH 158/362] clean up --- .github/workflows/e2e-detox.yml | 146 +++++++++++++++----------------- 1 file changed, 69 insertions(+), 77 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index f21c2ded525..f30d1889794 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -45,7 +45,6 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Set Build ID - id: build-id run: | cd detox DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") @@ -66,30 +65,30 @@ jobs: device: ${{ env.DEVICE_NAME }} os_version: ${{ env.DEVICE_OS_VERSION }} - # build-ios-simulator: - # runs-on: macos-14-large - # if: contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') - # steps: - # - name: Checkout Repository - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - # - name: Prepare iOS Build - # uses: ./.github/actions/prepare-ios-build - - # - name: Build iOS Simulator - # env: - # TAG: "${{ github.ref_name }}" - # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" - # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" - # GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" - # run: bundle exec fastlane ios simulator --env ios.simulator - # working-directory: ./fastlane - - # - name: Upload iOS Simulator Build - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: ios-build-simulator-${{ github.run_id }} - # path: Mattermost-simulator-x86_64.app.zip + build-ios-simulator: + runs-on: macos-14-large + if: contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Prepare iOS Build + uses: ./.github/actions/prepare-ios-build + + - name: Build iOS Simulator + env: + TAG: "${{ github.ref_name }}" + AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" + AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" + GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" + run: bundle exec fastlane ios simulator --env ios.simulator + working-directory: ./fastlane + + - name: Upload iOS Simulator Build + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: ios-build-simulator-${{ github.run_id }} + path: Mattermost-simulator-x86_64.app.zip e2e-ios: env: @@ -99,7 +98,7 @@ jobs: if: contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') needs: - generate-specs - # - build-ios-simulator + - build-ios-simulator strategy: fail-fast: false matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} @@ -107,43 +106,38 @@ jobs: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - # - name: ci/prepare-node-deps - # uses: ./.github/actions/prepare-node-deps + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps - - name: Test step + - name: Install Homebrew Dependencies run: | - echo "${{ env.BUILD_ID }}" - echo "output of step dirctly BUILD_ID: ${{ needs.generate-specs.outputs.BUILD_ID }}" - - # - name: Install Homebrew Dependencies - # run: | - # brew tap wix/brew - # brew install applesimutils + brew tap wix/brew + brew install applesimutils - # - name: Download iOS Simulator Build - # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - # with: - # name: ios-build-simulator-${{ github.run_id }} - # path: mobile-artifacts + - name: Download iOS Simulator Build + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + name: ios-build-simulator-${{ github.run_id }} + path: mobile-artifacts - # - name: Unzip iOS Simulator Build - # run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ + - name: Unzip iOS Simulator Build + run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ - # - name: Start React Native Metro Server - # run: npm run start & + - name: Start React Native Metro Server + run: npm run start & - # - name: Install Detox Dependencies - # run: cd detox && npm i + - name: Install Detox Dependencies + run: cd detox && npm i - # - name: Run Detox E2E Tests - # run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} + - name: Run Detox E2E Tests + run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} - # - name: Upload iOS Test Report - # if: always() - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: ios-results-${{ matrix.runId }} - # path: detox/artifacts/ + - name: Upload iOS Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: ios-results-${{ matrix.runId }} + path: detox/artifacts/ download-e2e-results: runs-on: ubuntu-22.04 @@ -151,33 +145,31 @@ jobs: needs: - generate-specs - e2e-ios + env: + BUILD_ID: ${{ needs.generate-specs.outputs.BUILD_ID }} steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - name: Test step - run: echo ${{ env.BUILD_ID }} - - # - name: ci/prepare-node-deps - # uses: ./.github/actions/prepare-node-deps + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps - # - name: Create artifacts directory - # run: | - # mkdir -p detox/artifacts/ - - # - name: Download All Artifacts - # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - # with: - # path: detox/artifacts/ - # pattern: ios-results-* - - # - name: Save report Detox Dependencies - # run: | - # cd detox - # npm ci - # npm run e2e:save-report - # env: - # IOS: true + - name: Create artifacts directory + run: mkdir -p detox/artifacts/ + + - name: Download All Artifacts + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + path: detox/artifacts/ + pattern: ios-results-* + + - name: Save report Detox Dependencies + run: | + cd detox + npm ci + npm run e2e:save-report + env: + IOS: true e2e-remove-label: if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) From 39beed53e5e6c940984255f5f4029949fde039f7 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 5 Apr 2024 09:29:24 +0530 Subject: [PATCH 159/362] review comments --- .github/actions/generate-specs/action.yml | 2 +- .github/actions/generate-specs/split-tests.go | 128 ------------------ .github/actions/generate-specs/split-tests.js | 94 +++++++++++++ detox/e2e/support/ui/screen/invite.ts | 2 +- detox/e2e/support/ui/screen/login.ts | 2 - detox/e2e/test/account/about.e2e.ts | 2 + detox/e2e/test/autocomplete/edit_post.e2e.ts | 2 +- detox/e2e/test/teams/invite_people.e2e.ts | 4 +- detox/package-lock.json | 2 +- detox/package.json | 2 +- detox/utils/report.js | 2 +- 11 files changed, 104 insertions(+), 138 deletions(-) delete mode 100644 .github/actions/generate-specs/split-tests.go create mode 100644 .github/actions/generate-specs/split-tests.js diff --git a/.github/actions/generate-specs/action.yml b/.github/actions/generate-specs/action.yml index d25198532e0..ad3cdfdeddf 100644 --- a/.github/actions/generate-specs/action.yml +++ b/.github/actions/generate-specs/action.yml @@ -38,6 +38,6 @@ runs: OS_VERSION: ${{ inputs.OS_VERSION }} run: | set -e - go run ${{ github.action_path }}/split-tests.go > output.json + node ${{ github.action_path }}/split-tests.js > output.json echo "specs=$(cat output.json)" >> $GITHUB_OUTPUT shell: bash diff --git a/.github/actions/generate-specs/split-tests.go b/.github/actions/generate-specs/split-tests.go deleted file mode 100644 index 5ca973cf75c..00000000000 --- a/.github/actions/generate-specs/split-tests.go +++ /dev/null @@ -1,128 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "io/fs" - "math" - "os" - "path/filepath" - "regexp" - "strconv" - "strings" -) - -type DeviceInfo struct { - Device string - OSVersion string -} - -type Specs struct { - searchPath string - directory string - parallelism int - rawFiles []string - groupedFiles []SpecGroup - deviceInfo DeviceInfo -} - -type SpecGroup struct { - RunID string `json:"runId"` - Specs string `json:"specs"` - Device string `json:"device"` - OSVersion string `json:"osVersion"` -} - -type Output struct { - Include []SpecGroup `json:"include"` -} - -func newSpecGroup(runId string, specs string, deviceInfo DeviceInfo) *SpecGroup { - return &SpecGroup{ - RunID: runId, - Specs: specs, - Device: deviceInfo.Device, - OSVersion: deviceInfo.OSVersion, - } -} - -func newSpecs(directory string, searchPath string, parallelism int, deviceInfo DeviceInfo) *Specs { - return &Specs{ - directory: directory, - searchPath: searchPath, - parallelism: parallelism, - deviceInfo: deviceInfo, - } -} - -func (s *Specs) findFiles() { - fileSystem := os.DirFS(filepath.Join(s.directory, s.searchPath)) - err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error { - if err != nil { - return err - } - - // Find all files matching *.e2e.ts - r := regexp.MustCompile(`.*\.e2e\.ts$`) - if r.MatchString(path) { - s.rawFiles = append(s.rawFiles, filepath.Join(s.searchPath, path)) - } - - return nil - }) - if err != nil { - panic(err) - } -} - -func (s *Specs) generateSplits() { - // Split to chunks based on the parallelism provided - chunkSize := int(math.Ceil(float64(len(s.rawFiles)) / float64(s.parallelism))) - runNo := 1 - for i := 0; i <= len(s.rawFiles); i += chunkSize { - end := i + chunkSize - if end > len(s.rawFiles) { - end = len(s.rawFiles) - } - fileGroup := strings.Join(s.rawFiles[i:end], " ") - specFileGroup := newSpecGroup(strconv.Itoa(runNo), fileGroup, s.deviceInfo) - s.groupedFiles = append(s.groupedFiles, *specFileGroup) - // Break when we reach the end to avoid duplicate groups - if end == len(s.rawFiles) { - break - } - runNo++ - } -} - -func (s *Specs) dumpSplits() { - // Dump json format for GitHub actions - o := &Output{ - Include: s.groupedFiles, - } - - b, err := json.Marshal(o) - if err != nil { - panic(err) - } - - fmt.Println(string(b)) -} - -func main() { - searchPath := os.Getenv("SEARCH_PATH") - directory := os.Getenv("DIRECTORY") - parallelism, _ := strconv.Atoi(os.Getenv("PARALLELISM")) - device := os.Getenv("DEVICE") - osVersion := os.Getenv("OS_VERSION") - - deviceInfo := DeviceInfo{ - Device: device, - OSVersion: osVersion, - } - - specs := newSpecs(directory, searchPath, parallelism, deviceInfo) - specs.findFiles() - specs.generateSplits() - specs.dumpSplits() -} diff --git a/.github/actions/generate-specs/split-tests.js b/.github/actions/generate-specs/split-tests.js new file mode 100644 index 00000000000..cbea3c01615 --- /dev/null +++ b/.github/actions/generate-specs/split-tests.js @@ -0,0 +1,94 @@ +class DeviceInfo { + constructor(device, osVersion) { + this.device = device; + this.osVersion = osVersion; + } +} + +class SpecGroup { + constructor(runId, specs, deviceInfo) { + this.runId = runId; + this.specs = specs; + this.device = deviceInfo.device; + this.osVersion = deviceInfo.osVersion; + } +} + +class Specs { + constructor(directory, searchPath, parallelism, deviceInfo) { + this.searchPath = searchPath; + this.directory = directory; + this.parallelism = parallelism; + this.rawFiles = []; + this.groupedFiles = []; + this.deviceInfo = deviceInfo; + } + + findFiles() { + const fs = require('fs'); + const path = require('path'); + const dirPath = path.join(this.directory, this.searchPath); + + const fileRegex = /\.e2e\.ts$/; + + const walkSync = (currentPath) => { + const files = fs.readdirSync(currentPath); + + files.forEach((file) => { + const filePath = path.join(currentPath, file); + const stats = fs.statSync(filePath); + + if (stats.isDirectory()) { + walkSync(filePath); + } else if (fileRegex.test(filePath)) { + this.rawFiles.push(path.join(this.searchPath, filePath)); + } + }); + }; + + walkSync(dirPath); + } + + generateSplits() { + const chunkSize = Math.ceil(this.rawFiles.length / this.parallelism); + let runNo = 1; + + for (let i = 0; i < this.rawFiles.length; i += chunkSize) { + const end = Math.min(i + chunkSize, this.rawFiles.length); + const fileGroup = this.rawFiles.slice(i, end).join(' '); + const specFileGroup = new SpecGroup(runNo.toString(), fileGroup, this.deviceInfo); + this.groupedFiles.push(specFileGroup); + + if (end === this.rawFiles.length) { + break; + } + + runNo++; + } + } + + dumpSplits() { + const output = { + include: this.groupedFiles, + }; + + console.log(JSON.stringify(output)); + } +} + +function main() { + const searchPath = process.env.SEARCH_PATH; + const directory = process.env.DIRECTORY; + const parallelism = parseInt(process.env.PARALLELISM, 10); + const device = process.env.DEVICE; + const osVersion = process.env.OS_VERSION; + + const deviceInfo = new DeviceInfo(device, osVersion); + const specs = new Specs(directory, searchPath, parallelism, deviceInfo); + + specs.findFiles(); + specs.generateSplits(); + specs.dumpSplits(); +} + +main(); diff --git a/detox/e2e/support/ui/screen/invite.ts b/detox/e2e/support/ui/screen/invite.ts index 3962618fbf9..95fa8827232 100644 --- a/detox/e2e/support/ui/screen/invite.ts +++ b/detox/e2e/support/ui/screen/invite.ts @@ -100,7 +100,7 @@ class InviteScreen { }; getSummaryReportUserItemText = (id: string) => { - return element(by.id(`${this.testID.summaryReportUserItemPrefix}.${id}.username`)); + return element(by.id(`${this.testID.summaryReportUserItemPrefix}.${id}.display_name`)); }; toBeVisible = async () => { diff --git a/detox/e2e/support/ui/screen/login.ts b/detox/e2e/support/ui/screen/login.ts index 0c802d3e090..fd663837d29 100644 --- a/detox/e2e/support/ui/screen/login.ts +++ b/detox/e2e/support/ui/screen/login.ts @@ -63,7 +63,6 @@ class LoginScreen { await this.usernameInput.typeText(`${user.newUser.email}\n`); await this.passwordInput.typeText(`${user.newUser.password}\n`); - // await this.signinButton.tap(); await wait(timeouts.FOUR_SEC); }; @@ -72,7 +71,6 @@ class LoginScreen { await this.usernameInput.typeText(user.username); await this.passwordInput.typeText(`${user.password}\n`); - // await this.signinButton.tap(); await wait(timeouts.ONE_SEC); }; } diff --git a/detox/e2e/test/account/about.e2e.ts b/detox/e2e/test/account/about.e2e.ts index fe99daebaed..4944fdc9e08 100644 --- a/detox/e2e/test/account/about.e2e.ts +++ b/detox/e2e/test/account/about.e2e.ts @@ -69,6 +69,8 @@ describe('Account - Settings - About', () => { await expect(AboutScreen.databaseSchemaVersionTitle).toHaveText('Database Schema Version:'); await expect(AboutScreen.databaseSchemaVersionValue).toBeVisible(); await expect(AboutScreen.copyInfoButton).toBeVisible(); + await expect(element(by.text(new RegExp('Copy info', 'i')))).toBeVisible(); + if (isLicensed) { await expect(AboutScreen.licensee).toBeVisible(); } else { diff --git a/detox/e2e/test/autocomplete/edit_post.e2e.ts b/detox/e2e/test/autocomplete/edit_post.e2e.ts index 51a5af981da..bc9dc968d1c 100644 --- a/detox/e2e/test/autocomplete/edit_post.e2e.ts +++ b/detox/e2e/test/autocomplete/edit_post.e2e.ts @@ -67,7 +67,7 @@ describe('Autocomplete - Edit Post', () => { await expect(Autocomplete.sectionAtMentionList).not.toBeVisible(); // # Type in "@" to activate at-mention autocomplete - await EditPostScreen.messageInput.typeText(' @'); + await EditPostScreen.messageInput.typeText('@'); // * Verify at-mention list is displayed await expect(Autocomplete.sectionAtMentionList).toBeVisible(); diff --git a/detox/e2e/test/teams/invite_people.e2e.ts b/detox/e2e/test/teams/invite_people.e2e.ts index 2edaf751d54..a29d4b61f45 100644 --- a/detox/e2e/test/teams/invite_people.e2e.ts +++ b/detox/e2e/test/teams/invite_people.e2e.ts @@ -235,11 +235,11 @@ describe('Teams - Invite', () => { // * Validate summary report not sent await expect(Invite.getSummaryReportNotSent()).toBeVisible(); await expect(Invite.getSummaryReportUserItem(testUser.id)).toBeVisible(); - await expect(Invite.getSummaryReportUserItemText(testUser.id)).toBeVisible(); + await expect(Invite.getSummaryReportUserItemText(testUser.id)).toBeVisible(testUser.username1); // * Validate summary report sent waitFor(Invite.getSummaryReportSent()).toBeVisible(); await expect(Invite.getSummaryReportUserItem(testUser2.id)).toBeVisible(); - await expect(Invite.getSummaryReportUserItemText(testUser2.id)).toBeVisible(); + await expect(Invite.getSummaryReportUserItemText(testUser2.id)).toBeVisible(testUser2.username1); }); }); diff --git a/detox/package-lock.json b/detox/package-lock.json index 0256bab0246..803132516c7 100644 --- a/detox/package-lock.json +++ b/detox/package-lock.json @@ -22,7 +22,7 @@ "babel-plugin-module-resolver": "5.0.0", "client-oauth2": "4.3.3", "deepmerge": "4.3.1", - "detox": "^20.19.3", + "detox": "20.19.3", "form-data": "4.0.0", "jest": "29.7.0", "jest-circus": "29.7.0", diff --git a/detox/package.json b/detox/package.json index abf578dfef8..b2daf8a3e51 100644 --- a/detox/package.json +++ b/detox/package.json @@ -20,7 +20,7 @@ "babel-plugin-module-resolver": "5.0.0", "client-oauth2": "4.3.3", "deepmerge": "4.3.1", - "detox": "^20.19.3", + "detox": "20.19.3", "form-data": "4.0.0", "jest": "29.7.0", "jest-circus": "29.7.0", diff --git a/detox/utils/report.js b/detox/utils/report.js index 0da8ae31435..7fca48ee5e5 100644 --- a/detox/utils/report.js +++ b/detox/utils/report.js @@ -184,7 +184,7 @@ function removeOldGeneratedReports() { ].forEach((file) => fse.removeSync(`${ARTIFACTS_DIR}/${file}`)); } -async function writeJsonToFile(jsonObject, filename, dir) { +function writeJsonToFile(jsonObject, filename, dir) { fse.writeJson(`${dir}/${filename}`, jsonObject). then(() => console.log('Successfully written:', filename)). catch((err) => console.error(err)); From 489c1d8a173773d347d9210cda7aef48e08a51e7 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 7 Apr 2024 10:01:56 +0530 Subject: [PATCH 160/362] test apk build on mac and linux -1 --- .github/workflows/e2e-detox.yml | 298 ++++++++++++++++++-------------- 1 file changed, 168 insertions(+), 130 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 5bf3ca46e1e..27e15ae81c8 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -137,9 +137,9 @@ jobs: # name: ios-results-${{ matrix.runId }} # path: detox/artifacts/ - build-android-apk: + build-android-apk-on-mac: if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') - runs-on: ubuntu-22.04 + runs-on: macos-14-large steps: - name: ci/checkout-repo uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -158,7 +158,7 @@ jobs: run: | cd detox npm ci - npm run e2e:android-build-release + npm run e2e:android-build # - name: ci/build-android-pr # env: @@ -175,156 +175,194 @@ jobs: name: android-build-apk-${{ github.run_id }} path: "android/app/build/outputs/apk/release/app-release.apk" - e2e-android: + build-android-apk-on-linux: if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') - env: - IOS: false - GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - API_LEVEL: 31 - ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' - ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' - ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' runs-on: ubuntu-22.04 - name: android-detox-e2e-${{ matrix.runId }} - needs: - - generate-specs - - build-android-apk - strategy: - fail-fast: false - matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} steps: - - name: Checkout Repository + - name: ci/checkout-repo uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + ref: ${{ github.event.pull_request.head.sha }} - - name: Install required libraries for emulator - run: sudo apt-get install libpulse0 libpulse-dev + - name: ci/prepare-android-build + uses: ./.github/actions/prepare-android-build + env: + STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps + - name: Detox build + run: | + cd detox + npm ci + npm run e2e:android-build - - name: Set up Android SDK - uses: android-actions/setup-android@v2 + # - name: ci/build-android-pr + # env: + # BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" + # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" + # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" + # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" + # run: bundle exec fastlane android build --env android.pr + # working-directory: ./fastlane + + - name: ci/upload-android-pr-build + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: - android-sdk-tools: 'latest' - android-emulator-image: ${{ env.ANDROID_EMULATOR_IMAGE }} - android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} - android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} + name: android-build-apk-${{ github.run_id }} + path: "android/app/build/outputs/apk/release/app-release.apk" - - name: Free up space on the runner - run: | - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf "/usr/local/share/boost" - sudo rm -rf "$AGENT_TOOLSDIRECTORY" + # e2e-android: + # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + # env: + # IOS: false + # GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" + # API_LEVEL: 31 + # ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' + # ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' + # ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' + # runs-on: ubuntu-22.04 + # name: android-detox-e2e-${{ matrix.runId }} + # needs: + # - generate-specs + # - build-android-apk + # strategy: + # fail-fast: false + # matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} + # steps: + # - name: Checkout Repository + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - name: Enable KVM - run: | - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm + # - name: Install required libraries for emulator + # run: sudo apt-get install libpulse0 libpulse-dev - - name: Gradle cache - uses: gradle/actions/setup-gradle@v3 + # - name: ci/prepare-node-deps + # uses: ./.github/actions/prepare-node-deps - - name: AVD cache - uses: actions/cache@v4 - id: avd-cache - with: - path: | - ~/.android/avd/* - ~/.android/adb* - key: avd-${{ env.API_LEVEL }} + # - name: Set up Android SDK + # uses: android-actions/setup-android@v2 + # with: + # android-sdk-tools: 'latest' + # android-emulator-image: ${{ env.ANDROID_EMULATOR_IMAGE }} + # android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} + # android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} - - name: Download Android APK - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - name: android-build-apk-${{ github.run_id }} - path: android/app/build/outputs/apk/release/ + # - name: Free up space on the runner + # run: | + # sudo rm -rf /usr/share/dotnet + # sudo rm -rf /opt/ghc + # sudo rm -rf "/usr/local/share/boost" + # sudo rm -rf "$AGENT_TOOLSDIRECTORY" - - name: List files in android/app/build/outputs/apk/release/ - run: ls -l android/app/build/outputs/apk/release/ + # - name: Enable KVM + # run: | + # echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + # sudo udevadm control --reload-rules + # sudo udevadm trigger --name-match=kvm - - name: Start React Native Metro Server - run: npm run start & + # - name: Gradle cache + # uses: gradle/actions/setup-gradle@v3 - - name: Install Detox Dependencies - run: cd detox && npm i + # - name: AVD cache + # uses: actions/cache@v4 + # id: avd-cache + # with: + # path: | + # ~/.android/avd/* + # ~/.android/adb* + # key: avd-${{ env.API_LEVEL }} - - name: Detox test - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: 31 - arch: x86_64 - avd-name: pixel_6_pro - script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + # - name: Download Android APK + # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # with: + # name: android-build-apk-${{ github.run_id }} + # path: android/app/build/outputs/apk/release/ - - name: Upload Android Test Report - if: always() - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-results-${{ matrix.runId }} - path: detox/artifacts + # - name: List files in android/app/build/outputs/apk/release/ + # run: ls -l android/app/build/outputs/apk/release/ - download-e2e-results: - runs-on: ubuntu-22.04 - if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) - needs: - - generate-specs - # - e2e-ios - - e2e-android - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + # - name: Start React Native Metro Server + # run: npm run start & - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps + # - name: Install Detox Dependencies + # run: cd detox && npm i - - name: Create artifacts directory - run: mkdir -p detox/artifacts/ + # - name: Detox test + # uses: reactivecircus/android-emulator-runner@v2 + # with: + # api-level: 31 + # arch: x86_64 + # avd-name: pixel_6_pro + # script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - name: Download All Android Artifacts - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - path: detox/artifacts/ - pattern: android-results-* + # - name: Upload Android Test Report + # if: always() + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-results-${{ matrix.runId }} + # path: detox/artifacts - - name: Save report Detox Dependencies - run: | - cd detox - npm ci - npm run e2e:save-report - env: - IOS: false + # download-e2e-results: + # runs-on: ubuntu-22.04 + # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) + # needs: + # - generate-specs + # # - e2e-ios + # - e2e-android + # steps: + # - name: Checkout Repository + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - e2e-remove-label: - if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) - needs: - - download-e2e-results - runs-on: ubuntu-22.04 - steps: - - name: e2e/remove-label-from-pr - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - continue-on-error: true # Label might have been removed manually - with: - script: | - const iosLabel = 'E2E iOS tests for PR'; - const androidLabel = 'E2E Android tests for PR'; - const labels = context.payload.pull_request.labels.map(label => label.name); + # - name: ci/prepare-node-deps + # uses: ./.github/actions/prepare-node-deps + + # - name: Create artifacts directory + # run: mkdir -p detox/artifacts/ + + # - name: Download All Android Artifacts + # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # with: + # path: detox/artifacts/ + # pattern: android-results-* + + # - name: Save report Detox Dependencies + # run: | + # cd detox + # npm ci + # npm run e2e:save-report + # env: + # IOS: false + + # e2e-remove-label: + # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) + # needs: + # - download-e2e-results + # runs-on: ubuntu-22.04 + # steps: + # - name: e2e/remove-label-from-pr + # uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + # continue-on-error: true # Label might have been removed manually + # with: + # script: | + # const iosLabel = 'E2E iOS tests for PR'; + # const androidLabel = 'E2E Android tests for PR'; + # const labels = context.payload.pull_request.labels.map(label => label.name); - if (labels.includes(iosLabel)) { - github.rest.issues.removeLabel({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - name: iosLabel, - }); - } + # if (labels.includes(iosLabel)) { + # github.rest.issues.removeLabel({ + # issue_number: context.issue.number, + # owner: context.repo.owner, + # repo: context.repo.repo, + # name: iosLabel, + # }); + # } - if (labels.includes(androidLabel)) { - github.rest.issues.removeLabel({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - name: androidLabel, - }); - } + # if (labels.includes(androidLabel)) { + # github.rest.issues.removeLabel({ + # issue_number: context.issue.number, + # owner: context.repo.owner, + # repo: context.repo.repo, + # name: androidLabel, + # }); + # } From 478c6d0063d6377305ef2e81bf2b7697baf42823 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 7 Apr 2024 10:15:40 +0530 Subject: [PATCH 161/362] test apk build on mac and linux -2 --- .github/workflows/e2e-detox.yml | 6 ++++++ android/gradle.properties | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 27e15ae81c8..fe1397c200b 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -154,6 +154,12 @@ jobs: STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + - name: Set up JDK + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + - name: Detox build run: | cd detox diff --git a/android/gradle.properties b/android/gradle.properties index 0567ae3118a..51732d1a234 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -10,7 +10,7 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx512m -XX:MaxMetaspaceSize=256m -org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m +org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m --add-opens=java.base/java.util=ALL-UNNAMED -Djava.version=11 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit From bf6e51cd7b00f4955d6814c48ab0444b39ccae6f Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 7 Apr 2024 10:17:55 +0530 Subject: [PATCH 162/362] test apk build on mac and linux -3 --- android/build.gradle | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/android/build.gradle b/android/build.gradle index a7951cca4e9..d627dea7d43 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -64,3 +64,8 @@ subprojects { dependencyLocking { lockAllConfigurations() } + +compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 +} From bb854cf5723f5a147ee7a253e5f5066dabfd22e4 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 7 Apr 2024 13:48:33 +0530 Subject: [PATCH 163/362] test apk build on mac and linux -4 --- android/build.gradle | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index d627dea7d43..5f61201de39 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -65,7 +65,9 @@ dependencyLocking { lockAllConfigurations() } -compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 +android { + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } } From 43d4a44054cdd29b684ba742da86ddda46da7e71 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 7 Apr 2024 13:58:50 +0530 Subject: [PATCH 164/362] test apk build on mac and linux -5 --- android/build.gradle | 7 ------- 1 file changed, 7 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 5f61201de39..a7951cca4e9 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -64,10 +64,3 @@ subprojects { dependencyLocking { lockAllConfigurations() } - -android { - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - } -} From 30ee3b9cec86a6f249c8d933e88afe1e2ce55176 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 7 Apr 2024 14:09:55 +0530 Subject: [PATCH 165/362] test apk build on mac and linux -6 --- .github/workflows/e2e-detox.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index fe1397c200b..5d1032e5097 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -154,11 +154,14 @@ jobs: STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - name: Set up JDK - uses: actions/setup-java@v2 + - name: Install Java JDK + uses: joschi/setup-jdk@v2 with: - java-version: '11' - distribution: 'adopt' + java-version: 'openjdk8' + architecture: 'x64' + env: + # https://github.com/actions/toolkit/issues/641#issuecomment-728963957 + ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' - name: Detox build run: | From a91b397d79f5c1c3da00fe89d0df3a74dd942f6a Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 7 Apr 2024 15:34:36 +0530 Subject: [PATCH 166/362] test apk build on mac and linux -7 --- .github/workflows/e2e-detox.yml | 68 +++++++++++++++++++++++---------- android/gradle.properties | 2 +- 2 files changed, 49 insertions(+), 21 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 5d1032e5097..4d0fb0da875 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - add_e2e_android pull_request: branches: - ios_detox_job @@ -138,7 +139,7 @@ jobs: # path: detox/artifacts/ build-android-apk-on-mac: - if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') runs-on: macos-14-large steps: - name: ci/checkout-repo @@ -154,19 +155,21 @@ jobs: STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - name: Install Java JDK - uses: joschi/setup-jdk@v2 + - name: Install Java + uses: actions/setup-java@v2 with: - java-version: 'openjdk8' - architecture: 'x64' - env: - # https://github.com/actions/toolkit/issues/641#issuecomment-728963957 - ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' + java-version: "11" + distribution: "adopt" + cache: "gradle" + - name: Validate Gradle wrapper + uses: gradle/wrapper-validation-action@v1 + - name: Detox build run: | cd detox - npm ci + npm install + npm install -g detox-cli npm run e2e:android-build # - name: ci/build-android-pr @@ -182,10 +185,10 @@ jobs: uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: android-build-apk-${{ github.run_id }} - path: "android/app/build/outputs/apk/release/app-release.apk" + path: "android/app/build/outputs/apk/**/app-*.apk" build-android-apk-on-linux: - if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') runs-on: ubuntu-22.04 steps: - name: ci/checkout-repo @@ -193,6 +196,17 @@ jobs: with: ref: ${{ github.event.pull_request.head.sha }} + - name: Liberate disk space + uses: jlumbroso/free-disk-space@main + with: + tool-cache: false + android: false + dotnet: true + haskell: true + large-packages: false + docker-images: true + swap-storage: false + - name: ci/prepare-android-build uses: ./.github/actions/prepare-android-build env: @@ -201,10 +215,21 @@ jobs: STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + - name: Install Java + uses: actions/setup-java@v2 + with: + java-version: "11" + distribution: "adopt" + cache: "gradle" + + - name: Validate Gradle wrapper + uses: gradle/wrapper-validation-action@v1 + - name: Detox build run: | cd detox - npm ci + npm install + npm install -g detox-cli npm run e2e:android-build # - name: ci/build-android-pr @@ -220,7 +245,7 @@ jobs: uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: android-build-apk-${{ github.run_id }} - path: "android/app/build/outputs/apk/release/app-release.apk" + path: "android/app/build/outputs/apk/**/app-*.apk" # e2e-android: # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') @@ -257,13 +282,16 @@ jobs: # android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} # android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} - # - name: Free up space on the runner - # run: | - # sudo rm -rf /usr/share/dotnet - # sudo rm -rf /opt/ghc - # sudo rm -rf "/usr/local/share/boost" - # sudo rm -rf "$AGENT_TOOLSDIRECTORY" - + # - name: Liberate disk space + # uses: jlumbroso/free-disk-space@main + # with: + # tool-cache: false + # android: false + # dotnet: true + # haskell: true + # large-packages: false + # docker-images: true + # swap-storage: false # - name: Enable KVM # run: | # echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules diff --git a/android/gradle.properties b/android/gradle.properties index 51732d1a234..c80c5e62f79 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -10,7 +10,7 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx512m -XX:MaxMetaspaceSize=256m -org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m --add-opens=java.base/java.util=ALL-UNNAMED -Djava.version=11 +org.gradle.jvmargs=-Xmx2048m -Xmx4g -XX:MaxMetaspaceSize=512m --add-opens=java.base/java.util=ALL-UNNAMED -Djava.version=11 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit From 4a75b1e962d062bb52ed503ccbc3831746def13a Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 12 Apr 2024 22:34:43 +0530 Subject: [PATCH 167/362] fix file path --- .github/actions/generate-specs/split-tests.js | 4 +++- .github/workflows/e2e-detox.yml | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/actions/generate-specs/split-tests.js b/.github/actions/generate-specs/split-tests.js index cbea3c01615..4e9ac6462b2 100644 --- a/.github/actions/generate-specs/split-tests.js +++ b/.github/actions/generate-specs/split-tests.js @@ -41,7 +41,9 @@ class Specs { if (stats.isDirectory()) { walkSync(filePath); } else if (fileRegex.test(filePath)) { - this.rawFiles.push(path.join(this.searchPath, filePath)); + const relativeFilePath = filePath.replace(dirPath + '/', ''); + const fullPath = path.join(this.directory, this.searchPath, relativeFilePath); + this.rawFiles.push(fullPath); } }); }; diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index f30d1889794..d7eef98f888 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -203,4 +203,3 @@ jobs: name: androidLabel, }); } - \ No newline at end of file From acbc99d2bff9344f682249bf9846f0b1330c0d89 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 14 Apr 2024 14:34:31 +0530 Subject: [PATCH 168/362] test apk build on mac and linux -8 --- .github/workflows/e2e-detox.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 4d0fb0da875..e986763f26a 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -156,9 +156,9 @@ jobs: MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - name: Install Java - uses: actions/setup-java@v2 + uses: actions/setup-java@v4 with: - java-version: "11" + java-version: "17" distribution: "adopt" cache: "gradle" @@ -218,8 +218,8 @@ jobs: - name: Install Java uses: actions/setup-java@v2 with: - java-version: "11" - distribution: "adopt" + java-version: "17" + distribution: "temurin" cache: "gradle" - name: Validate Gradle wrapper From da199dd8ef678bd96884227f6c272aaab11599de Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 14 Apr 2024 15:21:14 +0530 Subject: [PATCH 169/362] run android tests --- .github/workflows/e2e-detox.yml | 273 +++++++++++++------------------- 1 file changed, 108 insertions(+), 165 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index e986763f26a..8642832fa5a 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -138,55 +138,6 @@ jobs: # name: ios-results-${{ matrix.runId }} # path: detox/artifacts/ - build-android-apk-on-mac: - # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') - runs-on: macos-14-large - steps: - - name: ci/checkout-repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - with: - ref: ${{ github.event.pull_request.head.sha }} - - - name: ci/prepare-android-build - uses: ./.github/actions/prepare-android-build - env: - STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" - STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" - STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" - MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - - name: Install Java - uses: actions/setup-java@v4 - with: - java-version: "17" - distribution: "adopt" - cache: "gradle" - - - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v1 - - - name: Detox build - run: | - cd detox - npm install - npm install -g detox-cli - npm run e2e:android-build - - # - name: ci/build-android-pr - # env: - # BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" - # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" - # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" - # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" - # run: bundle exec fastlane android build --env android.pr - # working-directory: ./fastlane - - - name: ci/upload-android-pr-build - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-build-apk-${{ github.run_id }} - path: "android/app/build/outputs/apk/**/app-*.apk" - build-android-apk-on-linux: # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') runs-on: ubuntu-22.04 @@ -232,144 +183,136 @@ jobs: npm install -g detox-cli npm run e2e:android-build - # - name: ci/build-android-pr - # env: - # BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" - # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" - # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" - # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" - # run: bundle exec fastlane android build --env android.pr - # working-directory: ./fastlane - - name: ci/upload-android-pr-build uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: android-build-apk-${{ github.run_id }} path: "android/app/build/outputs/apk/**/app-*.apk" - # e2e-android: - # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') - # env: - # IOS: false - # GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - # API_LEVEL: 31 - # ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' - # ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' - # ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' - # runs-on: ubuntu-22.04 - # name: android-detox-e2e-${{ matrix.runId }} - # needs: - # - generate-specs - # - build-android-apk - # strategy: - # fail-fast: false - # matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} - # steps: - # - name: Checkout Repository - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + e2e-android: + if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + env: + IOS: false + GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" + API_LEVEL: 31 + ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' + ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' + ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' + runs-on: ubuntu-22.04 + name: android-detox-e2e-${{ matrix.runId }} + needs: + - generate-specs + - build-android-apk-on-linux + strategy: + fail-fast: false + matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - # - name: Install required libraries for emulator - # run: sudo apt-get install libpulse0 libpulse-dev + - name: Install required libraries for emulator + run: sudo apt-get install libpulse0 libpulse-dev - # - name: ci/prepare-node-deps - # uses: ./.github/actions/prepare-node-deps + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps - # - name: Set up Android SDK - # uses: android-actions/setup-android@v2 - # with: - # android-sdk-tools: 'latest' - # android-emulator-image: ${{ env.ANDROID_EMULATOR_IMAGE }} - # android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} - # android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} - - # - name: Liberate disk space - # uses: jlumbroso/free-disk-space@main - # with: - # tool-cache: false - # android: false - # dotnet: true - # haskell: true - # large-packages: false - # docker-images: true - # swap-storage: false - # - name: Enable KVM - # run: | - # echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - # sudo udevadm control --reload-rules - # sudo udevadm trigger --name-match=kvm + - name: Set up Android SDK + uses: android-actions/setup-android@v2 + with: + android-sdk-tools: 'latest' + android-emulator-image: ${{ env.ANDROID_EMULATOR_IMAGE }} + android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} + android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} - # - name: Gradle cache - # uses: gradle/actions/setup-gradle@v3 + - name: Liberate disk space + uses: jlumbroso/free-disk-space@main + with: + tool-cache: false + android: false + dotnet: true + haskell: true + large-packages: false + docker-images: true + swap-storage: false - # - name: AVD cache - # uses: actions/cache@v4 - # id: avd-cache - # with: - # path: | - # ~/.android/avd/* - # ~/.android/adb* - # key: avd-${{ env.API_LEVEL }} + - name: Enable KVM + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm - # - name: Download Android APK - # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - # with: - # name: android-build-apk-${{ github.run_id }} - # path: android/app/build/outputs/apk/release/ + - name: Gradle cache + uses: gradle/actions/setup-gradle@v3 - # - name: List files in android/app/build/outputs/apk/release/ - # run: ls -l android/app/build/outputs/apk/release/ + - name: AVD cache + uses: actions/cache@v4 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* + key: avd-${{ env.API_LEVEL }} - # - name: Start React Native Metro Server - # run: npm run start & + - name: Download Android APK + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + name: android-build-apk-${{ github.run_id }} + path: android/app/build/outputs/apk/ - # - name: Install Detox Dependencies - # run: cd detox && npm i + - name: List files in android/app/build/outputs/apk/ + run: ls -l android/app/build/outputs/apk/ - # - name: Detox test - # uses: reactivecircus/android-emulator-runner@v2 - # with: - # api-level: 31 - # arch: x86_64 - # avd-name: pixel_6_pro - # script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + - name: Start React Native Metro Server + run: npm run start & - # - name: Upload Android Test Report - # if: always() - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: android-results-${{ matrix.runId }} - # path: detox/artifacts + - name: Install Detox Dependencies + run: cd detox && npm i - # download-e2e-results: - # runs-on: ubuntu-22.04 - # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) - # needs: - # - generate-specs - # # - e2e-ios - # - e2e-android - # steps: - # - name: Checkout Repository - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Detox test + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: 31 + arch: x86_64 + avd-name: pixel_6_pro + script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - # - name: ci/prepare-node-deps - # uses: ./.github/actions/prepare-node-deps + - name: Upload Android Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-results-${{ matrix.runId }} + path: detox/artifacts - # - name: Create artifacts directory - # run: mkdir -p detox/artifacts/ + download-e2e-results: + runs-on: ubuntu-22.04 + # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) + needs: + - generate-specs + # - e2e-ios + - e2e-android + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - # - name: Download All Android Artifacts - # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - # with: - # path: detox/artifacts/ - # pattern: android-results-* + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps - # - name: Save report Detox Dependencies - # run: | - # cd detox - # npm ci - # npm run e2e:save-report - # env: - # IOS: false + - name: Create artifacts directory + run: mkdir -p detox/artifacts/ + + - name: Download All Android Artifacts + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + path: detox/artifacts/ + pattern: android-results-* + + - name: Save report Detox Dependencies + run: | + cd detox + npm ci + npm run e2e:save-report + env: + IOS: false # e2e-remove-label: # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) From 85ba9a6f890dd71baa42f86944c92664615d6bf9 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 14 Apr 2024 15:48:00 +0530 Subject: [PATCH 170/362] java version 19 --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 8642832fa5a..415b3dd7526 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -169,7 +169,7 @@ jobs: - name: Install Java uses: actions/setup-java@v2 with: - java-version: "17" + java-version: "19" distribution: "temurin" cache: "gradle" From e0fca253913a1843cc6616ade623c8ea1fa474a9 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 14 Apr 2024 15:54:49 +0530 Subject: [PATCH 171/362] reset --- .github/workflows/e2e-detox.yml | 276 +++++++++++++++++++------------- 1 file changed, 165 insertions(+), 111 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 415b3dd7526..218584749b9 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -52,11 +52,9 @@ jobs: DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.os") BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" - echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV echo "DEVICE_NAME=${DEVICE_NAME}" >> $GITHUB_ENV echo "DEVICE_OS_VERSION=${DEVICE_OS_VERSION}" >> $GITHUB_ENV - - name: Generate Test Specs id: generate-specs uses: ./.github/actions/generate-specs @@ -138,6 +136,54 @@ jobs: # name: ios-results-${{ matrix.runId }} # path: detox/artifacts/ + build-android-apk-on-mac: + # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + runs-on: macos-14-large + steps: + - name: ci/checkout-repo + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: ci/prepare-android-build + uses: ./.github/actions/prepare-android-build + env: + STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + + - name: Install Java + uses: actions/setup-java@v4 + with: + java-version: "17" + distribution: "adopt" + cache: "gradle" + + - name: Validate Gradle wrapper + uses: gradle/wrapper-validation-action@v1 + + - name: Detox build + run: | + cd detox + npm install + npm install -g detox-cli + npm run e2e:android-build + # - name: ci/build-android-pr + # env: + # BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" + # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" + # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" + # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" + # run: bundle exec fastlane android build --env android.pr + # working-directory: ./fastlane + + - name: ci/upload-android-pr-build + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-build-apk-${{ github.run_id }} + path: "android/app/build/outputs/apk/**/app-*.apk" + build-android-apk-on-linux: # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') runs-on: ubuntu-22.04 @@ -169,7 +215,7 @@ jobs: - name: Install Java uses: actions/setup-java@v2 with: - java-version: "19" + java-version: "17" distribution: "temurin" cache: "gradle" @@ -182,6 +228,14 @@ jobs: npm install npm install -g detox-cli npm run e2e:android-build + # - name: ci/build-android-pr + # env: + # BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" + # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" + # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" + # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" + # run: bundle exec fastlane android build --env android.pr + # working-directory: ./fastlane - name: ci/upload-android-pr-build uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 @@ -189,130 +243,129 @@ jobs: name: android-build-apk-${{ github.run_id }} path: "android/app/build/outputs/apk/**/app-*.apk" - e2e-android: - if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') - env: - IOS: false - GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - API_LEVEL: 31 - ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' - ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' - ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' - runs-on: ubuntu-22.04 - name: android-detox-e2e-${{ matrix.runId }} - needs: - - generate-specs - - build-android-apk-on-linux - strategy: - fail-fast: false - matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Install required libraries for emulator - run: sudo apt-get install libpulse0 libpulse-dev - - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps + # e2e-android: + # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + # env: + # IOS: false + # GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" + # API_LEVEL: 31 + # ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' + # ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' + # ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' + # runs-on: ubuntu-22.04 + # name: android-detox-e2e-${{ matrix.runId }} + # needs: + # - generate-specs + # - build-android-apk + # strategy: + # fail-fast: false + # matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} + # steps: + # - name: Checkout Repository + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - name: Set up Android SDK - uses: android-actions/setup-android@v2 - with: - android-sdk-tools: 'latest' - android-emulator-image: ${{ env.ANDROID_EMULATOR_IMAGE }} - android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} - android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} + # - name: Install required libraries for emulator + # run: sudo apt-get install libpulse0 libpulse-dev - - name: Liberate disk space - uses: jlumbroso/free-disk-space@main - with: - tool-cache: false - android: false - dotnet: true - haskell: true - large-packages: false - docker-images: true - swap-storage: false + # - name: ci/prepare-node-deps + # uses: ./.github/actions/prepare-node-deps - - name: Enable KVM - run: | - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm + # - name: Set up Android SDK + # uses: android-actions/setup-android@v2 + # with: + # android-sdk-tools: 'latest' + # android-emulator-image: ${{ env.ANDROID_EMULATOR_IMAGE }} + # android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} + # android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} + + # - name: Liberate disk space + # uses: jlumbroso/free-disk-space@main + # with: + # tool-cache: false + # android: false + # dotnet: true + # haskell: true + # large-packages: false + # docker-images: true + # swap-storage: false + # - name: Enable KVM + # run: | + # echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + # sudo udevadm control --reload-rules + # sudo udevadm trigger --name-match=kvm - - name: Gradle cache - uses: gradle/actions/setup-gradle@v3 + # - name: Gradle cache + # uses: gradle/actions/setup-gradle@v3 - - name: AVD cache - uses: actions/cache@v4 - id: avd-cache - with: - path: | - ~/.android/avd/* - ~/.android/adb* - key: avd-${{ env.API_LEVEL }} + # - name: AVD cache + # uses: actions/cache@v4 + # id: avd-cache + # with: + # path: | + # ~/.android/avd/* + # ~/.android/adb* + # key: avd-${{ env.API_LEVEL }} - - name: Download Android APK - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - name: android-build-apk-${{ github.run_id }} - path: android/app/build/outputs/apk/ + # - name: Download Android APK + # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # with: + # name: android-build-apk-${{ github.run_id }} + # path: android/app/build/outputs/apk/release/ - - name: List files in android/app/build/outputs/apk/ - run: ls -l android/app/build/outputs/apk/ + # - name: List files in android/app/build/outputs/apk/release/ + # run: ls -l android/app/build/outputs/apk/release/ - - name: Start React Native Metro Server - run: npm run start & + # - name: Start React Native Metro Server + # run: npm run start & - - name: Install Detox Dependencies - run: cd detox && npm i + # - name: Install Detox Dependencies + # run: cd detox && npm i - - name: Detox test - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: 31 - arch: x86_64 - avd-name: pixel_6_pro - script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + # - name: Detox test + # uses: reactivecircus/android-emulator-runner@v2 + # with: + # api-level: 31 + # arch: x86_64 + # avd-name: pixel_6_pro + # script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - name: Upload Android Test Report - if: always() - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-results-${{ matrix.runId }} - path: detox/artifacts + # - name: Upload Android Test Report + # if: always() + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-results-${{ matrix.runId }} + # path: detox/artifacts - download-e2e-results: - runs-on: ubuntu-22.04 - # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) - needs: - - generate-specs - # - e2e-ios - - e2e-android - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + # download-e2e-results: + # runs-on: ubuntu-22.04 + # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) + # needs: + # - generate-specs + # # - e2e-ios + # - e2e-android + # steps: + # - name: Checkout Repository + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps + # - name: ci/prepare-node-deps + # uses: ./.github/actions/prepare-node-deps - - name: Create artifacts directory - run: mkdir -p detox/artifacts/ + # - name: Create artifacts directory + # run: mkdir -p detox/artifacts/ - - name: Download All Android Artifacts - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - path: detox/artifacts/ - pattern: android-results-* + # - name: Download All Android Artifacts + # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # with: + # path: detox/artifacts/ + # pattern: android-results-* - - name: Save report Detox Dependencies - run: | - cd detox - npm ci - npm run e2e:save-report - env: - IOS: false + # - name: Save report Detox Dependencies + # run: | + # cd detox + # npm ci + # npm run e2e:save-report + # env: + # IOS: false # e2e-remove-label: # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) @@ -346,3 +399,4 @@ jobs: # name: androidLabel, # }); # } + \ No newline at end of file From ea3897f0d6f22cc0a00c985827333e25656f8c8d Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 14 Apr 2024 16:01:30 +0530 Subject: [PATCH 172/362] remove cache --- .github/actions/prepare-mobile-build/action.yaml | 8 -------- .github/actions/prepare-node-deps/action.yaml | 8 -------- 2 files changed, 16 deletions(-) diff --git a/.github/actions/prepare-mobile-build/action.yaml b/.github/actions/prepare-mobile-build/action.yaml index a16c6ca2df9..5fdccce0d00 100644 --- a/.github/actions/prepare-mobile-build/action.yaml +++ b/.github/actions/prepare-mobile-build/action.yaml @@ -15,13 +15,5 @@ runs: echo "::endgroup::" working-directory: ./fastlane - - name: Cache Ruby gems - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 - with: - path: vendor/bundle - key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }} - restore-keys: | - ${{ runner.os }}-gems- - - name: ci/prepare-node-deps uses: ./.github/actions/prepare-node-deps diff --git a/.github/actions/prepare-node-deps/action.yaml b/.github/actions/prepare-node-deps/action.yaml index 7df0bad7797..bb621a052da 100644 --- a/.github/actions/prepare-node-deps/action.yaml +++ b/.github/actions/prepare-node-deps/action.yaml @@ -21,14 +21,6 @@ runs: node node_modules/\@sentry/cli/scripts/install.js echo "::endgroup::" - - name: Cache Node.js modules - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 - with: - path: ~/.npm - key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.OS }}-node- - - name: ci/patch-npm-dependencies shell: bash run: | From d06a53110bf94905921cc5f020370a112beb8b8c Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 14 Apr 2024 18:52:43 +0530 Subject: [PATCH 173/362] run android tests --- .github/workflows/e2e-detox.yml | 303 ++++++++++++++++---------------- 1 file changed, 152 insertions(+), 151 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 218584749b9..7e206c6e0ba 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -184,14 +184,99 @@ jobs: name: android-build-apk-${{ github.run_id }} path: "android/app/build/outputs/apk/**/app-*.apk" - build-android-apk-on-linux: - # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + # build-android-apk-on-linux: + # # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + # runs-on: ubuntu-22.04 + # steps: + # - name: ci/checkout-repo + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + # with: + # ref: ${{ github.event.pull_request.head.sha }} + + # - name: Liberate disk space + # uses: jlumbroso/free-disk-space@main + # with: + # tool-cache: false + # android: false + # dotnet: true + # haskell: true + # large-packages: false + # docker-images: true + # swap-storage: false + + # - name: ci/prepare-android-build + # uses: ./.github/actions/prepare-android-build + # env: + # STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + # STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + # STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + # MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + + # - name: Install Java + # uses: actions/setup-java@v2 + # with: + # java-version: "17" + # distribution: "temurin" + # cache: "gradle" + + # - name: Validate Gradle wrapper + # uses: gradle/wrapper-validation-action@v1 + + # - name: Detox build + # run: | + # cd detox + # npm install + # npm install -g detox-cli + # npm run e2e:android-build + # # - name: ci/build-android-pr + # # env: + # # BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" + # # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" + # # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" + # # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" + # # run: bundle exec fastlane android build --env android.pr + # # working-directory: ./fastlane + + # - name: ci/upload-android-pr-build + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-build-apk-${{ github.run_id }} + # path: "android/app/build/outputs/apk/**/app-*.apk" + + e2e-android: + if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + env: + IOS: false + GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" + API_LEVEL: 31 + ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' + ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' + ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' runs-on: ubuntu-22.04 + name: android-detox-e2e-${{ matrix.runId }} + needs: + - generate-specs + - build-android-apk-on-mac + strategy: + fail-fast: false + matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} steps: - - name: ci/checkout-repo + - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Install required libraries for emulator + run: sudo apt-get install libpulse0 libpulse-dev + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Set up Android SDK + uses: android-actions/setup-android@v2 with: - ref: ${{ github.event.pull_request.head.sha }} + android-sdk-tools: 'latest' + android-emulator-image: ${{ env.ANDROID_EMULATOR_IMAGE }} + android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} + android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} - name: Liberate disk space uses: jlumbroso/free-disk-space@main @@ -204,168 +289,84 @@ jobs: docker-images: true swap-storage: false - - name: ci/prepare-android-build - uses: ./.github/actions/prepare-android-build - env: - STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" - STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" - STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" - MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - - name: Install Java - uses: actions/setup-java@v2 - with: - java-version: "17" - distribution: "temurin" - cache: "gradle" + - name: Enable KVM + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm - - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v1 + - name: Gradle cache + uses: gradle/actions/setup-gradle@v3 - - name: Detox build - run: | - cd detox - npm install - npm install -g detox-cli - npm run e2e:android-build - # - name: ci/build-android-pr - # env: - # BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" - # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" - # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" - # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" - # run: bundle exec fastlane android build --env android.pr - # working-directory: ./fastlane + - name: AVD cache + uses: actions/cache@v4 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* + key: avd-${{ env.API_LEVEL }} - - name: ci/upload-android-pr-build - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + - name: Download Android APK + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: name: android-build-apk-${{ github.run_id }} - path: "android/app/build/outputs/apk/**/app-*.apk" - - # e2e-android: - # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') - # env: - # IOS: false - # GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - # API_LEVEL: 31 - # ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' - # ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' - # ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' - # runs-on: ubuntu-22.04 - # name: android-detox-e2e-${{ matrix.runId }} - # needs: - # - generate-specs - # - build-android-apk - # strategy: - # fail-fast: false - # matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} - # steps: - # - name: Checkout Repository - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + path: android/app/build/outputs/apk/ - # - name: Install required libraries for emulator - # run: sudo apt-get install libpulse0 libpulse-dev + - name: List files in android/app/build/outputs/apk/ + run: ls -l android/app/build/outputs/apk/ - # - name: ci/prepare-node-deps - # uses: ./.github/actions/prepare-node-deps + - name: Start React Native Metro Server + run: npm run start & - # - name: Set up Android SDK - # uses: android-actions/setup-android@v2 - # with: - # android-sdk-tools: 'latest' - # android-emulator-image: ${{ env.ANDROID_EMULATOR_IMAGE }} - # android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} - # android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} - - # - name: Liberate disk space - # uses: jlumbroso/free-disk-space@main - # with: - # tool-cache: false - # android: false - # dotnet: true - # haskell: true - # large-packages: false - # docker-images: true - # swap-storage: false - # - name: Enable KVM - # run: | - # echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - # sudo udevadm control --reload-rules - # sudo udevadm trigger --name-match=kvm + - name: Install Detox Dependencies + run: cd detox && npm i - # - name: Gradle cache - # uses: gradle/actions/setup-gradle@v3 - - # - name: AVD cache - # uses: actions/cache@v4 - # id: avd-cache - # with: - # path: | - # ~/.android/avd/* - # ~/.android/adb* - # key: avd-${{ env.API_LEVEL }} - - # - name: Download Android APK - # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - # with: - # name: android-build-apk-${{ github.run_id }} - # path: android/app/build/outputs/apk/release/ - - # - name: List files in android/app/build/outputs/apk/release/ - # run: ls -l android/app/build/outputs/apk/release/ - - # - name: Start React Native Metro Server - # run: npm run start & - - # - name: Install Detox Dependencies - # run: cd detox && npm i - - # - name: Detox test - # uses: reactivecircus/android-emulator-runner@v2 - # with: - # api-level: 31 - # arch: x86_64 - # avd-name: pixel_6_pro - # script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + - name: Detox test + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: 31 + arch: x86_64 + avd-name: pixel_6_pro + script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - # - name: Upload Android Test Report - # if: always() - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: android-results-${{ matrix.runId }} - # path: detox/artifacts + - name: Upload Android Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-results-${{ matrix.runId }} + path: detox/artifacts - # download-e2e-results: - # runs-on: ubuntu-22.04 - # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) - # needs: - # - generate-specs - # # - e2e-ios - # - e2e-android - # steps: - # - name: Checkout Repository - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + download-e2e-results: + runs-on: ubuntu-22.04 + # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) + needs: + - generate-specs + # - e2e-ios + - e2e-android + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - # - name: ci/prepare-node-deps - # uses: ./.github/actions/prepare-node-deps + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps - # - name: Create artifacts directory - # run: mkdir -p detox/artifacts/ + - name: Create artifacts directory + run: mkdir -p detox/artifacts/ - # - name: Download All Android Artifacts - # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - # with: - # path: detox/artifacts/ - # pattern: android-results-* + - name: Download All Android Artifacts + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + path: detox/artifacts/ + pattern: android-results-* - # - name: Save report Detox Dependencies - # run: | - # cd detox - # npm ci - # npm run e2e:save-report - # env: - # IOS: false + - name: Save report Detox Dependencies + run: | + cd detox + npm ci + npm run e2e:save-report + env: + IOS: false # e2e-remove-label: # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) From 6af0d05226e4d4f51250035cdce4925ee2f5439d Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 14 Apr 2024 18:53:34 +0530 Subject: [PATCH 174/362] run android tests --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 7e206c6e0ba..8268f0057b4 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -38,7 +38,7 @@ env: jobs: generate-specs: runs-on: ubuntu-22.04 - if: (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) + # if: (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) outputs: specs: ${{ steps.generate-specs.outputs.specs }} BUILD_ID: ${{ steps.generate-specs.outputs.BUILD_ID }} From 422c7577a1a765e29354abcf0c4291931acd63e3 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 14 Apr 2024 19:53:29 +0530 Subject: [PATCH 175/362] run android tests --- .github/workflows/e2e-detox.yml | 74 +-------------------------------- 1 file changed, 1 insertion(+), 73 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 8268f0057b4..471849bf599 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -49,12 +49,7 @@ jobs: - name: Set Build ID run: | cd detox - DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") - DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.os") - BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" - echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV - echo "DEVICE_NAME=${DEVICE_NAME}" >> $GITHUB_ENV - echo "DEVICE_OS_VERSION=${DEVICE_OS_VERSION}" >> $GITHUB_ENV + node test_device_info.js ios - name: Generate Test Specs id: generate-specs uses: ./.github/actions/generate-specs @@ -169,14 +164,6 @@ jobs: npm install npm install -g detox-cli npm run e2e:android-build - # - name: ci/build-android-pr - # env: - # BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" - # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" - # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" - # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" - # run: bundle exec fastlane android build --env android.pr - # working-directory: ./fastlane - name: ci/upload-android-pr-build uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 @@ -184,65 +171,6 @@ jobs: name: android-build-apk-${{ github.run_id }} path: "android/app/build/outputs/apk/**/app-*.apk" - # build-android-apk-on-linux: - # # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') - # runs-on: ubuntu-22.04 - # steps: - # - name: ci/checkout-repo - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - # with: - # ref: ${{ github.event.pull_request.head.sha }} - - # - name: Liberate disk space - # uses: jlumbroso/free-disk-space@main - # with: - # tool-cache: false - # android: false - # dotnet: true - # haskell: true - # large-packages: false - # docker-images: true - # swap-storage: false - - # - name: ci/prepare-android-build - # uses: ./.github/actions/prepare-android-build - # env: - # STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" - # STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" - # STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" - # MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - # - name: Install Java - # uses: actions/setup-java@v2 - # with: - # java-version: "17" - # distribution: "temurin" - # cache: "gradle" - - # - name: Validate Gradle wrapper - # uses: gradle/wrapper-validation-action@v1 - - # - name: Detox build - # run: | - # cd detox - # npm install - # npm install -g detox-cli - # npm run e2e:android-build - # # - name: ci/build-android-pr - # # env: - # # BRANCH_TO_BUILD: "${{ github.event.pull_request.head.ref }}" - # # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_PR_AWS_ACCESS_KEY_ID }}" - # # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_PR_AWS_SECRET_ACCESS_KEY }}" - # # MATTERMOST_WEBHOOK_URL: "${{ secrets.MM_MOBILE_PR_MATTERMOST_WEBHOOK_URL }}" - # # run: bundle exec fastlane android build --env android.pr - # # working-directory: ./fastlane - - # - name: ci/upload-android-pr-build - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: android-build-apk-${{ github.run_id }} - # path: "android/app/build/outputs/apk/**/app-*.apk" - e2e-android: if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') env: From 7b6635b2b1fdb9aa2e2a72f41f29ce1cd02ec18d Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 14 Apr 2024 19:58:01 +0530 Subject: [PATCH 176/362] run android tests --- detox/test_device_info.js | 53 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 detox/test_device_info.js diff --git a/detox/test_device_info.js b/detox/test_device_info.js new file mode 100644 index 00000000000..f8a461ac7ec --- /dev/null +++ b/detox/test_device_info.js @@ -0,0 +1,53 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. +/* eslint-disable no-process-env */ +/* eslint-disable no-console */ +/* eslint-disable no-process-exit */ +const fs = require('fs'); + +function getDeviceInfo(platform) { + const detoxConfig = JSON.parse(fs.readFileSync('./.detoxrc.json', 'utf-8')); + + let deviceName = ''; + let deviceOSVersion = ''; + + if (platform === 'ios' && detoxConfig.devices.ios) { + deviceName = detoxConfig.devices.ios.device.type; + deviceOSVersion = detoxConfig.devices.ios.device.os; + } else if (platform === 'android' && detoxConfig.devices.android) { + deviceName = detoxConfig.devices.android.device.avdName; + deviceOSVersion = 'Android'; + } else { + throw new Error(`Unsupported platform: ${platform}`); + } + + return {deviceName, deviceOSVersion}; +} + +function main(platform) { + try { + const {deviceName, deviceOSVersion} = getDeviceInfo(platform); + const buildID = `${process.env.GITHUB_RUN_ID}-${deviceName}-${deviceOSVersion}`.replace(/ /g, '_'); + + // Set environment variables + process.env.BUILD_ID = buildID; + process.env.DEVICE_NAME = deviceName; + process.env.DEVICE_OS_VERSION = deviceOSVersion; + + console.log(`BUILD_ID=${buildID}`); + console.log(`DEVICE_NAME=${deviceName}`); + console.log(`DEVICE_OS_VERSION=${deviceOSVersion}`); + } catch (error) { + console.error(error.message); + process.exit(1); + } +} + +const args = process.argv.slice(2); +if (args.length !== 1 || (args[0] !== 'ios' && args[0] !== 'android')) { + console.error('Usage: node script.js '); + process.exit(1); +} + +const PLATFORM = args[0]; +main(PLATFORM); From 74f21d295e7f12a7c2d8891772aed19b0c0a8a96 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 14 Apr 2024 20:19:28 +0530 Subject: [PATCH 177/362] increase JVM --- .github/workflows/e2e-detox.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 471849bf599..bb1fa9d9123 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -134,6 +134,8 @@ jobs: build-android-apk-on-mac: # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') runs-on: macos-14-large + env: + ORG_GRADLE_PROJECT_jvmargs: -Xmx8g steps: - name: ci/checkout-repo uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -148,6 +150,14 @@ jobs: STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + - name: Cache Gradle dependencies + uses: actions/cache@v2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + - name: Install Java uses: actions/setup-java@v4 with: @@ -156,7 +166,7 @@ jobs: cache: "gradle" - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v1 + uses: gradle/wrapper-validation-action@v3 - name: Detox build run: | From 8b79a4d8030e18dc96be94140f1142fd6fdcf1ff Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 14 Apr 2024 20:41:25 +0530 Subject: [PATCH 178/362] increase JVM --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index bb1fa9d9123..dc9e290730b 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -182,7 +182,7 @@ jobs: path: "android/app/build/outputs/apk/**/app-*.apk" e2e-android: - if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') env: IOS: false GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" From 046c2ece1566eb68acc4361e36ae6b1637ea0494 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 16 Apr 2024 11:13:10 +0530 Subject: [PATCH 179/362] edit generate file --- .github/actions/generate-specs/action.yml | 4 ---- .github/actions/generate-specs/split-tests.js | 15 +++++++-------- .github/workflows/e2e-detox.yml | 3 +-- detox/e2e/support/test_config.ts | 18 +++++++++--------- 4 files changed, 17 insertions(+), 23 deletions(-) diff --git a/.github/actions/generate-specs/action.yml b/.github/actions/generate-specs/action.yml index ad3cdfdeddf..06cf3dcd737 100644 --- a/.github/actions/generate-specs/action.yml +++ b/.github/actions/generate-specs/action.yml @@ -3,9 +3,6 @@ name: "generate-specs" description: This action used to split Detox integration tests based on the parallelism provided inputs: - directory: - description: The directory of the test suite - required: true search_path: description: The path to look for from within the directory required: true @@ -33,7 +30,6 @@ runs: env: PARALLELISM: ${{ inputs.parallelism }} SEARCH_PATH: ${{ inputs.search_path }} - DIRECTORY: ${{ inputs.directory }} DEVICE: ${{ inputs.DEVICE }} OS_VERSION: ${{ inputs.OS_VERSION }} run: | diff --git a/.github/actions/generate-specs/split-tests.js b/.github/actions/generate-specs/split-tests.js index 4e9ac6462b2..fdde9d95ae2 100644 --- a/.github/actions/generate-specs/split-tests.js +++ b/.github/actions/generate-specs/split-tests.js @@ -1,3 +1,6 @@ +const fs = require('fs'); +const path = require('path'); + class DeviceInfo { constructor(device, osVersion) { this.device = device; @@ -15,9 +18,8 @@ class SpecGroup { } class Specs { - constructor(directory, searchPath, parallelism, deviceInfo) { + constructor(searchPath, parallelism, deviceInfo) { this.searchPath = searchPath; - this.directory = directory; this.parallelism = parallelism; this.rawFiles = []; this.groupedFiles = []; @@ -25,9 +27,7 @@ class Specs { } findFiles() { - const fs = require('fs'); - const path = require('path'); - const dirPath = path.join(this.directory, this.searchPath); + const dirPath = path.join(this.searchPath); const fileRegex = /\.e2e\.ts$/; @@ -42,7 +42,7 @@ class Specs { walkSync(filePath); } else if (fileRegex.test(filePath)) { const relativeFilePath = filePath.replace(dirPath + '/', ''); - const fullPath = path.join(this.directory, this.searchPath, relativeFilePath); + const fullPath = path.join(this.searchPath, relativeFilePath); this.rawFiles.push(fullPath); } }); @@ -80,13 +80,12 @@ class Specs { function main() { const searchPath = process.env.SEARCH_PATH; - const directory = process.env.DIRECTORY; const parallelism = parseInt(process.env.PARALLELISM, 10); const device = process.env.DEVICE; const osVersion = process.env.OS_VERSION; const deviceInfo = new DeviceInfo(device, osVersion); - const specs = new Specs(directory, searchPath, parallelism, deviceInfo); + const specs = new Specs(searchPath, parallelism, deviceInfo); specs.findFiles(); specs.generateSplits(); diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index dc9e290730b..fa7401885e9 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -55,8 +55,7 @@ jobs: uses: ./.github/actions/generate-specs with: parallelism: 10 - directory: detox/e2e - search_path: test + search_path: detox/e2e/test device: ${{ env.DEVICE_NAME }} os_version: ${{ env.DEVICE_OS_VERSION }} diff --git a/detox/e2e/support/test_config.ts b/detox/e2e/support/test_config.ts index 124df1b4107..d9e7e87e00e 100644 --- a/detox/e2e/support/test_config.ts +++ b/detox/e2e/support/test_config.ts @@ -1,15 +1,15 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -export const serverOneUrl = process.env.SITE_1_URL || (process.env.IOS === 'true' ? 'https://mobile-e2e.test.mattermost.cloud' : 'http://10.0.2.2:8065'); -export const siteOneUrl = process.env.SITE_1_URL || 'https://mobile-e2e.test.mattermost.cloud'; -export const serverTwoUrl = process.env.SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud'; -export const siteTwoUrl = process.env.SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud'; -export const serverThreeUrl = process.env.SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud'; -export const siteThreeUrl = process.env.SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud'; +export const serverOneUrl = process.env.SITE_1_URL || (process.env.IOS === 'true' ? 'https://mobile-e2e-site-1.test.mattermost.cloud' : 'http://10.0.2.2:8065'); +export const siteOneUrl = process.env.SITE_1_URL || 'https://mobile-e2e-site-1.test.mattermost.cloud'; +export const serverTwoUrl = process.env.MM_MOBILE_E2E_SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud'; +export const siteTwoUrl = process.env.MM_MOBILE_E2E_SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud'; +export const serverThreeUrl = process.env.MM_MOBILE_E2E_SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud'; +export const siteThreeUrl = process.env.MM_MOBILE_E2E_SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud'; export const smtpUrl = process.env.SMTP_URL || 'http://127.0.0.1:9001'; -export const adminEmail = process.env.ADMIN_EMAIL || 'success+sysadmin@simulator.amazonses.com'; -export const adminUsername = process.env.ADMIN_USERNAME || 'admin'; -export const adminPassword = process.env.ADMIN_PASSWORD || 'admin@suz4ziqx9jbnjx4bwmfitfknpa'; +export const adminEmail = process.env.MM_MOBILE_E2E_ADMIN_EMAIL || 'success+sysadmin@simulator.amazonses.com'; +export const adminUsername = process.env.ADMIN_USERNAME || 'sysadmin'; +export const adminPassword = process.env.MM_MOBILE_E2E_ADMIN_PASSWORD || 'Sys@dmin-sample1'; export const ldapServer = process.env.LDAP_SERVER || '127.0.0.1'; export const ldapPort = process.env.LDAP_PORT || 389; From 0658919fa518a74864b6cf5611ecbfd5be8d13c4 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 16 Apr 2024 11:16:12 +0530 Subject: [PATCH 180/362] review comments --- .github/actions/generate-specs/action.yml | 4 ---- .github/actions/generate-specs/split-tests.js | 15 +++++++-------- .github/workflows/e2e-detox.yml | 3 +-- detox/e2e/support/test_config.ts | 18 +++++++++--------- 4 files changed, 17 insertions(+), 23 deletions(-) diff --git a/.github/actions/generate-specs/action.yml b/.github/actions/generate-specs/action.yml index ad3cdfdeddf..06cf3dcd737 100644 --- a/.github/actions/generate-specs/action.yml +++ b/.github/actions/generate-specs/action.yml @@ -3,9 +3,6 @@ name: "generate-specs" description: This action used to split Detox integration tests based on the parallelism provided inputs: - directory: - description: The directory of the test suite - required: true search_path: description: The path to look for from within the directory required: true @@ -33,7 +30,6 @@ runs: env: PARALLELISM: ${{ inputs.parallelism }} SEARCH_PATH: ${{ inputs.search_path }} - DIRECTORY: ${{ inputs.directory }} DEVICE: ${{ inputs.DEVICE }} OS_VERSION: ${{ inputs.OS_VERSION }} run: | diff --git a/.github/actions/generate-specs/split-tests.js b/.github/actions/generate-specs/split-tests.js index 4e9ac6462b2..fdde9d95ae2 100644 --- a/.github/actions/generate-specs/split-tests.js +++ b/.github/actions/generate-specs/split-tests.js @@ -1,3 +1,6 @@ +const fs = require('fs'); +const path = require('path'); + class DeviceInfo { constructor(device, osVersion) { this.device = device; @@ -15,9 +18,8 @@ class SpecGroup { } class Specs { - constructor(directory, searchPath, parallelism, deviceInfo) { + constructor(searchPath, parallelism, deviceInfo) { this.searchPath = searchPath; - this.directory = directory; this.parallelism = parallelism; this.rawFiles = []; this.groupedFiles = []; @@ -25,9 +27,7 @@ class Specs { } findFiles() { - const fs = require('fs'); - const path = require('path'); - const dirPath = path.join(this.directory, this.searchPath); + const dirPath = path.join(this.searchPath); const fileRegex = /\.e2e\.ts$/; @@ -42,7 +42,7 @@ class Specs { walkSync(filePath); } else if (fileRegex.test(filePath)) { const relativeFilePath = filePath.replace(dirPath + '/', ''); - const fullPath = path.join(this.directory, this.searchPath, relativeFilePath); + const fullPath = path.join(this.searchPath, relativeFilePath); this.rawFiles.push(fullPath); } }); @@ -80,13 +80,12 @@ class Specs { function main() { const searchPath = process.env.SEARCH_PATH; - const directory = process.env.DIRECTORY; const parallelism = parseInt(process.env.PARALLELISM, 10); const device = process.env.DEVICE; const osVersion = process.env.OS_VERSION; const deviceInfo = new DeviceInfo(device, osVersion); - const specs = new Specs(directory, searchPath, parallelism, deviceInfo); + const specs = new Specs(searchPath, parallelism, deviceInfo); specs.findFiles(); specs.generateSplits(); diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index d7eef98f888..5ed027ce3e4 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -60,8 +60,7 @@ jobs: uses: ./.github/actions/generate-specs with: parallelism: 10 - directory: detox/e2e - search_path: test + search_path: detox/e2e/test device: ${{ env.DEVICE_NAME }} os_version: ${{ env.DEVICE_OS_VERSION }} diff --git a/detox/e2e/support/test_config.ts b/detox/e2e/support/test_config.ts index 124df1b4107..d9e7e87e00e 100644 --- a/detox/e2e/support/test_config.ts +++ b/detox/e2e/support/test_config.ts @@ -1,15 +1,15 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -export const serverOneUrl = process.env.SITE_1_URL || (process.env.IOS === 'true' ? 'https://mobile-e2e.test.mattermost.cloud' : 'http://10.0.2.2:8065'); -export const siteOneUrl = process.env.SITE_1_URL || 'https://mobile-e2e.test.mattermost.cloud'; -export const serverTwoUrl = process.env.SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud'; -export const siteTwoUrl = process.env.SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud'; -export const serverThreeUrl = process.env.SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud'; -export const siteThreeUrl = process.env.SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud'; +export const serverOneUrl = process.env.SITE_1_URL || (process.env.IOS === 'true' ? 'https://mobile-e2e-site-1.test.mattermost.cloud' : 'http://10.0.2.2:8065'); +export const siteOneUrl = process.env.SITE_1_URL || 'https://mobile-e2e-site-1.test.mattermost.cloud'; +export const serverTwoUrl = process.env.MM_MOBILE_E2E_SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud'; +export const siteTwoUrl = process.env.MM_MOBILE_E2E_SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud'; +export const serverThreeUrl = process.env.MM_MOBILE_E2E_SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud'; +export const siteThreeUrl = process.env.MM_MOBILE_E2E_SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud'; export const smtpUrl = process.env.SMTP_URL || 'http://127.0.0.1:9001'; -export const adminEmail = process.env.ADMIN_EMAIL || 'success+sysadmin@simulator.amazonses.com'; -export const adminUsername = process.env.ADMIN_USERNAME || 'admin'; -export const adminPassword = process.env.ADMIN_PASSWORD || 'admin@suz4ziqx9jbnjx4bwmfitfknpa'; +export const adminEmail = process.env.MM_MOBILE_E2E_ADMIN_EMAIL || 'success+sysadmin@simulator.amazonses.com'; +export const adminUsername = process.env.ADMIN_USERNAME || 'sysadmin'; +export const adminPassword = process.env.MM_MOBILE_E2E_ADMIN_PASSWORD || 'Sys@dmin-sample1'; export const ldapServer = process.env.LDAP_SERVER || '127.0.0.1'; export const ldapPort = process.env.LDAP_PORT || 389; From e8d381117d14e11cba8c924c83fb992474c6bf32 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 16 Apr 2024 14:02:25 +0530 Subject: [PATCH 181/362] add secrets --- .github/workflows/e2e-detox.yml | 6 +++++- detox/e2e/support/test_config.ts | 12 ++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 5ed027ce3e4..d0c53f75438 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -16,15 +16,19 @@ concurrency: cancel-in-progress: true env: + AWS_REGION: 'us-east-1' + ADMIN_USERNAME: ${{ secrets.MM_MOBILE_E2E_ADMIN_EMAIL }} + ADMIN_PASSWORD: ${{ secrets.MM_MOBILE_E2E_ADMIN_PASSWORD }} BRANCH: ${{ github.head_ref || github.ref_name }} COMMIT_HASH: ${{ github.sha }} - AWS_REGION: 'us-east-1' DETOX_AWS_S3_BUCKET: 'mattermost-detox-report' DETOX_AWS_ACCESS_KEY_ID: ${{ secrets.MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID }} DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }} HEADLESS: 'false' TYPE: 'PR' PULL_REQUEST: 'https://github.com/mattermost/mattermost-mobile/pull/${{ github.event.number }}' + SITE_2_URL: ${{ secrets.MM_MOBILE_E2E_SITE_2_URL }} + SITE_3_URL: ${{ secrets.MM_MOBILE_E2E_SITE_3_URL }} ZEPHYR_ENABLE: false JIRA_PROJECT_KEY: 'MM' ZEPHYR_API_KEY: ${{ secrets.MM_MOBILE_E2E_ZEPHYR_API_KEY }} diff --git a/detox/e2e/support/test_config.ts b/detox/e2e/support/test_config.ts index d9e7e87e00e..ab89564d37e 100644 --- a/detox/e2e/support/test_config.ts +++ b/detox/e2e/support/test_config.ts @@ -3,13 +3,13 @@ export const serverOneUrl = process.env.SITE_1_URL || (process.env.IOS === 'true' ? 'https://mobile-e2e-site-1.test.mattermost.cloud' : 'http://10.0.2.2:8065'); export const siteOneUrl = process.env.SITE_1_URL || 'https://mobile-e2e-site-1.test.mattermost.cloud'; -export const serverTwoUrl = process.env.MM_MOBILE_E2E_SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud'; -export const siteTwoUrl = process.env.MM_MOBILE_E2E_SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud'; -export const serverThreeUrl = process.env.MM_MOBILE_E2E_SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud'; -export const siteThreeUrl = process.env.MM_MOBILE_E2E_SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud'; +export const serverTwoUrl = process.env.SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud'; +export const siteTwoUrl = process.env.SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud'; +export const serverThreeUrl = process.env.SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud'; +export const siteThreeUrl = process.env.SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud'; export const smtpUrl = process.env.SMTP_URL || 'http://127.0.0.1:9001'; -export const adminEmail = process.env.MM_MOBILE_E2E_ADMIN_EMAIL || 'success+sysadmin@simulator.amazonses.com'; +export const adminEmail = process.env.ADMIN_EMAIL || 'success+sysadmin@simulator.amazonses.com'; export const adminUsername = process.env.ADMIN_USERNAME || 'sysadmin'; -export const adminPassword = process.env.MM_MOBILE_E2E_ADMIN_PASSWORD || 'Sys@dmin-sample1'; +export const adminPassword = process.env.ADMIN_PASSWORD || 'Sys@dmin-sample1'; export const ldapServer = process.env.LDAP_SERVER || '127.0.0.1'; export const ldapPort = process.env.LDAP_PORT || 389; From 4147996919baef279fb00be247d8d8b2a87de318 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 16 Apr 2024 16:25:18 +0530 Subject: [PATCH 182/362] try creating avd --- .github/workflows/e2e-detox.yml | 161 +++++++++++++++++++++++++------- 1 file changed, 128 insertions(+), 33 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 1d5f4026cf9..5efea068aea 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -184,15 +184,105 @@ jobs: name: android-build-apk-${{ github.run_id }} path: "android/app/build/outputs/apk/**/app-*.apk" - e2e-android: + # e2e-android: + # # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + # env: + # IOS: false + # GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" + # API_LEVEL: 31 + # ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' + # ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' + # ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' + # runs-on: ubuntu-22.04 + # name: android-detox-e2e-${{ matrix.runId }} + # needs: + # - generate-specs + # - build-android-apk-on-mac + # strategy: + # fail-fast: false + # matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} + # steps: + # - name: Checkout Repository + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + # - name: Install required libraries for emulator + # run: sudo apt-get install libpulse0 libpulse-dev + + # - name: ci/prepare-node-deps + # uses: ./.github/actions/prepare-node-deps + + # - name: Set up Android SDK + # uses: android-actions/setup-android@v2 + # with: + # android-sdk-tools: 'latest' + # android-emulator-image: ${{ env.ANDROID_EMULATOR_IMAGE }} + # android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} + # android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} + + # - name: Liberate disk space + # uses: jlumbroso/free-disk-space@main + # with: + # tool-cache: false + # android: false + # dotnet: true + # haskell: true + # large-packages: false + # docker-images: true + # swap-storage: false + + # - name: Enable KVM + # run: | + # echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + # sudo udevadm control --reload-rules + # sudo udevadm trigger --name-match=kvm + + # - name: Gradle cache + # uses: gradle/actions/setup-gradle@v3 + + # - name: AVD cache + # uses: actions/cache@v4 + # id: avd-cache + # with: + # path: | + # ~/.android/avd/* + # ~/.android/adb* + # key: avd-${{ env.API_LEVEL }} + + # - name: Download Android APK + # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # with: + # name: android-build-apk-${{ github.run_id }} + # path: android/app/build/outputs/apk/ + + # - name: List files in android/app/build/outputs/apk/ + # run: ls -l android/app/build/outputs/apk/ + + # - name: Start React Native Metro Server + # run: npm run start & + + # - name: Install Detox Dependencies + # run: cd detox && npm i + + # - name: Detox test + # uses: reactivecircus/android-emulator-runner@v2 + # with: + # api-level: 31 + # arch: x86_64 + # avd-name: pixel_6_pro + # script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + + # - name: Upload Android Test Report + # if: always() + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-results-${{ matrix.runId }} + # path: detox/artifacts + + e2e-android-Pixel: # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') env: IOS: false GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - API_LEVEL: 31 - ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' - ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' - ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' runs-on: ubuntu-22.04 name: android-detox-e2e-${{ matrix.runId }} needs: @@ -211,14 +301,6 @@ jobs: - name: ci/prepare-node-deps uses: ./.github/actions/prepare-node-deps - - name: Set up Android SDK - uses: android-actions/setup-android@v2 - with: - android-sdk-tools: 'latest' - android-emulator-image: ${{ env.ANDROID_EMULATOR_IMAGE }} - android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} - android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} - - name: Liberate disk space uses: jlumbroso/free-disk-space@main with: @@ -230,23 +312,39 @@ jobs: docker-images: true swap-storage: false - - name: Enable KVM + - name: Download Android Emulator Image run: | - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm - - - name: Gradle cache - uses: gradle/actions/setup-gradle@v3 - - - name: AVD cache - uses: actions/cache@v4 - id: avd-cache - with: - path: | - ~/.android/avd/* - ~/.android/adb* - key: avd-${{ env.API_LEVEL }} + echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install $PACKAGE + echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd --force --name Pixel_6_Pro_API_33 --device "pixel_6_pro" --package $PACKAGE --sdcard 256M + # adb start-server + $ANDROID_HOME/emulator/emulator -list-avds + $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager list device + $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager list avd + env: + PACKAGE: 'system-images;android-29;default;x86_64' + + - name: Change Android Emulator settings + run: | + echo fs.inotify.max_user_watches=524288 | tee -a /etc/sysctl.conf && sysctl -p + mkdir -p /root/.android && touch /root/.android/repositories.cfg + echo "vm.heapSize=576" >> $AVD_PATH/config.ini + echo "hw.ramSize=2048" >> $AVD_PATH/config.ini + echo "disk.dataPartition.size=2048m" >> $AVD_PATH/config.ini + grep "size" $AVD_PATH/config.ini + env: + AVD_NAME: Pixel_6_Pro_API_33 + AVD_PATH: /root/.android/avd/Pixel_6_Pro_API_33.avd + + - name: Android Emulator + timeout-minutes: 10 + continue-on-error: true + run: | + echo "Starting emulator" + nohup $ANDROID_HOME/emulator/emulator -verbose -no-audio -no-snapshot -no-window -gpu swiftshader_indirect @Pixel_5 & + # nohup $ANDROID_HOME/emulator/emulator -verbose -no-audio -no-snapshot -no-window -partition-size 2048 @Pixel_5 & + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' + $ANDROID_HOME/platform-tools/adb devices + echo "Emulator started" - name: Download Android APK uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 @@ -254,9 +352,6 @@ jobs: name: android-build-apk-${{ github.run_id }} path: android/app/build/outputs/apk/ - - name: List files in android/app/build/outputs/apk/ - run: ls -l android/app/build/outputs/apk/ - - name: Start React Native Metro Server run: npm run start & @@ -284,7 +379,7 @@ jobs: needs: - generate-specs # - e2e-ios - - e2e-android + - e2e-android-Pixel steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 From b1f51469f5ff42730303a96e36d8c3130f5c0707 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 16 Apr 2024 16:45:09 +0530 Subject: [PATCH 183/362] fix report --- .github/workflows/e2e-detox.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index d0c53f75438..47b78068537 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -44,6 +44,8 @@ jobs: outputs: specs: ${{ steps.generate-specs.outputs.specs }} BUILD_ID: ${{ steps.generate-specs.outputs.BUILD_ID }} + DEVICE_NAME: ${{ steps.generate-specs.outputs.DEVICE_NAME }} + DEVICE_OS_VERSION: ${{ steps.generate-specs.outputs.DEVICE_OS_VERSION }} steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 From ea540d0f84d70bd0bbf4db1f4dbb33cf7b7232d1 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 16 Apr 2024 16:50:23 +0530 Subject: [PATCH 184/362] try creating avd --- .github/workflows/e2e-detox.yml | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 5efea068aea..bf7a3962c8e 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -312,29 +312,15 @@ jobs: docker-images: true swap-storage: false - - name: Download Android Emulator Image - run: | - echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install $PACKAGE - echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd --force --name Pixel_6_Pro_API_33 --device "pixel_6_pro" --package $PACKAGE --sdcard 256M - # adb start-server - $ANDROID_HOME/emulator/emulator -list-avds - $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager list device - $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager list avd - env: - PACKAGE: 'system-images;android-29;default;x86_64' - - name: Change Android Emulator settings run: | - echo fs.inotify.max_user_watches=524288 | tee -a /etc/sysctl.conf && sysctl -p - mkdir -p /root/.android && touch /root/.android/repositories.cfg - echo "vm.heapSize=576" >> $AVD_PATH/config.ini - echo "hw.ramSize=2048" >> $AVD_PATH/config.ini - echo "disk.dataPartition.size=2048m" >> $AVD_PATH/config.ini - grep "size" $AVD_PATH/config.ini + echo "vm.heapSize=576" >> $HOME/.android/avd/$AVD_NAME.avd/config.ini + echo "hw.ramSize=2048" >> $HOME/.android/avd/$AVD_NAME.avd/config.ini + echo "disk.dataPartition.size=2048m" >> $HOME/.android/avd/$AVD_NAME.avd/config.ini + grep "size" $HOME/.android/avd/$AVD_NAME.avd/config.ini env: AVD_NAME: Pixel_6_Pro_API_33 - AVD_PATH: /root/.android/avd/Pixel_6_Pro_API_33.avd - + - name: Android Emulator timeout-minutes: 10 continue-on-error: true From 3c9cf513792285a7bcb81f6ab111f44515b2291a Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 23 Apr 2024 21:37:13 +0530 Subject: [PATCH 185/362] fix e2e test report --- .github/workflows/e2e-detox.yml | 1 + detox/e2e/support/test_config.ts | 12 ++++++------ detox/e2e/support/ui/screen/channel_info.ts | 4 ++++ detox/e2e/support/ui/screen/create_direct_message.ts | 4 ++-- detox/package-lock.json | 7 +++++++ detox/package.json | 1 + 6 files changed, 21 insertions(+), 8 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 47b78068537..ee501eb6d04 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -27,6 +27,7 @@ env: HEADLESS: 'false' TYPE: 'PR' PULL_REQUEST: 'https://github.com/mattermost/mattermost-mobile/pull/${{ github.event.number }}' + SITE_1_URL: ${{ secrets.MM_MOBILE_E2E_SITE_1_URL }} SITE_2_URL: ${{ secrets.MM_MOBILE_E2E_SITE_2_URL }} SITE_3_URL: ${{ secrets.MM_MOBILE_E2E_SITE_3_URL }} ZEPHYR_ENABLE: false diff --git a/detox/e2e/support/test_config.ts b/detox/e2e/support/test_config.ts index ab89564d37e..02fbf7e62e4 100644 --- a/detox/e2e/support/test_config.ts +++ b/detox/e2e/support/test_config.ts @@ -1,12 +1,12 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -export const serverOneUrl = process.env.SITE_1_URL || (process.env.IOS === 'true' ? 'https://mobile-e2e-site-1.test.mattermost.cloud' : 'http://10.0.2.2:8065'); -export const siteOneUrl = process.env.SITE_1_URL || 'https://mobile-e2e-site-1.test.mattermost.cloud'; -export const serverTwoUrl = process.env.SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud'; -export const siteTwoUrl = process.env.SITE_2_URL || 'https://mobile-e2e-site-2.test.mattermost.cloud'; -export const serverThreeUrl = process.env.SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud'; -export const siteThreeUrl = process.env.SITE_3_URL || 'https://mobile-e2e-site-3.test.mattermost.cloud'; +export const serverOneUrl = process.env.SITE_1_URL || (process.env.IOS === 'true' ? 'http://localhost:8065' : 'http://10.0.2.2:8065'); +export const siteOneUrl = process.env.SITE_1_URL || 'http://localhost:8065'; +export const serverTwoUrl = process.env.SITE_2_URL || 'http://localhost:8065'; +export const siteTwoUrl = process.env.SITE_2_URL || 'http://localhost:8065'; +export const serverThreeUrl = process.env.SITE_3_URL || 'http://localhost:8065'; +export const siteThreeUrl = process.env.SITE_3_URL || 'http://localhost:8065'; export const smtpUrl = process.env.SMTP_URL || 'http://127.0.0.1:9001'; export const adminEmail = process.env.ADMIN_EMAIL || 'success+sysadmin@simulator.amazonses.com'; export const adminUsername = process.env.ADMIN_USERNAME || 'sysadmin'; diff --git a/detox/e2e/support/ui/screen/channel_info.ts b/detox/e2e/support/ui/screen/channel_info.ts index a4ca3adf67f..a11abcde689 100644 --- a/detox/e2e/support/ui/screen/channel_info.ts +++ b/detox/e2e/support/ui/screen/channel_info.ts @@ -139,6 +139,8 @@ class ChannelInfoScreen { }; convertToPrivateChannel = async (channelDisplayName: string, {confirm = true} = {}) => { + await this.scrollView.tap({x: 1, y: 1}); + await this.scrollView.scroll(100, 'down'); await waitFor(this.convertPrivateOption).toExist().withTimeout(timeouts.TWO_SEC); await this.convertPrivateOption.tap({x: 1, y: 1}); const { @@ -165,6 +167,8 @@ class ChannelInfoScreen { }; leaveChannel = async ({confirm = true} = {}) => { + await this.scrollView.tap({x: 1, y: 1}); + await this.scrollView.scroll(200, 'down'); await waitFor(this.leaveChannelOption).toExist().withTimeout(timeouts.TWO_SEC); if (isAndroid()) { await this.scrollView.scrollTo('bottom'); diff --git a/detox/e2e/support/ui/screen/create_direct_message.ts b/detox/e2e/support/ui/screen/create_direct_message.ts index 13e813aa23d..56c68a61375 100644 --- a/detox/e2e/support/ui/screen/create_direct_message.ts +++ b/detox/e2e/support/ui/screen/create_direct_message.ts @@ -46,7 +46,7 @@ class CreateDirectMessageScreen { }; getUserItem = (userId: string) => { - return element(by.id(`${this.testID.userItemPrefix}${userId}`)); + return element(by.id(`${this.testID.userItemPrefix}${userId}.${userId}`)); }; getUserItemProfilePicture = (userId: string) => { @@ -54,7 +54,7 @@ class CreateDirectMessageScreen { }; getUserItemDisplayName = (userId: string) => { - return element(by.id(`${this.testID.userItemPrefix}${userId}.display_name`)); + return element(by.id(`${this.testID.userItemPrefix}${userId}.${userId}.display_name`)); }; toBeVisible = async () => { diff --git a/detox/package-lock.json b/detox/package-lock.json index 803132516c7..fde0ab177b7 100644 --- a/detox/package-lock.json +++ b/detox/package-lock.json @@ -16,6 +16,7 @@ "@types/jest": "29.5.5", "@types/tough-cookie": "4.0.3", "@types/uuid": "9.0.4", + "async": "^3.2.5", "axios": "1.5.0", "axios-cookiejar-support": "4.0.7", "babel-jest": "29.7.0", @@ -4434,6 +4435,12 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", diff --git a/detox/package.json b/detox/package.json index b2daf8a3e51..1f58fb4f38c 100644 --- a/detox/package.json +++ b/detox/package.json @@ -14,6 +14,7 @@ "@types/jest": "29.5.5", "@types/tough-cookie": "4.0.3", "@types/uuid": "9.0.4", + "async": "^3.2.5", "axios": "1.5.0", "axios-cookiejar-support": "4.0.7", "babel-jest": "29.7.0", From a9896c5d82c041d169e7e5a26b2fd2c8c91dd6ac Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 30 Apr 2024 14:18:19 +0530 Subject: [PATCH 186/362] review comments --- .github/actions/prepare-node-deps/action.yaml | 4 +- .github/workflows/e2e-detox.yml | 5 +- detox/e2e/support/test_config.ts | 2 +- detox/e2e/test/autocomplete/edit_post.e2e.ts | 2 +- detox/package-lock.json | 199 ++++++++---------- detox/package.json | 2 +- 6 files changed, 101 insertions(+), 113 deletions(-) diff --git a/.github/actions/prepare-node-deps/action.yaml b/.github/actions/prepare-node-deps/action.yaml index 7df0bad7797..655fa308f37 100644 --- a/.github/actions/prepare-node-deps/action.yaml +++ b/.github/actions/prepare-node-deps/action.yaml @@ -25,9 +25,9 @@ runs: uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: ~/.npm - key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }} + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | - ${{ runner.OS }}-node- + ${{ runner.os }}-node- - name: ci/patch-npm-dependencies shell: bash diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index ee501eb6d04..6c5fac734eb 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -17,14 +17,15 @@ concurrency: env: AWS_REGION: 'us-east-1' - ADMIN_USERNAME: ${{ secrets.MM_MOBILE_E2E_ADMIN_EMAIL }} + ADMIN_EMAIL: ${{ secrets.MM_MOBILE_E2E_ADMIN_EMAIL }} + ADMIN_USERNAME: ${{ secrets.MM_MOBILE_E2E_ADMIN_USERNAME }} ADMIN_PASSWORD: ${{ secrets.MM_MOBILE_E2E_ADMIN_PASSWORD }} BRANCH: ${{ github.head_ref || github.ref_name }} COMMIT_HASH: ${{ github.sha }} DETOX_AWS_S3_BUCKET: 'mattermost-detox-report' DETOX_AWS_ACCESS_KEY_ID: ${{ secrets.MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID }} DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }} - HEADLESS: 'false' + HEADLESS: 'true' TYPE: 'PR' PULL_REQUEST: 'https://github.com/mattermost/mattermost-mobile/pull/${{ github.event.number }}' SITE_1_URL: ${{ secrets.MM_MOBILE_E2E_SITE_1_URL }} diff --git a/detox/e2e/support/test_config.ts b/detox/e2e/support/test_config.ts index 02fbf7e62e4..aee64cbf02a 100644 --- a/detox/e2e/support/test_config.ts +++ b/detox/e2e/support/test_config.ts @@ -8,7 +8,7 @@ export const siteTwoUrl = process.env.SITE_2_URL || 'http://localhost:8065'; export const serverThreeUrl = process.env.SITE_3_URL || 'http://localhost:8065'; export const siteThreeUrl = process.env.SITE_3_URL || 'http://localhost:8065'; export const smtpUrl = process.env.SMTP_URL || 'http://127.0.0.1:9001'; -export const adminEmail = process.env.ADMIN_EMAIL || 'success+sysadmin@simulator.amazonses.com'; +export const adminEmail = process.env.ADMIN_EMAIL || 'sysadmin@sample.mattermost.com'; export const adminUsername = process.env.ADMIN_USERNAME || 'sysadmin'; export const adminPassword = process.env.ADMIN_PASSWORD || 'Sys@dmin-sample1'; export const ldapServer = process.env.LDAP_SERVER || '127.0.0.1'; diff --git a/detox/e2e/test/autocomplete/edit_post.e2e.ts b/detox/e2e/test/autocomplete/edit_post.e2e.ts index bc9dc968d1c..fa81bd8f306 100644 --- a/detox/e2e/test/autocomplete/edit_post.e2e.ts +++ b/detox/e2e/test/autocomplete/edit_post.e2e.ts @@ -89,7 +89,7 @@ describe('Autocomplete - Edit Post', () => { await expect(Autocomplete.flatEmojiSuggestionList).not.toBeVisible(); // # Type in ":" followed by 2 characters to activate emoji suggestion autocomplete - await EditPostScreen.messageInput.typeText(':smil'); + await EditPostScreen.messageInput.typeText(':sm'); // * Verify emoji suggestion list is displayed await expect(Autocomplete.flatEmojiSuggestionList).toBeVisible(); diff --git a/detox/package-lock.json b/detox/package-lock.json index fde0ab177b7..b04bc04afc5 100644 --- a/detox/package-lock.json +++ b/detox/package-lock.json @@ -16,7 +16,7 @@ "@types/jest": "29.5.5", "@types/tough-cookie": "4.0.3", "@types/uuid": "9.0.4", - "async": "^3.2.5", + "async": "3.2.5", "axios": "1.5.0", "axios-cookiejar-support": "4.0.7", "babel-jest": "29.7.0", @@ -896,27 +896,27 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", - "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", - "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.1", + "@babel/generator": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.1", - "@babel/parser": "^7.24.1", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", "@babel/template": "^7.24.0", "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0", @@ -935,9 +935,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", - "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", "dev": true, "dependencies": { "@babel/types": "^7.24.0", @@ -990,9 +990,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", - "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", + "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -1030,9 +1030,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -1255,9 +1255,9 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", - "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", "dev": true, "dependencies": { "@babel/template": "^7.24.0", @@ -1284,9 +1284,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1699,9 +1699,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", - "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", + "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.0" @@ -1730,12 +1730,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz", - "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", + "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-create-class-features-plugin": "^7.24.4", "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -2539,9 +2539,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2606,9 +2606,9 @@ "dev": true }, "node_modules/@flatten-js/interval-tree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@flatten-js/interval-tree/-/interval-tree-1.1.2.tgz", - "integrity": "sha512-OwLoV9E/XM6b7bes2rSFnGNjyRy7vcoIHFTnmBR2WAaZTf0Fe4EX4GdA65vU1KgFAasti7iRSg2dZfYd1Zt00Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@flatten-js/interval-tree/-/interval-tree-1.1.3.tgz", + "integrity": "sha512-xhFWUBoHJFF77cJO1D6REjdgJEMRf2Y2Z+eKEPav8evGKcLSnj1ud5pLXQSbGuxF3VSvT1rWhMfVpXEKJLTL+A==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -3766,9 +3766,9 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.5.0.tgz", - "integrity": "sha512-OBhI9ZEAG8Xen0xsFJwwNOt44WE2CWkfYIxTognC8x42Lfsdf0VN/wCMqpdkySMDio/vts10BiovAxQp0T0faA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.5.1.tgz", + "integrity": "sha512-1/8kFp6Fl4OsSIVTWHnNjLnTL8IqpIb/D3sTSczrKFnrE9VMNWxnrRKNvpUHOJ6zpGD5f62TPm7+17ilTJpiCQ==", "dev": true, "dependencies": { "@smithy/middleware-serde": "^2.3.0", @@ -3784,34 +3784,25 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.2.0.tgz", - "integrity": "sha512-PsjDOLpbevgn37yJbawmfVoanru40qVA8UEf2+YA1lvOefmhuhL6ZbKtGsLAWDRnE1OlAmedsbA/htH6iSZjNA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.3.1.tgz", + "integrity": "sha512-P2bGufFpFdYcWvqpyqqmalRtwFUNUA8vHjJR5iGqbfR6mp65qKOLcUd6lTr4S9Gn/enynSrSf3p3FVgVAf6bXA==", "dev": true, "dependencies": { "@smithy/node-config-provider": "^2.3.0", "@smithy/protocol-http": "^3.3.0", "@smithy/service-error-classification": "^2.1.5", - "@smithy/smithy-client": "^2.5.0", + "@smithy/smithy-client": "^2.5.1", "@smithy/types": "^2.12.0", "@smithy/util-middleware": "^2.2.0", "@smithy/util-retry": "^2.2.0", "tslib": "^2.6.2", - "uuid": "^8.3.2" + "uuid": "^9.0.1" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@smithy/middleware-retry/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@smithy/middleware-serde": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.3.0.tgz", @@ -3948,12 +3939,11 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.2.0.tgz", - "integrity": "sha512-+B5TNzj/fRZzVW3z8UUJOkNx15+4E0CLuvJmJUA1JUIZFp3rdJ/M2H5r2SqltaVPXL0oIxv/6YK92T9TsFGbFg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.3.0.tgz", + "integrity": "sha512-ui/NlpILU+6HAQBfJX8BBsDXuKSNrjTSuOYArRblcrErwKFutjrCNb/OExfVRyj9+26F9J+ZmfWT+fKWuDrH3Q==", "dev": true, "dependencies": { - "@smithy/eventstream-codec": "^2.2.0", "@smithy/is-array-buffer": "^2.2.0", "@smithy/types": "^2.12.0", "@smithy/util-hex-encoding": "^2.2.0", @@ -3967,12 +3957,12 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.5.0.tgz", - "integrity": "sha512-DDXWHWdimtS3y/Kw1Jo46KQ0ZYsDKcldFynQERUGBPDpkW1lXOTHy491ALHjwfiBQvzsVKVxl5+ocXNIgJuX4g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.5.1.tgz", + "integrity": "sha512-jrbSQrYCho0yDaaf92qWgd+7nAeap5LtHTI51KXqmpIFCceKU3K9+vIVTUH72bOJngBMqa4kyu1VJhRcSrk/CQ==", "dev": true, "dependencies": { - "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-endpoint": "^2.5.1", "@smithy/middleware-stack": "^2.2.0", "@smithy/protocol-http": "^3.3.0", "@smithy/types": "^2.12.0", @@ -4067,13 +4057,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.2.0.tgz", - "integrity": "sha512-2okTdZaCBvOJszAPU/KSvlimMe35zLOKbQpHhamFJmR7t95HSe0K3C92jQPjKY3PmDBD+7iMkOnuW05F5OlF4g==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.2.1.tgz", + "integrity": "sha512-RtKW+8j8skk17SYowucwRUjeh4mCtnm5odCL0Lm2NtHQBsYKrNW0od9Rhopu9wF1gHMfHeWF7i90NwBz/U22Kw==", "dev": true, "dependencies": { "@smithy/property-provider": "^2.2.0", - "@smithy/smithy-client": "^2.5.0", + "@smithy/smithy-client": "^2.5.1", "@smithy/types": "^2.12.0", "bowser": "^2.11.0", "tslib": "^2.6.2" @@ -4083,16 +4073,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.3.0.tgz", - "integrity": "sha512-hfKXnNLmsW9cmLb/JXKIvtuO6Cf4SuqN5PN1C2Ru/TBIws+m1wSgb+A53vo0r66xzB6E82inKG2J7qtwdi+Kkw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.3.1.tgz", + "integrity": "sha512-vkMXHQ0BcLFysBMWgSBLSk3+leMpFSyyFj8zQtv5ZyUBx8/owVh1/pPEkzmW/DR/Gy/5c8vjLDD9gZjXNKbrpA==", "dev": true, "dependencies": { "@smithy/config-resolver": "^2.2.0", "@smithy/credential-provider-imds": "^2.3.0", "@smithy/node-config-provider": "^2.3.0", "@smithy/property-provider": "^2.2.0", - "@smithy/smithy-client": "^2.5.0", + "@smithy/smithy-client": "^2.5.1", "@smithy/types": "^2.12.0", "tslib": "^2.6.2" }, @@ -4296,9 +4286,9 @@ } }, "node_modules/@types/node": { - "version": "20.11.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", - "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -4344,9 +4334,9 @@ "dev": true }, "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, "dependencies": { "debug": "^4.3.4" @@ -4616,13 +4606,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -4879,9 +4869,9 @@ "dev": true }, "node_modules/bunyamin": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/bunyamin/-/bunyamin-1.5.2.tgz", - "integrity": "sha512-Xp2nfqk33zt3nX90OSTkLVOc5N+1zdR3MWvfLHoIrm3cGRkdxPTPYB9CCgrDV8oum5rbghJjAbmXFXOrRXvMtg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/bunyamin/-/bunyamin-1.6.1.tgz", + "integrity": "sha512-gm44niEx19vp7XYB8nATtQ8WOK9lCU8fN3F2c9nXnD5TYr0qoxNZB1jxfzOYTz5he7lDBxrtvswSDrbiFf7WiA==", "dev": true, "dependencies": { "@flatten-js/interval-tree": "^1.1.2", @@ -5039,9 +5029,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001600", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", - "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", + "version": "1.0.30001612", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", + "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", "dev": true, "funding": [ { @@ -5217,9 +5207,9 @@ "dev": true }, "node_modules/core-js-compat": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", + "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", "dev": true, "dependencies": { "browserslist": "^4.23.0" @@ -5382,9 +5372,9 @@ } }, "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" @@ -5657,9 +5647,9 @@ } }, "node_modules/diff2html": { - "version": "3.4.47", - "resolved": "https://registry.npmjs.org/diff2html/-/diff2html-3.4.47.tgz", - "integrity": "sha512-2llDp8750FRUJl8n7apM0tlcqZYxbDHTw7qhzv/kGddByHRpn3Xg/sWHHIy34h492aGSpStEULydxqrITYpuoA==", + "version": "3.4.48", + "resolved": "https://registry.npmjs.org/diff2html/-/diff2html-3.4.48.tgz", + "integrity": "sha512-1lzNSg0G0VPKZPTyi4knzV2nAWTXBy/QaWCKzDto6iEIlcuOJEG0li4bElJfpHNz+pBqPu4AcC1i9ZCo9KMUOg==", "dev": true, "dependencies": { "diff": "5.1.0", @@ -5705,9 +5695,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.715", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.715.tgz", - "integrity": "sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==", + "version": "1.4.748", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.748.tgz", + "integrity": "sha512-VWqjOlPZn70UZ8FTKUOkUvBLeTQ0xpty66qV0yJcAGY2/CthI4xyW9aEozRVtuwv3Kpf5xTesmJUcPwuJmgP4A==", "dev": true }, "node_modules/emittery": { @@ -5962,16 +5952,13 @@ } }, "node_modules/find-babel-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.0.0.tgz", - "integrity": "sha512-dOKT7jvF3hGzlW60Gc3ONox/0rRZ/tz7WCil0bqA1In/3I8f1BctpXahRnEKDySZqci7u+dqq93sZST9fOJpFw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.1.1.tgz", + "integrity": "sha512-5Ji+EAysHGe1OipH7GN4qDjok5Z1uw5KAwDCbicU/4wyTZY7CqOCzcWbG7J5ad9mazq67k89fXlbc1MuIfl9uA==", "dev": true, "dependencies": { - "json5": "^2.1.1", + "json5": "^2.2.3", "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" } }, "node_modules/find-up": { diff --git a/detox/package.json b/detox/package.json index 1f58fb4f38c..4190e2d1ce1 100644 --- a/detox/package.json +++ b/detox/package.json @@ -14,7 +14,7 @@ "@types/jest": "29.5.5", "@types/tough-cookie": "4.0.3", "@types/uuid": "9.0.4", - "async": "^3.2.5", + "async": "3.2.5", "axios": "1.5.0", "axios-cookiejar-support": "4.0.7", "babel-jest": "29.7.0", From 8ac208d64470db62467b710d4f890e6fecfa73b3 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 1 May 2024 00:09:26 +0530 Subject: [PATCH 187/362] fix report --- detox/save_report.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/detox/save_report.js b/detox/save_report.js index 2066fab7b9f..3c855676ece 100644 --- a/detox/save_report.js +++ b/detox/save_report.js @@ -80,12 +80,14 @@ const saveReport = async () => { const os_version = os.release(); const node_version = process.version; const npm_version = shell.exec('npm --version').stdout.trim(); + const device_name = DEVICE_NAME; + const device_os_version = DEVICE_OS_VERSION; // Write environment details to file const environmentDetails = { detox_version, - device_name: DEVICE_NAME, - device_os_version: DEVICE_OS_VERSION, + device_name, + device_os_version, headless, os_name, os_version, From e0a7796c4aabd0e94a4d9522770cd27072e563a2 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 2 May 2024 14:39:57 +0530 Subject: [PATCH 188/362] fix run summary in the reports channel --- .github/workflows/e2e-detox.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 6c5fac734eb..3bcd3f1e0c9 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -154,6 +154,8 @@ jobs: - e2e-ios env: BUILD_ID: ${{ needs.generate-specs.outputs.BUILD_ID }} + DEVICE_NAME: ${{ needs.generate-specs.outputs.DEVICE_NAME }} + DEVICE_OS_VERSION: ${{ needs.generate-specs.outputs.DEVICE_OS_VERSION }} steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 From e5066541478af9ac152c97011bd2a52119480287 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 31 May 2024 14:50:24 +0530 Subject: [PATCH 189/362] E2E Template workflow (#7932) --- .github/actions/generate-specs/action.yml | 12 +- .github/actions/generate-specs/split-tests.js | 17 +- .github/actions/prepare-node-deps/action.yaml | 2 +- .github/workflows/e2e-detox-ci-template.yml | 319 ++++++++++++++++++ .github/workflows/e2e-detox.yml | 236 ++----------- detox/e2e/support/ui/screen/channel.ts | 3 + detox/e2e/support/ui/screen/server.ts | 4 +- detox/e2e/test/channels/find_channels.e2e.ts | 34 +- .../test/channels/unarchive_channel.e2e.ts | 9 +- .../messaging/emojis_and_reactions.e2e.ts | 10 +- detox/e2e/test/messaging/message_draft.e2e.ts | 2 + detox/save_report.js | 2 +- detox/utils/report.js | 4 +- 13 files changed, 404 insertions(+), 250 deletions(-) create mode 100644 .github/workflows/e2e-detox-ci-template.yml diff --git a/.github/actions/generate-specs/action.yml b/.github/actions/generate-specs/action.yml index 06cf3dcd737..db7e071729a 100644 --- a/.github/actions/generate-specs/action.yml +++ b/.github/actions/generate-specs/action.yml @@ -9,14 +9,14 @@ inputs: parallelism: description: The parallelism for the tests required: true - device: + device_name: description: The name of Device used for the tests required: false - default: iPhone 15 - os_version: + default: "iPhone 15" + device_os_version: description: The os of the device used for the tests required: false - default: iOS 17.1 + default: "iOS 17.1" outputs: specs: @@ -30,8 +30,8 @@ runs: env: PARALLELISM: ${{ inputs.parallelism }} SEARCH_PATH: ${{ inputs.search_path }} - DEVICE: ${{ inputs.DEVICE }} - OS_VERSION: ${{ inputs.OS_VERSION }} + DEVICE_NAME: ${{ inputs.device_name }} + DEVICE_OS_VERSION: ${{ inputs.device_os_version }} run: | set -e node ${{ github.action_path }}/split-tests.js > output.json diff --git a/.github/actions/generate-specs/split-tests.js b/.github/actions/generate-specs/split-tests.js index fdde9d95ae2..62f7ac14fbf 100644 --- a/.github/actions/generate-specs/split-tests.js +++ b/.github/actions/generate-specs/split-tests.js @@ -2,9 +2,9 @@ const fs = require('fs'); const path = require('path'); class DeviceInfo { - constructor(device, osVersion) { - this.device = device; - this.osVersion = osVersion; + constructor(deviceName, deviceOsVersion) { + this.deviceName = deviceName; + this.deviceOsVersion = deviceOsVersion; } } @@ -12,8 +12,8 @@ class SpecGroup { constructor(runId, specs, deviceInfo) { this.runId = runId; this.specs = specs; - this.device = deviceInfo.device; - this.osVersion = deviceInfo.osVersion; + this.deviceName = deviceInfo.deviceName; + this.deviceOsVersion = deviceInfo.deviceOsVersion; } } @@ -81,10 +81,9 @@ class Specs { function main() { const searchPath = process.env.SEARCH_PATH; const parallelism = parseInt(process.env.PARALLELISM, 10); - const device = process.env.DEVICE; - const osVersion = process.env.OS_VERSION; - - const deviceInfo = new DeviceInfo(device, osVersion); + const deviceName = process.env.DEVICE_NAME; + const deviceOsVersion = process.env.DEVICE_OS_VERSION; + const deviceInfo = new DeviceInfo(deviceName, deviceOsVersion); const specs = new Specs(searchPath, parallelism, deviceInfo); specs.findFiles(); diff --git a/.github/actions/prepare-node-deps/action.yaml b/.github/actions/prepare-node-deps/action.yaml index 655fa308f37..31ee878383b 100644 --- a/.github/actions/prepare-node-deps/action.yaml +++ b/.github/actions/prepare-node-deps/action.yaml @@ -5,7 +5,7 @@ runs: using: composite steps: - name: ci/setup-node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: node-version-file: ".nvmrc" cache: "npm" diff --git a/.github/workflows/e2e-detox-ci-template.yml b/.github/workflows/e2e-detox-ci-template.yml new file mode 100644 index 00000000000..51bd70093a3 --- /dev/null +++ b/.github/workflows/e2e-detox-ci-template.yml @@ -0,0 +1,319 @@ +name: Detox E2E Tests Template + +on: + workflow_call: + inputs: + run-ios-tests: + description: 'Run iOS tests' + required: true + type: boolean + run-android-tests: + description: 'Run Android tests' + required: true + type: boolean + remove-pr-label: + description: 'Remove PR label' + required: false + type: boolean + default: false + status_check_context: + type: string + required: true + commit_sha: + type: string + required: true + run-type: + type: string + required: false + default: 'PR' + +env: + AWS_REGION: 'us-east-1' + ADMIN_EMAIL: ${{ secrets.MM_MOBILE_E2E_ADMIN_EMAIL }} + ADMIN_USERNAME: ${{ secrets.MM_MOBILE_E2E_ADMIN_USERNAME }} + ADMIN_PASSWORD: ${{ secrets.MM_MOBILE_E2E_ADMIN_PASSWORD }} + BRANCH: ${{ github.head_ref || github.ref_name }} + COMMIT_HASH: ${{ github.sha }} + DETOX_AWS_S3_BUCKET: 'mattermost-detox-report' + DETOX_AWS_ACCESS_KEY_ID: ${{ secrets.MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID }} + DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }} + HEADLESS: 'true' + TYPE: ${{ inputs.run-type }} + PULL_REQUEST: 'https://github.com/mattermost/mattermost-mobile/pull/${{ github.event.number }}' + SITE_1_URL: ${{ secrets.MM_MOBILE_E2E_SITE_1_URL }} + SITE_2_URL: ${{ secrets.MM_MOBILE_E2E_SITE_2_URL }} + SITE_3_URL: ${{ secrets.MM_MOBILE_E2E_SITE_3_URL }} + ZEPHYR_ENABLE: false + JIRA_PROJECT_KEY: 'MM' + ZEPHYR_API_KEY: ${{ secrets.MM_MOBILE_E2E_ZEPHYR_API_KEY }} + ZEPHYR_FOLDER_ID: '3233873' + TEST_CYCLE_LINK_PREFIX: ${{ secrets.MM_MOBILE_E2E_TEST_CYCLE_LINK_PREFIX }} + WEBHOOK_URL: ${{ secrets.MM_MOBILE_E2E_WEBHOOK_URL }} + FAILURE_MESSAGE: "Something has failed" + +jobs: + update-initial-status: + runs-on: ubuntu-22.04 + steps: + - uses: mattermost/actions/delivery/update-commit-status@main + env: + GITHUB_TOKEN: ${{ github.token }} + with: + repository_full_name: ${{ github.repository }} + commit_sha: ${{ inputs.commit_sha }} + context: ${{ inputs.status_check_context }} + description: Detox tests for mattermost mobile app + status: pending + + generate-specs: + needs: update-initial-status + runs-on: ubuntu-22.04 + if: ${{ inputs.run-ios-tests || inputs.run-android-tests }} + outputs: + specs: ${{ steps.generate-specs.outputs.specs }} + build_id: ${{ env.BUILD_ID }} + device_name: ${{ env.DEVICE_NAME }} + device_os_version: ${{ env.DEVICE_OS_VERSION }} + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Set Build ID + id: resolve-device + run: | + cd detox + DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") + DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.os") + BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" + + echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV + echo "DEVICE_NAME=$(echo ${DEVICE_NAME})" >> $GITHUB_ENV + echo "DEVICE_OS_VERSION=$(echo ${DEVICE_OS_VERSION})" >> $GITHUB_ENV + + - name: Generate Test Specs + id: generate-specs + uses: ./.github/actions/generate-specs + with: + parallelism: 10 + search_path: detox/e2e/test + device_name: ${{ env.DEVICE_NAME }} + device_os_version: ${{env.DEVICE_OS_VERSION}} + + build-ios-simulator: + needs: update-initial-status + runs-on: macos-14-large + if: ${{ inputs.run-ios-tests }} + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Prepare iOS Build + uses: ./.github/actions/prepare-ios-build + + - name: Build iOS Simulator + env: + TAG: "${{ github.ref_name }}" + AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" + AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" + GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" + run: bundle exec fastlane ios simulator --env ios.simulator + working-directory: ./fastlane + + - name: Upload iOS Simulator Build + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: ios-build-simulator-${{ github.run_id }} + path: Mattermost-simulator-x86_64.app.zip + + e2e-ios: + continue-on-error: true + env: + IOS: true + runs-on: macos-14-large + name: ios-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} + if: ${{ inputs.run-ios-tests }} + needs: + - generate-specs + - build-ios-simulator + strategy: + fail-fast: false + matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Install Homebrew Dependencies + run: | + brew tap wix/brew + brew install applesimutils + + - name: Download iOS Simulator Build + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + name: ios-build-simulator-${{ github.run_id }} + path: mobile-artifacts + + - name: Unzip iOS Simulator Build + run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm i + + - name: Run Detox E2E Tests + continue-on-error: true # Label might have been removed manually + run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} + + - name: Upload iOS Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: ios-results-${{ matrix.runId }} + path: detox/artifacts/ + + download-e2e-results: + runs-on: ubuntu-22.04 + if: ${{ inputs.run-ios-tests || inputs.run-android-tests }} + needs: + - generate-specs + - e2e-ios + outputs: + failures: "${{ steps.calculate-failures.outputs.failures }}" + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Create artifacts directory + run: mkdir -p detox/artifacts/ + + - name: Download All Artifacts + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + path: detox/artifacts/ + pattern: ios-results-* + + - name: Save report Detox Dependencies + id: report-link + run: | + cd detox + npm ci + npm run e2e:save-report + env: + IOS: ${{ inputs.run-ios-tests }} + BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} + DEVICE_NAME: ${{ needs.generate-specs.outputs.device_name }} + DEVICE_OS_VERSION: ${{ needs.generate-specs.outputs.device_os_version }} + + - name: Calculate failures + id: calculate-failures + run: | + FAILURES=$(find detox/artifacts/ -name 'summary.json' | xargs -l jq -r '.stats.failures' | jq -s add) + echo "failures=${FAILURES}" >> $GITHUB_OUTPUT + echo "Detox run completed with $FAILURES failures" + + update-failure-final-status: + runs-on: ubuntu-22.04 + if: ${{ needs.download-e2e-results.outputs.failures > 0 }} + needs: + - generate-specs + - download-e2e-results + steps: + - name: Set Target URL + id: set-url + run: | + s3Folder="${{ env.BUILD_ID }}-${{ env.COMMIT_HASH }}-${{ env.BRANCH }}" + s3Folder=$(echo "$s3Folder" | sed 's/\./-/g') + + if ${{ inputs.run-ios-tests }}; then + echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/ios-report.html" >> $GITHUB_ENV + else + echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/android-report.html" >> $GITHUB_ENV + fi + env: + BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} + + - uses: mattermost/actions/delivery/update-commit-status@main + env: + GITHUB_TOKEN: ${{ github.token }} + with: + repository_full_name: ${{ github.repository }} + commit_sha: ${{ inputs.commit_sha }} + context: ${{ inputs.status_check_context }} + description: | + Completed with ${{ needs.download-e2e-results.outputs.failures }} failures + status: failure + target_url: ${{ env.TARGET_URL }} + + update-success-final-status: + runs-on: ubuntu-22.04 + if: ${{ needs.download-e2e-results.outputs.failures == 0 }} + needs: + - generate-specs + - download-e2e-results + steps: + - name: Set Target URL + id: set-url + run: | + s3Folder="${{ env.BUILD_ID }}-${{ env.COMMIT_HASH }}-${{ env.BRANCH }}" + s3Folder=$(echo "$s3Folder" | sed 's/\./-/g') + + if ${{ inputs.run-ios-tests }}; then + echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/ios-report.html" >> $GITHUB_ENV + else + echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/android-report.html" >> $GITHUB_ENV + fi + env: + BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} + + - uses: mattermost/actions/delivery/update-commit-status@main + env: + GITHUB_TOKEN: ${{ github.token }} + with: + repository_full_name: ${{ github.repository }} + commit_sha: ${{ inputs.commit_sha }} + context: ${{ inputs.status_check_context }} + description: | + Completed with ${{ needs.download-e2e-results.outputs.failures }} failures + status: success + target_url: ${{ env.TARGET_URL }} + + e2e-remove-label: + if: ${{ inputs.remove-pr-label }} + needs: + - download-e2e-results + runs-on: ubuntu-22.04 + steps: + - name: e2e/remove-label-from-pr + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + continue-on-error: true # Label might have been removed manually + with: + script: | + const iosLabel = 'E2E iOS tests for PR'; + const androidLabel = 'E2E Android tests for PR'; + const labels = context.payload.pull_request.labels.map(label => label.name); + + if (labels.includes(iosLabel)) { + github.rest.issues.removeLabel({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + name: iosLabel, + }); + } + + if (labels.includes(androidLabel)) { + github.rest.issues.removeLabel({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + name: androidLabel, + }); + } diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 3bcd3f1e0c9..d1d43232415 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -3,212 +3,42 @@ name: Detox E2E Tests on: push: branches: - - main + - 'test-template' pull_request: branches: - - main + - 'master' + - 'ios_detox_job' types: - labeled - - opened + workflow_dispatch: + inputs: + ios_version: + description: 'Enter iOS version' + required: false + default: "iOS 17.4" + device_name: + description: 'Enter iOS Device Name' + required: false + default: "iPhone 15 Pro" + commit_sha: + type: string + required: false -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} - cancel-in-progress: true - -env: - AWS_REGION: 'us-east-1' - ADMIN_EMAIL: ${{ secrets.MM_MOBILE_E2E_ADMIN_EMAIL }} - ADMIN_USERNAME: ${{ secrets.MM_MOBILE_E2E_ADMIN_USERNAME }} - ADMIN_PASSWORD: ${{ secrets.MM_MOBILE_E2E_ADMIN_PASSWORD }} - BRANCH: ${{ github.head_ref || github.ref_name }} - COMMIT_HASH: ${{ github.sha }} - DETOX_AWS_S3_BUCKET: 'mattermost-detox-report' - DETOX_AWS_ACCESS_KEY_ID: ${{ secrets.MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID }} - DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }} - HEADLESS: 'true' - TYPE: 'PR' - PULL_REQUEST: 'https://github.com/mattermost/mattermost-mobile/pull/${{ github.event.number }}' - SITE_1_URL: ${{ secrets.MM_MOBILE_E2E_SITE_1_URL }} - SITE_2_URL: ${{ secrets.MM_MOBILE_E2E_SITE_2_URL }} - SITE_3_URL: ${{ secrets.MM_MOBILE_E2E_SITE_3_URL }} - ZEPHYR_ENABLE: false - JIRA_PROJECT_KEY: 'MM' - ZEPHYR_API_KEY: ${{ secrets.MM_MOBILE_E2E_ZEPHYR_API_KEY }} - ZEPHYR_FOLDER_ID: '3233873' - TEST_CYCLE_LINK_PREFIX: ${{ secrets.MM_MOBILE_E2E_TEST_CYCLE_LINK_PREFIX }} - WEBHOOK_URL: ${{ secrets.MM_MOBILE_E2E_WEBHOOK_URL }} - FAILURE_MESSAGE: "Something has failed" - jobs: - generate-specs: - runs-on: ubuntu-22.04 - if: (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) - outputs: - specs: ${{ steps.generate-specs.outputs.specs }} - BUILD_ID: ${{ steps.generate-specs.outputs.BUILD_ID }} - DEVICE_NAME: ${{ steps.generate-specs.outputs.DEVICE_NAME }} - DEVICE_OS_VERSION: ${{ steps.generate-specs.outputs.DEVICE_OS_VERSION }} - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Set Build ID - run: | - cd detox - DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") - DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.os") - BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" - - echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV - echo "DEVICE_NAME=${DEVICE_NAME}" >> $GITHUB_ENV - echo "DEVICE_OS_VERSION=${DEVICE_OS_VERSION}" >> $GITHUB_ENV - - - name: Generate Test Specs - id: generate-specs - uses: ./.github/actions/generate-specs - with: - parallelism: 10 - search_path: detox/e2e/test - device: ${{ env.DEVICE_NAME }} - os_version: ${{ env.DEVICE_OS_VERSION }} - - build-ios-simulator: - runs-on: macos-14-large - if: contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Prepare iOS Build - uses: ./.github/actions/prepare-ios-build - - - name: Build iOS Simulator - env: - TAG: "${{ github.ref_name }}" - AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" - AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" - GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" - run: bundle exec fastlane ios simulator --env ios.simulator - working-directory: ./fastlane - - - name: Upload iOS Simulator Build - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: ios-build-simulator-${{ github.run_id }} - path: Mattermost-simulator-x86_64.app.zip - - e2e-ios: - env: - IOS: true - runs-on: macos-14-large - name: ios-detox-e2e-${{ matrix.runId }}-${{ matrix.device }}-${{ matrix.osVersion }} - if: contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') - needs: - - generate-specs - - build-ios-simulator - strategy: - fail-fast: false - matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps - - - name: Install Homebrew Dependencies - run: | - brew tap wix/brew - brew install applesimutils - - - name: Download iOS Simulator Build - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - name: ios-build-simulator-${{ github.run_id }} - path: mobile-artifacts - - - name: Unzip iOS Simulator Build - run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ - - - name: Start React Native Metro Server - run: npm run start & - - - name: Install Detox Dependencies - run: cd detox && npm i - - - name: Run Detox E2E Tests - run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} - - - name: Upload iOS Test Report - if: always() - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: ios-results-${{ matrix.runId }} - path: detox/artifacts/ - - download-e2e-results: - runs-on: ubuntu-22.04 - if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) - needs: - - generate-specs - - e2e-ios - env: - BUILD_ID: ${{ needs.generate-specs.outputs.BUILD_ID }} - DEVICE_NAME: ${{ needs.generate-specs.outputs.DEVICE_NAME }} - DEVICE_OS_VERSION: ${{ needs.generate-specs.outputs.DEVICE_OS_VERSION }} - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps - - - name: Create artifacts directory - run: mkdir -p detox/artifacts/ - - - name: Download All Artifacts - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - path: detox/artifacts/ - pattern: ios-results-* - - - name: Save report Detox Dependencies - run: | - cd detox - npm ci - npm run e2e:save-report - env: - IOS: true - - e2e-remove-label: - if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) - needs: - - download-e2e-results - runs-on: ubuntu-22.04 - steps: - - name: e2e/remove-label-from-pr - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - continue-on-error: true # Label might have been removed manually - with: - script: | - const iosLabel = 'E2E iOS tests for PR'; - const androidLabel = 'E2E Android tests for PR'; - const labels = context.payload.pull_request.labels.map(label => label.name); - - if (labels.includes(iosLabel)) { - github.rest.issues.removeLabel({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - name: iosLabel, - }); - } - - if (labels.includes(androidLabel)) { - github.rest.issues.removeLabel({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - name: androidLabel, - }); - } + run-ios-tests: + name: iOS Mobile Tests + uses: ./.github/workflows/e2e-detox-ci-template.yml + if: ${{ + ( + github.event_name == 'pull_request' && + github.event.pull_request.labels && + contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') + ) + }} + with: + run-ios-tests: true + run-android-tests: false + remove-pr-label: true + commit_sha: "${{ inputs.commit_sha || github.event.pull_request.head.sha || github.sha }}" + status_check_context: "Detox iOS Mobile Tests" + secrets: inherit diff --git a/detox/e2e/support/ui/screen/channel.ts b/detox/e2e/support/ui/screen/channel.ts index 31e430ea44c..5581de9e9b9 100644 --- a/detox/e2e/support/ui/screen/channel.ts +++ b/detox/e2e/support/ui/screen/channel.ts @@ -22,6 +22,7 @@ import {expect} from 'detox'; class ChannelScreen { testID = { + archievedCloseChannelButton: 'channel.post_draft.archived.close_channel.button', channelScreenPrefix: 'channel.', channelScreen: 'channel.screen', channelQuickActionsButton: 'channel_header.channel_quick_actions.button', @@ -43,6 +44,7 @@ class ChannelScreen { toastMessage: 'toast.message', }; + archievedCloseChannelButton = element(by.id(this.testID.archievedCloseChannelButton)); channelScreen = element(by.id(this.testID.channelScreen)); channelQuickActionsButton = element(by.id(this.testID.channelQuickActionsButton)); favoriteQuickAction = element(by.id(this.testID.favoriteQuickAction)); @@ -172,6 +174,7 @@ class ChannelScreen { postMessage = async (message: string) => { // # Post message await this.postInput.tap(); + await this.postInput.clearText(); await this.postInput.replaceText(message); await this.tapSendButton(); }; diff --git a/detox/e2e/support/ui/screen/server.ts b/detox/e2e/support/ui/screen/server.ts index 119e9417243..71e5f9cd74a 100644 --- a/detox/e2e/support/ui/screen/server.ts +++ b/detox/e2e/support/ui/screen/server.ts @@ -48,9 +48,9 @@ class ServerScreen { connectToServer = async (serverUrl: string, serverDisplayName: string) => { await this.toBeVisible(); - await this.serverUrlInput.typeText(serverUrl); + await this.serverUrlInput.replaceText(serverUrl); await this.serverUrlInput.tapReturnKey(); - await this.serverDisplayNameInput.typeText(serverDisplayName); + await this.serverDisplayNameInput.replaceText(serverDisplayName); if (isAndroid()) { await this.serverDisplayNameInput.tapReturnKey(); } diff --git a/detox/e2e/test/channels/find_channels.e2e.ts b/detox/e2e/test/channels/find_channels.e2e.ts index 41c4537962a..72317651597 100644 --- a/detox/e2e/test/channels/find_channels.e2e.ts +++ b/detox/e2e/test/channels/find_channels.e2e.ts @@ -71,19 +71,13 @@ describe('Channels - Find Channels', () => { it('MM-T4907_2 - should be able to find and navigate to a public channel', async () => { // # Open find channels screen and search for a public channel to navigate to await FindChannelsScreen.open(); - await FindChannelsScreen.searchInput.replaceText(testChannel.name); - - // * Verify search returns the target public channel item - await wait(timeouts.ONE_SEC); - await expect(FindChannelsScreen.getFilteredChannelItemDisplayName(testChannel.name)).toHaveText(testChannel.display_name); + await FindChannelsScreen.searchInput.replaceText(testChannel.display_name); // # Tap on the target public channel item await FindChannelsScreen.getFilteredChannelItem(testChannel.name).tap(); // * Verify on target public channel screen - await ChannelScreen.toBeVisible(); - await expect(ChannelScreen.headerTitle).toHaveText(testChannel.display_name); - await expect(ChannelScreen.introDisplayName).toHaveText(testChannel.display_name); + await verifyDetailsOnChannelScreen(testChannel.display_name); // # Go back to channel list screen await ChannelScreen.back(); @@ -124,10 +118,13 @@ describe('Channels - Find Channels', () => { // * Verify search returns the target group message channel item await wait(timeouts.ONE_SEC); - await expect(FindChannelsScreen.getFilteredChannelItemDisplayName(groupMessageChannel.name)).toHaveText(`${testOtherUser1.username}, ${testOtherUser2.username}, sysadmin`); + await FindChannelsScreen.getFilteredChannelItem(groupMessageChannel.name).tap(); + + // * Verify on target GM screen + await verifyDetailsOnChannelScreen(`${testOtherUser1.username}, admin, ${testOtherUser2.username}`); // # Go back to channel list screen - await FindChannelsScreen.close(); + await ChannelScreen.back(); }); it('MM-T4907_5 - should be able to find an archived channel', async () => { @@ -140,10 +137,14 @@ describe('Channels - Find Channels', () => { // * Verify search returns the target archived channel item await wait(timeouts.ONE_SEC); - await expect(FindChannelsScreen.getFilteredChannelItemDisplayName(archivedChannel.name)).toHaveText(archivedChannel.display_name); + await FindChannelsScreen.getFilteredChannelItem(archivedChannel.name).tap(); - // # Go back to channel list screen - await FindChannelsScreen.close(); + // * Verify on archievd channel name + await verifyDetailsOnChannelScreen(archivedChannel.display_name); + + // # Go back to channel list screen by closing archived channel + await expect(ChannelScreen.archievedCloseChannelButton).toBeVisible(); + await ChannelScreen.archievedCloseChannelButton.tap(); }); it('MM-T4907_6 - should be able to find a joined private channel and not find an unjoined private channel', async () => { @@ -156,7 +157,6 @@ describe('Channels - Find Channels', () => { // * Verify search returns the target joined private channel item await wait(timeouts.ONE_SEC); - await expect(FindChannelsScreen.getFilteredChannelItemDisplayName(joinedPrivateChannel.name)).toHaveText(joinedPrivateChannel.display_name); // # Search for an unjoined private channel await FindChannelsScreen.searchInput.replaceText(unjoinedPrivateChannel.name); @@ -169,3 +169,9 @@ describe('Channels - Find Channels', () => { await FindChannelsScreen.close(); }); }); + +async function verifyDetailsOnChannelScreen(display_name: string) { + await ChannelScreen.toBeVisible(); + await expect(ChannelScreen.headerTitle).toHaveText(display_name); + await expect(ChannelScreen.introDisplayName).toHaveText(display_name); +} diff --git a/detox/e2e/test/channels/unarchive_channel.e2e.ts b/detox/e2e/test/channels/unarchive_channel.e2e.ts index 6d7db8d3ab5..dbfe12d31b9 100644 --- a/detox/e2e/test/channels/unarchive_channel.e2e.ts +++ b/detox/e2e/test/channels/unarchive_channel.e2e.ts @@ -22,12 +22,11 @@ import {expect} from 'detox'; describe('Channels - Unarchive Channel', () => { const serverOneDisplayName = 'Server 1'; - const channelsCategory = 'channels'; beforeAll(async () => { // # Log in to server as admin await ServerScreen.connectToServer(serverOneUrl, serverOneDisplayName); - await LoginScreen.login(getAdminAccount()); + await LoginScreen.loginAsAdmin(getAdminAccount()); }); beforeEach(async () => { @@ -43,7 +42,6 @@ describe('Channels - Unarchive Channel', () => { it('MM-T4944_1 - should be able to unarchive a public channel and confirm', async () => { // # Create a public channel screen, open channel info screen, and tap on archive channel option and confirm const channelDisplayName = `Channel ${getRandomId()}`; - const channelName = channelDisplayName.replace(/ /, '-').toLowerCase(); await CreateOrEditChannelScreen.openCreateChannel(); await CreateOrEditChannelScreen.displayNameInput.replaceText(channelDisplayName); await CreateOrEditChannelScreen.createButton.tap(); @@ -57,8 +55,6 @@ describe('Channels - Unarchive Channel', () => { // # Open channel info screen, tap on unarchive channel and confirm, close and re-open app to reload, and re-open unarchived public channel await ChannelInfoScreen.open(); await ChannelInfoScreen.unarchivePublicChannel({confirm: true}); - await device.reloadReactNative(); - await ChannelScreen.open(channelsCategory, channelName); // * Verify on unarchived public channel screen and active post draft is displayed await ChannelScreen.toBeVisible(); @@ -71,7 +67,6 @@ describe('Channels - Unarchive Channel', () => { it('MM-T4944_2 - should be able to unarchive a private channel and confirm', async () => { // # Create a private channel screen, open channel info screen, and tap on archive channel option and confirm const channelDisplayName = `Channel ${getRandomId()}`; - const channelName = channelDisplayName.replace(/ /, '-').toLowerCase(); await CreateOrEditChannelScreen.openCreateChannel(); await CreateOrEditChannelScreen.toggleMakePrivateOn(); await CreateOrEditChannelScreen.displayNameInput.replaceText(channelDisplayName); @@ -86,8 +81,6 @@ describe('Channels - Unarchive Channel', () => { // # Open channel info screen, tap on unarchive channel and confirm, close and re-open app to reload, and re-open unarchived private channel await ChannelInfoScreen.open(); await ChannelInfoScreen.unarchivePrivateChannel({confirm: true}); - await device.reloadReactNative(); - await ChannelScreen.open(channelsCategory, channelName); // * Verify on unarchived private channel screen and active post draft is displayed await ChannelScreen.toBeVisible(); diff --git a/detox/e2e/test/messaging/emojis_and_reactions.e2e.ts b/detox/e2e/test/messaging/emojis_and_reactions.e2e.ts index e735417ad7e..4b367b8ce7e 100644 --- a/detox/e2e/test/messaging/emojis_and_reactions.e2e.ts +++ b/detox/e2e/test/messaging/emojis_and_reactions.e2e.ts @@ -24,6 +24,7 @@ import { PostOptionsScreen, ReactionsScreen, ServerScreen, + UserProfileScreen, } from '@support/ui/screen'; import {getRandomId} from '@support/utils'; import {expect} from 'detox'; @@ -115,14 +116,15 @@ describe('Messaging - Emojis and Reactions', () => { // * Verify user who reacted with the emoji await ReactionsScreen.toBeVisible(); - const {reactorItemEmojiAliases, reactorItemUserProfilePicture, reactorItemUserDisplayName, reactorItemUsername} = ReactionsScreen.getReactorItem(testUser.id, 'fire'); + const {reactorItemEmojiAliases, reactorItemUserProfilePicture, reactorItemUser} = ReactionsScreen.getReactorItem(testUser.id, 'fire'); await expect(reactorItemEmojiAliases).toHaveText(':fire:'); await expect(reactorItemUserProfilePicture).toBeVisible(); - await expect(reactorItemUserDisplayName).toHaveText(`${testUser.first_name} ${testUser.last_name}`); - await expect(reactorItemUsername).toHaveText(` @${testUser.username}`); + await expect(reactorItemUser).toBeVisible(); + await reactorItemUser.tap(); + await expect(UserProfileScreen.userDisplayName).toHaveText(`@${testUser.username}`); // # Go back to channel list screen - await ReactionsScreen.close(); + await UserProfileScreen.close(); await ChannelScreen.back(); }); diff --git a/detox/e2e/test/messaging/message_draft.e2e.ts b/detox/e2e/test/messaging/message_draft.e2e.ts index 6ee9b4a063d..5a4655c5eb0 100644 --- a/detox/e2e/test/messaging/message_draft.e2e.ts +++ b/detox/e2e/test/messaging/message_draft.e2e.ts @@ -92,6 +92,7 @@ describe('Messaging - Message Draft', () => { const message = `Message ${getRandomId()}`; await ChannelScreen.open(channelsCategory, testChannel.name); await ChannelScreen.postInput.tap(); + await ChannelScreen.postInput.clearText(); await ChannelScreen.postInput.replaceText(message); // * Verify message draft exists in post draft @@ -122,6 +123,7 @@ describe('Messaging - Message Draft', () => { let message = '1234567890'.repeat(1638) + '1234'; await ChannelScreen.open(channelsCategory, testChannel.name); await ChannelScreen.postInput.tap(); + await ChannelScreen.postInput.clearText(); await ChannelScreen.postInput.replaceText(message); // * Verify warning message is displayed and send button is disabled diff --git a/detox/save_report.js b/detox/save_report.js index 3c855676ece..664cd62198d 100644 --- a/detox/save_report.js +++ b/detox/save_report.js @@ -75,7 +75,7 @@ const saveReport = async () => { removeOldGeneratedReports(); const detox_version = shell.exec('npm list detox').stdout.split('\n')[1].split('@')[1].trim(); - const headless = IOS === 'true' ? false : HEADLESS === 'true'; + const headless = IOS === 'true' ? 'false' : HEADLESS === 'true'; const os_name = os.platform(); const os_version = os.release(); const node_version = process.version; diff --git a/detox/utils/report.js b/detox/utils/report.js index 7fca48ee5e5..47bd97a14c0 100644 --- a/detox/utils/report.js +++ b/detox/utils/report.js @@ -308,7 +308,7 @@ function generateTestReport(summary, isUploadedToS3, reportLink, environment, te function generateTitle() { const { BRANCH, - BUILD_AWS_S3_BUCKET, + DETOX_AWS_S3_BUCKET, BUILD_ID, COMMIT_HASH, IOS, @@ -332,7 +332,7 @@ function generateTitle() { switch (TYPE) { case 'PR': - buildLink = ` with [${lane}:${COMMIT_HASH}](https://${BUILD_AWS_S3_BUCKET}.s3.amazonaws.com/${s3Folder}/${appFilePath})`; + buildLink = ` with [${lane}:${COMMIT_HASH}](https://${DETOX_AWS_S3_BUCKET}.s3.amazonaws.com/${s3Folder}/${appFilePath})`; title = `${platform} E2E for Pull Request Build: [${BRANCH}](${PULL_REQUEST})${buildLink}`; break; case 'RELEASE': From 75b74df868d016217d91eaceb4e713069c99faef Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 31 May 2024 15:08:16 +0530 Subject: [PATCH 190/362] add triggers --- .github/workflows/e2e-detox.yml | 43 ++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index d1d43232415..285d84369be 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -1,13 +1,14 @@ name: Detox E2E Tests on: + schedule: + - cron: '0 0 * * *' # every day at midnight push: branches: - - 'test-template' + - 'release-*' pull_request: branches: - 'master' - - 'ios_detox_job' types: - labeled workflow_dispatch: @@ -25,7 +26,7 @@ on: required: false jobs: - run-ios-tests: + run-ios-tests-on-pr: name: iOS Mobile Tests uses: ./.github/workflows/e2e-detox-ci-template.yml if: ${{ @@ -42,3 +43,39 @@ jobs: commit_sha: "${{ inputs.commit_sha || github.event.pull_request.head.sha || github.sha }}" status_check_context: "Detox iOS Mobile Tests" secrets: inherit + + run-ios-tests-on-release: + name: iOS Mobile Tests on Release + uses: ./.github/workflows/e2e-detox-ci-template.yml + if: ${{ startsWith(github.ref, 'refs/heads/release-') }} + with: + run-ios-tests: true + run-android-tests: false + remove-pr-label: false + commit_sha: "${{ github.sha }}" + status_check_context: "Detox iOS Mobile Tests on Release" + secrets: inherit + + run-ios-tests-on-main-scheduled: + name: iOS Mobile Tests on Main (Scheduled) + uses: ./.github/workflows/e2e-detox-ci-template.yml + if: ${{ github.event_name == 'schedule' && github.ref == 'refs/heads/main' }} + with: + run-ios-tests: true + run-android-tests: false + remove-pr-label: false + commit_sha: "${{ github.sha }}" + status_check_context: "Detox iOS Mobile Tests on Main (Scheduled)" + secrets: inherit + + run-ios-tests-on-manual-trigger: + name: iOS Mobile Tests on Manual Trigger + uses: ./.github/workflows/e2e-detox-ci-template.yml + if: ${{ github.event_name == 'workflow_dispatch' }} + with: + run-ios-tests: true + run-android-tests: false + remove-pr-label: false + commit_sha: "${{ inputs.commit_sha || github.sha }}" + status_check_context: "Detox iOS Mobile Tests on Manual Trigger" + secrets: inherit \ No newline at end of file From 48f4def4c6906f9b58044fc40d8d266eb04f1737 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 31 May 2024 15:53:00 +0530 Subject: [PATCH 191/362] Add run types --- .github/workflows/e2e-detox.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 285d84369be..921f6b9e928 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -26,6 +26,7 @@ on: required: false jobs: + run-ios-tests-on-pr: name: iOS Mobile Tests uses: ./.github/workflows/e2e-detox-ci-template.yml @@ -41,19 +42,21 @@ jobs: run-android-tests: false remove-pr-label: true commit_sha: "${{ inputs.commit_sha || github.event.pull_request.head.sha || github.sha }}" - status_check_context: "Detox iOS Mobile Tests" + status_check_context: "Detox iOS Mobile Tests on PR" + run-type: 'PR' secrets: inherit run-ios-tests-on-release: name: iOS Mobile Tests on Release uses: ./.github/workflows/e2e-detox-ci-template.yml - if: ${{ startsWith(github.ref, 'refs/heads/release-') }} + if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release-') }} with: run-ios-tests: true run-android-tests: false remove-pr-label: false commit_sha: "${{ github.sha }}" status_check_context: "Detox iOS Mobile Tests on Release" + run-type: 'RELEASE' secrets: inherit run-ios-tests-on-main-scheduled: @@ -66,6 +69,7 @@ jobs: remove-pr-label: false commit_sha: "${{ github.sha }}" status_check_context: "Detox iOS Mobile Tests on Main (Scheduled)" + run-type: 'MAIN' secrets: inherit run-ios-tests-on-manual-trigger: @@ -78,4 +82,5 @@ jobs: remove-pr-label: false commit_sha: "${{ inputs.commit_sha || github.sha }}" status_check_context: "Detox iOS Mobile Tests on Manual Trigger" + run-type: 'MANUAL' secrets: inherit \ No newline at end of file From f1dbbf357ecc41a88b010b18bd7402d78f188555 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 31 May 2024 16:09:12 +0530 Subject: [PATCH 192/362] Test E2E triggers (#7982) --- .github/workflows/e2e-detox.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 921f6b9e928..8eaf4bac0c3 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -8,7 +8,7 @@ on: - 'release-*' pull_request: branches: - - 'master' + - 'main' types: - labeled workflow_dispatch: @@ -83,4 +83,4 @@ jobs: commit_sha: "${{ inputs.commit_sha || github.sha }}" status_check_context: "Detox iOS Mobile Tests on Manual Trigger" run-type: 'MANUAL' - secrets: inherit \ No newline at end of file + secrets: inherit From 001d3f325d6f99eac000e57f8ecb592d229b316c Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 31 May 2024 16:18:21 +0530 Subject: [PATCH 193/362] Provide device option to avoide failures due to wrong input --- .github/workflows/e2e-detox.yml | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 8eaf4bac0c3..e7fe72b5a4a 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -17,18 +17,26 @@ on: description: 'Enter iOS version' required: false default: "iOS 17.4" + type: choice + options: + - "iOS 17.5" + - "iOS 17.4" + - "iOS 17.2" + - "iOS 17.0" device_name: description: 'Enter iOS Device Name' required: false default: "iPhone 15 Pro" - commit_sha: - type: string - required: false - + type: choice + options: + - "iPhone 15 Pro" + - "iPhone 15" + - "iPhone 14 Pro" + - "iPhone 14" jobs: run-ios-tests-on-pr: - name: iOS Mobile Tests + name: iOS Mobile Tests on PR uses: ./.github/workflows/e2e-detox-ci-template.yml if: ${{ ( From 386478408ad35e697b887e81d648254dcfda2aa5 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 1 Jun 2024 04:13:17 +0530 Subject: [PATCH 194/362] let jobs pass with test failures --- .github/workflows/e2e-detox-ci-template.yml | 44 ++++++--------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/.github/workflows/e2e-detox-ci-template.yml b/.github/workflows/e2e-detox-ci-template.yml index 51bd70093a3..afaef98bdb4 100644 --- a/.github/workflows/e2e-detox-ci-template.yml +++ b/.github/workflows/e2e-detox-ci-template.yml @@ -26,6 +26,11 @@ on: type: string required: false default: 'PR' + testcase_failure_fatal: + description: 'Should failures be considered fatal' + required: false + type: boolean + default: false env: AWS_REGION: 'us-east-1' @@ -219,9 +224,8 @@ jobs: echo "failures=${FAILURES}" >> $GITHUB_OUTPUT echo "Detox run completed with $FAILURES failures" - update-failure-final-status: + update-final-status: runs-on: ubuntu-22.04 - if: ${{ needs.download-e2e-results.outputs.failures > 0 }} needs: - generate-specs - download-e2e-results @@ -240,38 +244,14 @@ jobs: env: BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} - - uses: mattermost/actions/delivery/update-commit-status@main - env: - GITHUB_TOKEN: ${{ github.token }} - with: - repository_full_name: ${{ github.repository }} - commit_sha: ${{ inputs.commit_sha }} - context: ${{ inputs.status_check_context }} - description: | - Completed with ${{ needs.download-e2e-results.outputs.failures }} failures - status: failure - target_url: ${{ env.TARGET_URL }} - - update-success-final-status: - runs-on: ubuntu-22.04 - if: ${{ needs.download-e2e-results.outputs.failures == 0 }} - needs: - - generate-specs - - download-e2e-results - steps: - - name: Set Target URL - id: set-url + - name: Determine Status + id: determine-status run: | - s3Folder="${{ env.BUILD_ID }}-${{ env.COMMIT_HASH }}-${{ env.BRANCH }}" - s3Folder=$(echo "$s3Folder" | sed 's/\./-/g') - - if ${{ inputs.run-ios-tests }}; then - echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/ios-report.html" >> $GITHUB_ENV + if [[ ${{ needs.download-e2e-results.outputs.failures }} -gt 0 && "${{ inputs.testcase_failure_fatal }}" == "true" ]]; then + echo "status=failure" >> $GITHUB_ENV else - echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/android-report.html" >> $GITHUB_ENV + echo "status=success" >> $GITHUB_ENV fi - env: - BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} - uses: mattermost/actions/delivery/update-commit-status@main env: @@ -282,7 +262,7 @@ jobs: context: ${{ inputs.status_check_context }} description: | Completed with ${{ needs.download-e2e-results.outputs.failures }} failures - status: success + status: ${{ env.status }} target_url: ${{ env.TARGET_URL }} e2e-remove-label: From 7264340b055d97daf1030622ba9b1d473f754e9d Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 1 Jun 2024 15:53:59 +0530 Subject: [PATCH 195/362] remove input.github_sha --- .github/workflows/e2e-detox.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index e7fe72b5a4a..646b2674893 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -49,7 +49,7 @@ jobs: run-ios-tests: true run-android-tests: false remove-pr-label: true - commit_sha: "${{ inputs.commit_sha || github.event.pull_request.head.sha || github.sha }}" + commit_sha: "${{ github.event.pull_request.head.sha || github.sha }}" status_check_context: "Detox iOS Mobile Tests on PR" run-type: 'PR' secrets: inherit @@ -88,7 +88,7 @@ jobs: run-ios-tests: true run-android-tests: false remove-pr-label: false - commit_sha: "${{ inputs.commit_sha || github.sha }}" + commit_sha: "${{ github.sha }}" status_check_context: "Detox iOS Mobile Tests on Manual Trigger" run-type: 'MANUAL' secrets: inherit From 1e851bffdceed34f8f7b388cba1dd06f29276bb5 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 1 Jun 2024 16:09:04 +0530 Subject: [PATCH 196/362] circelci service to run avd --- .github/workflows/e2e-detox.yml | 216 +++----------------------------- 1 file changed, 20 insertions(+), 196 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index c40701632dd..1279559f846 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -67,77 +67,6 @@ jobs: device: ${{ env.DEVICE_NAME }} os_version: ${{ env.DEVICE_OS_VERSION }} - # build-ios-simulator: - # runs-on: macos-14-large - # steps: - # - name: Checkout Repository - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - # - name: Prepare iOS Build - # uses: ./.github/actions/prepare-ios-build - - # - name: Build iOS Simulator - # env: - # TAG: "${{ github.ref_name }}" - # AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" - # AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" - # GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" - # run: bundle exec fastlane ios simulator --env ios.simulator || true - # working-directory: ./fastlane - - # - name: Upload iOS Simulator Build - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: ios-build-simulator-${{ github.run_id }} - # path: Mattermost-simulator-x86_64.app.zip - - # e2e-ios: - # env: - # IOS: true - # runs-on: macos-14-large - # name: ios-detox-e2e-${{ matrix.runId }} - # needs: - # - generate-specs - # - build-ios-simulator - # strategy: - # fail-fast: false - # matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} - # steps: - # - name: Checkout Repository - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - # - name: Set Build ID - # run: echo "BUILD_ID=${{ github.run_id }}-${{ env.BUILD_SUFFIX }}" >> $GITHUB_ENV - - # - name: Install Homebrew Dependencies - # run: | - # brew tap wix/brew - # brew install applesimutils - # - name: Download iOS Simulator Build - # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - # with: - # name: ios-build-simulator-${{ github.run_id }} - # path: mobile-artifacts - - # - name: Unzip iOS Simulator Build - # run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ - - # - name: Start React Native Metro Server - # run: npm run start & - - # - name: Install Detox Dependencies - # run: cd detox && npm ci - - # - name: Run Detox E2E Tests - # run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} - - # - name: Upload iOS Test Report - # if: always() - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: ios-results-${{ matrix.runId }} - # path: detox/artifacts/ - build-android-apk-on-mac: # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') runs-on: macos-14-large @@ -188,101 +117,14 @@ jobs: name: android-build-apk-${{ github.run_id }} path: "android/app/build/outputs/apk/**/app-*.apk" - # e2e-android: - # # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') - # env: - # IOS: false - # GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - # API_LEVEL: 31 - # ANDROID_EMULATOR_IMAGE: 'system-images;android-33;google_apis;x86_64' - # ANDROID_EMULATOR_NAME: 'pixel_6_pro_android_33' - # ANDROID_EMULATOR_DEVICE: 'pixel_6_pro' - # runs-on: ubuntu-22.04 - # name: android-detox-e2e-${{ matrix.runId }} - # needs: - # - generate-specs - # - build-android-apk-on-mac - # strategy: - # fail-fast: false - # matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} - # steps: - # - name: Checkout Repository - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - # - name: Install required libraries for emulator - # run: sudo apt-get install libpulse0 libpulse-dev - - # - name: ci/prepare-node-deps - # uses: ./.github/actions/prepare-node-deps - - # - name: Set up Android SDK - # uses: android-actions/setup-android@v2 - # with: - # android-sdk-tools: 'latest' - # android-emulator-image: ${{ env.ANDROID_EMULATOR_IMAGE }} - # android-emulator-name: ${{ env.ANDROID_EMULATOR_NAME }} - # android-emulator-device: ${{ env.ANDROID_EMULATOR_DEVICE }} - - # - name: Liberate disk space - # uses: jlumbroso/free-disk-space@main - # with: - # tool-cache: false - # android: false - # dotnet: true - # haskell: true - # large-packages: false - # docker-images: true - # swap-storage: false - - # - name: Enable KVM - # run: | - # echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - # sudo udevadm control --reload-rules - # sudo udevadm trigger --name-match=kvm - - # - name: Gradle cache - # uses: gradle/actions/setup-gradle@v3 - - # - name: AVD cache - # uses: actions/cache@v4 - # id: avd-cache - # with: - # path: | - # ~/.android/avd/* - # ~/.android/adb* - # key: avd-${{ env.API_LEVEL }} - - # - name: Download Android APK - # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - # with: - # name: android-build-apk-${{ github.run_id }} - # path: android/app/build/outputs/apk/ - - # - name: List files in android/app/build/outputs/apk/ - # run: ls -l android/app/build/outputs/apk/ - - # - name: Start React Native Metro Server - # run: npm run start & - - # - name: Install Detox Dependencies - # run: cd detox && npm i - - # - name: Detox test - # uses: reactivecircus/android-emulator-runner@v2 - # with: - # api-level: 31 - # arch: x86_64 - # avd-name: pixel_6_pro - # script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - # - name: Upload Android Test Report - # if: always() - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: android-results-${{ matrix.runId }} - # path: detox/artifacts - - e2e-android-Pixel: + e2e-android: + services: + docker: + image: circleci/android:api-29 + options: --privileged + ports: + - 5566:5566 + - 5567:5567 # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') env: IOS: false @@ -316,46 +158,29 @@ jobs: docker-images: true swap-storage: false - - name: Change Android Emulator settings - run: | - echo "vm.heapSize=576" >> $HOME/.android/avd/$AVD_NAME.avd/config.ini - echo "hw.ramSize=2048" >> $HOME/.android/avd/$AVD_NAME.avd/config.ini - echo "disk.dataPartition.size=2048m" >> $HOME/.android/avd/$AVD_NAME.avd/config.ini - grep "size" $HOME/.android/avd/$AVD_NAME.avd/config.ini - env: - AVD_NAME: Pixel_6_Pro_API_33 - - - name: Android Emulator - timeout-minutes: 10 - continue-on-error: true - run: | - echo "Starting emulator" - nohup $ANDROID_HOME/emulator/emulator -verbose -no-audio -no-snapshot -no-window -gpu swiftshader_indirect @Pixel_5 & - # nohup $ANDROID_HOME/emulator/emulator -verbose -no-audio -no-snapshot -no-window -partition-size 2048 @Pixel_5 & - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' - $ANDROID_HOME/platform-tools/adb devices - echo "Emulator started" - - name: Download Android APK uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: name: android-build-apk-${{ github.run_id }} path: android/app/build/outputs/apk/ + - name: Set up Android SDK + uses: android-actions/setup-android@v2 + with: + api-level: 29 + build-tools-version: 29.0.3 + + - name: Start AVD + run: | + sudo $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window -gpu swiftshader_indirect & + adb wait-for-device + - name: Start React Native Metro Server run: npm run start & - name: Install Detox Dependencies run: cd detox && npm i - - name: Detox test - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: 31 - arch: x86_64 - avd-name: pixel_6_pro - script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - name: Upload Android Test Report if: always() uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 @@ -368,8 +193,7 @@ jobs: # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) needs: - generate-specs - # - e2e-ios - - e2e-android-Pixel + - e2e-android steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 From 6a573fea2780ffcc3e74f981f88ad6adca7fa6d5 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 1 Jun 2024 16:57:42 +0530 Subject: [PATCH 197/362] create avd --- .github/workflows/e2e-detox.yml | 52 ++++++++++++++++++++++++++++----- detox/.detoxrc.json | 2 +- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 1279559f846..ae997391dec 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -12,7 +12,26 @@ on: types: - labeled - opened - + workflow_dispatch: + inputs: + api-level: + description: 'Android API Level' + required: true + default: '29' + type: choice + options: + - '29' + - '30' + - '31' + device: + description: 'Device Type' + required: true + default: 'Pixel_3' + type: choice + options: + - 'Pixel_3' + - 'Pixel_4' + concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} cancel-in-progress: true @@ -102,8 +121,8 @@ jobs: cache: "gradle" - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v3 - + uses: gradle/actions/wrapper-validation@v3 + - name: Detox build run: | cd detox @@ -167,20 +186,37 @@ jobs: - name: Set up Android SDK uses: android-actions/setup-android@v2 with: - api-level: 29 - build-tools-version: 29.0.3 - + api-level: ${{ github.event.inputs['api-level'] }} + build-tools-version: ${{ github.event.inputs['api-level'] }}.0.3 + + - name: Create AVD + run: | + echo "no" | avdmanager create avd -n test -k "system-images;android-${{ github.event.inputs['api-level'] }};google_apis;x86" -d ${{ github.event.inputs['device'] }} + $ANDROID_HOME/emulator/emulator -list-avds + shell: bash + + - name: Update detoxrc.json + run: | + sed -i 's/"avdName": "Pixel_3_API_29"/"avdName": "test"/' detoxrc.json + shell: bash + - name: Start AVD run: | - sudo $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window -gpu swiftshader_indirect & + $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window -gpu swiftshader_indirect & adb wait-for-device - + adb devices + shell: bash + - name: Start React Native Metro Server run: npm run start & - name: Install Detox Dependencies run: cd detox && npm i + - name: Run Detox E2E Tests + continue-on-error: true + run: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + - name: Upload Android Test Report if: always() uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 9b919eac0ec..916f5e2fada 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -37,7 +37,7 @@ "android": { "type": "android.emulator", "device": { - "avdName": "Pixel_6_Pro_API_33" + "avdName": "Pixel_3_API_29" } } }, From f53e5e6593875b894562ae93f72b4c91a9f77aa3 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 2 Jun 2024 03:52:37 +0530 Subject: [PATCH 198/362] create avd --- .github/workflows/e2e-detox.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index ae997391dec..aca5f4dcc78 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -31,7 +31,7 @@ on: options: - 'Pixel_3' - 'Pixel_4' - + concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} cancel-in-progress: true @@ -139,7 +139,7 @@ jobs: e2e-android: services: docker: - image: circleci/android:api-29 + image: circleci/android:api-${{ inputs.api-level }} options: --privileged ports: - 5566:5566 @@ -186,12 +186,12 @@ jobs: - name: Set up Android SDK uses: android-actions/setup-android@v2 with: - api-level: ${{ github.event.inputs['api-level'] }} - build-tools-version: ${{ github.event.inputs['api-level'] }}.0.3 + api-level: ${{ inputs.api-level }} + build-tools-version: ${{ inputs.api-level }} - name: Create AVD run: | - echo "no" | avdmanager create avd -n test -k "system-images;android-${{ github.event.inputs['api-level'] }};google_apis;x86" -d ${{ github.event.inputs['device'] }} + echo "no" | avdmanager create avd -n test -k "system-images;android-${{ inputs.api-level }};google_apis;x86" -d ${{ inputs.device }} $ANDROID_HOME/emulator/emulator -list-avds shell: bash From 768a9a85ba1fdaeb02c8b1302b5b593ac5834451 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 3 Jun 2024 14:49:21 +0530 Subject: [PATCH 199/362] test running AVD --- .github/workflows/e2e-detox.yml | 133 ++++++++++++++++++-------------- 1 file changed, 75 insertions(+), 58 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index aca5f4dcc78..21d7ed004d8 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -14,7 +14,7 @@ on: - opened workflow_dispatch: inputs: - api-level: + apiLevel: description: 'Android API Level' required: true default: '29' @@ -86,64 +86,57 @@ jobs: device: ${{ env.DEVICE_NAME }} os_version: ${{ env.DEVICE_OS_VERSION }} - build-android-apk-on-mac: - # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') - runs-on: macos-14-large - env: - ORG_GRADLE_PROJECT_jvmargs: -Xmx8g - steps: - - name: ci/checkout-repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - with: - ref: ${{ github.event.pull_request.head.sha }} + # build-android-apk-on-mac: + # # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + # runs-on: macos-14-large + # env: + # ORG_GRADLE_PROJECT_jvmargs: -Xmx8g + # steps: + # - name: ci/checkout-repo + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + # with: + # ref: ${{ github.event.pull_request.head.sha }} - - name: ci/prepare-android-build - uses: ./.github/actions/prepare-android-build - env: - STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" - STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" - STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" - MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + # - name: ci/prepare-android-build + # uses: ./.github/actions/prepare-android-build + # env: + # STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + # STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + # STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + # MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - name: Cache Gradle dependencies - uses: actions/cache@v2 - with: - path: ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- + # - name: Cache Gradle dependencies + # uses: actions/cache@v2 + # with: + # path: ~/.gradle/caches + # key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + # restore-keys: | + # ${{ runner.os }}-gradle- - - name: Install Java - uses: actions/setup-java@v4 - with: - java-version: "17" - distribution: "adopt" - cache: "gradle" + # - name: Install Java + # uses: actions/setup-java@v4 + # with: + # java-version: "17" + # distribution: "adopt" + # cache: "gradle" - - name: Validate Gradle wrapper - uses: gradle/actions/wrapper-validation@v3 + # - name: Validate Gradle wrapper + # uses: gradle/actions/wrapper-validation@v3 - - name: Detox build - run: | - cd detox - npm install - npm install -g detox-cli - npm run e2e:android-build + # - name: Detox build + # run: | + # cd detox + # npm install + # npm install -g detox-cli + # npm run e2e:android-build - - name: ci/upload-android-pr-build - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-build-apk-${{ github.run_id }} - path: "android/app/build/outputs/apk/**/app-*.apk" + # - name: ci/upload-android-pr-build + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-build-apk-${{ github.run_id }} + # path: "android/app/build/outputs/apk/**/app-*.apk" e2e-android: - services: - docker: - image: circleci/android:api-${{ inputs.api-level }} - options: --privileged - ports: - - 5566:5566 - - 5567:5567 # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') env: IOS: false @@ -152,7 +145,7 @@ jobs: name: android-detox-e2e-${{ matrix.runId }} needs: - generate-specs - - build-android-apk-on-mac + # - build-android-apk-on-mac strategy: fail-fast: false matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} @@ -184,15 +177,25 @@ jobs: path: android/app/build/outputs/apk/ - name: Set up Android SDK - uses: android-actions/setup-android@v2 - with: - api-level: ${{ inputs.api-level }} - build-tools-version: ${{ inputs.api-level }} + env: + ANDROID_SDK_ROOT: ${{ runner.temp }}/android-sdk + run: | + sudo apt-get update -y + sudo apt-get install -y curl unzip + curl -o sdk-tools-linux.zip https://dl.google.com/android/repository/commandlinetools-linux-7302050_latest.zip + mkdir -p $ANDROID_SDK_ROOT/cmdline-tools + unzip -q sdk-tools-linux.zip -d $ANDROID_SDK_ROOT/cmdline-tools + mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/tools + yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "platform-tools" "emulator" "platforms;android-${{ github.event.inputs['api-level'] }}" "build-tools;${{ github.event.inputs['api-level'] }}.0.3" "system-images;android-${{ github.event.inputs['api-level'] }};google_apis;x86" + yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --licenses + shell: bash - name: Create AVD + env: + ANDROID_SDK_ROOT: ${{ runner.temp }}/android-sdk run: | - echo "no" | avdmanager create avd -n test -k "system-images;android-${{ inputs.api-level }};google_apis;x86" -d ${{ inputs.device }} - $ANDROID_HOME/emulator/emulator -list-avds + echo "no" | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/avdmanager create avd -n test -k "system-images;android-${{ github.event.inputs['api-level'] }};google_apis;x86" -d "${{ github.event.inputs['device'] }}" + $ANDROID_SDK_ROOT/emulator/emulator -list-avds shell: bash - name: Update detoxrc.json @@ -200,6 +203,20 @@ jobs: sed -i 's/"avdName": "Pixel_3_API_29"/"avdName": "test"/' detoxrc.json shell: bash + - name: Start AVD + env: + ANDROID_SDK_ROOT: ${{ runner.temp }}/android-sdk + run: | + $ANDROID_SDK_ROOT/emulator/emulator -avd test -no-audio -no-window -gpu swiftshader_indirect & + adb wait-for-device + adb devices + shell: bash + + - name: Update detoxrc.json + run: | + sed -i 's/"avdName": "Pixel_3_API_29"/"avdName": "test"/' detoxrc.json + shell: bash + - name: Start AVD run: | $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window -gpu swiftshader_indirect & From efc2dceb047a9bfb4151023b9054f94e2c376c4a Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 3 Jun 2024 14:52:08 +0530 Subject: [PATCH 200/362] test running AVD --- .github/workflows/e2e-detox.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 21d7ed004d8..abec97c372d 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -170,11 +170,11 @@ jobs: docker-images: true swap-storage: false - - name: Download Android APK - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - name: android-build-apk-${{ github.run_id }} - path: android/app/build/outputs/apk/ + # - name: Download Android APK + # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # with: + # name: android-build-apk-${{ github.run_id }} + # path: android/app/build/outputs/apk/ - name: Set up Android SDK env: From bb7c71e4198a1dfcadebe511b5ecc46c59a3ebcc Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 3 Jun 2024 14:58:10 +0530 Subject: [PATCH 201/362] test running AVD --- .github/workflows/e2e-detox.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index abec97c372d..6edb59ce301 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -186,7 +186,7 @@ jobs: mkdir -p $ANDROID_SDK_ROOT/cmdline-tools unzip -q sdk-tools-linux.zip -d $ANDROID_SDK_ROOT/cmdline-tools mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/tools - yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "platform-tools" "emulator" "platforms;android-${{ github.event.inputs['api-level'] }}" "build-tools;${{ github.event.inputs['api-level'] }}.0.3" "system-images;android-${{ github.event.inputs['api-level'] }};google_apis;x86" + yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "platform-tools" "emulator" "platforms;android-${{ inputs.apiLevel }}" "build-tools;${{ inputs.apiLevel }}.0.3" "system-images;android-${{ inputs.apiLevel }};google_apis;x86" yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --licenses shell: bash @@ -223,7 +223,7 @@ jobs: adb wait-for-device adb devices shell: bash - + - name: Start React Native Metro Server run: npm run start & From 25080e35a91ed15d1ddc23b9ad62285134a0e046 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 3 Jun 2024 15:10:19 +0530 Subject: [PATCH 202/362] test running AVD - test run 1 --- .github/workflows/e2e-detox.yml | 54 +++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 6edb59ce301..9edf77e1e92 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -37,6 +37,8 @@ concurrency: cancel-in-progress: true env: + API_LEVEL: ${ ${{ inputs.apiLevel }} || "29" } + DEVICE: ${ ${{ inputs.device }} || "Pixel_3" } AWS_REGION: 'us-east-1' ADMIN_EMAIL: ${{ secrets.MM_MOBILE_E2E_ADMIN_EMAIL }} ADMIN_USERNAME: ${{ secrets.MM_MOBILE_E2E_ADMIN_USERNAME }} @@ -186,7 +188,7 @@ jobs: mkdir -p $ANDROID_SDK_ROOT/cmdline-tools unzip -q sdk-tools-linux.zip -d $ANDROID_SDK_ROOT/cmdline-tools mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/tools - yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "platform-tools" "emulator" "platforms;android-${{ inputs.apiLevel }}" "build-tools;${{ inputs.apiLevel }}.0.3" "system-images;android-${{ inputs.apiLevel }};google_apis;x86" + yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "platform-tools" "emulator" "platforms;android-${{ env.API_LEVEL }}" "build-tools;${{ env.API_LEVEL }}.0.3" "system-images;android-${{ env.API_LEVEL }};google_apis;x86" yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --licenses shell: bash @@ -194,7 +196,7 @@ jobs: env: ANDROID_SDK_ROOT: ${{ runner.temp }}/android-sdk run: | - echo "no" | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/avdmanager create avd -n test -k "system-images;android-${{ github.event.inputs['api-level'] }};google_apis;x86" -d "${{ github.event.inputs['device'] }}" + echo "no" | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/avdmanager create avd -n test -k "system-images;android-${{ env.API_LEVEL }};google_apis;x86" -d "${{ env.DEVICE }}" $ANDROID_SDK_ROOT/emulator/emulator -list-avds shell: bash @@ -241,6 +243,54 @@ jobs: name: android-results-${{ matrix.runId }} path: detox/artifacts + test-android: + name: Run Android Detox Tests + runs-on: macos-latest + needs: + - generate-specs + env: + AVD_NAME: Pixel_3a_API_33 + AVD_PACKAGE: system-images;android-33;google_apis;x86_64 + strategy: + matrix: + specs: ${{fromJson(needs.generate-specs.outputs.specs)}} + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'zulu' + + - name: Create Android Virtual Device + run: | + echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name ${{ env.AVD_NAME }} --package ${{ env.AVD_PACKAGE }} --device "pixel_3a" + $ANDROID_HOME/emulator/emulator -list-avds + echo "with_newline=$($ANDROID_HOME/emulator/emulator -list-avds | grep ${{ env.AVD_NAME }})" + echo $with_newline + + - name: Run Android Emulator + run: | + echo "Starting emulator" + nohup $ANDROID_HOME/emulator/emulator -avd ${{ env.AVD_NAME }} -no-audio -no-boot-anim -accel auto & + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 3; done; input keyevent 82' + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm i + + - name: Run Detox E2E Tests + continue-on-error: true + run: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + + - name: Upload Android Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-results-${{ matrix.runId }} + path: detox/artifacts + download-e2e-results: runs-on: ubuntu-22.04 # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) From c113f28235ac1cc1ab71c74d66121e579b9c8e1b Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 3 Jun 2024 15:14:19 +0530 Subject: [PATCH 203/362] test running AVD - test run 2 --- .github/workflows/e2e-detox.yml | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 9edf77e1e92..ece3ae3fc29 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -188,7 +188,7 @@ jobs: mkdir -p $ANDROID_SDK_ROOT/cmdline-tools unzip -q sdk-tools-linux.zip -d $ANDROID_SDK_ROOT/cmdline-tools mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/tools - yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "platform-tools" "emulator" "platforms;android-${{ env.API_LEVEL }}" "build-tools;${{ env.API_LEVEL }}.0.3" "system-images;android-${{ env.API_LEVEL }};google_apis;x86" + yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "platform-tools" "emulator" "platforms;android-29" "build-tools;29.0.3" "system-images;android-29;google_apis;x86" yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --licenses shell: bash @@ -196,7 +196,7 @@ jobs: env: ANDROID_SDK_ROOT: ${{ runner.temp }}/android-sdk run: | - echo "no" | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/avdmanager create avd -n test -k "system-images;android-${{ env.API_LEVEL }};google_apis;x86" -d "${{ env.DEVICE }}" + echo "no" | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/avdmanager create avd -n test -k "system-images;android-29;google_apis;x86" -d "Pixel_3" $ANDROID_SDK_ROOT/emulator/emulator -list-avds shell: bash @@ -246,14 +246,10 @@ jobs: test-android: name: Run Android Detox Tests runs-on: macos-latest - needs: - - generate-specs env: AVD_NAME: Pixel_3a_API_33 AVD_PACKAGE: system-images;android-33;google_apis;x86_64 - strategy: - matrix: - specs: ${{fromJson(needs.generate-specs.outputs.specs)}} + steps: - uses: actions/checkout@v3 - uses: actions/setup-java@v3 @@ -282,14 +278,8 @@ jobs: - name: Run Detox E2E Tests continue-on-error: true - run: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + run: cd detox && npm run e2e:android-test - - name: Upload Android Test Report - if: always() - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-results-${{ matrix.runId }} - path: detox/artifacts download-e2e-results: runs-on: ubuntu-22.04 From b408c97bda9dfd8a43eef33ce0e2ad5b9bce4f42 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 3 Jun 2024 15:21:06 +0530 Subject: [PATCH 204/362] test running AVD - test run 3 --- .github/workflows/e2e-detox.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index ece3ae3fc29..a53422568b4 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -184,7 +184,7 @@ jobs: run: | sudo apt-get update -y sudo apt-get install -y curl unzip - curl -o sdk-tools-linux.zip https://dl.google.com/android/repository/commandlinetools-linux-7302050_latest.zip + curl -o sdk-tools-linux.zip https://dl.google.com/android/repository/commandlinetools-linux-7583922_latest.zip mkdir -p $ANDROID_SDK_ROOT/cmdline-tools unzip -q sdk-tools-linux.zip -d $ANDROID_SDK_ROOT/cmdline-tools mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/tools @@ -257,6 +257,15 @@ jobs: java-version: '11' distribution: 'zulu' + - name: Install XML Bind + run: | + mkdir -p ~/android-cmdline-tools/latest/package-cache + curl -o ~/android-cmdline-tools/latest/package-cache/xml-resolver-20041126.zip https://maven.googlesource.com/a/android/platform/libcore/+/refs/heads/master/xml/res/xml-resolver-20041126.zip + unzip ~/android-cmdline-tools/latest/package-cache/xml-resolver-20041126.zip -d ~/android-cmdline-tools/latest/xml-resolver + export ANDROID_HOME=${{ github.workspace }}/android-home + export CMDLINE_TOOLS_LATEST_PATH=$(find $ANDROID_HOME -name "cmdline-tools" | sort -r | head -n1) + ln -s ~/android-cmdline-tools/latest/xml-resolver $CMDLINE_TOOLS_LATEST_PATH/lib/xml-resolver + - name: Create Android Virtual Device run: | echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name ${{ env.AVD_NAME }} --package ${{ env.AVD_PACKAGE }} --device "pixel_3a" From f5388ad117b99d4a037c13acf379676279c2bba5 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 3 Jun 2024 15:39:00 +0530 Subject: [PATCH 205/362] test running AVD - test run 4 --- .github/workflows/e2e-detox.yml | 132 ++++++++------------------------ 1 file changed, 33 insertions(+), 99 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index a53422568b4..c46efd15d61 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -37,8 +37,6 @@ concurrency: cancel-in-progress: true env: - API_LEVEL: ${ ${{ inputs.apiLevel }} || "29" } - DEVICE: ${ ${{ inputs.device }} || "Pixel_3" } AWS_REGION: 'us-east-1' ADMIN_EMAIL: ${{ secrets.MM_MOBILE_E2E_ADMIN_EMAIL }} ADMIN_USERNAME: ${{ secrets.MM_MOBILE_E2E_ADMIN_USERNAME }} @@ -143,6 +141,7 @@ jobs: env: IOS: false GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" + API_LEVEL: 33 runs-on: ubuntu-22.04 name: android-detox-e2e-${{ matrix.runId }} needs: @@ -161,6 +160,9 @@ jobs: - name: ci/prepare-node-deps uses: ./.github/actions/prepare-node-deps + - name: Set up Android SDK + uses: android-actions/setup-android@v3 + - name: Liberate disk space uses: jlumbroso/free-disk-space@main with: @@ -172,59 +174,33 @@ jobs: docker-images: true swap-storage: false - # - name: Download Android APK - # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - # with: - # name: android-build-apk-${{ github.run_id }} - # path: android/app/build/outputs/apk/ - - - name: Set up Android SDK - env: - ANDROID_SDK_ROOT: ${{ runner.temp }}/android-sdk - run: | - sudo apt-get update -y - sudo apt-get install -y curl unzip - curl -o sdk-tools-linux.zip https://dl.google.com/android/repository/commandlinetools-linux-7583922_latest.zip - mkdir -p $ANDROID_SDK_ROOT/cmdline-tools - unzip -q sdk-tools-linux.zip -d $ANDROID_SDK_ROOT/cmdline-tools - mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/tools - yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "platform-tools" "emulator" "platforms;android-29" "build-tools;29.0.3" "system-images;android-29;google_apis;x86" - yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --licenses - shell: bash - - - name: Create AVD - env: - ANDROID_SDK_ROOT: ${{ runner.temp }}/android-sdk + - name: Enable KVM run: | - echo "no" | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/avdmanager create avd -n test -k "system-images;android-29;google_apis;x86" -d "Pixel_3" - $ANDROID_SDK_ROOT/emulator/emulator -list-avds - shell: bash + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm - - name: Update detoxrc.json - run: | - sed -i 's/"avdName": "Pixel_3_API_29"/"avdName": "test"/' detoxrc.json - shell: bash + - name: Gradle cache + uses: gradle/actions/setup-gradle@v3 - - name: Start AVD - env: - ANDROID_SDK_ROOT: ${{ runner.temp }}/android-sdk - run: | - $ANDROID_SDK_ROOT/emulator/emulator -avd test -no-audio -no-window -gpu swiftshader_indirect & - adb wait-for-device - adb devices - shell: bash - - - name: Update detoxrc.json - run: | - sed -i 's/"avdName": "Pixel_3_API_29"/"avdName": "test"/' detoxrc.json - shell: bash + - name: AVD cache + uses: actions/cache@v4 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* + key: avd-${{ env.API_LEVEL }} - - name: Start AVD + - name: Install Android System Image run: | - $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window -gpu swiftshader_indirect & - adb wait-for-device - adb devices - shell: bash + echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-33;google_apis;x86_64" --channel=4 + + # - name: Download Android APK + # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # with: + # name: android-build-apk-${{ github.run_id }} + # path: android/app/build/outputs/apk/ - name: Start React Native Metro Server run: npm run start & @@ -232,9 +208,13 @@ jobs: - name: Install Detox Dependencies run: cd detox && npm i - - name: Run Detox E2E Tests - continue-on-error: true - run: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + - name: Detox test + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: 33 + arch: x86_64 + avd-name: pixel_6_pro + script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - name: Upload Android Test Report if: always() @@ -243,52 +223,6 @@ jobs: name: android-results-${{ matrix.runId }} path: detox/artifacts - test-android: - name: Run Android Detox Tests - runs-on: macos-latest - env: - AVD_NAME: Pixel_3a_API_33 - AVD_PACKAGE: system-images;android-33;google_apis;x86_64 - - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 - with: - java-version: '11' - distribution: 'zulu' - - - name: Install XML Bind - run: | - mkdir -p ~/android-cmdline-tools/latest/package-cache - curl -o ~/android-cmdline-tools/latest/package-cache/xml-resolver-20041126.zip https://maven.googlesource.com/a/android/platform/libcore/+/refs/heads/master/xml/res/xml-resolver-20041126.zip - unzip ~/android-cmdline-tools/latest/package-cache/xml-resolver-20041126.zip -d ~/android-cmdline-tools/latest/xml-resolver - export ANDROID_HOME=${{ github.workspace }}/android-home - export CMDLINE_TOOLS_LATEST_PATH=$(find $ANDROID_HOME -name "cmdline-tools" | sort -r | head -n1) - ln -s ~/android-cmdline-tools/latest/xml-resolver $CMDLINE_TOOLS_LATEST_PATH/lib/xml-resolver - - - name: Create Android Virtual Device - run: | - echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name ${{ env.AVD_NAME }} --package ${{ env.AVD_PACKAGE }} --device "pixel_3a" - $ANDROID_HOME/emulator/emulator -list-avds - echo "with_newline=$($ANDROID_HOME/emulator/emulator -list-avds | grep ${{ env.AVD_NAME }})" - echo $with_newline - - - name: Run Android Emulator - run: | - echo "Starting emulator" - nohup $ANDROID_HOME/emulator/emulator -avd ${{ env.AVD_NAME }} -no-audio -no-boot-anim -accel auto & - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 3; done; input keyevent 82' - - - name: Start React Native Metro Server - run: npm run start & - - - name: Install Detox Dependencies - run: cd detox && npm i - - - name: Run Detox E2E Tests - continue-on-error: true - run: cd detox && npm run e2e:android-test - download-e2e-results: runs-on: ubuntu-22.04 From 6a7a5d7ef2ee8e2fdb895f90dde3e5728e982caa Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 3 Jun 2024 15:44:55 +0530 Subject: [PATCH 206/362] test set up java - test run 5 --- .github/workflows/e2e-detox.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index c46efd15d61..9d03b662d45 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -160,6 +160,12 @@ jobs: - name: ci/prepare-node-deps uses: ./.github/actions/prepare-node-deps + - name: Set up JDK 17 + uses: actions/setup-java@v2 + with: + distribution: 'temurin' + java-version: '17' + - name: Set up Android SDK uses: android-actions/setup-android@v3 From ceb4ca5ab720fb7b39ef8da46d136e54565ad769 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 3 Jun 2024 15:52:52 +0530 Subject: [PATCH 207/362] test remove creating android sys images - test run 6 --- .github/workflows/e2e-detox.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 9d03b662d45..93b3903000f 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -198,10 +198,6 @@ jobs: ~/.android/adb* key: avd-${{ env.API_LEVEL }} - - name: Install Android System Image - run: | - echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-33;google_apis;x86_64" --channel=4 - # - name: Download Android APK # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 # with: From c67a9786525a96da10f040d0c29d7e4c5094d4da Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 3 Jun 2024 16:03:38 +0530 Subject: [PATCH 208/362] test remove creating android sys images - test run 7 --- .github/workflows/e2e-detox.yml | 119 ++++++++++++++++++++++++++++++++ detox/.detoxrc.json | 2 +- 2 files changed, 120 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 93b3903000f..12dbd0c0dbb 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -197,6 +197,9 @@ jobs: ~/.android/avd/* ~/.android/adb* key: avd-${{ env.API_LEVEL }} + + - name: Grant ADB Permissions + run: sudo chmod 666 ${ANDROID_HOME}/platform-tools/adb # - name: Download Android APK # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 @@ -225,6 +228,122 @@ jobs: name: android-results-${{ matrix.runId }} path: detox/artifacts + e2e-android-2: + env: + IOS: false + GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" + API_LEVEL: 33 + runs-on: ubuntu-22.04 + name: android-detox-e2e-${{ matrix.runId }} + needs: + - generate-specs + strategy: + fail-fast: false + matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} + steps: + - name: Checkout Repository + uses: actions/checkout@v2 + + - name: Install required libraries for emulator + run: sudo apt-get install -y libpulse0 libpulse-dev + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Set up JDK 17 for build + uses: actions/setup-java@v2 + with: + distribution: 'temurin' + java-version: '17' + + - name: Set up JDK 8 for Android SDK setup + uses: actions/setup-java@v2 + with: + distribution: 'temurin' + java-version: '8' + id: setup-java-8 + + - name: Set up Android SDK + run: | + sudo apt-get update -y + sudo apt-get install -y curl unzip + curl -o sdk-tools-linux.zip https://dl.google.com/android/repository/commandlinetools-linux-7583922_latest.zip + mkdir -p $ANDROID_SDK_ROOT/cmdline-tools + unzip -q sdk-tools-linux.zip -d $ANDROID_SDK_ROOT/cmdline-tools + mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/tools + yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "platform-tools" "emulator" "platforms;android-${{ env.API_LEVEL }}" "build-tools;${{ env.API_LEVEL }}.0.3" "system-images;android-${{ env.API_LEVEL }};google_apis;x86_64" + yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --licenses + + - name: Liberate disk space + uses: jlumbroso/free-disk-space@main + with: + tool-cache: false + android: false + dotnet: true + haskell: true + large-packages: false + docker-images: true + swap-storage: false + + - name: Enable KVM + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + + - name: Gradle cache + uses: gradle/actions/setup-gradle@v3 + + - name: AVD cache + uses: actions/cache@v4 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* + key: avd-${{ env.API_LEVEL }} + + - name: Install Android System Image + run: | + echo "y" | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --install "system-images;android-${{ env.API_LEVEL }};google_apis;x86_64" --channel=4 + + - name: Create AVD + run: | + echo "no" | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/avdmanager create avd -n pixel_6_pro -k "system-images;android-${{ env.API_LEVEL }};google_apis;x86_64" -d "pixel_6_pro" + $ANDROID_SDK_ROOT/emulator/emulator -list-avds + + - name: Start AVD + run: | + $ANDROID_SDK_ROOT/emulator/emulator -avd pixel_6_pro -no-audio -no-window -gpu swiftshader_indirect & + adb wait-for-device + adb devices + + - name: Wait for emulator to fully boot + run: | + boot_completed="" + retry=0 + until [[ "$boot_completed" == "1" ]] || [[ $retry -gt 10 ]]; do + sleep 15 + boot_completed=$(adb -e shell getprop sys.boot_completed 2>/dev/null | tr -d '\r') + echo "Boot completed: $boot_completed" + retry=$((retry + 1)) + done + if [[ "$boot_completed" != "1" ]]; then + echo "Emulator failed to boot" + exit 1 + fi + + - name: Run Detox Tests + run: | + cd detox + npm run e2e:android -- ${{ matrix.specs }} + + - name: Upload Android Test Report + if: always() + uses: actions/upload-artifact@v2 + with: + name: android-results-${{ matrix.runId }} + path: detox/artifacts download-e2e-results: runs-on: ubuntu-22.04 diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 916f5e2fada..e87e3bd4f5b 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -37,7 +37,7 @@ "android": { "type": "android.emulator", "device": { - "avdName": "Pixel_3_API_29" + "avdName": "pixel_6_pro" } } }, From 11043a5a41bdfe74228689941f0e1702a3f37ac3 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 3 Jun 2024 16:10:11 +0530 Subject: [PATCH 209/362] build and run app -test 1 --- .github/workflows/e2e-detox.yml | 223 ++++++++------------------------ 1 file changed, 53 insertions(+), 170 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 12dbd0c0dbb..f9a5a93e16f 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -86,55 +86,55 @@ jobs: device: ${{ env.DEVICE_NAME }} os_version: ${{ env.DEVICE_OS_VERSION }} - # build-android-apk-on-mac: - # # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') - # runs-on: macos-14-large - # env: - # ORG_GRADLE_PROJECT_jvmargs: -Xmx8g - # steps: - # - name: ci/checkout-repo - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - # with: - # ref: ${{ github.event.pull_request.head.sha }} - - # - name: ci/prepare-android-build - # uses: ./.github/actions/prepare-android-build - # env: - # STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" - # STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" - # STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" - # MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - # - name: Cache Gradle dependencies - # uses: actions/cache@v2 - # with: - # path: ~/.gradle/caches - # key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - # restore-keys: | - # ${{ runner.os }}-gradle- + build-android-apk-on-mac: + # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + runs-on: macos-14-large + env: + ORG_GRADLE_PROJECT_jvmargs: -Xmx8g + steps: + - name: ci/checkout-repo + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + ref: ${{ github.event.pull_request.head.sha }} - # - name: Install Java - # uses: actions/setup-java@v4 - # with: - # java-version: "17" - # distribution: "adopt" - # cache: "gradle" - - # - name: Validate Gradle wrapper - # uses: gradle/actions/wrapper-validation@v3 - - # - name: Detox build - # run: | - # cd detox - # npm install - # npm install -g detox-cli - # npm run e2e:android-build - - # - name: ci/upload-android-pr-build - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: android-build-apk-${{ github.run_id }} - # path: "android/app/build/outputs/apk/**/app-*.apk" + - name: ci/prepare-android-build + uses: ./.github/actions/prepare-android-build + env: + STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + + - name: Cache Gradle dependencies + uses: actions/cache@v2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Install Java + uses: actions/setup-java@v4 + with: + java-version: "17" + distribution: "adopt" + cache: "gradle" + + - name: Validate Gradle wrapper + uses: gradle/actions/wrapper-validation@v3 + + - name: Detox build + run: | + cd detox + npm install + npm install -g detox-cli + npm run e2e:android-build + + - name: ci/upload-android-pr-build + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-build-apk-${{ github.run_id }} + path: "android/app/build/outputs/apk/**/app-*.apk" e2e-android: # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') @@ -201,11 +201,11 @@ jobs: - name: Grant ADB Permissions run: sudo chmod 666 ${ANDROID_HOME}/platform-tools/adb - # - name: Download Android APK - # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - # with: - # name: android-build-apk-${{ github.run_id }} - # path: android/app/build/outputs/apk/ + - name: Download Android APK + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + name: android-build-apk-${{ github.run_id }} + path: android/app/build/outputs/apk/ - name: Start React Native Metro Server run: npm run start & @@ -228,123 +228,6 @@ jobs: name: android-results-${{ matrix.runId }} path: detox/artifacts - e2e-android-2: - env: - IOS: false - GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - API_LEVEL: 33 - runs-on: ubuntu-22.04 - name: android-detox-e2e-${{ matrix.runId }} - needs: - - generate-specs - strategy: - fail-fast: false - matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} - steps: - - name: Checkout Repository - uses: actions/checkout@v2 - - - name: Install required libraries for emulator - run: sudo apt-get install -y libpulse0 libpulse-dev - - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps - - - name: Set up JDK 17 for build - uses: actions/setup-java@v2 - with: - distribution: 'temurin' - java-version: '17' - - - name: Set up JDK 8 for Android SDK setup - uses: actions/setup-java@v2 - with: - distribution: 'temurin' - java-version: '8' - id: setup-java-8 - - - name: Set up Android SDK - run: | - sudo apt-get update -y - sudo apt-get install -y curl unzip - curl -o sdk-tools-linux.zip https://dl.google.com/android/repository/commandlinetools-linux-7583922_latest.zip - mkdir -p $ANDROID_SDK_ROOT/cmdline-tools - unzip -q sdk-tools-linux.zip -d $ANDROID_SDK_ROOT/cmdline-tools - mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/tools - yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "platform-tools" "emulator" "platforms;android-${{ env.API_LEVEL }}" "build-tools;${{ env.API_LEVEL }}.0.3" "system-images;android-${{ env.API_LEVEL }};google_apis;x86_64" - yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --licenses - - - name: Liberate disk space - uses: jlumbroso/free-disk-space@main - with: - tool-cache: false - android: false - dotnet: true - haskell: true - large-packages: false - docker-images: true - swap-storage: false - - - name: Enable KVM - run: | - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm - - - name: Gradle cache - uses: gradle/actions/setup-gradle@v3 - - - name: AVD cache - uses: actions/cache@v4 - id: avd-cache - with: - path: | - ~/.android/avd/* - ~/.android/adb* - key: avd-${{ env.API_LEVEL }} - - - name: Install Android System Image - run: | - echo "y" | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --install "system-images;android-${{ env.API_LEVEL }};google_apis;x86_64" --channel=4 - - - name: Create AVD - run: | - echo "no" | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/avdmanager create avd -n pixel_6_pro -k "system-images;android-${{ env.API_LEVEL }};google_apis;x86_64" -d "pixel_6_pro" - $ANDROID_SDK_ROOT/emulator/emulator -list-avds - - - name: Start AVD - run: | - $ANDROID_SDK_ROOT/emulator/emulator -avd pixel_6_pro -no-audio -no-window -gpu swiftshader_indirect & - adb wait-for-device - adb devices - - - name: Wait for emulator to fully boot - run: | - boot_completed="" - retry=0 - until [[ "$boot_completed" == "1" ]] || [[ $retry -gt 10 ]]; do - sleep 15 - boot_completed=$(adb -e shell getprop sys.boot_completed 2>/dev/null | tr -d '\r') - echo "Boot completed: $boot_completed" - retry=$((retry + 1)) - done - if [[ "$boot_completed" != "1" ]]; then - echo "Emulator failed to boot" - exit 1 - fi - - - name: Run Detox Tests - run: | - cd detox - npm run e2e:android -- ${{ matrix.specs }} - - - name: Upload Android Test Report - if: always() - uses: actions/upload-artifact@v2 - with: - name: android-results-${{ matrix.runId }} - path: detox/artifacts - download-e2e-results: runs-on: ubuntu-22.04 # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) From f6f6f59db469fadd5dc0e86d57afb2d26771120a Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 3 Jun 2024 16:12:37 +0530 Subject: [PATCH 210/362] build and run app -test 1 --- .github/workflows/e2e-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index f9a5a93e16f..a6d2e60439b 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -146,7 +146,7 @@ jobs: name: android-detox-e2e-${{ matrix.runId }} needs: - generate-specs - # - build-android-apk-on-mac + - build-android-apk-on-mac strategy: fail-fast: false matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} From f63766294824b7e44555ecd133e743fd479fc89c Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 3 Jun 2024 23:06:28 +0530 Subject: [PATCH 211/362] run test -1 --- .github/workflows/e2e-detox.yml | 62 ++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index a6d2e60439b..db73a37e345 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -142,6 +142,9 @@ jobs: IOS: false GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" API_LEVEL: 33 + ARCH: x86_64 + DETOX_CONFIGURATION: android.emu.release + runs-on: ubuntu-22.04 name: android-detox-e2e-${{ matrix.runId }} needs: @@ -154,6 +157,12 @@ jobs: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Enable KVM + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + - name: Install required libraries for emulator run: sudo apt-get install libpulse0 libpulse-dev @@ -163,9 +172,13 @@ jobs: - name: Set up JDK 17 uses: actions/setup-java@v2 with: + cache: gradle distribution: 'temurin' java-version: '17' + - name: Gradle cache + uses: gradle/actions/setup-gradle@v3 + - name: Set up Android SDK uses: android-actions/setup-android@v3 @@ -180,15 +193,6 @@ jobs: docker-images: true swap-storage: false - - name: Enable KVM - run: | - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm - - - name: Gradle cache - uses: gradle/actions/setup-gradle@v3 - - name: AVD cache uses: actions/cache@v4 id: avd-cache @@ -197,29 +201,55 @@ jobs: ~/.android/avd/* ~/.android/adb* key: avd-${{ env.API_LEVEL }} - - - name: Grant ADB Permissions - run: sudo chmod 666 ${ANDROID_HOME}/platform-tools/adb + - name: Create AVD and generate snapshot for caching + if: steps.avd-cache.outputs.cache-hit != 'true' + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: ${{ env.API_LEVEL }} + arch: ${{ env.ARCH }} + disable-animations: false + emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + force-avd-creation: false + script: echo 'Generated AVD snapshot for caching.' + - name: Download Android APK uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: name: android-build-apk-${{ github.run_id }} path: android/app/build/outputs/apk/ + - name: Get device name + id: device + run: | + AVD_NAME=$(node -p "require('./detox/.detoxrc.json').devices.android.device.avdName") + echo "AVD_NAME=$AVD_NAME" >> $GITHUB_OUTPUT + - name: Start React Native Metro Server run: npm run start & - name: Install Detox Dependencies run: cd detox && npm i + # - name: Detox test + # uses: reactivecircus/android-emulator-runner@v2 + # with: + # api-level: 33 + # arch: x86_64 + # avd-name: pixel_6_pro + # script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + - name: Detox test uses: reactivecircus/android-emulator-runner@v2 with: - api-level: 33 - arch: x86_64 - avd-name: pixel_6_pro - script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + api-level: ${{ env.API_LEVEL }} + arch: ${{ env.ARCH }} + avd-name: ${{ steps.device.outputs.AVD_NAME }} + disable-animations: true + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + force-avd-creation: false + script: > + cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - name: Upload Android Test Report if: always() From 11f0b7ee3b8c78d5c93d95749954af4e2a41dabf Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 4 Jun 2024 00:11:57 +0530 Subject: [PATCH 212/362] run test -2 --- .github/actions/prepare-android-build/action.yaml | 2 +- .github/actions/prepare-node-deps/action.yaml | 2 +- .github/workflows/e2e-detox.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/actions/prepare-android-build/action.yaml b/.github/actions/prepare-android-build/action.yaml index 44dab693b70..b99be1ba30b 100644 --- a/.github/actions/prepare-android-build/action.yaml +++ b/.github/actions/prepare-android-build/action.yaml @@ -30,7 +30,7 @@ runs: - name: ci/checkout-private-repo if: ${{ inputs.sign == 'true' }} - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: repository: mattermost/mattermost-mobile-private token: ${{ env.MATTERMOST_BUILD_GH_TOKEN }} diff --git a/.github/actions/prepare-node-deps/action.yaml b/.github/actions/prepare-node-deps/action.yaml index 655fa308f37..31ee878383b 100644 --- a/.github/actions/prepare-node-deps/action.yaml +++ b/.github/actions/prepare-node-deps/action.yaml @@ -5,7 +5,7 @@ runs: using: composite steps: - name: ci/setup-node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: node-version-file: ".nvmrc" cache: "npm" diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index db73a37e345..083eaffcd4e 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -106,7 +106,7 @@ jobs: MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - name: Cache Gradle dependencies - uses: actions/cache@v2 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: ~/.gradle/caches key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} From 74672db1987595ecb6be3887a8b54093bcc4750e Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 4 Jun 2024 00:14:28 +0530 Subject: [PATCH 213/362] separate template for android --- .../workflows/e2e-detox-android-template.yml | 323 +++++++++++++++ .github/workflows/e2e-detox.yml | 383 ++++-------------- 2 files changed, 400 insertions(+), 306 deletions(-) create mode 100644 .github/workflows/e2e-detox-android-template.yml diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml new file mode 100644 index 00000000000..083eaffcd4e --- /dev/null +++ b/.github/workflows/e2e-detox-android-template.yml @@ -0,0 +1,323 @@ +name: Detox E2E Tests + +on: + push: + branches: + - main + - add_e2e_android + pull_request: + branches: + - ios_detox_job + - main + types: + - labeled + - opened + workflow_dispatch: + inputs: + apiLevel: + description: 'Android API Level' + required: true + default: '29' + type: choice + options: + - '29' + - '30' + - '31' + device: + description: 'Device Type' + required: true + default: 'Pixel_3' + type: choice + options: + - 'Pixel_3' + - 'Pixel_4' + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: true + +env: + AWS_REGION: 'us-east-1' + ADMIN_EMAIL: ${{ secrets.MM_MOBILE_E2E_ADMIN_EMAIL }} + ADMIN_USERNAME: ${{ secrets.MM_MOBILE_E2E_ADMIN_USERNAME }} + ADMIN_PASSWORD: ${{ secrets.MM_MOBILE_E2E_ADMIN_PASSWORD }} + BRANCH: ${{ github.head_ref || github.ref_name }} + COMMIT_HASH: ${{ github.sha }} + DETOX_AWS_S3_BUCKET: 'mattermost-detox-report' + DETOX_AWS_ACCESS_KEY_ID: ${{ secrets.MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID }} + DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }} + HEADLESS: 'true' + TYPE: 'PR' + PULL_REQUEST: 'https://github.com/mattermost/mattermost-mobile/pull/${{ github.event.number }}' + SITE_1_URL: ${{ secrets.MM_MOBILE_E2E_SITE_1_URL }} + SITE_2_URL: ${{ secrets.MM_MOBILE_E2E_SITE_2_URL }} + SITE_3_URL: ${{ secrets.MM_MOBILE_E2E_SITE_3_URL }} + ZEPHYR_ENABLE: false + JIRA_PROJECT_KEY: 'MM' + ZEPHYR_API_KEY: ${{ secrets.MM_MOBILE_E2E_ZEPHYR_API_KEY }} + ZEPHYR_FOLDER_ID: '3233873' + TEST_CYCLE_LINK_PREFIX: ${{ secrets.MM_MOBILE_E2E_TEST_CYCLE_LINK_PREFIX }} + WEBHOOK_URL: ${{ secrets.MM_MOBILE_E2E_WEBHOOK_URL }} + FAILURE_MESSAGE: "Something has failed" + +jobs: + generate-specs: + runs-on: ubuntu-22.04 + # if: (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) + outputs: + specs: ${{ steps.generate-specs.outputs.specs }} + BUILD_ID: ${{ steps.generate-specs.outputs.BUILD_ID }} + DEVICE_NAME: ${{ steps.generate-specs.outputs.DEVICE_NAME }} + DEVICE_OS_VERSION: ${{ steps.generate-specs.outputs.DEVICE_OS_VERSION }} + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Set Build ID + run: | + cd detox + node test_device_info.js ios + - name: Generate Test Specs + id: generate-specs + uses: ./.github/actions/generate-specs + with: + parallelism: 10 + search_path: detox/e2e/test + device: ${{ env.DEVICE_NAME }} + os_version: ${{ env.DEVICE_OS_VERSION }} + + build-android-apk-on-mac: + # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + runs-on: macos-14-large + env: + ORG_GRADLE_PROJECT_jvmargs: -Xmx8g + steps: + - name: ci/checkout-repo + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: ci/prepare-android-build + uses: ./.github/actions/prepare-android-build + env: + STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + + - name: Cache Gradle dependencies + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Install Java + uses: actions/setup-java@v4 + with: + java-version: "17" + distribution: "adopt" + cache: "gradle" + + - name: Validate Gradle wrapper + uses: gradle/actions/wrapper-validation@v3 + + - name: Detox build + run: | + cd detox + npm install + npm install -g detox-cli + npm run e2e:android-build + + - name: ci/upload-android-pr-build + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-build-apk-${{ github.run_id }} + path: "android/app/build/outputs/apk/**/app-*.apk" + + e2e-android: + # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + env: + IOS: false + GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" + API_LEVEL: 33 + ARCH: x86_64 + DETOX_CONFIGURATION: android.emu.release + + runs-on: ubuntu-22.04 + name: android-detox-e2e-${{ matrix.runId }} + needs: + - generate-specs + - build-android-apk-on-mac + strategy: + fail-fast: false + matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Enable KVM + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + + - name: Install required libraries for emulator + run: sudo apt-get install libpulse0 libpulse-dev + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Set up JDK 17 + uses: actions/setup-java@v2 + with: + cache: gradle + distribution: 'temurin' + java-version: '17' + + - name: Gradle cache + uses: gradle/actions/setup-gradle@v3 + + - name: Set up Android SDK + uses: android-actions/setup-android@v3 + + - name: Liberate disk space + uses: jlumbroso/free-disk-space@main + with: + tool-cache: false + android: false + dotnet: true + haskell: true + large-packages: false + docker-images: true + swap-storage: false + + - name: AVD cache + uses: actions/cache@v4 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* + key: avd-${{ env.API_LEVEL }} + + - name: Create AVD and generate snapshot for caching + if: steps.avd-cache.outputs.cache-hit != 'true' + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: ${{ env.API_LEVEL }} + arch: ${{ env.ARCH }} + disable-animations: false + emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + force-avd-creation: false + script: echo 'Generated AVD snapshot for caching.' + + - name: Download Android APK + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + name: android-build-apk-${{ github.run_id }} + path: android/app/build/outputs/apk/ + + - name: Get device name + id: device + run: | + AVD_NAME=$(node -p "require('./detox/.detoxrc.json').devices.android.device.avdName") + echo "AVD_NAME=$AVD_NAME" >> $GITHUB_OUTPUT + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm i + + # - name: Detox test + # uses: reactivecircus/android-emulator-runner@v2 + # with: + # api-level: 33 + # arch: x86_64 + # avd-name: pixel_6_pro + # script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + + - name: Detox test + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: ${{ env.API_LEVEL }} + arch: ${{ env.ARCH }} + avd-name: ${{ steps.device.outputs.AVD_NAME }} + disable-animations: true + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + force-avd-creation: false + script: > + cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + + - name: Upload Android Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-results-${{ matrix.runId }} + path: detox/artifacts + + download-e2e-results: + runs-on: ubuntu-22.04 + # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) + needs: + - generate-specs + - e2e-android + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Create artifacts directory + run: mkdir -p detox/artifacts/ + + - name: Download All Android Artifacts + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + path: detox/artifacts/ + pattern: android-results-* + + - name: Save report Detox Dependencies + run: | + cd detox + npm ci + npm run e2e:save-report + env: + IOS: false + + # e2e-remove-label: + # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) + # needs: + # - download-e2e-results + # runs-on: ubuntu-22.04 + # steps: + # - name: e2e/remove-label-from-pr + # uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + # continue-on-error: true # Label might have been removed manually + # with: + # script: | + # const iosLabel = 'E2E iOS tests for PR'; + # const androidLabel = 'E2E Android tests for PR'; + # const labels = context.payload.pull_request.labels.map(label => label.name); + + # if (labels.includes(iosLabel)) { + # github.rest.issues.removeLabel({ + # issue_number: context.issue.number, + # owner: context.repo.owner, + # repo: context.repo.repo, + # name: iosLabel, + # }); + # } + + # if (labels.includes(androidLabel)) { + # github.rest.issues.removeLabel({ + # issue_number: context.issue.number, + # owner: context.repo.owner, + # repo: context.repo.repo, + # name: androidLabel, + # }); + # } + \ No newline at end of file diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 083eaffcd4e..646b2674893 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -1,323 +1,94 @@ name: Detox E2E Tests on: + schedule: + - cron: '0 0 * * *' # every day at midnight push: branches: - - main - - add_e2e_android + - 'release-*' pull_request: branches: - - ios_detox_job - - main + - 'main' types: - labeled - - opened workflow_dispatch: inputs: - apiLevel: - description: 'Android API Level' - required: true - default: '29' + ios_version: + description: 'Enter iOS version' + required: false + default: "iOS 17.4" type: choice options: - - '29' - - '30' - - '31' - device: - description: 'Device Type' - required: true - default: 'Pixel_3' + - "iOS 17.5" + - "iOS 17.4" + - "iOS 17.2" + - "iOS 17.0" + device_name: + description: 'Enter iOS Device Name' + required: false + default: "iPhone 15 Pro" type: choice options: - - 'Pixel_3' - - 'Pixel_4' - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} - cancel-in-progress: true - -env: - AWS_REGION: 'us-east-1' - ADMIN_EMAIL: ${{ secrets.MM_MOBILE_E2E_ADMIN_EMAIL }} - ADMIN_USERNAME: ${{ secrets.MM_MOBILE_E2E_ADMIN_USERNAME }} - ADMIN_PASSWORD: ${{ secrets.MM_MOBILE_E2E_ADMIN_PASSWORD }} - BRANCH: ${{ github.head_ref || github.ref_name }} - COMMIT_HASH: ${{ github.sha }} - DETOX_AWS_S3_BUCKET: 'mattermost-detox-report' - DETOX_AWS_ACCESS_KEY_ID: ${{ secrets.MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID }} - DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }} - HEADLESS: 'true' - TYPE: 'PR' - PULL_REQUEST: 'https://github.com/mattermost/mattermost-mobile/pull/${{ github.event.number }}' - SITE_1_URL: ${{ secrets.MM_MOBILE_E2E_SITE_1_URL }} - SITE_2_URL: ${{ secrets.MM_MOBILE_E2E_SITE_2_URL }} - SITE_3_URL: ${{ secrets.MM_MOBILE_E2E_SITE_3_URL }} - ZEPHYR_ENABLE: false - JIRA_PROJECT_KEY: 'MM' - ZEPHYR_API_KEY: ${{ secrets.MM_MOBILE_E2E_ZEPHYR_API_KEY }} - ZEPHYR_FOLDER_ID: '3233873' - TEST_CYCLE_LINK_PREFIX: ${{ secrets.MM_MOBILE_E2E_TEST_CYCLE_LINK_PREFIX }} - WEBHOOK_URL: ${{ secrets.MM_MOBILE_E2E_WEBHOOK_URL }} - FAILURE_MESSAGE: "Something has failed" - + - "iPhone 15 Pro" + - "iPhone 15" + - "iPhone 14 Pro" + - "iPhone 14" jobs: - generate-specs: - runs-on: ubuntu-22.04 - # if: (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) - outputs: - specs: ${{ steps.generate-specs.outputs.specs }} - BUILD_ID: ${{ steps.generate-specs.outputs.BUILD_ID }} - DEVICE_NAME: ${{ steps.generate-specs.outputs.DEVICE_NAME }} - DEVICE_OS_VERSION: ${{ steps.generate-specs.outputs.DEVICE_OS_VERSION }} - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Set Build ID - run: | - cd detox - node test_device_info.js ios - - name: Generate Test Specs - id: generate-specs - uses: ./.github/actions/generate-specs - with: - parallelism: 10 - search_path: detox/e2e/test - device: ${{ env.DEVICE_NAME }} - os_version: ${{ env.DEVICE_OS_VERSION }} - - build-android-apk-on-mac: - # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') - runs-on: macos-14-large - env: - ORG_GRADLE_PROJECT_jvmargs: -Xmx8g - steps: - - name: ci/checkout-repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - with: - ref: ${{ github.event.pull_request.head.sha }} - - - name: ci/prepare-android-build - uses: ./.github/actions/prepare-android-build - env: - STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" - STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" - STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" - MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - - name: Cache Gradle dependencies - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 - with: - path: ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- - - - name: Install Java - uses: actions/setup-java@v4 - with: - java-version: "17" - distribution: "adopt" - cache: "gradle" - - - name: Validate Gradle wrapper - uses: gradle/actions/wrapper-validation@v3 - - - name: Detox build - run: | - cd detox - npm install - npm install -g detox-cli - npm run e2e:android-build - - - name: ci/upload-android-pr-build - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-build-apk-${{ github.run_id }} - path: "android/app/build/outputs/apk/**/app-*.apk" - - e2e-android: - # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') - env: - IOS: false - GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - API_LEVEL: 33 - ARCH: x86_64 - DETOX_CONFIGURATION: android.emu.release - - runs-on: ubuntu-22.04 - name: android-detox-e2e-${{ matrix.runId }} - needs: - - generate-specs - - build-android-apk-on-mac - strategy: - fail-fast: false - matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Enable KVM - run: | - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm - - - name: Install required libraries for emulator - run: sudo apt-get install libpulse0 libpulse-dev - - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps - - - name: Set up JDK 17 - uses: actions/setup-java@v2 - with: - cache: gradle - distribution: 'temurin' - java-version: '17' - - - name: Gradle cache - uses: gradle/actions/setup-gradle@v3 - - - name: Set up Android SDK - uses: android-actions/setup-android@v3 - - - name: Liberate disk space - uses: jlumbroso/free-disk-space@main - with: - tool-cache: false - android: false - dotnet: true - haskell: true - large-packages: false - docker-images: true - swap-storage: false - - - name: AVD cache - uses: actions/cache@v4 - id: avd-cache - with: - path: | - ~/.android/avd/* - ~/.android/adb* - key: avd-${{ env.API_LEVEL }} - - - name: Create AVD and generate snapshot for caching - if: steps.avd-cache.outputs.cache-hit != 'true' - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: ${{ env.API_LEVEL }} - arch: ${{ env.ARCH }} - disable-animations: false - emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - force-avd-creation: false - script: echo 'Generated AVD snapshot for caching.' - - - name: Download Android APK - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - name: android-build-apk-${{ github.run_id }} - path: android/app/build/outputs/apk/ - - - name: Get device name - id: device - run: | - AVD_NAME=$(node -p "require('./detox/.detoxrc.json').devices.android.device.avdName") - echo "AVD_NAME=$AVD_NAME" >> $GITHUB_OUTPUT - - - name: Start React Native Metro Server - run: npm run start & - - - name: Install Detox Dependencies - run: cd detox && npm i - - # - name: Detox test - # uses: reactivecircus/android-emulator-runner@v2 - # with: - # api-level: 33 - # arch: x86_64 - # avd-name: pixel_6_pro - # script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - - name: Detox test - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: ${{ env.API_LEVEL }} - arch: ${{ env.ARCH }} - avd-name: ${{ steps.device.outputs.AVD_NAME }} - disable-animations: true - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - force-avd-creation: false - script: > - cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - - name: Upload Android Test Report - if: always() - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-results-${{ matrix.runId }} - path: detox/artifacts - - download-e2e-results: - runs-on: ubuntu-22.04 - # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) - needs: - - generate-specs - - e2e-android - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps - - - name: Create artifacts directory - run: mkdir -p detox/artifacts/ - - - name: Download All Android Artifacts - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - path: detox/artifacts/ - pattern: android-results-* - - - name: Save report Detox Dependencies - run: | - cd detox - npm ci - npm run e2e:save-report - env: - IOS: false - # e2e-remove-label: - # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) - # needs: - # - download-e2e-results - # runs-on: ubuntu-22.04 - # steps: - # - name: e2e/remove-label-from-pr - # uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - # continue-on-error: true # Label might have been removed manually - # with: - # script: | - # const iosLabel = 'E2E iOS tests for PR'; - # const androidLabel = 'E2E Android tests for PR'; - # const labels = context.payload.pull_request.labels.map(label => label.name); - - # if (labels.includes(iosLabel)) { - # github.rest.issues.removeLabel({ - # issue_number: context.issue.number, - # owner: context.repo.owner, - # repo: context.repo.repo, - # name: iosLabel, - # }); - # } - - # if (labels.includes(androidLabel)) { - # github.rest.issues.removeLabel({ - # issue_number: context.issue.number, - # owner: context.repo.owner, - # repo: context.repo.repo, - # name: androidLabel, - # }); - # } - \ No newline at end of file + run-ios-tests-on-pr: + name: iOS Mobile Tests on PR + uses: ./.github/workflows/e2e-detox-ci-template.yml + if: ${{ + ( + github.event_name == 'pull_request' && + github.event.pull_request.labels && + contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') + ) + }} + with: + run-ios-tests: true + run-android-tests: false + remove-pr-label: true + commit_sha: "${{ github.event.pull_request.head.sha || github.sha }}" + status_check_context: "Detox iOS Mobile Tests on PR" + run-type: 'PR' + secrets: inherit + + run-ios-tests-on-release: + name: iOS Mobile Tests on Release + uses: ./.github/workflows/e2e-detox-ci-template.yml + if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release-') }} + with: + run-ios-tests: true + run-android-tests: false + remove-pr-label: false + commit_sha: "${{ github.sha }}" + status_check_context: "Detox iOS Mobile Tests on Release" + run-type: 'RELEASE' + secrets: inherit + + run-ios-tests-on-main-scheduled: + name: iOS Mobile Tests on Main (Scheduled) + uses: ./.github/workflows/e2e-detox-ci-template.yml + if: ${{ github.event_name == 'schedule' && github.ref == 'refs/heads/main' }} + with: + run-ios-tests: true + run-android-tests: false + remove-pr-label: false + commit_sha: "${{ github.sha }}" + status_check_context: "Detox iOS Mobile Tests on Main (Scheduled)" + run-type: 'MAIN' + secrets: inherit + + run-ios-tests-on-manual-trigger: + name: iOS Mobile Tests on Manual Trigger + uses: ./.github/workflows/e2e-detox-ci-template.yml + if: ${{ github.event_name == 'workflow_dispatch' }} + with: + run-ios-tests: true + run-android-tests: false + remove-pr-label: false + commit_sha: "${{ github.sha }}" + status_check_context: "Detox iOS Mobile Tests on Manual Trigger" + run-type: 'MANUAL' + secrets: inherit From 81e4fcdb931afb3e77d9365c548039ca3f6772e8 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 4 Jun 2024 00:36:13 +0530 Subject: [PATCH 214/362] test combined workflows --- .../workflows/e2e-detox-android-template.yml | 203 +++++++----- .github/workflows/e2e-detox-ios-template.yml | 299 ++++++++++++++++++ .github/workflows/e2e-detox.yml | 39 ++- detox/test_device_info.js | 2 +- 4 files changed, 453 insertions(+), 90 deletions(-) create mode 100644 .github/workflows/e2e-detox-ios-template.yml diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 083eaffcd4e..d28573bfc39 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -1,40 +1,36 @@ -name: Detox E2E Tests +name: Detox E2E Tests Template on: - push: - branches: - - main - - add_e2e_android - pull_request: - branches: - - ios_detox_job - - main - types: - - labeled - - opened - workflow_dispatch: + workflow_call: inputs: - apiLevel: - description: 'Android API Level' + run-ios-tests: + description: 'Run iOS tests' required: true - default: '29' - type: choice - options: - - '29' - - '30' - - '31' - device: - description: 'Device Type' + type: boolean + run-android-tests: + description: 'Run Android tests' required: true - default: 'Pixel_3' - type: choice - options: - - 'Pixel_3' - - 'Pixel_4' - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} - cancel-in-progress: true + type: boolean + remove-pr-label: + description: 'Remove PR label' + required: false + type: boolean + default: false + status_check_context: + type: string + required: true + commit_sha: + type: string + required: true + run-type: + type: string + required: false + default: 'PR' + testcase_failure_fatal: + description: 'Should failures be considered fatal' + required: false + type: boolean + default: false env: AWS_REGION: 'us-east-1' @@ -47,7 +43,7 @@ env: DETOX_AWS_ACCESS_KEY_ID: ${{ secrets.MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID }} DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }} HEADLESS: 'true' - TYPE: 'PR' + TYPE: ${{ inputs.run-type }} PULL_REQUEST: 'https://github.com/mattermost/mattermost-mobile/pull/${{ github.event.number }}' SITE_1_URL: ${{ secrets.MM_MOBILE_E2E_SITE_1_URL }} SITE_2_URL: ${{ secrets.MM_MOBILE_E2E_SITE_2_URL }} @@ -59,11 +55,24 @@ env: TEST_CYCLE_LINK_PREFIX: ${{ secrets.MM_MOBILE_E2E_TEST_CYCLE_LINK_PREFIX }} WEBHOOK_URL: ${{ secrets.MM_MOBILE_E2E_WEBHOOK_URL }} FAILURE_MESSAGE: "Something has failed" - + jobs: + update-initial-status: + runs-on: ubuntu-22.04 + steps: + - uses: mattermost/actions/delivery/update-commit-status@main + env: + GITHUB_TOKEN: ${{ github.token }} + with: + repository_full_name: ${{ github.repository }} + commit_sha: ${{ inputs.commit_sha }} + context: ${{ inputs.status_check_context }} + description: Detox tests for mattermost mobile app + status: pending + generate-specs: runs-on: ubuntu-22.04 - # if: (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) + if: ${{ inputs.run-android-tests }} outputs: specs: ${{ steps.generate-specs.outputs.specs }} BUILD_ID: ${{ steps.generate-specs.outputs.BUILD_ID }} @@ -76,7 +85,7 @@ jobs: - name: Set Build ID run: | cd detox - node test_device_info.js ios + node test_device_info.js android - name: Generate Test Specs id: generate-specs uses: ./.github/actions/generate-specs @@ -87,7 +96,7 @@ jobs: os_version: ${{ env.DEVICE_OS_VERSION }} build-android-apk-on-mac: - # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + if: ${{ inputs.run-android-tests }} runs-on: macos-14-large env: ORG_GRADLE_PROJECT_jvmargs: -Xmx8g @@ -137,16 +146,15 @@ jobs: path: "android/app/build/outputs/apk/**/app-*.apk" e2e-android: - # if: contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + if: ${{ inputs.run-android-tests }} + continue-on-error: true + name: ios-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} env: IOS: false GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" API_LEVEL: 33 ARCH: x86_64 - DETOX_CONFIGURATION: android.emu.release - runs-on: ubuntu-22.04 - name: android-detox-e2e-${{ matrix.runId }} needs: - generate-specs - build-android-apk-on-mac @@ -231,14 +239,6 @@ jobs: - name: Install Detox Dependencies run: cd detox && npm i - # - name: Detox test - # uses: reactivecircus/android-emulator-runner@v2 - # with: - # api-level: 33 - # arch: x86_64 - # avd-name: pixel_6_pro - # script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - name: Detox test uses: reactivecircus/android-emulator-runner@v2 with: @@ -260,7 +260,7 @@ jobs: download-e2e-results: runs-on: ubuntu-22.04 - # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) + if: ${{ inputs.run-android-tests }} needs: - generate-specs - e2e-android @@ -288,36 +288,77 @@ jobs: env: IOS: false - # e2e-remove-label: - # if: always() && (contains(github.event.pull_request.labels.*.name, 'E2E iOS tests for PR') || contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR')) - # needs: - # - download-e2e-results - # runs-on: ubuntu-22.04 - # steps: - # - name: e2e/remove-label-from-pr - # uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - # continue-on-error: true # Label might have been removed manually - # with: - # script: | - # const iosLabel = 'E2E iOS tests for PR'; - # const androidLabel = 'E2E Android tests for PR'; - # const labels = context.payload.pull_request.labels.map(label => label.name); + update-final-status: + runs-on: ubuntu-22.04 + needs: + - generate-specs + - download-e2e-results + steps: + - name: Set Target URL + id: set-url + run: | + s3Folder="${{ env.BUILD_ID }}-${{ env.COMMIT_HASH }}-${{ env.BRANCH }}" + s3Folder=$(echo "$s3Folder" | sed 's/\./-/g') + + if ${{ inputs.run-ios-tests }}; then + echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/ios-report.html" >> $GITHUB_ENV + else + echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/android-report.html" >> $GITHUB_ENV + fi + env: + BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} + + - name: Determine Status + id: determine-status + run: | + if [[ ${{ needs.download-e2e-results.outputs.failures }} -gt 0 && "${{ inputs.testcase_failure_fatal }}" == "true" ]]; then + echo "status=failure" >> $GITHUB_ENV + else + echo "status=success" >> $GITHUB_ENV + fi + + - uses: mattermost/actions/delivery/update-commit-status@main + env: + GITHUB_TOKEN: ${{ github.token }} + with: + repository_full_name: ${{ github.repository }} + commit_sha: ${{ inputs.commit_sha }} + context: ${{ inputs.status_check_context }} + description: | + Completed with ${{ needs.download-e2e-results.outputs.failures }} failures + status: ${{ env.status }} + target_url: ${{ env.TARGET_URL }} + + e2e-remove-label: + if: ${{ inputs.remove-pr-label }} + needs: + - download-e2e-results + runs-on: ubuntu-22.04 + steps: + - name: e2e/remove-label-from-pr + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + continue-on-error: true # Label might have been removed manually + with: + script: | + const iosLabel = 'E2E iOS tests for PR'; + const androidLabel = 'E2E Android tests for PR'; + const labels = context.payload.pull_request.labels.map(label => label.name); - # if (labels.includes(iosLabel)) { - # github.rest.issues.removeLabel({ - # issue_number: context.issue.number, - # owner: context.repo.owner, - # repo: context.repo.repo, - # name: iosLabel, - # }); - # } + if (labels.includes(iosLabel)) { + github.rest.issues.removeLabel({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + name: iosLabel, + }); + } - # if (labels.includes(androidLabel)) { - # github.rest.issues.removeLabel({ - # issue_number: context.issue.number, - # owner: context.repo.owner, - # repo: context.repo.repo, - # name: androidLabel, - # }); - # } - \ No newline at end of file + if (labels.includes(androidLabel)) { + github.rest.issues.removeLabel({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + name: androidLabel, + }); + } + \ No newline at end of file diff --git a/.github/workflows/e2e-detox-ios-template.yml b/.github/workflows/e2e-detox-ios-template.yml new file mode 100644 index 00000000000..afaef98bdb4 --- /dev/null +++ b/.github/workflows/e2e-detox-ios-template.yml @@ -0,0 +1,299 @@ +name: Detox E2E Tests Template + +on: + workflow_call: + inputs: + run-ios-tests: + description: 'Run iOS tests' + required: true + type: boolean + run-android-tests: + description: 'Run Android tests' + required: true + type: boolean + remove-pr-label: + description: 'Remove PR label' + required: false + type: boolean + default: false + status_check_context: + type: string + required: true + commit_sha: + type: string + required: true + run-type: + type: string + required: false + default: 'PR' + testcase_failure_fatal: + description: 'Should failures be considered fatal' + required: false + type: boolean + default: false + +env: + AWS_REGION: 'us-east-1' + ADMIN_EMAIL: ${{ secrets.MM_MOBILE_E2E_ADMIN_EMAIL }} + ADMIN_USERNAME: ${{ secrets.MM_MOBILE_E2E_ADMIN_USERNAME }} + ADMIN_PASSWORD: ${{ secrets.MM_MOBILE_E2E_ADMIN_PASSWORD }} + BRANCH: ${{ github.head_ref || github.ref_name }} + COMMIT_HASH: ${{ github.sha }} + DETOX_AWS_S3_BUCKET: 'mattermost-detox-report' + DETOX_AWS_ACCESS_KEY_ID: ${{ secrets.MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID }} + DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }} + HEADLESS: 'true' + TYPE: ${{ inputs.run-type }} + PULL_REQUEST: 'https://github.com/mattermost/mattermost-mobile/pull/${{ github.event.number }}' + SITE_1_URL: ${{ secrets.MM_MOBILE_E2E_SITE_1_URL }} + SITE_2_URL: ${{ secrets.MM_MOBILE_E2E_SITE_2_URL }} + SITE_3_URL: ${{ secrets.MM_MOBILE_E2E_SITE_3_URL }} + ZEPHYR_ENABLE: false + JIRA_PROJECT_KEY: 'MM' + ZEPHYR_API_KEY: ${{ secrets.MM_MOBILE_E2E_ZEPHYR_API_KEY }} + ZEPHYR_FOLDER_ID: '3233873' + TEST_CYCLE_LINK_PREFIX: ${{ secrets.MM_MOBILE_E2E_TEST_CYCLE_LINK_PREFIX }} + WEBHOOK_URL: ${{ secrets.MM_MOBILE_E2E_WEBHOOK_URL }} + FAILURE_MESSAGE: "Something has failed" + +jobs: + update-initial-status: + runs-on: ubuntu-22.04 + steps: + - uses: mattermost/actions/delivery/update-commit-status@main + env: + GITHUB_TOKEN: ${{ github.token }} + with: + repository_full_name: ${{ github.repository }} + commit_sha: ${{ inputs.commit_sha }} + context: ${{ inputs.status_check_context }} + description: Detox tests for mattermost mobile app + status: pending + + generate-specs: + needs: update-initial-status + runs-on: ubuntu-22.04 + if: ${{ inputs.run-ios-tests || inputs.run-android-tests }} + outputs: + specs: ${{ steps.generate-specs.outputs.specs }} + build_id: ${{ env.BUILD_ID }} + device_name: ${{ env.DEVICE_NAME }} + device_os_version: ${{ env.DEVICE_OS_VERSION }} + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Set Build ID + id: resolve-device + run: | + cd detox + DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") + DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.os") + BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" + + echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV + echo "DEVICE_NAME=$(echo ${DEVICE_NAME})" >> $GITHUB_ENV + echo "DEVICE_OS_VERSION=$(echo ${DEVICE_OS_VERSION})" >> $GITHUB_ENV + + - name: Generate Test Specs + id: generate-specs + uses: ./.github/actions/generate-specs + with: + parallelism: 10 + search_path: detox/e2e/test + device_name: ${{ env.DEVICE_NAME }} + device_os_version: ${{env.DEVICE_OS_VERSION}} + + build-ios-simulator: + needs: update-initial-status + runs-on: macos-14-large + if: ${{ inputs.run-ios-tests }} + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Prepare iOS Build + uses: ./.github/actions/prepare-ios-build + + - name: Build iOS Simulator + env: + TAG: "${{ github.ref_name }}" + AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" + AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" + GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" + run: bundle exec fastlane ios simulator --env ios.simulator + working-directory: ./fastlane + + - name: Upload iOS Simulator Build + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: ios-build-simulator-${{ github.run_id }} + path: Mattermost-simulator-x86_64.app.zip + + e2e-ios: + continue-on-error: true + env: + IOS: true + runs-on: macos-14-large + name: ios-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} + if: ${{ inputs.run-ios-tests }} + needs: + - generate-specs + - build-ios-simulator + strategy: + fail-fast: false + matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Install Homebrew Dependencies + run: | + brew tap wix/brew + brew install applesimutils + + - name: Download iOS Simulator Build + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + name: ios-build-simulator-${{ github.run_id }} + path: mobile-artifacts + + - name: Unzip iOS Simulator Build + run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm i + + - name: Run Detox E2E Tests + continue-on-error: true # Label might have been removed manually + run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} + + - name: Upload iOS Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: ios-results-${{ matrix.runId }} + path: detox/artifacts/ + + download-e2e-results: + runs-on: ubuntu-22.04 + if: ${{ inputs.run-ios-tests || inputs.run-android-tests }} + needs: + - generate-specs + - e2e-ios + outputs: + failures: "${{ steps.calculate-failures.outputs.failures }}" + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Create artifacts directory + run: mkdir -p detox/artifacts/ + + - name: Download All Artifacts + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + path: detox/artifacts/ + pattern: ios-results-* + + - name: Save report Detox Dependencies + id: report-link + run: | + cd detox + npm ci + npm run e2e:save-report + env: + IOS: ${{ inputs.run-ios-tests }} + BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} + DEVICE_NAME: ${{ needs.generate-specs.outputs.device_name }} + DEVICE_OS_VERSION: ${{ needs.generate-specs.outputs.device_os_version }} + + - name: Calculate failures + id: calculate-failures + run: | + FAILURES=$(find detox/artifacts/ -name 'summary.json' | xargs -l jq -r '.stats.failures' | jq -s add) + echo "failures=${FAILURES}" >> $GITHUB_OUTPUT + echo "Detox run completed with $FAILURES failures" + + update-final-status: + runs-on: ubuntu-22.04 + needs: + - generate-specs + - download-e2e-results + steps: + - name: Set Target URL + id: set-url + run: | + s3Folder="${{ env.BUILD_ID }}-${{ env.COMMIT_HASH }}-${{ env.BRANCH }}" + s3Folder=$(echo "$s3Folder" | sed 's/\./-/g') + + if ${{ inputs.run-ios-tests }}; then + echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/ios-report.html" >> $GITHUB_ENV + else + echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/android-report.html" >> $GITHUB_ENV + fi + env: + BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} + + - name: Determine Status + id: determine-status + run: | + if [[ ${{ needs.download-e2e-results.outputs.failures }} -gt 0 && "${{ inputs.testcase_failure_fatal }}" == "true" ]]; then + echo "status=failure" >> $GITHUB_ENV + else + echo "status=success" >> $GITHUB_ENV + fi + + - uses: mattermost/actions/delivery/update-commit-status@main + env: + GITHUB_TOKEN: ${{ github.token }} + with: + repository_full_name: ${{ github.repository }} + commit_sha: ${{ inputs.commit_sha }} + context: ${{ inputs.status_check_context }} + description: | + Completed with ${{ needs.download-e2e-results.outputs.failures }} failures + status: ${{ env.status }} + target_url: ${{ env.TARGET_URL }} + + e2e-remove-label: + if: ${{ inputs.remove-pr-label }} + needs: + - download-e2e-results + runs-on: ubuntu-22.04 + steps: + - name: e2e/remove-label-from-pr + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + continue-on-error: true # Label might have been removed manually + with: + script: | + const iosLabel = 'E2E iOS tests for PR'; + const androidLabel = 'E2E Android tests for PR'; + const labels = context.payload.pull_request.labels.map(label => label.name); + + if (labels.includes(iosLabel)) { + github.rest.issues.removeLabel({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + name: iosLabel, + }); + } + + if (labels.includes(androidLabel)) { + github.rest.issues.removeLabel({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + name: androidLabel, + }); + } diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 646b2674893..feb8472ef84 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -6,6 +6,7 @@ on: push: branches: - 'release-*' + - 'add_e2e_android' # remove before merge pull_request: branches: - 'main' @@ -14,7 +15,7 @@ on: workflow_dispatch: inputs: ios_version: - description: 'Enter iOS version' + description: 'Choose iOS version' required: false default: "iOS 17.4" type: choice @@ -23,8 +24,9 @@ on: - "iOS 17.4" - "iOS 17.2" - "iOS 17.0" - device_name: - description: 'Enter iOS Device Name' + + ios_device_name: + description: 'Choose iOS Device Name' required: false default: "iPhone 15 Pro" type: choice @@ -33,6 +35,26 @@ on: - "iPhone 15" - "iPhone 14 Pro" - "iPhone 14" + + android_api_level: + description: 'Choose Android API Level' + required: true + default: '29' + type: choice + options: + - '29' + - '30' + - '31' + + android_device: + description: 'Choose Android Device Type' + required: true + default: 'Pixel_3' + type: choice + options: + - 'Pixel_3' + - 'Pixel_4' + jobs: run-ios-tests-on-pr: @@ -56,15 +78,16 @@ jobs: run-ios-tests-on-release: name: iOS Mobile Tests on Release - uses: ./.github/workflows/e2e-detox-ci-template.yml - if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release-') }} + # remove before merge + uses: ./.github/workflows/e2e-detox-android-template.yml + if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/heads/add_e2e_android') }} with: - run-ios-tests: true - run-android-tests: false + run-ios-tests: false + run-android-tests: true remove-pr-label: false commit_sha: "${{ github.sha }}" status_check_context: "Detox iOS Mobile Tests on Release" - run-type: 'RELEASE' + run-type: 'PR' # remove before merge secrets: inherit run-ios-tests-on-main-scheduled: diff --git a/detox/test_device_info.js b/detox/test_device_info.js index f8a461ac7ec..2ae9e89a06e 100644 --- a/detox/test_device_info.js +++ b/detox/test_device_info.js @@ -45,7 +45,7 @@ function main(platform) { const args = process.argv.slice(2); if (args.length !== 1 || (args[0] !== 'ios' && args[0] !== 'android')) { - console.error('Usage: node script.js '); + console.error('Usage: node test_device_info.js '); process.exit(1); } From 2440c07f3a3aaabc068fb5c70b6eff86eccec263 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 4 Jun 2024 03:09:56 +0530 Subject: [PATCH 215/362] combined ios and android tests on PR --- .../workflows/e2e-detox-android-template.yml | 43 +-- .github/workflows/e2e-detox-ci-template.yml | 299 ------------------ .github/workflows/e2e-detox-ios-template.yml | 32 +- .github/workflows/e2e-detox.yml | 72 ++++- 4 files changed, 68 insertions(+), 378 deletions(-) delete mode 100644 .github/workflows/e2e-detox-ci-template.yml diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index d28573bfc39..962cde477b9 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -3,14 +3,6 @@ name: Detox E2E Tests Template on: workflow_call: inputs: - run-ios-tests: - description: 'Run iOS tests' - required: true - type: boolean - run-android-tests: - description: 'Run Android tests' - required: true - type: boolean remove-pr-label: description: 'Remove PR label' required: false @@ -72,7 +64,7 @@ jobs: generate-specs: runs-on: ubuntu-22.04 - if: ${{ inputs.run-android-tests }} + needs: update-initial-status outputs: specs: ${{ steps.generate-specs.outputs.specs }} BUILD_ID: ${{ steps.generate-specs.outputs.BUILD_ID }} @@ -92,11 +84,11 @@ jobs: with: parallelism: 10 search_path: detox/e2e/test - device: ${{ env.DEVICE_NAME }} - os_version: ${{ env.DEVICE_OS_VERSION }} + device_name: ${{ env.DEVICE_NAME }} + device_os_version: ${{ env.DEVICE_OS_VERSION }} - build-android-apk-on-mac: - if: ${{ inputs.run-android-tests }} + build-android-apk: + needs: update-initial-status runs-on: macos-14-large env: ORG_GRADLE_PROJECT_jvmargs: -Xmx8g @@ -146,9 +138,8 @@ jobs: path: "android/app/build/outputs/apk/**/app-*.apk" e2e-android: - if: ${{ inputs.run-android-tests }} continue-on-error: true - name: ios-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} + name: androud-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} env: IOS: false GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" @@ -157,7 +148,7 @@ jobs: runs-on: ubuntu-22.04 needs: - generate-specs - - build-android-apk-on-mac + - build-android-apk strategy: fail-fast: false matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} @@ -260,7 +251,6 @@ jobs: download-e2e-results: runs-on: ubuntu-22.04 - if: ${{ inputs.run-android-tests }} needs: - generate-specs - e2e-android @@ -299,12 +289,7 @@ jobs: run: | s3Folder="${{ env.BUILD_ID }}-${{ env.COMMIT_HASH }}-${{ env.BRANCH }}" s3Folder=$(echo "$s3Folder" | sed 's/\./-/g') - - if ${{ inputs.run-ios-tests }}; then - echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/ios-report.html" >> $GITHUB_ENV - else - echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/android-report.html" >> $GITHUB_ENV - fi + echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/android-report.html" >> $GITHUB_ENV env: BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} @@ -340,19 +325,9 @@ jobs: continue-on-error: true # Label might have been removed manually with: script: | - const iosLabel = 'E2E iOS tests for PR'; const androidLabel = 'E2E Android tests for PR'; const labels = context.payload.pull_request.labels.map(label => label.name); - - if (labels.includes(iosLabel)) { - github.rest.issues.removeLabel({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - name: iosLabel, - }); - } - + if (labels.includes(androidLabel)) { github.rest.issues.removeLabel({ issue_number: context.issue.number, diff --git a/.github/workflows/e2e-detox-ci-template.yml b/.github/workflows/e2e-detox-ci-template.yml deleted file mode 100644 index afaef98bdb4..00000000000 --- a/.github/workflows/e2e-detox-ci-template.yml +++ /dev/null @@ -1,299 +0,0 @@ -name: Detox E2E Tests Template - -on: - workflow_call: - inputs: - run-ios-tests: - description: 'Run iOS tests' - required: true - type: boolean - run-android-tests: - description: 'Run Android tests' - required: true - type: boolean - remove-pr-label: - description: 'Remove PR label' - required: false - type: boolean - default: false - status_check_context: - type: string - required: true - commit_sha: - type: string - required: true - run-type: - type: string - required: false - default: 'PR' - testcase_failure_fatal: - description: 'Should failures be considered fatal' - required: false - type: boolean - default: false - -env: - AWS_REGION: 'us-east-1' - ADMIN_EMAIL: ${{ secrets.MM_MOBILE_E2E_ADMIN_EMAIL }} - ADMIN_USERNAME: ${{ secrets.MM_MOBILE_E2E_ADMIN_USERNAME }} - ADMIN_PASSWORD: ${{ secrets.MM_MOBILE_E2E_ADMIN_PASSWORD }} - BRANCH: ${{ github.head_ref || github.ref_name }} - COMMIT_HASH: ${{ github.sha }} - DETOX_AWS_S3_BUCKET: 'mattermost-detox-report' - DETOX_AWS_ACCESS_KEY_ID: ${{ secrets.MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID }} - DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }} - HEADLESS: 'true' - TYPE: ${{ inputs.run-type }} - PULL_REQUEST: 'https://github.com/mattermost/mattermost-mobile/pull/${{ github.event.number }}' - SITE_1_URL: ${{ secrets.MM_MOBILE_E2E_SITE_1_URL }} - SITE_2_URL: ${{ secrets.MM_MOBILE_E2E_SITE_2_URL }} - SITE_3_URL: ${{ secrets.MM_MOBILE_E2E_SITE_3_URL }} - ZEPHYR_ENABLE: false - JIRA_PROJECT_KEY: 'MM' - ZEPHYR_API_KEY: ${{ secrets.MM_MOBILE_E2E_ZEPHYR_API_KEY }} - ZEPHYR_FOLDER_ID: '3233873' - TEST_CYCLE_LINK_PREFIX: ${{ secrets.MM_MOBILE_E2E_TEST_CYCLE_LINK_PREFIX }} - WEBHOOK_URL: ${{ secrets.MM_MOBILE_E2E_WEBHOOK_URL }} - FAILURE_MESSAGE: "Something has failed" - -jobs: - update-initial-status: - runs-on: ubuntu-22.04 - steps: - - uses: mattermost/actions/delivery/update-commit-status@main - env: - GITHUB_TOKEN: ${{ github.token }} - with: - repository_full_name: ${{ github.repository }} - commit_sha: ${{ inputs.commit_sha }} - context: ${{ inputs.status_check_context }} - description: Detox tests for mattermost mobile app - status: pending - - generate-specs: - needs: update-initial-status - runs-on: ubuntu-22.04 - if: ${{ inputs.run-ios-tests || inputs.run-android-tests }} - outputs: - specs: ${{ steps.generate-specs.outputs.specs }} - build_id: ${{ env.BUILD_ID }} - device_name: ${{ env.DEVICE_NAME }} - device_os_version: ${{ env.DEVICE_OS_VERSION }} - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Set Build ID - id: resolve-device - run: | - cd detox - DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") - DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.os") - BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" - - echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV - echo "DEVICE_NAME=$(echo ${DEVICE_NAME})" >> $GITHUB_ENV - echo "DEVICE_OS_VERSION=$(echo ${DEVICE_OS_VERSION})" >> $GITHUB_ENV - - - name: Generate Test Specs - id: generate-specs - uses: ./.github/actions/generate-specs - with: - parallelism: 10 - search_path: detox/e2e/test - device_name: ${{ env.DEVICE_NAME }} - device_os_version: ${{env.DEVICE_OS_VERSION}} - - build-ios-simulator: - needs: update-initial-status - runs-on: macos-14-large - if: ${{ inputs.run-ios-tests }} - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Prepare iOS Build - uses: ./.github/actions/prepare-ios-build - - - name: Build iOS Simulator - env: - TAG: "${{ github.ref_name }}" - AWS_ACCESS_KEY_ID: "${{ secrets.MM_MOBILE_BETA_AWS_ACCESS_KEY_ID }}" - AWS_SECRET_ACCESS_KEY: "${{ secrets.MM_MOBILE_BETA_AWS_SECRET_ACCESS_KEY }}" - GITHUB_TOKEN: "${{ secrets.MM_MOBILE_GITHUB_TOKEN }}" - run: bundle exec fastlane ios simulator --env ios.simulator - working-directory: ./fastlane - - - name: Upload iOS Simulator Build - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: ios-build-simulator-${{ github.run_id }} - path: Mattermost-simulator-x86_64.app.zip - - e2e-ios: - continue-on-error: true - env: - IOS: true - runs-on: macos-14-large - name: ios-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} - if: ${{ inputs.run-ios-tests }} - needs: - - generate-specs - - build-ios-simulator - strategy: - fail-fast: false - matrix: ${{ fromJSON(needs.generate-specs.outputs.specs) }} - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps - - - name: Install Homebrew Dependencies - run: | - brew tap wix/brew - brew install applesimutils - - - name: Download iOS Simulator Build - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - name: ios-build-simulator-${{ github.run_id }} - path: mobile-artifacts - - - name: Unzip iOS Simulator Build - run: unzip -o mobile-artifacts/*.zip -d mobile-artifacts/ - - - name: Start React Native Metro Server - run: npm run start & - - - name: Install Detox Dependencies - run: cd detox && npm i - - - name: Run Detox E2E Tests - continue-on-error: true # Label might have been removed manually - run: cd detox && npm run e2e:ios-test -- ${{ matrix.specs }} - - - name: Upload iOS Test Report - if: always() - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: ios-results-${{ matrix.runId }} - path: detox/artifacts/ - - download-e2e-results: - runs-on: ubuntu-22.04 - if: ${{ inputs.run-ios-tests || inputs.run-android-tests }} - needs: - - generate-specs - - e2e-ios - outputs: - failures: "${{ steps.calculate-failures.outputs.failures }}" - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps - - - name: Create artifacts directory - run: mkdir -p detox/artifacts/ - - - name: Download All Artifacts - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - path: detox/artifacts/ - pattern: ios-results-* - - - name: Save report Detox Dependencies - id: report-link - run: | - cd detox - npm ci - npm run e2e:save-report - env: - IOS: ${{ inputs.run-ios-tests }} - BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} - DEVICE_NAME: ${{ needs.generate-specs.outputs.device_name }} - DEVICE_OS_VERSION: ${{ needs.generate-specs.outputs.device_os_version }} - - - name: Calculate failures - id: calculate-failures - run: | - FAILURES=$(find detox/artifacts/ -name 'summary.json' | xargs -l jq -r '.stats.failures' | jq -s add) - echo "failures=${FAILURES}" >> $GITHUB_OUTPUT - echo "Detox run completed with $FAILURES failures" - - update-final-status: - runs-on: ubuntu-22.04 - needs: - - generate-specs - - download-e2e-results - steps: - - name: Set Target URL - id: set-url - run: | - s3Folder="${{ env.BUILD_ID }}-${{ env.COMMIT_HASH }}-${{ env.BRANCH }}" - s3Folder=$(echo "$s3Folder" | sed 's/\./-/g') - - if ${{ inputs.run-ios-tests }}; then - echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/ios-report.html" >> $GITHUB_ENV - else - echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/android-report.html" >> $GITHUB_ENV - fi - env: - BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} - - - name: Determine Status - id: determine-status - run: | - if [[ ${{ needs.download-e2e-results.outputs.failures }} -gt 0 && "${{ inputs.testcase_failure_fatal }}" == "true" ]]; then - echo "status=failure" >> $GITHUB_ENV - else - echo "status=success" >> $GITHUB_ENV - fi - - - uses: mattermost/actions/delivery/update-commit-status@main - env: - GITHUB_TOKEN: ${{ github.token }} - with: - repository_full_name: ${{ github.repository }} - commit_sha: ${{ inputs.commit_sha }} - context: ${{ inputs.status_check_context }} - description: | - Completed with ${{ needs.download-e2e-results.outputs.failures }} failures - status: ${{ env.status }} - target_url: ${{ env.TARGET_URL }} - - e2e-remove-label: - if: ${{ inputs.remove-pr-label }} - needs: - - download-e2e-results - runs-on: ubuntu-22.04 - steps: - - name: e2e/remove-label-from-pr - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - continue-on-error: true # Label might have been removed manually - with: - script: | - const iosLabel = 'E2E iOS tests for PR'; - const androidLabel = 'E2E Android tests for PR'; - const labels = context.payload.pull_request.labels.map(label => label.name); - - if (labels.includes(iosLabel)) { - github.rest.issues.removeLabel({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - name: iosLabel, - }); - } - - if (labels.includes(androidLabel)) { - github.rest.issues.removeLabel({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - name: androidLabel, - }); - } diff --git a/.github/workflows/e2e-detox-ios-template.yml b/.github/workflows/e2e-detox-ios-template.yml index afaef98bdb4..a6666e6360b 100644 --- a/.github/workflows/e2e-detox-ios-template.yml +++ b/.github/workflows/e2e-detox-ios-template.yml @@ -3,14 +3,6 @@ name: Detox E2E Tests Template on: workflow_call: inputs: - run-ios-tests: - description: 'Run iOS tests' - required: true - type: boolean - run-android-tests: - description: 'Run Android tests' - required: true - type: boolean remove-pr-label: description: 'Remove PR label' required: false @@ -73,7 +65,6 @@ jobs: generate-specs: needs: update-initial-status runs-on: ubuntu-22.04 - if: ${{ inputs.run-ios-tests || inputs.run-android-tests }} outputs: specs: ${{ steps.generate-specs.outputs.specs }} build_id: ${{ env.BUILD_ID }} @@ -107,7 +98,6 @@ jobs: build-ios-simulator: needs: update-initial-status runs-on: macos-14-large - if: ${{ inputs.run-ios-tests }} steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -136,7 +126,6 @@ jobs: IOS: true runs-on: macos-14-large name: ios-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} - if: ${{ inputs.run-ios-tests }} needs: - generate-specs - build-ios-simulator @@ -183,7 +172,6 @@ jobs: download-e2e-results: runs-on: ubuntu-22.04 - if: ${{ inputs.run-ios-tests || inputs.run-android-tests }} needs: - generate-specs - e2e-ios @@ -212,7 +200,7 @@ jobs: npm ci npm run e2e:save-report env: - IOS: ${{ inputs.run-ios-tests }} + IOS: true BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} DEVICE_NAME: ${{ needs.generate-specs.outputs.device_name }} DEVICE_OS_VERSION: ${{ needs.generate-specs.outputs.device_os_version }} @@ -235,12 +223,7 @@ jobs: run: | s3Folder="${{ env.BUILD_ID }}-${{ env.COMMIT_HASH }}-${{ env.BRANCH }}" s3Folder=$(echo "$s3Folder" | sed 's/\./-/g') - - if ${{ inputs.run-ios-tests }}; then - echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/ios-report.html" >> $GITHUB_ENV - else - echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/android-report.html" >> $GITHUB_ENV - fi + echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/ios-report.html" >> $GITHUB_ENV env: BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} @@ -277,7 +260,6 @@ jobs: with: script: | const iosLabel = 'E2E iOS tests for PR'; - const androidLabel = 'E2E Android tests for PR'; const labels = context.payload.pull_request.labels.map(label => label.name); if (labels.includes(iosLabel)) { @@ -288,12 +270,4 @@ jobs: name: iosLabel, }); } - - if (labels.includes(androidLabel)) { - github.rest.issues.removeLabel({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - name: androidLabel, - }); - } + diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index feb8472ef84..4d6d45250af 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -6,7 +6,6 @@ on: push: branches: - 'release-*' - - 'add_e2e_android' # remove before merge pull_request: branches: - 'main' @@ -59,7 +58,7 @@ jobs: run-ios-tests-on-pr: name: iOS Mobile Tests on PR - uses: ./.github/workflows/e2e-detox-ci-template.yml + uses: ./.github/workflows/e2e-detox-ios-template.yml if: ${{ ( github.event_name == 'pull_request' && @@ -68,8 +67,6 @@ jobs: ) }} with: - run-ios-tests: true - run-android-tests: false remove-pr-label: true commit_sha: "${{ github.event.pull_request.head.sha || github.sha }}" status_check_context: "Detox iOS Mobile Tests on PR" @@ -78,25 +75,20 @@ jobs: run-ios-tests-on-release: name: iOS Mobile Tests on Release - # remove before merge - uses: ./.github/workflows/e2e-detox-android-template.yml - if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/heads/add_e2e_android') }} + uses: ./.github/workflows/e2e-detox-ios-template.yml + if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release-') }} with: - run-ios-tests: false - run-android-tests: true remove-pr-label: false commit_sha: "${{ github.sha }}" status_check_context: "Detox iOS Mobile Tests on Release" - run-type: 'PR' # remove before merge + run-type: 'RELEASE' secrets: inherit run-ios-tests-on-main-scheduled: name: iOS Mobile Tests on Main (Scheduled) - uses: ./.github/workflows/e2e-detox-ci-template.yml + uses: ./.github/workflows/e2e-detox-ios-template.yml if: ${{ github.event_name == 'schedule' && github.ref == 'refs/heads/main' }} with: - run-ios-tests: true - run-android-tests: false remove-pr-label: false commit_sha: "${{ github.sha }}" status_check_context: "Detox iOS Mobile Tests on Main (Scheduled)" @@ -105,13 +97,61 @@ jobs: run-ios-tests-on-manual-trigger: name: iOS Mobile Tests on Manual Trigger - uses: ./.github/workflows/e2e-detox-ci-template.yml + uses: ./.github/workflows/e2e-detox-ios-template.yml if: ${{ github.event_name == 'workflow_dispatch' }} with: - run-ios-tests: true - run-android-tests: false remove-pr-label: false commit_sha: "${{ github.sha }}" status_check_context: "Detox iOS Mobile Tests on Manual Trigger" run-type: 'MANUAL' secrets: inherit + + run-android-tests-on-pr: + name: Android Mobile Tests on PR + uses: ./.github/workflows/e2e-detox-android-template.yml + if: ${{ + ( + github.event_name == 'pull_request' && + github.event.pull_request.labels && + contains(github.event.pull_request.labels.*.name, 'E2E Android tests for PR') + ) + }} + with: + remove-pr-label: true + commit_sha: "${{ github.event.pull_request.head.sha || github.sha }}" + status_check_context: "Detox Android Mobile Tests on PR" + run-type: 'PR' + secrets: inherit + + run-android-tests-on-release: + name: Android Mobile Tests on Release + uses: ./.github/workflows/e2e-detox-android-template.yml + if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release-') }} + with: + remove-pr-label: false + commit_sha: "${{ github.sha }}" + status_check_context: "Detox Android Mobile Tests on Release" + run-type: 'PR' # remove before merge + secrets: inherit + + run-android-tests-on-main-scheduled: + name: Android Mobile Tests on Main (Scheduled) + uses: ./.github/workflows/e2e-detox-android-template.yml + if: ${{ github.event_name == 'schedule' && github.ref == 'refs/heads/main' }} + with: + remove-pr-label: false + commit_sha: "${{ github.sha }}" + status_check_context: "Detox Android Mobile Tests on Main (Scheduled)" + run-type: 'MAIN' + secrets: inherit + + run-android-tests-on-manual-trigger: + name: Android Mobile Tests on Manual Trigger + uses: ./.github/workflows/e2e-detox-android-template.yml + if: ${{ github.event_name == 'workflow_dispatch' }} + with: + remove-pr-label: false + commit_sha: "${{ github.sha }}" + status_check_context: "Detox Android Mobile Tests on Manual Trigger" + run-type: 'MANUAL' + secrets: inherit From 4fa0984bbd4dd3226f5f00a27f7eb1153c040f6c Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 4 Jun 2024 03:11:25 +0530 Subject: [PATCH 216/362] combined ios and android tests on PR --- .github/workflows/e2e-detox.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 4d6d45250af..f6c960ccfbc 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -9,6 +9,7 @@ on: pull_request: branches: - 'main' + - 'ios_detox_job' # remove before merge types: - labeled workflow_dispatch: From add7c4733f075c31ff8c24b7f22c3fe323289c99 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 4 Jun 2024 21:28:59 +0530 Subject: [PATCH 217/362] generate spec changes --- .../workflows/e2e-detox-android-template.yml | 24 ++++++++++++------- detox/test_device_info.js | 3 --- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 962cde477b9..e093795930e 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -63,21 +63,29 @@ jobs: status: pending generate-specs: - runs-on: ubuntu-22.04 needs: update-initial-status + runs-on: ubuntu-22.04 outputs: specs: ${{ steps.generate-specs.outputs.specs }} - BUILD_ID: ${{ steps.generate-specs.outputs.BUILD_ID }} - DEVICE_NAME: ${{ steps.generate-specs.outputs.DEVICE_NAME }} - DEVICE_OS_VERSION: ${{ steps.generate-specs.outputs.DEVICE_OS_VERSION }} + build_id: ${{ env.BUILD_ID }} + device_name: ${{ env.DEVICE_NAME }} + device_os_version: ${{ env.DEVICE_OS_VERSION }} steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Set Build ID + id: resolve-device run: | cd detox - node test_device_info.js android + DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") + DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.os") + BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" + + echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV + echo "DEVICE_NAME=$(echo ${DEVICE_NAME})" >> $GITHUB_ENV + echo "DEVICE_OS_VERSION=$(echo ${DEVICE_OS_VERSION})" >> $GITHUB_ENV + - name: Generate Test Specs id: generate-specs uses: ./.github/actions/generate-specs @@ -85,8 +93,8 @@ jobs: parallelism: 10 search_path: detox/e2e/test device_name: ${{ env.DEVICE_NAME }} - device_os_version: ${{ env.DEVICE_OS_VERSION }} - + device_os_version: ${{env.DEVICE_OS_VERSION}} + build-android-apk: needs: update-initial-status runs-on: macos-14-large @@ -139,7 +147,7 @@ jobs: e2e-android: continue-on-error: true - name: androud-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} + name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} env: IOS: false GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" diff --git a/detox/test_device_info.js b/detox/test_device_info.js index 2ae9e89a06e..d7ffd05c553 100644 --- a/detox/test_device_info.js +++ b/detox/test_device_info.js @@ -34,9 +34,6 @@ function main(platform) { process.env.DEVICE_NAME = deviceName; process.env.DEVICE_OS_VERSION = deviceOSVersion; - console.log(`BUILD_ID=${buildID}`); - console.log(`DEVICE_NAME=${deviceName}`); - console.log(`DEVICE_OS_VERSION=${deviceOSVersion}`); } catch (error) { console.error(error.message); process.exit(1); From e012442c7e4fc08759944c436c94d4291c1f2b6e Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 4 Jun 2024 21:30:36 +0530 Subject: [PATCH 218/362] review comment --- .github/actions/generate-specs/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/generate-specs/action.yml b/.github/actions/generate-specs/action.yml index db7e071729a..0503204a32c 100644 --- a/.github/actions/generate-specs/action.yml +++ b/.github/actions/generate-specs/action.yml @@ -34,6 +34,6 @@ runs: DEVICE_OS_VERSION: ${{ inputs.device_os_version }} run: | set -e - node ${{ github.action_path }}/split-tests.js > output.json + node ${{ github.action_path }}/split-tests.js | tee output.json echo "specs=$(cat output.json)" >> $GITHUB_OUTPUT shell: bash From da380410e03d058db9c03ebfa0598413f1df1bf6 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 4 Jun 2024 21:41:48 +0530 Subject: [PATCH 219/362] combine build and test mode --- .../workflows/e2e-detox-android-template.yml | 114 +++++++++++------- 1 file changed, 71 insertions(+), 43 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index e093795930e..efe061aa8e4 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -95,16 +95,76 @@ jobs: device_name: ${{ env.DEVICE_NAME }} device_os_version: ${{env.DEVICE_OS_VERSION}} - build-android-apk: - needs: update-initial-status - runs-on: macos-14-large + # build-android-apk: + # needs: update-initial-status + # runs-on: macos-14-large + # env: + # ORG_GRADLE_PROJECT_jvmargs: -Xmx8g + # steps: + # - name: ci/checkout-repo + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + # with: + # ref: ${{ github.event.pull_request.head.sha }} + + # - name: ci/prepare-android-build + # uses: ./.github/actions/prepare-android-build + # env: + # STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + # STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + # STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + # MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + + # - name: Cache Gradle dependencies + # uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + # with: + # path: ~/.gradle/caches + # key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + # restore-keys: | + # ${{ runner.os }}-gradle- + + # - name: Install Java + # uses: actions/setup-java@v4 + # with: + # java-version: "17" + # distribution: "adopt" + # cache: "gradle" + + # - name: Validate Gradle wrapper + # uses: gradle/actions/wrapper-validation@v3 + + # - name: Detox build + # run: | + # cd detox + # npm install + # npm install -g detox-cli + # npm run e2e:android-build + + # - name: ci/upload-android-pr-build + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-build-apk-${{ github.run_id }} + # path: "android/app/build/outputs/apk/**/app-*.apk" + + e2e-android: + continue-on-error: true + name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} env: + IOS: false + GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" + API_LEVEL: 33 + ARCH: x86_64 ORG_GRADLE_PROJECT_jvmargs: -Xmx8g + runs-on: ubuntu-22.04 + needs: + - update-initial-status + - generate-specs + # - build-android-apk + strategy: + fail-fast: false + matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} steps: - - name: ci/checkout-repo + - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - with: - ref: ${{ github.event.pull_request.head.sha }} - name: ci/prepare-android-build uses: ./.github/actions/prepare-android-build @@ -139,31 +199,6 @@ jobs: npm install -g detox-cli npm run e2e:android-build - - name: ci/upload-android-pr-build - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-build-apk-${{ github.run_id }} - path: "android/app/build/outputs/apk/**/app-*.apk" - - e2e-android: - continue-on-error: true - name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} - env: - IOS: false - GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - API_LEVEL: 33 - ARCH: x86_64 - runs-on: ubuntu-22.04 - needs: - - generate-specs - - build-android-apk - strategy: - fail-fast: false - matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - name: Enable KVM run: | echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules @@ -176,13 +211,6 @@ jobs: - name: ci/prepare-node-deps uses: ./.github/actions/prepare-node-deps - - name: Set up JDK 17 - uses: actions/setup-java@v2 - with: - cache: gradle - distribution: 'temurin' - java-version: '17' - - name: Gradle cache uses: gradle/actions/setup-gradle@v3 @@ -220,11 +248,11 @@ jobs: force-avd-creation: false script: echo 'Generated AVD snapshot for caching.' - - name: Download Android APK - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - name: android-build-apk-${{ github.run_id }} - path: android/app/build/outputs/apk/ + # - name: Download Android APK + # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # with: + # name: android-build-apk-${{ github.run_id }} + # path: android/app/build/outputs/apk/ - name: Get device name id: device From 34c5342a9231afcd62dd859ddcde071c93fb9550 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 5 Jun 2024 00:00:06 +0530 Subject: [PATCH 220/362] android single build test-1 --- .../workflows/e2e-detox-android-template.yml | 21 +++++++------------ detox/.detoxrc.json | 3 ++- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index efe061aa8e4..74aced94ab6 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -78,8 +78,8 @@ jobs: id: resolve-device run: | cd detox - DEVICE_NAME=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.type") - DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.os") + DEVICE_NAME=$(node -p "require('./.detoxrc').devices['android'].device.avdName") + DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.api") BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV @@ -151,9 +151,10 @@ jobs: env: IOS: false GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - API_LEVEL: 33 ARCH: x86_64 ORG_GRADLE_PROJECT_jvmargs: -Xmx8g + DEVICE_NAME: ${{ needs.generate-specs.outputs.device_name }} + DEVICE_OS_VERSION: ${{ needs.generate-specs.outputs.device_os_version }} runs-on: ubuntu-22.04 needs: - update-initial-status @@ -235,13 +236,13 @@ jobs: path: | ~/.android/avd/* ~/.android/adb* - key: avd-${{ env.API_LEVEL }} + key: avd-${{ env.DEVICE_OS_VERSION }} - name: Create AVD and generate snapshot for caching if: steps.avd-cache.outputs.cache-hit != 'true' uses: reactivecircus/android-emulator-runner@v2 with: - api-level: ${{ env.API_LEVEL }} + api-level: ${{ env.DEVICE_OS_VERSION }} arch: ${{ env.ARCH }} disable-animations: false emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none @@ -254,12 +255,6 @@ jobs: # name: android-build-apk-${{ github.run_id }} # path: android/app/build/outputs/apk/ - - name: Get device name - id: device - run: | - AVD_NAME=$(node -p "require('./detox/.detoxrc.json').devices.android.device.avdName") - echo "AVD_NAME=$AVD_NAME" >> $GITHUB_OUTPUT - - name: Start React Native Metro Server run: npm run start & @@ -269,9 +264,9 @@ jobs: - name: Detox test uses: reactivecircus/android-emulator-runner@v2 with: - api-level: ${{ env.API_LEVEL }} + api-level: ${{ env.DEVICE_OS_VERSION }} arch: ${{ env.ARCH }} - avd-name: ${{ steps.device.outputs.AVD_NAME }} + avd-name: ${{env.DEVICE_NAME }} disable-animations: true emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none force-avd-creation: false diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index e87e3bd4f5b..068585f6f68 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -37,7 +37,8 @@ "android": { "type": "android.emulator", "device": { - "avdName": "pixel_6_pro" + "avdName": "pixel_6_pro", + "api": "33" } } }, From f1353f9809a001bdaf199aeb4eef37f4cc862ca2 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 5 Jun 2024 00:05:00 +0530 Subject: [PATCH 221/362] android single build test-1 --- .github/workflows/e2e-detox-android-template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 74aced94ab6..fae045bb497 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -79,7 +79,7 @@ jobs: run: | cd detox DEVICE_NAME=$(node -p "require('./.detoxrc').devices['android'].device.avdName") - DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['ios.simulator'].device.api") + DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['android'].device.api") BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV From b8fb2301e800294e8924070702cb5a5323345bc4 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 5 Jun 2024 00:28:20 +0530 Subject: [PATCH 222/362] android single build test-1 --- .github/workflows/e2e-detox-android-template.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index fae045bb497..1058c8abb5e 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -167,6 +167,17 @@ jobs: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Empty disk space + uses: jlumbroso/free-disk-space@main + with: + tool-cache: false + android: false + dotnet: true + haskell: true + large-packages: false + docker-images: true + swap-storage: false + - name: ci/prepare-android-build uses: ./.github/actions/prepare-android-build env: @@ -218,7 +229,7 @@ jobs: - name: Set up Android SDK uses: android-actions/setup-android@v3 - - name: Liberate disk space + - name: Empty disk space uses: jlumbroso/free-disk-space@main with: tool-cache: false From 6e17d0101498699e4c29e4d9f85d103694882549 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 5 Jun 2024 22:42:00 +0530 Subject: [PATCH 223/362] improvements --- .../workflows/e2e-detox-android-template.yml | 118 ++++++------------ .github/workflows/e2e-detox.yml | 2 +- detox/save_report.js | 4 +- detox/test_device_info.js | 1 - detox/utils/report.js | 4 +- 5 files changed, 41 insertions(+), 88 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 1058c8abb5e..3f61456862b 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -95,88 +95,16 @@ jobs: device_name: ${{ env.DEVICE_NAME }} device_os_version: ${{env.DEVICE_OS_VERSION}} - # build-android-apk: - # needs: update-initial-status - # runs-on: macos-14-large - # env: - # ORG_GRADLE_PROJECT_jvmargs: -Xmx8g - # steps: - # - name: ci/checkout-repo - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - # with: - # ref: ${{ github.event.pull_request.head.sha }} - - # - name: ci/prepare-android-build - # uses: ./.github/actions/prepare-android-build - # env: - # STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" - # STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" - # STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" - # MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - # - name: Cache Gradle dependencies - # uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 - # with: - # path: ~/.gradle/caches - # key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - # restore-keys: | - # ${{ runner.os }}-gradle- - - # - name: Install Java - # uses: actions/setup-java@v4 - # with: - # java-version: "17" - # distribution: "adopt" - # cache: "gradle" - - # - name: Validate Gradle wrapper - # uses: gradle/actions/wrapper-validation@v3 - - # - name: Detox build - # run: | - # cd detox - # npm install - # npm install -g detox-cli - # npm run e2e:android-build - - # - name: ci/upload-android-pr-build - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: android-build-apk-${{ github.run_id }} - # path: "android/app/build/outputs/apk/**/app-*.apk" - - e2e-android: - continue-on-error: true - name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} + build-android-apk: + needs: update-initial-status + runs-on: macos-14-large env: - IOS: false - GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - ARCH: x86_64 ORG_GRADLE_PROJECT_jvmargs: -Xmx8g - DEVICE_NAME: ${{ needs.generate-specs.outputs.device_name }} - DEVICE_OS_VERSION: ${{ needs.generate-specs.outputs.device_os_version }} - runs-on: ubuntu-22.04 - needs: - - update-initial-status - - generate-specs - # - build-android-apk - strategy: - fail-fast: false - matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} steps: - - name: Checkout Repository + - name: ci/checkout-repo uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Empty disk space - uses: jlumbroso/free-disk-space@main with: - tool-cache: false - android: false - dotnet: true - haskell: true - large-packages: false - docker-images: true - swap-storage: false + ref: ${{ github.event.pull_request.head.sha }} - name: ci/prepare-android-build uses: ./.github/actions/prepare-android-build @@ -211,6 +139,32 @@ jobs: npm install -g detox-cli npm run e2e:android-build + - name: ci/upload-android-pr-build + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-build-apk-${{ github.run_id }} + path: "android/app/build/outputs/apk/**/app-*.apk" + + e2e-android: + continue-on-error: true + name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} + env: + IOS: false + GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" + ARCH: x86_64 + DEVICE_NAME: ${{ needs.generate-specs.outputs.device_name }} + DEVICE_OS_VERSION: ${{ needs.generate-specs.outputs.device_os_version }} + runs-on: ubuntu-22.04 + needs: + - generate-specs + - build-android-apk + strategy: + fail-fast: false + matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Enable KVM run: | echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules @@ -260,11 +214,11 @@ jobs: force-avd-creation: false script: echo 'Generated AVD snapshot for caching.' - # - name: Download Android APK - # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - # with: - # name: android-build-apk-${{ github.run_id }} - # path: android/app/build/outputs/apk/ + - name: Download Android APK + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + name: android-build-apk-${{ github.run_id }} + path: android/app/build/outputs/apk/ - name: Start React Native Metro Server run: npm run start & diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 4d6d45250af..58b717b3236 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -131,7 +131,7 @@ jobs: remove-pr-label: false commit_sha: "${{ github.sha }}" status_check_context: "Detox Android Mobile Tests on Release" - run-type: 'PR' # remove before merge + run-type: 'RELEASE' secrets: inherit run-android-tests-on-main-scheduled: diff --git a/detox/save_report.js b/detox/save_report.js index 8a531de86d5..7a894cc08d6 100644 --- a/detox/save_report.js +++ b/detox/save_report.js @@ -120,14 +120,14 @@ const saveReport = async () => { } // 'ios-results-*' is the path in CI where the parallel detox jobs save artifacts - await mergeJestStareJsonFiles(jestStareCombinedFilePath, [`${ARTIFACTS_DIR}/ios-results*/jest-stare/${platform}-data*.json`]); + await mergeJestStareJsonFiles(jestStareCombinedFilePath, [`${ARTIFACTS_DIR}/${platform}-results*/jest-stare/${platform}-data*.json`]); generateJestStareHtmlReport(jestStareOutputDir, `${platform}-report.html`, jestStareCombinedFilePath); if (process.env.CI) { // Delete folders starting with "iOS-results-" only in CI environment const entries = fs.readdirSync(ARTIFACTS_DIR, {withFileTypes: true}); for (const entry of entries) { - if (entry.isDirectory() && (entry.name.startsWith('ios-results-') || entry.name.startsWith('android-results-'))) { + if (entry.isDirectory() && (entry.name.startsWith(`${platform}-results-`))) { fs.rmSync(path.join(ARTIFACTS_DIR, entry.name), {recursive: true}); } } diff --git a/detox/test_device_info.js b/detox/test_device_info.js index d7ffd05c553..bc05d2c55f5 100644 --- a/detox/test_device_info.js +++ b/detox/test_device_info.js @@ -33,7 +33,6 @@ function main(platform) { process.env.BUILD_ID = buildID; process.env.DEVICE_NAME = deviceName; process.env.DEVICE_OS_VERSION = deviceOSVersion; - } catch (error) { console.error(error.message); process.exit(1); diff --git a/detox/utils/report.js b/detox/utils/report.js index 47bd97a14c0..27216ef0078 100644 --- a/detox/utils/report.js +++ b/detox/utils/report.js @@ -233,7 +233,7 @@ function generateTestReport(summary, isUploadedToS3, reportLink, environment, te } const title = generateTitle(); - const envValue = `detox@${detox_version} | node@${node_version} | npm@${npm_version} | ${device_name}@${device_os_version}${headless ? ' (headless)' : ''} | ${os_name}@${os_version}`; + const envValue = `detox@${detox_version} | node@${node_version} | npm@${npm_version} | ${device_name}@${device_os_version}${headless ? ' (headless)' : ''}`; if (FULL_REPORT === 'true') { let reportField; @@ -350,7 +350,7 @@ function generateTitle() { title = `${platform} E2E for Main Nightly Build (Prod tests)${buildLink}`; break; default: - title = `${platform} E2E for Build${buildLink}`; + title = `${platform} E2E for Build ${buildLink}`; } return title; From bd972bbc158ce62e2a9b49617ebe231fe4ca0a45 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 7 Jun 2024 15:52:41 +0530 Subject: [PATCH 224/362] test apk run --- .../workflows/e2e-detox-android-template.yml | 136 +++++++++++------- 1 file changed, 81 insertions(+), 55 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 3f61456862b..88da99f3822 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -95,55 +95,55 @@ jobs: device_name: ${{ env.DEVICE_NAME }} device_os_version: ${{env.DEVICE_OS_VERSION}} - build-android-apk: - needs: update-initial-status - runs-on: macos-14-large - env: - ORG_GRADLE_PROJECT_jvmargs: -Xmx8g - steps: - - name: ci/checkout-repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - with: - ref: ${{ github.event.pull_request.head.sha }} - - - name: ci/prepare-android-build - uses: ./.github/actions/prepare-android-build - env: - STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" - STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" - STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" - MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - - name: Cache Gradle dependencies - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 - with: - path: ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- - - - name: Install Java - uses: actions/setup-java@v4 - with: - java-version: "17" - distribution: "adopt" - cache: "gradle" - - - name: Validate Gradle wrapper - uses: gradle/actions/wrapper-validation@v3 - - - name: Detox build - run: | - cd detox - npm install - npm install -g detox-cli - npm run e2e:android-build - - - name: ci/upload-android-pr-build - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-build-apk-${{ github.run_id }} - path: "android/app/build/outputs/apk/**/app-*.apk" + # build-android-apk: + # needs: update-initial-status + # runs-on: macos-14-large + # env: + # ORG_GRADLE_PROJECT_jvmargs: -Xmx8g + # steps: + # - name: ci/checkout-repo + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + # with: + # ref: ${{ github.event.pull_request.head.sha }} + + # - name: ci/prepare-android-build + # uses: ./.github/actions/prepare-android-build + # env: + # STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + # STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + # STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + # MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + + # - name: Cache Gradle dependencies + # uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + # with: + # path: ~/.gradle/caches + # key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + # restore-keys: | + # ${{ runner.os }}-gradle- + + # - name: Install Java + # uses: actions/setup-java@v4 + # with: + # java-version: "17" + # distribution: "adopt" + # cache: "gradle" + + # - name: Validate Gradle wrapper + # uses: gradle/actions/wrapper-validation@v3 + + # - name: Detox build + # run: | + # cd detox + # npm install + # npm install -g detox-cli + # npm run e2e:android-build + + # - name: ci/upload-android-pr-build + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-build-apk-${{ github.run_id }} + # path: "android/app/build/outputs/apk/**/app-*.apk" e2e-android: continue-on-error: true @@ -157,7 +157,7 @@ jobs: runs-on: ubuntu-22.04 needs: - generate-specs - - build-android-apk + # - build-android-apk strategy: fail-fast: false matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} @@ -165,6 +165,31 @@ jobs: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Install Java + uses: actions/setup-java@v4 + with: + java-version: "17" + distribution: "adopt" + cache: "gradle" + + - name: Create destination path + run: mkdir -p android/app/build/outputs/apk + + - name: Download artifact + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + curl -L -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + --output android/app/build/outputs/apk/artifact.zip + + - name: Unzip artifact + run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk + + - name: Cleanup + run: rm android/app/build/outputs/apk/artifact.zip + - name: Enable KVM run: | echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules @@ -214,11 +239,12 @@ jobs: force-avd-creation: false script: echo 'Generated AVD snapshot for caching.' - - name: Download Android APK - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - name: android-build-apk-${{ github.run_id }} - path: android/app/build/outputs/apk/ + # - name: Download Android APK + # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # with: + # # name: android-build-apk-${{ github.run_id }} + # name: android-build-apk-9414649994 + # path: android/app/build/outputs/apk/ - name: Start React Native Metro Server run: npm run start & From 35da6d86494c7aee151686cb6fd579d42da6bff5 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 7 Jun 2024 16:06:54 +0530 Subject: [PATCH 225/362] test apk run -2 --- .../workflows/e2e-detox-android-template.yml | 72 +++++++++---------- 1 file changed, 34 insertions(+), 38 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 88da99f3822..1d4588cfbf1 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -34,7 +34,7 @@ env: DETOX_AWS_S3_BUCKET: 'mattermost-detox-report' DETOX_AWS_ACCESS_KEY_ID: ${{ secrets.MM_MOBILE_DETOX_AWS_ACCESS_KEY_ID }} DETOX_AWS_SECRET_ACCESS_KEY: ${{ secrets.MM_MOBILE_DETOX_AWS_SECRET_ACCESS_KEY }} - HEADLESS: 'true' + HEADLESS: false TYPE: ${{ inputs.run-type }} PULL_REQUEST: 'https://github.com/mattermost/mattermost-mobile/pull/${{ github.event.number }}' SITE_1_URL: ${{ secrets.MM_MOBILE_E2E_SITE_1_URL }} @@ -196,18 +196,12 @@ jobs: sudo udevadm control --reload-rules sudo udevadm trigger --name-match=kvm - - name: Install required libraries for emulator - run: sudo apt-get install libpulse0 libpulse-dev - - name: ci/prepare-node-deps uses: ./.github/actions/prepare-node-deps - name: Gradle cache uses: gradle/actions/setup-gradle@v3 - - name: Set up Android SDK - uses: android-actions/setup-android@v3 - - name: Empty disk space uses: jlumbroso/free-disk-space@main with: @@ -219,27 +213,37 @@ jobs: docker-images: true swap-storage: false - - name: AVD cache - uses: actions/cache@v4 - id: avd-cache - with: - path: | - ~/.android/avd/* - ~/.android/adb* - key: avd-${{ env.DEVICE_OS_VERSION }} - - - name: Create AVD and generate snapshot for caching - if: steps.avd-cache.outputs.cache-hit != 'true' - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: ${{ env.DEVICE_OS_VERSION }} - arch: ${{ env.ARCH }} - disable-animations: false - emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - force-avd-creation: false - script: echo 'Generated AVD snapshot for caching.' + - name: Install Android SDK + run: | + sudo apt-get update + sudo apt-get install -y openjdk-11-jdk wget unzip libpulse0 libpulse-dev + wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip -O cmdline-tools.zip + unzip cmdline-tools.zip -d $HOME + mkdir -p $ANDROID_HOME/cmdline-tools + mv $HOME/cmdline-tools $ANDROID_HOME/cmdline-tools/latest + yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses + $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "platform-tools" "platforms;android-33" "system-images;android-33;default;x86_64" "emulator" + + - name: Create AVD + run: | + echo no | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd --force -n pixel_6_pro --abi 'default/x86_64' --package 'system-images;android-33;default;x86_64' + printf 'hw.cpu.ncore=2\n' >> $HOME/.android/avd/pixel_6_pro.avd/config.ini + + - name: Start emulator + run: | + $ANDROID_HOME/emulator/emulator -avd pixel_6_pro -no-snapshot -no-audio -no-boot-anim -gpu swiftshader_indirect & + adb wait-for-device + adb shell getprop sys.boot_completed + sleep 60 + adb shell input keyevent 82 + + - name: Disable animations + run: | + adb shell settings put global window_animation_scale 0.0 + adb shell settings put global transition_animation_scale 0.0 + adb shell settings put global animator_duration_scale 0.0 - # - name: Download Android APK + # - name: Download Android APK # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 # with: # # name: android-build-apk-${{ github.run_id }} @@ -252,17 +256,9 @@ jobs: - name: Install Detox Dependencies run: cd detox && npm i - - name: Detox test - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: ${{ env.DEVICE_OS_VERSION }} - arch: ${{ env.ARCH }} - avd-name: ${{env.DEVICE_NAME }} - disable-animations: true - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - force-avd-creation: false - script: > - cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + - name: Run Detox Tests + run: | + cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - name: Upload Android Test Report if: always() From 11b9d62da2e808dabb62dd6c6b7523189252e09c Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 7 Jun 2024 16:12:09 +0530 Subject: [PATCH 226/362] test apk run - --- .github/workflows/e2e-detox-android-template.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 1d4588cfbf1..7622ab98510 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -216,11 +216,11 @@ jobs: - name: Install Android SDK run: | sudo apt-get update - sudo apt-get install -y openjdk-11-jdk wget unzip libpulse0 libpulse-dev + sudo apt-get install -y openjdk-11-jdk wget unzip wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip -O cmdline-tools.zip - unzip cmdline-tools.zip -d $HOME - mkdir -p $ANDROID_HOME/cmdline-tools - mv $HOME/cmdline-tools $ANDROID_HOME/cmdline-tools/latest + unzip cmdline-tools.zip -d $HOME/android-sdk/cmdline-tools + mkdir -p $ANDROID_HOME/cmdline-tools/latest + mv $HOME/android-sdk/cmdline-tools $ANDROID_HOME/cmdline-tools/latest yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "platform-tools" "platforms;android-33" "system-images;android-33;default;x86_64" "emulator" @@ -242,7 +242,7 @@ jobs: adb shell settings put global window_animation_scale 0.0 adb shell settings put global transition_animation_scale 0.0 adb shell settings put global animator_duration_scale 0.0 - + # - name: Download Android APK # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 # with: From 17e94dc85c1530071e61813170cd09966e04c718 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 7 Jun 2024 16:27:25 +0530 Subject: [PATCH 227/362] test apk run -3 --- .github/workflows/e2e-detox-android-template.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 7622ab98510..9772e50730f 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -217,13 +217,12 @@ jobs: run: | sudo apt-get update sudo apt-get install -y openjdk-11-jdk wget unzip + mkdir -p $HOME/android-sdk/cmdline-tools/latest wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip -O cmdline-tools.zip - unzip cmdline-tools.zip -d $HOME/android-sdk/cmdline-tools - mkdir -p $ANDROID_HOME/cmdline-tools/latest - mv $HOME/android-sdk/cmdline-tools $ANDROID_HOME/cmdline-tools/latest - yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses - $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "platform-tools" "platforms;android-33" "system-images;android-33;default;x86_64" "emulator" - + unzip cmdline-tools.zip -d $HOME/android-sdk/cmdline-tools/latest + yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses + $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "platform-tools" "platforms;android-33" "system-images;android-33;default;x86_64" "emulator" + - name: Create AVD run: | echo no | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd --force -n pixel_6_pro --abi 'default/x86_64' --package 'system-images;android-33;default;x86_64' From 4d8adf8fb48c32ef156298a437277bd20df5c166 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 7 Jun 2024 16:32:21 +0530 Subject: [PATCH 228/362] test apk run -4 --- .github/workflows/e2e-detox-android-template.yml | 1 + .github/workflows/e2e-detox.yml | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 9772e50730f..c4852c2220f 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -220,6 +220,7 @@ jobs: mkdir -p $HOME/android-sdk/cmdline-tools/latest wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip -O cmdline-tools.zip unzip cmdline-tools.zip -d $HOME/android-sdk/cmdline-tools/latest + mv $HOME/android-sdk/cmdline-tools/latest/cmdline-tools/* $HOME/android-sdk/cmdline-tools/latest/ yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "platform-tools" "platforms;android-33" "system-images;android-33;default;x86_64" "emulator" diff --git a/.github/workflows/e2e-detox.yml b/.github/workflows/e2e-detox.yml index 58b717b3236..6582a636a63 100644 --- a/.github/workflows/e2e-detox.yml +++ b/.github/workflows/e2e-detox.yml @@ -6,6 +6,7 @@ on: push: branches: - 'release-*' + - 'add_e2e_android' pull_request: branches: - 'main' @@ -126,7 +127,7 @@ jobs: run-android-tests-on-release: name: Android Mobile Tests on Release uses: ./.github/workflows/e2e-detox-android-template.yml - if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release-') }} + if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/heads/add_e2e_android') }} with: remove-pr-label: false commit_sha: "${{ github.sha }}" From 036016075862bc8dd648c33448c1184c880ce5fb Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 7 Jun 2024 16:52:19 +0530 Subject: [PATCH 229/362] test on mac-1 --- .../workflows/e2e-detox-android-template.yml | 271 +++++++++++------- 1 file changed, 174 insertions(+), 97 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index c4852c2220f..aed4142e659 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -145,16 +145,11 @@ jobs: # name: android-build-apk-${{ github.run_id }} # path: "android/app/build/outputs/apk/**/app-*.apk" - e2e-android: - continue-on-error: true + e2e-android-on-mac: name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} - env: - IOS: false - GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - ARCH: x86_64 - DEVICE_NAME: ${{ needs.generate-specs.outputs.device_name }} - DEVICE_OS_VERSION: ${{ needs.generate-specs.outputs.device_os_version }} - runs-on: ubuntu-22.04 + continue-on-error: true + runs-on: macos-latest + timeout-minutes: 15 needs: - generate-specs # - build-android-apk @@ -162,116 +157,198 @@ jobs: fail-fast: false matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Checkout + uses: actions/checkout@v1 + with: + fetch-depth: 1 + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Install Java + uses: actions/setup-java@v4 + with: + java-version: "17" + distribution: "adopt" + cache: "gradle" + - name: Create destination path + run: mkdir -p android/app/build/outputs/apk + + - name: Download artifact + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + curl -L -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + --output android/app/build/outputs/apk/artifact.zip + + - name: Unzip artifact + run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk + + - name: Cleanup + run: rm android/app/build/outputs/apk/artifact.zip + + - name: Download Android Emulator Image + run: | + echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;google_apis;x86" + echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-29;google_apis;x86' + $ANDROID_HOME/emulator/emulator -list-avds + + - name: Android Emulator + timeout-minutes: 10 + continue-on-error: true + run: | + echo "Starting emulator" + nohup $ANDROID_HOME/emulator/emulator -avd emu -no-audio -no-snapshot -no-window & + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' + $ANDROID_HOME/platform-tools/adb devices + echo "Emulator started" + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm i + + - name: Run Detox Tests + run: | + cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + + - name: Upload Android Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-results-${{ matrix.runId }} + path: detox/artifacts + + # e2e-android: + # continue-on-error: true + # name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} + # env: + # IOS: false + # GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" + # ARCH: x86_64 + # DEVICE_NAME: ${{ needs.generate-specs.outputs.device_name }} + # DEVICE_OS_VERSION: ${{ needs.generate-specs.outputs.device_os_version }} + # runs-on: ubuntu-22.04 + # needs: + # - generate-specs + # # - build-android-apk + # strategy: + # fail-fast: false + # matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} + # steps: + # - name: Checkout Repository + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - name: Install Java - uses: actions/setup-java@v4 - with: - java-version: "17" - distribution: "adopt" - cache: "gradle" + # - name: Install Java + # uses: actions/setup-java@v4 + # with: + # java-version: "17" + # distribution: "adopt" + # cache: "gradle" - - name: Create destination path - run: mkdir -p android/app/build/outputs/apk + # - name: Create destination path + # run: mkdir -p android/app/build/outputs/apk - - name: Download artifact - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - curl -L -H "Authorization: token $GITHUB_TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - --output android/app/build/outputs/apk/artifact.zip + # - name: Download artifact + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # run: | + # curl -L -H "Authorization: token $GITHUB_TOKEN" \ + # -H "Accept: application/vnd.github.v3+json" \ + # https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + # --output android/app/build/outputs/apk/artifact.zip - - name: Unzip artifact - run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk + # - name: Unzip artifact + # run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk - - name: Cleanup - run: rm android/app/build/outputs/apk/artifact.zip + # - name: Cleanup + # run: rm android/app/build/outputs/apk/artifact.zip - - name: Enable KVM - run: | - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm + # - name: Enable KVM + # run: | + # echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + # sudo udevadm control --reload-rules + # sudo udevadm trigger --name-match=kvm - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps + # - name: ci/prepare-node-deps + # uses: ./.github/actions/prepare-node-deps - - name: Gradle cache - uses: gradle/actions/setup-gradle@v3 + # - name: Gradle cache + # uses: gradle/actions/setup-gradle@v3 - - name: Empty disk space - uses: jlumbroso/free-disk-space@main - with: - tool-cache: false - android: false - dotnet: true - haskell: true - large-packages: false - docker-images: true - swap-storage: false - - - name: Install Android SDK - run: | - sudo apt-get update - sudo apt-get install -y openjdk-11-jdk wget unzip - mkdir -p $HOME/android-sdk/cmdline-tools/latest - wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip -O cmdline-tools.zip - unzip cmdline-tools.zip -d $HOME/android-sdk/cmdline-tools/latest - mv $HOME/android-sdk/cmdline-tools/latest/cmdline-tools/* $HOME/android-sdk/cmdline-tools/latest/ - yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses - $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "platform-tools" "platforms;android-33" "system-images;android-33;default;x86_64" "emulator" + # - name: Empty disk space + # uses: jlumbroso/free-disk-space@main + # with: + # tool-cache: false + # android: false + # dotnet: true + # haskell: true + # large-packages: false + # docker-images: true + # swap-storage: false + + # - name: Install Android SDK + # run: | + # sudo apt-get update + # sudo apt-get install -y openjdk-11-jdk wget unzip + # mkdir -p $HOME/android-sdk/cmdline-tools/latest + # wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip -O cmdline-tools.zip + # unzip cmdline-tools.zip -d $HOME/android-sdk/cmdline-tools/latest + # mv $HOME/android-sdk/cmdline-tools/latest/cmdline-tools/* $HOME/android-sdk/cmdline-tools/latest/ + # yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses + # $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "platform-tools" "platforms;android-33" "system-images;android-33;default;x86_64" "emulator" - - name: Create AVD - run: | - echo no | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd --force -n pixel_6_pro --abi 'default/x86_64' --package 'system-images;android-33;default;x86_64' - printf 'hw.cpu.ncore=2\n' >> $HOME/.android/avd/pixel_6_pro.avd/config.ini + # - name: Create AVD + # run: | + # echo no | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd --force -n pixel_6_pro --abi 'default/x86_64' --package 'system-images;android-33;default;x86_64' + # printf 'hw.cpu.ncore=2\n' >> $HOME/.android/avd/pixel_6_pro.avd/config.ini - - name: Start emulator - run: | - $ANDROID_HOME/emulator/emulator -avd pixel_6_pro -no-snapshot -no-audio -no-boot-anim -gpu swiftshader_indirect & - adb wait-for-device - adb shell getprop sys.boot_completed - sleep 60 - adb shell input keyevent 82 + # - name: Start emulator + # run: | + # $ANDROID_HOME/emulator/emulator -avd pixel_6_pro -no-snapshot -no-audio -no-boot-anim -gpu swiftshader_indirect & + # adb wait-for-device + # adb shell getprop sys.boot_completed + # sleep 60 + # adb shell input keyevent 82 - - name: Disable animations - run: | - adb shell settings put global window_animation_scale 0.0 - adb shell settings put global transition_animation_scale 0.0 - adb shell settings put global animator_duration_scale 0.0 + # - name: Disable animations + # run: | + # adb shell settings put global window_animation_scale 0.0 + # adb shell settings put global transition_animation_scale 0.0 + # adb shell settings put global animator_duration_scale 0.0 - # - name: Download Android APK - # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - # with: - # # name: android-build-apk-${{ github.run_id }} - # name: android-build-apk-9414649994 - # path: android/app/build/outputs/apk/ + # # - name: Download Android APK + # # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # # with: + # # # name: android-build-apk-${{ github.run_id }} + # # name: android-build-apk-9414649994 + # # path: android/app/build/outputs/apk/ - - name: Start React Native Metro Server - run: npm run start & + # - name: Start React Native Metro Server + # run: npm run start & - - name: Install Detox Dependencies - run: cd detox && npm i + # - name: Install Detox Dependencies + # run: cd detox && npm i - - name: Run Detox Tests - run: | - cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + # - name: Run Detox Tests + # run: | + # cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - name: Upload Android Test Report - if: always() - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-results-${{ matrix.runId }} - path: detox/artifacts + # - name: Upload Android Test Report + # if: always() + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-results-${{ matrix.runId }} + # path: detox/artifacts download-e2e-results: runs-on: ubuntu-22.04 needs: - generate-specs - - e2e-android + - e2e-android-on-mac steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 From 0ff04dd56f7ff4341d95e5f489ae51222c4f6c0a Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 7 Jun 2024 23:00:11 +0530 Subject: [PATCH 230/362] test images --- .../workflows/e2e-detox-android-template.yml | 89 +++++++++++++------ detox/utils/report.js | 2 - 2 files changed, 63 insertions(+), 28 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index aed4142e659..9788b253d45 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -149,7 +149,7 @@ jobs: name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} continue-on-error: true runs-on: macos-latest - timeout-minutes: 15 + timeout-minutes: 35 needs: - generate-specs # - build-android-apk @@ -165,12 +165,22 @@ jobs: - name: ci/prepare-node-deps uses: ./.github/actions/prepare-node-deps + - name: Install Sharp CLI for faster image generation during prebuild + run: npm install --global sharp-cli + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm i + - name: Install Java uses: actions/setup-java@v4 with: java-version: "17" distribution: "adopt" cache: "gradle" + - name: Create destination path run: mkdir -p android/app/build/outputs/apk @@ -188,32 +198,59 @@ jobs: - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip - - - name: Download Android Emulator Image - run: | - echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;google_apis;x86" - echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-29;google_apis;x86' - $ANDROID_HOME/emulator/emulator -list-avds - - - name: Android Emulator - timeout-minutes: 10 - continue-on-error: true - run: | - echo "Starting emulator" - nohup $ANDROID_HOME/emulator/emulator -avd emu -no-audio -no-snapshot -no-window & - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' - $ANDROID_HOME/platform-tools/adb devices - echo "Emulator started" - - - name: Start React Native Metro Server - run: npm run start & - - name: Install Detox Dependencies - run: cd detox && npm i - - - name: Run Detox Tests - run: | - cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + - name: Cache AVD snapshot + uses: actions/cache@v4 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* + key: avd-30-aosp-atd + + - name: Create AVD and generate snapshot for caching + if: steps.avd-cache.outputs.cache-hit != 'true' + uses: reactivecircus/android-emulator-runner@v2 + with: + # Use the slimmer aosp_atd images for working + # around "System UI isn't responding" ANR + # (Application Not Responding) error + # + # https://android-developers.googleblog.com/2021/10/whats-new-in-scalable-automated-testing.html#:~:text=Slimmer%20Emulator%20System%20Images + # https://github.com/ReactiveCircus/android-emulator-runner/issues/129 + # https://github.com/upleveled/hotline-bling-codealong/pull/26#issuecomment-1094659722 + target: aosp_atd + api-level: 33 + arch: x86 + ram-size: 4096M + channel: canary + profile: pixel + avd-name: pixel_6_pro + force-avd-creation: false + emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + emulator-boot-timeout: 12000 + disable-animations: false + script: echo "Generated AVD snapshot for caching" + + - name: Start emulator and run Detox integration tests + uses: reactivecircus/android-emulator-runner@v2 + with: + target: aosp_atd + api-level: 33 + arch: x86 + ram-size: 4096M + channel: canary + profile: pixel + avd-name: pixel_6_pro + force-avd-creation: false + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + emulator-boot-timeout: 12000 + disable-animations: true + script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + + # - name: Run Detox Tests + # run: | + # cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - name: Upload Android Test Report if: always() diff --git a/detox/utils/report.js b/detox/utils/report.js index 27216ef0078..054a0b4ef78 100644 --- a/detox/utils/report.js +++ b/detox/utils/report.js @@ -218,8 +218,6 @@ function generateTestReport(summary, isUploadedToS3, reportLink, environment, te device_name, device_os_version, headless, - os_name, - os_version, node_version, npm_version, } = environment; From 1908bd4fe4356dd77193d72b8a0446e491f03366 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 7 Jun 2024 23:17:08 +0530 Subject: [PATCH 231/362] try macos 13 --- .../workflows/e2e-detox-android-template.yml | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 9788b253d45..ec09234fb29 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -148,7 +148,7 @@ jobs: e2e-android-on-mac: name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} continue-on-error: true - runs-on: macos-latest + runs-on: macos-13 timeout-minutes: 35 needs: - generate-specs @@ -199,6 +199,17 @@ jobs: - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip + # Set up Detox as compiling dependency as + # temporary workaround for React Native 0.68 + # https://wix.github.io/Detox/docs/introduction/android/#setting-detox-up-as-a-compiling-dependency + # https://github.com/wix/Detox/issues/3344#issuecomment-1111197955 + - name: Set up Detox as compiling dependency for React Native 0.68 + run: | + sed -i'' -e $'s/rootProject.name = \'hotline-bling-codealong\'/rootProject.name = \'hotline-bling-codealong\'\\\ninclude \':detox\'\\\nproject(\':detox\').projectDir = new File(rootProject.projectDir, \'..\/node_modules\/detox\/android\/detox\')/' android/settings.gradle + sed -i'' -e $'s/\'com.wix:detox:+\'/project(path: ":detox")/' android/app/build.gradle + sed -i'' -e $'s/defaultConfig {/defaultConfig {\\\n testBuildType System.getProperty("testBuildType", "debug")\\\n testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"\\\n missingDimensionStrategy "detox", "full"/' android/app/build.gradle + + - name: Cache AVD snapshot uses: actions/cache@v4 id: avd-cache @@ -212,18 +223,11 @@ jobs: if: steps.avd-cache.outputs.cache-hit != 'true' uses: reactivecircus/android-emulator-runner@v2 with: - # Use the slimmer aosp_atd images for working - # around "System UI isn't responding" ANR - # (Application Not Responding) error - # - # https://android-developers.googleblog.com/2021/10/whats-new-in-scalable-automated-testing.html#:~:text=Slimmer%20Emulator%20System%20Images - # https://github.com/ReactiveCircus/android-emulator-runner/issues/129 - # https://github.com/upleveled/hotline-bling-codealong/pull/26#issuecomment-1094659722 - target: aosp_atd + target: google_apis api-level: 33 arch: x86 ram-size: 4096M - channel: canary + channel: stable profile: pixel avd-name: pixel_6_pro force-avd-creation: false @@ -235,11 +239,11 @@ jobs: - name: Start emulator and run Detox integration tests uses: reactivecircus/android-emulator-runner@v2 with: - target: aosp_atd + target: google_apis api-level: 33 arch: x86 ram-size: 4096M - channel: canary + channel: stable profile: pixel avd-name: pixel_6_pro force-avd-creation: false From 851606ff0a764cd5b0a12edd9879cd2aa57232f3 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 7 Jun 2024 23:26:40 +0530 Subject: [PATCH 232/362] test avd --- .github/workflows/e2e-detox-android-template.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index ec09234fb29..efbdf4d0fcb 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -209,7 +209,6 @@ jobs: sed -i'' -e $'s/\'com.wix:detox:+\'/project(path: ":detox")/' android/app/build.gradle sed -i'' -e $'s/defaultConfig {/defaultConfig {\\\n testBuildType System.getProperty("testBuildType", "debug")\\\n testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"\\\n missingDimensionStrategy "detox", "full"/' android/app/build.gradle - - name: Cache AVD snapshot uses: actions/cache@v4 id: avd-cache @@ -217,7 +216,7 @@ jobs: path: | ~/.android/avd/* ~/.android/adb* - key: avd-30-aosp-atd + key: avd-33-pixel_6_pro - name: Create AVD and generate snapshot for caching if: steps.avd-cache.outputs.cache-hit != 'true' @@ -250,7 +249,10 @@ jobs: emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none emulator-boot-timeout: 12000 disable-animations: true - script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + script: | + adb wait-for-device + adb shell input keyevent 82 + cd detox && npm run e2e:android-test -- ${{ matrix.specs }} # - name: Run Detox Tests # run: | From 16c93d67d3900b2928276f296190e82617c5de64 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 10 Jun 2024 12:17:31 +0530 Subject: [PATCH 233/362] docker android --- .../workflows/e2e-detox-android-template.yml | 99 ++++++++++--------- 1 file changed, 55 insertions(+), 44 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index efbdf4d0fcb..6fece21908b 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -199,16 +199,6 @@ jobs: - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip - # Set up Detox as compiling dependency as - # temporary workaround for React Native 0.68 - # https://wix.github.io/Detox/docs/introduction/android/#setting-detox-up-as-a-compiling-dependency - # https://github.com/wix/Detox/issues/3344#issuecomment-1111197955 - - name: Set up Detox as compiling dependency for React Native 0.68 - run: | - sed -i'' -e $'s/rootProject.name = \'hotline-bling-codealong\'/rootProject.name = \'hotline-bling-codealong\'\\\ninclude \':detox\'\\\nproject(\':detox\').projectDir = new File(rootProject.projectDir, \'..\/node_modules\/detox\/android\/detox\')/' android/settings.gradle - sed -i'' -e $'s/\'com.wix:detox:+\'/project(path: ":detox")/' android/app/build.gradle - sed -i'' -e $'s/defaultConfig {/defaultConfig {\\\n testBuildType System.getProperty("testBuildType", "debug")\\\n testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"\\\n missingDimensionStrategy "detox", "full"/' android/app/build.gradle - - name: Cache AVD snapshot uses: actions/cache@v4 id: avd-cache @@ -218,41 +208,62 @@ jobs: ~/.android/adb* key: avd-33-pixel_6_pro - - name: Create AVD and generate snapshot for caching - if: steps.avd-cache.outputs.cache-hit != 'true' - uses: reactivecircus/android-emulator-runner@v2 - with: - target: google_apis - api-level: 33 - arch: x86 - ram-size: 4096M - channel: stable - profile: pixel - avd-name: pixel_6_pro - force-avd-creation: false - emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - emulator-boot-timeout: 12000 - disable-animations: false - script: echo "Generated AVD snapshot for caching" - - - name: Start emulator and run Detox integration tests - uses: reactivecircus/android-emulator-runner@v2 + - name: Set up Android Emulator (using Docker - adjust as needed) + uses: actions/checkout@v3 with: - target: google_apis - api-level: 33 - arch: x86 - ram-size: 4096M - channel: stable - profile: pixel - avd-name: pixel_6_pro - force-avd-creation: false - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - emulator-boot-timeout: 12000 - disable-animations: true - script: | - adb wait-for-device - adb shell input keyevent 82 - cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + repository: https://github.com/google/android-emulator + ref: 'v3.2.4' # Consider using a specific tag for stability + + - name: run docker + run: | + docker build -t android-emulator . + docker run -d --name android-emulator android-emulator + + - name: Start Android Emulator + run: docker exec android-emulator emulator -avd Pixel_3A_API_30 + + - name: Run Detox tests + run: yarn detox test -c android.json + + - name: Stop Android Emulator (optional) + run: docker stop android-emulator + + + # - name: Create AVD and generate snapshot for caching + # if: steps.avd-cache.outputs.cache-hit != 'true' + # uses: reactivecircus/android-emulator-runner@v2 + # with: + # target: google_apis + # api-level: 33 + # arch: x86 + # ram-size: 4096M + # channel: stable + # profile: pixel + # avd-name: pixel_6_pro + # force-avd-creation: false + # emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + # emulator-boot-timeout: 12000 + # disable-animations: false + # script: echo "Generated AVD snapshot for caching" + + # - name: Start emulator and run Detox integration tests + # uses: reactivecircus/android-emulator-runner@v2 + # with: + # target: google_apis + # api-level: 33 + # arch: x86 + # ram-size: 4096M + # channel: stable + # profile: pixel + # avd-name: pixel_6_pro + # force-avd-creation: false + # emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + # emulator-boot-timeout: 12000 + # disable-animations: true + # script: | + # adb wait-for-device + # adb shell input keyevent 82 + # cd detox && npm run e2e:android-test -- ${{ matrix.specs }} # - name: Run Detox Tests # run: | From 6642da8e9380feb94617e9de7015b1555a9602f5 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 10 Jun 2024 12:44:41 +0530 Subject: [PATCH 234/362] check with google/android repo --- .github/workflows/e2e-detox-android-template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 6fece21908b..9fefb0ac0fd 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -211,7 +211,7 @@ jobs: - name: Set up Android Emulator (using Docker - adjust as needed) uses: actions/checkout@v3 with: - repository: https://github.com/google/android-emulator + repository: 'google/android-emulator' ref: 'v3.2.4' # Consider using a specific tag for stability - name: run docker From 4689bf75d8d68346096908966f670b2e16f5db35 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 10 Jun 2024 12:54:50 +0530 Subject: [PATCH 235/362] creat avd from reactivecircus --- .../workflows/e2e-detox-android-template.yml | 57 ++++++++++--------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 9fefb0ac0fd..e93fd73081f 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -168,6 +168,26 @@ jobs: - name: Install Sharp CLI for faster image generation during prebuild run: npm install --global sharp-cli + - name: Cache AVD snapshot + uses: actions/cache@v4 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* + key: avd-33-pixel_6_pro + + - name: create AVD and generate snapshot for caching + if: steps.avd-cache.outputs.cache-hit != 'true' + uses: reactivecircus/android-emulator-runner@v2 + with: + profile: pixel_6_pro + api-level: ${{ matrix.api-level }} + arch: x86_64 + force-avd-creation: false + emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + script: echo "Generated AVD snapshot for caching." + - name: Start React Native Metro Server run: npm run start & @@ -199,35 +219,16 @@ jobs: - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip - - name: Cache AVD snapshot - uses: actions/cache@v4 - id: avd-cache - with: - path: | - ~/.android/avd/* - ~/.android/adb* - key: avd-33-pixel_6_pro - - - name: Set up Android Emulator (using Docker - adjust as needed) - uses: actions/checkout@v3 + - name: Run tests + uses: reactivecircus/android-emulator-runner@v2 with: - repository: 'google/android-emulator' - ref: 'v3.2.4' # Consider using a specific tag for stability - - - name: run docker - run: | - docker build -t android-emulator . - docker run -d --name android-emulator android-emulator - - - name: Start Android Emulator - run: docker exec android-emulator emulator -avd Pixel_3A_API_30 - - - name: Run Detox tests - run: yarn detox test -c android.json - - - name: Stop Android Emulator (optional) - run: docker stop android-emulator - + profile: pixel_6_pro + api-level: 33 + arch: x86_64 + force-avd-creation: false + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + disable-animations: true + script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} # - name: Create AVD and generate snapshot for caching # if: steps.avd-cache.outputs.cache-hit != 'true' From f48bcd63e10e9e1c11aa3096edbce73ecf79ecfd Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 12 Jun 2024 04:29:52 +0530 Subject: [PATCH 236/362] fix api-level --- .github/workflows/e2e-detox-android-template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index e93fd73081f..e17b214d042 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -182,7 +182,7 @@ jobs: uses: reactivecircus/android-emulator-runner@v2 with: profile: pixel_6_pro - api-level: ${{ matrix.api-level }} + api-level: 33 arch: x86_64 force-avd-creation: false emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none From cdee012f4b46afddcc2276b1525a2e0a575499bf Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 12 Jun 2024 04:54:58 +0530 Subject: [PATCH 237/362] increase cores --- .github/workflows/e2e-detox-android-template.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index e17b214d042..8e069a02a38 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -148,7 +148,7 @@ jobs: e2e-android-on-mac: name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} continue-on-error: true - runs-on: macos-13 + runs-on: macos-14-large timeout-minutes: 35 needs: - generate-specs @@ -185,7 +185,7 @@ jobs: api-level: 33 arch: x86_64 force-avd-creation: false - emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -memory 4096 -cores 4 script: echo "Generated AVD snapshot for caching." - name: Start React Native Metro Server @@ -229,7 +229,7 @@ jobs: emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none disable-animations: true script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - + # - name: Create AVD and generate snapshot for caching # if: steps.avd-cache.outputs.cache-hit != 'true' # uses: reactivecircus/android-emulator-runner@v2 From d03ba0c3ce039c0e19ee4917f49b5cc5dac891c9 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 12 Jun 2024 05:41:26 +0530 Subject: [PATCH 238/362] test force create --- .../workflows/e2e-detox-android-template.yml | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 8e069a02a38..ae65bb5ca73 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -168,6 +168,12 @@ jobs: - name: Install Sharp CLI for faster image generation during prebuild run: npm install --global sharp-cli + - name: Set up Android SDK + uses: android-actions/setup-android@v2 + with: + sdk-package-names: "emulator,platform-tools,platforms;android-33" + build-tools-version: "33.0.0" + - name: Cache AVD snapshot uses: actions/cache@v4 id: avd-cache @@ -177,16 +183,14 @@ jobs: ~/.android/adb* key: avd-33-pixel_6_pro - - name: create AVD and generate snapshot for caching - if: steps.avd-cache.outputs.cache-hit != 'true' - uses: reactivecircus/android-emulator-runner@v2 - with: - profile: pixel_6_pro - api-level: 33 - arch: x86_64 - force-avd-creation: false - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -memory 4096 -cores 4 - script: echo "Generated AVD snapshot for caching." + - name: List available AVDs + run: | + echo "*****************" + $ANDROID_HOME/emulator/emulator -list-avds + if ! /Users/runner/Library/Android/sdk/emulator/emulator -list-avds | grep -q 'pixel_6_pro'; then + echo "*****************" + /Users/runner/Library/Android/sdk/tools/bin/avdmanager create avd -n pixel_6_pro -k "system-images;android-33;default;x86_64" -d pixel_6 + fi - name: Start React Native Metro Server run: npm run start & @@ -225,10 +229,12 @@ jobs: profile: pixel_6_pro api-level: 33 arch: x86_64 - force-avd-creation: false - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + force-avd-creation: true + emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none disable-animations: true - script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + script: | + cd detox + npm run e2e:android-test -- ${{ matrix.specs }} # - name: Create AVD and generate snapshot for caching # if: steps.avd-cache.outputs.cache-hit != 'true' From b537c0a612557ce853112f4cfd5bc8f222c8628f Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 12 Jun 2024 14:52:47 +0530 Subject: [PATCH 239/362] create AVD --- .../workflows/e2e-detox-android-template.yml | 80 +++++++------------ 1 file changed, 29 insertions(+), 51 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index ae65bb5ca73..62f537f38cb 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -183,15 +183,6 @@ jobs: ~/.android/adb* key: avd-33-pixel_6_pro - - name: List available AVDs - run: | - echo "*****************" - $ANDROID_HOME/emulator/emulator -list-avds - if ! /Users/runner/Library/Android/sdk/emulator/emulator -list-avds | grep -q 'pixel_6_pro'; then - echo "*****************" - /Users/runner/Library/Android/sdk/tools/bin/avdmanager create avd -n pixel_6_pro -k "system-images;android-33;default;x86_64" -d pixel_6 - fi - - name: Start React Native Metro Server run: npm run start & @@ -223,54 +214,41 @@ jobs: - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip - - name: Run tests + - name: Create AVD and generate snapshot for caching + if: steps.avd-cache.outputs.cache-hit != 'true' uses: reactivecircus/android-emulator-runner@v2 with: - profile: pixel_6_pro + target: google_apis api-level: 33 - arch: x86_64 - force-avd-creation: true + arch: x86 + ram-size: 4096M + channel: stable + profile: pixel + avd-name: pixel_6_pro + force-avd-creation: false emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + emulator-boot-timeout: 12000 + disable-animations: false + script: echo "Generated AVD snapshot for caching" + + - name: Start emulator and run Detox integration tests + uses: reactivecircus/android-emulator-runner@v2 + with: + target: google_apis + api-level: 33 + arch: x86 + ram-size: 4096M + channel: stable + profile: pixel + avd-name: pixel_6_pro + force-avd-creation: false + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + emulator-boot-timeout: 12000 disable-animations: true script: | - cd detox - npm run e2e:android-test -- ${{ matrix.specs }} - - # - name: Create AVD and generate snapshot for caching - # if: steps.avd-cache.outputs.cache-hit != 'true' - # uses: reactivecircus/android-emulator-runner@v2 - # with: - # target: google_apis - # api-level: 33 - # arch: x86 - # ram-size: 4096M - # channel: stable - # profile: pixel - # avd-name: pixel_6_pro - # force-avd-creation: false - # emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - # emulator-boot-timeout: 12000 - # disable-animations: false - # script: echo "Generated AVD snapshot for caching" - - # - name: Start emulator and run Detox integration tests - # uses: reactivecircus/android-emulator-runner@v2 - # with: - # target: google_apis - # api-level: 33 - # arch: x86 - # ram-size: 4096M - # channel: stable - # profile: pixel - # avd-name: pixel_6_pro - # force-avd-creation: false - # emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - # emulator-boot-timeout: 12000 - # disable-animations: true - # script: | - # adb wait-for-device - # adb shell input keyevent 82 - # cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + adb wait-for-device + adb shell input keyevent 82 + cd detox && npm run e2e:android-test -- ${{ matrix.specs }} # - name: Run Detox Tests # run: | From 83e338c3cac5c5dabbb6ff45e99c2482a069f79c Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 12 Jun 2024 15:10:12 +0530 Subject: [PATCH 240/362] kill emulators --- .github/workflows/e2e-detox-android-template.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 62f537f38cb..6ca1dbec6cd 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -214,6 +214,12 @@ jobs: - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip + - name: Kill any existing emulators + run: | + if /Users/runner/Library/Android/sdk/platform-tools/adb devices | grep -q emulator-5554; then + /Users/runner/Library/Android/sdk/platform-tools/adb -s emulator-5554 emu kill + fi + - name: Create AVD and generate snapshot for caching if: steps.avd-cache.outputs.cache-hit != 'true' uses: reactivecircus/android-emulator-runner@v2 From f9595335eb8dbd957fc41d46e285cb568de71a13 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 12 Jun 2024 15:40:42 +0530 Subject: [PATCH 241/362] test another job ubuntu --- .../workflows/e2e-detox-android-template.yml | 75 ++++++++++++++++++- 1 file changed, 73 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 6ca1dbec6cd..f4976915604 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -145,6 +145,77 @@ jobs: # name: android-build-apk-${{ github.run_id }} # path: "android/app/build/outputs/apk/**/app-*.apk" + trial-tests: + name: ubuntu tests + runs-on: ubuntu-latest + timeout-minutes: 90 + needs: + - generate-specs + strategy: + fail-fast: false + matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} + steps: + - uses: actions/checkout@v4 + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + - uses: gradle/actions/setup-gradle@v3 + continue-on-error: true + timeout-minutes: 5 + with: + cache-overwrite-existing: true + gradle-home-cache-cleanup: true + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm i + + - name: Create destination path + run: mkdir -p android/app/build/outputs/apk + + - name: Download artifact + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + curl -L -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + --output android/app/build/outputs/apk/artifact.zip + + - name: Unzip artifact + run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk + + - name: Cleanup + run: rm android/app/build/outputs/apk/artifact.zip + + # API 30+ emulators only have x86_64 system images. + - name: Get AVD info + uses: ./.github/actions/get-avd-info + id: avd-info + with: + api-level: 33 + + - name: Enable KVM + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + + - name: detox tests + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: 33 + arch: x86_64 + target: 33 + script: | + cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + e2e-android-on-mac: name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} continue-on-error: true @@ -226,7 +297,7 @@ jobs: with: target: google_apis api-level: 33 - arch: x86 + arch: x86_64 ram-size: 4096M channel: stable profile: pixel @@ -242,7 +313,7 @@ jobs: with: target: google_apis api-level: 33 - arch: x86 + arch: x86_64 ram-size: 4096M channel: stable profile: pixel From d1cbcc24cbde665751ce29998ca628d3f01ba9d4 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 12 Jun 2024 16:00:21 +0530 Subject: [PATCH 242/362] remove caching --- .../workflows/e2e-detox-android-template.yml | 44 ++++++++++--------- detox/e2e/support/test_config.ts | 10 ++--- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index f4976915604..e66a45805c8 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -149,6 +149,8 @@ jobs: name: ubuntu tests runs-on: ubuntu-latest timeout-minutes: 90 + env: + api-level: 33 needs: - generate-specs strategy: @@ -195,11 +197,16 @@ jobs: run: rm android/app/build/outputs/apk/artifact.zip # API 30+ emulators only have x86_64 system images. - - name: Get AVD info - uses: ./.github/actions/get-avd-info - id: avd-info - with: - api-level: 33 + - name: Determine emulator target + id: determine-target + run: | + TARGET="google_apis" + if [[ ${{ env.api-level }} -ge 30 ]]; then + TARGET="aosp_atd" + elif [[ ${{ env.api-level }} -le 27 ]]; then + TARGET="default" + fi + echo "TARGET=$TARGET" >> "$GITHUB_OUTPUT" - name: Enable KVM run: | @@ -210,11 +217,16 @@ jobs: - name: detox tests uses: reactivecircus/android-emulator-runner@v2 with: - api-level: 33 - arch: x86_64 - target: 33 - script: | - cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + api-level: ${{ env.api-level }} + arch: x86_64 + target: ${{ steps.determine-target.outputs.TARGET }} + channel: canary + force-avd-creation: false + emulator-boot-timeout: 300 + emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -logcat-output ${{ github.workspace }}/app/build/reports/avd${{ matrix.api-level }}.log + disable-animations: true + script: | + cd detox && npm run e2e:android-test -- ${{ matrix.specs }} e2e-android-on-mac: name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} @@ -245,15 +257,6 @@ jobs: sdk-package-names: "emulator,platform-tools,platforms;android-33" build-tools-version: "33.0.0" - - name: Cache AVD snapshot - uses: actions/cache@v4 - id: avd-cache - with: - path: | - ~/.android/avd/* - ~/.android/adb* - key: avd-33-pixel_6_pro - - name: Start React Native Metro Server run: npm run start & @@ -292,7 +295,6 @@ jobs: fi - name: Create AVD and generate snapshot for caching - if: steps.avd-cache.outputs.cache-hit != 'true' uses: reactivecircus/android-emulator-runner@v2 with: target: google_apis @@ -307,7 +309,7 @@ jobs: emulator-boot-timeout: 12000 disable-animations: false script: echo "Generated AVD snapshot for caching" - + - name: Start emulator and run Detox integration tests uses: reactivecircus/android-emulator-runner@v2 with: diff --git a/detox/e2e/support/test_config.ts b/detox/e2e/support/test_config.ts index aee64cbf02a..408d2061804 100644 --- a/detox/e2e/support/test_config.ts +++ b/detox/e2e/support/test_config.ts @@ -1,15 +1,15 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -export const serverOneUrl = process.env.SITE_1_URL || (process.env.IOS === 'true' ? 'http://localhost:8065' : 'http://10.0.2.2:8065'); -export const siteOneUrl = process.env.SITE_1_URL || 'http://localhost:8065'; -export const serverTwoUrl = process.env.SITE_2_URL || 'http://localhost:8065'; +export const serverOneUrl = process.env.SITE_1_URL || (process.env.IOS === 'true' ? 'https://plugins.test.mattermost.cloud' : 'http://10.0.2.2:8065'); +export const siteOneUrl = 'https://plugins.test.mattermost.cloud'; +export const serverTwoUrl = 'https://test-9-9-1-rc1.test.mattermost.cloud'; export const siteTwoUrl = process.env.SITE_2_URL || 'http://localhost:8065'; export const serverThreeUrl = process.env.SITE_3_URL || 'http://localhost:8065'; export const siteThreeUrl = process.env.SITE_3_URL || 'http://localhost:8065'; export const smtpUrl = process.env.SMTP_URL || 'http://127.0.0.1:9001'; export const adminEmail = process.env.ADMIN_EMAIL || 'sysadmin@sample.mattermost.com'; -export const adminUsername = process.env.ADMIN_USERNAME || 'sysadmin'; -export const adminPassword = process.env.ADMIN_PASSWORD || 'Sys@dmin-sample1'; +export const adminUsername = 'admin'; +export const adminPassword = 'admin@xqatw5wyofn4xyr6kmtr99kjqy'; export const ldapServer = process.env.LDAP_SERVER || '127.0.0.1'; export const ldapPort = process.env.LDAP_PORT || 389; From b6074ff664695efb427d8ae089c94ec98f3c8aa6 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 12 Jun 2024 16:22:15 +0530 Subject: [PATCH 243/362] force creating emulator --- .github/workflows/e2e-detox-android-template.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index e66a45805c8..46887b98ee3 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -221,11 +221,13 @@ jobs: arch: x86_64 target: ${{ steps.determine-target.outputs.TARGET }} channel: canary - force-avd-creation: false + force-avd-creation: true emulator-boot-timeout: 300 emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -logcat-output ${{ github.workspace }}/app/build/reports/avd${{ matrix.api-level }}.log disable-animations: true script: | + /Users/runner/Library/Android/sdk/emulator/emulator -list-avds + echo "**************" cd detox && npm run e2e:android-test -- ${{ matrix.specs }} e2e-android-on-mac: From ed90de72892875b1ba34a7a29490b0698fb6bcdd Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 15 Jun 2024 03:24:24 +0530 Subject: [PATCH 244/362] new server --- detox/e2e/support/test_config.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/detox/e2e/support/test_config.ts b/detox/e2e/support/test_config.ts index 408d2061804..4699b9399b5 100644 --- a/detox/e2e/support/test_config.ts +++ b/detox/e2e/support/test_config.ts @@ -1,15 +1,15 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -export const serverOneUrl = process.env.SITE_1_URL || (process.env.IOS === 'true' ? 'https://plugins.test.mattermost.cloud' : 'http://10.0.2.2:8065'); -export const siteOneUrl = 'https://plugins.test.mattermost.cloud'; -export const serverTwoUrl = 'https://test-9-9-1-rc1.test.mattermost.cloud'; -export const siteTwoUrl = process.env.SITE_2_URL || 'http://localhost:8065'; -export const serverThreeUrl = process.env.SITE_3_URL || 'http://localhost:8065'; -export const siteThreeUrl = process.env.SITE_3_URL || 'http://localhost:8065'; +export const serverOneUrl = 'https://mobile-e2e-site-1.test.mattermost.cloud' +export const siteOneUrl = 'https://mobile-e2e-site-1.test.mattermost.cloud' +export const serverTwoUrl = 'https://mobile-e2e-site-2.test.mattermost.cloud' +export const siteTwoUrl = 'https://mobile-e2e-site-2.test.mattermost.cloud' +export const serverThreeUrl = 'https://mobile-e2e-site-3.test.mattermost.cloud' +export const siteThreeUrl = 'https://mobile-e2e-site-3.test.mattermost.cloud' export const smtpUrl = process.env.SMTP_URL || 'http://127.0.0.1:9001'; -export const adminEmail = process.env.ADMIN_EMAIL || 'sysadmin@sample.mattermost.com'; -export const adminUsername = 'admin'; -export const adminPassword = 'admin@xqatw5wyofn4xyr6kmtr99kjqy'; +export const adminEmail = 'success+sysadmin@simulator.amazonses.com' +export const adminUsername = 'admin' +export const adminPassword = 'admin@bq8s1bqr6inm8rramf4js8f96a' export const ldapServer = process.env.LDAP_SERVER || '127.0.0.1'; export const ldapPort = process.env.LDAP_PORT || 389; From 4c5e5a850a29b06ed29b1161e136a3cd34bf8832 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 20 Jun 2024 18:07:51 +0530 Subject: [PATCH 245/362] check if android runs on macos-14 --- .../workflows/e2e-detox-android-template.yml | 271 +----------------- 1 file changed, 13 insertions(+), 258 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 46887b98ee3..49bf18b9801 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -145,96 +145,11 @@ jobs: # name: android-build-apk-${{ github.run_id }} # path: "android/app/build/outputs/apk/**/app-*.apk" - trial-tests: - name: ubuntu tests - runs-on: ubuntu-latest - timeout-minutes: 90 - env: - api-level: 33 - needs: - - generate-specs - strategy: - fail-fast: false - matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} - steps: - - uses: actions/checkout@v4 - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps - - - uses: actions/setup-java@v4 - with: - distribution: 'zulu' - java-version: 17 - - uses: gradle/actions/setup-gradle@v3 - continue-on-error: true - timeout-minutes: 5 - with: - cache-overwrite-existing: true - gradle-home-cache-cleanup: true - - - name: Start React Native Metro Server - run: npm run start & - - - name: Install Detox Dependencies - run: cd detox && npm i - - - name: Create destination path - run: mkdir -p android/app/build/outputs/apk - - - name: Download artifact - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - curl -L -H "Authorization: token $GITHUB_TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - --output android/app/build/outputs/apk/artifact.zip - - - name: Unzip artifact - run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk - - - name: Cleanup - run: rm android/app/build/outputs/apk/artifact.zip - - # API 30+ emulators only have x86_64 system images. - - name: Determine emulator target - id: determine-target - run: | - TARGET="google_apis" - if [[ ${{ env.api-level }} -ge 30 ]]; then - TARGET="aosp_atd" - elif [[ ${{ env.api-level }} -le 27 ]]; then - TARGET="default" - fi - echo "TARGET=$TARGET" >> "$GITHUB_OUTPUT" - - - name: Enable KVM - run: | - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm - - - name: detox tests - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: ${{ env.api-level }} - arch: x86_64 - target: ${{ steps.determine-target.outputs.TARGET }} - channel: canary - force-avd-creation: true - emulator-boot-timeout: 300 - emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -logcat-output ${{ github.workspace }}/app/build/reports/avd${{ matrix.api-level }}.log - disable-animations: true - script: | - /Users/runner/Library/Android/sdk/emulator/emulator -list-avds - echo "**************" - cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - e2e-android-on-mac: name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} continue-on-error: true - runs-on: macos-14-large - timeout-minutes: 35 + runs-on: macos-14 + timeout-minutes: 40 needs: - generate-specs # - build-android-apk @@ -253,12 +168,6 @@ jobs: - name: Install Sharp CLI for faster image generation during prebuild run: npm install --global sharp-cli - - name: Set up Android SDK - uses: android-actions/setup-android@v2 - with: - sdk-package-names: "emulator,platform-tools,platforms;android-33" - build-tools-version: "33.0.0" - - name: Start React Native Metro Server run: npm run start & @@ -290,50 +199,18 @@ jobs: - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip - - name: Kill any existing emulators - run: | - if /Users/runner/Library/Android/sdk/platform-tools/adb devices | grep -q emulator-5554; then - /Users/runner/Library/Android/sdk/platform-tools/adb -s emulator-5554 emu kill - fi - - - name: Create AVD and generate snapshot for caching - uses: reactivecircus/android-emulator-runner@v2 - with: - target: google_apis - api-level: 33 - arch: x86_64 - ram-size: 4096M - channel: stable - profile: pixel - avd-name: pixel_6_pro - force-avd-creation: false - emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - emulator-boot-timeout: 12000 - disable-animations: false - script: echo "Generated AVD snapshot for caching" - - - name: Start emulator and run Detox integration tests - uses: reactivecircus/android-emulator-runner@v2 + - name: Set up Android SDK + uses: android-actions/setup-android@v2 with: - target: google_apis - api-level: 33 - arch: x86_64 - ram-size: 4096M - channel: stable - profile: pixel - avd-name: pixel_6_pro - force-avd-creation: false - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - emulator-boot-timeout: 12000 - disable-animations: true - script: | - adb wait-for-device - adb shell input keyevent 82 - cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - # - name: Run Detox Tests - # run: | - # cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + android-sdk-root: ${{ github.workspace }}/android-sdk + + - name: Run Android Detox E2E Tests on macOS + run: | + echo "no" | ${{ github.workspace }}/android-sdk/cmdline-tools/latest/bin/avdmanager create avd --force -n emu.avd -k "system-images;android-29;google_apis;x86_64" --device "pixel_4" + echo "hw.gpu.enabled=true" >> ~/.android/avd/emu.avd/config.ini + ${{ github.workspace }}/android-sdk/emulator/emulator -avd emu.avd -no-audio -no-window & + ${{ github.workspace }}/android-sdk/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;' + cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - name: Upload Android Test Report if: always() @@ -342,128 +219,6 @@ jobs: name: android-results-${{ matrix.runId }} path: detox/artifacts - # e2e-android: - # continue-on-error: true - # name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} - # env: - # IOS: false - # GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096m" - # ARCH: x86_64 - # DEVICE_NAME: ${{ needs.generate-specs.outputs.device_name }} - # DEVICE_OS_VERSION: ${{ needs.generate-specs.outputs.device_os_version }} - # runs-on: ubuntu-22.04 - # needs: - # - generate-specs - # # - build-android-apk - # strategy: - # fail-fast: false - # matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} - # steps: - # - name: Checkout Repository - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - # - name: Install Java - # uses: actions/setup-java@v4 - # with: - # java-version: "17" - # distribution: "adopt" - # cache: "gradle" - - # - name: Create destination path - # run: mkdir -p android/app/build/outputs/apk - - # - name: Download artifact - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # run: | - # curl -L -H "Authorization: token $GITHUB_TOKEN" \ - # -H "Accept: application/vnd.github.v3+json" \ - # https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - # --output android/app/build/outputs/apk/artifact.zip - - # - name: Unzip artifact - # run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk - - # - name: Cleanup - # run: rm android/app/build/outputs/apk/artifact.zip - - # - name: Enable KVM - # run: | - # echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - # sudo udevadm control --reload-rules - # sudo udevadm trigger --name-match=kvm - - # - name: ci/prepare-node-deps - # uses: ./.github/actions/prepare-node-deps - - # - name: Gradle cache - # uses: gradle/actions/setup-gradle@v3 - - # - name: Empty disk space - # uses: jlumbroso/free-disk-space@main - # with: - # tool-cache: false - # android: false - # dotnet: true - # haskell: true - # large-packages: false - # docker-images: true - # swap-storage: false - - # - name: Install Android SDK - # run: | - # sudo apt-get update - # sudo apt-get install -y openjdk-11-jdk wget unzip - # mkdir -p $HOME/android-sdk/cmdline-tools/latest - # wget https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip -O cmdline-tools.zip - # unzip cmdline-tools.zip -d $HOME/android-sdk/cmdline-tools/latest - # mv $HOME/android-sdk/cmdline-tools/latest/cmdline-tools/* $HOME/android-sdk/cmdline-tools/latest/ - # yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses - # $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "platform-tools" "platforms;android-33" "system-images;android-33;default;x86_64" "emulator" - - # - name: Create AVD - # run: | - # echo no | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd --force -n pixel_6_pro --abi 'default/x86_64' --package 'system-images;android-33;default;x86_64' - # printf 'hw.cpu.ncore=2\n' >> $HOME/.android/avd/pixel_6_pro.avd/config.ini - - # - name: Start emulator - # run: | - # $ANDROID_HOME/emulator/emulator -avd pixel_6_pro -no-snapshot -no-audio -no-boot-anim -gpu swiftshader_indirect & - # adb wait-for-device - # adb shell getprop sys.boot_completed - # sleep 60 - # adb shell input keyevent 82 - - # - name: Disable animations - # run: | - # adb shell settings put global window_animation_scale 0.0 - # adb shell settings put global transition_animation_scale 0.0 - # adb shell settings put global animator_duration_scale 0.0 - - # # - name: Download Android APK - # # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - # # with: - # # # name: android-build-apk-${{ github.run_id }} - # # name: android-build-apk-9414649994 - # # path: android/app/build/outputs/apk/ - - # - name: Start React Native Metro Server - # run: npm run start & - - # - name: Install Detox Dependencies - # run: cd detox && npm i - - # - name: Run Detox Tests - # run: | - # cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - # - name: Upload Android Test Report - # if: always() - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: android-results-${{ matrix.runId }} - # path: detox/artifacts - download-e2e-results: runs-on: ubuntu-22.04 needs: From 1ca3f18a2a7f165052ea37c6f3fef5c56123681c Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 20 Jun 2024 18:09:51 +0530 Subject: [PATCH 246/362] pixel_4 - API-29 --- detox/.detoxrc.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 068585f6f68..1265287c271 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -37,8 +37,8 @@ "android": { "type": "android.emulator", "device": { - "avdName": "pixel_6_pro", - "api": "33" + "avdName": "pixel_4", + "api": "29" } } }, From b9984f36466fc5d85292a4d73fa847640a8764a8 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 20 Jun 2024 21:47:08 +0530 Subject: [PATCH 247/362] New way to launch on macos-13 --- .../workflows/e2e-detox-android-template.yml | 35 ++++++++++++++----- detox/.detoxrc.json | 4 +-- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 49bf18b9801..efbd566529b 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -148,7 +148,7 @@ jobs: e2e-android-on-mac: name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} continue-on-error: true - runs-on: macos-14 + runs-on: macos-13 timeout-minutes: 40 needs: - generate-specs @@ -199,18 +199,35 @@ jobs: - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip - - name: Set up Android SDK - uses: android-actions/setup-android@v2 + - name: launch + run: | + echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' + echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" + echo "Emulator created successfully" + nohup $ANDROID_HOME/emulator/emulator -memory 2048 -avd android_emulator -skin 1080x1920 -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel auto -gpu guest -qemu -lcd-density 420 > /dev/null 2>&1 & + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done' + $ANDROID_HOME/platform-tools/adb devices + $ANDROID_HOME/platform-tools/adb shell input keyevent 82 + $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 + $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 + $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 + sleep 120 + screencapture emulator-macos-13.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-macos-13.png + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-macos-13.jpg + + - uses: actions/upload-artifact@v3 with: - android-sdk-root: ${{ github.workspace }}/android-sdk + name: Android-Emulator-Screenshots + path: emulator-macos-13.jpg.png - name: Run Android Detox E2E Tests on macOS run: | - echo "no" | ${{ github.workspace }}/android-sdk/cmdline-tools/latest/bin/avdmanager create avd --force -n emu.avd -k "system-images;android-29;google_apis;x86_64" --device "pixel_4" - echo "hw.gpu.enabled=true" >> ~/.android/avd/emu.avd/config.ini - ${{ github.workspace }}/android-sdk/emulator/emulator -avd emu.avd -no-audio -no-window & - ${{ github.workspace }}/android-sdk/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;' - cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - name: Upload Android Test Report if: always() diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 1265287c271..f64d75c208b 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -37,8 +37,8 @@ "android": { "type": "android.emulator", "device": { - "avdName": "pixel_4", - "api": "29" + "avdName": "pixel_6", + "api": "31" } } }, From ebf87536579a4e79d91193bf1883b80f21a734e1 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 21 Jun 2024 06:10:18 +0530 Subject: [PATCH 248/362] increase memory --- .github/workflows/e2e-detox-android-template.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index efbd566529b..d42b08e373a 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -199,19 +199,19 @@ jobs: - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip - - name: launch + - name: Launch Android Emulator run: | echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" echo "Emulator created successfully" - nohup $ANDROID_HOME/emulator/emulator -memory 2048 -avd android_emulator -skin 1080x1920 -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel auto -gpu guest -qemu -lcd-density 420 > /dev/null 2>&1 & - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done' + nohup $ANDROID_HOME/emulator/emulator -avd android_emulator -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -qemu -m 4096 > /dev/null 2>&1 & + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\''\r'\'') ]]; do sleep 1; done' $ANDROID_HOME/platform-tools/adb devices $ANDROID_HOME/platform-tools/adb shell input keyevent 82 $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - sleep 120 + sleep 60 screencapture emulator-macos-13.jpg $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-macos-13.png From 241891a1af8ae07de84e1703d88973fae243be59 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 21 Jun 2024 06:36:51 +0530 Subject: [PATCH 249/362] test loop --- .../workflows/e2e-detox-android-template.yml | 232 +++++++++++------- 1 file changed, 144 insertions(+), 88 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index d42b08e373a..5b0a0449538 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -145,102 +145,158 @@ jobs: # name: android-build-apk-${{ github.run_id }} # path: "android/app/build/outputs/apk/**/app-*.apk" - e2e-android-on-mac: - name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} - continue-on-error: true - runs-on: macos-13 - timeout-minutes: 40 - needs: - - generate-specs - # - build-android-apk + # e2e-android-on-mac: + # name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} + # continue-on-error: true + # runs-on: macos-13 + # timeout-minutes: 40 + # needs: + # - generate-specs + # # - build-android-apk + # strategy: + # fail-fast: false + # matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} + # steps: + # - name: Checkout + # uses: actions/checkout@v1 + # with: + # fetch-depth: 1 + + # - name: ci/prepare-node-deps + # uses: ./.github/actions/prepare-node-deps + + # - name: Install Sharp CLI for faster image generation during prebuild + # run: npm install --global sharp-cli + + # - name: Start React Native Metro Server + # run: npm run start & + + # - name: Install Detox Dependencies + # run: cd detox && npm i + + # - name: Install Java + # uses: actions/setup-java@v4 + # with: + # java-version: "17" + # distribution: "adopt" + # cache: "gradle" + + # - name: Create destination path + # run: mkdir -p android/app/build/outputs/apk + + # - name: Download artifact + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # run: | + # curl -L -H "Authorization: token $GITHUB_TOKEN" \ + # -H "Accept: application/vnd.github.v3+json" \ + # https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + # --output android/app/build/outputs/apk/artifact.zip + + # - name: Unzip artifact + # run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk + + # - name: Cleanup + # run: rm android/app/build/outputs/apk/artifact.zip + + # - name: Launch Android Emulator + # run: | + # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' + # echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" + # echo "Emulator created successfully" + # nohup $ANDROID_HOME/emulator/emulator -avd android_emulator -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -qemu -m 4096 > /dev/null 2>&1 & + # $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\''\r'\'') ]]; do sleep 1; done' + # $ANDROID_HOME/platform-tools/adb devices + # $ANDROID_HOME/platform-tools/adb shell input keyevent 82 + # $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 + # $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 + # $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 + # sleep 60 + # screencapture emulator-macos-13.jpg + # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-macos-13.png + + # - uses: actions/upload-artifact@v3 + # with: + # name: Android-Emulator-Screenshots + # path: emulator-macos-13.jpg + + # - uses: actions/upload-artifact@v3 + # with: + # name: Android-Emulator-Screenshots + # path: emulator-macos-13.jpg.png + + # - name: Run Android Detox E2E Tests on macOS + # run: | + # cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + + # - name: Upload Android Test Report + # if: always() + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-results-${{ matrix.runId }} + # path: detox/artifacts + + test: + runs-on: ${{ matrix.os }} strategy: fail-fast: false - matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} + matrix: + os: ['macos-12'] + try: ['0', '1', '2'] + steps: - - name: Checkout - uses: actions/checkout@v1 - with: - fetch-depth: 1 - - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps - - - name: Install Sharp CLI for faster image generation during prebuild - run: npm install --global sharp-cli - - - name: Start React Native Metro Server - run: npm run start & - - - name: Install Detox Dependencies - run: cd detox && npm i - - - name: Install Java - uses: actions/setup-java@v4 - with: - java-version: "17" - distribution: "adopt" - cache: "gradle" - - - name: Create destination path - run: mkdir -p android/app/build/outputs/apk - - - name: Download artifact - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - curl -L -H "Authorization: token $GITHUB_TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - --output android/app/build/outputs/apk/artifact.zip - - - name: Unzip artifact - run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk - - - name: Cleanup - run: rm android/app/build/outputs/apk/artifact.zip - - - name: Launch Android Emulator - run: | - echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' - echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" - echo "Emulator created successfully" - nohup $ANDROID_HOME/emulator/emulator -avd android_emulator -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -qemu -m 4096 > /dev/null 2>&1 & - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\''\r'\'') ]]; do sleep 1; done' - $ANDROID_HOME/platform-tools/adb devices - $ANDROID_HOME/platform-tools/adb shell input keyevent 82 - $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 - $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 - $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - sleep 60 - screencapture emulator-macos-13.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-macos-13.png - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-macos-13.jpg - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-macos-13.jpg.png - - - name: Run Android Detox E2E Tests on macOS - run: | - cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - - name: Upload Android Test Report - if: always() - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-results-${{ matrix.runId }} - path: detox/artifacts + - run: system_profiler SPHardwareDataType + - run: | + echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-30;google_apis;x86' + for (( i=0; i<2; i++ )); do + # create and start emulator with specific SDK + emulator_name='emulator'$i + echo -e $(date) "$debugTag Create AVD $emulator_name " + if [[ "`uname -m`" == "arm64" ]]; then + $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n $emulator_name -k "system-images;android-30;google_apis;arm64-v8a" -d pixel_6 --force + echo qq + else + echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n $emulator_name -k "system-images;android-30;google_apis;x86" -d pixel_6 --force + fi + echo -e $(date) "$debugTag Check hardware acceleration " + $ANDROID_HOME/emulator/emulator -accel-check + echo -e $(date) "$debugTag Boot AVD $emulator_name " + # wait for AVD boot finished + if [[ "`uname -m`" == "arm64" ]]; then + $ANDROID_HOME/emulator/emulator -avd $emulator_name -cores 2 -memory 2048 -accel on -noaudio -no-snapshot -no-boot-anim & + else + nohup $ANDROID_HOME/emulator/emulator -avd $emulator_name -cores 2 -memory 5120 -accel on -gpu swiftshader_indirect -noaudio -no-snapshot -no-boot-anim & + fi + echo -e $(date) "$debugTag Wait for AVD boot finished " + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done' + + echo -e $(date) "$debugTag Emulator started" + + echo -e $(date) "Access emulator with adb" + "$ANDROID_HOME/platform-tools/adb" shell ls 2>/dev/null > ls.log + + echo -e $(date) "Stop emulator " + adb devices | grep emulator | cut -f1 | while read line; do adb -s $line emu kill; done + sleep 30 + done + sleep 30 + screencapture emulator-macos-13.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-macos-13.png + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-${{ matrix.os }}-${{ matrix.try }}.jpg + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-${{ matrix.os }}-${{ matrix.try }}.png download-e2e-results: runs-on: ubuntu-22.04 needs: - generate-specs - - e2e-android-on-mac + # - e2e-android-on-mac steps: - name: Checkout Repository uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 From fa1b2902a6eb0db1c7778516e4c6b753944d3b19 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 22 Jun 2024 01:59:37 +0530 Subject: [PATCH 250/362] test launch --- .../workflows/e2e-detox-android-template.yml | 352 ++++++++++-------- start_emu_headless.sh | 104 ++++++ 2 files changed, 292 insertions(+), 164 deletions(-) create mode 100644 start_emu_headless.sh diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 5b0a0449538..e9ec0f2f9b1 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -49,51 +49,51 @@ env: FAILURE_MESSAGE: "Something has failed" jobs: - update-initial-status: - runs-on: ubuntu-22.04 - steps: - - uses: mattermost/actions/delivery/update-commit-status@main - env: - GITHUB_TOKEN: ${{ github.token }} - with: - repository_full_name: ${{ github.repository }} - commit_sha: ${{ inputs.commit_sha }} - context: ${{ inputs.status_check_context }} - description: Detox tests for mattermost mobile app - status: pending - - generate-specs: - needs: update-initial-status - runs-on: ubuntu-22.04 - outputs: - specs: ${{ steps.generate-specs.outputs.specs }} - build_id: ${{ env.BUILD_ID }} - device_name: ${{ env.DEVICE_NAME }} - device_os_version: ${{ env.DEVICE_OS_VERSION }} - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + # update-initial-status: + # runs-on: ubuntu-22.04 + # steps: + # - uses: mattermost/actions/delivery/update-commit-status@main + # env: + # GITHUB_TOKEN: ${{ github.token }} + # with: + # repository_full_name: ${{ github.repository }} + # commit_sha: ${{ inputs.commit_sha }} + # context: ${{ inputs.status_check_context }} + # description: Detox tests for mattermost mobile app + # status: pending - - name: Set Build ID - id: resolve-device - run: | - cd detox - DEVICE_NAME=$(node -p "require('./.detoxrc').devices['android'].device.avdName") - DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['android'].device.api") - BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" - - echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV - echo "DEVICE_NAME=$(echo ${DEVICE_NAME})" >> $GITHUB_ENV - echo "DEVICE_OS_VERSION=$(echo ${DEVICE_OS_VERSION})" >> $GITHUB_ENV - - - name: Generate Test Specs - id: generate-specs - uses: ./.github/actions/generate-specs - with: - parallelism: 10 - search_path: detox/e2e/test - device_name: ${{ env.DEVICE_NAME }} - device_os_version: ${{env.DEVICE_OS_VERSION}} + # generate-specs: + # needs: update-initial-status + # runs-on: ubuntu-22.04 + # outputs: + # specs: ${{ steps.generate-specs.outputs.specs }} + # build_id: ${{ env.BUILD_ID }} + # device_name: ${{ env.DEVICE_NAME }} + # device_os_version: ${{ env.DEVICE_OS_VERSION }} + # steps: + # - name: Checkout Repository + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + # - name: Set Build ID + # id: resolve-device + # run: | + # cd detox + # DEVICE_NAME=$(node -p "require('./.detoxrc').devices['android'].device.avdName") + # DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['android'].device.api") + # BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" + + # echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV + # echo "DEVICE_NAME=$(echo ${DEVICE_NAME})" >> $GITHUB_ENV + # echo "DEVICE_OS_VERSION=$(echo ${DEVICE_OS_VERSION})" >> $GITHUB_ENV + + # - name: Generate Test Specs + # id: generate-specs + # uses: ./.github/actions/generate-specs + # with: + # parallelism: 10 + # search_path: detox/e2e/test + # device_name: ${{ env.DEVICE_NAME }} + # device_os_version: ${{env.DEVICE_OS_VERSION}} # build-android-apk: # needs: update-initial-status @@ -237,52 +237,76 @@ jobs: # path: detox/artifacts test: + runs-on: macos-12 + strategy: + fail-fast: false + env: + ANDROID_BUILD_TOOLS_VERSION: "34.0.0" + ANDROID_SDK_PACKAGES: "platform-tools build-tools;34.0.0 system-images;android-31;google_apis;x86_64" + ANDROID_TARGET: "android-31" + ANDROID_ARCH: "x86_64" + EMULATOR_TIMEOUT: "600" + EMULATOR_NAME: "pixel_6" + + steps: + - name: Checkout Repository + uses: actions/checkout@v4.1.1 + + - name: Add avdmanager and sdkmanager to system PATH + run: | + echo "$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools/${{ env.ANDROID_BUILD_TOOLS_VERSION }}" >> $GITHUB_PATH + + - name: Install Sdk + run: | + yes Y | sdkmanager --licenses + sdkmanager --install ${{ env.ANDROID_SDK_PACKAGES }} + + - name: Build emulator + run: | + echo "no" | avdmanager --verbose create avd --force -n ${{ env.EMULATOR_NAME }} --abi "${{ env.ANDROID_TARGET }}/${{ env.ANDROID_ARCH }}" -k "system-images;${{ env.ANDROID_TARGET }};google_apis;${{ env.ANDROID_ARCH }}" + + - name: Launch emulator + run: | + chmod +x ./start_emu_headless.sh + EMULATOR_TIMEOUT=${{ env.EMULATOR_TIMEOUT }} EMULATOR_NAME=${{ env.EMULATOR_NAME }} ./start_emu_headless.sh + + screencapture emulator-31-1.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31-1.png + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-31-1.jpg + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-31-1.png + + test-snapshot: runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - os: ['macos-12'] + os: ['macos-12', 'macos-13'] try: ['0', '1', '2'] steps: - run: system_profiler SPHardwareDataType - run: | - echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-30;google_apis;x86' - for (( i=0; i<2; i++ )); do - # create and start emulator with specific SDK - emulator_name='emulator'$i - echo -e $(date) "$debugTag Create AVD $emulator_name " - if [[ "`uname -m`" == "arm64" ]]; then - $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n $emulator_name -k "system-images;android-30;google_apis;arm64-v8a" -d pixel_6 --force - echo qq - else - echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n $emulator_name -k "system-images;android-30;google_apis;x86" -d pixel_6 --force - fi - echo -e $(date) "$debugTag Check hardware acceleration " - $ANDROID_HOME/emulator/emulator -accel-check - echo -e $(date) "$debugTag Boot AVD $emulator_name " - # wait for AVD boot finished - if [[ "`uname -m`" == "arm64" ]]; then - $ANDROID_HOME/emulator/emulator -avd $emulator_name -cores 2 -memory 2048 -accel on -noaudio -no-snapshot -no-boot-anim & - else - nohup $ANDROID_HOME/emulator/emulator -avd $emulator_name -cores 2 -memory 5120 -accel on -gpu swiftshader_indirect -noaudio -no-snapshot -no-boot-anim & - fi - echo -e $(date) "$debugTag Wait for AVD boot finished " - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done' - - echo -e $(date) "$debugTag Emulator started" - - echo -e $(date) "Access emulator with adb" - "$ANDROID_HOME/platform-tools/adb" shell ls 2>/dev/null > ls.log - - echo -e $(date) "Stop emulator " - adb devices | grep emulator | cut -f1 | while read line; do adb -s $line emu kill; done - sleep 30 - done - sleep 30 - screencapture emulator-macos-13.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-macos-13.png - + echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' + echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" + echo "Emulator created successfully" + nohup $ANDROID_HOME/emulator/emulator -memory 2048 -avd android_emulator -skin 1080x1920 -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel auto -gpu guest -qemu -lcd-density 420 > /dev/null 2>&1 & + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done' + $ANDROID_HOME/platform-tools/adb devices + #$ANDROID_HOME/platform-tools/adb shell input keyevent 82 + #$ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 + #$ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 + #$ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 + sleep 120 + screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.os }}-${{ matrix.try }}.png - uses: actions/upload-artifact@v3 with: name: Android-Emulator-Screenshots @@ -292,91 +316,91 @@ jobs: name: Android-Emulator-Screenshots path: emulator-${{ matrix.os }}-${{ matrix.try }}.png - download-e2e-results: - runs-on: ubuntu-22.04 - needs: - - generate-specs - # - e2e-android-on-mac - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + # download-e2e-results: + # runs-on: ubuntu-22.04 + # needs: + # - generate-specs + # # - e2e-android-on-mac + # steps: + # - name: Checkout Repository + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps + # - name: ci/prepare-node-deps + # uses: ./.github/actions/prepare-node-deps - - name: Create artifacts directory - run: mkdir -p detox/artifacts/ + # - name: Create artifacts directory + # run: mkdir -p detox/artifacts/ - - name: Download All Android Artifacts - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - path: detox/artifacts/ - pattern: android-results-* + # - name: Download All Android Artifacts + # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # with: + # path: detox/artifacts/ + # pattern: android-results-* - - name: Save report Detox Dependencies - run: | - cd detox - npm ci - npm run e2e:save-report - env: - IOS: false - - update-final-status: - runs-on: ubuntu-22.04 - needs: - - generate-specs - - download-e2e-results - steps: - - name: Set Target URL - id: set-url - run: | - s3Folder="${{ env.BUILD_ID }}-${{ env.COMMIT_HASH }}-${{ env.BRANCH }}" - s3Folder=$(echo "$s3Folder" | sed 's/\./-/g') - echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/android-report.html" >> $GITHUB_ENV - env: - BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} - - - name: Determine Status - id: determine-status - run: | - if [[ ${{ needs.download-e2e-results.outputs.failures }} -gt 0 && "${{ inputs.testcase_failure_fatal }}" == "true" ]]; then - echo "status=failure" >> $GITHUB_ENV - else - echo "status=success" >> $GITHUB_ENV - fi - - - uses: mattermost/actions/delivery/update-commit-status@main - env: - GITHUB_TOKEN: ${{ github.token }} - with: - repository_full_name: ${{ github.repository }} - commit_sha: ${{ inputs.commit_sha }} - context: ${{ inputs.status_check_context }} - description: | - Completed with ${{ needs.download-e2e-results.outputs.failures }} failures - status: ${{ env.status }} - target_url: ${{ env.TARGET_URL }} - - e2e-remove-label: - if: ${{ inputs.remove-pr-label }} - needs: - - download-e2e-results - runs-on: ubuntu-22.04 - steps: - - name: e2e/remove-label-from-pr - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - continue-on-error: true # Label might have been removed manually - with: - script: | - const androidLabel = 'E2E Android tests for PR'; - const labels = context.payload.pull_request.labels.map(label => label.name); - - if (labels.includes(androidLabel)) { - github.rest.issues.removeLabel({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - name: androidLabel, - }); - } + # - name: Save report Detox Dependencies + # run: | + # cd detox + # npm ci + # npm run e2e:save-report + # env: + # IOS: false + + # update-final-status: + # runs-on: ubuntu-22.04 + # needs: + # - generate-specs + # - download-e2e-results + # steps: + # - name: Set Target URL + # id: set-url + # run: | + # s3Folder="${{ env.BUILD_ID }}-${{ env.COMMIT_HASH }}-${{ env.BRANCH }}" + # s3Folder=$(echo "$s3Folder" | sed 's/\./-/g') + # echo "TARGET_URL=https://${{ env.DETOX_AWS_S3_BUCKET }}.s3.amazonaws.com/${s3Folder}/jest-stare/android-report.html" >> $GITHUB_ENV + # env: + # BUILD_ID: ${{ needs.generate-specs.outputs.build_id }} + + # - name: Determine Status + # id: determine-status + # run: | + # if [[ ${{ needs.download-e2e-results.outputs.failures }} -gt 0 && "${{ inputs.testcase_failure_fatal }}" == "true" ]]; then + # echo "status=failure" >> $GITHUB_ENV + # else + # echo "status=success" >> $GITHUB_ENV + # fi + + # - uses: mattermost/actions/delivery/update-commit-status@main + # env: + # GITHUB_TOKEN: ${{ github.token }} + # with: + # repository_full_name: ${{ github.repository }} + # commit_sha: ${{ inputs.commit_sha }} + # context: ${{ inputs.status_check_context }} + # description: | + # Completed with ${{ needs.download-e2e-results.outputs.failures }} failures + # status: ${{ env.status }} + # target_url: ${{ env.TARGET_URL }} + + # e2e-remove-label: + # if: ${{ inputs.remove-pr-label }} + # needs: + # - download-e2e-results + # runs-on: ubuntu-22.04 + # steps: + # - name: e2e/remove-label-from-pr + # uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + # continue-on-error: true # Label might have been removed manually + # with: + # script: | + # const androidLabel = 'E2E Android tests for PR'; + # const labels = context.payload.pull_request.labels.map(label => label.name); + + # if (labels.includes(androidLabel)) { + # github.rest.issues.removeLabel({ + # issue_number: context.issue.number, + # owner: context.repo.owner, + # repo: context.repo.repo, + # name: androidLabel, + # }); + # } \ No newline at end of file diff --git a/start_emu_headless.sh b/start_emu_headless.sh new file mode 100644 index 00000000000..002563b4e33 --- /dev/null +++ b/start_emu_headless.sh @@ -0,0 +1,104 @@ +#!/bin/bash + +BL='\033[0;34m' +G='\033[0;32m' +RED='\033[0;31m' +YE='\033[1;33m' +NC='\033[0m' # No Color + +emulator_name=${EMULATOR_NAME} + +function check_hardware_acceleration() { + if [[ "$HW_ACCEL_OVERRIDE" != "" ]]; then + hw_accel_flag="$HW_ACCEL_OVERRIDE" + else + if [[ "$OSTYPE" == "darwin"* ]]; then + # macOS-specific hardware acceleration check + HW_ACCEL_SUPPORT=$(sysctl -a | grep -E -c '(vmx|svm)') + else + # generic Linux hardware acceleration check + HW_ACCEL_SUPPORT=$(grep -E -c '(vmx|svm)' /proc/cpuinfo) + fi + + if [[ $HW_ACCEL_SUPPORT == 0 ]]; then + hw_accel_flag="-accel off" + else + hw_accel_flag="-accel on" + fi + fi + + echo "$hw_accel_flag" +} + +hw_accel_flag=$(check_hardware_acceleration) + +function launch_emulator () { + adb devices | grep emulator | cut -f1 | xargs -I {} adb -s "{}" emu kill + options="@${emulator_name} -no-window -no-snapshot -screen no-touch -noaudio -memory 2048 -no-boot-anim ${hw_accel_flag} -camera-back none" + if [[ "$OSTYPE" == *linux* ]]; then + echo "${OSTYPE}: emulator ${options} -gpu off" + nohup emulator $options -gpu off & + fi + if [[ "$OSTYPE" == *darwin* ]] || [[ "$OSTYPE" == *macos* ]]; then + echo "im here" + echo "${OSTYPE}: emulator ${options} -gpu swiftshader_indirect" + nohup emulator $options -gpu swiftshader_indirect & + fi + + if [ $? -ne 0 ]; then + echo "Error launching emulator" + return 1 + fi +} + +function check_emulator_status () { + printf "${G}==> ${BL}Checking emulator booting up status 🧐${NC}\n" + start_time=$(date +%s) + spinner=( "⠹" "⠺" "⠼" "⠶" "⠦" "⠧" "⠇" "⠏" ) + i=0 + # Get the timeout value from the environment variable or use the default value of 300 seconds (5 minutes) + timeout=${EMULATOR_TIMEOUT:-300} + + while true; do + result=$(adb shell getprop sys.boot_completed 2>&1) + + if [ "$result" == "1" ]; then + printf "\e[K${G}==> \u2713 Emulator is ready : '$result' ${NC}\n" + adb devices -l + adb shell input keyevent 82 + break + elif [ "$result" == "" ]; then + printf "${YE}==> Emulator is partially Booted! 😕 ${spinner[$i]} ${NC}\r" + else + printf "${RED}==> $result, please wait ${spinner[$i]} ${NC}\r" + i=$(( (i+1) % 8 )) + fi + + current_time=$(date +%s) + elapsed_time=$((current_time - start_time)) + if [ $elapsed_time -gt $timeout ]; then + printf "${RED}==> Timeout after ${timeout} seconds elapsed 🕛.. ${NC}\n" + break + fi + sleep 4 + done +}; + +function disable_animation() { + adb shell "settings put global window_animation_scale 0.0" + adb shell "settings put global transition_animation_scale 0.0" + adb shell "settings put global animator_duration_scale 0.0" +}; + +function hidden_policy() { + adb shell "settings put global hidden_api_policy_pre_p_apps 1;settings put global hidden_api_policy_p_apps 1;settings put global hidden_api_policy 1" +}; + +launch_emulator +sleep 2 +check_emulator_status +sleep 1 +disable_animation +sleep 1 +hidden_policy +sleep 1 From 1a9bd4b4f6c43f10562ac2e932ec661a3ae51ef6 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 22 Jun 2024 02:05:15 +0530 Subject: [PATCH 251/362] test emulatore launch --- .github/workflows/e2e-detox-android-template.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index e9ec0f2f9b1..2c782522f44 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -256,16 +256,14 @@ jobs: run: | echo "$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools/${{ env.ANDROID_BUILD_TOOLS_VERSION }}" >> $GITHUB_PATH - - name: Install Sdk - run: | - yes Y | sdkmanager --licenses - sdkmanager --install ${{ env.ANDROID_SDK_PACKAGES }} + - name: Accept Licenses + run: yes | sdkmanager --licenses - - name: Build emulator + - name: Build Emulator run: | echo "no" | avdmanager --verbose create avd --force -n ${{ env.EMULATOR_NAME }} --abi "${{ env.ANDROID_TARGET }}/${{ env.ANDROID_ARCH }}" -k "system-images;${{ env.ANDROID_TARGET }};google_apis;${{ env.ANDROID_ARCH }}" - - name: Launch emulator + - name: Launch Emulator run: | chmod +x ./start_emu_headless.sh EMULATOR_TIMEOUT=${{ env.EMULATOR_TIMEOUT }} EMULATOR_NAME=${{ env.EMULATOR_NAME }} ./start_emu_headless.sh From 1b13c080e42b98a15bfb8cd67c32e8e06445608d Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 22 Jun 2024 02:07:38 +0530 Subject: [PATCH 252/362] test launch --- .github/workflows/e2e-detox-android-template.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 2c782522f44..14a611d1aa9 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -259,6 +259,12 @@ jobs: - name: Accept Licenses run: yes | sdkmanager --licenses + - name: List Available Packages + run: sdkmanager --list + + - name: Install System Image + run: sdkmanager "system-images;${{ env.ANDROID_TARGET }};google_apis;${{ env.ANDROID_ARCH }}" + - name: Build Emulator run: | echo "no" | avdmanager --verbose create avd --force -n ${{ env.EMULATOR_NAME }} --abi "${{ env.ANDROID_TARGET }}/${{ env.ANDROID_ARCH }}" -k "system-images;${{ env.ANDROID_TARGET }};google_apis;${{ env.ANDROID_ARCH }}" From 60b0fcfee20742551d7dec1701c4717b668bca7b Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 22 Jun 2024 02:21:14 +0530 Subject: [PATCH 253/362] launch emulator --- .../workflows/e2e-detox-android-template.yml | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 14a611d1aa9..7a28d8f34c9 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -237,7 +237,7 @@ jobs: # path: detox/artifacts test: - runs-on: macos-12 + runs-on: macos-latest strategy: fail-fast: false env: @@ -292,22 +292,28 @@ jobs: strategy: fail-fast: false matrix: - os: ['macos-12', 'macos-13'] + os: ['macos-latest', 'macos-13'] try: ['0', '1', '2'] steps: - run: system_profiler SPHardwareDataType - run: | - echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' - echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" + echo "hw.ramSize=4096" >> ~/.android/avd/android_emulator.avd/config.ini + echo "hw.cpu.ncore=2" >> ~/.android/avd/android_emulator.avd/config.ini + - run: | + echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-29;google_apis;x86_64' + echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-29;google_apis;x86_64' --force --device "pixel_6" + + #echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' + #echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" echo "Emulator created successfully" - nohup $ANDROID_HOME/emulator/emulator -memory 2048 -avd android_emulator -skin 1080x1920 -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel auto -gpu guest -qemu -lcd-density 420 > /dev/null 2>&1 & - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done' + nohup $ANDROID_HOME/emulator/emulator -memory 4096 -avd android_emulator -skin 1080x1920 -no-window -noaudio -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel auto -gpu swiftshader_indirect -qemu -lcd-density 420 > /dev/null 2>&1 & + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' $ANDROID_HOME/platform-tools/adb devices - #$ANDROID_HOME/platform-tools/adb shell input keyevent 82 - #$ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 - #$ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 - #$ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 + $ANDROID_HOME/platform-tools/adb shell input keyevent 82 + $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 + $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 + $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 sleep 120 screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.os }}-${{ matrix.try }}.png From 455e99f78bd6a3ed43b33da1c2d6879c40411c34 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 22 Jun 2024 02:26:36 +0530 Subject: [PATCH 254/362] test emulator --- .../workflows/e2e-detox-android-template.yml | 58 ++++++++++++++----- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 7a28d8f34c9..daeafc570ba 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -296,27 +296,59 @@ jobs: try: ['0', '1', '2'] steps: - - run: system_profiler SPHardwareDataType - - run: | - echo "hw.ramSize=4096" >> ~/.android/avd/android_emulator.avd/config.ini - echo "hw.cpu.ncore=2" >> ~/.android/avd/android_emulator.avd/config.ini - - run: | + - name: Debug info + run: | + echo "ANDROID_HOME: $ANDROID_HOME" + ls -R $ANDROID_HOME + ls -R ~/.android + + - name: Set up Android SDK and create AVD + run: | echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-29;google_apis;x86_64' echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-29;google_apis;x86_64' --force --device "pixel_6" - - #echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' - #echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" - echo "Emulator created successfully" - nohup $ANDROID_HOME/emulator/emulator -memory 4096 -avd android_emulator -skin 1080x1920 -no-window -noaudio -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel auto -gpu swiftshader_indirect -qemu -lcd-density 420 > /dev/null 2>&1 & + + - name: Configure AVD + run: | + echo "hw.ramSize=4096" >> ~/.android/avd/android_emulator.avd/config.ini + echo "hw.cpu.ncore=2" >> ~/.android/avd/android_emulator.avd/config.ini + echo "hw.gpu.enabled=true" >> ~/.android/avd/android_emulator.avd/config.ini + + - name: Start Android Emulator + run: | + $ANDROID_HOME/emulator/emulator -avd android_emulator -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim & $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' - $ANDROID_HOME/platform-tools/adb devices - $ANDROID_HOME/platform-tools/adb shell input keyevent 82 + + - name: Disable animations + run: | $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - sleep 120 + + - name: capture + run: | screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.os }}-${{ matrix.try }}.png + + # - run: | + # echo "hw.ramSize=4096" >> ~/.android/avd/android_emulator.avd/config.ini + # echo "hw.cpu.ncore=2" >> ~/.android/avd/android_emulator.avd/config.ini + # - run: | + # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-29;google_apis;x86_64' + # echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-29;google_apis;x86_64' --force --device "pixel_6" + + # #echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' + # #echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" + # echo "Emulator created successfully" + # nohup $ANDROID_HOME/emulator/emulator -memory 4096 -avd android_emulator -skin 1080x1920 -no-window -noaudio -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel auto -gpu swiftshader_indirect -qemu -lcd-density 420 > /dev/null 2>&1 & + # $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' + # $ANDROID_HOME/platform-tools/adb devices + # $ANDROID_HOME/platform-tools/adb shell input keyevent 82 + # $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 + # $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 + # $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 + # sleep 120 + # screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg + # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.os }}-${{ matrix.try }}.png - uses: actions/upload-artifact@v3 with: name: Android-Emulator-Screenshots From e98cb078eacd85a685f6a7ef81f509133e142753 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 22 Jun 2024 02:32:59 +0530 Subject: [PATCH 255/362] test build job --- .../workflows/e2e-detox-android-template.yml | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index daeafc570ba..6229dece7a5 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -358,6 +358,57 @@ jobs: name: Android-Emulator-Screenshots path: emulator-${{ matrix.os }}-${{ matrix.try }}.png + build: + runs-on: macos-latest + timeout-minutes: 15 + + steps: + - name: Checkout + uses: actions/checkout@v1 + with: + fetch-depth: 1 + + - name: Node + uses: actions/setup-node@v1 + + - name: Use specific Java version for sdkmanager to work + uses: joschi/setup-jdk@v1 + with: + java-version: 'openjdk8' + architecture: 'x64' + + - name: Download Android Emulator Image + run: | + echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;google_apis;x86" + echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-29;google_apis;x86' + $ANDROID_HOME/emulator/emulator -list-avds + + - name: Android Emulator + timeout-minutes: 10 + continue-on-error: true + run: | + echo "Starting emulator" + nohup $ANDROID_HOME/emulator/emulator -avd emu -no-audio -no-snapshot -no-window & + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' + $ANDROID_HOME/platform-tools/adb devices + echo "Emulator started" + + - name: capture + run: | + screencapture emulator-31.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31.png + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-31.jpg + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-31.png + + # download-e2e-results: # runs-on: ubuntu-22.04 # needs: From 7e274a7ec9eaa7fff14c6cd53e7dad11fc01ac86 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 22 Jun 2024 02:46:31 +0530 Subject: [PATCH 256/362] update java --- .github/workflows/e2e-detox-android-template.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 6229dece7a5..0b578d03f1e 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -364,18 +364,20 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v1 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 with: fetch-depth: 1 - name: Node - uses: actions/setup-node@v1 + uses: actions/setup-node@v4 + with: + node-version: 18 - name: Use specific Java version for sdkmanager to work - uses: joschi/setup-jdk@v1 + uses: actions/setup-java@v4 with: - java-version: 'openjdk8' - architecture: 'x64' + distribution: 'temurin' + java-version: '21' - name: Download Android Emulator Image run: | From bd207a374512ec7b75380a75cc5f1dfcf29f5940 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sat, 22 Jun 2024 02:51:25 +0530 Subject: [PATCH 257/362] test launch --- .github/workflows/e2e-detox-android-template.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 0b578d03f1e..1fd0e58e189 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -292,7 +292,7 @@ jobs: strategy: fail-fast: false matrix: - os: ['macos-latest', 'macos-13'] + os: ['macos-13'] try: ['0', '1', '2'] steps: @@ -377,7 +377,7 @@ jobs: uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: '21' + java-version: '8' - name: Download Android Emulator Image run: | From e1ff7e8a1e11c360a62c86b525d7ea7ab35df256 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 23 Jun 2024 23:56:58 +0530 Subject: [PATCH 258/362] test ubuntu avd creation --- .../workflows/e2e-detox-android-template.yml | 479 +++++++++++------- 1 file changed, 286 insertions(+), 193 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 1fd0e58e189..dad1655e7e0 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -49,51 +49,51 @@ env: FAILURE_MESSAGE: "Something has failed" jobs: - # update-initial-status: - # runs-on: ubuntu-22.04 - # steps: - # - uses: mattermost/actions/delivery/update-commit-status@main - # env: - # GITHUB_TOKEN: ${{ github.token }} - # with: - # repository_full_name: ${{ github.repository }} - # commit_sha: ${{ inputs.commit_sha }} - # context: ${{ inputs.status_check_context }} - # description: Detox tests for mattermost mobile app - # status: pending - - # generate-specs: - # needs: update-initial-status - # runs-on: ubuntu-22.04 - # outputs: - # specs: ${{ steps.generate-specs.outputs.specs }} - # build_id: ${{ env.BUILD_ID }} - # device_name: ${{ env.DEVICE_NAME }} - # device_os_version: ${{ env.DEVICE_OS_VERSION }} - # steps: - # - name: Checkout Repository - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - # - name: Set Build ID - # id: resolve-device - # run: | - # cd detox - # DEVICE_NAME=$(node -p "require('./.detoxrc').devices['android'].device.avdName") - # DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['android'].device.api") - # BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" - - # echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV - # echo "DEVICE_NAME=$(echo ${DEVICE_NAME})" >> $GITHUB_ENV - # echo "DEVICE_OS_VERSION=$(echo ${DEVICE_OS_VERSION})" >> $GITHUB_ENV + update-initial-status: + runs-on: ubuntu-22.04 + steps: + - uses: mattermost/actions/delivery/update-commit-status@main + env: + GITHUB_TOKEN: ${{ github.token }} + with: + repository_full_name: ${{ github.repository }} + commit_sha: ${{ inputs.commit_sha }} + context: ${{ inputs.status_check_context }} + description: Detox tests for mattermost mobile app + status: pending + + generate-specs: + needs: update-initial-status + runs-on: ubuntu-22.04 + outputs: + specs: ${{ steps.generate-specs.outputs.specs }} + build_id: ${{ env.BUILD_ID }} + device_name: ${{ env.DEVICE_NAME }} + device_os_version: ${{ env.DEVICE_OS_VERSION }} + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - # - name: Generate Test Specs - # id: generate-specs - # uses: ./.github/actions/generate-specs - # with: - # parallelism: 10 - # search_path: detox/e2e/test - # device_name: ${{ env.DEVICE_NAME }} - # device_os_version: ${{env.DEVICE_OS_VERSION}} + - name: Set Build ID + id: resolve-device + run: | + cd detox + DEVICE_NAME=$(node -p "require('./.detoxrc').devices['android'].device.avdName") + DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['android'].device.api") + BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" + + echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV + echo "DEVICE_NAME=$(echo ${DEVICE_NAME})" >> $GITHUB_ENV + echo "DEVICE_OS_VERSION=$(echo ${DEVICE_OS_VERSION})" >> $GITHUB_ENV + + - name: Generate Test Specs + id: generate-specs + uses: ./.github/actions/generate-specs + with: + parallelism: 10 + search_path: detox/e2e/test + device_name: ${{ env.DEVICE_NAME }} + device_os_version: ${{env.DEVICE_OS_VERSION}} # build-android-apk: # needs: update-initial-status @@ -236,180 +236,273 @@ jobs: # name: android-results-${{ matrix.runId }} # path: detox/artifacts - test: - runs-on: macos-latest - strategy: - fail-fast: false - env: - ANDROID_BUILD_TOOLS_VERSION: "34.0.0" - ANDROID_SDK_PACKAGES: "platform-tools build-tools;34.0.0 system-images;android-31;google_apis;x86_64" - ANDROID_TARGET: "android-31" - ANDROID_ARCH: "x86_64" - EMULATOR_TIMEOUT: "600" - EMULATOR_NAME: "pixel_6" + # test: + # runs-on: macos-latest + # strategy: + # fail-fast: false + # env: + # ANDROID_BUILD_TOOLS_VERSION: "34.0.0" + # ANDROID_SDK_PACKAGES: "platform-tools build-tools;34.0.0 system-images;android-31;google_apis;x86_64" + # ANDROID_TARGET: "android-31" + # ANDROID_ARCH: "x86_64" + # EMULATOR_TIMEOUT: "600" + # EMULATOR_NAME: "pixel_6" - steps: - - name: Checkout Repository - uses: actions/checkout@v4.1.1 + # steps: + # - name: Checkout Repository + # uses: actions/checkout@v4.1.1 - - name: Add avdmanager and sdkmanager to system PATH - run: | - echo "$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools/${{ env.ANDROID_BUILD_TOOLS_VERSION }}" >> $GITHUB_PATH + # - name: Add avdmanager and sdkmanager to system PATH + # run: | + # echo "$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools/${{ env.ANDROID_BUILD_TOOLS_VERSION }}" >> $GITHUB_PATH - - name: Accept Licenses - run: yes | sdkmanager --licenses + # - name: Accept Licenses + # run: yes | sdkmanager --licenses - - name: List Available Packages - run: sdkmanager --list + # - name: List Available Packages + # run: sdkmanager --list - - name: Install System Image - run: sdkmanager "system-images;${{ env.ANDROID_TARGET }};google_apis;${{ env.ANDROID_ARCH }}" + # - name: Install System Image + # run: sdkmanager "system-images;${{ env.ANDROID_TARGET }};google_apis;${{ env.ANDROID_ARCH }}" - - name: Build Emulator - run: | - echo "no" | avdmanager --verbose create avd --force -n ${{ env.EMULATOR_NAME }} --abi "${{ env.ANDROID_TARGET }}/${{ env.ANDROID_ARCH }}" -k "system-images;${{ env.ANDROID_TARGET }};google_apis;${{ env.ANDROID_ARCH }}" + # - name: Build Emulator + # run: | + # echo "no" | avdmanager --verbose create avd --force -n ${{ env.EMULATOR_NAME }} --abi "${{ env.ANDROID_TARGET }}/${{ env.ANDROID_ARCH }}" -k "system-images;${{ env.ANDROID_TARGET }};google_apis;${{ env.ANDROID_ARCH }}" - - name: Launch Emulator - run: | - chmod +x ./start_emu_headless.sh - EMULATOR_TIMEOUT=${{ env.EMULATOR_TIMEOUT }} EMULATOR_NAME=${{ env.EMULATOR_NAME }} ./start_emu_headless.sh + # - name: Launch Emulator + # run: | + # chmod +x ./start_emu_headless.sh + # EMULATOR_TIMEOUT=${{ env.EMULATOR_TIMEOUT }} EMULATOR_NAME=${{ env.EMULATOR_NAME }} ./start_emu_headless.sh - screencapture emulator-31-1.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31-1.png + # screencapture emulator-31-1.jpg + # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31-1.png - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-31-1.jpg + # - uses: actions/upload-artifact@v3 + # with: + # name: Android-Emulator-Screenshots + # path: emulator-31-1.jpg - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-31-1.png + # - uses: actions/upload-artifact@v3 + # with: + # name: Android-Emulator-Screenshots + # path: emulator-31-1.png + + # test-snapshot: + # runs-on: ${{ matrix.os }} + # strategy: + # fail-fast: false + # matrix: + # os: ['macos-13'] + # try: ['0', '1', '2'] - test-snapshot: - runs-on: ${{ matrix.os }} + # steps: + # - name: Debug info + # run: | + # echo "ANDROID_HOME: $ANDROID_HOME" + # ls -R $ANDROID_HOME + # ls -R ~/.android + + # - name: Set up Android SDK and create AVD + # run: | + # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-29;google_apis;x86_64' + # echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-29;google_apis;x86_64' --force --device "pixel_6" + + # - name: Configure AVD + # run: | + # echo "hw.ramSize=4096" >> ~/.android/avd/android_emulator.avd/config.ini + # echo "hw.cpu.ncore=2" >> ~/.android/avd/android_emulator.avd/config.ini + # echo "hw.gpu.enabled=true" >> ~/.android/avd/android_emulator.avd/config.ini + + # - name: Start Android Emulator + # run: | + # $ANDROID_HOME/emulator/emulator -avd android_emulator -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim & + # $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' + + # - name: Disable animations + # run: | + # $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 + # $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 + # $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 + + # - name: capture + # run: | + # screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg + # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.os }}-${{ matrix.try }}.png + + # # - run: | + # # echo "hw.ramSize=4096" >> ~/.android/avd/android_emulator.avd/config.ini + # # echo "hw.cpu.ncore=2" >> ~/.android/avd/android_emulator.avd/config.ini + # # - run: | + # # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-29;google_apis;x86_64' + # # echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-29;google_apis;x86_64' --force --device "pixel_6" + + # # #echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' + # # #echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" + # # echo "Emulator created successfully" + # # nohup $ANDROID_HOME/emulator/emulator -memory 4096 -avd android_emulator -skin 1080x1920 -no-window -noaudio -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel auto -gpu swiftshader_indirect -qemu -lcd-density 420 > /dev/null 2>&1 & + # # $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' + # # $ANDROID_HOME/platform-tools/adb devices + # # $ANDROID_HOME/platform-tools/adb shell input keyevent 82 + # # $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 + # # $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 + # # $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 + # # sleep 120 + # # screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg + # # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.os }}-${{ matrix.try }}.png + # - uses: actions/upload-artifact@v3 + # with: + # name: Android-Emulator-Screenshots + # path: emulator-${{ matrix.os }}-${{ matrix.try }}.jpg + # - uses: actions/upload-artifact@v3 + # with: + # name: Android-Emulator-Screenshots + # path: emulator-${{ matrix.os }}-${{ matrix.try }}.png + + # build: + # runs-on: macos-latest + # timeout-minutes: 15 + + # steps: + # - name: Checkout + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 + # with: + # fetch-depth: 1 + + # - name: Node + # uses: actions/setup-node@v4 + # with: + # node-version: 18 + + # - name: Use specific Java version for sdkmanager to work + # uses: actions/setup-java@v4 + # with: + # distribution: 'temurin' + # java-version: '17' + + # - name: Download Android Emulator Image + # run: | + # echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;google_apis;x86" + # echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-29;google_apis;x86' + # $ANDROID_HOME/emulator/emulator -list-avds + + # - name: Android Emulator + # timeout-minutes: 10 + # continue-on-error: true + # run: | + # echo "Starting emulator" + # nohup $ANDROID_HOME/emulator/emulator -avd emu -no-audio -no-snapshot -no-window & + # $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' + # $ANDROID_HOME/platform-tools/adb devices + # echo "Emulator started" + + # - name: capture + # run: | + # screencapture emulator-31.jpg + # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31.png + + # - uses: actions/upload-artifact@v3 + # with: + # name: Android-Emulator-Screenshots + # path: emulator-31.jpg + + # - uses: actions/upload-artifact@v3 + # with: + # name: Android-Emulator-Screenshots + # path: emulator-31.png + + android: + name: Android + runs-on: ubuntu-latest strategy: fail-fast: false - matrix: - os: ['macos-13'] - try: ['0', '1', '2'] - + matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} steps: - - name: Debug info - run: | - echo "ANDROID_HOME: $ANDROID_HOME" - ls -R $ANDROID_HOME - ls -R ~/.android + - name: Checkout Repository + uses: actions/checkout@v4.1.1 + + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + with: + android: false - - name: Set up Android SDK and create AVD + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + - uses: actions/setup-node@v4 + + - name: AVD Deps run: | - echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-29;google_apis;x86_64' - echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-29;google_apis;x86_64' --force --device "pixel_6" + sudo apt update + sudo apt-get install -y libpulse0 libgl1 + + - name: AVD cache + uses: actions/cache@v4 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* + key: avd-31 - - name: Configure AVD + - name: create AVD and generate snapshot for caching + if: steps.avd-cache.outputs.cache-hit != 'true' + uses: reactivecircus/android-emulator-runner@v2 + with: + profile: pixel_6 + api-level: 31 + arch: x86_64 + force-avd-creation: false + emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + script: echo "Generated AVD snapshot for caching." + + - name: Enable KVM group perms run: | - echo "hw.ramSize=4096" >> ~/.android/avd/android_emulator.avd/config.ini - echo "hw.cpu.ncore=2" >> ~/.android/avd/android_emulator.avd/config.ini - echo "hw.gpu.enabled=true" >> ~/.android/avd/android_emulator.avd/config.ini + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm - - name: Start Android Emulator - run: | - $ANDROID_HOME/emulator/emulator -avd android_emulator -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim & - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' + - name: Create destination path + run: mkdir -p android/app/build/outputs/apk - - name: Disable animations + - name: Download artifact + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 - $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 - $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 + curl -L -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + --output android/app/build/outputs/apk/artifact.zip - - name: capture - run: | - screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.os }}-${{ matrix.try }}.png - - # - run: | - # echo "hw.ramSize=4096" >> ~/.android/avd/android_emulator.avd/config.ini - # echo "hw.cpu.ncore=2" >> ~/.android/avd/android_emulator.avd/config.ini - # - run: | - # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-29;google_apis;x86_64' - # echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-29;google_apis;x86_64' --force --device "pixel_6" - - # #echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' - # #echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" - # echo "Emulator created successfully" - # nohup $ANDROID_HOME/emulator/emulator -memory 4096 -avd android_emulator -skin 1080x1920 -no-window -noaudio -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel auto -gpu swiftshader_indirect -qemu -lcd-density 420 > /dev/null 2>&1 & - # $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' - # $ANDROID_HOME/platform-tools/adb devices - # $ANDROID_HOME/platform-tools/adb shell input keyevent 82 - # $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 - # $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 - # $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - # sleep 120 - # screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg - # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.os }}-${{ matrix.try }}.png - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-${{ matrix.os }}-${{ matrix.try }}.jpg - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-${{ matrix.os }}-${{ matrix.try }}.png + - name: Unzip artifact + run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk - build: - runs-on: macos-latest - timeout-minutes: 15 + - name: Cleanup + run: rm android/app/build/outputs/apk/artifact.zip - steps: - - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - with: - fetch-depth: 1 - - - name: Node - uses: actions/setup-node@v4 - with: - node-version: 18 - - - name: Use specific Java version for sdkmanager to work - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: '8' - - - name: Download Android Emulator Image - run: | - echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;google_apis;x86" - echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-29;google_apis;x86' - $ANDROID_HOME/emulator/emulator -list-avds - - - name: Android Emulator - timeout-minutes: 10 - continue-on-error: true - run: | - echo "Starting emulator" - nohup $ANDROID_HOME/emulator/emulator -avd emu -no-audio -no-snapshot -no-window & - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' - $ANDROID_HOME/platform-tools/adb devices - echo "Emulator started" - - - name: capture - run: | - screencapture emulator-31.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31.png - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-31.jpg - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-31.png + - name: Start React Native Metro Server + run: npm run start & + - name: Install Detox Dependencies + run: cd detox && npm i + + - name: Run tests + uses: reactivecircus/android-emulator-runner@v2 + with: + profile: pixel_6 + api-level: 31 + arch: x86_64 + force-avd-creation: false + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + disable-animations: true + script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + + - name: Upload Android Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-results-${{ matrix.runId }} + path: detox/artifacts # download-e2e-results: # runs-on: ubuntu-22.04 From a78b8e5eb487a817c35c6b04a1c1bbb3d164b6a7 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 24 Jun 2024 00:30:58 +0530 Subject: [PATCH 259/362] add needs --- .github/workflows/e2e-detox-android-template.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index dad1655e7e0..ed83b2fcd84 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -413,6 +413,8 @@ jobs: android: name: Android runs-on: ubuntu-latest + needs: + - generate-specs strategy: fail-fast: false matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} From 96de76b5399e5ae6ff3ee039d80ea37b5771a2f7 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 24 Jun 2024 00:47:02 +0530 Subject: [PATCH 260/362] node install --- .github/workflows/e2e-detox-android-template.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index ed83b2fcd84..d9f8f9f3879 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -422,6 +422,9 @@ jobs: - name: Checkout Repository uses: actions/checkout@v4.1.1 + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + - name: Free Disk Space (Ubuntu) uses: jlumbroso/free-disk-space@main with: From e5ac0943cd75693a3f25e6b8b68068f171fbb778 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 24 Jun 2024 01:14:37 +0530 Subject: [PATCH 261/362] mac os --- .../workflows/e2e-detox-android-template.yml | 455 ++---------------- 1 file changed, 44 insertions(+), 411 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index d9f8f9f3879..0029bf8c57b 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -94,420 +94,53 @@ jobs: search_path: detox/e2e/test device_name: ${{ env.DEVICE_NAME }} device_os_version: ${{env.DEVICE_OS_VERSION}} - - # build-android-apk: - # needs: update-initial-status - # runs-on: macos-14-large - # env: - # ORG_GRADLE_PROJECT_jvmargs: -Xmx8g - # steps: - # - name: ci/checkout-repo - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - # with: - # ref: ${{ github.event.pull_request.head.sha }} - - # - name: ci/prepare-android-build - # uses: ./.github/actions/prepare-android-build - # env: - # STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" - # STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" - # STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" - # MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - # - name: Cache Gradle dependencies - # uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 - # with: - # path: ~/.gradle/caches - # key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - # restore-keys: | - # ${{ runner.os }}-gradle- - - # - name: Install Java - # uses: actions/setup-java@v4 - # with: - # java-version: "17" - # distribution: "adopt" - # cache: "gradle" - - # - name: Validate Gradle wrapper - # uses: gradle/actions/wrapper-validation@v3 - - # - name: Detox build - # run: | - # cd detox - # npm install - # npm install -g detox-cli - # npm run e2e:android-build - - # - name: ci/upload-android-pr-build - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: android-build-apk-${{ github.run_id }} - # path: "android/app/build/outputs/apk/**/app-*.apk" - - # e2e-android-on-mac: - # name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} - # continue-on-error: true - # runs-on: macos-13 - # timeout-minutes: 40 - # needs: - # - generate-specs - # # - build-android-apk - # strategy: - # fail-fast: false - # matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} - # steps: - # - name: Checkout - # uses: actions/checkout@v1 - # with: - # fetch-depth: 1 - - # - name: ci/prepare-node-deps - # uses: ./.github/actions/prepare-node-deps - - # - name: Install Sharp CLI for faster image generation during prebuild - # run: npm install --global sharp-cli - - # - name: Start React Native Metro Server - # run: npm run start & - - # - name: Install Detox Dependencies - # run: cd detox && npm i - - # - name: Install Java - # uses: actions/setup-java@v4 - # with: - # java-version: "17" - # distribution: "adopt" - # cache: "gradle" - - # - name: Create destination path - # run: mkdir -p android/app/build/outputs/apk - - # - name: Download artifact - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # run: | - # curl -L -H "Authorization: token $GITHUB_TOKEN" \ - # -H "Accept: application/vnd.github.v3+json" \ - # https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - # --output android/app/build/outputs/apk/artifact.zip - - # - name: Unzip artifact - # run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk - - # - name: Cleanup - # run: rm android/app/build/outputs/apk/artifact.zip - - # - name: Launch Android Emulator - # run: | - # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' - # echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" - # echo "Emulator created successfully" - # nohup $ANDROID_HOME/emulator/emulator -avd android_emulator -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -qemu -m 4096 > /dev/null 2>&1 & - # $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\''\r'\'') ]]; do sleep 1; done' - # $ANDROID_HOME/platform-tools/adb devices - # $ANDROID_HOME/platform-tools/adb shell input keyevent 82 - # $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 - # $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 - # $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - # sleep 60 - # screencapture emulator-macos-13.jpg - # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-macos-13.png - - # - uses: actions/upload-artifact@v3 - # with: - # name: Android-Emulator-Screenshots - # path: emulator-macos-13.jpg - - # - uses: actions/upload-artifact@v3 - # with: - # name: Android-Emulator-Screenshots - # path: emulator-macos-13.jpg.png - - # - name: Run Android Detox E2E Tests on macOS - # run: | - # cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - # - name: Upload Android Test Report - # if: always() - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: android-results-${{ matrix.runId }} - # path: detox/artifacts - - # test: - # runs-on: macos-latest - # strategy: - # fail-fast: false - # env: - # ANDROID_BUILD_TOOLS_VERSION: "34.0.0" - # ANDROID_SDK_PACKAGES: "platform-tools build-tools;34.0.0 system-images;android-31;google_apis;x86_64" - # ANDROID_TARGET: "android-31" - # ANDROID_ARCH: "x86_64" - # EMULATOR_TIMEOUT: "600" - # EMULATOR_NAME: "pixel_6" - - # steps: - # - name: Checkout Repository - # uses: actions/checkout@v4.1.1 - - # - name: Add avdmanager and sdkmanager to system PATH - # run: | - # echo "$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools/${{ env.ANDROID_BUILD_TOOLS_VERSION }}" >> $GITHUB_PATH - - # - name: Accept Licenses - # run: yes | sdkmanager --licenses - - # - name: List Available Packages - # run: sdkmanager --list - - # - name: Install System Image - # run: sdkmanager "system-images;${{ env.ANDROID_TARGET }};google_apis;${{ env.ANDROID_ARCH }}" - - # - name: Build Emulator - # run: | - # echo "no" | avdmanager --verbose create avd --force -n ${{ env.EMULATOR_NAME }} --abi "${{ env.ANDROID_TARGET }}/${{ env.ANDROID_ARCH }}" -k "system-images;${{ env.ANDROID_TARGET }};google_apis;${{ env.ANDROID_ARCH }}" - - # - name: Launch Emulator - # run: | - # chmod +x ./start_emu_headless.sh - # EMULATOR_TIMEOUT=${{ env.EMULATOR_TIMEOUT }} EMULATOR_NAME=${{ env.EMULATOR_NAME }} ./start_emu_headless.sh - - # screencapture emulator-31-1.jpg - # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31-1.png - - # - uses: actions/upload-artifact@v3 - # with: - # name: Android-Emulator-Screenshots - # path: emulator-31-1.jpg - - # - uses: actions/upload-artifact@v3 - # with: - # name: Android-Emulator-Screenshots - # path: emulator-31-1.png - - # test-snapshot: - # runs-on: ${{ matrix.os }} - # strategy: - # fail-fast: false - # matrix: - # os: ['macos-13'] - # try: ['0', '1', '2'] - # steps: - # - name: Debug info - # run: | - # echo "ANDROID_HOME: $ANDROID_HOME" - # ls -R $ANDROID_HOME - # ls -R ~/.android - - # - name: Set up Android SDK and create AVD - # run: | - # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-29;google_apis;x86_64' - # echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-29;google_apis;x86_64' --force --device "pixel_6" - - # - name: Configure AVD - # run: | - # echo "hw.ramSize=4096" >> ~/.android/avd/android_emulator.avd/config.ini - # echo "hw.cpu.ncore=2" >> ~/.android/avd/android_emulator.avd/config.ini - # echo "hw.gpu.enabled=true" >> ~/.android/avd/android_emulator.avd/config.ini - - # - name: Start Android Emulator - # run: | - # $ANDROID_HOME/emulator/emulator -avd android_emulator -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim & - # $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' - - # - name: Disable animations - # run: | - # $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 - # $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 - # $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - - # - name: capture - # run: | - # screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg - # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.os }}-${{ matrix.try }}.png - - # # - run: | - # # echo "hw.ramSize=4096" >> ~/.android/avd/android_emulator.avd/config.ini - # # echo "hw.cpu.ncore=2" >> ~/.android/avd/android_emulator.avd/config.ini - # # - run: | - # # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-29;google_apis;x86_64' - # # echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-29;google_apis;x86_64' --force --device "pixel_6" - - # # #echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' - # # #echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" - # # echo "Emulator created successfully" - # # nohup $ANDROID_HOME/emulator/emulator -memory 4096 -avd android_emulator -skin 1080x1920 -no-window -noaudio -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel auto -gpu swiftshader_indirect -qemu -lcd-density 420 > /dev/null 2>&1 & - # # $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' - # # $ANDROID_HOME/platform-tools/adb devices - # # $ANDROID_HOME/platform-tools/adb shell input keyevent 82 - # # $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 - # # $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 - # # $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - # # sleep 120 - # # screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg - # # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.os }}-${{ matrix.try }}.png - # - uses: actions/upload-artifact@v3 - # with: - # name: Android-Emulator-Screenshots - # path: emulator-${{ matrix.os }}-${{ matrix.try }}.jpg - # - uses: actions/upload-artifact@v3 - # with: - # name: Android-Emulator-Screenshots - # path: emulator-${{ matrix.os }}-${{ matrix.try }}.png - - # build: - # runs-on: macos-latest - # timeout-minutes: 15 - - # steps: - # - name: Checkout - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - # with: - # fetch-depth: 1 - - # - name: Node - # uses: actions/setup-node@v4 - # with: - # node-version: 18 - - # - name: Use specific Java version for sdkmanager to work - # uses: actions/setup-java@v4 - # with: - # distribution: 'temurin' - # java-version: '17' - - # - name: Download Android Emulator Image - # run: | - # echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;google_apis;x86" - # echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-29;google_apis;x86' - # $ANDROID_HOME/emulator/emulator -list-avds - - # - name: Android Emulator - # timeout-minutes: 10 - # continue-on-error: true - # run: | - # echo "Starting emulator" - # nohup $ANDROID_HOME/emulator/emulator -avd emu -no-audio -no-snapshot -no-window & - # $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' - # $ANDROID_HOME/platform-tools/adb devices - # echo "Emulator started" - - # - name: capture - # run: | - # screencapture emulator-31.jpg - # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31.png - - # - uses: actions/upload-artifact@v3 - # with: - # name: Android-Emulator-Screenshots - # path: emulator-31.jpg - - # - uses: actions/upload-artifact@v3 - # with: - # name: Android-Emulator-Screenshots - # path: emulator-31.png + build: + runs-on: macos-latest + timeout-minutes: 40 - android: - name: Android - runs-on: ubuntu-latest - needs: - - generate-specs - strategy: - fail-fast: false - matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} steps: - - name: Checkout Repository - uses: actions/checkout@v4.1.1 - - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps - - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@main - with: - android: false - - - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: '17' - - uses: actions/setup-node@v4 - - - name: AVD Deps - run: | - sudo apt update - sudo apt-get install -y libpulse0 libgl1 - - - name: AVD cache - uses: actions/cache@v4 - id: avd-cache - with: - path: | - ~/.android/avd/* - ~/.android/adb* - key: avd-31 - - - name: create AVD and generate snapshot for caching - if: steps.avd-cache.outputs.cache-hit != 'true' - uses: reactivecircus/android-emulator-runner@v2 - with: - profile: pixel_6 - api-level: 31 - arch: x86_64 - force-avd-creation: false - emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - script: echo "Generated AVD snapshot for caching." - - - name: Enable KVM group perms - run: | - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm - - - name: Create destination path - run: mkdir -p android/app/build/outputs/apk - - - name: Download artifact - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - curl -L -H "Authorization: token $GITHUB_TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - --output android/app/build/outputs/apk/artifact.zip - - - name: Unzip artifact - run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk - - - name: Cleanup - run: rm android/app/build/outputs/apk/artifact.zip - - - name: Start React Native Metro Server - run: npm run start & - - - name: Install Detox Dependencies - run: cd detox && npm i - - - name: Run tests - uses: reactivecircus/android-emulator-runner@v2 - with: - profile: pixel_6 - api-level: 31 - arch: x86_64 - force-avd-creation: false - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - disable-animations: true - script: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - - name: Upload Android Test Report - if: always() - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-results-${{ matrix.runId }} - path: detox/artifacts + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 + with: + fetch-depth: 1 + + - name: Use specific Java version for sdkmanager to work + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + + - name: Download Android Emulator Image + run: | + echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;google_apis;x86" + echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-29;google_apis;x86' + $ANDROID_HOME/emulator/emulator -list-avds + + - name: Android Emulator + timeout-minutes: 10 + continue-on-error: true + run: | + echo "Starting emulator" + nohup $ANDROID_HOME/emulator/emulator -avd emu -no-audio -no-snapshot -no-window & + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' + $ANDROID_HOME/platform-tools/adb devices + echo "Emulator started" + + - name: capture + run: | + screencapture emulator-31.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31.png + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-31.jpg + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-31.png # download-e2e-results: # runs-on: ubuntu-22.04 From e149dfd5b0b6a6563d1884b5f46c27e7e4f56014 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 25 Jun 2024 01:34:33 +0530 Subject: [PATCH 262/362] test emu --- .../workflows/e2e-detox-android-template.yml | 111 +++++++++++------- 1 file changed, 67 insertions(+), 44 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 0029bf8c57b..55d70c4adcb 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -95,52 +95,75 @@ jobs: device_name: ${{ env.DEVICE_NAME }} device_os_version: ${{env.DEVICE_OS_VERSION}} - build: + android-e2e: + name: Android runs-on: macos-latest - timeout-minutes: 40 - + needs: + - generate-specs + strategy: + fail-fast: false + matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} steps: - - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - with: - fetch-depth: 1 - - - name: Use specific Java version for sdkmanager to work - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: '17' - - - name: Download Android Emulator Image - run: | - echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;google_apis;x86" - echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-29;google_apis;x86' - $ANDROID_HOME/emulator/emulator -list-avds - - - name: Android Emulator - timeout-minutes: 10 - continue-on-error: true - run: | - echo "Starting emulator" - nohup $ANDROID_HOME/emulator/emulator -avd emu -no-audio -no-snapshot -no-window & - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' - $ANDROID_HOME/platform-tools/adb devices - echo "Emulator started" - - - name: capture - run: | - screencapture emulator-31.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31.png - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-31.jpg - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-31.png + + - name: Checkout Repository + uses: actions/checkout@v4.1.1 + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Configure JDK + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + architecture: x86 + + - name: Create destination path + run: mkdir -p android/app/build/outputs/apk + + - name: Download artifact + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + curl -L -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + --output android/app/build/outputs/apk/artifact.zip + + - name: Unzip artifact + run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk + + - name: Cleanup + run: rm android/app/build/outputs/apk/artifact.zip + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm i + + - name: Download Android Emulator Image + run: | + echo y | sudo $ANDROID_HOME/tools/bin/sdkmanager "system-images;android-28;google_apis;x86_64" > /dev/null + $ANDROID_HOME/tools/bin/avdmanager -s create avd -n emu -k "system-images;android-28;google_apis;x86_64" -c 512M -d "Nexus S" -f + + - name: Start Emulator + timeout-minutes: 15 + run: | + export PATH=$PATH:$ANDROID_HOME/platform-tools + $ANDROID_HOME/emulator/emulator @emu -no-boot-anim & + adb wait-for-device; adb shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;'; adb shell wm dismiss-keyguard + + - name: Test + timeout-minutes: 15 + run: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + + - name: Upload Android Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-results-${{ matrix.runId }} + path: detox/artifacts # download-e2e-results: # runs-on: ubuntu-22.04 From 02dff0360375aba700b6f07467ea24c56d9a51f2 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 25 Jun 2024 01:39:12 +0530 Subject: [PATCH 263/362] java 8 --- .github/workflows/e2e-detox-android-template.yml | 5 ++--- detox/.detoxrc.json | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 55d70c4adcb..1b92e13b288 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -112,10 +112,9 @@ jobs: uses: ./.github/actions/prepare-node-deps - name: Configure JDK - uses: actions/setup-java@v4 + uses: joschi/setup-jdk@v2 with: - distribution: 'temurin' - java-version: '17' + java-version: '8' architecture: x86 - name: Create destination path diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index f64d75c208b..5e31044e319 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -37,7 +37,7 @@ "android": { "type": "android.emulator", "device": { - "avdName": "pixel_6", + "avdName": "emu", "api": "31" } } From 9c5180577bfe4aa590c6cd1a4797fbe7a03f5794 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 25 Jun 2024 01:57:30 +0530 Subject: [PATCH 264/362] test enulator --- .../workflows/e2e-detox-android-template.yml | 110 +++++++++++++++--- 1 file changed, 91 insertions(+), 19 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 1b92e13b288..bdc68f8bb13 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -97,7 +97,7 @@ jobs: android-e2e: name: Android - runs-on: macos-latest + runs-on: ubuntu-latest needs: - generate-specs strategy: @@ -105,6 +105,12 @@ jobs: matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} steps: + - name: Enable KVM group perms + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + - name: Checkout Repository uses: actions/checkout@v4.1.1 @@ -112,10 +118,29 @@ jobs: uses: ./.github/actions/prepare-node-deps - name: Configure JDK - uses: joschi/setup-jdk@v2 + uses: actions/setup-java@v4 with: - java-version: '8' - architecture: x86 + distribution: "temurin" + java-version: "21" + + - name: AVD Boot and Snapshot Creation + # Only generate a snapshot for saving if we are on main branch with a cache miss + # Comment the if out to generate snapshots on branch for performance testing + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: 31 + force-avd-creation: false + target: google_apis + arch: x86_64 + emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + sdcard-path-or-size: 100M + disable-animations: true + # Give the emulator a little time to run and do first boot stuff before taking snapshot + script: | + touch adb-log.txt + $ANDROID_HOME/platform-tools/adb logcat '*:D' >> adb-log.txt & + adb logcat --clear + echo "Generated AVD snapshot for caching." - name: Create destination path run: mkdir -p android/app/build/outputs/apk @@ -135,27 +160,55 @@ jobs: - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip + # This step is separate so pure install time may be calculated as a step + - name: Emulator Snapshot After Firstboot Warmup + # Only generate a snapshot for saving if we are on main branch with a cache miss + # Switch the if statements via comment if generating snapshots for performance testing + # if: matrix.first-boot-delay != '0' + env: + FIRST_BOOT_DELAY: 600 + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: 31 + force-avd-creation: false + target: google_apis + arch: x86_64 + emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + sdcard-path-or-size: 100M + disable-animations: true + # Restart zygote to win a config race / Give emulator time to run and do first boot stuff before taking snapshot + script: | + touch adb-log.txt + $ANDROID_HOME/platform-tools/adb logcat '*:D' >> adb-log.txt & + $ANDROID_HOME/platform-tools/adb shell su root "setprop ctl.restart zygote" + sleep 10 + sleep $FIRST_BOOT_DELAY + adb logcat --clear + echo "First boot warmup completed." + - name: Start React Native Metro Server run: npm run start & - name: Install Detox Dependencies run: cd detox && npm i - - - name: Download Android Emulator Image - run: | - echo y | sudo $ANDROID_HOME/tools/bin/sdkmanager "system-images;android-28;google_apis;x86_64" > /dev/null - $ANDROID_HOME/tools/bin/avdmanager -s create avd -n emu -k "system-images;android-28;google_apis;x86_64" -c 512M -d "Nexus S" -f - - - name: Start Emulator - timeout-minutes: 15 - run: | - export PATH=$PATH:$ANDROID_HOME/platform-tools - $ANDROID_HOME/emulator/emulator @emu -no-boot-anim & - adb wait-for-device; adb shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;'; adb shell wm dismiss-keyguard - - name: Test - timeout-minutes: 15 - run: cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + - name: Run Emulator Tests + uses: reactivecircus/android-emulator-runner@v2 + timeout-minutes: 30 + with: + api-level: 31 + force-avd-creation: false + target: google_apis + arch: x86_64 + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + sdcard-path-or-size: 100M + disable-animations: true + script: | + touch adb-log.txt + $ANDROID_HOME/platform-tools/adb logcat '*:D' >> adb-log.txt & + adb emu screenrecord start --time-limit 1800 video.webm + sleep 5 + cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - name: Upload Android Test Report if: always() @@ -164,6 +217,25 @@ jobs: name: android-results-${{ matrix.runId }} path: detox/artifacts + - name: Compress Emulator Log + if: always() + run: gzip -9 adb-log.txt + shell: bash + + - name: Upload Emulator Log + uses: actions/upload-artifact@v4 + if: always() + with: + name: emulator-adb_logs + path: adb-log.txt.gz + + - name: Upload Emulator Screen Record + uses: actions/upload-artifact@v4 + if: always() + with: + name: emulator-adb_video + path: video.webm + # download-e2e-results: # runs-on: ubuntu-22.04 # needs: From 321358296eac07fedf2fc287c422c5ecc810bafd Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 25 Jun 2024 02:25:00 +0530 Subject: [PATCH 265/362] test emu --- .github/workflows/e2e-detox-android-template.yml | 11 ++++++----- detox/.detoxrc.json | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index bdc68f8bb13..d8a4345c7ae 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -128,7 +128,7 @@ jobs: # Comment the if out to generate snapshots on branch for performance testing uses: reactivecircus/android-emulator-runner@v2 with: - api-level: 31 + api-level: 30 force-avd-creation: false target: google_apis arch: x86_64 @@ -166,10 +166,10 @@ jobs: # Switch the if statements via comment if generating snapshots for performance testing # if: matrix.first-boot-delay != '0' env: - FIRST_BOOT_DELAY: 600 + FIRST_BOOT_DELAY: 120 uses: reactivecircus/android-emulator-runner@v2 with: - api-level: 31 + api-level: 30 force-avd-creation: false target: google_apis arch: x86_64 @@ -196,7 +196,7 @@ jobs: uses: reactivecircus/android-emulator-runner@v2 timeout-minutes: 30 with: - api-level: 31 + api-level: 30 force-avd-creation: false target: google_apis arch: x86_64 @@ -206,7 +206,8 @@ jobs: script: | touch adb-log.txt $ANDROID_HOME/platform-tools/adb logcat '*:D' >> adb-log.txt & - adb emu screenrecord start --time-limit 1800 video.webm + $ANDROID_HOME/tools/emulator -list-avds + adb android_emulator screenrecord start --time-limit 1800 video.webm sleep 5 cd detox && npm run e2e:android-test -- ${{ matrix.specs }} diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 5e31044e319..f9ed9648373 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -37,8 +37,8 @@ "android": { "type": "android.emulator", "device": { - "avdName": "emu", - "api": "31" + "avdName": "android_emulator", + "api": "30" } } }, From e48b265e86f9d3508c7743703e7abc00baf314cb Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 25 Jun 2024 02:41:27 +0530 Subject: [PATCH 266/362] test script --- .../workflows/e2e-detox-android-template.yml | 274 ++++++------------ 1 file changed, 92 insertions(+), 182 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index d8a4345c7ae..cccfa69c672 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -49,194 +49,104 @@ env: FAILURE_MESSAGE: "Something has failed" jobs: - update-initial-status: - runs-on: ubuntu-22.04 - steps: - - uses: mattermost/actions/delivery/update-commit-status@main - env: - GITHUB_TOKEN: ${{ github.token }} - with: - repository_full_name: ${{ github.repository }} - commit_sha: ${{ inputs.commit_sha }} - context: ${{ inputs.status_check_context }} - description: Detox tests for mattermost mobile app - status: pending - - generate-specs: - needs: update-initial-status - runs-on: ubuntu-22.04 - outputs: - specs: ${{ steps.generate-specs.outputs.specs }} - build_id: ${{ env.BUILD_ID }} - device_name: ${{ env.DEVICE_NAME }} - device_os_version: ${{ env.DEVICE_OS_VERSION }} - steps: - - name: Checkout Repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - - name: Set Build ID - id: resolve-device - run: | - cd detox - DEVICE_NAME=$(node -p "require('./.detoxrc').devices['android'].device.avdName") - DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['android'].device.api") - BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" - - echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV - echo "DEVICE_NAME=$(echo ${DEVICE_NAME})" >> $GITHUB_ENV - echo "DEVICE_OS_VERSION=$(echo ${DEVICE_OS_VERSION})" >> $GITHUB_ENV - - - name: Generate Test Specs - id: generate-specs - uses: ./.github/actions/generate-specs - with: - parallelism: 10 - search_path: detox/e2e/test - device_name: ${{ env.DEVICE_NAME }} - device_os_version: ${{env.DEVICE_OS_VERSION}} - - android-e2e: - name: Android - runs-on: ubuntu-latest - needs: - - generate-specs - strategy: - fail-fast: false - matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} - steps: - - - name: Enable KVM group perms - run: | - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm - - - name: Checkout Repository - uses: actions/checkout@v4.1.1 - - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps - - - name: Configure JDK - uses: actions/setup-java@v4 - with: - distribution: "temurin" - java-version: "21" - - - name: AVD Boot and Snapshot Creation - # Only generate a snapshot for saving if we are on main branch with a cache miss - # Comment the if out to generate snapshots on branch for performance testing - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: 30 - force-avd-creation: false - target: google_apis - arch: x86_64 - emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - sdcard-path-or-size: 100M - disable-animations: true - # Give the emulator a little time to run and do first boot stuff before taking snapshot - script: | - touch adb-log.txt - $ANDROID_HOME/platform-tools/adb logcat '*:D' >> adb-log.txt & - adb logcat --clear - echo "Generated AVD snapshot for caching." - - - name: Create destination path - run: mkdir -p android/app/build/outputs/apk - - - name: Download artifact - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - curl -L -H "Authorization: token $GITHUB_TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - --output android/app/build/outputs/apk/artifact.zip - - - name: Unzip artifact - run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk - - - name: Cleanup - run: rm android/app/build/outputs/apk/artifact.zip - - # This step is separate so pure install time may be calculated as a step - - name: Emulator Snapshot After Firstboot Warmup - # Only generate a snapshot for saving if we are on main branch with a cache miss - # Switch the if statements via comment if generating snapshots for performance testing - # if: matrix.first-boot-delay != '0' - env: - FIRST_BOOT_DELAY: 120 - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: 30 - force-avd-creation: false - target: google_apis - arch: x86_64 - emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - sdcard-path-or-size: 100M - disable-animations: true - # Restart zygote to win a config race / Give emulator time to run and do first boot stuff before taking snapshot - script: | - touch adb-log.txt - $ANDROID_HOME/platform-tools/adb logcat '*:D' >> adb-log.txt & - $ANDROID_HOME/platform-tools/adb shell su root "setprop ctl.restart zygote" - sleep 10 - sleep $FIRST_BOOT_DELAY - adb logcat --clear - echo "First boot warmup completed." - - - name: Start React Native Metro Server - run: npm run start & + # update-initial-status: + # runs-on: ubuntu-22.04 + # steps: + # - uses: mattermost/actions/delivery/update-commit-status@main + # env: + # GITHUB_TOKEN: ${{ github.token }} + # with: + # repository_full_name: ${{ github.repository }} + # commit_sha: ${{ inputs.commit_sha }} + # context: ${{ inputs.status_check_context }} + # description: Detox tests for mattermost mobile app + # status: pending - - name: Install Detox Dependencies - run: cd detox && npm i + # generate-specs: + # needs: update-initial-status + # runs-on: ubuntu-22.04 + # outputs: + # specs: ${{ steps.generate-specs.outputs.specs }} + # build_id: ${{ env.BUILD_ID }} + # device_name: ${{ env.DEVICE_NAME }} + # device_os_version: ${{ env.DEVICE_OS_VERSION }} + # steps: + # - name: Checkout Repository + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - name: Run Emulator Tests - uses: reactivecircus/android-emulator-runner@v2 - timeout-minutes: 30 - with: - api-level: 30 - force-avd-creation: false - target: google_apis - arch: x86_64 - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - sdcard-path-or-size: 100M - disable-animations: true - script: | - touch adb-log.txt - $ANDROID_HOME/platform-tools/adb logcat '*:D' >> adb-log.txt & - $ANDROID_HOME/tools/emulator -list-avds - adb android_emulator screenrecord start --time-limit 1800 video.webm - sleep 5 - cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + # - name: Set Build ID + # id: resolve-device + # run: | + # cd detox + # DEVICE_NAME=$(node -p "require('./.detoxrc').devices['android'].device.avdName") + # DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['android'].device.api") + # BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" - - name: Upload Android Test Report - if: always() - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-results-${{ matrix.runId }} - path: detox/artifacts + # echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV + # echo "DEVICE_NAME=$(echo ${DEVICE_NAME})" >> $GITHUB_ENV + # echo "DEVICE_OS_VERSION=$(echo ${DEVICE_OS_VERSION})" >> $GITHUB_ENV - - name: Compress Emulator Log - if: always() - run: gzip -9 adb-log.txt - shell: bash + # - name: Generate Test Specs + # id: generate-specs + # uses: ./.github/actions/generate-specs + # with: + # parallelism: 10 + # search_path: detox/e2e/test + # device_name: ${{ env.DEVICE_NAME }} + # device_os_version: ${{env.DEVICE_OS_VERSION}} - - name: Upload Emulator Log - uses: actions/upload-artifact@v4 - if: always() - with: - name: emulator-adb_logs - path: adb-log.txt.gz + build: + runs-on: macos-latest + timeout-minutes: 40 - - name: Upload Emulator Screen Record - uses: actions/upload-artifact@v4 - if: always() - with: - name: emulator-adb_video - path: video.webm - + steps: + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 + with: + fetch-depth: 1 + + - name: Node + uses: actions/setup-node@v4 + with: + node-version: 18 + + - name: Use specific Java version for sdkmanager to work + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + + - name: Download Android Emulator Image + run: | + echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;google_apis;x86" + echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-29;google_apis;x86' + $ANDROID_HOME/emulator/emulator -list-avds + + - name: Android Emulator + timeout-minutes: 10 + continue-on-error: true + run: | + echo "Starting emulator" + nohup $ANDROID_HOME/emulator/emulator -avd emu -no-audio -no-snapshot -no-window & + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' + $ANDROID_HOME/platform-tools/adb devices + echo "Emulator started" + + - name: capture + run: | + screencapture emulator-31.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31.png + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-31.jpg + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-31.png + # download-e2e-results: # runs-on: ubuntu-22.04 # needs: From a1a7a362aac6343c589961963468d85738a4c5c2 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 25 Jun 2024 02:44:41 +0530 Subject: [PATCH 267/362] macos 12 --- .github/workflows/e2e-detox-android-template.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index cccfa69c672..3ccc4f6429b 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -96,7 +96,7 @@ jobs: # device_os_version: ${{env.DEVICE_OS_VERSION}} build: - runs-on: macos-latest + runs-on: macos-12 timeout-minutes: 40 steps: @@ -118,7 +118,7 @@ jobs: - name: Download Android Emulator Image run: | - echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;google_apis;x86" + echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-31;google_apis;x86" echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-29;google_apis;x86' $ANDROID_HOME/emulator/emulator -list-avds From d6d2a74fdca93174a5d4d1509d6c9fc6b09a5bd9 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 25 Jun 2024 02:54:23 +0530 Subject: [PATCH 268/362] install jax --- .../workflows/e2e-detox-android-template.yml | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 3ccc4f6429b..a80f717b9b3 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -96,7 +96,7 @@ jobs: # device_os_version: ${{env.DEVICE_OS_VERSION}} build: - runs-on: macos-12 + runs-on: macos-latest timeout-minutes: 40 steps: @@ -116,10 +116,21 @@ jobs: distribution: 'temurin' java-version: '17' + - name: Download Jax + run: | + mkdir -p $ANDROID_HOME/tools/lib/jaxb + cd $ANDROID_HOME/tools/lib/jaxb + wget https://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar + wget https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-core/2.3.0.1/jaxb-core-2.3.0.1.jar + wget https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-impl/2.3.2/jaxb-impl-2.3.2.jar + wget https://repo1.maven.org/maven2/javax/activation/activation/1.1.1/activation-1.1.1.jar + - name: Download Android Emulator Image run: | - echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-31;google_apis;x86" - echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-29;google_apis;x86' + echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --update + # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install "system-images;android-31;google_apis;x86_64" + echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-31;google_apis;x86_64" + echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-31;google_apis;x86_64' $ANDROID_HOME/emulator/emulator -list-avds - name: Android Emulator From a0f86fd80de6f17a2c3bbff451f0f39b6ce3c908 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 26 Jun 2024 03:51:50 +0530 Subject: [PATCH 269/362] java 8 --- .github/workflows/e2e-detox-android-template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index a80f717b9b3..7e9f1459ebd 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -114,7 +114,7 @@ jobs: uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: '17' + java-version: '8' - name: Download Jax run: | From bc2f46fa7aa7b3ec5d07152bb75e85439c9b374f Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 26 Jun 2024 04:10:14 +0530 Subject: [PATCH 270/362] test ubuntu --- .../workflows/e2e-detox-android-template.yml | 166 +++++++++++------- detox/.detoxrc.json | 2 +- 2 files changed, 107 insertions(+), 61 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 7e9f1459ebd..8def285ec79 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -95,68 +95,114 @@ jobs: # device_name: ${{ env.DEVICE_NAME }} # device_os_version: ${{env.DEVICE_OS_VERSION}} - build: - runs-on: macos-latest - timeout-minutes: 40 + android: + name: Android + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + api-level: [31] + # TODO: Let's not care about different APIs for now + # api-level: [31, 32, 33, 34] + rn-version: ['latest', '0.72-stable', '0.71-stable', '0.70-stable'] steps: - - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - with: - fetch-depth: 1 - - - name: Node - uses: actions/setup-node@v4 - with: - node-version: 18 - - - name: Use specific Java version for sdkmanager to work - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: '8' - - - name: Download Jax - run: | - mkdir -p $ANDROID_HOME/tools/lib/jaxb - cd $ANDROID_HOME/tools/lib/jaxb - wget https://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar - wget https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-core/2.3.0.1/jaxb-core-2.3.0.1.jar - wget https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-impl/2.3.2/jaxb-impl-2.3.2.jar - wget https://repo1.maven.org/maven2/javax/activation/activation/1.1.1/activation-1.1.1.jar - - - name: Download Android Emulator Image - run: | - echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --update - # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install "system-images;android-31;google_apis;x86_64" - echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-31;google_apis;x86_64" - echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-31;google_apis;x86_64' - $ANDROID_HOME/emulator/emulator -list-avds - - - name: Android Emulator - timeout-minutes: 10 - continue-on-error: true - run: | - echo "Starting emulator" - nohup $ANDROID_HOME/emulator/emulator -avd emu -no-audio -no-snapshot -no-window & - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' - $ANDROID_HOME/platform-tools/adb devices - echo "Emulator started" - - - name: capture - run: | - screencapture emulator-31.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31.png - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-31.jpg - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-31.png + - uses: actions/checkout@v4 + + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + with: + # all of these default to true, but feel free to set to + # "false" if necessary for your workflow + android: false + # large-packages: true + # swap-storage: true + + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Gradle cache + uses: gradle/actions/setup-gradle@v3 + with: + # TODO: Remove this after we merge + cache-read-only: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/add_e2e_android' }} + + - name: AVD Deps + run: | + sudo apt update + sudo apt-get install -y libpulse0 libgl1 + + - name: Create destination path + run: mkdir -p android/app/build/outputs/apk + + - name: Download artifact + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + curl -L -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + --output android/app/build/outputs/apk/artifact.zip + + - name: Unzip artifact + run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk + + - name: Cleanup + run: rm android/app/build/outputs/apk/artifact.zip + + - name: AVD cache + uses: actions/cache@v4 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* + key: avd-${{ matrix.api-level }} + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm i + + - name: create AVD and generate snapshot for caching + if: steps.avd-cache.outputs.cache-hit != 'true' + uses: reactivecircus/android-emulator-runner@v2 + with: + profile: pixel_6_pro + api-level: ${{ matrix.api-level }} + arch: x86_64 + force-avd-creation: false + emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + script: echo "Generated AVD snapshot for caching." + + - name: Enable KVM group perms + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + + - name: Run tests + uses: reactivecircus/android-emulator-runner@v2 + with: + profile: pixel_6_pro + api-level: ${{ matrix.api-level }} + arch: x86_64 + force-avd-creation: false + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + disable-animations: true + script: | + touch adb-log.txt + $ANDROID_HOME/platform-tools/adb logcat '*:D' >> adb-log.txt & + $ANDROID_HOME/tools/emulator -list-avds + adb emu screenrecord start --time-limit 1800 video.webm + sleep 5 + cd detox && npm run e2e:android-test -- detox/e2e/test/account/about.e2e.ts # download-e2e-results: # runs-on: ubuntu-22.04 diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index f9ed9648373..ede199569eb 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -37,7 +37,7 @@ "android": { "type": "android.emulator", "device": { - "avdName": "android_emulator", + "avdName": "pixel_6_pro", "api": "30" } } From a171397b5c499db5cd3b663bd8f97e897595144f Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 26 Jun 2024 04:24:48 +0530 Subject: [PATCH 271/362] tt --- .github/workflows/e2e-detox-android-template.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 8def285ec79..e7257d5269f 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -199,8 +199,6 @@ jobs: script: | touch adb-log.txt $ANDROID_HOME/platform-tools/adb logcat '*:D' >> adb-log.txt & - $ANDROID_HOME/tools/emulator -list-avds - adb emu screenrecord start --time-limit 1800 video.webm sleep 5 cd detox && npm run e2e:android-test -- detox/e2e/test/account/about.e2e.ts From 4b8a2a20ef1531b21d0cfca17f52db3836952eba Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 26 Jun 2024 05:02:23 +0530 Subject: [PATCH 272/362] capture screen shot --- .../workflows/e2e-detox-android-template.yml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index e7257d5269f..9ef193c2301 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -199,9 +199,26 @@ jobs: script: | touch adb-log.txt $ANDROID_HOME/platform-tools/adb logcat '*:D' >> adb-log.txt & + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' + + $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 + $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 + $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 + screencapture emulator-${{ matrix.api-level }}-${{ matrix.rn-version }}.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.api-level }}-${{ matrix.rn-version }}.png + sleep 5 cd detox && npm run e2e:android-test -- detox/e2e/test/account/about.e2e.ts - + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-${{ matrix.api-level }}-${{ matrix.rn-version }}.jpg + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-${{ matrix.api-level }}-${{ matrix.rn-version }}.png + # download-e2e-results: # runs-on: ubuntu-22.04 # needs: From e0df6432d51f3e1d557302b33d1cc4f54619868f Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 26 Jun 2024 05:21:40 +0530 Subject: [PATCH 273/362] screen capture --- .github/workflows/e2e-detox-android-template.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 9ef193c2301..c5cc48f36ec 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -104,7 +104,7 @@ jobs: api-level: [31] # TODO: Let's not care about different APIs for now # api-level: [31, 32, 33, 34] - rn-version: ['latest', '0.72-stable', '0.71-stable', '0.70-stable'] + rn-version: ['latest'] steps: - uses: actions/checkout@v4 @@ -204,8 +204,8 @@ jobs: $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - screencapture emulator-${{ matrix.api-level }}-${{ matrix.rn-version }}.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.api-level }}-${{ matrix.rn-version }}.png + + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31.png sleep 5 cd detox && npm run e2e:android-test -- detox/e2e/test/account/about.e2e.ts @@ -213,11 +213,11 @@ jobs: - uses: actions/upload-artifact@v3 with: name: Android-Emulator-Screenshots - path: emulator-${{ matrix.api-level }}-${{ matrix.rn-version }}.jpg + path: emulator-31.jpg - uses: actions/upload-artifact@v3 with: name: Android-Emulator-Screenshots - path: emulator-${{ matrix.api-level }}-${{ matrix.rn-version }}.png + path: emulator-31.png # download-e2e-results: # runs-on: ubuntu-22.04 From 24d154215710793a456225fc5aef4968028e3e69 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 26 Jun 2024 15:18:19 +0530 Subject: [PATCH 274/362] build-macos-latest --- .../workflows/e2e-detox-android-template.yml | 170 +++++------------- 1 file changed, 49 insertions(+), 121 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index c5cc48f36ec..e7bd971d565 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -95,129 +95,57 @@ jobs: # device_name: ${{ env.DEVICE_NAME }} # device_os_version: ${{env.DEVICE_OS_VERSION}} - android: - name: Android - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - api-level: [31] - # TODO: Let's not care about different APIs for now - # api-level: [31, 32, 33, 34] - rn-version: ['latest'] + build: + runs-on: macos-latest + timeout-minutes: 40 steps: - - uses: actions/checkout@v4 - - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@main - with: - # all of these default to true, but feel free to set to - # "false" if necessary for your workflow - android: false - # large-packages: true - # swap-storage: true - - - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: '17' - - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps - - - name: Gradle cache - uses: gradle/actions/setup-gradle@v3 - with: - # TODO: Remove this after we merge - cache-read-only: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/add_e2e_android' }} - - - name: AVD Deps - run: | - sudo apt update - sudo apt-get install -y libpulse0 libgl1 - - - name: Create destination path - run: mkdir -p android/app/build/outputs/apk - - - name: Download artifact - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - curl -L -H "Authorization: token $GITHUB_TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - --output android/app/build/outputs/apk/artifact.zip - - - name: Unzip artifact - run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk - - - name: Cleanup - run: rm android/app/build/outputs/apk/artifact.zip - - - name: AVD cache - uses: actions/cache@v4 - id: avd-cache - with: - path: | - ~/.android/avd/* - ~/.android/adb* - key: avd-${{ matrix.api-level }} - - - name: Start React Native Metro Server - run: npm run start & - - - name: Install Detox Dependencies - run: cd detox && npm i - - - name: create AVD and generate snapshot for caching - if: steps.avd-cache.outputs.cache-hit != 'true' - uses: reactivecircus/android-emulator-runner@v2 - with: - profile: pixel_6_pro - api-level: ${{ matrix.api-level }} - arch: x86_64 - force-avd-creation: false - emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - script: echo "Generated AVD snapshot for caching." - - - name: Enable KVM group perms - run: | - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm - - - name: Run tests - uses: reactivecircus/android-emulator-runner@v2 - with: - profile: pixel_6_pro - api-level: ${{ matrix.api-level }} - arch: x86_64 - force-avd-creation: false - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - disable-animations: true - script: | - touch adb-log.txt - $ANDROID_HOME/platform-tools/adb logcat '*:D' >> adb-log.txt & - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' - - $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 - $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 - $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31.png - - sleep 5 - cd detox && npm run e2e:android-test -- detox/e2e/test/account/about.e2e.ts - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-31.jpg - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-31.png + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 + with: + fetch-depth: 1 + + - name: Node + uses: actions/setup-node@v4 + with: + node-version: 18 + + - name: Use specific Java version for sdkmanager to work + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + + - name: Download Android Emulator Image + run: | + echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;google_apis;x86" + echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-29;google_apis;x86' + $ANDROID_HOME/emulator/emulator -list-avds + + - name: Android Emulator + timeout-minutes: 10 + continue-on-error: true + run: | + echo "Starting emulator" + nohup $ANDROID_HOME/emulator/emulator -avd emu -no-audio -no-snapshot -no-window & + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' + $ANDROID_HOME/platform-tools/adb devices + echo "Emulator started" + + - name: capture + run: | + screencapture emulator-31.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31.png + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-31.jpg + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-31.png # download-e2e-results: # runs-on: ubuntu-22.04 From 1c70bddce0e0aa8594c41673172ef53195891e89 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 26 Jun 2024 15:22:49 +0530 Subject: [PATCH 275/362] test xml schema fix --- .github/workflows/e2e-detox-android-template.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index e7bd971d565..76977e202f8 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -121,6 +121,8 @@ jobs: echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;google_apis;x86" echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-29;google_apis;x86' $ANDROID_HOME/emulator/emulator -list-avds + env: + JAVA_OPTS: -XX:+IgnoreUnrecognizedVMOptions --add-modules java.xml.bind - name: Android Emulator timeout-minutes: 10 From c0ef5192cf454644f41814750e6e98426ad809b9 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 17 Jul 2024 06:34:11 +0530 Subject: [PATCH 276/362] test-snapshot --- .../workflows/e2e-detox-android-template.yml | 271 +++++++++++++++++- 1 file changed, 266 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 76977e202f8..25c15a548a5 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -94,10 +94,273 @@ jobs: # search_path: detox/e2e/test # device_name: ${{ env.DEVICE_NAME }} # device_os_version: ${{env.DEVICE_OS_VERSION}} + + # build-android-apk: + # needs: update-initial-status + # runs-on: macos-14-large + # env: + # ORG_GRADLE_PROJECT_jvmargs: -Xmx8g + # steps: + # - name: ci/checkout-repo + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + # with: + # ref: ${{ github.event.pull_request.head.sha }} + + # - name: ci/prepare-android-build + # uses: ./.github/actions/prepare-android-build + # env: + # STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + # STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + # STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + # MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + + # - name: Cache Gradle dependencies + # uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + # with: + # path: ~/.gradle/caches + # key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + # restore-keys: | + # ${{ runner.os }}-gradle- + + # - name: Install Java + # uses: actions/setup-java@v4 + # with: + # java-version: "17" + # distribution: "adopt" + # cache: "gradle" + + # - name: Validate Gradle wrapper + # uses: gradle/actions/wrapper-validation@v3 + + # - name: Detox build + # run: | + # cd detox + # npm install + # npm install -g detox-cli + # npm run e2e:android-build + + # - name: ci/upload-android-pr-build + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-build-apk-${{ github.run_id }} + # path: "android/app/build/outputs/apk/**/app-*.apk" + + # e2e-android-on-mac: + # name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} + # continue-on-error: true + # runs-on: macos-13 + # timeout-minutes: 40 + # needs: + # - generate-specs + # # - build-android-apk + # strategy: + # fail-fast: false + # matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} + # steps: + # - name: Checkout + # uses: actions/checkout@v1 + # with: + # fetch-depth: 1 + + # - name: ci/prepare-node-deps + # uses: ./.github/actions/prepare-node-deps + + # - name: Install Sharp CLI for faster image generation during prebuild + # run: npm install --global sharp-cli + + # - name: Start React Native Metro Server + # run: npm run start & + + # - name: Install Detox Dependencies + # run: cd detox && npm i + + # - name: Install Java + # uses: actions/setup-java@v4 + # with: + # java-version: "17" + # distribution: "adopt" + # cache: "gradle" + + # - name: Create destination path + # run: mkdir -p android/app/build/outputs/apk + + # - name: Download artifact + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # run: | + # curl -L -H "Authorization: token $GITHUB_TOKEN" \ + # -H "Accept: application/vnd.github.v3+json" \ + # https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + # --output android/app/build/outputs/apk/artifact.zip + + # - name: Unzip artifact + # run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk + + # - name: Cleanup + # run: rm android/app/build/outputs/apk/artifact.zip + + # - name: Launch Android Emulator + # run: | + # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' + # echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" + # echo "Emulator created successfully" + # nohup $ANDROID_HOME/emulator/emulator -avd android_emulator -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -qemu -m 4096 > /dev/null 2>&1 & + # $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\''\r'\'') ]]; do sleep 1; done' + # $ANDROID_HOME/platform-tools/adb devices + # $ANDROID_HOME/platform-tools/adb shell input keyevent 82 + # $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 + # $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 + # $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 + # sleep 60 + # screencapture emulator-macos-13.jpg + # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-macos-13.png + + # - uses: actions/upload-artifact@v3 + # with: + # name: Android-Emulator-Screenshots + # path: emulator-macos-13.jpg + + # - uses: actions/upload-artifact@v3 + # with: + # name: Android-Emulator-Screenshots + # path: emulator-macos-13.jpg.png + + # - name: Run Android Detox E2E Tests on macOS + # run: | + # cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + + # - name: Upload Android Test Report + # if: always() + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-results-${{ matrix.runId }} + # path: detox/artifacts + + test: + runs-on: macos-latest + strategy: + fail-fast: false + env: + ANDROID_BUILD_TOOLS_VERSION: "34.0.0" + ANDROID_SDK_PACKAGES: "platform-tools build-tools;34.0.0 system-images;android-31;google_apis;x86_64" + ANDROID_TARGET: "android-31" + ANDROID_ARCH: "x86_64" + EMULATOR_TIMEOUT: "600" + EMULATOR_NAME: "pixel_6" + + steps: + - name: Checkout Repository + uses: actions/checkout@v4.1.1 + + - name: Add avdmanager and sdkmanager to system PATH + run: | + echo "$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools/${{ env.ANDROID_BUILD_TOOLS_VERSION }}" >> $GITHUB_PATH + + - name: Accept Licenses + run: yes | sdkmanager --licenses + + - name: List Available Packages + run: sdkmanager --list + + - name: Install System Image + run: sdkmanager "system-images;${{ env.ANDROID_TARGET }};google_apis;${{ env.ANDROID_ARCH }}" + + - name: Build Emulator + run: | + echo "no" | avdmanager --verbose create avd --force -n ${{ env.EMULATOR_NAME }} --abi "${{ env.ANDROID_TARGET }}/${{ env.ANDROID_ARCH }}" -k "system-images;${{ env.ANDROID_TARGET }};google_apis;${{ env.ANDROID_ARCH }}" + + - name: Launch Emulator + run: | + chmod +x ./start_emu_headless.sh + EMULATOR_TIMEOUT=${{ env.EMULATOR_TIMEOUT }} EMULATOR_NAME=${{ env.EMULATOR_NAME }} ./start_emu_headless.sh + + screencapture emulator-31-1.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31-1.png + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-31-1.jpg + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-31-1.png + + test-snapshot: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: ['macos-13'] + try: ['0', '1', '2'] + + steps: + - name: Debug info + run: | + echo "ANDROID_HOME: $ANDROID_HOME" + ls -R $ANDROID_HOME + ls -R ~/.android + + - name: Set up Android SDK and create AVD + run: | + echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-29;google_apis;x86_64' + echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-29;google_apis;x86_64' --force --device "pixel_6" + + - name: Configure AVD + run: | + echo "hw.ramSize=4096" >> ~/.android/avd/android_emulator.avd/config.ini + echo "hw.cpu.ncore=2" >> ~/.android/avd/android_emulator.avd/config.ini + echo "hw.gpu.enabled=true" >> ~/.android/avd/android_emulator.avd/config.ini + + - name: Start Android Emulator + run: | + $ANDROID_HOME/emulator/emulator -avd android_emulator -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim & + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' + + - name: Disable animations + run: | + $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 + $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 + $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 + + - name: capture + run: | + screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.os }}-${{ matrix.try }}.png + + # - run: | + # echo "hw.ramSize=4096" >> ~/.android/avd/android_emulator.avd/config.ini + # echo "hw.cpu.ncore=2" >> ~/.android/avd/android_emulator.avd/config.ini + # - run: | + # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-29;google_apis;x86_64' + # echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-29;google_apis;x86_64' --force --device "pixel_6" + + # #echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' + # #echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" + # echo "Emulator created successfully" + # nohup $ANDROID_HOME/emulator/emulator -memory 4096 -avd android_emulator -skin 1080x1920 -no-window -noaudio -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel auto -gpu swiftshader_indirect -qemu -lcd-density 420 > /dev/null 2>&1 & + # $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' + # $ANDROID_HOME/platform-tools/adb devices + # $ANDROID_HOME/platform-tools/adb shell input keyevent 82 + # $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 + # $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 + # $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 + # sleep 120 + # screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg + # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.os }}-${{ matrix.try }}.png + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-${{ matrix.os }}-${{ matrix.try }}.jpg + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-${{ matrix.os }}-${{ matrix.try }}.png build: runs-on: macos-latest - timeout-minutes: 40 + timeout-minutes: 15 steps: - name: Checkout @@ -114,15 +377,13 @@ jobs: uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: '17' + java-version: '8' - name: Download Android Emulator Image run: | echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;google_apis;x86" echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-29;google_apis;x86' $ANDROID_HOME/emulator/emulator -list-avds - env: - JAVA_OPTS: -XX:+IgnoreUnrecognizedVMOptions --add-modules java.xml.bind - name: Android Emulator timeout-minutes: 10 @@ -149,6 +410,7 @@ jobs: name: Android-Emulator-Screenshots path: emulator-31.png + # download-e2e-results: # runs-on: ubuntu-22.04 # needs: @@ -236,4 +498,3 @@ jobs: # name: androidLabel, # }); # } - \ No newline at end of file From 14053dd732ad50f9d47edcf2036f5c5c4766efc0 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 17 Jul 2024 06:52:11 +0530 Subject: [PATCH 277/362] test-snapshot-1 --- .../workflows/e2e-detox-android-template.yml | 142 +++--------------- 1 file changed, 19 insertions(+), 123 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 25c15a548a5..36a4347ec5e 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -236,56 +236,6 @@ jobs: # name: android-results-${{ matrix.runId }} # path: detox/artifacts - test: - runs-on: macos-latest - strategy: - fail-fast: false - env: - ANDROID_BUILD_TOOLS_VERSION: "34.0.0" - ANDROID_SDK_PACKAGES: "platform-tools build-tools;34.0.0 system-images;android-31;google_apis;x86_64" - ANDROID_TARGET: "android-31" - ANDROID_ARCH: "x86_64" - EMULATOR_TIMEOUT: "600" - EMULATOR_NAME: "pixel_6" - - steps: - - name: Checkout Repository - uses: actions/checkout@v4.1.1 - - - name: Add avdmanager and sdkmanager to system PATH - run: | - echo "$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools/${{ env.ANDROID_BUILD_TOOLS_VERSION }}" >> $GITHUB_PATH - - - name: Accept Licenses - run: yes | sdkmanager --licenses - - - name: List Available Packages - run: sdkmanager --list - - - name: Install System Image - run: sdkmanager "system-images;${{ env.ANDROID_TARGET }};google_apis;${{ env.ANDROID_ARCH }}" - - - name: Build Emulator - run: | - echo "no" | avdmanager --verbose create avd --force -n ${{ env.EMULATOR_NAME }} --abi "${{ env.ANDROID_TARGET }}/${{ env.ANDROID_ARCH }}" -k "system-images;${{ env.ANDROID_TARGET }};google_apis;${{ env.ANDROID_ARCH }}" - - - name: Launch Emulator - run: | - chmod +x ./start_emu_headless.sh - EMULATOR_TIMEOUT=${{ env.EMULATOR_TIMEOUT }} EMULATOR_NAME=${{ env.EMULATOR_NAME }} ./start_emu_headless.sh - - screencapture emulator-31-1.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31-1.png - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-31-1.jpg - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-31-1.png test-snapshot: runs-on: ${{ matrix.os }} @@ -327,28 +277,26 @@ jobs: - name: capture run: | screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.os }}-${{ matrix.try }}.png + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-capture-${{ matrix.os }}-${{ matrix.try }}.png + + - run: | + echo "hw.ramSize=4096" >> ~/.android/avd/android_emulator.avd/config.ini + echo "hw.cpu.ncore=2" >> ~/.android/avd/android_emulator.avd/config.ini + - run: | + echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-29;google_apis;x86_64' + echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-29;google_apis;x86_64' --force --device "pixel_6" - # - run: | - # echo "hw.ramSize=4096" >> ~/.android/avd/android_emulator.avd/config.ini - # echo "hw.cpu.ncore=2" >> ~/.android/avd/android_emulator.avd/config.ini - # - run: | - # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-29;google_apis;x86_64' - # echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-29;google_apis;x86_64' --force --device "pixel_6" - - # #echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' - # #echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" - # echo "Emulator created successfully" - # nohup $ANDROID_HOME/emulator/emulator -memory 4096 -avd android_emulator -skin 1080x1920 -no-window -noaudio -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel auto -gpu swiftshader_indirect -qemu -lcd-density 420 > /dev/null 2>&1 & - # $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' - # $ANDROID_HOME/platform-tools/adb devices - # $ANDROID_HOME/platform-tools/adb shell input keyevent 82 - # $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 - # $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 - # $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - # sleep 120 - # screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg - # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.os }}-${{ matrix.try }}.png + echo "Emulator created successfully" + nohup $ANDROID_HOME/emulator/emulator -memory 4096 -avd android_emulator -skin 1080x1920 -no-window -noaudio -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel auto -gpu swiftshader_indirect -qemu -lcd-density 420 > /dev/null 2>&1 & + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' + $ANDROID_HOME/platform-tools/adb devices + $ANDROID_HOME/platform-tools/adb shell input keyevent 82 + $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 + $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 + $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 + sleep 120 + screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.os }}-${{ matrix.try }}.png - uses: actions/upload-artifact@v3 with: name: Android-Emulator-Screenshots @@ -358,58 +306,6 @@ jobs: name: Android-Emulator-Screenshots path: emulator-${{ matrix.os }}-${{ matrix.try }}.png - build: - runs-on: macos-latest - timeout-minutes: 15 - - steps: - - name: Checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 - with: - fetch-depth: 1 - - - name: Node - uses: actions/setup-node@v4 - with: - node-version: 18 - - - name: Use specific Java version for sdkmanager to work - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: '8' - - - name: Download Android Emulator Image - run: | - echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;google_apis;x86" - echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-29;google_apis;x86' - $ANDROID_HOME/emulator/emulator -list-avds - - - name: Android Emulator - timeout-minutes: 10 - continue-on-error: true - run: | - echo "Starting emulator" - nohup $ANDROID_HOME/emulator/emulator -avd emu -no-audio -no-snapshot -no-window & - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82' - $ANDROID_HOME/platform-tools/adb devices - echo "Emulator started" - - - name: capture - run: | - screencapture emulator-31.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-31.png - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-31.jpg - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-31.png - # download-e2e-results: # runs-on: ubuntu-22.04 From f8aa2b7d6f2011f1ea34d9b3da77d48920d28bed Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 17 Jul 2024 08:08:33 +0530 Subject: [PATCH 278/362] try running tests --- .../workflows/e2e-detox-android-template.yml | 177 ++++++++++-------- detox/.detoxrc.json | 4 +- 2 files changed, 105 insertions(+), 76 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 36a4347ec5e..8dc62ff560d 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -49,51 +49,51 @@ env: FAILURE_MESSAGE: "Something has failed" jobs: - # update-initial-status: - # runs-on: ubuntu-22.04 - # steps: - # - uses: mattermost/actions/delivery/update-commit-status@main - # env: - # GITHUB_TOKEN: ${{ github.token }} - # with: - # repository_full_name: ${{ github.repository }} - # commit_sha: ${{ inputs.commit_sha }} - # context: ${{ inputs.status_check_context }} - # description: Detox tests for mattermost mobile app - # status: pending - - # generate-specs: - # needs: update-initial-status - # runs-on: ubuntu-22.04 - # outputs: - # specs: ${{ steps.generate-specs.outputs.specs }} - # build_id: ${{ env.BUILD_ID }} - # device_name: ${{ env.DEVICE_NAME }} - # device_os_version: ${{ env.DEVICE_OS_VERSION }} - # steps: - # - name: Checkout Repository - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - # - name: Set Build ID - # id: resolve-device - # run: | - # cd detox - # DEVICE_NAME=$(node -p "require('./.detoxrc').devices['android'].device.avdName") - # DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['android'].device.api") - # BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" - - # echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV - # echo "DEVICE_NAME=$(echo ${DEVICE_NAME})" >> $GITHUB_ENV - # echo "DEVICE_OS_VERSION=$(echo ${DEVICE_OS_VERSION})" >> $GITHUB_ENV + update-initial-status: + runs-on: ubuntu-22.04 + steps: + - uses: mattermost/actions/delivery/update-commit-status@main + env: + GITHUB_TOKEN: ${{ github.token }} + with: + repository_full_name: ${{ github.repository }} + commit_sha: ${{ inputs.commit_sha }} + context: ${{ inputs.status_check_context }} + description: Detox tests for mattermost mobile app + status: pending + + generate-specs: + needs: update-initial-status + runs-on: ubuntu-22.04 + outputs: + specs: ${{ steps.generate-specs.outputs.specs }} + build_id: ${{ env.BUILD_ID }} + device_name: ${{ env.DEVICE_NAME }} + device_os_version: ${{ env.DEVICE_OS_VERSION }} + steps: + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - # - name: Generate Test Specs - # id: generate-specs - # uses: ./.github/actions/generate-specs - # with: - # parallelism: 10 - # search_path: detox/e2e/test - # device_name: ${{ env.DEVICE_NAME }} - # device_os_version: ${{env.DEVICE_OS_VERSION}} + - name: Set Build ID + id: resolve-device + run: | + cd detox + DEVICE_NAME=$(node -p "require('./.detoxrc').devices['android'].device.avdName") + DEVICE_OS_VERSION=$(node -p "require('./.detoxrc').devices['android'].device.api") + BUILD_ID="${{ github.run_id }}-$DEVICE_NAME-$DEVICE_OS_VERSION" + + echo "BUILD_ID=$(echo ${BUILD_ID} | sed 's/ /_/g')" >> $GITHUB_ENV + echo "DEVICE_NAME=$(echo ${DEVICE_NAME})" >> $GITHUB_ENV + echo "DEVICE_OS_VERSION=$(echo ${DEVICE_OS_VERSION})" >> $GITHUB_ENV + + - name: Generate Test Specs + id: generate-specs + uses: ./.github/actions/generate-specs + with: + parallelism: 10 + search_path: detox/e2e/test + device_name: ${{ env.DEVICE_NAME }} + device_os_version: ${{env.DEVICE_OS_VERSION}} # build-android-apk: # needs: update-initial-status @@ -236,16 +236,14 @@ jobs: # name: android-results-${{ matrix.runId }} # path: detox/artifacts - test-snapshot: - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: ['macos-13'] - try: ['0', '1', '2'] - + runs-on: macos-13 + continue-on-error: true + timeout-minutes: 40 + needs: + - generate-specs steps: + - name: Debug info run: | echo "ANDROID_HOME: $ANDROID_HOME" @@ -276,36 +274,67 @@ jobs: - name: capture run: | - screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-capture-${{ matrix.os }}-${{ matrix.try }}.png - - - run: | - echo "hw.ramSize=4096" >> ~/.android/avd/android_emulator.avd/config.ini - echo "hw.cpu.ncore=2" >> ~/.android/avd/android_emulator.avd/config.ini - - run: | - echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-29;google_apis;x86_64' - echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-29;google_apis;x86_64' --force --device "pixel_6" + screencapture emulator-macos-13.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-capture-macos-13.png - echo "Emulator created successfully" - nohup $ANDROID_HOME/emulator/emulator -memory 4096 -avd android_emulator -skin 1080x1920 -no-window -noaudio -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel auto -gpu swiftshader_indirect -qemu -lcd-density 420 > /dev/null 2>&1 & - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' - $ANDROID_HOME/platform-tools/adb devices - $ANDROID_HOME/platform-tools/adb shell input keyevent 82 - $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 - $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 - $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - sleep 120 - screencapture emulator-${{ matrix.os }}-${{ matrix.try }}.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-${{ matrix.os }}-${{ matrix.try }}.png - uses: actions/upload-artifact@v3 with: name: Android-Emulator-Screenshots - path: emulator-${{ matrix.os }}-${{ matrix.try }}.jpg + path: emulator-macos-13.jpg - uses: actions/upload-artifact@v3 with: name: Android-Emulator-Screenshots - path: emulator-${{ matrix.os }}-${{ matrix.try }}.png + path: emulator-capture-macos-13.png + - name: Checkout + uses: actions/checkout@v1 + with: + fetch-depth: 1 + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Install Sharp CLI for faster image generation during prebuild + run: npm install --global sharp-cli + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm i + + - name: Install Java + uses: actions/setup-java@v4 + with: + java-version: "17" + distribution: "adopt" + cache: "gradle" + + - name: Create destination path + run: mkdir -p android/app/build/outputs/apk + + - name: Download artifact + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + curl -L -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + --output android/app/build/outputs/apk/artifact.zip + - name: Unzip artifact + run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk + - name: Cleanup + run: rm android/app/build/outputs/apk/artifact.zip + + - name: Run Android Detox E2E Tests on macOS + run: | + cd detox && npm run e2e:android-test -- about.e2e.ts + + - name: Upload Android Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-results-1 + path: detox/artifacts # download-e2e-results: # runs-on: ubuntu-22.04 diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index ede199569eb..07c5da3c439 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -37,8 +37,8 @@ "android": { "type": "android.emulator", "device": { - "avdName": "pixel_6_pro", - "api": "30" + "avdName": "android_emulator", + "api": "29" } } }, From ad1727209db4da45a477be33f226abcabbb1e512 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 17 Jul 2024 08:27:33 +0530 Subject: [PATCH 279/362] capture screen after tests fail --- .../workflows/e2e-detox-android-template.yml | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 8dc62ff560d..b39a882e062 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -272,20 +272,6 @@ jobs: $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - - name: capture - run: | - screencapture emulator-macos-13.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-capture-macos-13.png - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-macos-13.jpg - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-capture-macos-13.png - - name: Checkout uses: actions/checkout@v1 with: @@ -336,6 +322,19 @@ jobs: name: android-results-1 path: detox/artifacts + - name: capture + run: | + screencapture emulator-macos-13.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-capture-macos-13.png + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-macos-13.jpg + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-capture-macos-13.png # download-e2e-results: # runs-on: ubuntu-22.04 # needs: From d5885862037af082551c62eef5d9725e6cb6e4d9 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 17 Jul 2024 08:49:52 +0530 Subject: [PATCH 280/362] try on ubuntu --- .../workflows/e2e-detox-android-template.yml | 94 ++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index b39a882e062..3846adc4ffa 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -297,7 +297,6 @@ jobs: - name: Create destination path run: mkdir -p android/app/build/outputs/apk - - name: Download artifact env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -335,6 +334,99 @@ jobs: with: name: Android-Emulator-Screenshots path: emulator-capture-macos-13.png + + detox-e2e-tests: + runs-on: ubuntu-latest + + services: + xvfb: + image: tianon/xvfb + options: --privileged + + steps: + + - name: Checkout + uses: actions/checkout@v1 + with: + fetch-depth: 1 + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Install Sharp CLI for faster image generation during prebuild + run: npm install --global sharp-cli + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm i + + - name: Set up JDK + uses: actions/setup-java@v2 + with: + distribution: 'zulu' + java-version: '11' + + - name: Create destination path + run: mkdir -p android/app/build/outputs/apk + - name: Download artifact + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + curl -L -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + --output android/app/build/outputs/apk/artifact.zip + - name: Unzip artifact + run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk + + - name: Cleanup + run: rm android/app/build/outputs/apk/artifact.zip + + - name: Download and set up Android SDK + uses: android-actions/setup-android@v2 + with: + api-level: 30 + target: default + arch: x86_64 + profile: default + emulator-build: system-images;android-30;default;x86_64 + + - name: Start Android Emulator + run: | + sudo $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window & + adb wait-for-device + adb shell input keyevent 82 + + - name: Run Android Detox E2E Tests on macOS + run: | + cd detox && npm run e2e:android-test -- about.e2e.ts + + - name: Upload Android Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-results-1 + path: detox/artifacts + + - name: capture + run: | + screencapture emulator-macos-13.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-capture-macos-13.png + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-macos-13.jpg + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-capture-macos-13.png + + - name: Stop Android Emulator + run: adb -s emulator-5554 emu kill + # download-e2e-results: # runs-on: ubuntu-22.04 # needs: From 52626eda05b939fb443cc310de4e29e05292d297 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 17 Jul 2024 08:54:47 +0530 Subject: [PATCH 281/362] try on ubuntu 1 --- .github/workflows/e2e-detox-android-template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 3846adc4ffa..7cb4777a8c6 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -340,7 +340,7 @@ jobs: services: xvfb: - image: tianon/xvfb + image: circleci/xvfb:latest options: --privileged steps: From 32377f3ff5da20bc0614c583a1af0b150b8002b6 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 17 Jul 2024 08:57:59 +0530 Subject: [PATCH 282/362] try on ubuntu 2 --- .github/workflows/e2e-detox-android-template.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 7cb4777a8c6..6198168a7bc 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -338,13 +338,7 @@ jobs: detox-e2e-tests: runs-on: ubuntu-latest - services: - xvfb: - image: circleci/xvfb:latest - options: --privileged - steps: - - name: Checkout uses: actions/checkout@v1 with: From d43cf3d933c3e3fdfe2cfc4507d40a832761ca72 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 17 Jul 2024 11:02:40 +0530 Subject: [PATCH 283/362] try on ubuntu 3 --- .github/workflows/e2e-detox-android-template.yml | 7 ++++--- detox/.detoxrc.json | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 6198168a7bc..f1e6711dc5b 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -252,8 +252,8 @@ jobs: - name: Set up Android SDK and create AVD run: | - echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-29;google_apis;x86_64' - echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-29;google_apis;x86_64' --force --device "pixel_6" + echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-30;google_apis;x86_64' + echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-30;google_apis;x86_64' --force --device "android_emulator" - name: Configure AVD run: | @@ -389,7 +389,8 @@ jobs: - name: Start Android Emulator run: | - sudo $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window & + sudo $ANDROID_HOME/emulator/emulator -avd android_emulator -no-audio -no-window & + sleep 30 adb wait-for-device adb shell input keyevent 82 diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 07c5da3c439..f9ed9648373 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -38,7 +38,7 @@ "type": "android.emulator", "device": { "avdName": "android_emulator", - "api": "29" + "api": "30" } } }, From 3d55f7b3a06367d7a342185afeb6329f1273938e Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 30 Jul 2024 10:48:22 +0530 Subject: [PATCH 284/362] wait for emulator to boot --- .github/workflows/e2e-detox-android-template.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index f1e6711dc5b..f4abaffc96f 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -264,7 +264,14 @@ jobs: - name: Start Android Emulator run: | $ANDROID_HOME/emulator/emulator -avd android_emulator -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim & - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 5; done; input keyevent 82' + # Wait for the emulator to boot with a timeout + for i in {1..30}; do + if $ANDROID_HOME/platform-tools/adb shell getprop sys.boot_completed | grep -m 1 '1'; then + break + fi + echo "Waiting for emulator to boot..." + sleep 5 + done - name: Disable animations run: | From a785daacafc8fda611cf1ef73a0e1cc3a8019002 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 30 Jul 2024 11:01:39 +0530 Subject: [PATCH 285/362] add device pixel_6 --- .../workflows/e2e-detox-android-template.yml | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index f4abaffc96f..c63b90833e5 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -253,17 +253,17 @@ jobs: - name: Set up Android SDK and create AVD run: | echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-30;google_apis;x86_64' - echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-30;google_apis;x86_64' --force --device "android_emulator" + echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n pixel_6 -k 'system-images;android-30;google_apis;x86_64' --force --device "pixel_6" - name: Configure AVD run: | - echo "hw.ramSize=4096" >> ~/.android/avd/android_emulator.avd/config.ini - echo "hw.cpu.ncore=2" >> ~/.android/avd/android_emulator.avd/config.ini - echo "hw.gpu.enabled=true" >> ~/.android/avd/android_emulator.avd/config.ini + echo "hw.ramSize=4096" >> ~/.android/avd/pixel_6.avd/config.ini + echo "hw.cpu.ncore=2" >> ~/.android/avd/pixel_6.avd/config.ini + echo "hw.gpu.enabled=true" >> ~/.android/avd/pixel_6.avd/config.ini - name: Start Android Emulator run: | - $ANDROID_HOME/emulator/emulator -avd android_emulator -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim & + $ANDROID_HOME/emulator/emulator -avd pixel_6 -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim & # Wait for the emulator to boot with a timeout for i in {1..30}; do if $ANDROID_HOME/platform-tools/adb shell getprop sys.boot_completed | grep -m 1 '1'; then @@ -394,9 +394,16 @@ jobs: profile: default emulator-build: system-images;android-30;default;x86_64 + - name: Create AVD if it doesn't exist + run: | + if [ ! -f "$HOME/.android/avd/pixel_6.avd/config.ini" ]; then + echo "Creating AVD..." + echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n pixel_6 -k 'system-images;android-30;google_apis;x86_64' --force --device "pixel_6" + fi + - name: Start Android Emulator run: | - sudo $ANDROID_HOME/emulator/emulator -avd android_emulator -no-audio -no-window & + $ANDROID_HOME/emulator/emulator -avd pixel_6 -no-audio -no-window & sleep 30 adb wait-for-device adb shell input keyevent 82 From c43c8f8835fbfa73929196aa2ca63bd801969171 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 30 Jul 2024 11:20:32 +0530 Subject: [PATCH 286/362] check system images --- .github/workflows/e2e-detox-android-template.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index c63b90833e5..25bd65ca0d2 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -397,8 +397,14 @@ jobs: - name: Create AVD if it doesn't exist run: | if [ ! -f "$HOME/.android/avd/pixel_6.avd/config.ini" ]; then - echo "Creating AVD..." - echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n pixel_6 -k 'system-images;android-30;google_apis;x86_64' --force --device "pixel_6" + echo "Checking for available system images..." + if $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --list | grep -q "system-images;android-30;google_apis;x86_64"; then + echo "Creating AVD..." + echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n pixel_6 -k 'system-images;android-30;google_apis;x86_64' --force --device "pixel_6" + else + echo "Error: Required system image not found." + exit 1 + fi fi - name: Start Android Emulator From 7c9ed60fed80b1ebe8479c6a200c0826c3c985b4 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 30 Jul 2024 11:35:08 +0530 Subject: [PATCH 287/362] add device pixel_6 in detoxrc.json --- detox/.detoxrc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index f9ed9648373..8b308ea063f 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -37,7 +37,7 @@ "android": { "type": "android.emulator", "device": { - "avdName": "android_emulator", + "avdName": "pixel_6", "api": "30" } } From 4c83e28442a50fd84a751faeb856edc9f7bad64b Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 30 Jul 2024 11:36:00 +0530 Subject: [PATCH 288/362] add new workflow --- .github/workflows/test-android-detox.yml | 96 ++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 .github/workflows/test-android-detox.yml diff --git a/.github/workflows/test-android-detox.yml b/.github/workflows/test-android-detox.yml new file mode 100644 index 00000000000..45dd57a6866 --- /dev/null +++ b/.github/workflows/test-android-detox.yml @@ -0,0 +1,96 @@ +name: Android E2E Tests + +on: [push, pull_request] + +jobs: + detox-e2e-tests: + runs-on: ubuntu-latest + + services: + xvfb: + image: circleci/xvfb:latest + options: --privileged + + steps: + + - name: Checkout + uses: actions/checkout@v1 + with: + fetch-depth: 1 + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Install Sharp CLI for faster image generation during prebuild + run: npm install --global sharp-cli + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm i + + - name: Set up JDK + uses: actions/setup-java@v2 + with: + distribution: 'zulu' + java-version: '11' + + - name: Create destination path + run: mkdir -p android/app/build/outputs/apk + - name: Download artifact + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + curl -L -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + --output android/app/build/outputs/apk/artifact.zip + - name: Unzip artifact + run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk + + - name: Cleanup + run: rm android/app/build/outputs/apk/artifact.zip + + - name: Download and set up Android SDK + uses: android-actions/setup-android@v2 + with: + api-level: 30 + target: default + arch: x86_64 + profile: default + emulator-build: system-images;android-30;default;x86_64 + + - name: Start Android Emulator + run: | + sudo $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window & + adb wait-for-device + adb shell input keyevent 82 + + - name: Run Android Detox E2E Tests on macOS + run: | + cd detox && npm run e2e:android-test -- about.e2e.ts + + - name: Upload Android Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-results-1 + path: detox/artifacts + + - name: capture + run: | + screencapture emulator-macos-13.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-capture-macos-13.png + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-macos-13.jpg + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-capture-macos-13.png + + - name: Stop Android Emulator + run: adb -s emulator-5554 emu kill From 55f485cf9b39364a6184c16cbf433eb806796f9f Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 30 Jul 2024 11:44:09 +0530 Subject: [PATCH 289/362] remove xvfb service --- .github/workflows/test-android-detox.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/test-android-detox.yml b/.github/workflows/test-android-detox.yml index 45dd57a6866..f5157f32c34 100644 --- a/.github/workflows/test-android-detox.yml +++ b/.github/workflows/test-android-detox.yml @@ -6,11 +6,6 @@ jobs: detox-e2e-tests: runs-on: ubuntu-latest - services: - xvfb: - image: circleci/xvfb:latest - options: --privileged - steps: - name: Checkout From ddd27c9a31ac2e22181e264024b4b73187123cd4 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 1 Aug 2024 14:54:41 +0530 Subject: [PATCH 290/362] try reactivecircus/android-emulator-runner@v2 --- .../workflows/e2e-detox-android-template.yml | 243 ++++++++++-------- 1 file changed, 131 insertions(+), 112 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 25bd65ca0d2..520a377b001 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -145,96 +145,96 @@ jobs: # name: android-build-apk-${{ github.run_id }} # path: "android/app/build/outputs/apk/**/app-*.apk" - # e2e-android-on-mac: - # name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} - # continue-on-error: true - # runs-on: macos-13 - # timeout-minutes: 40 - # needs: - # - generate-specs - # # - build-android-apk - # strategy: - # fail-fast: false - # matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} - # steps: - # - name: Checkout - # uses: actions/checkout@v1 - # with: - # fetch-depth: 1 - - # - name: ci/prepare-node-deps - # uses: ./.github/actions/prepare-node-deps - - # - name: Install Sharp CLI for faster image generation during prebuild - # run: npm install --global sharp-cli - - # - name: Start React Native Metro Server - # run: npm run start & - - # - name: Install Detox Dependencies - # run: cd detox && npm i - - # - name: Install Java - # uses: actions/setup-java@v4 - # with: - # java-version: "17" - # distribution: "adopt" - # cache: "gradle" - - # - name: Create destination path - # run: mkdir -p android/app/build/outputs/apk - - # - name: Download artifact - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # run: | - # curl -L -H "Authorization: token $GITHUB_TOKEN" \ - # -H "Accept: application/vnd.github.v3+json" \ - # https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - # --output android/app/build/outputs/apk/artifact.zip - - # - name: Unzip artifact - # run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk - - # - name: Cleanup - # run: rm android/app/build/outputs/apk/artifact.zip - - # - name: Launch Android Emulator - # run: | - # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' - # echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" - # echo "Emulator created successfully" - # nohup $ANDROID_HOME/emulator/emulator -avd android_emulator -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -qemu -m 4096 > /dev/null 2>&1 & - # $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\''\r'\'') ]]; do sleep 1; done' - # $ANDROID_HOME/platform-tools/adb devices - # $ANDROID_HOME/platform-tools/adb shell input keyevent 82 - # $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 - # $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 - # $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - # sleep 60 - # screencapture emulator-macos-13.jpg - # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-macos-13.png - - # - uses: actions/upload-artifact@v3 - # with: - # name: Android-Emulator-Screenshots - # path: emulator-macos-13.jpg + e2e-android-on-mac: + name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} + continue-on-error: true + runs-on: macos-13 + timeout-minutes: 40 + needs: + - generate-specs + # - build-android-apk + strategy: + fail-fast: false + matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} + steps: + - name: Checkout + uses: actions/checkout@v1 + with: + fetch-depth: 1 + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Install Sharp CLI for faster image generation during prebuild + run: npm install --global sharp-cli + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm i + + - name: Install Java + uses: actions/setup-java@v4 + with: + java-version: "17" + distribution: "adopt" + cache: "gradle" + + - name: Create destination path + run: mkdir -p android/app/build/outputs/apk + + - name: Download artifact + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + curl -L -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + --output android/app/build/outputs/apk/artifact.zip + + - name: Unzip artifact + run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk + + - name: Cleanup + run: rm android/app/build/outputs/apk/artifact.zip + + - name: Launch Android Emulator + run: | + echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' + echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" + echo "Emulator created successfully" + nohup $ANDROID_HOME/emulator/emulator -avd android_emulator -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -qemu -m 4096 > /dev/null 2>&1 & + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\''\r'\'') ]]; do sleep 1; done' + $ANDROID_HOME/platform-tools/adb devices + $ANDROID_HOME/platform-tools/adb shell input keyevent 82 + $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 + $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 + $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 + sleep 60 + screencapture emulator-macos-13.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-macos-13.png + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-macos-13.jpg - # - uses: actions/upload-artifact@v3 - # with: - # name: Android-Emulator-Screenshots - # path: emulator-macos-13.jpg.png - - # - name: Run Android Detox E2E Tests on macOS - # run: | - # cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - - # - name: Upload Android Test Report - # if: always() - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: android-results-${{ matrix.runId }} - # path: detox/artifacts + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-macos-13.jpg.png + + - name: Run Android Detox E2E Tests on macOS + run: | + cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + + - name: Upload Android Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-results-${{ matrix.runId }} + path: detox/artifacts test-snapshot: runs-on: macos-13 @@ -394,29 +394,48 @@ jobs: profile: default emulator-build: system-images;android-30;default;x86_64 - - name: Create AVD if it doesn't exist - run: | - if [ ! -f "$HOME/.android/avd/pixel_6.avd/config.ini" ]; then - echo "Checking for available system images..." - if $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --list | grep -q "system-images;android-30;google_apis;x86_64"; then - echo "Creating AVD..." - echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n pixel_6 -k 'system-images;android-30;google_apis;x86_64' --force --device "pixel_6" - else - echo "Error: Required system image not found." - exit 1 - fi - fi - - - name: Start Android Emulator - run: | - $ANDROID_HOME/emulator/emulator -avd pixel_6 -no-audio -no-window & - sleep 30 - adb wait-for-device - adb shell input keyevent 82 - - - name: Run Android Detox E2E Tests on macOS - run: | - cd detox && npm run e2e:android-test -- about.e2e.ts + - name: Create AVD and generate snapshot for caching + uses: reactivecircus/android-emulator-runner@v2 + with: + # Use the slimmer aosp_atd images for working + # around "System UI isn't responding" ANR + # (Application Not Responding) error + # + # https://android-developers.googleblog.com/2021/10/whats-new-in-scalable-automated-testing.html#:~:text=Slimmer%20Emulator%20System%20Images + # https://github.com/ReactiveCircus/android-emulator-runner/issues/129 + # https://github.com/upleveled/hotline-bling-codealong/pull/26#issuecomment-1094659722 + target: aosp_atd + api-level: 30 + arch: x86 + ram-size: 4096M + channel: canary + profile: pixel + avd-name: Pixel_3a_API_30_AOSP + force-avd-creation: false + emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + emulator-boot-timeout: 12000 + disable-animations: false + script: echo "Generated AVD snapshot for caching" + + - name: Start emulator and run Detox integration tests + uses: reactivecircus/android-emulator-runner@v2 + with: + target: aosp_atd + api-level: 30 + arch: x86 + ram-size: 4096M + channel: canary + profile: pixel + avd-name: Pixel_3a_API_30_AOSP + force-avd-creation: false + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + emulator-boot-timeout: 12000 + disable-animations: true + script: cd detox && npm run e2e:android-test -- about.e2e.ts + + # - name: Run Android Detox E2E Tests on macOS + # run: | + # cd detox && npm run e2e:android-test -- about.e2e.ts - name: Upload Android Test Report if: always() From a9d21c1f47a3491ea488291e2d5017d066ac3050 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 8 Aug 2024 16:47:08 +0530 Subject: [PATCH 291/362] add pixel_6 --- .../workflows/e2e-detox-android-template.yml | 402 +++++++++--------- 1 file changed, 201 insertions(+), 201 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 520a377b001..e12afd38504 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -202,9 +202,9 @@ jobs: - name: Launch Android Emulator run: | echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' - echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n android_emulator -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" + echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n pixel_6 -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" echo "Emulator created successfully" - nohup $ANDROID_HOME/emulator/emulator -avd android_emulator -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -qemu -m 4096 > /dev/null 2>&1 & + nohup $ANDROID_HOME/emulator/emulator -avd pixel_6 -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -qemu -m 4096 > /dev/null 2>&1 & $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\''\r'\'') ]]; do sleep 1; done' $ANDROID_HOME/platform-tools/adb devices $ANDROID_HOME/platform-tools/adb shell input keyevent 82 @@ -223,7 +223,7 @@ jobs: - uses: actions/upload-artifact@v3 with: name: Android-Emulator-Screenshots - path: emulator-macos-13.jpg.png + path: emulator-macos-13.png - name: Run Android Detox E2E Tests on macOS run: | @@ -236,230 +236,230 @@ jobs: name: android-results-${{ matrix.runId }} path: detox/artifacts - test-snapshot: - runs-on: macos-13 - continue-on-error: true - timeout-minutes: 40 - needs: - - generate-specs - steps: + # test-snapshot: + # runs-on: macos-13 + # continue-on-error: true + # timeout-minutes: 40 + # needs: + # - generate-specs + # steps: - - name: Debug info - run: | - echo "ANDROID_HOME: $ANDROID_HOME" - ls -R $ANDROID_HOME - ls -R ~/.android + # - name: Debug info + # run: | + # echo "ANDROID_HOME: $ANDROID_HOME" + # ls -R $ANDROID_HOME + # ls -R ~/.android - - name: Set up Android SDK and create AVD - run: | - echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-30;google_apis;x86_64' - echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n pixel_6 -k 'system-images;android-30;google_apis;x86_64' --force --device "pixel_6" + # - name: Set up Android SDK and create AVD + # run: | + # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-30;google_apis;x86_64' + # echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n pixel_6 -k 'system-images;android-30;google_apis;x86_64' --force --device "pixel_6" - - name: Configure AVD - run: | - echo "hw.ramSize=4096" >> ~/.android/avd/pixel_6.avd/config.ini - echo "hw.cpu.ncore=2" >> ~/.android/avd/pixel_6.avd/config.ini - echo "hw.gpu.enabled=true" >> ~/.android/avd/pixel_6.avd/config.ini + # - name: Configure AVD + # run: | + # echo "hw.ramSize=4096" >> ~/.android/avd/pixel_6.avd/config.ini + # echo "hw.cpu.ncore=2" >> ~/.android/avd/pixel_6.avd/config.ini + # echo "hw.gpu.enabled=true" >> ~/.android/avd/pixel_6.avd/config.ini - - name: Start Android Emulator - run: | - $ANDROID_HOME/emulator/emulator -avd pixel_6 -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim & - # Wait for the emulator to boot with a timeout - for i in {1..30}; do - if $ANDROID_HOME/platform-tools/adb shell getprop sys.boot_completed | grep -m 1 '1'; then - break - fi - echo "Waiting for emulator to boot..." - sleep 5 - done - - - name: Disable animations - run: | - $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 - $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 - $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 + # - name: Start Android Emulator + # run: | + # $ANDROID_HOME/emulator/emulator -avd pixel_6 -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim & + # # Wait for the emulator to boot with a timeout + # for i in {1..30}; do + # if $ANDROID_HOME/platform-tools/adb shell getprop sys.boot_completed | grep -m 1 '1'; then + # break + # fi + # echo "Waiting for emulator to boot..." + # sleep 5 + # done + + # - name: Disable animations + # run: | + # $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 + # $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 + # $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - - name: Checkout - uses: actions/checkout@v1 - with: - fetch-depth: 1 - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps + # - name: Checkout + # uses: actions/checkout@v1 + # with: + # fetch-depth: 1 + # - name: ci/prepare-node-deps + # uses: ./.github/actions/prepare-node-deps - - name: Install Sharp CLI for faster image generation during prebuild - run: npm install --global sharp-cli + # - name: Install Sharp CLI for faster image generation during prebuild + # run: npm install --global sharp-cli - - name: Start React Native Metro Server - run: npm run start & + # - name: Start React Native Metro Server + # run: npm run start & - - name: Install Detox Dependencies - run: cd detox && npm i + # - name: Install Detox Dependencies + # run: cd detox && npm i - - name: Install Java - uses: actions/setup-java@v4 - with: - java-version: "17" - distribution: "adopt" - cache: "gradle" + # - name: Install Java + # uses: actions/setup-java@v4 + # with: + # java-version: "17" + # distribution: "adopt" + # cache: "gradle" - - name: Create destination path - run: mkdir -p android/app/build/outputs/apk - - name: Download artifact - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - curl -L -H "Authorization: token $GITHUB_TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - --output android/app/build/outputs/apk/artifact.zip - - name: Unzip artifact - run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk - - name: Cleanup - run: rm android/app/build/outputs/apk/artifact.zip - - - name: Run Android Detox E2E Tests on macOS - run: | - cd detox && npm run e2e:android-test -- about.e2e.ts + # - name: Create destination path + # run: mkdir -p android/app/build/outputs/apk + # - name: Download artifact + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # run: | + # curl -L -H "Authorization: token $GITHUB_TOKEN" \ + # -H "Accept: application/vnd.github.v3+json" \ + # https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + # --output android/app/build/outputs/apk/artifact.zip + # - name: Unzip artifact + # run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk + # - name: Cleanup + # run: rm android/app/build/outputs/apk/artifact.zip + + # - name: Run Android Detox E2E Tests on macOS + # run: | + # cd detox && npm run e2e:android-test -- about.e2e.ts - - name: Upload Android Test Report - if: always() - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-results-1 - path: detox/artifacts + # - name: Upload Android Test Report + # if: always() + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-results-1 + # path: detox/artifacts - - name: capture - run: | - screencapture emulator-macos-13.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-capture-macos-13.png + # - name: capture + # run: | + # screencapture emulator-macos-13.jpg + # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-capture-macos-13.png - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-macos-13.jpg - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-capture-macos-13.png + # - uses: actions/upload-artifact@v3 + # with: + # name: Android-Emulator-Screenshots + # path: emulator-macos-13.jpg + # - uses: actions/upload-artifact@v3 + # with: + # name: Android-Emulator-Screenshots + # path: emulator-capture-macos-13.png - detox-e2e-tests: - runs-on: ubuntu-latest + # detox-e2e-tests: + # runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v1 - with: - fetch-depth: 1 + # steps: + # - name: Checkout + # uses: actions/checkout@v1 + # with: + # fetch-depth: 1 - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps + # - name: ci/prepare-node-deps + # uses: ./.github/actions/prepare-node-deps - - name: Install Sharp CLI for faster image generation during prebuild - run: npm install --global sharp-cli + # - name: Install Sharp CLI for faster image generation during prebuild + # run: npm install --global sharp-cli - - name: Start React Native Metro Server - run: npm run start & + # - name: Start React Native Metro Server + # run: npm run start & - - name: Install Detox Dependencies - run: cd detox && npm i + # - name: Install Detox Dependencies + # run: cd detox && npm i - - name: Set up JDK - uses: actions/setup-java@v2 - with: - distribution: 'zulu' - java-version: '11' + # - name: Set up JDK + # uses: actions/setup-java@v2 + # with: + # distribution: 'zulu' + # java-version: '11' - - name: Create destination path - run: mkdir -p android/app/build/outputs/apk - - name: Download artifact - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - curl -L -H "Authorization: token $GITHUB_TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - --output android/app/build/outputs/apk/artifact.zip - - name: Unzip artifact - run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk - - - name: Cleanup - run: rm android/app/build/outputs/apk/artifact.zip - - - name: Download and set up Android SDK - uses: android-actions/setup-android@v2 - with: - api-level: 30 - target: default - arch: x86_64 - profile: default - emulator-build: system-images;android-30;default;x86_64 - - - name: Create AVD and generate snapshot for caching - uses: reactivecircus/android-emulator-runner@v2 - with: - # Use the slimmer aosp_atd images for working - # around "System UI isn't responding" ANR - # (Application Not Responding) error - # - # https://android-developers.googleblog.com/2021/10/whats-new-in-scalable-automated-testing.html#:~:text=Slimmer%20Emulator%20System%20Images - # https://github.com/ReactiveCircus/android-emulator-runner/issues/129 - # https://github.com/upleveled/hotline-bling-codealong/pull/26#issuecomment-1094659722 - target: aosp_atd - api-level: 30 - arch: x86 - ram-size: 4096M - channel: canary - profile: pixel - avd-name: Pixel_3a_API_30_AOSP - force-avd-creation: false - emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - emulator-boot-timeout: 12000 - disable-animations: false - script: echo "Generated AVD snapshot for caching" - - - name: Start emulator and run Detox integration tests - uses: reactivecircus/android-emulator-runner@v2 - with: - target: aosp_atd - api-level: 30 - arch: x86 - ram-size: 4096M - channel: canary - profile: pixel - avd-name: Pixel_3a_API_30_AOSP - force-avd-creation: false - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - emulator-boot-timeout: 12000 - disable-animations: true - script: cd detox && npm run e2e:android-test -- about.e2e.ts + # - name: Create destination path + # run: mkdir -p android/app/build/outputs/apk + # - name: Download artifact + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # run: | + # curl -L -H "Authorization: token $GITHUB_TOKEN" \ + # -H "Accept: application/vnd.github.v3+json" \ + # https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + # --output android/app/build/outputs/apk/artifact.zip + # - name: Unzip artifact + # run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk + + # - name: Cleanup + # run: rm android/app/build/outputs/apk/artifact.zip + + # - name: Download and set up Android SDK + # uses: android-actions/setup-android@v2 + # with: + # api-level: 30 + # target: default + # arch: x86_64 + # profile: default + # emulator-build: system-images;android-30;default;x86_64 + + # - name: Create AVD and generate snapshot for caching + # uses: reactivecircus/android-emulator-runner@v2 + # with: + # # Use the slimmer aosp_atd images for working + # # around "System UI isn't responding" ANR + # # (Application Not Responding) error + # # + # # https://android-developers.googleblog.com/2021/10/whats-new-in-scalable-automated-testing.html#:~:text=Slimmer%20Emulator%20System%20Images + # # https://github.com/ReactiveCircus/android-emulator-runner/issues/129 + # # https://github.com/upleveled/hotline-bling-codealong/pull/26#issuecomment-1094659722 + # target: aosp_atd + # api-level: 30 + # arch: x86 + # ram-size: 4096M + # channel: canary + # profile: pixel + # avd-name: Pixel_3a_API_30_AOSP + # force-avd-creation: false + # emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + # emulator-boot-timeout: 12000 + # disable-animations: false + # script: echo "Generated AVD snapshot for caching" + + # - name: Start emulator and run Detox integration tests + # uses: reactivecircus/android-emulator-runner@v2 + # with: + # target: aosp_atd + # api-level: 30 + # arch: x86 + # ram-size: 4096M + # channel: canary + # profile: pixel + # avd-name: Pixel_3a_API_30_AOSP + # force-avd-creation: false + # emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + # emulator-boot-timeout: 12000 + # disable-animations: true + # script: cd detox && npm run e2e:android-test -- about.e2e.ts - # - name: Run Android Detox E2E Tests on macOS - # run: | - # cd detox && npm run e2e:android-test -- about.e2e.ts + # # - name: Run Android Detox E2E Tests on macOS + # # run: | + # # cd detox && npm run e2e:android-test -- about.e2e.ts - - name: Upload Android Test Report - if: always() - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-results-1 - path: detox/artifacts + # - name: Upload Android Test Report + # if: always() + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-results-1 + # path: detox/artifacts - - name: capture - run: | - screencapture emulator-macos-13.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-capture-macos-13.png + # - name: capture + # run: | + # screencapture emulator-macos-13.jpg + # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-capture-macos-13.png - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-macos-13.jpg - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-capture-macos-13.png + # - uses: actions/upload-artifact@v3 + # with: + # name: Android-Emulator-Screenshots + # path: emulator-macos-13.jpg + # - uses: actions/upload-artifact@v3 + # with: + # name: Android-Emulator-Screenshots + # path: emulator-capture-macos-13.png - - name: Stop Android Emulator - run: adb -s emulator-5554 emu kill + # - name: Stop Android Emulator + # run: adb -s emulator-5554 emu kill # download-e2e-results: # runs-on: ubuntu-22.04 From 6d47ff2d517455185155fc7ef93f457d7aaaf4af Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 26 Aug 2024 17:36:52 +0530 Subject: [PATCH 292/362] test headless --- .github/workflows/e2e-detox-android-template.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index e12afd38504..2ce4635a1cd 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -204,14 +204,16 @@ jobs: echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n pixel_6 -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" echo "Emulator created successfully" - nohup $ANDROID_HOME/emulator/emulator -avd pixel_6 -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -qemu -m 4096 > /dev/null 2>&1 & + # nohup $ANDROID_HOME/emulator/emulator -avd pixel_6 -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -qemu -m 8192 > /dev/null 2>&1 & + nohup $ANDROID_HOME/emulator/emulator -avd pixel_6 -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -no-window -qemu -m 8192 > /dev/null 2>&1 & + $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\''\r'\'') ]]; do sleep 1; done' $ANDROID_HOME/platform-tools/adb devices $ANDROID_HOME/platform-tools/adb shell input keyevent 82 $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - sleep 60 + sleep 90 screencapture emulator-macos-13.jpg $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-macos-13.png @@ -227,6 +229,7 @@ jobs: - name: Run Android Detox E2E Tests on macOS run: | + adb shell am start -W -n com.mattermost.rnbeta/com.mattermost.rnbeta.MainActivity cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - name: Upload Android Test Report From 9427842b4d5280b4595492672b9c8967579d9f5e Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 26 Aug 2024 18:06:22 +0530 Subject: [PATCH 293/362] test headless test -1 --- .github/workflows/e2e-detox-android-template.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 2ce4635a1cd..a4b7911efd4 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -229,7 +229,6 @@ jobs: - name: Run Android Detox E2E Tests on macOS run: | - adb shell am start -W -n com.mattermost.rnbeta/com.mattermost.rnbeta.MainActivity cd detox && npm run e2e:android-test -- ${{ matrix.specs }} - name: Upload Android Test Report From 66fbf4b83dcb496a14ff4402c405217c1f9ddd15 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 26 Aug 2024 19:12:24 +0530 Subject: [PATCH 294/362] test avd creation --- .github/workflows/test-android-detox.yml | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test-android-detox.yml b/.github/workflows/test-android-detox.yml index f5157f32c34..2bc9ca03f9a 100644 --- a/.github/workflows/test-android-detox.yml +++ b/.github/workflows/test-android-detox.yml @@ -50,17 +50,28 @@ jobs: - name: Download and set up Android SDK uses: android-actions/setup-android@v2 with: - api-level: 30 + api-level: 31 target: default arch: x86_64 profile: default - emulator-build: system-images;android-30;default;x86_64 + emulator-build: system-images;android-31;default;x86_64 + + - name: Accept Android SDK Licenses + run: yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses + + - name: Install Android Emulator + run: | + sdkmanager "system-images;android-31;google_apis;x86_64" + avdmanager create avd -n pixel_6 -k "system-images;android-31;google_apis;x86_64" -d "pixel" --force - name: Start Android Emulator run: | - sudo $ANDROID_HOME/emulator/emulator -avd test -no-audio -no-window & - adb wait-for-device - adb shell input keyevent 82 + nohup $ANDROID_SDK_ROOT/emulator/emulator -avd pixel_6 -no-snapshot -no-window -no-audio -gpu swiftshader_indirect -netdelay none -netspeed full -qemu -m 8192 > /dev/null 2>&1 & + $ANDROID_SDK_ROOT/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d "\r") ]]; do sleep 1; done' + $ANDROID_SDK_ROOT/platform-tools/adb shell settings put global window_animation_scale 0 + $ANDROID_SDK_ROOT/platform-tools/adb shell settings put global transition_animation_scale 0 + $ANDROID_SDK_ROOT/platform-tools/adb shell settings put global animator_duration_scale 0 + sleep 60 - name: Run Android Detox E2E Tests on macOS run: | From 076fac637f7933d5b696d5c0eec84ca56a705be3 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 27 Aug 2024 23:12:34 +0530 Subject: [PATCH 295/362] test apk install --- .../workflows/e2e-detox-android-template.yml | 8 +- .github/workflows/test-android-detox.yml | 113 +++++++++++++++++- 2 files changed, 117 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index a4b7911efd4..83b79149054 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -204,19 +204,23 @@ jobs: echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n pixel_6 -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" echo "Emulator created successfully" - # nohup $ANDROID_HOME/emulator/emulator -avd pixel_6 -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -qemu -m 8192 > /dev/null 2>&1 & nohup $ANDROID_HOME/emulator/emulator -avd pixel_6 -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -no-window -qemu -m 8192 > /dev/null 2>&1 & $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\''\r'\'') ]]; do sleep 1; done' + echo "Devices list" $ANDROID_HOME/platform-tools/adb devices $ANDROID_HOME/platform-tools/adb shell input keyevent 82 $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - sleep 90 + sleep 120 + echo "Taking screenshot" + screencapture emulator-macos-13.jpg $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-macos-13.png + echo "Done launching screenshot" + - uses: actions/upload-artifact@v3 with: name: Android-Emulator-Screenshots diff --git a/.github/workflows/test-android-detox.yml b/.github/workflows/test-android-detox.yml index 2bc9ca03f9a..29cfd8dbe7b 100644 --- a/.github/workflows/test-android-detox.yml +++ b/.github/workflows/test-android-detox.yml @@ -3,7 +3,7 @@ name: Android E2E Tests on: [push, pull_request] jobs: - detox-e2e-tests: + detox-e2e-tests-ubuntu-latest: runs-on: ubuntu-latest steps: @@ -66,13 +66,122 @@ jobs: - name: Start Android Emulator run: | - nohup $ANDROID_SDK_ROOT/emulator/emulator -avd pixel_6 -no-snapshot -no-window -no-audio -gpu swiftshader_indirect -netdelay none -netspeed full -qemu -m 8192 > /dev/null 2>&1 & + nohup $ANDROID_SDK_ROOT/emulator/emulator -avd pixel_6 -no-snapshot -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -netdelay none -netspeed full -qemu -m 8192 > emulator.log 2>&1 & + $ANDROID_SDK_ROOT/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d "\r") ]]; do sleep 1; done' + $ANDROID_SDK_ROOT/platform-tools/adb shell settings put global window_animation_scale 0 + $ANDROID_SDK_ROOT/platform-tools/adb shell settings put global transition_animation_scale 0 + $ANDROID_SDK_ROOT/platform-tools/adb shell settings put global animator_duration_scale 0 + sleep 120 + + - name: Install APK on Emulator + run: | + $ANDROID_SDK_ROOT/platform-tools/adb install android/app/build/outputs/apk/app-release.apk + + - name: Run Android Detox E2E Tests on macOS + run: | + cd detox && npm run e2e:android-test -- about.e2e.ts + + - name: Upload Android Test Report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-results-1 + path: detox/artifacts + + - name: capture + run: | + screencapture emulator-macos-13.jpg + $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-capture-macos-13.png + + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-macos-13.jpg + - uses: actions/upload-artifact@v3 + with: + name: Android-Emulator-Screenshots + path: emulator-capture-macos-13.png + + - name: Stop Android Emulator + run: adb -s emulator-5554 emu kill + + detox-e2e-tests-macos-latest: + runs-on: macos-latest + env: + AVD_NAME: detox_pixel_4_xl_api_31 + NODE_OPTIONS: --max_old_space_size=8192 + + steps: + + - name: Checkout + uses: actions/checkout@v1 + with: + fetch-depth: 1 + + - name: ci/prepare-node-deps + uses: ./.github/actions/prepare-node-deps + + - name: Install Sharp CLI for faster image generation during prebuild + run: npm install --global sharp-cli + + - name: Start React Native Metro Server + run: npm run start & + + - name: Install Detox Dependencies + run: cd detox && npm i + + - name: Set up JDK + uses: actions/setup-java@v2 + with: + distribution: 'zulu' + java-version: '11' + + - name: Create destination path + run: mkdir -p android/app/build/outputs/apk + + - name: Download artifact + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + curl -L -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + --output android/app/build/outputs/apk/artifact.zip + + - name: Unzip artifact + run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk + + - name: Cleanup + run: rm android/app/build/outputs/apk/artifact.zip + + - name: Set up Android SDK + uses: android-actions/setup-android@v2 + with: + api-level: 31 + target: default + arch: x86_64 + + - name: Accept Android SDK Licenses + run: yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses + + - name: Install Android Emulator + run: | + sdkmanager "system-images;android-31;google_apis;x86_64" + avdmanager create avd -n $AVD_NAME -k "system-images;android-31;google_apis;x86_64" -d "pixel" --force + + - name: Start Android Emulator + run: | + nohup $ANDROID_SDK_ROOT/emulator/emulator -avd $AVD_NAME -no-snapshot -no-window -no-audio -gpu swiftshader_indirect -netdelay none -netspeed full -qemu -m 8192 > /dev/null 2>&1 & $ANDROID_SDK_ROOT/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d "\r") ]]; do sleep 1; done' $ANDROID_SDK_ROOT/platform-tools/adb shell settings put global window_animation_scale 0 $ANDROID_SDK_ROOT/platform-tools/adb shell settings put global transition_animation_scale 0 $ANDROID_SDK_ROOT/platform-tools/adb shell settings put global animator_duration_scale 0 sleep 60 + - name: Install APK on Emulator + run: | + $ANDROID_SDK_ROOT/platform-tools/adb install android/app/build/outputs/apk/app-release.apk + - name: Run Android Detox E2E Tests on macOS run: | cd detox && npm run e2e:android-test -- about.e2e.ts From 56bcf01aa2f636ba9f45176383a4846d3c2d8046 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 28 Aug 2024 00:12:52 +0530 Subject: [PATCH 296/362] create AVD from script --- .github/workflows/test-android-detox.yml | 136 +---------------------- detox/.detoxrc.json | 4 +- 2 files changed, 6 insertions(+), 134 deletions(-) diff --git a/.github/workflows/test-android-detox.yml b/.github/workflows/test-android-detox.yml index 29cfd8dbe7b..8c51f3b06cf 100644 --- a/.github/workflows/test-android-detox.yml +++ b/.github/workflows/test-android-detox.yml @@ -6,111 +6,6 @@ jobs: detox-e2e-tests-ubuntu-latest: runs-on: ubuntu-latest - steps: - - - name: Checkout - uses: actions/checkout@v1 - with: - fetch-depth: 1 - - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps - - - name: Install Sharp CLI for faster image generation during prebuild - run: npm install --global sharp-cli - - - name: Start React Native Metro Server - run: npm run start & - - - name: Install Detox Dependencies - run: cd detox && npm i - - - name: Set up JDK - uses: actions/setup-java@v2 - with: - distribution: 'zulu' - java-version: '11' - - - name: Create destination path - run: mkdir -p android/app/build/outputs/apk - - name: Download artifact - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - curl -L -H "Authorization: token $GITHUB_TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - --output android/app/build/outputs/apk/artifact.zip - - name: Unzip artifact - run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk - - - name: Cleanup - run: rm android/app/build/outputs/apk/artifact.zip - - - name: Download and set up Android SDK - uses: android-actions/setup-android@v2 - with: - api-level: 31 - target: default - arch: x86_64 - profile: default - emulator-build: system-images;android-31;default;x86_64 - - - name: Accept Android SDK Licenses - run: yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses - - - name: Install Android Emulator - run: | - sdkmanager "system-images;android-31;google_apis;x86_64" - avdmanager create avd -n pixel_6 -k "system-images;android-31;google_apis;x86_64" -d "pixel" --force - - - name: Start Android Emulator - run: | - nohup $ANDROID_SDK_ROOT/emulator/emulator -avd pixel_6 -no-snapshot -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -netdelay none -netspeed full -qemu -m 8192 > emulator.log 2>&1 & - $ANDROID_SDK_ROOT/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d "\r") ]]; do sleep 1; done' - $ANDROID_SDK_ROOT/platform-tools/adb shell settings put global window_animation_scale 0 - $ANDROID_SDK_ROOT/platform-tools/adb shell settings put global transition_animation_scale 0 - $ANDROID_SDK_ROOT/platform-tools/adb shell settings put global animator_duration_scale 0 - sleep 120 - - - name: Install APK on Emulator - run: | - $ANDROID_SDK_ROOT/platform-tools/adb install android/app/build/outputs/apk/app-release.apk - - - name: Run Android Detox E2E Tests on macOS - run: | - cd detox && npm run e2e:android-test -- about.e2e.ts - - - name: Upload Android Test Report - if: always() - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-results-1 - path: detox/artifacts - - - name: capture - run: | - screencapture emulator-macos-13.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-capture-macos-13.png - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-macos-13.jpg - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-capture-macos-13.png - - - name: Stop Android Emulator - run: adb -s emulator-5554 emu kill - - detox-e2e-tests-macos-latest: - runs-on: macos-latest - env: - AVD_NAME: detox_pixel_4_xl_api_31 - NODE_OPTIONS: --max_old_space_size=8192 - steps: - name: Checkout @@ -154,34 +49,11 @@ jobs: - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip - - name: Set up Android SDK - uses: android-actions/setup-android@v2 - with: - api-level: 31 - target: default - arch: x86_64 - - - name: Accept Android SDK Licenses - run: yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses - - - name: Install Android Emulator - run: | - sdkmanager "system-images;android-31;google_apis;x86_64" - avdmanager create avd -n $AVD_NAME -k "system-images;android-31;google_apis;x86_64" -d "pixel" --force + - name: Create AVD + run : | + cd detox + npm run e2e:android-create-emulator - - name: Start Android Emulator - run: | - nohup $ANDROID_SDK_ROOT/emulator/emulator -avd $AVD_NAME -no-snapshot -no-window -no-audio -gpu swiftshader_indirect -netdelay none -netspeed full -qemu -m 8192 > /dev/null 2>&1 & - $ANDROID_SDK_ROOT/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d "\r") ]]; do sleep 1; done' - $ANDROID_SDK_ROOT/platform-tools/adb shell settings put global window_animation_scale 0 - $ANDROID_SDK_ROOT/platform-tools/adb shell settings put global transition_animation_scale 0 - $ANDROID_SDK_ROOT/platform-tools/adb shell settings put global animator_duration_scale 0 - sleep 60 - - - name: Install APK on Emulator - run: | - $ANDROID_SDK_ROOT/platform-tools/adb install android/app/build/outputs/apk/app-release.apk - - name: Run Android Detox E2E Tests on macOS run: | cd detox && npm run e2e:android-test -- about.e2e.ts diff --git a/detox/.detoxrc.json b/detox/.detoxrc.json index 8b308ea063f..f56c6bed455 100644 --- a/detox/.detoxrc.json +++ b/detox/.detoxrc.json @@ -37,8 +37,8 @@ "android": { "type": "android.emulator", "device": { - "avdName": "pixel_6", - "api": "30" + "avdName": "detox_pixel_4_xl_api_31", + "api": "31" } } }, From 5bfd4266c0485ce987c7d84d2bf52b83b5ff5a27 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 28 Aug 2024 00:28:57 +0530 Subject: [PATCH 297/362] create AVD from script --- .github/workflows/test-android-detox.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/test-android-detox.yml b/.github/workflows/test-android-detox.yml index 8c51f3b06cf..145ab650183 100644 --- a/.github/workflows/test-android-detox.yml +++ b/.github/workflows/test-android-detox.yml @@ -49,6 +49,16 @@ jobs: - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip + - name: Set up Android SDK + uses: android-actions/setup-android@v2 + with: + api-level: 31 + target: default + arch: x86_64 + + - name: Accept Android SDK Licenses + run: yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses + - name: Create AVD run : | cd detox From 3b7cfe985ede4bff8181b89bf2b951ed3df800a0 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 28 Aug 2024 00:33:20 +0530 Subject: [PATCH 298/362] create AVD from script --- .github/workflows/test-android-detox.yml | 7 +++ detox/create_android_emulator.sh | 58 ++++++++++++++---------- 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/.github/workflows/test-android-detox.yml b/.github/workflows/test-android-detox.yml index 145ab650183..ef77f79f893 100644 --- a/.github/workflows/test-android-detox.yml +++ b/.github/workflows/test-android-detox.yml @@ -59,6 +59,13 @@ jobs: - name: Accept Android SDK Licenses run: yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses + - name: Install SDK Tools + run: | + yes | sdkmanager --install "emulator" "platform-tools" "platforms;android-31" "system-images;android-31;default;x86_64" "build-tools;31.0.0" + + - name: Set up Android SDK path + run: echo "$ANDROID_HOME/emulator:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin:$PATH" >> $GITHUB_PATH + - name: Create AVD run : | cd detox diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 18ef420e420..30563c56b27 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -10,30 +10,40 @@ set -o pipefail SDK_VERSION=31 NAME="detox_pixel_4_xl_api_${SDK_VERSION}" +# Check if the AVD already exists if emulator -list-avds | grep -q $NAME; then - echo "'${NAME}' Android virtual device already exists." + echo "'${NAME}' Android virtual device already exists. Deleting it now..." + avdmanager delete avd -n $NAME + echo "'${NAME}' has been deleted." +fi + +# Define the correct CPU architecture and system image path +CPU_ARCH_FAMILY='' +CPU_ARCH='' +if [[ $(uname -p) == 'arm' ]]; then + CPU_ARCH_FAMILY=arm64-v8a + CPU_ARCH=arm64 else - CPU_ARCH_FAMILY='' - CPU_ARCH='' - if [[ $(uname -p) == 'arm' ]]; then - CPU_ARCH_FAMILY=arm64-v8a - CPU_ARCH=arm64 - else - CPU_ARCH_FAMILY=x86_64 - CPU_ARCH=x86_64 - fi - - # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder - avdmanager create avd -n $NAME -k "system-images;android-${SDK_VERSION};default;${CPU_ARCH_FAMILY}" -p $NAME -d 'pixel' - - # Copy predefined config and skin - cp -r android_emulator/ $NAME/ - sed -i -e "s|AvdId = change_avd_id|AvdId = ${NAME}|g" $NAME/config.ini - sed -i -e "s|avd.ini.displayname = change_avd_displayname|avd.ini.displayname = Detox Pixel 4 XL API ${SDK_VERSION}|g" $NAME/config.ini - sed -i -e "s|abi.type = change_type|abi.type = ${CPU_ARCH_FAMILY}|g" $NAME/config.ini - sed -i -e "s|hw.cpu.arch = change_cpu_arch|hw.cpu.arch = ${CPU_ARCH}|g" $NAME/config.ini - sed -i -e "s|image.sysdir.1 = change_to_image_sysdir/|image.sysdir.1 = system-images/android-${SDK_VERSION}/default/${CPU_ARCH_FAMILY}/|g" $NAME/config.ini - sed -i -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = $(pwd)/${NAME}/pixel_4_xl_skin|g" $NAME/config.ini - - echo "Android virtual device successfully created: ${NAME}" + CPU_ARCH_FAMILY=x86_64 + CPU_ARCH=x86_64 fi +SYSTEM_IMAGE="system-images;android-${SDK_VERSION};google_apis;${CPU_ARCH_FAMILY}" + +# Install the system image if it's not already installed +sdkmanager --install "$SYSTEM_IMAGE" + +# Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder +avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel' + +# Copy predefined config and skin +mkdir -p android_emulator/ + +cp -r android_emulator/ $NAME/ +sed -i -e "s|AvdId = change_avd_id|AvdId = ${NAME}|g" $NAME/config.ini +sed -i -e "s|avd.ini.displayname = change_avd_displayname|avd.ini.displayname = Detox Pixel 4 XL API ${SDK_VERSION}|g" $NAME/config.ini +sed -i -e "s|abi.type = change_type|abi.type = ${CPU_ARCH_FAMILY}|g" $NAME/config.ini +sed -i -e "s|hw.cpu.arch = change_cpu_arch|hw.cpu.arch = ${CPU_ARCH}|g" $NAME/config.ini +sed -i -e "s|image.sysdir.1 = change_to_image_sysdir/|image.sysdir.1 = system-images/android-${SDK_VERSION}/google_apis/${CPU_ARCH_FAMILY}/|g" $NAME/config.ini +sed -i -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = $(pwd)/${NAME}/pixel_4_xl_skin|g" $NAME/config.ini + +echo "Android virtual device successfully created: ${NAME}" From 775d02e152b6da83d111073fe3fbe04217c59648 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 28 Aug 2024 00:42:18 +0530 Subject: [PATCH 299/362] macos 14 --- .github/workflows/test-android-detox.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-android-detox.yml b/.github/workflows/test-android-detox.yml index ef77f79f893..38258c62619 100644 --- a/.github/workflows/test-android-detox.yml +++ b/.github/workflows/test-android-detox.yml @@ -4,7 +4,7 @@ on: [push, pull_request] jobs: detox-e2e-tests-ubuntu-latest: - runs-on: ubuntu-latest + runs-on: macos-14 steps: From 456f05b2e4d69f7e49e3dfa0fa08168014571fac Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Wed, 28 Aug 2024 00:48:15 +0530 Subject: [PATCH 300/362] delete test workflow --- .../workflows/e2e-detox-android-template.yml | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 83b79149054..29e8ca515fc 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -201,23 +201,23 @@ jobs: - name: Launch Android Emulator run: | - echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' - echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n pixel_6 -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" - echo "Emulator created successfully" - nohup $ANDROID_HOME/emulator/emulator -avd pixel_6 -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -no-window -qemu -m 8192 > /dev/null 2>&1 & + # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' + # echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n pixel_6 -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" + # echo "Emulator created successfully" + # nohup $ANDROID_HOME/emulator/emulator -avd pixel_6 -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -no-window -qemu -m 8192 > /dev/null 2>&1 & - $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\''\r'\'') ]]; do sleep 1; done' + # $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\''\r'\'') ]]; do sleep 1; done' echo "Devices list" - $ANDROID_HOME/platform-tools/adb devices - $ANDROID_HOME/platform-tools/adb shell input keyevent 82 - $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 - $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 - $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - sleep 120 + # $ANDROID_HOME/platform-tools/adb devices + # $ANDROID_HOME/platform-tools/adb shell input keyevent 82 + # $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 + # $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 + # $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 + # sleep 120 echo "Taking screenshot" - screencapture emulator-macos-13.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-macos-13.png + # screencapture emulator-macos-13.jpg + # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-macos-13.png echo "Done launching screenshot" @@ -231,6 +231,11 @@ jobs: name: Android-Emulator-Screenshots path: emulator-macos-13.png + - name: Create AVD + run : | + cd detox + npm run e2e:android-create-emulator + - name: Run Android Detox E2E Tests on macOS run: | cd detox && npm run e2e:android-test -- ${{ matrix.specs }} From c4aa79d82d7f6ae1f37b1340b9231281470be535 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 5 Sep 2024 15:31:04 +0530 Subject: [PATCH 301/362] use ASOP --- .../workflows/e2e-detox-android-template.yml | 257 ------------------ detox/e2e/support/ui/screen/server.ts | 2 +- 2 files changed, 1 insertion(+), 258 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 29e8ca515fc..9eb73e65bff 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -199,38 +199,6 @@ jobs: - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip - - name: Launch Android Emulator - run: | - # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-31;google_apis;x86_64' - # echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n pixel_6 -k 'system-images;android-31;google_apis;x86_64' --force --device "pixel_6" - # echo "Emulator created successfully" - # nohup $ANDROID_HOME/emulator/emulator -avd pixel_6 -no-snapshot -netdelay none -netspeed full -no-audio -no-boot-anim -accel on -gpu swiftshader_indirect -no-window -qemu -m 8192 > /dev/null 2>&1 & - - # $ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\''\r'\'') ]]; do sleep 1; done' - echo "Devices list" - # $ANDROID_HOME/platform-tools/adb devices - # $ANDROID_HOME/platform-tools/adb shell input keyevent 82 - # $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 - # $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 - # $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - # sleep 120 - echo "Taking screenshot" - - # screencapture emulator-macos-13.jpg - # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-macos-13.png - - echo "Done launching screenshot" - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-macos-13.jpg - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-macos-13.png - - name: Create AVD run : | cd detox @@ -247,231 +215,6 @@ jobs: name: android-results-${{ matrix.runId }} path: detox/artifacts - # test-snapshot: - # runs-on: macos-13 - # continue-on-error: true - # timeout-minutes: 40 - # needs: - # - generate-specs - # steps: - - # - name: Debug info - # run: | - # echo "ANDROID_HOME: $ANDROID_HOME" - # ls -R $ANDROID_HOME - # ls -R ~/.android - - # - name: Set up Android SDK and create AVD - # run: | - # echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install 'system-images;android-30;google_apis;x86_64' - # echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n pixel_6 -k 'system-images;android-30;google_apis;x86_64' --force --device "pixel_6" - - # - name: Configure AVD - # run: | - # echo "hw.ramSize=4096" >> ~/.android/avd/pixel_6.avd/config.ini - # echo "hw.cpu.ncore=2" >> ~/.android/avd/pixel_6.avd/config.ini - # echo "hw.gpu.enabled=true" >> ~/.android/avd/pixel_6.avd/config.ini - - # - name: Start Android Emulator - # run: | - # $ANDROID_HOME/emulator/emulator -avd pixel_6 -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim & - # # Wait for the emulator to boot with a timeout - # for i in {1..30}; do - # if $ANDROID_HOME/platform-tools/adb shell getprop sys.boot_completed | grep -m 1 '1'; then - # break - # fi - # echo "Waiting for emulator to boot..." - # sleep 5 - # done - - # - name: Disable animations - # run: | - # $ANDROID_HOME/platform-tools/adb shell settings put global window_animation_scale 0 - # $ANDROID_HOME/platform-tools/adb shell settings put global transition_animation_scale 0 - # $ANDROID_HOME/platform-tools/adb shell settings put global animator_duration_scale 0 - - # - name: Checkout - # uses: actions/checkout@v1 - # with: - # fetch-depth: 1 - # - name: ci/prepare-node-deps - # uses: ./.github/actions/prepare-node-deps - - # - name: Install Sharp CLI for faster image generation during prebuild - # run: npm install --global sharp-cli - - # - name: Start React Native Metro Server - # run: npm run start & - - # - name: Install Detox Dependencies - # run: cd detox && npm i - - # - name: Install Java - # uses: actions/setup-java@v4 - # with: - # java-version: "17" - # distribution: "adopt" - # cache: "gradle" - - # - name: Create destination path - # run: mkdir -p android/app/build/outputs/apk - # - name: Download artifact - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # run: | - # curl -L -H "Authorization: token $GITHUB_TOKEN" \ - # -H "Accept: application/vnd.github.v3+json" \ - # https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - # --output android/app/build/outputs/apk/artifact.zip - # - name: Unzip artifact - # run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk - # - name: Cleanup - # run: rm android/app/build/outputs/apk/artifact.zip - - # - name: Run Android Detox E2E Tests on macOS - # run: | - # cd detox && npm run e2e:android-test -- about.e2e.ts - - # - name: Upload Android Test Report - # if: always() - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: android-results-1 - # path: detox/artifacts - - # - name: capture - # run: | - # screencapture emulator-macos-13.jpg - # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-capture-macos-13.png - - # - uses: actions/upload-artifact@v3 - # with: - # name: Android-Emulator-Screenshots - # path: emulator-macos-13.jpg - # - uses: actions/upload-artifact@v3 - # with: - # name: Android-Emulator-Screenshots - # path: emulator-capture-macos-13.png - - # detox-e2e-tests: - # runs-on: ubuntu-latest - - # steps: - # - name: Checkout - # uses: actions/checkout@v1 - # with: - # fetch-depth: 1 - - # - name: ci/prepare-node-deps - # uses: ./.github/actions/prepare-node-deps - - # - name: Install Sharp CLI for faster image generation during prebuild - # run: npm install --global sharp-cli - - # - name: Start React Native Metro Server - # run: npm run start & - - # - name: Install Detox Dependencies - # run: cd detox && npm i - - # - name: Set up JDK - # uses: actions/setup-java@v2 - # with: - # distribution: 'zulu' - # java-version: '11' - - # - name: Create destination path - # run: mkdir -p android/app/build/outputs/apk - # - name: Download artifact - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # run: | - # curl -L -H "Authorization: token $GITHUB_TOKEN" \ - # -H "Accept: application/vnd.github.v3+json" \ - # https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - # --output android/app/build/outputs/apk/artifact.zip - # - name: Unzip artifact - # run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk - - # - name: Cleanup - # run: rm android/app/build/outputs/apk/artifact.zip - - # - name: Download and set up Android SDK - # uses: android-actions/setup-android@v2 - # with: - # api-level: 30 - # target: default - # arch: x86_64 - # profile: default - # emulator-build: system-images;android-30;default;x86_64 - - # - name: Create AVD and generate snapshot for caching - # uses: reactivecircus/android-emulator-runner@v2 - # with: - # # Use the slimmer aosp_atd images for working - # # around "System UI isn't responding" ANR - # # (Application Not Responding) error - # # - # # https://android-developers.googleblog.com/2021/10/whats-new-in-scalable-automated-testing.html#:~:text=Slimmer%20Emulator%20System%20Images - # # https://github.com/ReactiveCircus/android-emulator-runner/issues/129 - # # https://github.com/upleveled/hotline-bling-codealong/pull/26#issuecomment-1094659722 - # target: aosp_atd - # api-level: 30 - # arch: x86 - # ram-size: 4096M - # channel: canary - # profile: pixel - # avd-name: Pixel_3a_API_30_AOSP - # force-avd-creation: false - # emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - # emulator-boot-timeout: 12000 - # disable-animations: false - # script: echo "Generated AVD snapshot for caching" - - # - name: Start emulator and run Detox integration tests - # uses: reactivecircus/android-emulator-runner@v2 - # with: - # target: aosp_atd - # api-level: 30 - # arch: x86 - # ram-size: 4096M - # channel: canary - # profile: pixel - # avd-name: Pixel_3a_API_30_AOSP - # force-avd-creation: false - # emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - # emulator-boot-timeout: 12000 - # disable-animations: true - # script: cd detox && npm run e2e:android-test -- about.e2e.ts - - # # - name: Run Android Detox E2E Tests on macOS - # # run: | - # # cd detox && npm run e2e:android-test -- about.e2e.ts - - # - name: Upload Android Test Report - # if: always() - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: android-results-1 - # path: detox/artifacts - - # - name: capture - # run: | - # screencapture emulator-macos-13.jpg - # $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-capture-macos-13.png - - # - uses: actions/upload-artifact@v3 - # with: - # name: Android-Emulator-Screenshots - # path: emulator-macos-13.jpg - # - uses: actions/upload-artifact@v3 - # with: - # name: Android-Emulator-Screenshots - # path: emulator-capture-macos-13.png - - # - name: Stop Android Emulator - # run: adb -s emulator-5554 emu kill - # download-e2e-results: # runs-on: ubuntu-22.04 # needs: diff --git a/detox/e2e/support/ui/screen/server.ts b/detox/e2e/support/ui/screen/server.ts index 71e5f9cd74a..c3dc0067067 100644 --- a/detox/e2e/support/ui/screen/server.ts +++ b/detox/e2e/support/ui/screen/server.ts @@ -67,7 +67,7 @@ class ServerScreen { } } } - await waitFor(this.usernameInput).toExist().withTimeout(timeouts.ONE_SEC); + await waitFor(this.usernameInput).toExist().withTimeout(timeouts.TEN_SEC); }; close = async () => { From 941530c4908409061ffddda8fd152ea49a2f5fc5 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 5 Sep 2024 16:01:32 +0530 Subject: [PATCH 302/362] Build apk --- .../workflows/e2e-detox-android-template.yml | 110 +++++++++--------- .github/workflows/test-android-detox.yml | 100 ---------------- 2 files changed, 58 insertions(+), 152 deletions(-) delete mode 100644 .github/workflows/test-android-detox.yml diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 9eb73e65bff..d5565c987fd 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -95,55 +95,55 @@ jobs: device_name: ${{ env.DEVICE_NAME }} device_os_version: ${{env.DEVICE_OS_VERSION}} - # build-android-apk: - # needs: update-initial-status - # runs-on: macos-14-large - # env: - # ORG_GRADLE_PROJECT_jvmargs: -Xmx8g - # steps: - # - name: ci/checkout-repo - # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - # with: - # ref: ${{ github.event.pull_request.head.sha }} + build-android-apk: + needs: update-initial-status + runs-on: macos-14-large + env: + ORG_GRADLE_PROJECT_jvmargs: -Xmx8g + steps: + - name: ci/checkout-repo + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + ref: ${{ github.event.pull_request.head.sha }} - # - name: ci/prepare-android-build - # uses: ./.github/actions/prepare-android-build - # env: - # STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" - # STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" - # STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" - # MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + - name: ci/prepare-android-build + uses: ./.github/actions/prepare-android-build + env: + STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - # - name: Cache Gradle dependencies - # uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 - # with: - # path: ~/.gradle/caches - # key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - # restore-keys: | - # ${{ runner.os }}-gradle- + - name: Cache Gradle dependencies + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- - # - name: Install Java - # uses: actions/setup-java@v4 - # with: - # java-version: "17" - # distribution: "adopt" - # cache: "gradle" + - name: Install Java + uses: actions/setup-java@v4 + with: + java-version: "17" + distribution: "adopt" + cache: "gradle" - # - name: Validate Gradle wrapper - # uses: gradle/actions/wrapper-validation@v3 + - name: Validate Gradle wrapper + uses: gradle/actions/wrapper-validation@v3 - # - name: Detox build - # run: | - # cd detox - # npm install - # npm install -g detox-cli - # npm run e2e:android-build + - name: Detox build + run: | + cd detox + npm install + npm install -g detox-cli + npm run e2e:android-build - # - name: ci/upload-android-pr-build - # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - # with: - # name: android-build-apk-${{ github.run_id }} - # path: "android/app/build/outputs/apk/**/app-*.apk" + - name: ci/upload-android-pr-build + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: android-build-apk-${{ github.run_id }} + path: "android/app/build/outputs/apk/**/app-*.apk" e2e-android-on-mac: name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} @@ -152,7 +152,7 @@ jobs: timeout-minutes: 40 needs: - generate-specs - # - build-android-apk + - build-android-apk strategy: fail-fast: false matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} @@ -184,14 +184,20 @@ jobs: - name: Create destination path run: mkdir -p android/app/build/outputs/apk - - name: Download artifact - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - curl -L -H "Authorization: token $GITHUB_TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - --output android/app/build/outputs/apk/artifact.zip + # - name: Download artifact + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # run: | + # curl -L -H "Authorization: token $GITHUB_TOKEN" \ + # -H "Accept: application/vnd.github.v3+json" \ + # https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ + # --output android/app/build/outputs/apk/artifact.zip + + - name: Download iOS Simulator Build + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + name: android-build-apk-${{ github.run_id }} + path: "android/app/build/outputs/apk/**/app-*.apk" - name: Unzip artifact run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk diff --git a/.github/workflows/test-android-detox.yml b/.github/workflows/test-android-detox.yml deleted file mode 100644 index 38258c62619..00000000000 --- a/.github/workflows/test-android-detox.yml +++ /dev/null @@ -1,100 +0,0 @@ -name: Android E2E Tests - -on: [push, pull_request] - -jobs: - detox-e2e-tests-ubuntu-latest: - runs-on: macos-14 - - steps: - - - name: Checkout - uses: actions/checkout@v1 - with: - fetch-depth: 1 - - - name: ci/prepare-node-deps - uses: ./.github/actions/prepare-node-deps - - - name: Install Sharp CLI for faster image generation during prebuild - run: npm install --global sharp-cli - - - name: Start React Native Metro Server - run: npm run start & - - - name: Install Detox Dependencies - run: cd detox && npm i - - - name: Set up JDK - uses: actions/setup-java@v2 - with: - distribution: 'zulu' - java-version: '11' - - - name: Create destination path - run: mkdir -p android/app/build/outputs/apk - - - name: Download artifact - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - curl -L -H "Authorization: token $GITHUB_TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - --output android/app/build/outputs/apk/artifact.zip - - - name: Unzip artifact - run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk - - - name: Cleanup - run: rm android/app/build/outputs/apk/artifact.zip - - - name: Set up Android SDK - uses: android-actions/setup-android@v2 - with: - api-level: 31 - target: default - arch: x86_64 - - - name: Accept Android SDK Licenses - run: yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses - - - name: Install SDK Tools - run: | - yes | sdkmanager --install "emulator" "platform-tools" "platforms;android-31" "system-images;android-31;default;x86_64" "build-tools;31.0.0" - - - name: Set up Android SDK path - run: echo "$ANDROID_HOME/emulator:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin:$PATH" >> $GITHUB_PATH - - - name: Create AVD - run : | - cd detox - npm run e2e:android-create-emulator - - - name: Run Android Detox E2E Tests on macOS - run: | - cd detox && npm run e2e:android-test -- about.e2e.ts - - - name: Upload Android Test Report - if: always() - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-results-1 - path: detox/artifacts - - - name: capture - run: | - screencapture emulator-macos-13.jpg - $ANDROID_HOME/platform-tools/adb exec-out screencap -p > emulator-capture-macos-13.png - - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-macos-13.jpg - - uses: actions/upload-artifact@v3 - with: - name: Android-Emulator-Screenshots - path: emulator-capture-macos-13.png - - - name: Stop Android Emulator - run: adb -s emulator-5554 emu kill From f8ce61cd004eb7253ed3e080ebb370c9550c454d Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 5 Sep 2024 22:19:05 +0530 Subject: [PATCH 303/362] download apk --- .../workflows/e2e-detox-android-template.yml | 116 +++++++++--------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index d5565c987fd..c699c9fa358 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -95,55 +95,55 @@ jobs: device_name: ${{ env.DEVICE_NAME }} device_os_version: ${{env.DEVICE_OS_VERSION}} - build-android-apk: - needs: update-initial-status - runs-on: macos-14-large - env: - ORG_GRADLE_PROJECT_jvmargs: -Xmx8g - steps: - - name: ci/checkout-repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - with: - ref: ${{ github.event.pull_request.head.sha }} + # build-android-apk: + # needs: update-initial-status + # runs-on: macos-14-large + # env: + # ORG_GRADLE_PROJECT_jvmargs: -Xmx8g + # steps: + # - name: ci/checkout-repo + # uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + # with: + # ref: ${{ github.event.pull_request.head.sha }} - - name: ci/prepare-android-build - uses: ./.github/actions/prepare-android-build - env: - STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" - STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" - STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" - MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" + # - name: ci/prepare-android-build + # uses: ./.github/actions/prepare-android-build + # env: + # STORE_FILE: "${{ secrets.MM_MOBILE_STORE_FILE }}" + # STORE_ALIAS: "${{ secrets.MM_MOBILE_STORE_ALIAS }}" + # STORE_PASSWORD: "${{ secrets.MM_MOBILE_STORE_PASSWORD }}" + # MATTERMOST_BUILD_GH_TOKEN: "${{ secrets.MATTERMOST_BUILD_GH_TOKEN }}" - - name: Cache Gradle dependencies - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 - with: - path: ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- + # - name: Cache Gradle dependencies + # uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + # with: + # path: ~/.gradle/caches + # key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + # restore-keys: | + # ${{ runner.os }}-gradle- - - name: Install Java - uses: actions/setup-java@v4 - with: - java-version: "17" - distribution: "adopt" - cache: "gradle" + # - name: Install Java + # uses: actions/setup-java@v4 + # with: + # java-version: "17" + # distribution: "adopt" + # cache: "gradle" - - name: Validate Gradle wrapper - uses: gradle/actions/wrapper-validation@v3 + # - name: Validate Gradle wrapper + # uses: gradle/actions/wrapper-validation@v3 - - name: Detox build - run: | - cd detox - npm install - npm install -g detox-cli - npm run e2e:android-build + # - name: Detox build + # run: | + # cd detox + # npm install + # npm install -g detox-cli + # npm run e2e:android-build - - name: ci/upload-android-pr-build - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - name: android-build-apk-${{ github.run_id }} - path: "android/app/build/outputs/apk/**/app-*.apk" + # - name: ci/upload-android-pr-build + # uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + # with: + # name: android-build-apk-${{ github.run_id }} + # path: "android/app/build/outputs/apk/**/app-*.apk" e2e-android-on-mac: name: android-detox-e2e-${{ matrix.runId }}-${{ matrix.deviceName }}-${{ matrix.deviceOsVersion }} @@ -152,7 +152,7 @@ jobs: timeout-minutes: 40 needs: - generate-specs - - build-android-apk + # - build-android-apk strategy: fail-fast: false matrix: ${{fromJson(needs.generate-specs.outputs.specs)}} @@ -184,20 +184,20 @@ jobs: - name: Create destination path run: mkdir -p android/app/build/outputs/apk - # - name: Download artifact - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # run: | - # curl -L -H "Authorization: token $GITHUB_TOKEN" \ - # -H "Accept: application/vnd.github.v3+json" \ - # https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1578521977/zip \ - # --output android/app/build/outputs/apk/artifact.zip - - - name: Download iOS Simulator Build - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - with: - name: android-build-apk-${{ github.run_id }} - path: "android/app/build/outputs/apk/**/app-*.apk" + - name: Download artifact + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + curl -L -H "Authorization: token $GITHUB_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/mattermost/mattermost-mobile/actions/artifacts/1895704669/zip \ + --output android/app/build/outputs/apk/artifact.zip + + # - name: Download iOS Simulator Build + # uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + # with: + # name: android-build-apk-${{ github.run_id }} + # path: "android/app/build/outputs/apk/**/app-*.apk" - name: Unzip artifact run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk From fe3ae4bcab9d19c4158fc99641247320635b3f83 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 5 Sep 2024 22:36:39 +0530 Subject: [PATCH 304/362] install sdk --- .../workflows/e2e-detox-android-template.yml | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index c699c9fa358..17082007395 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -181,6 +181,35 @@ jobs: distribution: "adopt" cache: "gradle" + - name: Download and Install Android SDK + run: | + # Create a directory for Android SDK + mkdir -p $HOME/android-sdk + + # Download the SDK tools + curl https://dl.google.com/android/repository/commandlinetools-mac-8092744_latest.zip -o commandlinetools.zip + + # Unzip the SDK tools + unzip commandlinetools.zip -d $HOME/android-sdk + + # Move commandline-tools to the right location + mkdir -p $HOME/android-sdk/cmdline-tools + mv $HOME/android-sdk/cmdline-tools $HOME/android-sdk/cmdline-tools/latest + + # Accept licenses and install SDK components + yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --sdk_root=$HOME/android-sdk "platform-tools" "platforms;android-30" + + # Set environment variables for Android SDK + - name: Set up Android SDK environment + run: | + echo "ANDROID_HOME=$HOME/android-sdk" >> $GITHUB_ENV + echo "PATH=$PATH:$HOME/android-sdk/platform-tools:$HOME/android-sdk/cmdline-tools/latest/bin" >> $GITHUB_ENV + + # Example usage of sdkmanager + - name: Use sdkmanager to list installed packages + run: | + sdkmanager --list + - name: Create destination path run: mkdir -p android/app/build/outputs/apk From e8dfa0a6ee37b4b8a8333a5f91618d6ad9b454be Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 5 Sep 2024 22:50:44 +0530 Subject: [PATCH 305/362] download sdkmanager --- .../workflows/e2e-detox-android-template.yml | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 17082007395..58c5c75a7fe 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -185,27 +185,30 @@ jobs: run: | # Create a directory for Android SDK mkdir -p $HOME/android-sdk - + # Download the SDK tools curl https://dl.google.com/android/repository/commandlinetools-mac-8092744_latest.zip -o commandlinetools.zip - - # Unzip the SDK tools - unzip commandlinetools.zip -d $HOME/android-sdk - - # Move commandline-tools to the right location - mkdir -p $HOME/android-sdk/cmdline-tools - mv $HOME/android-sdk/cmdline-tools $HOME/android-sdk/cmdline-tools/latest - + + # Unzip the SDK tools into a temp directory + unzip commandlinetools.zip -d $HOME/android-sdk/temp-cmdline-tools + + # Create the final directory for cmdline-tools + mkdir -p $HOME/android-sdk/cmdline-tools/latest + + # Move the extracted files to the 'latest' directory + mv $HOME/android-sdk/temp-cmdline-tools/cmdline-tools/* $HOME/android-sdk/cmdline-tools/latest + + # Clean up the temp directory + rm -rf $HOME/android-sdk/temp-cmdline-tools + # Accept licenses and install SDK components yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --sdk_root=$HOME/android-sdk "platform-tools" "platforms;android-30" - # Set environment variables for Android SDK - name: Set up Android SDK environment run: | echo "ANDROID_HOME=$HOME/android-sdk" >> $GITHUB_ENV echo "PATH=$PATH:$HOME/android-sdk/platform-tools:$HOME/android-sdk/cmdline-tools/latest/bin" >> $GITHUB_ENV - - # Example usage of sdkmanager + - name: Use sdkmanager to list installed packages run: | sdkmanager --list From 848b40968bb31d8c78c0940cf52d2e14bd9fae5c Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 5 Sep 2024 23:30:17 +0530 Subject: [PATCH 306/362] accept license --- .github/workflows/e2e-detox-android-template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 58c5c75a7fe..cf3508b89f0 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -202,7 +202,7 @@ jobs: rm -rf $HOME/android-sdk/temp-cmdline-tools # Accept licenses and install SDK components - yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --sdk_root=$HOME/android-sdk "platform-tools" "platforms;android-30" + yes | sdkmanager --licenses - name: Set up Android SDK environment run: | From 3fa33a78aad92f178325fc58577d950ada85469d Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Thu, 5 Sep 2024 23:40:13 +0530 Subject: [PATCH 307/362] accept license: fix broken pipe --- .github/workflows/e2e-detox-android-template.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index cf3508b89f0..3516f446fd0 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -202,7 +202,10 @@ jobs: rm -rf $HOME/android-sdk/temp-cmdline-tools # Accept licenses and install SDK components - yes | sdkmanager --licenses + $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses --sdk_root=$HOME/android-sdk + $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --sdk_root=$HOME/android-sdk "platform-tools" "platforms;android-31" + + # yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --sdk_root=$HOME/android-sdk "platform-tools" "platforms;android-31" - name: Set up Android SDK environment run: | From 37b5982bb899d07b2d394d61c465e1d9fb579d5e Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 6 Sep 2024 00:08:36 +0530 Subject: [PATCH 308/362] accept license: fix broken pipe --- .github/workflows/e2e-detox-android-template.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 3516f446fd0..9749312665c 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -202,8 +202,8 @@ jobs: rm -rf $HOME/android-sdk/temp-cmdline-tools # Accept licenses and install SDK components - $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses --sdk_root=$HOME/android-sdk - $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --sdk_root=$HOME/android-sdk "platform-tools" "platforms;android-31" + yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses --sdk_root=$HOME/android-sdk + yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --sdk_root=$HOME/android-sdk "platform-tools" "platforms;android-31" # yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --sdk_root=$HOME/android-sdk "platform-tools" "platforms;android-31" From f5860c655c440e5e65ea0baa7e34ec857f07f8a9 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 6 Sep 2024 05:57:15 +0530 Subject: [PATCH 309/362] check unzipped files --- .github/workflows/e2e-detox-android-template.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 9749312665c..0b54dea242f 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -237,6 +237,9 @@ jobs: - name: Unzip artifact run: unzip android/app/build/outputs/apk/artifact.zip -d android/app/build/outputs/apk + - name: List unzipped files + run: ls -la android/app/build/outputs/apk + - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip @@ -247,7 +250,8 @@ jobs: - name: Run Android Detox E2E Tests on macOS run: | - cd detox && npm run e2e:android-test -- ${{ matrix.specs }} + cd detox + npm run e2e:android-test -- ${{ matrix.specs }} - name: Upload Android Test Report if: always() From 1186b32a67e70e5c68a880709bfb87c3fb0c9eb3 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 6 Sep 2024 06:26:07 +0530 Subject: [PATCH 310/362] boot the emulator --- detox/create_android_emulator.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 30563c56b27..41d858b8343 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -47,3 +47,17 @@ sed -i -e "s|image.sysdir.1 = change_to_image_sysdir/|image.sysdir.1 = system-im sed -i -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = $(pwd)/${NAME}/pixel_4_xl_skin|g" $NAME/config.ini echo "Android virtual device successfully created: ${NAME}" + +# Start the emulator +nohup emulator -avd $NAME -no-audio -no-boot-anim -gpu auto > /dev/null 2>&1 & +sleep 10 + +# Wait for the emulator to boot +BOOT_STATUS=$(adb shell getprop sys.boot_completed) +while [[ "$BOOT_STATUS" != "1" ]]; do + echo "Waiting for emulator to boot..." + sleep 5 + BOOT_STATUS=$(adb shell getprop sys.boot_completed) +done + +echo "Emulator booted successfully!" \ No newline at end of file From e3b09de02068b5d2ade6550a48380a6448effa0c Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 6 Sep 2024 06:36:30 +0530 Subject: [PATCH 311/362] creat and boot emu --- detox/create_android_emulator.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 41d858b8343..7680989f857 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -45,13 +45,21 @@ sed -i -e "s|abi.type = change_type|abi.type = ${CPU_ARCH_FAMILY}|g" $NAME/confi sed -i -e "s|hw.cpu.arch = change_cpu_arch|hw.cpu.arch = ${CPU_ARCH}|g" $NAME/config.ini sed -i -e "s|image.sysdir.1 = change_to_image_sysdir/|image.sysdir.1 = system-images/android-${SDK_VERSION}/google_apis/${CPU_ARCH_FAMILY}/|g" $NAME/config.ini sed -i -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = $(pwd)/${NAME}/pixel_4_xl_skin|g" $NAME/config.ini - echo "Android virtual device successfully created: ${NAME}" # Start the emulator nohup emulator -avd $NAME -no-audio -no-boot-anim -gpu auto > /dev/null 2>&1 & sleep 10 +# Wait for the emulator to be detected by adb +echo "Waiting for the emulator to be detected by adb..." +adb_devices=$(adb devices | grep "emulator" | wc -l) +while [[ "$adb_devices" -eq "0" ]]; do + echo "Waiting for adb to detect the emulator..." + sleep 5 + adb_devices=$(adb devices | grep "emulator" | wc -l) +done + # Wait for the emulator to boot BOOT_STATUS=$(adb shell getprop sys.boot_completed) while [[ "$BOOT_STATUS" != "1" ]]; do @@ -60,4 +68,4 @@ while [[ "$BOOT_STATUS" != "1" ]]; do BOOT_STATUS=$(adb shell getprop sys.boot_completed) done -echo "Emulator booted successfully!" \ No newline at end of file +echo "Emulator booted successfully!" From b7f9f27c9f632c3030ad587fc050e77712c06dce Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 6 Sep 2024 06:45:24 +0530 Subject: [PATCH 312/362] creat and boot emu --- detox/create_android_emulator.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 7680989f857..09453ba285e 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -45,6 +45,7 @@ sed -i -e "s|abi.type = change_type|abi.type = ${CPU_ARCH_FAMILY}|g" $NAME/confi sed -i -e "s|hw.cpu.arch = change_cpu_arch|hw.cpu.arch = ${CPU_ARCH}|g" $NAME/config.ini sed -i -e "s|image.sysdir.1 = change_to_image_sysdir/|image.sysdir.1 = system-images/android-${SDK_VERSION}/google_apis/${CPU_ARCH_FAMILY}/|g" $NAME/config.ini sed -i -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = $(pwd)/${NAME}/pixel_4_xl_skin|g" $NAME/config.ini + echo "Android virtual device successfully created: ${NAME}" # Start the emulator @@ -53,19 +54,19 @@ sleep 10 # Wait for the emulator to be detected by adb echo "Waiting for the emulator to be detected by adb..." -adb_devices=$(adb devices | grep "emulator" | wc -l) +adb_devices=$(adb devices | grep emulator | wc -l | xargs) # Trim spaces using 'xargs' while [[ "$adb_devices" -eq "0" ]]; do echo "Waiting for adb to detect the emulator..." sleep 5 - adb_devices=$(adb devices | grep "emulator" | wc -l) + adb_devices=$(adb devices | grep emulator | wc -l | xargs) # Trim spaces using 'xargs' done # Wait for the emulator to boot -BOOT_STATUS=$(adb shell getprop sys.boot_completed) +BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') # Strip any extra characters while [[ "$BOOT_STATUS" != "1" ]]; do echo "Waiting for emulator to boot..." sleep 5 - BOOT_STATUS=$(adb shell getprop sys.boot_completed) + BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') # Strip any extra characters done echo "Emulator booted successfully!" From 748cc83e12954d449b152357e608f1ab4be4ef21 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 6 Sep 2024 06:59:49 +0530 Subject: [PATCH 313/362] creat and boot emu --- detox/create_android_emulator.sh | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 09453ba285e..53c25e33659 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -48,25 +48,30 @@ sed -i -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = $(p echo "Android virtual device successfully created: ${NAME}" -# Start the emulator +# Start the emulator in the background nohup emulator -avd $NAME -no-audio -no-boot-anim -gpu auto > /dev/null 2>&1 & -sleep 10 +sleep 30 -# Wait for the emulator to be detected by adb +# Wait for adb to detect the emulator echo "Waiting for the emulator to be detected by adb..." adb_devices=$(adb devices | grep emulator | wc -l | xargs) # Trim spaces using 'xargs' + +# Retry until the emulator is detected while [[ "$adb_devices" -eq "0" ]]; do echo "Waiting for adb to detect the emulator..." sleep 5 - adb_devices=$(adb devices | grep emulator | wc -l | xargs) # Trim spaces using 'xargs' + adb devices # This will force adb to list the devices again + adb_devices=$(adb devices | grep emulator | wc -l | xargs) # Update adb_devices after retrying done -# Wait for the emulator to boot +echo "Emulator detected by adb." + +# Wait for the emulator to fully boot BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') # Strip any extra characters while [[ "$BOOT_STATUS" != "1" ]]; do - echo "Waiting for emulator to boot..." + echo "Waiting for the emulator to boot..." sleep 5 - BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') # Strip any extra characters + BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') # Retry boot check done echo "Emulator booted successfully!" From 9d51b85388786ccd4c954ab897f16a3741d3c7d2 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 6 Sep 2024 07:33:21 +0530 Subject: [PATCH 314/362] start adb server --- detox/create_android_emulator.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 53c25e33659..9317c81d43b 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -48,10 +48,16 @@ sed -i -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = $(p echo "Android virtual device successfully created: ${NAME}" -# Start the emulator in the background -nohup emulator -avd $NAME -no-audio -no-boot-anim -gpu auto > /dev/null 2>&1 & +# Start the emulator in the background with verbose logging +nohup emulator -avd $NAME -no-audio -no-boot-anim -gpu auto -verbose > emulator.log 2>&1 & sleep 30 +# Output the logs for debugging +cat emulator.log + +# Start adb server +adb start-server + # Wait for adb to detect the emulator echo "Waiting for the emulator to be detected by adb..." adb_devices=$(adb devices | grep emulator | wc -l | xargs) # Trim spaces using 'xargs' From 32db4ecf63384d75a8585d35144069238aa405ba Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 6 Sep 2024 07:55:50 +0530 Subject: [PATCH 315/362] fix qemu error --- .github/workflows/e2e-detox-android-template.yml | 2 +- detox/create_android_emulator.sh | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 0b54dea242f..53a0f4cd049 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -205,7 +205,7 @@ jobs: yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses --sdk_root=$HOME/android-sdk yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --sdk_root=$HOME/android-sdk "platform-tools" "platforms;android-31" - # yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --sdk_root=$HOME/android-sdk "platform-tools" "platforms;android-31" + echo "PATH=$PATH:$HOME/android-sdk/emulator" >> $GITHUB_ENV - name: Set up Android SDK environment run: | diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 9317c81d43b..17621f2df80 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -30,7 +30,8 @@ fi SYSTEM_IMAGE="system-images;android-${SDK_VERSION};google_apis;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed -sdkmanager --install "$SYSTEM_IMAGE" +sdkmanager --install "emulator" "platform-tools" "$SYSTEM_IMAGE" +sdkmanager --licenses # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel' @@ -49,7 +50,9 @@ sed -i -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = $(p echo "Android virtual device successfully created: ${NAME}" # Start the emulator in the background with verbose logging -nohup emulator -avd $NAME -no-audio -no-boot-anim -gpu auto -verbose > emulator.log 2>&1 & +# nohup emulator -avd $NAME -no-audio -no-boot-anim -gpu auto -verbose > emulator.log 2>&1 & +nohup emulator -avd $NAME -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose > emulator.log 2>&1 & + sleep 30 # Output the logs for debugging From 58034e75e06359265b4988865b5af400ca6d9ad5 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 6 Sep 2024 08:19:15 +0530 Subject: [PATCH 316/362] fix qemu error --- .../workflows/e2e-detox-android-template.yml | 1 - detox/create_android_emulator.sh | 22 +++++++++---------- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 53a0f4cd049..92a8b00e7e7 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -203,7 +203,6 @@ jobs: # Accept licenses and install SDK components yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses --sdk_root=$HOME/android-sdk - yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --sdk_root=$HOME/android-sdk "platform-tools" "platforms;android-31" echo "PATH=$PATH:$HOME/android-sdk/emulator" >> $GITHUB_ENV diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 17621f2df80..d98f725a4d1 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -31,7 +31,6 @@ SYSTEM_IMAGE="system-images;android-${SDK_VERSION};google_apis;${CPU_ARCH_FAMILY # Install the system image if it's not already installed sdkmanager --install "emulator" "platform-tools" "$SYSTEM_IMAGE" -sdkmanager --licenses # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel' @@ -49,13 +48,11 @@ sed -i -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = $(p echo "Android virtual device successfully created: ${NAME}" -# Start the emulator in the background with verbose logging -# nohup emulator -avd $NAME -no-audio -no-boot-anim -gpu auto -verbose > emulator.log 2>&1 & +# Start the emulator in headless mode and log output nohup emulator -avd $NAME -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose > emulator.log 2>&1 & +sleep 30 # Adjust based on emulator startup time -sleep 30 - -# Output the logs for debugging +# Output the emulator logs for debugging cat emulator.log # Start adb server @@ -63,24 +60,25 @@ adb start-server # Wait for adb to detect the emulator echo "Waiting for the emulator to be detected by adb..." -adb_devices=$(adb devices | grep emulator | wc -l | xargs) # Trim spaces using 'xargs' +adb_devices=$(adb devices | grep emulator | wc -l | xargs) # Retry until the emulator is detected while [[ "$adb_devices" -eq "0" ]]; do echo "Waiting for adb to detect the emulator..." - sleep 5 - adb devices # This will force adb to list the devices again - adb_devices=$(adb devices | grep emulator | wc -l | xargs) # Update adb_devices after retrying + sleep 10 # Increased wait time for adb to detect the device + adb start-server # Ensure adb server is running + adb devices # List devices + adb_devices=$(adb devices | grep emulator | wc -l | xargs) done echo "Emulator detected by adb." # Wait for the emulator to fully boot -BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') # Strip any extra characters +BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') while [[ "$BOOT_STATUS" != "1" ]]; do echo "Waiting for the emulator to boot..." sleep 5 - BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') # Retry boot check + BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') done echo "Emulator booted successfully!" From 72d5383271d076d38caaa699f5ffd35dbea0c3ec Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 6 Sep 2024 08:36:43 +0530 Subject: [PATCH 317/362] fix qemu error --- .../workflows/e2e-detox-android-template.yml | 25 ++++++++++++++----- detox/create_android_emulator.sh | 2 +- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 92a8b00e7e7..0877389a8f2 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -211,9 +211,22 @@ jobs: echo "ANDROID_HOME=$HOME/android-sdk" >> $GITHUB_ENV echo "PATH=$PATH:$HOME/android-sdk/platform-tools:$HOME/android-sdk/cmdline-tools/latest/bin" >> $GITHUB_ENV - - name: Use sdkmanager to list installed packages + - name: Set up Android SDK root + run: echo "ANDROID_SDK_ROOT=$ANDROID_HOME" >> $GITHUB_ENV + + - name: Install Android system image + run: sdkmanager "system-images;android-31;google_apis;x86_64" + + - name: Create Android Emulator + run: echo "no" | avdmanager create avd -n detox_pixel_4_xl_api_31 -k "system-images;android-31;google_apis;x86_64" + + - name: Run Android emulator + run: nohup $ANDROID_SDK_ROOT/emulator/emulator -avd detox_pixel_4_xl_api_31 -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose & + + - name: Wait for emulator to be ready run: | - sdkmanager --list + adb wait-for-device + adb shell input keyevent 82 - name: Create destination path run: mkdir -p android/app/build/outputs/apk @@ -242,10 +255,10 @@ jobs: - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip - - name: Create AVD - run : | - cd detox - npm run e2e:android-create-emulator + # - name: Create AVD + # run : | + # cd detox + # npm run e2e:android-create-emulator - name: Run Android Detox E2E Tests on macOS run: | diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index d98f725a4d1..17c757d138b 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -30,7 +30,7 @@ fi SYSTEM_IMAGE="system-images;android-${SDK_VERSION};google_apis;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed -sdkmanager --install "emulator" "platform-tools" "$SYSTEM_IMAGE" +sdkmanager --install "platform-tools" "$SYSTEM_IMAGE" # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel' From 0f3ff8ad3be5928dac86f971564b95b79bdba561 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Fri, 6 Sep 2024 08:45:45 +0530 Subject: [PATCH 318/362] wait for emu --- .../workflows/e2e-detox-android-template.yml | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 0877389a8f2..eb82df4d331 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -223,10 +223,24 @@ jobs: - name: Run Android emulator run: nohup $ANDROID_SDK_ROOT/emulator/emulator -avd detox_pixel_4_xl_api_31 -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose & - - name: Wait for emulator to be ready + - name: Wait for emulator to start run: | - adb wait-for-device - adb shell input keyevent 82 + echo "Waiting for emulator to start..." + for i in {1..12}; do + if adb devices | grep emulator; then + echo "Emulator is up and running!" + break + else + echo "Waiting for emulator..." + sleep 10 + fi + done + + - name: List running processes + run: ps aux | grep emulator + + - name: Delay before proceeding + run: sleep 30 - name: Create destination path run: mkdir -p android/app/build/outputs/apk From f3ce3b1bcd7c6c23288dbf8804d947e0f23310e5 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 8 Sep 2024 14:51:46 +0530 Subject: [PATCH 319/362] install platform emu --- .../workflows/e2e-detox-android-template.yml | 18 ++++++++++++++++++ detox/create_android_emulator.sh | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index eb82df4d331..5575ce353b8 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -236,6 +236,24 @@ jobs: fi done + - name: List platform-tools directory + run: ls -l $ANDROID_SDK_ROOT/platform-tools + + - name: Set up Android SDK root + run: echo "ANDROID_SDK_ROOT=$ANDROID_HOME" >> $GITHUB_ENV + + - name: Verify SDK Path + run: echo $ANDROID_SDK_ROOT + + - name: Install Android platform-tools + run: sdkmanager "platform-tools" + + - name: Update Android SDK tools + run: sdkmanager --update + + - name: Check adb executable + run: which adb + - name: List running processes run: ps aux | grep emulator diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 17c757d138b..ea5a42af4d4 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -30,7 +30,8 @@ fi SYSTEM_IMAGE="system-images;android-${SDK_VERSION};google_apis;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed -sdkmanager --install "platform-tools" "$SYSTEM_IMAGE" +sdkmanager --install "$SYSTEM_IMAGE" +sdkmanager --install "platform-tools" # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel' From 913ead9f2a21c930b387e304ee9bea9add542218 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 8 Sep 2024 15:00:41 +0530 Subject: [PATCH 320/362] install platform emu --- .github/workflows/e2e-detox-android-template.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 5575ce353b8..421ecac9188 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -246,7 +246,9 @@ jobs: run: echo $ANDROID_SDK_ROOT - name: Install Android platform-tools - run: sdkmanager "platform-tools" + run: | + sdkmanager --install "platform-tools" + sdkmanager "platform-tools" - name: Update Android SDK tools run: sdkmanager --update From e82c74930ea609df576e9340a42796794ec9c1df Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 8 Sep 2024 15:12:28 +0530 Subject: [PATCH 321/362] install platform tools --- .github/workflows/e2e-detox-android-template.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 421ecac9188..d2f371088fa 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -212,10 +212,13 @@ jobs: echo "PATH=$PATH:$HOME/android-sdk/platform-tools:$HOME/android-sdk/cmdline-tools/latest/bin" >> $GITHUB_ENV - name: Set up Android SDK root - run: echo "ANDROID_SDK_ROOT=$ANDROID_HOME" >> $GITHUB_ENV + run: echo "ANDROID_SDK_ROOT=/Users/runner/Library/Android/sdk" >> $GITHUB_ENV - name: Install Android system image - run: sdkmanager "system-images;android-31;google_apis;x86_64" + run: | + sdkmanager "system-images;android-31;google_apis;x86_64" + sdkmanager "platform-tools" + sdkmanager --update - name: Create Android Emulator run: echo "no" | avdmanager create avd -n detox_pixel_4_xl_api_31 -k "system-images;android-31;google_apis;x86_64" From 20e10a3296c816f11a6b6a8f6e2b894816644e05 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 8 Sep 2024 15:30:22 +0530 Subject: [PATCH 322/362] fix path --- .../workflows/e2e-detox-android-template.yml | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index d2f371088fa..a5040a65155 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -204,27 +204,23 @@ jobs: # Accept licenses and install SDK components yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses --sdk_root=$HOME/android-sdk - echo "PATH=$PATH:$HOME/android-sdk/emulator" >> $GITHUB_ENV - - name: Set up Android SDK environment run: | echo "ANDROID_HOME=$HOME/android-sdk" >> $GITHUB_ENV - echo "PATH=$PATH:$HOME/android-sdk/platform-tools:$HOME/android-sdk/cmdline-tools/latest/bin" >> $GITHUB_ENV - - - name: Set up Android SDK root - run: echo "ANDROID_SDK_ROOT=/Users/runner/Library/Android/sdk" >> $GITHUB_ENV + echo "ANDROID_SDK_ROOT=$HOME/android-sdk" >> $GITHUB_ENV + echo "PATH=$PATH:$HOME/android-sdk/platform-tools:$HOME/android-sdk/cmdline-tools/latest/bin:$HOME/android-sdk/emulator" >> $GITHUB_ENV - name: Install Android system image run: | - sdkmanager "system-images;android-31;google_apis;x86_64" - sdkmanager "platform-tools" - sdkmanager --update + $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "system-images;android-31;google_apis;x86_64" + $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "platform-tools" + $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --update - name: Create Android Emulator - run: echo "no" | avdmanager create avd -n detox_pixel_4_xl_api_31 -k "system-images;android-31;google_apis;x86_64" + run: echo "no" | $HOME/android-sdk/cmdline-tools/latest/bin/avdmanager create avd -n detox_pixel_4_xl_api_31 -k "system-images;android-31;google_apis;x86_64" - name: Run Android emulator - run: nohup $ANDROID_SDK_ROOT/emulator/emulator -avd detox_pixel_4_xl_api_31 -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose & + run: nohup $HOME/android-sdk/emulator/emulator -avd detox_pixel_4_xl_api_31 -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose & - name: Wait for emulator to start run: | @@ -240,10 +236,7 @@ jobs: done - name: List platform-tools directory - run: ls -l $ANDROID_SDK_ROOT/platform-tools - - - name: Set up Android SDK root - run: echo "ANDROID_SDK_ROOT=$ANDROID_HOME" >> $GITHUB_ENV + run: ls -l $HOME/android-sdk/platform-tools - name: Verify SDK Path run: echo $ANDROID_SDK_ROOT From 5f4cc8671cac11a87b78248635f61c029021b5c4 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 8 Sep 2024 16:27:20 +0530 Subject: [PATCH 323/362] start from script --- .../workflows/e2e-detox-android-template.yml | 156 +++++++++--------- detox/create_android_emulator.sh | 2 +- 2 files changed, 79 insertions(+), 79 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index a5040a65155..092cceb0ee0 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -181,82 +181,82 @@ jobs: distribution: "adopt" cache: "gradle" - - name: Download and Install Android SDK - run: | - # Create a directory for Android SDK - mkdir -p $HOME/android-sdk - - # Download the SDK tools - curl https://dl.google.com/android/repository/commandlinetools-mac-8092744_latest.zip -o commandlinetools.zip - - # Unzip the SDK tools into a temp directory - unzip commandlinetools.zip -d $HOME/android-sdk/temp-cmdline-tools - - # Create the final directory for cmdline-tools - mkdir -p $HOME/android-sdk/cmdline-tools/latest - - # Move the extracted files to the 'latest' directory - mv $HOME/android-sdk/temp-cmdline-tools/cmdline-tools/* $HOME/android-sdk/cmdline-tools/latest - - # Clean up the temp directory - rm -rf $HOME/android-sdk/temp-cmdline-tools - - # Accept licenses and install SDK components - yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses --sdk_root=$HOME/android-sdk - - - name: Set up Android SDK environment - run: | - echo "ANDROID_HOME=$HOME/android-sdk" >> $GITHUB_ENV - echo "ANDROID_SDK_ROOT=$HOME/android-sdk" >> $GITHUB_ENV - echo "PATH=$PATH:$HOME/android-sdk/platform-tools:$HOME/android-sdk/cmdline-tools/latest/bin:$HOME/android-sdk/emulator" >> $GITHUB_ENV - - - name: Install Android system image - run: | - $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "system-images;android-31;google_apis;x86_64" - $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "platform-tools" - $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --update - - - name: Create Android Emulator - run: echo "no" | $HOME/android-sdk/cmdline-tools/latest/bin/avdmanager create avd -n detox_pixel_4_xl_api_31 -k "system-images;android-31;google_apis;x86_64" - - - name: Run Android emulator - run: nohup $HOME/android-sdk/emulator/emulator -avd detox_pixel_4_xl_api_31 -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose & - - - name: Wait for emulator to start - run: | - echo "Waiting for emulator to start..." - for i in {1..12}; do - if adb devices | grep emulator; then - echo "Emulator is up and running!" - break - else - echo "Waiting for emulator..." - sleep 10 - fi - done - - - name: List platform-tools directory - run: ls -l $HOME/android-sdk/platform-tools - - - name: Verify SDK Path - run: echo $ANDROID_SDK_ROOT - - - name: Install Android platform-tools - run: | - sdkmanager --install "platform-tools" - sdkmanager "platform-tools" - - - name: Update Android SDK tools - run: sdkmanager --update - - - name: Check adb executable - run: which adb + # - name: Download and Install Android SDK + # run: | + # # Create a directory for Android SDK + # mkdir -p $HOME/android-sdk + + # # Download the SDK tools + # curl https://dl.google.com/android/repository/commandlinetools-mac-8092744_latest.zip -o commandlinetools.zip + + # # Unzip the SDK tools into a temp directory + # unzip commandlinetools.zip -d $HOME/android-sdk/temp-cmdline-tools + + # # Create the final directory for cmdline-tools + # mkdir -p $HOME/android-sdk/cmdline-tools/latest + + # # Move the extracted files to the 'latest' directory + # mv $HOME/android-sdk/temp-cmdline-tools/cmdline-tools/* $HOME/android-sdk/cmdline-tools/latest + + # # Clean up the temp directory + # rm -rf $HOME/android-sdk/temp-cmdline-tools + + # # Accept licenses and install SDK components + # yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses --sdk_root=$HOME/android-sdk + + # - name: Set up Android SDK environment + # run: | + # echo "ANDROID_HOME=$HOME/android-sdk" >> $GITHUB_ENV + # echo "ANDROID_SDK_ROOT=$HOME/android-sdk" >> $GITHUB_ENV + # echo "PATH=$PATH:$HOME/android-sdk/platform-tools:$HOME/android-sdk/cmdline-tools/latest/bin:$HOME/android-sdk/emulator" >> $GITHUB_ENV + + # - name: Install Android system image + # run: | + # $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "system-images;android-31;google_apis;x86_64" + # $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "platform-tools" + # $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --update + + # - name: Create Android Emulator + # run: echo "no" | $HOME/android-sdk/cmdline-tools/latest/bin/avdmanager create avd -n detox_pixel_4_xl_api_31 -k "system-images;android-31;google_apis;x86_64" + + # - name: Run Android emulator + # run: nohup $HOME/android-sdk/emulator/emulator -avd detox_pixel_4_xl_api_31 -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose & + + # - name: Wait for emulator to start + # run: | + # echo "Waiting for emulator to start..." + # for i in {1..12}; do + # if adb devices | grep emulator; then + # echo "Emulator is up and running!" + # break + # else + # echo "Waiting for emulator..." + # sleep 10 + # fi + # done + + # - name: List platform-tools directory + # run: ls -l $HOME/android-sdk/platform-tools + + # - name: Verify SDK Path + # run: echo $ANDROID_SDK_ROOT + + # - name: Install Android platform-tools + # run: | + # sdkmanager --install "platform-tools" + # sdkmanager "platform-tools" + + # - name: Update Android SDK tools + # run: sdkmanager --update + + # - name: Check adb executable + # run: which adb - - name: List running processes - run: ps aux | grep emulator + # - name: List running processes + # run: ps aux | grep emulator - - name: Delay before proceeding - run: sleep 30 + # - name: Delay before proceeding + # run: sleep 30 - name: Create destination path run: mkdir -p android/app/build/outputs/apk @@ -285,10 +285,10 @@ jobs: - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip - # - name: Create AVD - # run : | - # cd detox - # npm run e2e:android-create-emulator + - name: Create AVD + run : | + cd detox + npm run e2e:android-create-emulator - name: Run Android Detox E2E Tests on macOS run: | diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index ea5a42af4d4..407d2ab577b 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -27,7 +27,7 @@ else CPU_ARCH_FAMILY=x86_64 CPU_ARCH=x86_64 fi -SYSTEM_IMAGE="system-images;android-${SDK_VERSION};google_apis;${CPU_ARCH_FAMILY}" +SYSTEM_IMAGE="system-images;android-${SDK_VERSION};default;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed sdkmanager --install "$SYSTEM_IMAGE" From ef5f77858c1c92f1135e65a255d50caf2370b76b Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 8 Sep 2024 16:38:29 +0530 Subject: [PATCH 324/362] install sdkmanager --- .../workflows/e2e-detox-android-template.yml | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 092cceb0ee0..20d5650b0c2 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -181,28 +181,28 @@ jobs: distribution: "adopt" cache: "gradle" - # - name: Download and Install Android SDK - # run: | - # # Create a directory for Android SDK - # mkdir -p $HOME/android-sdk + - name: Download and Install Android SDK + run: | + # Create a directory for Android SDK + mkdir -p $HOME/android-sdk - # # Download the SDK tools - # curl https://dl.google.com/android/repository/commandlinetools-mac-8092744_latest.zip -o commandlinetools.zip + # Download the SDK tools + curl https://dl.google.com/android/repository/commandlinetools-mac-8092744_latest.zip -o commandlinetools.zip - # # Unzip the SDK tools into a temp directory - # unzip commandlinetools.zip -d $HOME/android-sdk/temp-cmdline-tools + # Unzip the SDK tools into a temp directory + unzip commandlinetools.zip -d $HOME/android-sdk/temp-cmdline-tools - # # Create the final directory for cmdline-tools - # mkdir -p $HOME/android-sdk/cmdline-tools/latest + # Create the final directory for cmdline-tools + mkdir -p $HOME/android-sdk/cmdline-tools/latest - # # Move the extracted files to the 'latest' directory - # mv $HOME/android-sdk/temp-cmdline-tools/cmdline-tools/* $HOME/android-sdk/cmdline-tools/latest + # Move the extracted files to the 'latest' directory + mv $HOME/android-sdk/temp-cmdline-tools/cmdline-tools/* $HOME/android-sdk/cmdline-tools/latest - # # Clean up the temp directory - # rm -rf $HOME/android-sdk/temp-cmdline-tools + # Clean up the temp directory + rm -rf $HOME/android-sdk/temp-cmdline-tools - # # Accept licenses and install SDK components - # yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses --sdk_root=$HOME/android-sdk + # Accept licenses and install SDK components + # yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses --sdk_root=$HOME/android-sdk # - name: Set up Android SDK environment # run: | From a9cfa99dd3b26cd180a00d920bbcc7edcc555dc4 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Sun, 8 Sep 2024 23:40:05 +0530 Subject: [PATCH 325/362] install sdkmanager --- detox/create_android_emulator.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 407d2ab577b..cfbca97c15b 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -30,8 +30,8 @@ fi SYSTEM_IMAGE="system-images;android-${SDK_VERSION};default;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed -sdkmanager --install "$SYSTEM_IMAGE" -sdkmanager --install "platform-tools" +$HOME/android-sdk/sdkmanager --install "$SYSTEM_IMAGE" +$HOME/android-sdk/sdkmanager --install "platform-tools" # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel' From 1713f14d3ba3f642d6c2da02a1bc40a36210066a Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 13:37:09 +0530 Subject: [PATCH 326/362] install sdkmanager path fix --- detox/create_android_emulator.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index cfbca97c15b..6538d2b7ed8 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -30,8 +30,8 @@ fi SYSTEM_IMAGE="system-images;android-${SDK_VERSION};default;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed -$HOME/android-sdk/sdkmanager --install "$SYSTEM_IMAGE" -$HOME/android-sdk/sdkmanager --install "platform-tools" +$HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --install "$SYSTEM_IMAGE" +$HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --install "platform-tools" # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel' From 9140516179bc27408efb3a822b8e32bd83ec52e7 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 14:03:32 +0530 Subject: [PATCH 327/362] install sdkmanager path fix --- .github/workflows/e2e-detox-android-template.yml | 15 +++++++++------ detox/create_android_emulator.sh | 3 +-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 20d5650b0c2..1a814fb2162 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -202,13 +202,16 @@ jobs: rm -rf $HOME/android-sdk/temp-cmdline-tools # Accept licenses and install SDK components - # yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses --sdk_root=$HOME/android-sdk + yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses --sdk_root=$HOME/android-sdk - # - name: Set up Android SDK environment - # run: | - # echo "ANDROID_HOME=$HOME/android-sdk" >> $GITHUB_ENV - # echo "ANDROID_SDK_ROOT=$HOME/android-sdk" >> $GITHUB_ENV - # echo "PATH=$PATH:$HOME/android-sdk/platform-tools:$HOME/android-sdk/cmdline-tools/latest/bin:$HOME/android-sdk/emulator" >> $GITHUB_ENV + # Install Platform tools + $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --install "platform-tools" + + - name: Set up Android SDK environment + run: | + echo "ANDROID_HOME=$HOME/android-sdk" >> $GITHUB_ENV + echo "ANDROID_SDK_ROOT=$HOME/android-sdk" >> $GITHUB_ENV + echo "PATH=$PATH:$HOME/android-sdk/platform-tools:$HOME/android-sdk/cmdline-tools/latest/bin:$HOME/android-sdk/emulator" >> $GITHUB_ENV # - name: Install Android system image # run: | diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 6538d2b7ed8..1fa6a2fa635 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -30,8 +30,7 @@ fi SYSTEM_IMAGE="system-images;android-${SDK_VERSION};default;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed -$HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --install "$SYSTEM_IMAGE" -$HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --install "platform-tools" +sdkmanager --install "$SYSTEM_IMAGE" # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel' From b8296b82baee53d7c7f5140afa7579b2518712ad Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 14:11:24 +0530 Subject: [PATCH 328/362] install sdkmanager path fix --- detox/create_android_emulator.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 1fa6a2fa635..c9d61baf460 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -43,7 +43,7 @@ sed -i -e "s|AvdId = change_avd_id|AvdId = ${NAME}|g" $NAME/config.ini sed -i -e "s|avd.ini.displayname = change_avd_displayname|avd.ini.displayname = Detox Pixel 4 XL API ${SDK_VERSION}|g" $NAME/config.ini sed -i -e "s|abi.type = change_type|abi.type = ${CPU_ARCH_FAMILY}|g" $NAME/config.ini sed -i -e "s|hw.cpu.arch = change_cpu_arch|hw.cpu.arch = ${CPU_ARCH}|g" $NAME/config.ini -sed -i -e "s|image.sysdir.1 = change_to_image_sysdir/|image.sysdir.1 = system-images/android-${SDK_VERSION}/google_apis/${CPU_ARCH_FAMILY}/|g" $NAME/config.ini +sed -i -e "s|image.sysdir.1 = change_to_image_sysdir/|image.sysdir.1 = system-images/android-${SDK_VERSION}/default/${CPU_ARCH_FAMILY}/|g" $NAME/config.ini sed -i -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = $(pwd)/${NAME}/pixel_4_xl_skin|g" $NAME/config.ini echo "Android virtual device successfully created: ${NAME}" From 93051fa8a19af0af4daf3431ef2c817d53881fae Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 14:26:04 +0530 Subject: [PATCH 329/362] install sdkmanager path fix --- .../workflows/e2e-detox-android-template.yml | 23 +++++-------------- detox/create_android_emulator.sh | 4 ++++ 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 1a814fb2162..de7db2081cb 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -215,12 +215,12 @@ jobs: # - name: Install Android system image # run: | - # $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "system-images;android-31;google_apis;x86_64" + # $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "system-images;android-31;default;x86_64" # $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "platform-tools" # $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --update # - name: Create Android Emulator - # run: echo "no" | $HOME/android-sdk/cmdline-tools/latest/bin/avdmanager create avd -n detox_pixel_4_xl_api_31 -k "system-images;android-31;google_apis;x86_64" + # run: echo "no" | $HOME/android-sdk/cmdline-tools/latest/bin/avdmanager create avd -n detox_pixel_4_xl_api_31 -k "system-images;android-31;default;x86_64" # - name: Run Android emulator # run: nohup $HOME/android-sdk/emulator/emulator -avd detox_pixel_4_xl_api_31 -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose & @@ -243,23 +243,12 @@ jobs: # - name: Verify SDK Path # run: echo $ANDROID_SDK_ROOT - - # - name: Install Android platform-tools - # run: | - # sdkmanager --install "platform-tools" - # sdkmanager "platform-tools" - - # - name: Update Android SDK tools - # run: sdkmanager --update - - # - name: Check adb executable - # run: which adb - # - name: List running processes - # run: ps aux | grep emulator + - name: List running processes + run: ps aux | grep emulator - # - name: Delay before proceeding - # run: sleep 30 + - name: Delay before proceeding + run: sleep 30 - name: Create destination path run: mkdir -p android/app/build/outputs/apk diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index c9d61baf460..cb7866123ba 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -48,6 +48,10 @@ sed -i -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = $(p echo "Android virtual device successfully created: ${NAME}" +echo "*****************************************" +which emulator +echo "*****************************************" + # Start the emulator in headless mode and log output nohup emulator -avd $NAME -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose > emulator.log 2>&1 & sleep 30 # Adjust based on emulator startup time From b34c981a1c29255c1df336a0dcfdb3b59ad70053 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 14:47:14 +0530 Subject: [PATCH 330/362] install sdkmanager path fix --- .../workflows/e2e-detox-android-template.yml | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index de7db2081cb..c81741fc22d 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -209,10 +209,26 @@ jobs: - name: Set up Android SDK environment run: | - echo "ANDROID_HOME=$HOME/android-sdk" >> $GITHUB_ENV - echo "ANDROID_SDK_ROOT=$HOME/android-sdk" >> $GITHUB_ENV - echo "PATH=$PATH:$HOME/android-sdk/platform-tools:$HOME/android-sdk/cmdline-tools/latest/bin:$HOME/android-sdk/emulator" >> $GITHUB_ENV + # Set the correct SDK root paths + ANDROID_HOME=$HOME/android-sdk + ANDROID_SDK_ROOT=$HOME/android-sdk + PATH=$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$ANDROID_HOME/cmdline-tools/latest/bin:$PATH + # Log the current paths for debugging + echo "ANDROID_HOME: $ANDROID_HOME" + echo "ANDROID_SDK_ROOT: $ANDROID_SDK_ROOT" + echo "PATH: $PATH" + + # Export the environment variables to $GITHUB_ENV + echo "ANDROID_HOME=$ANDROID_HOME" >> $GITHUB_ENV + echo "ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT" >> $GITHUB_ENV + echo "PATH=$PATH" >> $GITHUB_ENV + + - name: Create AVD + run : | + cd detox + npm run e2e:android-create-emulator + # - name: Install Android system image # run: | # $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "system-images;android-31;default;x86_64" @@ -238,18 +254,6 @@ jobs: # fi # done - # - name: List platform-tools directory - # run: ls -l $HOME/android-sdk/platform-tools - - # - name: Verify SDK Path - # run: echo $ANDROID_SDK_ROOT - - - name: List running processes - run: ps aux | grep emulator - - - name: Delay before proceeding - run: sleep 30 - - name: Create destination path run: mkdir -p android/app/build/outputs/apk @@ -277,11 +281,6 @@ jobs: - name: Cleanup run: rm android/app/build/outputs/apk/artifact.zip - - name: Create AVD - run : | - cd detox - npm run e2e:android-create-emulator - - name: Run Android Detox E2E Tests on macOS run: | cd detox From 0f74265a92b2a6d51cdc375e79635c9cfdd5e455 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 15:01:17 +0530 Subject: [PATCH 331/362] path fix --- detox/create_android_emulator.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index cb7866123ba..bbad111a2f4 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -30,7 +30,10 @@ fi SYSTEM_IMAGE="system-images;android-${SDK_VERSION};default;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed +sdkmanager --install "platforms;android-${SDK_VERSION}" sdkmanager --install "$SYSTEM_IMAGE" +sdkmanager --install "platform-tools" +sdkmanager --install "emulator" # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel' @@ -53,7 +56,9 @@ which emulator echo "*****************************************" # Start the emulator in headless mode and log output -nohup emulator -avd $NAME -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose > emulator.log 2>&1 & +# nohup emulator -avd $NAME -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose > emulator.log 2>&1 & +nohup emulator -avd detox_pixel_4_xl_api_31 -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose -sdk_root $ANDROID_SDK_ROOT & + sleep 30 # Adjust based on emulator startup time # Output the emulator logs for debugging From 35eb2c2594f24ca08ceaf246d9bddd5ce89a0b22 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 16:04:14 +0530 Subject: [PATCH 332/362] path fix --- detox/create_android_emulator.sh | 59 ++++++++++++++++---------------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index bbad111a2f4..90fdde13da9 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -51,43 +51,42 @@ sed -i -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = $(p echo "Android virtual device successfully created: ${NAME}" -echo "*****************************************" -which emulator -echo "*****************************************" +# echo "*****************************************" +# which emulator +# echo "*****************************************" -# Start the emulator in headless mode and log output +# # Start the emulator in headless mode and log output # nohup emulator -avd $NAME -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose > emulator.log 2>&1 & -nohup emulator -avd detox_pixel_4_xl_api_31 -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose -sdk_root $ANDROID_SDK_ROOT & -sleep 30 # Adjust based on emulator startup time +# sleep 30 # Adjust based on emulator startup time -# Output the emulator logs for debugging -cat emulator.log +# # Output the emulator logs for debugging +# cat emulator.log -# Start adb server -adb start-server +# # Start adb server +# adb start-server -# Wait for adb to detect the emulator -echo "Waiting for the emulator to be detected by adb..." -adb_devices=$(adb devices | grep emulator | wc -l | xargs) +# # Wait for adb to detect the emulator +# echo "Waiting for the emulator to be detected by adb..." +# adb_devices=$(adb devices | grep emulator | wc -l | xargs) -# Retry until the emulator is detected -while [[ "$adb_devices" -eq "0" ]]; do - echo "Waiting for adb to detect the emulator..." - sleep 10 # Increased wait time for adb to detect the device - adb start-server # Ensure adb server is running - adb devices # List devices - adb_devices=$(adb devices | grep emulator | wc -l | xargs) -done +# # Retry until the emulator is detected +# while [[ "$adb_devices" -eq "0" ]]; do +# echo "Waiting for adb to detect the emulator..." +# sleep 10 # Increased wait time for adb to detect the device +# adb start-server # Ensure adb server is running +# adb devices # List devices +# adb_devices=$(adb devices | grep emulator | wc -l | xargs) +# done -echo "Emulator detected by adb." +# echo "Emulator detected by adb." -# Wait for the emulator to fully boot -BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') -while [[ "$BOOT_STATUS" != "1" ]]; do - echo "Waiting for the emulator to boot..." - sleep 5 - BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') -done +# # Wait for the emulator to fully boot +# BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') +# while [[ "$BOOT_STATUS" != "1" ]]; do +# echo "Waiting for the emulator to boot..." +# sleep 5 +# BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') +# done -echo "Emulator booted successfully!" +# echo "Emulator booted successfully!" From c39729a192a46e1a0e729c041af4eae369013ddb Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 16:08:44 +0530 Subject: [PATCH 333/362] remove sdk installation --- .../workflows/e2e-detox-android-template.yml | 75 +++++++++---------- 1 file changed, 34 insertions(+), 41 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index c81741fc22d..d6766e3c785 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -174,55 +174,48 @@ jobs: - name: Install Detox Dependencies run: cd detox && npm i - - name: Install Java - uses: actions/setup-java@v4 - with: - java-version: "17" - distribution: "adopt" - cache: "gradle" - - - name: Download and Install Android SDK - run: | - # Create a directory for Android SDK - mkdir -p $HOME/android-sdk + # - name: Download and Install Android SDK + # run: | + # # Create a directory for Android SDK + # mkdir -p $HOME/android-sdk - # Download the SDK tools - curl https://dl.google.com/android/repository/commandlinetools-mac-8092744_latest.zip -o commandlinetools.zip + # # Download the SDK tools + # curl https://dl.google.com/android/repository/commandlinetools-mac-8092744_latest.zip -o commandlinetools.zip - # Unzip the SDK tools into a temp directory - unzip commandlinetools.zip -d $HOME/android-sdk/temp-cmdline-tools + # # Unzip the SDK tools into a temp directory + # unzip commandlinetools.zip -d $HOME/android-sdk/temp-cmdline-tools - # Create the final directory for cmdline-tools - mkdir -p $HOME/android-sdk/cmdline-tools/latest + # # Create the final directory for cmdline-tools + # mkdir -p $HOME/android-sdk/cmdline-tools/latest - # Move the extracted files to the 'latest' directory - mv $HOME/android-sdk/temp-cmdline-tools/cmdline-tools/* $HOME/android-sdk/cmdline-tools/latest + # # Move the extracted files to the 'latest' directory + # mv $HOME/android-sdk/temp-cmdline-tools/cmdline-tools/* $HOME/android-sdk/cmdline-tools/latest - # Clean up the temp directory - rm -rf $HOME/android-sdk/temp-cmdline-tools + # # Clean up the temp directory + # rm -rf $HOME/android-sdk/temp-cmdline-tools - # Accept licenses and install SDK components - yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses --sdk_root=$HOME/android-sdk + # # Accept licenses and install SDK components + # yes | $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses --sdk_root=$HOME/android-sdk - # Install Platform tools - $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --install "platform-tools" + # # Install Platform tools + # $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --install "platform-tools" - - name: Set up Android SDK environment - run: | - # Set the correct SDK root paths - ANDROID_HOME=$HOME/android-sdk - ANDROID_SDK_ROOT=$HOME/android-sdk - PATH=$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$ANDROID_HOME/cmdline-tools/latest/bin:$PATH - - # Log the current paths for debugging - echo "ANDROID_HOME: $ANDROID_HOME" - echo "ANDROID_SDK_ROOT: $ANDROID_SDK_ROOT" - echo "PATH: $PATH" - - # Export the environment variables to $GITHUB_ENV - echo "ANDROID_HOME=$ANDROID_HOME" >> $GITHUB_ENV - echo "ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT" >> $GITHUB_ENV - echo "PATH=$PATH" >> $GITHUB_ENV + # - name: Set up Android SDK environment + # run: | + # # Set the correct SDK root paths + # ANDROID_HOME=$HOME/android-sdk + # ANDROID_SDK_ROOT=$HOME/android-sdk + # PATH=$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$ANDROID_HOME/cmdline-tools/latest/bin:$PATH + + # # Log the current paths for debugging + # echo "ANDROID_HOME: $ANDROID_HOME" + # echo "ANDROID_SDK_ROOT: $ANDROID_SDK_ROOT" + # echo "PATH: $PATH" + + # # Export the environment variables to $GITHUB_ENV + # echo "ANDROID_HOME=$ANDROID_HOME" >> $GITHUB_ENV + # echo "ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT" >> $GITHUB_ENV + # echo "PATH=$PATH" >> $GITHUB_ENV - name: Create AVD run : | From c03e8470d08d948f72f6ac267b51e139b3973d64 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 20:32:32 +0530 Subject: [PATCH 334/362] sdkmanager path --- .github/workflows/e2e-detox-android-template.yml | 1 + detox/create_android_emulator.sh | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index d6766e3c785..c7a0b155b16 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -219,6 +219,7 @@ jobs: - name: Create AVD run : | + echo "SDK_MANAGER_PATH="/usr/local/lib/android/tools/bin/sdkmanager" >> $GITHUB_ENV cd detox npm run e2e:android-create-emulator diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 90fdde13da9..e92747cfa00 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -30,10 +30,13 @@ fi SYSTEM_IMAGE="system-images;android-${SDK_VERSION};default;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed -sdkmanager --install "platforms;android-${SDK_VERSION}" -sdkmanager --install "$SYSTEM_IMAGE" -sdkmanager --install "platform-tools" -sdkmanager --install "emulator" +echo $ANDROID_HOME +echo $ANDROID_SDK_ROOT + +$SDK_MANAGER_PATH --install "platforms;android-${SDK_VERSION}" +$SDK_MANAGER_PATH --install "$SYSTEM_IMAGE" +$SDK_MANAGER_PATH --install "platform-tools" +$SDK_MANAGER_PATH --install "emulator" # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel' From 45f790109049b34c85e77385ef017fdad188ea54 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 20:37:48 +0530 Subject: [PATCH 335/362] sdkmanager path --- .github/workflows/e2e-detox-android-template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index c7a0b155b16..cf1a53e2255 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -219,7 +219,7 @@ jobs: - name: Create AVD run : | - echo "SDK_MANAGER_PATH="/usr/local/lib/android/tools/bin/sdkmanager" >> $GITHUB_ENV + echo "SDK_MANAGER_PATH=/usr/local/lib/android/tools/bin/sdkmanager" >> $GITHUB_ENV cd detox npm run e2e:android-create-emulator From 62a0ced3e91ab105ef77f1bc6625f267dbb9344b Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 20:48:54 +0530 Subject: [PATCH 336/362] sdkmanager path --- .github/workflows/e2e-detox-android-template.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index cf1a53e2255..650081bafea 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -200,8 +200,10 @@ jobs: # # Install Platform tools # $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager --install "platform-tools" - # - name: Set up Android SDK environment - # run: | + - name: Set up Android SDK environment + run: | + echo "SDK_MANAGER_PATH=/usr/local/lib/android/tools/bin/sdkmanager" >> $GITHUB_ENV + # # Set the correct SDK root paths # ANDROID_HOME=$HOME/android-sdk # ANDROID_SDK_ROOT=$HOME/android-sdk @@ -219,7 +221,6 @@ jobs: - name: Create AVD run : | - echo "SDK_MANAGER_PATH=/usr/local/lib/android/tools/bin/sdkmanager" >> $GITHUB_ENV cd detox npm run e2e:android-create-emulator From f7e23cb3abf4fa85e58c8c459d50e21ffa9613ba Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 20:57:01 +0530 Subject: [PATCH 337/362] sdkmanager path --- .github/workflows/e2e-detox-android-template.yml | 3 ++- detox/create_android_emulator.sh | 10 ++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 650081bafea..0fef70665cb 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -202,7 +202,8 @@ jobs: - name: Set up Android SDK environment run: | - echo "SDK_MANAGER_PATH=/usr/local/lib/android/tools/bin/sdkmanager" >> $GITHUB_ENV + brew install sdkmanager + which sdkmanager # # Set the correct SDK root paths # ANDROID_HOME=$HOME/android-sdk diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index e92747cfa00..491e98daea3 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -30,13 +30,11 @@ fi SYSTEM_IMAGE="system-images;android-${SDK_VERSION};default;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed -echo $ANDROID_HOME -echo $ANDROID_SDK_ROOT -$SDK_MANAGER_PATH --install "platforms;android-${SDK_VERSION}" -$SDK_MANAGER_PATH --install "$SYSTEM_IMAGE" -$SDK_MANAGER_PATH --install "platform-tools" -$SDK_MANAGER_PATH --install "emulator" +sdkmanager --install "platforms;android-${SDK_VERSION}" +sdkmanager --install "$SYSTEM_IMAGE" +sdkmanager --install "platform-tools" +sdkmanager --install "emulator" # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel' From 7ceafe4a0b6a3323550e26db50fd65562303d79c Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 21:13:31 +0530 Subject: [PATCH 338/362] sdkmanager path --- .../workflows/e2e-detox-android-template.yml | 1 - detox/create_android_emulator.sh | 29 +++++++++---------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 0fef70665cb..6547b0234f4 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -202,7 +202,6 @@ jobs: - name: Set up Android SDK environment run: | - brew install sdkmanager which sdkmanager # # Set the correct SDK root paths diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 491e98daea3..d85ca196494 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -12,25 +12,25 @@ NAME="detox_pixel_4_xl_api_${SDK_VERSION}" # Check if the AVD already exists if emulator -list-avds | grep -q $NAME; then - echo "'${NAME}' Android virtual device already exists. Deleting it now..." - avdmanager delete avd -n $NAME - echo "'${NAME}' has been deleted." + echo "'${NAME}' Android virtual device already exists. Deleting it now..." + avdmanager delete avd -n $NAME + echo "'${NAME}' has been deleted." fi # Define the correct CPU architecture and system image path CPU_ARCH_FAMILY='' CPU_ARCH='' if [[ $(uname -p) == 'arm' ]]; then - CPU_ARCH_FAMILY=arm64-v8a - CPU_ARCH=arm64 + CPU_ARCH_FAMILY=arm64-v8a + CPU_ARCH=arm64 else - CPU_ARCH_FAMILY=x86_64 - CPU_ARCH=x86_64 + CPU_ARCH_FAMILY=x86_64 + CPU_ARCH=x86_64 fi + SYSTEM_IMAGE="system-images;android-${SDK_VERSION};default;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed - sdkmanager --install "platforms;android-${SDK_VERSION}" sdkmanager --install "$SYSTEM_IMAGE" sdkmanager --install "platform-tools" @@ -41,14 +41,13 @@ avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel' # Copy predefined config and skin mkdir -p android_emulator/ - cp -r android_emulator/ $NAME/ -sed -i -e "s|AvdId = change_avd_id|AvdId = ${NAME}|g" $NAME/config.ini -sed -i -e "s|avd.ini.displayname = change_avd_displayname|avd.ini.displayname = Detox Pixel 4 XL API ${SDK_VERSION}|g" $NAME/config.ini -sed -i -e "s|abi.type = change_type|abi.type = ${CPU_ARCH_FAMILY}|g" $NAME/config.ini -sed -i -e "s|hw.cpu.arch = change_cpu_arch|hw.cpu.arch = ${CPU_ARCH}|g" $NAME/config.ini -sed -i -e "s|image.sysdir.1 = change_to_image_sysdir/|image.sysdir.1 = system-images/android-${SDK_VERSION}/default/${CPU_ARCH_FAMILY}/|g" $NAME/config.ini -sed -i -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = $(pwd)/${NAME}/pixel_4_xl_skin|g" $NAME/config.ini +sed -i '' -e "s|AvdId = change_avd_id|AvdId = ${NAME}|g" $NAME/config.ini +sed -i '' -e "s|avd.ini.displayname = change_avd_displayname|avd.ini.displayname = Detox Pixel 4 XL API ${SDK_VERSION}|g" $NAME/config.ini +sed -i '' -e "s|abi.type = change_type|abi.type = ${CPU_ARCH_FAMILY}|g" $NAME/config.ini +sed -i '' -e "s|hw.cpu.arch = change_cpu_arch|hw.cpu.arch = ${CPU_ARCH}|g" $NAME/config.ini +sed -i '' -e "s|image.sysdir.1 = change_to_image_sysdir/|image.sysdir.1 = system-images/android-${SDK_VERSION}/default/${CPU_ARCH_FAMILY}/|g" $NAME/config.ini +sed -i '' -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = $(pwd)/${NAME}/pixel_4_xl_skin|g" $NAME/config.ini echo "Android virtual device successfully created: ${NAME}" From 9afb801f90df9a4168ecceadafe0c991ae96b8f9 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 22:46:43 +0530 Subject: [PATCH 339/362] locate sdkmanager --- .github/workflows/e2e-detox-android-template.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 6547b0234f4..ccf77b6cc1e 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -202,7 +202,10 @@ jobs: - name: Set up Android SDK environment run: | - which sdkmanager + echo $ANDROID_HOME + echo $ANDROID_SDK_ROOT + find $ANDROID_HOME -name sdkmanager + # # Set the correct SDK root paths # ANDROID_HOME=$HOME/android-sdk From 1d80f4d02dbd42481667a8ab01ea5e2da03bd95a Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 23:02:15 +0530 Subject: [PATCH 340/362] setup sdkpath --- .github/workflows/e2e-detox-android-template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index ccf77b6cc1e..ba764de0165 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -205,7 +205,7 @@ jobs: echo $ANDROID_HOME echo $ANDROID_SDK_ROOT find $ANDROID_HOME -name sdkmanager - + echo "PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$PATH" >> $GITHUB_ENV # # Set the correct SDK root paths # ANDROID_HOME=$HOME/android-sdk From e857d2642b91959407cac1593f0ce4ce46db09da Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 23:12:34 +0530 Subject: [PATCH 341/362] boot device --- detox/create_android_emulator.sh | 58 +++++++++++++++----------------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index d85ca196494..a4c966ecdfc 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -51,42 +51,38 @@ sed -i '' -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = echo "Android virtual device successfully created: ${NAME}" -# echo "*****************************************" -# which emulator -# echo "*****************************************" +# Start the emulator in headless mode and log output +nohup emulator -avd $NAME -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose > emulator.log 2>&1 & -# # Start the emulator in headless mode and log output -# nohup emulator -avd $NAME -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose > emulator.log 2>&1 & +sleep 30 # Adjust based on emulator startup time -# sleep 30 # Adjust based on emulator startup time +# Output the emulator logs for debugging +cat emulator.log -# # Output the emulator logs for debugging -# cat emulator.log +# Start adb server +adb start-server -# # Start adb server -# adb start-server +# Wait for adb to detect the emulator +echo "Waiting for the emulator to be detected by adb..." +adb_devices=$(adb devices | grep emulator | wc -l | xargs) -# # Wait for adb to detect the emulator -# echo "Waiting for the emulator to be detected by adb..." -# adb_devices=$(adb devices | grep emulator | wc -l | xargs) +# Retry until the emulator is detected +while [[ "$adb_devices" -eq "0" ]]; do + echo "Waiting for adb to detect the emulator..." + sleep 10 # Increased wait time for adb to detect the device + adb start-server # Ensure adb server is running + adb devices # List devices + adb_devices=$(adb devices | grep emulator | wc -l | xargs) +done -# # Retry until the emulator is detected -# while [[ "$adb_devices" -eq "0" ]]; do -# echo "Waiting for adb to detect the emulator..." -# sleep 10 # Increased wait time for adb to detect the device -# adb start-server # Ensure adb server is running -# adb devices # List devices -# adb_devices=$(adb devices | grep emulator | wc -l | xargs) -# done +echo "Emulator detected by adb." -# echo "Emulator detected by adb." +# Wait for the emulator to fully boot +BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') +while [[ "$BOOT_STATUS" != "1" ]]; do + echo "Waiting for the emulator to boot..." + sleep 5 + BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') +done -# # Wait for the emulator to fully boot -# BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') -# while [[ "$BOOT_STATUS" != "1" ]]; do -# echo "Waiting for the emulator to boot..." -# sleep 5 -# BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') -# done - -# echo "Emulator booted successfully!" +echo "Emulator booted successfully!" From 88ffc7aad7ed9574b6919cc79cb5266972725b99 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 23:28:03 +0530 Subject: [PATCH 342/362] add emulator to the path --- .github/workflows/e2e-detox-android-template.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index ba764de0165..8caf89c4ce4 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -203,9 +203,8 @@ jobs: - name: Set up Android SDK environment run: | echo $ANDROID_HOME - echo $ANDROID_SDK_ROOT - find $ANDROID_HOME -name sdkmanager - echo "PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$PATH" >> $GITHUB_ENV + find $ANDROID_HOME -name emulator + echo "PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/emulator:$PATH" >> $GITHUB_ENV # # Set the correct SDK root paths # ANDROID_HOME=$HOME/android-sdk From 16beb8309bbfa0d73053b3fe7c6efcecc2590343 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Mon, 9 Sep 2024 23:28:27 +0530 Subject: [PATCH 343/362] add emulator to the path --- detox/create_android_emulator.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index a4c966ecdfc..9dc3ad2dab3 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -33,8 +33,6 @@ SYSTEM_IMAGE="system-images;android-${SDK_VERSION};default;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed sdkmanager --install "platforms;android-${SDK_VERSION}" sdkmanager --install "$SYSTEM_IMAGE" -sdkmanager --install "platform-tools" -sdkmanager --install "emulator" # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel' From 8fdbab4e35aee2f496ae301f70316831f2811b2f Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 10 Sep 2024 00:00:48 +0530 Subject: [PATCH 344/362] boot emu --- detox/create_android_emulator.sh | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 9dc3ad2dab3..6f1e2d53486 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -50,7 +50,7 @@ sed -i '' -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = echo "Android virtual device successfully created: ${NAME}" # Start the emulator in headless mode and log output -nohup emulator -avd $NAME -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -verbose > emulator.log 2>&1 & +nohup emulator -avd $NAME -gpu swiftshader_indirect -verbose > emulator.log 2>&1 & sleep 30 # Adjust based on emulator startup time @@ -75,12 +75,11 @@ done echo "Emulator detected by adb." -# Wait for the emulator to fully boot -BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') -while [[ "$BOOT_STATUS" != "1" ]]; do - echo "Waiting for the emulator to boot..." - sleep 5 - BOOT_STATUS=$(adb shell getprop sys.boot_completed | tr -d '\r') +echo 'Waiting for the emulator to boot...' +boot_completed=false +while [ "$boot_completed" != "1" ]; do + sleep 5 + boot_completed=$(adb shell getprop sys.boot_completed 2>/dev/null | tr -d '\r') + echo "Boot status: $boot_completed" done - -echo "Emulator booted successfully!" +echo 'Emulator fully booted.' From 5b1ea857081caf468dfadbeb31e1907093c5d43c Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 10 Sep 2024 00:13:21 +0530 Subject: [PATCH 345/362] wait longer --- detox/create_android_emulator.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 6f1e2d53486..cfee2ad4a34 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -52,7 +52,7 @@ echo "Android virtual device successfully created: ${NAME}" # Start the emulator in headless mode and log output nohup emulator -avd $NAME -gpu swiftshader_indirect -verbose > emulator.log 2>&1 & -sleep 30 # Adjust based on emulator startup time +sleep 180 # Adjust based on emulator startup time # Output the emulator logs for debugging cat emulator.log From 958c9f5664d2521f6617b745d5008322660d0dbc Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 10 Sep 2024 01:03:29 +0530 Subject: [PATCH 346/362] increase cores --- detox/create_android_emulator.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index cfee2ad4a34..e2dc7328052 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -50,9 +50,9 @@ sed -i '' -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = echo "Android virtual device successfully created: ${NAME}" # Start the emulator in headless mode and log output -nohup emulator -avd $NAME -gpu swiftshader_indirect -verbose > emulator.log 2>&1 & +nohup emulator -avd $NAME -gpu swiftshader_indirect -verbose -cores 4 -memory 4096 > emulator.log 2>&1 & -sleep 180 # Adjust based on emulator startup time +sleep 60 # Adjust based on emulator startup time # Output the emulator logs for debugging cat emulator.log From ddb0c3c4786a3ced8265aba7f63b81abc9e6a7e1 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 10 Sep 2024 01:38:41 +0530 Subject: [PATCH 347/362] handle boot gracefully --- detox/create_android_emulator.sh | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index e2dc7328052..3ee6d1bb266 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -77,9 +77,24 @@ echo "Emulator detected by adb." echo 'Waiting for the emulator to boot...' boot_completed=false -while [ "$boot_completed" != "1" ]; do - sleep 5 - boot_completed=$(adb shell getprop sys.boot_completed 2>/dev/null | tr -d '\r') - echo "Boot status: $boot_completed" +max_attempts=30 +attempt=0 + +while [ "$boot_completed" != "1" ] && [ $attempt -lt $max_attempts ]; do + boot_completed=$(adb shell getprop sys.boot_completed 2>&1 | tr -d '\r') + if [ $? -ne 0 ] || [ -z "$boot_completed" ]; then + echo "ADB not responding or device not found. Retrying..." + sleep 10 + elif [ "$boot_completed" != "1" ]; then + echo "Waiting for device to boot... Attempt $((attempt+1))/$max_attempts" + sleep 10 + fi + attempt=$((attempt+1)) done -echo 'Emulator fully booted.' + +if [ "$boot_completed" = "1" ]; then + echo "Device booted successfully!" +else + echo "Device boot timed out or failed." + exit 1 +fi From f6ed5f5e771c9eedfa24f815436b9667018d9ca5 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 10 Sep 2024 01:50:18 +0530 Subject: [PATCH 348/362] improve boot --- .../workflows/e2e-detox-android-template.yml | 4 +- detox/create_android_emulator.sh | 80 +++++++++---------- 2 files changed, 43 insertions(+), 41 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 8caf89c4ce4..dbeee4f4189 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -276,7 +276,9 @@ jobs: run: ls -la android/app/build/outputs/apk - name: Cleanup - run: rm android/app/build/outputs/apk/artifact.zip + run: | + find android/app/build -type f + rm android/app/build/outputs/apk/artifact.zip - name: Run Android Detox E2E Tests on macOS run: | diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 3ee6d1bb266..827151e4b12 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -49,52 +49,52 @@ sed -i '' -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = echo "Android virtual device successfully created: ${NAME}" -# Start the emulator in headless mode and log output -nohup emulator -avd $NAME -gpu swiftshader_indirect -verbose -cores 4 -memory 4096 > emulator.log 2>&1 & +# # Start the emulator in headless mode and log output +# nohup emulator -avd $NAME -gpu swiftshader_indirect -verbose -cores 4 -memory 4096 > emulator.log 2>&1 & -sleep 60 # Adjust based on emulator startup time +# sleep 60 # Adjust based on emulator startup time -# Output the emulator logs for debugging -cat emulator.log +# # Output the emulator logs for debugging +# cat emulator.log -# Start adb server -adb start-server +# # Start adb server +# adb start-server -# Wait for adb to detect the emulator -echo "Waiting for the emulator to be detected by adb..." -adb_devices=$(adb devices | grep emulator | wc -l | xargs) +# # Wait for adb to detect the emulator +# echo "Waiting for the emulator to be detected by adb..." +# adb_devices=$(adb devices | grep emulator | wc -l | xargs) -# Retry until the emulator is detected -while [[ "$adb_devices" -eq "0" ]]; do - echo "Waiting for adb to detect the emulator..." - sleep 10 # Increased wait time for adb to detect the device - adb start-server # Ensure adb server is running - adb devices # List devices - adb_devices=$(adb devices | grep emulator | wc -l | xargs) +# # Retry until the emulator is detected +# while [[ "$adb_devices" -eq "0" ]]; do +# echo "Waiting for adb to detect the emulator..." +# sleep 10 # Increased wait time for adb to detect the device +# adb start-server # Ensure adb server is running +# adb devices # List devices +# adb_devices=$(adb devices | grep emulator | wc -l | xargs) +# done + +# echo "Emulator detected by adb." + +echo "Starting emulator..." +emulator -avd $NAME -verbose -show-kernel -gpu swiftshader_indirect -no-snapshot & + +echo "Waiting for ADB to detect the emulator..." +adb wait-for-device + +echo "Waiting for boot to complete..." +while [ "$(adb shell getprop sys.boot_completed 2>/dev/null)" != "1" ]; do + sleep 5 done -echo "Emulator detected by adb." - -echo 'Waiting for the emulator to boot...' -boot_completed=false -max_attempts=30 -attempt=0 - -while [ "$boot_completed" != "1" ] && [ $attempt -lt $max_attempts ]; do - boot_completed=$(adb shell getprop sys.boot_completed 2>&1 | tr -d '\r') - if [ $? -ne 0 ] || [ -z "$boot_completed" ]; then - echo "ADB not responding or device not found. Retrying..." - sleep 10 - elif [ "$boot_completed" != "1" ]; then - echo "Waiting for device to boot... Attempt $((attempt+1))/$max_attempts" - sleep 10 - fi - attempt=$((attempt+1)) +echo "Checking for critical services..." +while [ "$(adb shell getprop init.svc.bootanim 2>/dev/null)" != "stopped" ]; do + sleep 2 done -if [ "$boot_completed" = "1" ]; then - echo "Device booted successfully!" -else - echo "Device boot timed out or failed." - exit 1 -fi +echo "Device booted successfully!" + +# Optional: Install your app +echo "Installing app..." +adb install path/to/your/app.apk + +echo "Setup complete. Ready for testing." From b8253356519bfc44eb4b09919247379f701f3b89 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 10 Sep 2024 02:30:03 +0530 Subject: [PATCH 349/362] improve boot --- detox/create_android_emulator.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 827151e4b12..cf4e0b0270f 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -93,8 +93,8 @@ done echo "Device booted successfully!" -# Optional: Install your app -echo "Installing app..." -adb install path/to/your/app.apk +# # Optional: Install your app +# echo "Installing app..." +# adb install path/to/your/app.apk echo "Setup complete. Ready for testing." From 0b991b984540b301c09b6de167218e510e58f227 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 10 Sep 2024 02:55:54 +0530 Subject: [PATCH 350/362] test running emulator --- .../workflows/e2e-detox-android-template.yml | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index dbeee4f4189..0b09dc3b86a 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -221,11 +221,33 @@ jobs: # echo "ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT" >> $GITHUB_ENV # echo "PATH=$PATH" >> $GITHUB_ENV - - name: Create AVD - run : | - cd detox - npm run e2e:android-create-emulator - + # - name: Create AVD + # run : | + # cd detox + # npm run e2e:android-create-emulator + + - name: Install Android SDK and dependencies + run: | + echo "Installing Android SDK components" + sdkmanager --install 'platform-tools' 'platforms;android-31' 'build-tools;31.0.0' 'system-images;android-31;google_apis;x86_64' 'emulator' + sdkmanager --licenses + + - name: Create Android Emulator + run: | + echo "Creating Android emulator" + avdmanager create avd --name test_emulator --package 'system-images;android-31;google_apis;x86_64' --device "pixel_3" + + - name: Start Android Emulator + run: | + echo "Starting Android emulator" + nohup emulator -avd test_emulator -no-snapshot -no-window -noaudio -gpu swiftshader_indirect & + + - name: Wait for Android Emulator to boot + run: | + echo "Waiting for emulator to boot" + adb wait-for-device + adb shell input keyevent 82 + # - name: Install Android system image # run: | # $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "system-images;android-31;default;x86_64" From 82b59e2be28cbae49e52545109d0b9297442793d Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 10 Sep 2024 02:58:23 +0530 Subject: [PATCH 351/362] test running emulator --- .github/workflows/e2e-detox-android-template.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 0b09dc3b86a..477c2f3ed13 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -229,18 +229,18 @@ jobs: - name: Install Android SDK and dependencies run: | echo "Installing Android SDK components" - sdkmanager --install 'platform-tools' 'platforms;android-31' 'build-tools;31.0.0' 'system-images;android-31;google_apis;x86_64' 'emulator' + sdkmanager --install 'platform-tools' 'platforms;android-31' 'build-tools;31.0.0' 'system-images;android-31;default;x86_64' 'emulator' sdkmanager --licenses - name: Create Android Emulator run: | echo "Creating Android emulator" - avdmanager create avd --name test_emulator --package 'system-images;android-31;google_apis;x86_64' --device "pixel_3" + avdmanager create avd --name detox_pixel_4_xl_api_31 --package 'system-images;android-31;default;x86_64' --device "pixel_3" - name: Start Android Emulator run: | echo "Starting Android emulator" - nohup emulator -avd test_emulator -no-snapshot -no-window -noaudio -gpu swiftshader_indirect & + nohup emulator -avd detox_pixel_4_xl_api_31 -no-snapshot -no-window -noaudio -gpu swiftshader_indirect & - name: Wait for Android Emulator to boot run: | From 07ebe88523065122c4e9268a1eef42f950d6b51e Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 10 Sep 2024 03:07:50 +0530 Subject: [PATCH 352/362] test running emulator --- .github/workflows/e2e-detox-android-template.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 477c2f3ed13..259e3823bca 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -246,6 +246,22 @@ jobs: run: | echo "Waiting for emulator to boot" adb wait-for-device + boot_completed="" + # Poll emulator status until fully booted + while [ -z "$boot_completed" ]; do + boot_completed=$(adb shell getprop sys.boot_completed 2>&1 | tr -d '\r') + if [ "$boot_completed" == "1" ]; then + echo "Emulator booted successfully!" + else + echo "Waiting for boot to complete..." + sleep 5 + fi + done + echo "Emulator ready!" + + - name: Unlock the screen + run: | + echo "Unlocking the emulator screen" adb shell input keyevent 82 # - name: Install Android system image From 410580b971948e105dee0ec47d67966ca7fc0e8b Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 10 Sep 2024 03:47:54 +0530 Subject: [PATCH 353/362] test running emulator --- .../workflows/e2e-detox-android-template.yml | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 259e3823bca..96c391da871 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -229,19 +229,27 @@ jobs: - name: Install Android SDK and dependencies run: | echo "Installing Android SDK components" - sdkmanager --install 'platform-tools' 'platforms;android-31' 'build-tools;31.0.0' 'system-images;android-31;default;x86_64' 'emulator' - sdkmanager --licenses + $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install emulator + $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "system-images;android-28;default;x86_64" + "yes" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses - - name: Create Android Emulator - run: | - echo "Creating Android emulator" - avdmanager create avd --name detox_pixel_4_xl_api_31 --package 'system-images;android-31;default;x86_64' --device "pixel_3" + $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n detox_pixel_4_xl_api_31 -d pixel --package "system-images;android-28;default;x86_64" - - name: Start Android Emulator - run: | - echo "Starting Android emulator" nohup emulator -avd detox_pixel_4_xl_api_31 -no-snapshot -no-window -noaudio -gpu swiftshader_indirect & + # sdkmanager --install 'platform-tools' 'platforms;android-31' 'build-tools;31.0.0' 'system-images;android-31;default;x86_64' 'emulator' + # sdkmanager --licenses +# ********************************************************* + # - name: Create Android Emulator + # run: | + # echo "Creating Android emulator" + # avdmanager create avd --name detox_pixel_4_xl_api_31 --package 'system-images;android-31;default;x86_64' --device "pixel_3" + + # - name: Start Android Emulator + # run: | + # echo "Starting Android emulator" + # nohup emulator -avd detox_pixel_4_xl_api_31 -no-snapshot -no-window -noaudio -gpu swiftshader_indirect & + - name: Wait for Android Emulator to boot run: | echo "Waiting for emulator to boot" @@ -263,7 +271,7 @@ jobs: run: | echo "Unlocking the emulator screen" adb shell input keyevent 82 - +# ********************************************************* # - name: Install Android system image # run: | # $HOME/android-sdk/cmdline-tools/latest/bin/sdkmanager "system-images;android-31;default;x86_64" From c7cb9041699157d5e5a27ea04e13b5f915065d32 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 10 Sep 2024 03:59:40 +0530 Subject: [PATCH 354/362] test running emulator --- .github/workflows/e2e-detox-android-template.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 96c391da871..39b7093c06a 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -230,10 +230,10 @@ jobs: run: | echo "Installing Android SDK components" $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install emulator - $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "system-images;android-28;default;x86_64" - "yes" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses + yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses + $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "system-images;android-31;default;x86_64" - $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n detox_pixel_4_xl_api_31 -d pixel --package "system-images;android-28;default;x86_64" + $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n detox_pixel_4_xl_api_31 -d pixel --package "system-images;android-31;default;x86_64" nohup emulator -avd detox_pixel_4_xl_api_31 -no-snapshot -no-window -noaudio -gpu swiftshader_indirect & From c7e8a6fd0487e8a9027974f3db044335ea34298e Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 17 Sep 2024 14:45:57 +0530 Subject: [PATCH 355/362] test running e2e tests --- .gitignore | 27 +++++++++++++++++++ detox/create_android_emulator.sh | 46 +++++++++++++++++++++++++++++--- 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 600fc0dfad0..3a47183c2fb 100644 --- a/.gitignore +++ b/.gitignore @@ -115,3 +115,30 @@ launch.json # Temporary files created by Metro to check the health of the file watcher .metro-health-check* + +libraries/**/**/build +libraries/**/**/.build + +# Android sounds +android/app/src/main/res/raw/* +mobile-artifacts/* +# Bundle artifact +*.jsbundle +.bundle + +#editor-settings +.vscode +.scannerwork +launch.json + +# Notice.txt generation +!build/notice-file + +# Temporary files created by Metro to check the health of the file watcher +.metro-health-check* + +libraries/**/**/build +libraries/**/**/.build + +# Android sounds +android/app/src/main/res/raw/* diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index cf4e0b0270f..2d53a1dcb2f 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -1,3 +1,43 @@ +# #!/bin/bash + +# # Reference: Download Android (AOSP) Emulators - https://github.com/wix/Detox/blob/master/docs/guide/android-dev-env.md#android-aosp-emulators +# # sdkmanager "system-images;android-31;default;arm64-v8a" +# # sdkmanager --licenses + +# set -ex +# set -o pipefail + +# SDK_VERSION=31 +# NAME="detox_pixel_4_xl_api_${SDK_VERSION}" + +# if emulator -list-avds | grep -q $NAME; then +# echo "'${NAME}' Android virtual device already exists." +# else +# CPU_ARCH_FAMILY='' +# CPU_ARCH='' +# if [[ $(uname -p) == 'arm' ]]; then +# CPU_ARCH_FAMILY=arm64-v8a +# CPU_ARCH=arm64 +# else +# CPU_ARCH_FAMILY=x86_64 +# CPU_ARCH=x86_64 +# fi + +# # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder +# avdmanager create avd -n $NAME -k "system-images;android-${SDK_VERSION};default;${CPU_ARCH_FAMILY}" -p $NAME -d 'pixel' + +# # Copy predefined config and skin +# cp -r android_emulator/ $NAME/ +# sed -i -e "s|AvdId = change_avd_id|AvdId = ${NAME}|g" $NAME/config.ini +# sed -i -e "s|avd.ini.displayname = change_avd_displayname|avd.ini.displayname = Detox Pixel 4 XL API ${SDK_VERSION}|g" $NAME/config.ini +# sed -i -e "s|abi.type = change_type|abi.type = ${CPU_ARCH_FAMILY}|g" $NAME/config.ini +# sed -i -e "s|hw.cpu.arch = change_cpu_arch|hw.cpu.arch = ${CPU_ARCH}|g" $NAME/config.ini +# sed -i -e "s|image.sysdir.1 = change_to_image_sysdir/|image.sysdir.1 = system-images/android-${SDK_VERSION}/default/${CPU_ARCH_FAMILY}/|g" $NAME/config.ini +# sed -i -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = $(pwd)/${NAME}/pixel_4_xl_skin|g" $NAME/config.ini + +# echo "Android virtual device successfully created: ${NAME}" +# fi + #!/bin/bash # Reference: Download Android (AOSP) Emulators - https://github.com/wix/Detox/blob/master/docs/guide/android-dev-env.md#android-aosp-emulators @@ -28,7 +68,7 @@ else CPU_ARCH=x86_64 fi -SYSTEM_IMAGE="system-images;android-${SDK_VERSION};default;${CPU_ARCH_FAMILY}" +SYSTEM_IMAGE="system-images;android-${SDK_VERSION};google_apis;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed sdkmanager --install "platforms;android-${SDK_VERSION}" @@ -44,7 +84,7 @@ sed -i '' -e "s|AvdId = change_avd_id|AvdId = ${NAME}|g" $NAME/config.ini sed -i '' -e "s|avd.ini.displayname = change_avd_displayname|avd.ini.displayname = Detox Pixel 4 XL API ${SDK_VERSION}|g" $NAME/config.ini sed -i '' -e "s|abi.type = change_type|abi.type = ${CPU_ARCH_FAMILY}|g" $NAME/config.ini sed -i '' -e "s|hw.cpu.arch = change_cpu_arch|hw.cpu.arch = ${CPU_ARCH}|g" $NAME/config.ini -sed -i '' -e "s|image.sysdir.1 = change_to_image_sysdir/|image.sysdir.1 = system-images/android-${SDK_VERSION}/default/${CPU_ARCH_FAMILY}/|g" $NAME/config.ini +sed -i '' -e "s|image.sysdir.1 = change_to_image_sysdir/|image.sysdir.1 = system-images/android-${SDK_VERSION}/google_apis/${CPU_ARCH_FAMILY}/|g" $NAME/config.ini sed -i '' -e "s|skin.path = change_to_absolute_path/pixel_4_xl_skin|skin.path = $(pwd)/${NAME}/pixel_4_xl_skin|g" $NAME/config.ini echo "Android virtual device successfully created: ${NAME}" @@ -95,6 +135,6 @@ echo "Device booted successfully!" # # Optional: Install your app # echo "Installing app..." -# adb install path/to/your/app.apk +# adb install ../ echo "Setup complete. Ready for testing." From aa5b3db170adaf9b662c71411e347093d3e3ff24 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 17 Sep 2024 14:54:55 +0530 Subject: [PATCH 356/362] test running e2e tests --- .../workflows/e2e-detox-android-template.yml | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/.github/workflows/e2e-detox-android-template.yml b/.github/workflows/e2e-detox-android-template.yml index 39b7093c06a..2c28c74f7c7 100644 --- a/.github/workflows/e2e-detox-android-template.yml +++ b/.github/workflows/e2e-detox-android-template.yml @@ -221,24 +221,24 @@ jobs: # echo "ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT" >> $GITHUB_ENV # echo "PATH=$PATH" >> $GITHUB_ENV - # - name: Create AVD - # run : | - # cd detox - # npm run e2e:android-create-emulator + - name: Create AVD + run : | + cd detox + npm run e2e:android-create-emulator - - name: Install Android SDK and dependencies - run: | - echo "Installing Android SDK components" - $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install emulator - yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses - $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "system-images;android-31;default;x86_64" + # - name: Install Android SDK and dependencies + # run: | + # echo "Installing Android SDK components" + # $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install emulator + # yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses + # $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "system-images;android-31;default;x86_64" - $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n detox_pixel_4_xl_api_31 -d pixel --package "system-images;android-31;default;x86_64" + # $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n detox_pixel_4_xl_api_31 -d pixel --package "system-images;android-31;default;x86_64" - nohup emulator -avd detox_pixel_4_xl_api_31 -no-snapshot -no-window -noaudio -gpu swiftshader_indirect & + # nohup emulator -avd detox_pixel_4_xl_api_31 -no-snapshot -no-window -noaudio -gpu swiftshader_indirect & - # sdkmanager --install 'platform-tools' 'platforms;android-31' 'build-tools;31.0.0' 'system-images;android-31;default;x86_64' 'emulator' - # sdkmanager --licenses + # # sdkmanager --install 'platform-tools' 'platforms;android-31' 'build-tools;31.0.0' 'system-images;android-31;default;x86_64' 'emulator' + # # sdkmanager --licenses # ********************************************************* # - name: Create Android Emulator # run: | @@ -250,27 +250,27 @@ jobs: # echo "Starting Android emulator" # nohup emulator -avd detox_pixel_4_xl_api_31 -no-snapshot -no-window -noaudio -gpu swiftshader_indirect & - - name: Wait for Android Emulator to boot - run: | - echo "Waiting for emulator to boot" - adb wait-for-device - boot_completed="" - # Poll emulator status until fully booted - while [ -z "$boot_completed" ]; do - boot_completed=$(adb shell getprop sys.boot_completed 2>&1 | tr -d '\r') - if [ "$boot_completed" == "1" ]; then - echo "Emulator booted successfully!" - else - echo "Waiting for boot to complete..." - sleep 5 - fi - done - echo "Emulator ready!" - - - name: Unlock the screen - run: | - echo "Unlocking the emulator screen" - adb shell input keyevent 82 + # - name: Wait for Android Emulator to boot + # run: | + # echo "Waiting for emulator to boot" + # adb wait-for-device + # boot_completed="" + # # Poll emulator status until fully booted + # while [ -z "$boot_completed" ]; do + # boot_completed=$(adb shell getprop sys.boot_completed 2>&1 | tr -d '\r') + # if [ "$boot_completed" == "1" ]; then + # echo "Emulator booted successfully!" + # else + # echo "Waiting for boot to complete..." + # sleep 5 + # fi + # done + # echo "Emulator ready!" + + # - name: Unlock the screen + # run: | + # echo "Unlocking the emulator screen" + # adb shell input keyevent 82 # ********************************************************* # - name: Install Android system image # run: | From edf0114e679a4e6f5eab2d2b4384a517ef046061 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 17 Sep 2024 15:13:04 +0530 Subject: [PATCH 357/362] accept licenses in CI --- detox/create_android_emulator.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 2d53a1dcb2f..63930107e33 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -73,6 +73,7 @@ SYSTEM_IMAGE="system-images;android-${SDK_VERSION};google_apis;${CPU_ARCH_FAMILY # Install the system image if it's not already installed sdkmanager --install "platforms;android-${SDK_VERSION}" sdkmanager --install "$SYSTEM_IMAGE" +sdkmanager --licenses # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel' From a6eb366459ed70b6f471e4dd91c19e9e2fe04557 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 17 Sep 2024 15:21:30 +0530 Subject: [PATCH 358/362] accept licenses in CI --- detox/create_android_emulator.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 63930107e33..8d1b8441463 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -71,9 +71,9 @@ fi SYSTEM_IMAGE="system-images;android-${SDK_VERSION};google_apis;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed +sdkmanager --licenses sdkmanager --install "platforms;android-${SDK_VERSION}" sdkmanager --install "$SYSTEM_IMAGE" -sdkmanager --licenses # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel' From 739a81bf2ac81454eae838fb43a0b459417b71d1 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 17 Sep 2024 15:31:01 +0530 Subject: [PATCH 359/362] accept licenses in CI --- detox/create_android_emulator.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 8d1b8441463..b3a9cacab2e 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -71,7 +71,7 @@ fi SYSTEM_IMAGE="system-images;android-${SDK_VERSION};google_apis;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed -sdkmanager --licenses +yes | sdkmanager --licenses sdkmanager --install "platforms;android-${SDK_VERSION}" sdkmanager --install "$SYSTEM_IMAGE" From 05bda77617c62666031364e795b1b9645ea805ea Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 17 Sep 2024 15:40:38 +0530 Subject: [PATCH 360/362] accept licenses in CI --- detox/create_android_emulator.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index b3a9cacab2e..c663fb42e64 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -50,6 +50,8 @@ set -o pipefail SDK_VERSION=31 NAME="detox_pixel_4_xl_api_${SDK_VERSION}" +yes | sdkmanager --licenses + # Check if the AVD already exists if emulator -list-avds | grep -q $NAME; then echo "'${NAME}' Android virtual device already exists. Deleting it now..." @@ -71,7 +73,6 @@ fi SYSTEM_IMAGE="system-images;android-${SDK_VERSION};google_apis;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed -yes | sdkmanager --licenses sdkmanager --install "platforms;android-${SDK_VERSION}" sdkmanager --install "$SYSTEM_IMAGE" From df9cfc55aa326399e210a154b10972a25468e9a3 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 17 Sep 2024 19:47:08 +0530 Subject: [PATCH 361/362] test -1 --- detox/create_android_emulator.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index c663fb42e64..6db3d81c336 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -50,7 +50,6 @@ set -o pipefail SDK_VERSION=31 NAME="detox_pixel_4_xl_api_${SDK_VERSION}" -yes | sdkmanager --licenses # Check if the AVD already exists if emulator -list-avds | grep -q $NAME; then @@ -73,8 +72,9 @@ fi SYSTEM_IMAGE="system-images;android-${SDK_VERSION};google_apis;${CPU_ARCH_FAMILY}" # Install the system image if it's not already installed -sdkmanager --install "platforms;android-${SDK_VERSION}" +# sdkmanager --install "platforms;android-${SDK_VERSION}" sdkmanager --install "$SYSTEM_IMAGE" +sdkmanager --licenses # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel' From 445e4fe5d3fd637cfb09d551b973835bf9bee843 Mon Sep 17 00:00:00 2001 From: yasserfaraazkhan Date: Tue, 17 Sep 2024 20:15:47 +0530 Subject: [PATCH 362/362] test -2 --- detox/create_android_emulator.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detox/create_android_emulator.sh b/detox/create_android_emulator.sh index 6db3d81c336..54952777536 100755 --- a/detox/create_android_emulator.sh +++ b/detox/create_android_emulator.sh @@ -74,7 +74,7 @@ SYSTEM_IMAGE="system-images;android-${SDK_VERSION};google_apis;${CPU_ARCH_FAMILY # Install the system image if it's not already installed # sdkmanager --install "platforms;android-${SDK_VERSION}" sdkmanager --install "$SYSTEM_IMAGE" -sdkmanager --licenses +yes | sdkmanager --licenses # Create virtual device in a relative "detox_pixel_4_xl_api_${SDK_VERSION}" folder avdmanager create avd -n $NAME -k "$SYSTEM_IMAGE" -p $NAME -d 'pixel'