diff --git a/e2e/dl-wasms.sh b/e2e/dl-wasms.sh new file mode 100755 index 0000000000..5699566f80 --- /dev/null +++ b/e2e/dl-wasms.sh @@ -0,0 +1,17 @@ +#!/bin/bash -x + +NAMADA_DIR=".namada" +CHECKSUMS="${NAMADA_DIR}/checksums.json" +WASM="" +S3="https://namada-wasm-master.s3.eu-west-1.amazonaws.com" + +mkdir "${NAMADA_DIR}/wasm" + +while read -r line; +do + if [[ $line == *"wasm"* ]]; then + WASM=$(echo "$line" | sed -E "s/\".+\":\s\"//g" | sed -E "s/\".*//g"); + curl "${S3}/${WASM}" --output "${NAMADA_DIR}/wasm/${WASM}" + fi + +done < "$CHECKSUMS" diff --git a/e2e/genesis.toml b/e2e/genesis.toml index d045e61eae..e510464c98 100644 --- a/e2e/genesis.toml +++ b/e2e/genesis.toml @@ -41,6 +41,10 @@ Ester = "1000000" faucet = "9223372036854" "faucet.public_key" = "100" "validator-0.public_key" = "100" +TestA = "1000" +"TestA.public_key" = "1000" +TestB = "1000" +"TestB.public_key" = "1000" [token.BTC] address = "atest1v4ehgw36xdzryve5gsc52veeg5cnsv2yx5eygvp38qcrvd29xy6rys6p8yc5xvp4xfpy2v694wgwcp" @@ -136,9 +140,12 @@ vp = "vp_masp" [implicit.Ester] -[implicit.Test] +[established.TestA] address = "atest1d9khqw36xccyydp3xpznjvzrx3zrq3fexep5y33nxverqdz9xcc5ydeexgm52djrxvuyxsjr44hd2f" +[established.TestB] +address = "atest1d9khqw368qury3phx3prsvp4gezrssenxqmyxwpn8qmrqvpsg4znjdjp8ycry3p3g4p5vd6x66dnmw" + # Wasm VP definitions # Implicit VP diff --git a/e2e/package.json b/e2e/package.json index 1368ba6ccd..9ad886e8a9 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -11,9 +11,9 @@ "lint": "npx eslint src --ext .ts", "lint:fix": "yarn lint -- --fix", "lint:ci": "yarn lint --max-warnings 0", - "setup": "./setup-tests.sh", + "setup": "/setup-frontend.sh", "test": "jest --runInBand", - "test:watch": "jest --watch", + "test:watch": "jest --watch --runInBand", "e2e": "start-server-and-test setup http://localhost:3000 test" }, "dependencies": { @@ -21,13 +21,16 @@ }, "devDependencies": { "@types/jest": "^29.0.0", + "@types/node": "^20.4.2", "@types/puppeteer": "^7.0.4", "eslint": "^8.23.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-prettier": "^8.5.0", "eslint-import-resolver-typescript": "^3.5.1", + "http-server": "^14.1.1", "jest": "^29.0.2", "jest-puppeteer": "^9.0.0", - "puppeteer": "^20.8.2" + "puppeteer": "^20.8.2", + "terminate": "^2.6.1" } } diff --git a/e2e/setup-frontend.sh b/e2e/setup-frontend.sh new file mode 100755 index 0000000000..2885d75a47 --- /dev/null +++ b/e2e/setup-frontend.sh @@ -0,0 +1,29 @@ +#!/bin/bash -x +CHAIN_ID="dev-test.000000000000000000000" + +# Run the extension +cd ../apps/extension && \ + yarn clean:chrome && \ + export NODE_ENV=development; \ + export TARGET=chrome; \ + export REACT_APP_NAMADA_CHAIN_ID=${CHAIN_ID}; \ + export REACT_APP_NAMADA_URL=http://127.0.0.1:27657 && \ + npx webpack --watch & + +# Run the interface +cd ../namada-interface && \ + export NODE_ENV=development; \ + export REACT_APP_LOCAL=true; \ + export REACT_APP_NAMADA_CHAIN_ID=${CHAIN_ID}; \ + export REACT_APP_NAMADA_URL=http://127.0.0.1:27657 && \ + npx webpack --watch & + +cd ../../e2e + +npx http-server -p 8080 -c-1 ../apps/namada-interface/build + +# Sleep indefinitely +while :; do sleep 86400; done + +# Kill all processes on exit +trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT diff --git a/e2e/setup-namada.sh b/e2e/setup-namada.sh new file mode 100755 index 0000000000..2c01cb0141 --- /dev/null +++ b/e2e/setup-namada.sh @@ -0,0 +1,75 @@ +#!/bin/bash -x + +VERSION="v0.19.0" +CURRENT_VERSION="" +NAMADA_DIR=".namada" +NAMADA_BASE_DIR=".namada/basedir" + +# Read current version +CURRENT_VERSION_PATH="${NAMADA_DIR}/.version" +if test -f "$CURRENT_VERSION_PATH"; then + while read -r line; + do + CURRENT_VERSION=$line + + done < "$CURRENT_VERSION_PATH" +fi + +if [ "$CURRENT_VERSION" != "$VERSION" ]; then + # Download Namada binaries + FILENAME="namada-${VERSION}-Linux-x86_64.tar.gz" + curl --location --remote-header-name --remote-name https://github.com/anoma/namada/releases/download/${VERSION}/${FILENAME} + mkdir $NAMADA_DIR + tar -xzf ${FILENAME} --directory $NAMADA_DIR --strip-components 1 + rm -rf ${FILENAME} + + # Download wasm checksums + curl --location --remote-header-name --remote-name https://raw.githubusercontent.com/anoma/namada/${VERSION}/wasm/checksums.json + mv checksums.json "${NAMADA_DIR}/checksums.json" + + # Download wasms + CHECKSUMS="${NAMADA_DIR}/checksums.json" + WASM="" + S3="https://namada-wasm-master.s3.eu-west-1.amazonaws.com" + + rm -rf "${NAMADA_DIR}/wasm" + mkdir "${NAMADA_DIR}/wasm" + + while read -r line; + do + WASM=$(echo "$line" | sed -E "s/\".+\":\s\"//g" | sed -E "s/\".*//g"); + curl "${S3}/${WASM}" --output "${NAMADA_DIR}/wasm/${WASM}" + + done < "$CHECKSUMS" + + # Save version + echo "${VERSION}" > "${NAMADA_DIR}/.version" +fi + +# Clear the basedir +rm -rf $NAMADA_BASE_DIR + +"${NAMADA_DIR}/namadac" --base-dir $NAMADA_BASE_DIR utils init-network \ + --chain-prefix dev-test \ + --wasm-checksums-path "${NAMADA_DIR}/checksums.json" \ + --genesis-path genesis.toml \ + --dont-archive \ + --unsafe-dont-encrypt + +CONFIG="${NAMADA_BASE_DIR}/global-config.toml" +CHAIN_ID="" + +# Read CHAIN_ID from global-config.toml +while read -r line; +do + CHAIN_ID=$(echo "$line" | sed "s/default_chain_id = \"//g" | sed "s/\"//"); + +done < "$CONFIG" + +# Copy wasms +cp -f ${NAMADA_DIR}/wasm/*.wasm ${NAMADA_BASE_DIR}/${CHAIN_ID}/setup/validator-0/.namada/${CHAIN_ID}/wasm/ +cp -f ${NAMADA_DIR}/wasm/*.wasm ${NAMADA_BASE_DIR}/${CHAIN_ID}/wasm/ + +# Override envs - so we do not have to rebuild extension and app +find ../apps/extension/build/chrome -type f -exec sed -i -E "s/dev-test\..{21}/$CHAIN_ID/g" {} + +find ../apps/namada-interface/build -type f -exec sed -i -E "s/dev-test\..{21}/$CHAIN_ID/g" {} + diff --git a/e2e/setup-tests.sh b/e2e/setup-tests.sh deleted file mode 100755 index aa446e763e..0000000000 --- a/e2e/setup-tests.sh +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash -x - -VERSION="v0.19.0" -CURRENT_VERSION="" -NAMADA_DIR=".namada" -NAMADA_BASE_DIR=".namada/basedir" - -# Read current version -CURRENT_VERSION_PATH="${NAMADA_DIR}/.version" -while read -r line; -do - CURRENT_VERSION=$line - -done < "$CURRENT_VERSION_PATH" - -if [ "$CURRENT_VERSION" != "$VERSION" ]; then - # Download Namada binaries - FILENAME="namada-${VERSION}-Linux-x86_64.tar.gz" - curl --location --remote-header-name --remote-name https://github.com/anoma/namada/releases/download/${VERSION}/${FILENAME} - mkdir $NAMADA_DIR - tar -xzf ${FILENAME} --directory $NAMADA_DIR --strip-components 1 - rm -rf ${FILENAME} - - # Download wasm checksums - curl --location --remote-header-name --remote-name https://raw.githubusercontent.com/anoma/namada/${VERSION}/wasm/checksums.json - mv checksums.json "${NAMADA_DIR}/checksums.json" - - echo "${VERSION}" > "${NAMADA_DIR}/.version" -fi - -# Clear the basedir -rm -rf $NAMADA_BASE_DIR - -"${NAMADA_DIR}/namadac" --base-dir $NAMADA_BASE_DIR utils init-network \ - --chain-prefix dev-test \ - --wasm-checksums-path "${NAMADA_DIR}/checksums.json" \ - --genesis-path genesis.toml \ - --dont-archive \ - --unsafe-dont-encrypt - -CONFIG="${NAMADA_BASE_DIR}/global-config.toml" -CHAIN_ID="" - -# Read CHAIN_ID from global-config.toml -while read -r line; -do - CHAIN_ID=$(echo "$line" | sed "s/default_chain_id = \"//g" | sed "s/\"//"); - -done < "$CONFIG" - -# Run the extension -cd ../apps/extension && \ - yarn clean:chrome && \ - export NODE_ENV=development; \ - export TARGET=chrome; \ - export REACT_APP_NAMADA_CHAIN_ID=${CHAIN_ID}; \ - export REACT_APP_NAMADA_URL=http://127.0.0.1:27657 && \ - npx webpack --watch & - -# Run the interface -cd ../namada-interface && \ - export NODE_ENV=development; \ - export REACT_APP_LOCAL=true; \ - export REACT_APP_NAMADA_CHAIN_ID=${CHAIN_ID}; \ - export REACT_APP_NAMADA_URL=http://127.0.0.1:27657 && \ - npx webpack-dev-server & - -# Start the chain -cd ../../e2e -"${NAMADA_DIR}/namadan" --chain-id ${CHAIN_ID} --base-dir ${NAMADA_BASE_DIR}/${CHAIN_ID}/setup/validator-0/.namada ledger >/dev/null & - -"${NAMADA_DIR}/namadaw" --base-dir ${NAMADA_BASE_DIR} address gen --alias my-account --unsafe-dont-encrypt - -sleep 10 -"${NAMADA_DIR}/namadac" --base-dir ${NAMADA_BASE_DIR} transfer \ - --source faucet \ - --target atest1d9khqw36xccyydp3xpznjvzrx3zrq3fexep5y33nxverqdz9xcc5ydeexgm52djrxvuyxsjr44hd2f \ - --token NAM \ - --amount 1000 --node tcp://127.0.0.1:27657 --signer my-account - -"${NAMADA_DIR}/namadac" --base-dir ${NAMADA_BASE_DIR} transfer \ - --source faucet \ - --target atest1d9khqw368qury3phx3prsvp4gezrssenxqmyxwpn8qmrqvpsg4znjdjp8ycry3p3g4p5vd6x66dnmw \ - --token NAM \ - --amount 1000 --node tcp://127.0.0.1:27657 --signer my-account - -# Sleep indefinitely -while :; do sleep 86400; done - -# Kill all processes on exit -trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT diff --git a/e2e/src/index.test.ts b/e2e/src/index.test.ts index b6a26aabee..68d9cf1ba7 100644 --- a/e2e/src/index.test.ts +++ b/e2e/src/index.test.ts @@ -3,10 +3,16 @@ */ import * as puppeteer from "puppeteer"; import nodePath from "node:path"; +import { ChildProcess, exec } from "child_process"; +import terminate from "terminate/promise"; +import util from "node:util"; import { mnemonic, pwdOrAlias } from "./utils/values"; import { targetPage, waitForXpath } from "./utils/helpers"; +// promisify exec +const execPromise = util.promisify(exec); + const root = nodePath.resolve(process.cwd(), ".."); const path = `${root}/apps/extension/build/chrome`; @@ -15,7 +21,7 @@ const puppeteerArgs = [ `--load-extension=${path}`, "--disable-features=DialMediaRouteProvider", ]; -jest.setTimeout(120000); +jest.setTimeout(70000); let browser: puppeteer.Browser; let page: puppeteer.Page; @@ -36,7 +42,7 @@ const getExtensionId = async (): Promise => { }; const openInterface = async (): Promise => { - await page.goto("http://localhost:3000", { + await page.goto("http://localhost:8080", { waitUntil: ["domcontentloaded"], }); }; @@ -59,8 +65,27 @@ const openSetup = async (): Promise => { }); }; +function startNamada(namRefs: Set): ChildProcess { + const nam = exec(`sh ${process.cwd()}/start-namada.sh`); + namRefs.add(nam); + return nam; +} + +async function setupNamada(): Promise { + await execPromise(`sh ${process.cwd()}/setup-namada.sh`); +} + +async function stopNamada(namada: ChildProcess): Promise { + if (namada.pid) { + await terminate(namada.pid); + } +} + describe("Namada extension", () => { + const namRefs = new Set(); + beforeEach(async function () { + await setupNamada(); browser = await puppeteer.launch({ headless: false, slowMo: 50, @@ -73,6 +98,20 @@ describe("Namada extension", () => { await browser.close(); }); + afterAll(async () => { + for await (const namada of namRefs) { + // We want to stop the namada process only if: + // - process is NOT about to stop - SIGKILL + // - process is NOT already stopped - exitCode is not set + const stop = !( + namada.signalCode === "SIGKILL" || namada.exitCode !== null + ); + if (stop) { + await stopNamada(namada); + } + } + }); + describe("open the popup", () => { test("should open the popup", async () => { await openPopup(); @@ -84,6 +123,8 @@ describe("Namada extension", () => { describe("send transfer", () => { test("should send transfer", async () => { + const nam = startNamada(namRefs); + await openSetup(); // Check H1 @@ -205,6 +246,8 @@ describe("Namada extension", () => { const toast = await page.waitForXPath( "//div[contains(., 'Transfer successful!')]" ); + + await stopNamada(nam); expect(toast).toBeDefined(); }); }); diff --git a/e2e/start-namada.sh b/e2e/start-namada.sh new file mode 100755 index 0000000000..040422fb87 --- /dev/null +++ b/e2e/start-namada.sh @@ -0,0 +1,16 @@ +#!/bin/bash -x + +NAMADA_DIR=".namada" +NAMADA_BASE_DIR=".namada/basedir" + +CONFIG="${NAMADA_BASE_DIR}/global-config.toml" + +# Read CHAIN_ID from global-config.toml +while read -r line; +do + CHAIN_ID=$(echo "$line" | sed "s/default_chain_id = \"//g" | sed "s/\"//"); + +done < "$CONFIG" + +# Start the chain +"${NAMADA_DIR}/namadan" --chain-id ${CHAIN_ID} --base-dir ${NAMADA_BASE_DIR}/${CHAIN_ID}/setup/validator-0/.namada ledger diff --git a/yarn.lock b/yarn.lock index d1bf25b359..34e053f092 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5725,6 +5725,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.14.tgz#0fe081752a3333392d00586d815485a17c2cf3c9" integrity sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA== +"@types/node@^20.4.2": + version "20.4.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.4.tgz#c79c7cc22c9d0e97a7944954c9e663bcbd92b0cb" + integrity sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -7208,6 +7213,13 @@ base64-js@^1.0.2, base64-js@^1.3.0, base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +basic-auth@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + basic-ftp@^5.0.2: version "5.0.3" resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.3.tgz#b14c0fe8111ce001ec913686434fe0c2fb461228" @@ -8023,6 +8035,11 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +corser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" + integrity sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ== + cosmiconfig@8.2.0, cosmiconfig@^8.1.3: version "8.2.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" @@ -8882,7 +8899,7 @@ dotenv@^16.0.3: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== -duplexer@^0.1.2: +duplexer@^0.1.2, duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -9930,6 +9947,19 @@ eth-rpc-errors@^4.0.2: dependencies: fast-safe-stringify "^2.0.6" +event-stream@=3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + integrity sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g== + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + eventemitter2@^6.4.5, eventemitter2@^6.4.7: version "6.4.9" resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.9.tgz#41f2750781b4230ed58827bc119d293471ecb125" @@ -10510,6 +10540,11 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== + fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" @@ -11147,6 +11182,25 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" +http-server@^14.1.1: + version "14.1.1" + resolved "https://registry.yarnpkg.com/http-server/-/http-server-14.1.1.tgz#d60fbb37d7c2fdff0f0fbff0d0ee6670bd285e2e" + integrity sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A== + dependencies: + basic-auth "^2.0.1" + chalk "^4.1.2" + corser "^2.0.1" + he "^1.2.0" + html-encoding-sniffer "^3.0.0" + http-proxy "^1.18.1" + mime "^1.6.0" + minimist "^1.2.6" + opener "^1.5.1" + portfinder "^1.0.28" + secure-compare "3.0.1" + union "~0.5.0" + url-join "^4.0.1" + https-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" @@ -14806,6 +14860,11 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -14901,7 +14960,7 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, dependencies: mime-db "1.52.0" -mime@1.6.0: +mime@1.6.0, mime@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== @@ -15349,6 +15408,11 @@ open@^8.0.9, open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +opener@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -15616,6 +15680,13 @@ path@^0.12.7: process "^0.11.1" util "^0.10.3" +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== + dependencies: + through "~2.3" + pbkdf2@^3.0.16, pbkdf2@^3.0.3, pbkdf2@^3.0.9, pbkdf2@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" @@ -16459,6 +16530,13 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +ps-tree@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd" + integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA== + dependencies: + event-stream "=3.3.4" + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -16564,6 +16642,13 @@ qs@6.9.7: resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== +qs@^6.4.0: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -17396,6 +17481,11 @@ secretjs@^0.17.0: protobufjs "^6.11.2" secure-random "1.1.2" +secure-compare@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" + integrity sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw== + secure-random@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/secure-random/-/secure-random-1.1.2.tgz#ed103b460a851632d420d46448b2a900a41e7f7c" @@ -17801,6 +17891,13 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + integrity sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA== + dependencies: + through "2" + split@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" @@ -17848,6 +17945,13 @@ stream-browserify@^3.0.0: inherits "~2.0.4" readable-stream "^3.5.0" +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + integrity sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw== + dependencies: + duplexer "~0.1.1" + stream@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/stream/-/stream-0.0.2.tgz#7f5363f057f6592c5595f00bc80a27f5cec1f0ef" @@ -18275,6 +18379,13 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" +terminate@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/terminate/-/terminate-2.6.1.tgz#99a4eb1647011b95f47401f6beb9f23e0362fbc0" + integrity sha512-0kdr49oam98yvjkVY+gfUaT3SMaJI6Sc+yijJjU+qhat+0NQKQn60OsIZZeKyVgTO0/33nRa3HowRbpw3A7u9A== + dependencies: + ps-tree "^1.2.0" + terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.5: version "5.3.1" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54" @@ -18320,7 +18431,7 @@ throat@^6.0.1: resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== -through@2, through@^2.3.8: +through@2, through@^2.3.8, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -18722,6 +18833,13 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== +union@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" + integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA== + dependencies: + qs "^6.4.0" + unique-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" @@ -18779,6 +18897,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-join@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" + integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== + url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"