From fdc0ebbf23e58ba95c7b7b2b3f093ea637436dbe Mon Sep 17 00:00:00 2001 From: frazarshad Date: Tue, 19 Mar 2024 07:44:21 +0500 Subject: [PATCH] test: CI/CD workflow for e2e tests (#126) * test: docker set up for e2e tests * test: added github workflow for e2e tests * fix: added secret_words to synpress container * refactor: moved docker-compose and nginx.conf * fixup! test: added github workflow for e2e tests chore: renamed e2e_docker to e2e_tests * fixup! test: added github workflow for e2e tests refactor: using version tags instead of shas * fixup! test: added github workflow for e2e tests refactor: used simpler tag versions * fixup! test: added github workflow for e2e tests refactor: simplified condition * fixup! refactor: moved docker-compose and nginx.conf fix: fix path for artifacts --------- Co-authored-by: Samuel Siegart --- .dockerignore | 2 + .github/workflows/e2e_tests.yml | 65 ++++++++++++++++++ .gitignore | 3 +- Dockerfile | 13 ++++ package.json | 4 +- tests/e2e/docker-compose.yml | 117 ++++++++++++++++++++++++++++++++ tests/e2e/nginx.conf | 39 +++++++++++ yarn.lock | 108 +++++++++++++++++++++++------ 8 files changed, 330 insertions(+), 21 deletions(-) create mode 100644 .dockerignore create mode 100644 .github/workflows/e2e_tests.yml create mode 100644 Dockerfile create mode 100644 tests/e2e/docker-compose.yml create mode 100644 tests/e2e/nginx.conf diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..df277b9 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +node_modules/ +docker diff --git a/.github/workflows/e2e_tests.yml b/.github/workflows/e2e_tests.yml new file mode 100644 index 0000000..b78fd76 --- /dev/null +++ b/.github/workflows/e2e_tests.yml @@ -0,0 +1,65 @@ +name: E2E tests + +on: + push: + branches: [main] + pull_request: + branches: [main] + +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || + github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + e2e: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Cache Docker layers + uses: actions/cache@v3 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx- + + - name: Run e2e tests + run: | + docker-compose -f tests/e2e/docker-compose.yml --profile synpress up --build --exit-code-from synpress + env: + COMPOSE_DOCKER_CLI_BUILD: 1 + DOCKER_BUILDKIT: 1 + DOCKER_DEFAULT_PLATFORM: linux/amd64 + NGROK_AUTH: ${{ secrets.NGROK_AUTH }} + NGROK_BASIC_AUTH: ${{ secrets.NGROK_BASIC_AUTH }} + CYPRESS_PRIVATE_KEY_WITH_FUNDS: ${{ secrets.CYPRESS_PRIVATE_KEY_WITH_FUNDS }} + ANVIL_FORK_URL: ${{ secrets.ANVIL_FORK_URL }} + GH_PAT: ${{ secrets.GH_PAT }} + GH_USERNAME: ${{ secrets.GH_USERNAME }} + # cypress dashboard + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CYPRESS_PROJECT_ID: ${{ secrets.CYPRESS_PROJECT_ID }} + CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} + COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title }} + COMMIT_INFO_SHA: ${{ github.event.pull_request.head.sha }} + + - name: Archive e2e artifacts + uses: actions/upload-artifact@v3 + if: always() + with: + name: e2e-artifacts + path: | + tests/e2e/docker/videos + tests/e2e/docker/videos-ci + tests/e2e/docker/screenshots + continue-on-error: true diff --git a/.gitignore b/.gitignore index 58a971c..f189dce 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,5 @@ dist-ssr # E2E tests tests/e2e/screenshots -tests/e2e/videos \ No newline at end of file +tests/e2e/videos +docker diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..55c1d76 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +# syntax=docker/dockerfile:1 +FROM --platform=linux/amd64 synthetixio/docker-e2e:18.16-ubuntu as base + +RUN mkdir /app +WORKDIR /app + +RUN apt update && apt install -y nginx + +COPY tests/e2e/nginx.conf /etc/nginx/sites-available/default + +COPY . . + +RUN yarn install --frozen-lockfile diff --git a/package.json b/package.json index 1f542ac..6baf337 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "format": "prettier --write . && yarn lint --fix", "test": "vitest", "coverage": "vitest run --coverage", - "test:e2e": "EXTENSION=keplr synpress run --configFile=tests/e2e/synpress.config.cjs" + "test:e2e": "EXTENSION=keplr synpress run --configFile=tests/e2e/synpress.config.cjs", + "test:e2e:ci": "start-server-and-test 'yarn dev' http-get://localhost:5173 'yarn test:e2e'" }, "dependencies": { "react": "^18.2.0", @@ -53,6 +54,7 @@ "react-icons": "^4.4.0", "react-loader-spinner": "~5.4.5", "react-toastify": "^9.0.8", + "start-server-and-test": "^2.0.3", "tailwindcss": "^3.1.8", "typescript": "^4.6.4", "vite": "^3.2.7", diff --git a/tests/e2e/docker-compose.yml b/tests/e2e/docker-compose.yml new file mode 100644 index 0000000..7d3e2ef --- /dev/null +++ b/tests/e2e/docker-compose.yml @@ -0,0 +1,117 @@ +version: '3.9' + +services: + synpress: + profiles: + - synpress + container_name: synpress + build: ../.. + environment: + - DISPLAY=display:0.0 + - CYPRESS_PRIVATE_KEY_WITH_FUNDS=${CYPRESS_PRIVATE_KEY_WITH_FUNDS} + - DEBUG=${DEBUG} + - CYPRESS_DOCKER_RUN=true + - GH_PAT=${GH_PAT} + - GH_USERNAME=${GH_USERNAME} + - CI=${CI} + # cypress dashboard + - CYPRESS_GROUP=${CYPRESS_GROUP} + - GITHUB_TOKEN=${GITHUB_TOKEN} + - CYPRESS_PROJECT_ID=${CYPRESS_PROJECT_ID} + - CYPRESS_RECORD_KEY=${CYPRESS_RECORD_KEY} + - COMMIT_INFO_MESSAGE=${COMMIT_INFO_MESSAGE} + - COMMIT_INFO_SHA=${COMMIT_INFO_SHA} + # passing required CI variables + - GITHUB_ACTIONS=${GITHUB_ACTIONS} + - GITHUB_WORKFLOW=${GITHUB_WORKFLOW} + - GITHUB_ACTION=${GITHUB_ACTION} + - GITHUB_EVENT_NAME=${GITHUB_EVENT_NAME} + - GITHUB_RUN_ID=${GITHUB_RUN_ID} + - GITHUB_RUN_ATTEMPT=${GITHUB_RUN_ATTEMPT} + - GITHUB_REPOSITORY=${GITHUB_REPOSITORY} + - GH_BRANCH=${GH_BRANCH} + - GITHUB_SHA=${GITHUB_SHA} + - GITHUB_REF=${GITHUB_REF} + - GITHUB_BASE_REF=${GITHUB_BASE_REF} + - GITHUB_HEAD_REF=${GITHUB_HEAD_REF} + - SECRET_WORDS="orbit bench unit task food shock brand bracket domain regular warfare company announce wheel grape trust sphere boy doctor half guard ritual three ecology" + depends_on: + - display + - video + - agd + entrypoint: [] + working_dir: /app + volumes: + - ./docker/videos:/app/tests/e2e/videos + - ./docker/screenshots:/app/tests/e2e/screenshots + command: > + bash -c 'echo -n "======> local noVNC URL: http://localhost:8080/vnc.html?autoconnect=true " && pnpm wait-on http://display:8080 && echo -n "======> remote noVNC URL: " && curl -s ngrok:4040/api/tunnels | jq -r .tunnels[0].public_url && nginx && yarn test:e2e:ci' + networks: + - x11 + + display: + profiles: + - synpress + container_name: display + image: synthetixio/display:016121eafdfff448414894d0ca5a50b1d72b62eb-base + environment: + - RUN_XTERM=no + - DISPLAY_WIDTH=1920 + - DISPLAY_HEIGHT=1080 + ports: + - '8080:8080' + networks: + - x11 + + ngrok: + profiles: + - ngrok + container_name: ngrok + image: synthetixio/ngrok:016121eafdfff448414894d0ca5a50b1d72b62eb-base + ports: + - '4040:4040' + command: ['ngrok', 'http', 'display:8080', '--authtoken', '${NGROK_AUTH}'] + environment: + - NGROK_AUTH=${NGROK_AUTH} + - NGROK_BASIC_AUTH=${NGROK_BASIC_AUTH} + depends_on: + - display + networks: + - x11 + + video: + profiles: + - synpress + container_name: video + image: synthetixio/video:457bb48776c3b14de232d9dda620ba9188dc40ac-base + volumes: + - ./docker/videos-ci:/videos + environment: + - FILE_NAME=CI-full-video.mp4 + - SE_SCREEN_WIDTH=1920 + - SE_SCREEN_HEIGHT=1080 + depends_on: + - display + networks: + - x11 + + agd: + profiles: + - synpress + container_name: agoric_chain + image: ghcr.io/agoric/agoric-3-proposals:main + logging: + driver: none + platform: linux/amd64 + ports: + - 26656:26656 + - 26657:26657 + - 1317:1317 + environment: + DEST: 1 + DEBUG: 'SwingSet:ls,SwingSet:vat' + networks: + - x11 + +networks: + x11: diff --git a/tests/e2e/nginx.conf b/tests/e2e/nginx.conf new file mode 100644 index 0000000..407f1ae --- /dev/null +++ b/tests/e2e/nginx.conf @@ -0,0 +1,39 @@ +server { + listen 26656; + server_name localhost; + + location / { + proxy_pass http://agoric_chain:26656; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} + +server { + listen 26657; + server_name localhost; + + location / { + proxy_pass http://agoric_chain:26657; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} + + +server { + listen 1317; + server_name localhost; + + location / { + proxy_pass http://agoric_chain:1317; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} diff --git a/yarn.lock b/yarn.lock index 3672289..9cf8afa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3690,7 +3690,7 @@ bluebird@3.7.1: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de" integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== -bluebird@^3.7.2: +bluebird@3.7.2, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -3958,7 +3958,7 @@ check-error@^1.0.3: dependencies: get-func-name "^2.0.2" -check-more-types@^2.24.0: +check-more-types@2.24.0, check-more-types@^2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== @@ -4894,6 +4894,11 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== +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== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -5546,6 +5551,19 @@ event-lite@^0.1.1: resolved "https://registry.yarnpkg.com/event-lite/-/event-lite-0.1.3.tgz#3dfe01144e808ac46448f0c19b4ab68e403a901d" integrity sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw== +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.7: version "6.4.7" resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" @@ -5571,20 +5589,7 @@ execa@4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^5.0.0: +execa@5.1.1, execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -5599,6 +5604,19 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" @@ -6013,6 +6031,11 @@ from2@^2.1.1: inherits "^2.0.1" readable-stream "^2.0.0" +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== + fromentries@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" @@ -7435,7 +7458,7 @@ launch-editor@^2.6.0: picocolors "^1.0.0" shell-quote "^1.8.1" -lazy-ass@^1.6.0: +lazy-ass@1.6.0, lazy-ass@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== @@ -7762,6 +7785,11 @@ make-dir@^4.0.0: dependencies: semver "^7.5.3" +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== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -8522,6 +8550,13 @@ pathval@^1.1.1: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== +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" + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -8819,6 +8854,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" + psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" @@ -9618,6 +9660,13 @@ speed-measure-webpack-plugin@1.4.2: dependencies: chalk "^4.1.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" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -9643,6 +9692,20 @@ stack-trace@0.0.x: resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== +start-server-and-test@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/start-server-and-test/-/start-server-and-test-2.0.3.tgz#15c53c85e23cba7698b498b8a2598cab95f3f802" + integrity sha512-QsVObjfjFZKJE6CS6bSKNwWZCKBG6975/jKRPPGFfFh+yOQglSeGXiNWjzgQNXdphcBI9nXbyso9tPfX4YAUhg== + dependencies: + arg "^5.0.2" + bluebird "3.7.2" + check-more-types "2.24.0" + debug "4.3.4" + execa "5.1.1" + lazy-ass "1.6.0" + ps-tree "1.2.0" + wait-on "7.2.0" + statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -9660,6 +9723,13 @@ stop-iteration-iterator@^1.0.0: dependencies: internal-slot "^1.0.4" +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" + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -10028,7 +10098,7 @@ throttleit@^1.0.0: resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== -through@^2.3.6, through@^2.3.8: +through@2, through@^2.3.6, 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 sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -10505,7 +10575,7 @@ vitest@^0.23.4: tinyspy "^1.0.2" vite "^2.9.12 || ^3.0.0-0" -wait-on@^7.0.1: +wait-on@7.2.0, wait-on@^7.0.1: version "7.2.0" resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-7.2.0.tgz#d76b20ed3fc1e2bebc051fae5c1ff93be7892928" integrity sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==