diff --git a/.circleci/cache-version.txt b/.circleci/cache-version.txt index 95e8c381c556..9f0fa2d7a673 100644 --- a/.circleci/cache-version.txt +++ b/.circleci/cache-version.txt @@ -1,3 +1,3 @@ # Bump this version to force CI to re-create the cache from scratch. -01-04-24 +03-12-24 diff --git a/.circleci/workflows.yml b/.circleci/workflows.yml index 5fb8141292bb..cf488a610b3b 100644 --- a/.circleci/workflows.yml +++ b/.circleci/workflows.yml @@ -29,7 +29,8 @@ mainBuildFilters: &mainBuildFilters - develop - /^release\/\d+\.\d+\.\d+$/ # use the following branch as well to ensure that v8 snapshot cache updates are fully tested - - 'fix/set_module_resolution_with_commonjs' + - 'cacie/dep/electron-27' + - 'feat/protocol_shadow_dom_support' - 'publish-binary' - 'em/circle2' @@ -42,7 +43,8 @@ macWorkflowFilters: &darwin-workflow-filters - equal: [ develop, << pipeline.git.branch >> ] # use the following branch as well to ensure that v8 snapshot cache updates are fully tested - equal: [ 'update-v8-snapshot-cache-on-develop', << pipeline.git.branch >> ] - - equal: [ 'fix/set_module_resolution_with_commonjs', << pipeline.git.branch >> ] + - equal: [ 'cacie/dep/electron-27', << pipeline.git.branch >> ] + - equal: [ 'feat/protocol_shadow_dom_support', << pipeline.git.branch >> ] - equal: [ 'ryanm/fix/service-worker-capture', << pipeline.git.branch >> ] - matches: pattern: /^release\/\d+\.\d+\.\d+$/ @@ -54,7 +56,8 @@ linuxArm64WorkflowFilters: &linux-arm64-workflow-filters - equal: [ develop, << pipeline.git.branch >> ] # use the following branch as well to ensure that v8 snapshot cache updates are fully tested - equal: [ 'update-v8-snapshot-cache-on-develop', << pipeline.git.branch >> ] - - equal: [ 'fix/set_module_resolution_with_commonjs', << pipeline.git.branch >> ] + - equal: [ 'cacie/dep/electron-27', << pipeline.git.branch >> ] + - equal: [ 'feat/protocol_shadow_dom_support', << pipeline.git.branch >> ] - equal: [ 'em/circle2', << pipeline.git.branch >> ] - matches: pattern: /^release\/\d+\.\d+\.\d+$/ @@ -78,7 +81,8 @@ windowsWorkflowFilters: &windows-workflow-filters - equal: [ develop, << pipeline.git.branch >> ] # use the following branch as well to ensure that v8 snapshot cache updates are fully tested - equal: [ 'update-v8-snapshot-cache-on-develop', << pipeline.git.branch >> ] - - equal: [ 'fix/set_module_resolution_with_commonjs', << pipeline.git.branch >> ] + - equal: [ 'cacie/dep/electron-27', << pipeline.git.branch >> ] + - equal: [ 'feat/protocol_shadow_dom_support', << pipeline.git.branch >> ] - equal: [ 'lerna-optimize-tasks', << pipeline.git.branch >> ] - equal: [ 'mschile/mochaEvents_win_sep', << pipeline.git.branch >> ] - matches: @@ -89,7 +93,7 @@ executors: # the Docker image with Cypress dependencies and Chrome browser cy-doc: docker: - - image: cypress/browsers-internal:node18.15.0-chrome114-ff115 + - image: cypress/browsers-internal:node18.17.1-chrome118-ff115 # by default, we use "medium" to balance performance + CI costs. bump or reduce on a per-job basis if needed. resource_class: medium environment: @@ -99,7 +103,7 @@ executors: # Docker image with non-root "node" user non-root-docker-user: docker: - - image: cypress/browsers-internal:node18.15.0-chrome114-ff115 + - image: cypress/browsers-internal:node18.17.1-chrome118-ff115 user: node environment: PLATFORM: linux @@ -134,7 +138,7 @@ executors: linux-arm64: &linux-arm64-executor machine: - image: ubuntu-2004:2022.04.1 + image: ubuntu-2004:2023.07.1 resource_class: arm.medium environment: PLATFORM: linux @@ -150,7 +154,7 @@ commands: name: Set environment variable to determine whether or not to persist artifacts command: | echo "Setting SHOULD_PERSIST_ARTIFACTS variable" - echo 'if ! [[ "$CIRCLE_BRANCH" != "develop" && "$CIRCLE_BRANCH" != "release/"* && "$CIRCLE_BRANCH" != "publish-binary" && "$CIRCLE_BRANCH" != "fix/set_module_resolution_with_commonjs" ]]; then + echo 'if ! [[ "$CIRCLE_BRANCH" != "develop" && "$CIRCLE_BRANCH" != "release/"* && "$CIRCLE_BRANCH" != "publish-binary" && "$CIRCLE_BRANCH" != "feat/protocol_shadow_dom_support" && "$CIRCLE_BRANCH" != "cacie/dep/electron-27" ]]; then export SHOULD_PERSIST_ARTIFACTS=true fi' >> "$BASH_ENV" # You must run `setup_should_persist_artifacts` command and be using bash before running this command @@ -552,7 +556,7 @@ commands: if [[ ! -f better_sqlite3.node ]]; then docker run -d --name centos7-builder centos7-builder /bin/bash -c "sleep 1000000000" docker cp ~/cypress/node_modules/better-sqlite3 centos7-builder:/better-sqlite3 - docker exec -it centos7-builder /bin/bash -c "cd /better-sqlite3 && source /root/.bashrc && chown -R root:root . && npm install --ignore-scripts && npx --no-install prebuild -r electron -t 25.0.0 --include-regex 'better_sqlite3.node$'" + docker exec -it centos7-builder /bin/bash -c "cd /better-sqlite3 && source /root/.bashrc && chown -R root:root . && npm install --ignore-scripts && npx --no-install prebuild -r electron -t 27.1.3 --include-regex 'better_sqlite3.node$'" docker cp centos7-builder:/better-sqlite3/build/Release/better_sqlite3.node ~/cypress/node_modules/better-sqlite3/build/Release/better_sqlite3.node docker rm -f centos7-builder cp ~/cypress/node_modules/better-sqlite3/build/Release/better_sqlite3.node ~/cypress/better_sqlite3.node @@ -633,7 +637,7 @@ commands: command: | # install with `--ignore-checksums` to avoid checksum error # https://www.gep13.co.uk/blog/chocolatey-error-hashes-do-not-match - [[ $PLATFORM == 'windows' && '<>' == 'chrome' ]] && choco install googlechrome --ignore-checksums || [[ $PLATFORM != 'windows' ]] + [[ $PLATFORM == 'windows' && '<>' == 'chrome' ]] && choco install googlechrome -y --ignore-checksums || [[ $PLATFORM != 'windows' ]] run-new-ui-tests: parameters: @@ -666,6 +670,9 @@ commands: echo Total containers $CIRCLE_NODE_TOTAL if [[ -v MAIN_RECORD_KEY ]]; then + if [[ <> == 'app' && <> == 'e2e' ]]; then + export DEBUG=cypress:* + fi # internal PR cmd=$([[ <> == 'true' ]] && echo 'yarn percy exec --parallel -- --') || true DEBUG=<> \ @@ -1225,6 +1232,12 @@ commands: else yarn binary-package --version $(node ./scripts/get-next-version.js) fi + - run: + name: Smoke Test the Cypress binary + command: | + source ./scripts/ensure-node.sh + node --version + yarn binary-smoke-test --version $(node ./scripts/get-next-version.js) - run: name: Zip the binary command: | @@ -2325,7 +2338,7 @@ jobs: <<: *defaults resource_class: small docker: - - image: cypress/base-internal:18.15.0 + - image: cypress/base-internal:18.17.1 steps: - maybe_skip_binary_jobs - restore_workspace_binaries @@ -2397,35 +2410,29 @@ jobs: description: Executor name to use type: executor default: cy-doc - wd: - description: Working directory, should be OUTSIDE cypress monorepo folder - type: string - default: /root/test-full-typescript <<: *defaults resource_class: small steps: - maybe_skip_binary_jobs - restore_workspace_binaries - - run: mkdir <> + - clone-repo-and-checkout-branch: + repo: cypress-test-tiny - run: - name: Create new NPM package ⚗️ - working_directory: <> - command: npm init -y + name: Checkout Typescript Example + working_directory: /tmp/cypress-test-tiny + command: | + git checkout full-typescript - run: name: Install dependencies 📦 - working_directory: <> + working_directory: /tmp/cypress-test-tiny environment: CYPRESS_INSTALL_BINARY: /root/cypress/cypress.zip command: | npm install /root/cypress/cypress.tgz typescript - - run: - name: Scaffold full TypeScript project 🏗 - working_directory: <> - command: npx @bahmutov/cly@1.9.0 init --typescript - run: name: Run project tests 🗳 - working_directory: <> - command: npx cypress run + working_directory: /tmp/cypress-test-tiny + command: npm run cypress:run # install NPM + binary zip and run against staging API test-binary-against-staging: @@ -2564,6 +2571,8 @@ jobs: steps: - maybe_skip_binary_jobs - restore_workspace_binaries + - clone-repo-and-checkout-branch: + repo: cypress-test-tiny # the user should be "node" - run: whoami - run: pwd @@ -2574,36 +2583,27 @@ jobs: # make sure the binary and NPM package files are present - run: ls -l - run: ls -l cypress.zip cypress.tgz - - run: mkdir test-binary - - run: - name: Create new NPM package - working_directory: test-binary - command: npm init -y - run: # install NPM from built NPM package folder name: Install Cypress - working_directory: test-binary + working_directory: /tmp/cypress-test-tiny # force installing the freshly built binary command: CYPRESS_INSTALL_BINARY=~/cypress/cypress.zip npm i ~/cypress/cypress.tgz - run: name: Cypress help - working_directory: test-binary + working_directory: /tmp/cypress-test-tiny command: $(yarn bin cypress) help - run: name: Cypress info - working_directory: test-binary + working_directory: /tmp/cypress-test-tiny command: $(yarn bin cypress) info - - run: - name: Add Cypress demo - working_directory: test-binary - command: npx @bahmutov/cly@1.9.0 init - run: name: Verify Cypress binary - working_directory: test-binary + working_directory: /tmp/cypress-test-tiny command: DEBUG=cypress:cli $(yarn bin cypress) verify - run: name: Run Cypress binary - working_directory: test-binary + working_directory: /tmp/cypress-test-tiny command: DEBUG=cypress:cli $(yarn bin cypress) run - store-npm-logs diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.yml b/.github/ISSUE_TEMPLATE/1-bug-report.yml index 20a8945f0063..2f269318a1d8 100644 --- a/.github/ISSUE_TEMPLATE/1-bug-report.yml +++ b/.github/ISSUE_TEMPLATE/1-bug-report.yml @@ -43,7 +43,7 @@ body: attributes: label: Node version description: What version of node.js are you using to run Cypress? - placeholder: ex. v18.15.0 + placeholder: ex. v18.17.0 validations: required: true - type: input diff --git a/.github/ISSUE_TEMPLATE/2-memory-issue.yml b/.github/ISSUE_TEMPLATE/2-memory-issue.yml index b827f20ea293..28e5bbabb1a2 100644 --- a/.github/ISSUE_TEMPLATE/2-memory-issue.yml +++ b/.github/ISSUE_TEMPLATE/2-memory-issue.yml @@ -51,7 +51,7 @@ body: attributes: label: Node version description: What version of node.js are you using to run Cypress? - placeholder: ex. v18.15.0 + placeholder: ex. v18.17.0 validations: required: true - type: input diff --git a/.github/ISSUE_TEMPLATE/3-install-issue.yml b/.github/ISSUE_TEMPLATE/3-install-issue.yml index bc373cdfdac2..6e513901e5fc 100644 --- a/.github/ISSUE_TEMPLATE/3-install-issue.yml +++ b/.github/ISSUE_TEMPLATE/3-install-issue.yml @@ -38,7 +38,7 @@ body: attributes: label: Node version description: What version of node.js are you using to run Cypress? - placeholder: ex. v18.15.0 + placeholder: ex. v18.17.0 validations: required: true - type: dropdown diff --git a/.github/workflows/semantic-pull-request.yml b/.github/workflows/semantic-pull-request.yml index 8b61f18f8f61..e54d669634c6 100644 --- a/.github/workflows/semantic-pull-request.yml +++ b/.github/workflows/semantic-pull-request.yml @@ -1,5 +1,21 @@ name: "Semantic Pull Request" - +# @see https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs +permissions: + actions: none + checks: none + # to check out & read the repository + contents: read + deployments: none + id-token: none + issues: none + discussions: none + packages: none + pages: none + # to read pull-request data, including commits/issues linked + pull-requests: read + repository-projects: none + security-events: none + statuses: none on: pull_request_target: types: @@ -13,7 +29,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} @@ -21,7 +37,7 @@ jobs: working-directory: scripts/github-actions/semantic-pull-request/ - name: Lint PR Title and Cypress Changelog Entry if: github.event_name == 'pull_request_target' - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const verifyPullRequest = require('./scripts/github-actions/semantic-pull-request') diff --git a/.github/workflows/snyk_sca_scan.yaml b/.github/workflows/snyk_sca_scan.yaml index eb2c591908e0..45f504bf3a4f 100644 --- a/.github/workflows/snyk_sca_scan.yaml +++ b/.github/workflows/snyk_sca_scan.yaml @@ -13,18 +13,20 @@ on: - develop jobs: Snyk_SCA_Scan: + # Skip this job on PRs from forks + if: github.event.pull_request.head.repo.full_name == github.repository runs-on: ubuntu-latest strategy: matrix: node-version: [18.x] steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.BOT_GITHUB_ACTION_TOKEN }} - name: Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 cache: 'yarn' diff --git a/.github/workflows/snyk_static_analysis_scan.yaml b/.github/workflows/snyk_static_analysis_scan.yaml index bf33e1f65e98..58596a407c8f 100644 --- a/.github/workflows/snyk_static_analysis_scan.yaml +++ b/.github/workflows/snyk_static_analysis_scan.yaml @@ -8,16 +8,18 @@ on: branches: - develop jobs: - Snyk_SAST_Scan : + Snyk_SAST_Scan: + # Skip this job on PRs from forks + if: github.event.pull_request.head.repo.full_name == github.repository runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.BOT_GITHUB_ACTION_TOKEN }} - name: Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 cache: 'yarn' diff --git a/.github/workflows/triage_add_to_project.yml b/.github/workflows/triage_add_to_project.yml index 11c27119b66d..846c5c2df941 100644 --- a/.github/workflows/triage_add_to_project.yml +++ b/.github/workflows/triage_add_to_project.yml @@ -49,17 +49,17 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: 'cypress-io/release-automations' ref: 'master' ssh-key: ${{ secrets.WORKFLOW_DEPLOY_KEY }} - name: Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 'lts/*' - name: Run comment_workflow.js Script - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: github-token: ${{ secrets.TRIAGE_BOARD_TOKEN }} script: | diff --git a/.github/workflows/triage_handle_new_comments.yml b/.github/workflows/triage_handle_new_comments.yml index 0cf253ad0d24..5778b08c555a 100644 --- a/.github/workflows/triage_handle_new_comments.yml +++ b/.github/workflows/triage_handle_new_comments.yml @@ -14,17 +14,17 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: 'cypress-io/release-automations' ref: 'master' ssh-key: ${{ secrets.WORKFLOW_DEPLOY_KEY }} - name: Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 'lts/*' - name: Run comment_workflow.js Script - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: github-token: ${{ secrets.TRIAGE_BOARD_TOKEN }} script: | diff --git a/.github/workflows/update-browser-versions.yml b/.github/workflows/update-browser-versions.yml index 1f13316f7731..d348bfc7ff3e 100644 --- a/.github/workflows/update-browser-versions.yml +++ b/.github/workflows/update-browser-versions.yml @@ -12,7 +12,7 @@ jobs: BASE_BRANCH: develop steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.BOT_GITHUB_ACTION_TOKEN }} @@ -26,12 +26,12 @@ jobs: git fetch origin git checkout ${{ env.BASE_BRANCH }} - name: Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 - name: Check for new Chrome versions id: get-versions - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const { getVersions } = require('./scripts/github-actions/update-browser-versions.js') @@ -56,7 +56,7 @@ jobs: - name: Check need for update on existing branch if: ${{ steps.check-need-for-pr.outputs.needs_branch_update == 'true' }} id: check-need-for-branch-update - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const { checkNeedForBranchUpdate } = require('./scripts/github-actions/update-browser-versions.js') @@ -73,7 +73,7 @@ jobs: ## Both - name: Update Browser Versions File if: ${{ steps.check-need-for-pr.outputs.needs_pr == 'true' || steps.check-need-for-branch-update.outputs.has_newer_update == 'true' }} - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const { updateBrowserVersionsFile } = require('./scripts/github-actions/update-browser-versions.js') @@ -92,7 +92,7 @@ jobs: ## Update available and a branch/PR already exists - name: Update PR Title if: ${{ steps.check-need-for-pr.outputs.needs_branch_update == 'true' }} - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const { updatePRTitle } = require('./scripts/github-actions/update-browser-versions.js') @@ -108,7 +108,7 @@ jobs: - name: Create Pull Request id: create-pr if: ${{ steps.check-need-for-pr.outputs.needs_pr == 'true' }} - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const { createPullRequest } = require('./scripts/github-actions/create-pull-request.js') diff --git a/.github/workflows/update_v8_snapshot_cache.yml b/.github/workflows/update_v8_snapshot_cache.yml index f2a9572a2a02..fc0caf3e3c24 100644 --- a/.github/workflows/update_v8_snapshot_cache.yml +++ b/.github/workflows/update_v8_snapshot_cache.yml @@ -48,8 +48,11 @@ jobs: - name: Determine snapshot files - Mac if: ${{ matrix.platform == 'macos-latest' }} run: echo "SNAPSHOT_FILES='tooling/v8-snapshot/cache/darwin/snapshot-meta.json'" >> $GITHUB_ENV + - name: Install setuptools - Mac + if: ${{ matrix.platform == 'macos-latest' }} + run: sudo -H pip install setuptools - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.BOT_GITHUB_ACTION_TOKEN }} @@ -60,7 +63,7 @@ jobs: git config --local user.email "${{ env.CYPRESS_BOT_APP_ID }}+cypress-bot[bot]@users.noreply.github.com" git config --local user.name "cypress-bot[bot]" - name: Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 cache: 'yarn' @@ -122,7 +125,7 @@ jobs: # PR needs to be created - name: Create Pull Request if: ${{ steps.check-need-for-pr.outputs.needs_pr == 'true' }} - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | const { createPullRequest } = require('./scripts/github-actions/create-pull-request.js') diff --git a/.github/workflows/upload_release_asset.yml b/.github/workflows/upload_release_asset.yml index 1934d2fc22b5..d42e04a3901c 100644 --- a/.github/workflows/upload_release_asset.yml +++ b/.github/workflows/upload_release_asset.yml @@ -15,7 +15,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Check out repository code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Download Fossa binary and install # This step utilizes a curl of the latest install pkg from Fossa. Using a git action from # Fossa doesn't produce the SBOM artifact needed. This manual approach is the only way to diff --git a/.node-version b/.node-version index 55bffd620b9a..4a1f488b6c3b 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -18.15.0 +18.17.1 diff --git a/.yarnclean b/.yarnclean index d30747797b10..ec82ed6494d2 100644 --- a/.yarnclean +++ b/.yarnclean @@ -14,6 +14,10 @@ images assets !mochawesome-report-generator/dist/assets +# Do NOT clean out app assets from cypress-example-kitchensink to avoid broken deployments +# Needed for https://example.cypress.io/ +!cypress-example-kitchensink/app/assets + # examples example !@packages/example diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9acb46686376..fb0dcde61ad0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -205,8 +205,9 @@ You must have the following installed on your system to contribute locally: - [`Node.js`](https://nodejs.org/en/) (See the root [.node-version](.node-version) file for the required version. You can find a list of tools on [node-version-usage](https://github.com/shadowspawn/node-version-usage) to switch the version of [`Node.js`](https://nodejs.org/en/) based on [.node-version](.node-version).) - [`yarn`](https://yarnpkg.com/en/docs/install) -- [`python`](https://www.python.org/downloads/) (since we use `node-gyp`. See their [repo](https://github.com/nodejs/node-gyp) for Python version requirements.) - - Note for Debian-based systems: `python` is pre-installed.
`sudo apt install g++ make cmake` meets the additional requirements to run `node-gyp` in the context of building Cypress from source. +- [`python`](https://www.python.org/downloads/) (since we use `node-gyp`. See their [repo](https://github.com/nodejs/node-gyp) for Python version requirements. Use Python `3.11` or lower.) + - Note for Debian-based systems: `python` is pre-installed.
`sudo apt install g++ make` meets the additional requirements to run `node-gyp` in the context of building Cypress from source. + - Note for Windows systems: when installing the Visual Studio C++ environment recommended by [node-gyp](https://github.com/nodejs/node-gyp), install also a Windows 10 SDK. The currently used version of `node-gyp` may otherwise fail to recognise the Visual Studio installation. ### Getting Started diff --git a/README.md b/README.md index 9867193933f2..371257991c8a 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Cypress Logo - +

@@ -57,9 +57,12 @@ or ```bash yarn add cypress --dev ``` +or +```bash +pnpm add cypress --save-dev +``` -![installing-cli e1693232](https://user-images.githubusercontent.com/1271364/31740846-7bf607f0-b420-11e7-855f-41c996040d31.gif) - +![installing-cli e1693232](./assets/cypress-installation.gif) ## Contributing @@ -68,10 +71,6 @@ yarn add cypress --dev Please see our [Contributing Guideline](./CONTRIBUTING.md) which explains repo organization, linting, testing, and other steps. -## How we work - -At Cypress we value our community and strive to be as open and transparent with them as possible. Check out [our guide](./cypress-prioritization-and-triage.md) on how we prioritize community issues. - ## License [![license](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/cypress-io/cypress/blob/develop/LICENSE) diff --git a/assets/cypress-installation.gif b/assets/cypress-installation.gif new file mode 100644 index 000000000000..bb1d1b071170 Binary files /dev/null and b/assets/cypress-installation.gif differ diff --git a/browser-versions.json b/browser-versions.json index 7d4d999e4731..459edc34e4c9 100644 --- a/browser-versions.json +++ b/browser-versions.json @@ -1,5 +1,5 @@ { - "chrome:beta": "121.0.6167.57", - "chrome:stable": "120.0.6099.216", + "chrome:beta": "123.0.6312.46", + "chrome:stable": "122.0.6261.128", "chrome:minimum": "64.0.3282.0" } diff --git a/centos7-builder.Dockerfile b/centos7-builder.Dockerfile index 1a6aa87fadca..a939fa4087f8 100644 --- a/centos7-builder.Dockerfile +++ b/centos7-builder.Dockerfile @@ -1,5 +1,5 @@ FROM centos:7 -# Install dependencies for re-building better-sqlite and setting devtoolset-8 as the default compiler +# Install dependencies for re-building better-sqlite and setting devtoolset-8 as the default compiler. RUN yum -y install centos-release-scl curl python3 make atk-devel atk java-atk-wrapper at-spi2-atk gtk3 libXt libdrm mesa-libgbm Xvfb && yum -y install devtoolset-8-gcc devtoolset-8-gcc-c++ RUN echo >> /etc/profile.d/devtoolset-8.sh 'source scl_source enable devtoolset-8' RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md index 3dda104e7441..b2055cbbecb1 100644 --- a/cli/CHANGELOG.md +++ b/cli/CHANGELOG.md @@ -1,4 +1,100 @@ +## 13.7.1 + +_Released 3/21/2024_ + +**Bugfixes:** + +- Fixed an issue where Cypress was not executing beyond the first spec in `cypress run` for versions of Firefox 124 and up. Fixes [#29172](https://github.com/cypress-io/cypress/issues/29172). +- Fixed an issue blurring shadow dom elements. Fixed in [#29125](https://github.com/cypress-io/cypress/pull/29125). + +**Dependency Updates:** + +- Updated jose from `4.11.2` to `4.15.5`. Addressed in [#29086](https://github.com/cypress-io/cypress/pull/29086). + +## 13.7.0 + +_Released 3/13/2024_ + +**Features:** + +- Added shadow DOM snapshot support within Test Replay in order to highlight elements correctly within the Cypress reporter. Addressed in [#28823](https://github.com/cypress-io/cypress/pull/28823). +- Added TypeScript support for [Vue 2.7+](https://github.com/vuejs/vue/blob/main/CHANGELOG.md#270-2022-07-01). Addresses [#28591](https://github.com/cypress-io/cypress/issues/28591). +- Adds additional context to error messages displayed when Test Replay artifacts fail to upload. Addressed in [#28986](https://github.com/cypress-io/cypress/pull/28986) + +**Performance:** + +- Fixed a performance regression from [`13.6.3`](https://docs.cypress.io/guides/references/changelog#13-6-3) where unhandled service worker requests may not correlate correctly. Fixes [#28868](https://github.com/cypress-io/cypress/issues/28868). +- Reduces the number of attempts to retry failed Test Replay artifact uploads from 8 to 3, to reduce time spent on artifact upload attempts that will not succeed. Addressed in [#28986](https://github.com/cypress-io/cypress/pull/28986) + +**Bugfixes:** + +- Changed screenshot capture behavior in Chromium to activate the main Cypress tab before capturing. This prevents screenshot capture from timing out in certain situations. Fixed in [#29038](https://github.com/cypress-io/cypress/pull/29038). Fixes [#5016](https://github.com/cypress-io/cypress/issues/5016) +- Fixed an issue where `.click()` commands on children of disabled elements would still produce "click" events -- even without `{ force: true }`. Fixes [#28788](https://github.com/cypress-io/cypress/issues/28788). +- Changed RequestBody type to allow for boolean and null literals to be passed as body values. [#28789](https://github.com/cypress-io/cypress/issues/28789) + +**Misc:** + +- Changed Component Testing scaffolding instruction to `pnpm add` to add framework dependencies when a project uses pnpm as package manager. Addresses [#29052](https://github.com/cypress-io/cypress/issues/29052). +- Command messages in the Cypress command logs will now truncate display at 100 lines instead of 50. Fixes [#29023](https://github.com/cypress-io/cypress/issues/29023). +- Capture the `beforeTest` timestamp inside the browser for the purposes of accurately determining test start for Test Replay. Addressed in [#29061](https://github.com/cypress-io/cypress/pull/29061). + +**Dependency Updates:** + +- Updated jimp from `0.14.0` to `0.22.12`. Addressed in [#29055](https://github.com/cypress-io/cypress/pull/29055). +- Updated http-proxy-middleware from `2.0.4` to `2.0.6`. Addressed in [#28902](https://github.com/cypress-io/cypress/pull/28902). +- Updated signal-exit from `3.0.3` to `3.0.7`. Addressed in [#28979](https://github.com/cypress-io/cypress/pull/28979). + +## 13.6.6 + +_Released 2/22/2024_ + +**Bugfixes:** + +- Fixed an issue where `cypress verify` was failing for `nx` users. Fixes [#28982](https://github.com/cypress-io/cypress/issues/28982). + +## 13.6.5 + +_Released 2/20/2024_ + +**Bugfixes:** + +- Fixed tests hanging when the Chrome browser extension is disabled. Fixes [#28392](https://github.com/cypress-io/cypress/issues/28392). +- Fixed an issue which caused the browser to relaunch after closing the browser from the Launchpad. Fixes [#28852](https://github.com/cypress-io/cypress/issues/28852). +- Fixed an issue with the unzip promise never being rejected when an empty error happens. Fixed in [#28850](https://github.com/cypress-io/cypress/pull/28850). +- Fixed a regression introduced in [`13.6.3`](https://docs.cypress.io/guides/references/changelog#13-6-3) where Cypress could crash when processing service worker requests through our proxy. Fixes [#28950](https://github.com/cypress-io/cypress/issues/28950). +- Fixed incorrect type definition of `dom.getContainsSelector`. Fixed in [#28339](https://github.com/cypress-io/cypress/pull/28339). + +**Misc:** + +- Improved accessibility of the Cypress App in some areas. Addressed in [#28774](https://github.com/cypress-io/cypress/pull/28774). +- Changed references of LayerCI to webapp.io. Addressed in [#28874](https://github.com/cypress-io/cypress/pull/28874). + +**Dependency Updates:** + +- Upgraded `electron` from `25.8.4` to `27.1.3`. +- Upgraded bundled Node.js version from `18.15.0` to `18.17.0`. +- Upgraded bundled Chromium version from `114.0.5735.289` to `118.0.5993.117`. +- Updated buffer from `5.6.0` to `5.7.1`. Addressed in [#28934](https://github.com/cypress-io/cypress/pull/28934). +- Updated [`duplexify`](https://www.npmjs.com/package/duplexify) from `4.1.1` to `4.1.2`. Addressed in [#28941](https://github.com/cypress-io/cypress/pull/28941). +- Updated [`is-ci`](https://www.npmjs.com/package/is-ci) from `3.0.0` to `3.0.1`. Addressed in [#28933](https://github.com/cypress-io/cypress/pull/28933). + +## 13.6.4 + +_Released 1/30/2024_ + +**Performance:** + +- Fixed a performance regression from [`13.3.2`](https://docs.cypress.io/guides/references/changelog#13.3.2) where aborted requests may not correlate correctly. Fixes [#28734](https://github.com/cypress-io/cypress/issues/28734). + +**Bugfixes:** + +- Fixed an issue with capturing assets for Test Replay when service workers are registered in Cypress support files. This issue would cause styles to not render properly in Test Replay. Fixes [#28747](https://github.com/cypress-io/cypress/issues/28747). + +**Misc:** + +- Added missing properties to the `Cypress.spec` interface for TypeScript users. Addresses [#27835](https://github.com/cypress-io/cypress/issues/27835). + ## 13.6.3 _Released 1/16/2024_ @@ -10,17 +106,17 @@ _Released 1/16/2024_ - Now `node_modules` will not be ignored if a project path or a provided path to spec files contains it. Fixes [#23616](https://github.com/cypress-io/cypress/issues/23616). - Updated display of assertions and commands with a URL argument to escape markdown formatting so that values are displayed as is and assertion values display as bold. Fixes [#24960](https://github.com/cypress-io/cypress/issues/24960) and [#28100](https://github.com/cypress-io/cypress/issues/28100). - When generating assertions via Cypress Studio, the preview of the generated assertions now correctly displays the past tense of 'expected' instead of 'expect'. Fixed in [#28593](https://github.com/cypress-io/cypress/pull/28593). -- Fixed a regression in [`13.6.2`](https://docs.cypress.io/guides/references/changelog/13.6.2) where the `body` element was not highlighted correctly in Test Replay. Fixed in [#28627](https://github.com/cypress-io/cypress/pull/28627). +- Fixed a regression in [`13.6.2`](https://docs.cypress.io/guides/references/changelog#13.6.2) where the `body` element was not highlighted correctly in Test Replay. Fixed in [#28627](https://github.com/cypress-io/cypress/pull/28627). - Correctly sync `Cypress.currentRetry` with secondary origin so test retries that leverage `cy.origin()` render logs as expected. Fixes [#28574](https://github.com/cypress-io/cypress/issues/28574). - Fixed an issue where some cross-origin logs, like assertions or cy.clock(), were getting too many dom snapshots. Fixes [#28609](https://github.com/cypress-io/cypress/issues/28609). -- Fixed asset capture for Test Replay for requests that are routed through service workers. This addresses an issue where styles were not being applied properly in Test Replay and `cy.intercept` was not working properly for requests in this scenario. Fixes [#28516](https://github.com/cypress-io/cypress/issues/28516). +- Fixed asset capture for Test Replay for requests that are routed through service workers. This addresses an issue where styles were not being applied properly in Test Replay and `cy.intercept()` was not working properly for requests in this scenario. Fixes [#28516](https://github.com/cypress-io/cypress/issues/28516). - Fixed an issue where visiting an `http://` site would result in an infinite reload/redirect loop in Chrome 114+. Fixes [#25891](https://github.com/cypress-io/cypress/issues/25891). - Fixed an issue where requests made from extra tabs do not include their original headers. Fixes [#28641](https://github.com/cypress-io/cypress/issues/28641). - Fixed an issue where `cy.wait()` would sometimes throw an error reading a property of undefined when returning responses. Fixes [#28233](https://github.com/cypress-io/cypress/issues/28233). **Performance:** -- Fixed a performance regression from [`13.3.2`](https://docs.cypress.io/guides/references/changelog/13.3.2) where requests may not correlate correctly when test isolation is off. Fixes [#28545](https://github.com/cypress-io/cypress/issues/28545). +- Fixed a performance regression from [`13.3.2`](https://docs.cypress.io/guides/references/changelog#13.3.2) where requests may not correlate correctly when test isolation is off. Fixes [#28545](https://github.com/cypress-io/cypress/issues/28545). **Dependency Updates:** @@ -34,14 +130,15 @@ _Released 1/16/2024_ - Improved accessibility of some areas of the Cypress App. Addressed in [#28628](https://github.com/cypress-io/cypress/pull/28628). - Updated some documentation links to go through on.cypress.io. Addressed in [#28623](https://github.com/cypress-io/cypress/pull/28623). + ## 13.6.2 _Released 12/26/2023_ **Bugfixes:** -- Fixed a regression in [`13.6.1`](https://docs.cypress.io/guides/references/changelog/13.6.1) where a malformed URI would crash Cypress. Fixes [#28521](https://github.com/cypress-io/cypress/issues/28521). -- Fixed a regression in [`12.4.0`](https://docs.cypress.io/guides/references/changelog/12.4.0) where erroneous `
` tags were displaying in error messages in the Command Log making them less readable. Fixes [#28452](https://github.com/cypress-io/cypress/issues/28452). +- Fixed a regression in [`13.6.1`](https://docs.cypress.io/guides/references/changelog#13.6.1) where a malformed URI would crash Cypress. Fixes [#28521](https://github.com/cypress-io/cypress/issues/28521). +- Fixed a regression in [`12.4.0`](https://docs.cypress.io/guides/references/changelog#12.4.0) where erroneous `
` tags were displaying in error messages in the Command Log making them less readable. Fixes [#28452](https://github.com/cypress-io/cypress/issues/28452). **Performance:** @@ -99,7 +196,7 @@ _Released 11/14/2023_ **Bugfixes:** -- Fixed a regression in [`13.5.0`](https://docs.cypress.io/guides/references/changelog/13.5.0) where requests cached within a given spec may take longer to load than they did previously. Addresses [#28295](https://github.com/cypress-io/cypress/issues/28295). +- Fixed a regression in [`13.5.0`](https://docs.cypress.io/guides/references/changelog#13.5.0) where requests cached within a given spec may take longer to load than they did previously. Addresses [#28295](https://github.com/cypress-io/cypress/issues/28295). - Fixed an issue where pages opened in a new tab were missing response headers, causing them not to load properly. Fixes [#28293](https://github.com/cypress-io/cypress/issues/28293) and [#28303](https://github.com/cypress-io/cypress/issues/28303). - We now pass a flag to Chromium browsers to disable default component extensions. This is a common flag passed during browser automation. Fixed in [#28294](https://github.com/cypress-io/cypress/pull/28294). @@ -114,7 +211,7 @@ _Released 11/8/2023_ **Bugfixes:** - Fixed an issue in chromium based browsers, where global style updates can trigger flooding of font face requests in DevTools and Test Replay. This can affect performance due to the flooding of messages in CDP. Fixes [#28150](https://github.com/cypress-io/cypress/issues/28150) and [#28215](https://github.com/cypress-io/cypress/issues/28215). -- Fixed a regression in [`13.3.3`](https://docs.cypress.io/guides/references/changelog/13.3.3) where Cypress would hang on loading shared workers when using `cy.reload` to reload the page. Fixes [#28248](https://github.com/cypress-io/cypress/issues/28248). +- Fixed a regression in [`13.3.3`](https://docs.cypress.io/guides/references/changelog#13.3.3) where Cypress would hang on loading shared workers when using `cy.reload` to reload the page. Fixes [#28248](https://github.com/cypress-io/cypress/issues/28248). - Fixed an issue where network requests made from tabs, or windows other than the main Cypress tab, would be delayed. Fixes [#28113](https://github.com/cypress-io/cypress/issues/28113). - Fixed an issue with 'other' targets (e.g. pdf documents embedded in an object tag) not fully loading. Fixes [#28228](https://github.com/cypress-io/cypress/issues/28228) and [#28162](https://github.com/cypress-io/cypress/issues/28162). - Fixed an issue where clicking a link to download a file could cause a page load timeout when the download attribute was missing. Note: download behaviors in experimental Webkit are still an issue. Fixes [#14857](https://github.com/cypress-io/cypress/issues/14857). @@ -133,7 +230,7 @@ _Released 10/30/2023_ **Bugfixes:** -- Fixed a regression in [`13.3.2`](https://docs.cypress.io/guides/references/changelog/13.3.2) where Cypress would crash with 'Inspected target navigated or closed' or 'Session with given id not found'. Fixes [#28141](https://github.com/cypress-io/cypress/issues/28141) and [#28148](https://github.com/cypress-io/cypress/issues/28148). +- Fixed a regression in [`13.3.2`](https://docs.cypress.io/guides/references/changelog#13.3.2) where Cypress would crash with 'Inspected target navigated or closed' or 'Session with given id not found'. Fixes [#28141](https://github.com/cypress-io/cypress/issues/28141) and [#28148](https://github.com/cypress-io/cypress/issues/28148). ## 13.3.3 diff --git a/cli/lib/tasks/unzip.js b/cli/lib/tasks/unzip.js index 5993bd2700a3..a4c911a5dfad 100644 --- a/cli/lib/tasks/unzip.js +++ b/cli/lib/tasks/unzip.js @@ -84,11 +84,11 @@ const unzip = ({ zipFilePath, installDir, progress }) => { return resolve() }) .catch((err) => { - if (err) { - debug('error %s', err.message) + const error = err || new Error('Unknown error with Node extract tool') - return reject(err) - } + debug('error %s', error.message) + + return reject(error) }) } diff --git a/cli/lib/tasks/verify.js b/cli/lib/tasks/verify.js index 2d946b301e37..87e44412b67b 100644 --- a/cli/lib/tasks/verify.js +++ b/cli/lib/tasks/verify.js @@ -102,7 +102,10 @@ const runSmokeTest = (binaryDir, options) => { debug('smoke test timeout %d ms', options.smokeTestTimeout) const stdioOptions = _.extend({}, { - env: process.env, + env: { + ...process.env, + FORCE_COLOR: 0, + }, timeout: options.smokeTestTimeout, }) diff --git a/cli/package.json b/cli/package.json index 8af4ec2bb7b9..4c75c56d73fc 100644 --- a/cli/package.json +++ b/cli/package.json @@ -27,7 +27,7 @@ "arch": "^2.2.0", "blob-util": "^2.0.2", "bluebird": "^3.7.2", - "buffer": "^5.6.0", + "buffer": "^5.7.1", "cachedir": "^2.3.0", "chalk": "^4.1.0", "check-more-types": "^2.24.0", @@ -45,7 +45,7 @@ "figures": "^3.2.0", "fs-extra": "^9.1.0", "getos": "^3.2.1", - "is-ci": "^3.0.0", + "is-ci": "^3.0.1", "is-installed-globally": "~0.4.0", "lazy-ass": "^1.6.0", "listr2": "^3.8.3", diff --git a/cli/test/lib/tasks/unzip_spec.js b/cli/test/lib/tasks/unzip_spec.js index 286439f67010..af42b21fe730 100644 --- a/cli/test/lib/tasks/unzip_spec.js +++ b/cli/test/lib/tasks/unzip_spec.js @@ -132,6 +132,45 @@ describe('lib/tasks/unzip', function () { }) }) + it('can try unzip first then fall back to node unzip and fails with an empty error', async function () { + const zipFilePath = path.join('test', 'fixture', 'example.zip') + + sinon.stub(unzip.utils.unzipTools, 'extract').callsFake(() => { + return new Promise((_, reject) => reject()) + }) + + const unzipChildProcess = new events.EventEmitter() + + unzipChildProcess.stdout = { + on () {}, + } + + unzipChildProcess.stderr = { + on () {}, + } + + sinon.stub(cp, 'spawn').withArgs('unzip').returns(unzipChildProcess) + + setTimeout(() => { + debug('emitting unzip error') + unzipChildProcess.emit('error', new Error('unzip fails badly')) + }, 100) + + try { + await unzip + .start({ + zipFilePath, + installDir, + }) + } catch (err) { + logger.error(err) + expect(err.message).to.include('Unknown error with Node extract tool') + + return + } + throw new Error('should have failed') + }) + it('calls node unzip just once', function (done) { const zipFilePath = path.join('test', 'fixture', 'example.zip') diff --git a/cli/test/lib/tasks/verify_spec.js b/cli/test/lib/tasks/verify_spec.js index ab4fd5146be0..356a8f0c478d 100644 --- a/cli/test/lib/tasks/verify_spec.js +++ b/cli/test/lib/tasks/verify_spec.js @@ -278,6 +278,44 @@ context('lib/tasks/verify', () => { }) }) + describe('FORCE_COLOR', () => { + let previousForceColors + + beforeEach(() => { + previousForceColors = process.env.FORCE_COLOR + + process.env.FORCE_COLOR = true + }) + + afterEach(() => { + process.env.FORCE_COLOR = previousForceColors + }) + + // @see https://github.com/cypress-io/cypress/issues/28982 + it('sets FORCE_COLOR to 0 when piping stdioOptions to to the smoke test to avoid ANSI in binary smoke test', () => { + createfs({ + alreadyVerified: false, + executable: mockfs.file({ mode: 0o777 }), + packageVersion, + }) + + util.exec.resolves({ + stdout: '222', + stderr: '', + }) + + return verify.start() + .then(() => { + expect(util.exec).to.be.calledWith(executablePath, ['--no-sandbox', '--smoke-test', '--ping=222'], + sinon.match({ + env: { + FORCE_COLOR: 0, + }, + })) + }) + }) + }) + describe('with force: true', () => { beforeEach(() => { createfs({ diff --git a/cli/types/cypress.d.ts b/cli/types/cypress.d.ts index cbf91d0cf250..4cc3f6bfa233 100644 --- a/cli/types/cypress.d.ts +++ b/cli/types/cypress.d.ts @@ -7,7 +7,7 @@ declare namespace Cypress { type FileContents = string | any[] | object type HistoryDirection = 'back' | 'forward' type HttpMethod = string - type RequestBody = string | object + type RequestBody = string | object | boolean | null type ViewportOrientation = 'portrait' | 'landscape' type PrevSubject = keyof PrevSubjectMap type TestingType = 'e2e' | 'component' @@ -291,10 +291,14 @@ declare namespace Cypress { */ interface Spec { name: string // "config_passing_spec.js" - relative: string // "cypress/integration/config_passing_spec.js" or "__all" if clicked all specs button - absolute: string // "/Users/janelane/app/cypress/integration/config_passing_spec.js" + relative: string // "cypress/e2e/config_passing_spec.cy.js" or "__all" if clicked all specs button + absolute: string // "/Users/janelane/app/cypress/e2e/config_passing_spec.cy.js" specFilter?: string // optional spec filter used by the user specType?: CypressSpecType + baseName?: string // "config_passing_spec.cy.js" + fileExtension?: string // ".js" + fileName?: string // "config_passing_spec.cy" + id?: string // "U3BlYzovVXNlcnMvamFuZWxhbmUvYXBwL2N5cHJlc3MvZTJlL2NvbmZpZ19wYXNzaW5nX3NwZWMuY3kuanM=" } /** @@ -754,7 +758,7 @@ declare namespace Cypress { isInputType(element: JQuery | HTMLElement, type: string | string[]): boolean stringify(element: JQuery | HTMLElement, form: string): string getElements(element: JQuery): JQuery | HTMLElement[] - getContainsSelector(text: string, filter?: string): JQuery.Selector + getContainsSelector(text: string, filter?: string, options?: CaseMatchable): JQuery.Selector getFirstDeepestElement(elements: HTMLElement[], index?: number): HTMLElement getWindowByElement(element: JQuery | HTMLElement): JQuery | HTMLElement getReasonIsHidden(element: JQuery | HTMLElement, options?: object): string diff --git a/cli/types/tests/cypress-tests.ts b/cli/types/tests/cypress-tests.ts index b2b5393e4d11..c31bfd636a8a 100644 --- a/cli/types/tests/cypress-tests.ts +++ b/cli/types/tests/cypress-tests.ts @@ -804,6 +804,7 @@ namespace CypressDomTests { Cypress.dom.stringify(el, 'foo') // $ExpectType string Cypress.dom.getElements(jel) // $ExpectType JQuery | HTMLElement[] Cypress.dom.getContainsSelector('foo', 'bar') // $ExpectType string + Cypress.dom.getContainsSelector('foo', 'bar', { matchCase: true }) // $ExpectType string Cypress.dom.getFirstDeepestElement([el], 1) // $ExpectType HTMLElement Cypress.dom.getWindowByElement(el) // $ExpectType HTMLElement | JQuery Cypress.dom.getReasonIsHidden(el) // $ExpectType string @@ -839,6 +840,7 @@ namespace CypressDomTests { Cypress.dom.stringify('', 'foo') // $ExpectError Cypress.dom.getElements(el) // $ExpectError Cypress.dom.getContainsSelector(el, 'bar') // $ExpectError + Cypress.dom.getContainsSelector('foo', 'bar', { invalid: false }) // $ExpectError Cypress.dom.getFirstDeepestElement(el, 1) // $ExpectError Cypress.dom.getWindowByElement('') // $ExpectError Cypress.dom.getReasonIsHidden('') // $ExpectError diff --git a/cypress-prioritization-and-triage.md b/cypress-prioritization-and-triage.md deleted file mode 100644 index 7a5fb2ce79e9..000000000000 --- a/cypress-prioritization-and-triage.md +++ /dev/null @@ -1,139 +0,0 @@ -# The Cypress App Prioritization and Triage Methodology - -At Cypress, we love our open source community. We work every day to grow our partnership with the community through open, honest, and straightforward communication about our processes and plans for the platform. The goal of this document is to provide resources that show our plans for the future and serve as a guide to our processes around handling issues that are raised by the open source community. - -## Table of Contents - -- [The Cypress App Priorities](#the-cypress-app-priorities) -- [The Cypress App Roadmap](#the-cypress-app-roadmap) -- [The Cypress App Issue Triage](#the-cypress-app-issue-triage) - - [The Cypress App Triage Process](#the-cypress-app-triage-process) - - [The Power of a Great Ticket](#the-power-of-a-great-ticket) -- [How We Prioritize Issues](#how-we-prioritize-issues) - - [Cypress Relative Priority Score](#cypress-relative-priority-score) - - [Cypress Relative Priority to Effort Score](#cypress-relative-priority-to-effort-score) -- [FAQs](#faqs) - - [Why Isn't Anyone Working on My Issue?](#why-isnt-anyone-working-on-my-issue) - - [Why Did You Close My Ticket?](#why-did-you-close-my-ticket) - - [Backpatching Strategy/Limitations](#backpatching-strategylimitations) -- [How You Can Help](#how-you-can-help) - - -## The Cypress App Priorities - -The Cypress app is constantly looking to improve and grow our testing platform to meet the ever-growing needs of the testing world. Like any software platform, we must balance research, development, and maintenance against real-world resource constraints. We feel that transparency about our future plans will help us grow a stronger relationship with end users who understand that all choices involve trade-offs. - -## The Cypress App Roadmap - -[The Cypress App Priorities](https://github.com/orgs/cypress-io/projects/13/views/1) board shows the high-level roadmap at Cypress. - -The board flows from left to right as a project moves from the ideation and feasibility phase all the way to General Availability (GA) release. - -Here is a guide to what each column on the board represents: - -| Column Name | Description | - | :------------------------------------ | :---------------------- | - | **Under Consideration** | These tickets are currently being discussed for future work. We are investigating the complexity of the change, the amount of resources necessary to complete it, and how it aligns with other goals for the platform. It is important to note that **not all** items in this column make their way into our scheduled work. It is possible that, upon investigation, a ticket falls in priority due to other goals or constraints. | -| **Planned** | These are the tickets we are planning to work on, but the work has not yet started. | -| **In Progress** | These tickets are actively being worked on. | -| **Experimental** | If a ticket involves a substantial refactoring of the codebase, is large in scope or is a complex feature, we often release them in a turned-off state. End users can opt in to experiment with these changes via feature flags. Work is still ongoing, but we feel it is important to get this feature in users' hands. Feedback is always welcome, but it is especially helpful during this phase of the development cycle. Not all issues are released under the experimental flag before GA. | -| **Released** | Once an issue has been fully implemented, tested, and bundled into an official release it moves to this column. Features in this column are no longer experimental, feature flags are removed and default behaviors are implemented. | - -## The Cypress App Issue Triage - -Whenever an issue is created in the [Cypress repo](https://github.com/cypress-io/cypress/) it is added to the [Cypress App Triage Board](https://github.com/orgs/cypress-io/projects/9/views/1). This board represents all issues we are actively working to investigate and reproduce before routing them to the appropriate team for [prioritization](#how-we-prioritize-issues). Prioritization does not necessarily mean that an issue will be worked on - priority scoring simply helps us create a relative ordering of potential work that is ranked according to standards we have defined as most important to Cypress and the community. - -### The Cypress App Triage Process - -At Cypress, we use two-week sprints. During each sprint, a rotating group of developers is assigned to the triage team. Their responsibilities are only to focus on triaging issues entered into the [Cypress repo](https://github.com/cypress-io/cypress/). Each issue is assigned to a team member for analysis and assessment and follows this general path: - -- **Assessment** - The goal of this step is to do a high-level analysis of the problem. If the issue is clear and the probable impact of the ticket is large in both scope and severity and affecting many users, we will internally escalate the issue and work to get it resolved as quickly as possible. During this phase we will often try and suggest workarounds that may help you get around the issue in the short term while we investigate further. This may not always be possible, but we will try our best to make sure you are not totally impeded. - -- **Reproduction** - The goal of this phase is to fully understand the issue described in the ticket and, most importantly, replicate the issue. The reason issue replication is so important to us at Cypress is that we believe our teams' development time is best spent on issues we can verify. In order to know if any solution solves a specific problem, we first need to be able to reliably reproduce it. A vast majority of our time in triage is spent trying to reproduce the issues our users are encountering. With a huge spectrum of users using countless permutations of hardware, operating systems, versions of Cypress, Node.js, CI configurations, unique web applications they are testing, and more, it can be very challenging to narrow down problems into something that is ready for prioritization by a team. This is where our end users can help us the most. The easier it is for us to recreate your issue, the sooner we can route it to our teams for prioritization. The best way to provide a reproducible example of your problem is to fork our [cypress-test-tiny repo](https://github.com/cypress-io/cypress-test-tiny) and replicate the issue there. At a minimum we will need a [short, self contained, correct example](http://sscce.org/) in order to assist in most cases. - -- **Routing** - Once we have clarified any questions we have on a submitted ticket and we are able to replicate the problem internally, the ticket is ready to be routed to the appropriate team at Cypress. - -- **Prioritization** - Teams meet regularly to review tickets that have been routed to them via triage. They evaluate each ticket based on a number of criteria outlined in our [prioritization rubric](#prioritization-rubric). Each dimension of our prioritization rubric carries a weight. The following equation is then used to give us a **relative priority**. The relative priority score is then divided by the estimated effort to address the ticket to give us a **priority-to-effort** score which we then use to determine which tickets are the highest priority. -**Important note - These priorities do not dictate when a team will be able to start work. This simply gives teams the data they need to make informed prioritization choices.** - -- **Resolution and Verification** - Once an issue has been picked up for work, it will have the label **Stage: Under Development** attached. Developers will then begin work on the issue. Sometimes the scope of the work will be greater than the ticket submitted, and a parent ticket will be created to encapsulate the entire scope of the work. A link to the original ticket will be created in the new ticket. - -- **Release** - Once work has been finished, the ticket will be scheduled for release. If the changes are non-breaking, we generally aim to include the work in the next minor release every-other Tuesday. If the changes made to address the issue require breaking changes, the issue will be scheduled for our next major release roughly every quarter. - -### The Power of a Great Ticket - -One of the best ways to help get your ticket validated, replicated, routed and prioritized is to include as much information as possible. Our issue template will walk you through the most common information that we will need to best troubleshoot the problem. **Please do not open issues from GitHub discussion comments.** - -Here are some tips for providing a [Short, Self Contained, Correct, Example](http://sscce.org/) and our own [Troubleshooting Cypress](https://on.cypress.io/troubleshooting) guide. Another great way to assist us in replicating your issue is to fork our [cypress-test-tiny repo](https://github.com/cypress-io/cypress-test-tiny) and recreate the issue there. - -We will always need replication steps, so please include them when submitting an issue. Going back and forth to gather the basic data is all time we could be using to investigate and address the issue, so please be considerate of our developers' time and include the requested details when submitting an issue. - -## How We Prioritize Issues - -At Cypress, we use the following guidelines to help us standardize the importance of every ticket submitted. Of course there are subjective interpretations for each of these fields, but the goal is that each ticket is considered and examined thoroughly in a standardized way. Once values have been determined for each field, a total priority is calculated. It is important to note that these values are **a guide** to make informed decisions around what issues bring the most value to the community and Cypress as an organization. They are relative and fuzzy and not to be treated as gospel. It is also important to understand that these values may change as future factors and circumstances change. - -### Prioritization Rubric - -Here are the criteria we use to gauge relative issue priority: - -| Criteria | Weight | Description | -|:---------------------|:---------:|:-----------------------------------------------------------------------------------| -| Scope | 0.7 | How many users does this affect? | -| Severity | 1.0 | What does the problem prevent users from doing? Is it an edge case? A primary test flow? A minor annoyance? | -| Visibility | 0.5 | Is this an important issue to our community? Is there a lot of discussion around it? | -| Does Workaround Exist | 0.4 | Does a work around exist that is reasonable? | -| Regression | 0.7 | Did this previously work? How long ago did it last work? Was this a regression within this last (current) major version? | -| Cypress Priority | 0.75 | Does Cypress have a vested interest in resolving this issue? For example, does it ease the support burden for our staff? Is this part of a corporate milestone or objective? | -| Effort | 0.75 | How much effort is needed to resolve the issue? Estimates are for a single developer being assigned to the issue. | - -### Cypress Relative Priority Score - -The formula for calculating the Cypress Relative Priority Score (CRPS) is the weighted sum of our priority criteria: - -$$ \text{Cypress Relative Priority Score} = {{(Scope \times 0.7) + (Severity \times 1.0) + (Visibility \times 0.5) + (WorkAround \times 0.4) + (Regression \times 0.7) + (CypressPriority \times 0.75)}} $$ - -### Cypress Relative Priority to Effort Score - -It is important to remember that just because an issue has a high CRPS, that doesn't mean it is necessarily the best way to allocate limited resources. To determine which gives us the greatest bang for the proverbial buck, we weigh CRPS versus the effort required to address the issue. - -$$ \text{Cypress Relative Priority to Effort Score} = {\text{Cypress Relative Priority Score} \over {Effort}} $$ - -**Cypress Relative Priority to Effort Score** gives us a metric that better represents the effort-to-reward ratio for any proposed work. - -## FAQs - -### Why isn't anyone working on my issue?! - -We understand that it can be frustrating to take time to submit an issue, only to see it sit in the backlog untouched for a long period of time. We truly wish we could take up every single issue that comes in, but given the relatively small size of our internal teams and the large and varied user base of Cypress it just isn't possible to solve every issue. Our prioritization process helps us float the most important issues to the top based on the impact vs effort ratio of any given issue. It is important to remember that, just because an issue is not being actively worked on, does not mean we are ignoring the issue; it means that we have other issues we feel are more impactful to the user base and are prioritizing those issues first. - -Even when our internal developers cannot work on your issue, that does not mean all hope is lost! Being an open source project means you can be part of the solution. We love when our community commits code and want to encourage everyone to feel empowered to contribute and make the product we all love and use even better. We have guides on [how to contribute](https://github.com/cypress-io/cypress/blob/develop/CONTRIBUTING.md) and a very active [Discord community](https://discord.gg/cypress) which can help if you are interested in opening a PR. - -### Why did you close my ticket? - -There are a number of reasons why a ticket may be closed without any change or PR being opened. - -- **No Response From Author** - The most common reason is lack of response from the author. Our issue creation template prompts the user for many details that are vital in debugging and replicating an issue. It is not uncommon for issues to be entered with insufficient information for our teams to properly investigate an issue. We will often reach out for more details, but we do not have the bandwidth to chase down users for information. **If we do not receive a response within 7 days, we will close your ticket.** The best way to help get your issue worked on by a Cypress team member is to provide the information requested and give as much detail as possible (or, even better, a reproducible example in our [cypress-tiny repo](https://github.com/cypress-io/cypress-test-tiny)) in a timely manner. - -- **Not a bug or feature request** - Issues entered into the [Cypress repo](https://github.com/cypress-io/cypress) are for bugs and feature requests for the Cypress App only. Updates to [documentation](https://github.com/cypress-io/cypress-documentation), our [example-kitchensink app](https://github.com/cypress-io/cypress-example-kitchensink), or [another repository](https://github.com/cypress-io) should be made in the appropriate repository. -The best place for asking questions is our [Discord server](https://discord.gg/cypress) which has a very active community of folks with a diverse set of knowledge. Other available channels to explore include [Cypress GitHub discussions](https://github.com/cypress-io/cypress/discussions), [community chat](https://on.cypress.io/chat), and [Stack Overflow](https://stackoverflow.com/questions/tagged/cypress). -We also offer support via email with our [paid plans](https://www.cypress.io/pricing/). - -- **Feature request for Cypress Cloud** - Thank you for your support as a Cypress Cloud user! These issues are routed to our Cypress Cloud team's ticketing system. Your customer success representative is available for follow-up and will reach out you directly via email if more information is needed. - -- **The fix or feature is not within our vision for Cypress** - There will inevitably be suggestions that will not fit within the scope of Cypress' vision for our product. We will do our best to explain why we will not be addressing this issue. - -- **It's a dupe** - The issue you have entered has already been logged by another person. We will link the appropriate ticket and mark the issue as a duplicate. - -- **Cannot reproduce ecosystem** - Another common issue that can lead to a ticket being closed is that the setup involved in reproducing the problem is complex and specific to your implementation of Cypress. As any developer can imagine, the variety of ecosystems that run Cypress are as varied as the number of flowers in the world. And not surprisingly, we do not have infrastructure setup to mimic every possible scenario. It is possible, even likely, that we are not set up to investigate your specific use case of Cypress. This does not mean that the issue is not real and that it is not important. It simply means we are not equipped to investigate it any further. We are more than happy to point you in the direction of resources that may help you dive into your problem further on your own but we will not be able to replicate your entire stack internally to properly reproduce your problem. Without a consistent reproduction of the issue, it is highly unlikely an issue will be prioritized by a team for inclusion in their sprint work. These types of issues are a fantastic opportunity for our community to contribute. By opening a PR to address an issue you are encountering that is otherwise not being worked on, you are not only helping yourself and your organization but potentially anyone else who may be encountering your issue as well but has not spoken up about it. Cypress developers are always willing to help clean and prep a PR from the community to help you get it over the line and merged into the code base. Just open a PR and we will automatically see it on our triage board! If you have questions along the way, always remember we have a very active and helpful community in [Discord](https://discord.gg/cypress). - -- **Stumped, for now** - Sometimes an author provides all the details we could ask for, is very responsive, and uses a straightforward setup - and it still stumps the Cypress devs! The reality is that there are some issues we just can't figure out because of limited resources. We love our large and active community, but in order to support it, sometimes we must move on. We understand this is not something an active issue author wants to hear, but we do not have the resources to put infinite time and energy into every single issue until it is resolved. During the course of our investigation we will attempt to understand the scope of the users being affected by the problem in the issue. If we determine this is an edge case or of low impact to effected users, we will close the issue until such a time that more information comes to light that sheds new insight into the potential root of the problem. This is another example of a great opportunity for folks in the community to give back and open a PR. Nothing makes our day better than seeing a PR from the community! Opening a PR will automatically add that issue to our triage board where a Cypress dev will help you get the PR over the line and merged into the repo for release. And remember to drop into [Discord](https://discord.gg/cypress) if you have questions or need a helping hand. - -### Backpatching Strategy/Limitations - -At Cypress, we have a roll-forward approach to support. If you are encountering an issue while using an older version of Cypress, our first step will be to verify the problem is still happening on the latest version of the app. If you are unable to upgrade, we will want to understand what blockers are keeping you from upgrading. We want to understand friction points so that we can build a tool that is easy to stay current on. As such, we will only be backpatching fixes on an ad hoc basis. We will use the [prioritization rubric](#prioritization-rubric) to assess the issue's severity/impact and we will consider the reasons that users may be blocked from upgrading to a newer version of Cypress. - -## How You Can Help - -One of the pillars of Cypress' success is our community. Without your input and support we would not be the platform we are today. We wish we had the bandwidth to address every single issue that comes in, but the reality is that there simply isn't enough time in the day for our internal teams to give every single ticket the love and attention it deserves. - -This is where we hope the community can help us. As an open source project, our issue backlogs and source code are all out in the open. Please feel empowered to search those backlogs for issues important to you and add your input. Maybe you can add a reproducible example to a ticket that needs one, or can verify a problem is also happening for you with more detail, or even better - maybe you can [contribute a fix to the repo](https://github.com/cypress-io/cypress/blob/develop/CONTRIBUTING.md)! Your input and engagement is always appreciated. diff --git a/docker-compose.yml b/docker-compose.yml index 5b93acdd1ce0..849089685dfd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,7 +33,7 @@ services: - .:/opt/cypress ci: # This should mirror the image used in workflows.yml - image: cypress/browsers-internal:node18.15.0-chrome114-ff115 + image: cypress/browsers-internal:node18.17.1-chrome118-ff115 ports: - 5566:5566 - 5567:5567 diff --git a/guides/building-release-artifacts.md b/guides/building-release-artifacts.md index 2b4a5d6d53aa..a8b273e0771f 100644 --- a/guides/building-release-artifacts.md +++ b/guides/building-release-artifacts.md @@ -38,3 +38,9 @@ You can build the Cypress binary locally by running `yarn binary-build`, then pa If you're on macOS and building locally, you'll need a code-signing certificate in your keychain, which you can get by following the [instructions on Apple's website](https://developer.apple.com/library/archive/documentation/Security/Conceptual/CodeSigningGuide/Procedures/Procedures.html#//apple_ref/doc/uid/TP40005929-CH4-SW30). Also, you'll also most likely want to skip notarization since it requires an Apple Developer Program account - set `SKIP_NOTARIZATION=1` when building locally to do this. [More info about code signing in CI](./code-signing.md). `yarn binary-zip` can be used to zip the built binary together. + +### Tips + +If you want to speed up the time it takes to package the binary, set `V8_SNAPSHOT_DISABLE_MINIFY=1` + +If you are on an M1, you need to set `RESET_ADHOC_SIGNATURE=1` in order to be able to actually run the binary after packaging it. diff --git a/guides/e2e-open-testing.md b/guides/e2e-open-testing.md index ff2e7e36437d..fcac1952623a 100644 --- a/guides/e2e-open-testing.md +++ b/guides/e2e-open-testing.md @@ -34,6 +34,7 @@ it('should onboard a todos project', () => { it('should open todos in the app', () => { cy.startAppServer() // starts the express server used to run the "app" cy.visitApp() // visits the app page, without launching the browser + cy.specsPageIsVisible() cy.get('[href=#/runs]').click() cy.get('[href=#/settings]').click() }) diff --git a/guides/release-process.md b/guides/release-process.md index b5c8871b06d4..2f96cceab66b 100644 --- a/guides/release-process.md +++ b/guides/release-process.md @@ -91,7 +91,7 @@ _Note: It is advisable to notify the team that the `develop` branch is locked do 3. Create a Release PR - Bump, submit, get approvals on, and merge a new PR. This PR should: - Bump the Cypress `version` in [`package.json`](package.json) - - Bump the [`packages/example`](../packages/example) dependency if there is a new [`cypress-example-kitchensink`](https://github.com/cypress-io/cypress-example-kitchensink/releases) version + - Bump the [`packages/example`](../packages/example) dependency if there is a new [`cypress-example-kitchensink`](https://github.com/cypress-io/cypress-example-kitchensink/releases) version, and `yarn` to ensure the lockfile is up to date. - Follow the writing the [Cypress Changelog release steps](./writing-the-cypress-changelog.md#release) to update the [`cli/CHANGELOG.md`](../cli/CHANGELOG.md). 4. Once the `develop` branch is passing in CI and you have confirmed the `cypress-bot` has commented on the commit with the pre-release versions for `darwin-x64`, `darwin-arm64`, `linux-x64`,`linux-arm64`, and `win32-x64`, publishing can proceed. @@ -162,6 +162,10 @@ _Note: It is advisable to notify the team that the `develop` branch is locked do 15. Merge the documentation PR from step 11 and the new docker image PR created in step 12 to release the image. 16. If needed, deploy the updated [`cypress-example-kitchensink`][cypress-example-kitchensink] to `example.cypress.io` by following [these instructions under "Deployment"](../packages/example/README.md). + - Build `@packages/example` with `yarn workspace @packages/example build` + - Inspect the contents of `./packages/example/build` before deploying, and ensure it looks correct + - Run `yarn workspace @packages/example deploy`. This adds changes from `cypress-example-kitchensink` to a commit in the `gh-pages` branch, which will deploy to production with its own CI. + - Check the deployed site at `https://example.cypress.io` to ensure the new changes deployed correctly. 17. Once the release is complete, create a Github tag off of the release commit which bumped the version: ```shell @@ -178,7 +182,7 @@ _Note: It is advisable to notify the team that the `develop` branch is locked do 19. Add a comment to each GH issue that has been resolved with the new published version. Download the `releaseData.json` artifact from the `verify-release-readiness` CircleCI job and run the following command inside of [cypress-io/release-automations][release-automations]: ```shell - cd packages/issues-in-release && npm run do:comment -- --release-data + npm run do:comment -- --release-data ``` 22. Confirm there are no issues from the release with the label [stage: pending release](https://github.com/cypress-io/cypress/issues?q=label%3A%22stage%3A+pending+release%22+is%3Aclosed) left. @@ -191,7 +195,6 @@ _Note: It is advisable to notify the team that the `develop` branch is locked do - [cypress-example-todomvc](https://github.com/cypress-io/cypress-example-todomvc/issues/99) - [cypress-realworld-app](https://github.com/cypress-io/cypress-realworld-app/issues/41) - [cypress-example-recipes](https://github.com/cypress-io/cypress-example-recipes/issues/225) - - [cypress-example-docker-compose](https://github.com/cypress-io/cypress-example-docker-compose/issues/71) Take a break, you deserve it! 👉😎👉 diff --git a/npm/grep/README.md b/npm/grep/README.md index b752999a7984..355ec62f5b53 100644 --- a/npm/grep/README.md +++ b/npm/grep/README.md @@ -80,7 +80,7 @@ yarn add -D @cypress/grep **required:** load this module from the [support file](https://on.cypress.io/writing-and-organizing-tests#Support-file) or at the top of the spec file if not using the support file. You import the registration function and then call it: ```js -// cypress/support/index.js +// cypress/support/e2e.js // load and register the grep feature using "require" function // https://github.com/cypress-io/cypress/tree/develop/npm/grep const registerCypressGrep = require('@cypress/grep') diff --git a/npm/mount-utils/CHANGELOG.md b/npm/mount-utils/CHANGELOG.md index 7621fc2ece95..d788da152130 100644 --- a/npm/mount-utils/CHANGELOG.md +++ b/npm/mount-utils/CHANGELOG.md @@ -1,3 +1,10 @@ +# [@cypress/mount-utils-v4.1.0](https://github.com/cypress-io/cypress/compare/@cypress/mount-utils-v4.0.0...@cypress/mount-utils-v4.1.0) (2024-03-12) + + +### Features + +* supported type of vue@2.7+ ([#28818](https://github.com/cypress-io/cypress/issues/28818)) ([854a649](https://github.com/cypress-io/cypress/commit/854a6497be2315881b8ad9c92674d3c29a76d581)) + # [@cypress/mount-utils-v4.0.0](https://github.com/cypress-io/cypress/compare/@cypress/mount-utils-v3.0.0...@cypress/mount-utils-v4.0.0) (2022-12-02) diff --git a/npm/mount-utils/create-rollup-entry.mjs b/npm/mount-utils/create-rollup-entry.mjs index f3b0de4d610c..05ba2b654eaf 100644 --- a/npm/mount-utils/create-rollup-entry.mjs +++ b/npm/mount-utils/create-rollup-entry.mjs @@ -14,6 +14,7 @@ export function createEntries (options) { formats, input, config = {}, + dtsOptions = {}, } = options const banner = ` @@ -72,7 +73,7 @@ export function createEntries (options) { input, output: [{ file: 'dist/index.d.ts', format: 'es' }], plugins: [ - dts({ respectExternal: true }), + dts({ respectExternal: true, ...dtsOptions }), { name: 'cypress-types-reference', // rollup-plugin-dts does not add '// ' like rollup-plugin-typescript2 did so we add it here. diff --git a/npm/puppeteer/CHANGELOG.md b/npm/puppeteer/CHANGELOG.md index ba968fa59e7a..dfc3d437bfc1 100644 --- a/npm/puppeteer/CHANGELOG.md +++ b/npm/puppeteer/CHANGELOG.md @@ -1,3 +1,10 @@ +# [@cypress/puppeteer-v0.1.3](https://github.com/cypress-io/cypress/compare/@cypress/puppeteer-v0.1.2...@cypress/puppeteer-v0.1.3) (2024-02-20) + + +### Bug Fixes + +* move main tab activation to puppeteer plugin ([#28898](https://github.com/cypress-io/cypress/issues/28898)) ([ed2fc13](https://github.com/cypress-io/cypress/commit/ed2fc1394623f08097d180747712c557d867ee86)) + # [@cypress/puppeteer-v0.1.2](https://github.com/cypress-io/cypress/compare/@cypress/puppeteer-v0.1.1...@cypress/puppeteer-v0.1.2) (2023-12-26) # [@cypress/puppeteer-v0.1.1](https://github.com/cypress-io/cypress/compare/@cypress/puppeteer-v0.1.0...@cypress/puppeteer-v0.1.1) (2023-11-29) diff --git a/npm/puppeteer/README.md b/npm/puppeteer/README.md index 3e1f1c9448d7..31063f2ae4ea 100644 --- a/npm/puppeteer/README.md +++ b/npm/puppeteer/README.md @@ -333,6 +333,15 @@ export default defineConfig({ }) ``` +## Troubleshooting + +### Error: Cannot communicate with the Cypress Chrome extension. Ensure the extension is enabled when using the Puppeteer plugin. + +If you receive this error in your command log, the Puppeteer plugin was unable to communicate with the Cypress extension. This extension is necessary in order to re-activate the main Cypress tab after a Puppeteer command, when running in open mode. + +* Ensure this extension is enabled in the instance of Chrome that Cypress launches by visiting chrome://extensions/ +* Ensure the Cypress extension is allowed by your company's security policy by its extension id, `caljajdfkjjjdehjdoimjkkakekklcck` + ## Contributing Build the TypeScript files: diff --git a/npm/puppeteer/package.json b/npm/puppeteer/package.json index 8c789277725e..717ba7c4857b 100644 --- a/npm/puppeteer/package.json +++ b/npm/puppeteer/package.json @@ -21,6 +21,7 @@ "puppeteer-core": "^21.2.1" }, "devDependencies": { + "@types/node": "^18.17.5", "chai-as-promised": "^7.1.1", "chokidar": "^3.5.3", "express": "4.17.3", diff --git a/npm/puppeteer/src/plugin/activateMainTab.ts b/npm/puppeteer/src/plugin/activateMainTab.ts new file mode 100644 index 000000000000..8d435b6fab21 --- /dev/null +++ b/npm/puppeteer/src/plugin/activateMainTab.ts @@ -0,0 +1,46 @@ +/// +import type { Browser } from 'puppeteer-core' + +export const ACTIVATION_TIMEOUT = 2000 + +const sendActivationMessage = (activationTimeout: number) => { + // don't need to worry about tabs for Cy in Cy tests + if (document.defaultView !== top) { + return + } + + let timeout: NodeJS.Timeout + let onMessage: (ev: MessageEvent) => void + + // promise must resolve with a value for chai as promised to test resolution + return new Promise((resolve, reject) => { + onMessage = (ev) => { + if (ev.data.message === 'cypress:extension:main:tab:activated') { + window.removeEventListener('message', onMessage) + clearTimeout(timeout) + resolve() + } + } + + window.addEventListener('message', onMessage) + window.postMessage({ message: 'cypress:extension:activate:main:tab' }) + + timeout = setTimeout(() => { + window.removeEventListener('message', onMessage) + reject() + }, activationTimeout) + }) +} + +export const activateMainTab = async (browser: Browser) => { + // - Only implemented for Chromium right now. Support for Firefox/webkit + // could be added later + // - Electron doesn't have tabs + // - Focus doesn't matter for headless browsers and old headless Chrome + // doesn't run the extension + const [page] = await browser.pages() + + if (page) { + return page.evaluate(sendActivationMessage, ACTIVATION_TIMEOUT) + } +} diff --git a/npm/puppeteer/src/plugin/setup.ts b/npm/puppeteer/src/plugin/setup.ts index 999e52c45546..3f0d1f513379 100644 --- a/npm/puppeteer/src/plugin/setup.ts +++ b/npm/puppeteer/src/plugin/setup.ts @@ -1,8 +1,9 @@ import isPlainObject from 'lodash/isPlainObject' import defaultPuppeteer, { Browser, PuppeteerNode } from 'puppeteer-core' import { pluginError } from './util' +import { activateMainTab } from './activateMainTab' -type MessageHandler = (browser: Browser, ...args: any[]) => any | Promise +export type MessageHandler = (browser: Browser, ...args: any[]) => any | Promise interface SetupOptions { onMessage: Record @@ -61,7 +62,7 @@ export function setup (options: SetupOptions) { let debuggerUrl: string try { - options.on('after:browser:launch', async (browser, options) => { + options.on('after:browser:launch', (browser: Cypress.Browser, options: Cypress.AfterBrowserLaunchDetails) => { cypressBrowser = browser debuggerUrl = options.webSocketDebuggerUrl }) @@ -110,6 +111,21 @@ export function setup (options: SetupOptions) { } catch (err: any) { error = err } finally { + // - Only implemented for Chromium right now. Support for Firefox/webkit + // could be added later + // - Electron doesn't have tabs + // - Focus doesn't matter for headless browsers and old headless Chrome + // doesn't run the extension + const isHeadedChromium = cypressBrowser.isHeaded && cypressBrowser.family === 'chromium' && cypressBrowser.name !== 'electron' + + if (isHeadedChromium) { + try { + await activateMainTab(browser) + } catch (e) { + return messageHandlerError(pluginError('Cannot communicate with the Cypress Chrome extension. Ensure the extension is enabled when using the Puppeteer plugin.')) + } + } + await browser.disconnect() } diff --git a/npm/puppeteer/test/unit/activateMainTab.spec.ts b/npm/puppeteer/test/unit/activateMainTab.spec.ts new file mode 100644 index 000000000000..5089e4dd159d --- /dev/null +++ b/npm/puppeteer/test/unit/activateMainTab.spec.ts @@ -0,0 +1,118 @@ +import { expect, use } from 'chai' +import chaiAsPromised from 'chai-as-promised' +import sinon from 'sinon' +import sinonChai from 'sinon-chai' +import type { Browser, Page } from 'puppeteer-core' +import { activateMainTab, ACTIVATION_TIMEOUT } from '../../src/plugin/activateMainTab' + +use(chaiAsPromised) +use(sinonChai) + +describe('activateMainTab', () => { + let clock: sinon.SinonFakeTimers + let prevWin: Window + let prevDoc: Document + let prevTop: Window & typeof globalThis + let window: Partial + let mockDocument: Partial & { + defaultView: Window & typeof globalThis + } + let mockTop: Partial + let mockBrowser: Partial + let mockPage: Partial + + beforeEach(() => { + clock = sinon.useFakeTimers() + + window = { + addEventListener: sinon.stub(), + removeEventListener: sinon.stub(), + + // @ts-ignore sinon gets confused about postMessage type declaration + postMessage: sinon.stub(), + } + + mockDocument = { + defaultView: window as Window & typeof globalThis, + } + + mockTop = mockDocument.defaultView + + // activateMainTab is eval'd in browser context, but the tests exec in a + // node context. We don't necessarily need to do this swap, but it makes the + // tests more portable. + // @ts-ignore + prevWin = global.window + prevDoc = global.document + // @ts-ignore + prevTop = global.top + //@ts-ignore + global.window = window + global.document = mockDocument as Document + //@ts-ignore + global.top = mockTop + + mockPage = { + evaluate: sinon.stub().callsFake((fn, ...args) => fn(...args)), + } + + mockBrowser = { + pages: sinon.stub(), + } + }) + + afterEach(() => { + clock.restore() + // @ts-ignore + global.window = prevWin + // @ts-ignore + global.top = prevTop + global.document = prevDoc + }) + + it('sends a tab activation request to the plugin, and resolves when the ack event is received', async () => { + const pagePromise = Promise.resolve([mockPage]) + + ;(mockBrowser.pages as sinon.SinonStub).returns(pagePromise) + const p = activateMainTab(mockBrowser as Browser) + + await pagePromise + // @ts-ignore + window.addEventListener.withArgs('message').yield({ data: { message: 'cypress:extension:main:tab:activated' } }) + expect(window.postMessage).to.be.calledWith({ message: 'cypress:extension:activate:main:tab' }) + + expect(p).to.eventually.be.true + }) + + it('sends a tab activation request to the plugin, and rejects if it times out', async () => { + const pagePromise = Promise.resolve([mockPage]) + + ;(mockBrowser.pages as sinon.SinonStub).returns(pagePromise) + await pagePromise + + const p = activateMainTab(mockBrowser as Browser) + + clock.tick(ACTIVATION_TIMEOUT + 1) + + expect(p).to.be.rejected + }) + + describe('when cy in cy', () => { + beforeEach(() => { + mockDocument.defaultView = {} as Window & typeof globalThis + }) + + it('does not try to send tab activation message', async () => { + const pagePromise = Promise.resolve([mockPage]) + + ;(mockBrowser.pages as sinon.SinonStub).returns(pagePromise) + + const p = activateMainTab(mockBrowser as Browser) + + await pagePromise + expect(window.postMessage).not.to.be.called + expect(window.addEventListener).not.to.be.called + await p + }) + }) +}) diff --git a/npm/puppeteer/test/unit/setup.spec.ts b/npm/puppeteer/test/unit/setup.spec.ts index a2b1ee1d16d2..f33b4dc7f8b1 100644 --- a/npm/puppeteer/test/unit/setup.spec.ts +++ b/npm/puppeteer/test/unit/setup.spec.ts @@ -1,23 +1,61 @@ import { expect, use } from 'chai' import chaiAsPromised from 'chai-as-promised' -import type { PuppeteerNode } from 'puppeteer-core' +import type { PuppeteerNode, Browser } from 'puppeteer-core' import sinon from 'sinon' import sinonChai from 'sinon-chai' - +import { MessageHandler } from '../../src/plugin/setup' import { setup } from '../../src/plugin' +import * as activateMainTabExport from '../../src/plugin/activateMainTab' use(chaiAsPromised) use(sinonChai) -function getTask (on: sinon.SinonStub) { - return on.withArgs('task').lastCall.args[1].__cypressPuppeteer__ -} +type StubbedMessageHandler = sinon.SinonStub, ReturnType> describe('#setup', () => { - it('registers `after:browser:launch` and `task` handlers', () => { - const on = sinon.stub() + let mockBrowser: Partial + let mockPuppeteer: Pick + let on: sinon.SinonStub + let onMessage: Record + + const testTask = 'test' + let testTaskHandler: StubbedMessageHandler + + function getTask () { + return on.withArgs('task').lastCall.args[1].__cypressPuppeteer__ + } + + function simulateBrowserLaunch () { + return on.withArgs('after:browser:launch').yield({ family: 'chromium', isHeaded: true }, { webSocketDebuggerUrl: 'ws://debugger' }) + } + + beforeEach(() => { + sinon.stub(activateMainTabExport, 'activateMainTab') + mockBrowser = { + disconnect: sinon.stub().resolves(), + } - setup({ on, onMessage: {} }) + mockPuppeteer = { + connect: sinon.stub().resolves(mockBrowser), + } + + on = sinon.stub() + + testTaskHandler = sinon.stub() + + onMessage = { + [testTask]: testTaskHandler, + } + }) + + afterEach(() => { + sinon.reset() + + ;(activateMainTabExport.activateMainTab as sinon.SinonStub).restore() + }) + + it('registers `after:browser:launch` and `task` handlers', () => { + setup({ on, onMessage }) expect(on).to.be.calledWith('after:browser:launch') expect(on).to.be.calledWith('task') @@ -27,137 +65,102 @@ describe('#setup', () => { const error = new Error('Event not registered') error.stack = '' - const on = sinon.stub().throws(error) + on.throws(error) - expect(() => setup({ on, onMessage: {} })).to.throw('Could not set up `after:browser:launch` task. Ensure you are running Cypress >= 13.6.0. The following error was encountered:\n\n') + expect(() => setup({ on, onMessage })).to.throw('Could not set up `after:browser:launch` task. Ensure you are running Cypress >= 13.6.0. The following error was encountered:\n\n') }) describe('running message handler', () => { it('connects puppeteer to browser', async () => { - const on = sinon.stub() - const puppeteer = { - connect: sinon.stub().resolves({ - disconnect () {}, - }), - } - setup({ on, - puppeteer: puppeteer as unknown as PuppeteerNode, - onMessage: { test: sinon.stub() }, + puppeteer: mockPuppeteer as PuppeteerNode, + onMessage, }) - on.withArgs('after:browser:launch').lastCall.args[1]({ family: 'chromium' }, { webSocketDebuggerUrl: 'ws://debugger' }) + simulateBrowserLaunch() - const task = getTask(on) + const task = getTask() - await task({ name: 'test', args: [] }) + await task({ name: testTask, args: [] }) - expect(puppeteer.connect).to.be.calledWith({ + expect(mockPuppeteer.connect).to.be.calledWith({ browserWSEndpoint: 'ws://debugger', defaultViewport: null, }) }) it('calls the specified message handler with the browser and args', async () => { - const on = sinon.stub() - const browser = { disconnect () {} } - const puppeteer = { - connect: sinon.stub().resolves(browser), - } - const handler = sinon.stub() - setup({ on, - puppeteer: puppeteer as unknown as PuppeteerNode, - onMessage: { test: handler }, + puppeteer: mockPuppeteer as PuppeteerNode, + onMessage, }) - on.withArgs('after:browser:launch').lastCall.args[1]({ family: 'chromium' }, { webSocketDebuggerUrl: 'ws://debugger' }) + simulateBrowserLaunch() - const task = getTask(on) + const task = getTask() - await task({ name: 'test', args: ['arg1', 'arg2'] }) + await task({ name: testTask, args: ['arg1', 'arg2'] }) - expect(handler).to.be.calledWith(browser, 'arg1', 'arg2') + expect(testTaskHandler).to.be.calledWith(mockBrowser, 'arg1', 'arg2') }) it('disconnects the browser once the message handler is finished', async () => { - const on = sinon.stub() - const browser = { disconnect: sinon.stub() } - const puppeteer = { - connect: sinon.stub().resolves(browser), - } - const handler = sinon.stub() - setup({ on, - puppeteer: puppeteer as unknown as PuppeteerNode, - onMessage: { test: handler }, + puppeteer: mockPuppeteer as PuppeteerNode, + onMessage, }) - on.withArgs('after:browser:launch').lastCall.args[1]({ family: 'chromium' }, { webSocketDebuggerUrl: 'ws://debugger' }) + simulateBrowserLaunch() - const task = getTask(on) + const task = getTask() - await task({ name: 'test', args: ['arg1', 'arg2'] }) + await task({ name: testTask, args: ['arg1', 'arg2'] }) - expect(browser.disconnect).to.be.called + expect(mockBrowser.disconnect).to.be.called }) it('returns the result of the handler', async () => { - const on = sinon.stub() - const browser = { disconnect: sinon.stub() } - const puppeteer = { - connect: sinon.stub().resolves(browser), - } - const handler = sinon.stub().resolves('result') + const resolution = 'result' + + onMessage[testTask].resolves(resolution) setup({ on, - puppeteer: puppeteer as unknown as PuppeteerNode, - onMessage: { test: handler }, + puppeteer: mockPuppeteer as PuppeteerNode, + onMessage, }) - on.withArgs('after:browser:launch').lastCall.args[1]({ family: 'chromium' }, { webSocketDebuggerUrl: 'ws://debugger' }) + simulateBrowserLaunch() - const task = getTask(on) - const returnValue = await task({ name: 'test', args: ['arg1', 'arg2'] }) + const task = getTask() + const returnValue = await task({ name: testTask, args: ['arg1', 'arg2'] }) - expect(returnValue).to.equal('result') + expect(returnValue).to.equal(resolution) }) it('returns null if message handler returns undefined', async () => { - const on = sinon.stub() - const browser = { disconnect: sinon.stub() } - const puppeteer = { - connect: sinon.stub().resolves(browser), - } - const handler = sinon.stub().resolves(undefined) - + onMessage[testTask].resolves(undefined) setup({ on, - puppeteer: puppeteer as unknown as PuppeteerNode, - onMessage: { test: handler }, + puppeteer: mockPuppeteer as PuppeteerNode, + onMessage, }) - on.withArgs('after:browser:launch').lastCall.args[1]({ family: 'chromium' }, { webSocketDebuggerUrl: 'ws://debugger' }) + simulateBrowserLaunch() - const task = getTask(on) - const returnValue = await task({ name: 'test', args: ['arg1', 'arg2'] }) + const task = getTask() + const returnValue = await task({ name: testTask, args: ['arg1', 'arg2'] }) expect(returnValue).to.be.null }) it('returns error object if debugger URL reference is lost', async () => { - const on = sinon.stub() - - setup({ on, onMessage: { - exists1: () => {}, - exists2: () => {}, - } }) + setup({ on, onMessage }) - const task = getTask(on) + const task = getTask() const returnValue = await task({ name: 'nonexistent', args: [] }) expect(returnValue.__error__).to.be.an('object') @@ -167,16 +170,11 @@ describe('#setup', () => { }) it('returns error object if browser is not supported', async () => { - const on = sinon.stub() + setup({ on, onMessage }) - setup({ on, onMessage: { - exists1: () => {}, - exists2: () => {}, - } }) + on.withArgs('after:browser:launch').yield({ family: 'Firefox' }, {}) - on.withArgs('after:browser:launch').lastCall.args[1]({ family: 'Firefox' }, {}) - - const task = getTask(on) + const task = getTask() const returnValue = await task({ name: 'nonexistent', args: [] }) expect(returnValue.__error__).to.be.an('object') @@ -186,57 +184,43 @@ describe('#setup', () => { }) it('disconnects browser and returns error object if message handler errors', async () => { - const on = sinon.stub() - const browser = { disconnect: sinon.stub() } - const puppeteer = { - connect: sinon.stub().resolves(browser), - } - const handler = sinon.stub().rejects(new Error('handler error')) - + testTaskHandler.rejects(new Error('handler error')) setup({ on, - puppeteer: puppeteer as unknown as PuppeteerNode, - onMessage: { test: handler }, + puppeteer: mockPuppeteer as PuppeteerNode, + onMessage, }) - on.withArgs('after:browser:launch').lastCall.args[1]({ family: 'chromium' }, { webSocketDebuggerUrl: 'ws://debugger' }) + simulateBrowserLaunch() - const task = getTask(on) - const returnValue = await task({ name: 'test', args: ['arg1', 'arg2'] }) + const task = getTask() + const returnValue = await task({ name: testTask, args: ['arg1', 'arg2'] }) - expect(browser.disconnect).to.be.called + expect(mockBrowser.disconnect).to.be.called expect(returnValue.__error__).to.be.an('object') expect(returnValue.__error__.message).to.equal('handler error') }) it('returns error object if message handler with given name cannot be found', async () => { - const on = sinon.stub() + setup({ on, onMessage }) - setup({ on, onMessage: { - exists1: () => {}, - exists2: () => {}, - } }) + simulateBrowserLaunch() - on.withArgs('after:browser:launch').lastCall.args[1]({ family: 'chromium' }, { webSocketDebuggerUrl: 'ws://debugger' }) - - const task = getTask(on) + const task = getTask() const returnValue = await task({ name: 'nonexistent', args: [] }) expect(returnValue.__error__).to.be.an('object') expect(returnValue.__error__.message).to.equal( - 'Could not find message handler with the name `nonexistent`. Registered message handler names are: exists1, exists2.', + 'Could not find message handler with the name `nonexistent`. Registered message handler names are: test.', ) }) it('returns error object if message handler with given name cannot be found', async () => { - const on = sinon.stub() - // @ts-expect-error setup({ on, onMessage: { notAFunction: true } }) - on.withArgs('after:browser:launch').lastCall.args[1]({ family: 'chromium' }, { webSocketDebuggerUrl: 'ws://debugger' }) - - const task = getTask(on) + simulateBrowserLaunch() + const task = getTask() const returnValue = await task({ name: 'notAFunction', args: [] }) expect(returnValue.__error__).to.be.an('object') @@ -244,6 +228,52 @@ describe('#setup', () => { 'Message handlers must be functions, but the message handler for the name `notAFunction` was type `boolean`.', ) }) + + it('calls activateMainTab if there is a page in the browser', async () => { + (activateMainTabExport.activateMainTab as sinon.SinonStub).withArgs(mockBrowser).resolves() + setup({ on, onMessage, puppeteer: mockPuppeteer as PuppeteerNode }) + const task = getTask() + + simulateBrowserLaunch() + await task({ name: testTask, args: [] }) + + expect(activateMainTabExport.activateMainTab).to.be.calledWith(mockBrowser) + }) + + it('returns an error object if activateMainTab rejects', async () => { + (activateMainTabExport.activateMainTab as sinon.SinonStub).withArgs(mockBrowser).rejects() + + setup({ on, onMessage, puppeteer: mockPuppeteer as PuppeteerNode }) + simulateBrowserLaunch() + + const task = getTask() + + const returnValue = await task({ name: testTask, args: [] }) + + expect(returnValue.__error__).to.be.an('object') + expect(returnValue.__error__.message).to.equal( + 'Cannot communicate with the Cypress Chrome extension. Ensure the extension is enabled when using the Puppeteer plugin.', + ) + }) + + it('does not try to activate main tab when the browser is headless', async () => { + setup({ on, onMessage, puppeteer: mockPuppeteer as PuppeteerNode }) + on.withArgs('after:browser:launch').yield({ family: 'chromium', isHeaded: false }, { webSocketDebuggerUrl: 'ws://debugger' }) + const task = getTask() + + await task({ name: testTask, args: [] }) + + expect(activateMainTabExport.activateMainTab).not.to.be.called + }) + + it('does not try to activate main tab when the browser is electron', async () => { + setup({ on, onMessage, puppeteer: mockPuppeteer as PuppeteerNode }) + on.withArgs('after:browser:launch').yield({ family: 'chromium', isHeaded: true, name: 'electron' }, { webSocketDebuggerUrl: 'ws://debugger' }) + const task = getTask() + + await task({ name: testTask, args: [] }) + expect(activateMainTabExport.activateMainTab).not.to.be.called + }) }) describe('validation', () => { diff --git a/npm/puppeteer/tsconfig.json b/npm/puppeteer/tsconfig.json index fc6b5493beba..faec3a8532de 100644 --- a/npm/puppeteer/tsconfig.json +++ b/npm/puppeteer/tsconfig.json @@ -15,7 +15,8 @@ "target": "ES2020", "types": [ "cypress", - "./support" + "./support", + "./node_modules/@types/node" ] }, "include": [ diff --git a/npm/react/package.json b/npm/react/package.json index 65404f824f48..f2c5ce4da66b 100644 --- a/npm/react/package.json +++ b/npm/react/package.json @@ -28,7 +28,7 @@ "react-router-dom": "6.0.0-alpha.1", "semver": "^7.5.3", "typescript": "^4.7.4", - "vite": "4.3.2", + "vite": "4.5.2", "vite-plugin-require-transform": "1.0.12" }, "peerDependencies": { diff --git a/npm/vite-dev-server/cypress/e2e/react.cy.ts b/npm/vite-dev-server/cypress/e2e/react.cy.ts index ce4925dd9849..b42eee9231d4 100644 --- a/npm/vite-dev-server/cypress/e2e/react.cy.ts +++ b/npm/vite-dev-server/cypress/e2e/react.cy.ts @@ -23,6 +23,7 @@ for (const project of VITE_REACT) { it('should mount a passing test', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('App.cy.jsx').click() cy.waitForSpecToFinish() cy.get('.passed > .num').should('contain', 2) @@ -35,6 +36,7 @@ for (const project of VITE_REACT) { }) cy.visitApp() + cy.specsPageIsVisible() cy.contains('MissingReact.cy.jsx').click() cy.waitForSpecToFinish() cy.get('.failed > .num').should('contain', 1) @@ -54,6 +56,7 @@ for (const project of VITE_REACT) { }) cy.visitApp() + cy.specsPageIsVisible() cy.contains('MissingReactInSpec.cy.jsx').click() cy.waitForSpecToFinish() cy.get('.failed > .num').should('contain', 1) @@ -73,6 +76,7 @@ for (const project of VITE_REACT) { }) cy.visitApp() + cy.specsPageIsVisible() cy.contains('AppCompilationError.cy.jsx').click() cy.waitForSpecToFinish() cy.get('.failed > .num').should('contain', 1) diff --git a/npm/vite-dev-server/cypress/e2e/vite-dev-server.cy.ts b/npm/vite-dev-server/cypress/e2e/vite-dev-server.cy.ts index b295a5a832ac..8a7d64aceb81 100644 --- a/npm/vite-dev-server/cypress/e2e/vite-dev-server.cy.ts +++ b/npm/vite-dev-server/cypress/e2e/vite-dev-server.cy.ts @@ -9,6 +9,7 @@ describe('Config options', () => { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() cy.contains('App.cy.jsx').click() cy.waitForSpecToFinish() cy.get('.passed > .num').should('contain', 1) @@ -48,6 +49,7 @@ describe('Config options', () => { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() cy.contains('App.cy.jsx').click() cy.waitForSpecToFinish() cy.get('.passed > .num').should('contain', 1) @@ -68,6 +70,7 @@ describe('Config options', () => { }, { specWithWhitespace }) cy.visitApp() + cy.specsPageIsVisible() cy.contains(specWithWhitespace).click() cy.get('.passed > .num').should('contain', 2) }) @@ -78,6 +81,7 @@ describe('Config options', () => { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() cy.contains('App.cy.jsx').click() cy.waitForSpecToFinish() cy.get('.passed > .num').should('contain', 2) @@ -89,6 +93,7 @@ describe('Config options', () => { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() cy.contains('App.cy.jsx').click() cy.waitForSpecToFinish() cy.get('.passed > .num').should('contain', 2) @@ -147,6 +152,7 @@ describe('sourcemaps', () => { const verifySourcemap = (specName: string, line: number, column: number) => { cy.visitApp() + cy.specsPageIsVisible() cy.contains(specName).click() cy.waitForSpecToFinish() cy.get('.failed > .num').should('contain', 2) diff --git a/npm/vite-dev-server/package.json b/npm/vite-dev-server/package.json index b1c40fb2da10..6ddf0b0a0888 100644 --- a/npm/vite-dev-server/package.json +++ b/npm/vite-dev-server/package.json @@ -26,7 +26,7 @@ "mocha": "^9.2.2", "sinon": "^13.0.1", "ts-node": "^10.9.2", - "vite": "4.3.2", + "vite": "4.5.2", "vite-plugin-inspect": "0.7.24" }, "files": [ diff --git a/npm/vite-plugin-cypress-esm/package.json b/npm/vite-plugin-cypress-esm/package.json index ea69ce3e0ac3..f4122491ba65 100644 --- a/npm/vite-plugin-cypress-esm/package.json +++ b/npm/vite-plugin-cypress-esm/package.json @@ -24,7 +24,7 @@ "react-query": "3.39.3", "react-router": "6.10.0", "react-router-dom": "6.10.0", - "vite": "4.1.4" + "vite": "4.5.2" }, "files": [ "dist", diff --git a/npm/vue/package.json b/npm/vue/package.json index d24c712596da..14ff2f3149d5 100644 --- a/npm/vue/package.json +++ b/npm/vue/package.json @@ -25,7 +25,7 @@ "globby": "^11.0.1", "tailwindcss": "1.1.4", "typescript": "^4.7.4", - "vite": "4.3.2", + "vite": "4.5.2", "vue": "3.2.47", "vue-i18n": "9.0.0-rc.6", "vue-router": "^4.0.0", diff --git a/npm/vue2/CHANGELOG.md b/npm/vue2/CHANGELOG.md index 6c5454e981ce..315a9658997a 100644 --- a/npm/vue2/CHANGELOG.md +++ b/npm/vue2/CHANGELOG.md @@ -1,3 +1,10 @@ +# [@cypress/vue2-v2.1.0](https://github.com/cypress-io/cypress/compare/@cypress/vue2-v2.0.1...@cypress/vue2-v2.1.0) (2024-03-12) + + +### Features + +* supported type of vue@2.7+ ([#28818](https://github.com/cypress-io/cypress/issues/28818)) ([854a649](https://github.com/cypress-io/cypress/commit/854a6497be2315881b8ad9c92674d3c29a76d581)) + # [@cypress/vue2-v2.0.1](https://github.com/cypress-io/cypress/compare/@cypress/vue2-v2.0.0...@cypress/vue2-v2.0.1) (2022-11-14) diff --git a/npm/vue2/package.json b/npm/vue2/package.json index 22348ad88aba..f83c37347226 100644 --- a/npm/vue2/package.json +++ b/npm/vue2/package.json @@ -19,7 +19,7 @@ "@vue/test-utils": "^1.3.1", "tslib": "^2.1.0", "typescript": "^4.7.4", - "vue": "2.6.12" + "vue": "2.7.16" }, "peerDependencies": { "cypress": ">=4.5.0", diff --git a/npm/vue2/rollup.config.mjs b/npm/vue2/rollup.config.mjs index bed807e40c5d..b693c9343a49 100644 --- a/npm/vue2/rollup.config.mjs +++ b/npm/vue2/rollup.config.mjs @@ -2,6 +2,10 @@ import { createEntries } from '@cypress/mount-utils/create-rollup-entry.mjs' import json from '@rollup/plugin-json' import replace from '@rollup/plugin-replace' +const dtsOptions = { + respectExternal: false, +} + const config = { external: [ 'vue', @@ -25,4 +29,4 @@ const config = { }, } -export default createEntries({ formats: ['es', 'cjs'], input: 'src/index.ts', config }) +export default createEntries({ formats: ['es', 'cjs'], input: 'src/index.ts', config, dtsOptions }) diff --git a/npm/vue2/src/index.ts b/npm/vue2/src/index.ts index 7b8c33364aea..c5c7a6c5541a 100644 --- a/npm/vue2/src/index.ts +++ b/npm/vue2/src/index.ts @@ -11,6 +11,7 @@ import { setupHooks, checkForRemovedStyleOptions, } from '@cypress/mount-utils' +import { ComponentPublicInstanceConstructor } from 'vue/types/v3-component-public-instance' const defaultOptions: (keyof MountOptions)[] = [ 'vue', @@ -119,7 +120,7 @@ const resetStoreVM = (Vue, { store }) => { * ^^^^^ this type * mount(Hello) */ -type VueComponent = Vue.ComponentOptions | Vue.VueConstructor +type VueComponent = Vue.ComponentOptions | Vue.VueConstructor | ComponentPublicInstanceConstructor /** * Options to pass to the component when creating it, like diff --git a/npm/webpack-dev-server/CHANGELOG.md b/npm/webpack-dev-server/CHANGELOG.md index d1d0425724cb..d99cba5a8b6c 100644 --- a/npm/webpack-dev-server/CHANGELOG.md +++ b/npm/webpack-dev-server/CHANGELOG.md @@ -1,3 +1,10 @@ +# [@cypress/webpack-dev-server-v3.7.4](https://github.com/cypress-io/cypress/compare/@cypress/webpack-dev-server-v3.7.3...@cypress/webpack-dev-server-v3.7.4) (2024-01-30) + + +### Bug Fixes + +* optimize reduce addCypressToWebpackEslintRulesInPlace ([#27819](https://github.com/cypress-io/cypress/issues/27819)) ([43792e7](https://github.com/cypress-io/cypress/commit/43792e7583651318ea4653fce914a16b9fd5ae48)) + # [@cypress/webpack-dev-server-v3.7.3](https://github.com/cypress-io/cypress/compare/@cypress/webpack-dev-server-v3.7.2...@cypress/webpack-dev-server-v3.7.3) (2024-01-12) # [@cypress/webpack-dev-server-v3.7.2](https://github.com/cypress-io/cypress/compare/@cypress/webpack-dev-server-v3.7.1...@cypress/webpack-dev-server-v3.7.2) (2023-12-26) diff --git a/npm/webpack-dev-server/cypress/e2e/angular.cy.ts b/npm/webpack-dev-server/cypress/e2e/angular.cy.ts index 7028cc094832..ab1d3ce7c955 100644 --- a/npm/webpack-dev-server/cypress/e2e/angular.cy.ts +++ b/npm/webpack-dev-server/cypress/e2e/angular.cy.ts @@ -38,6 +38,7 @@ for (const project of WEBPACK_ANGULAR) { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() }) } }) @@ -49,6 +50,7 @@ for (const project of WEBPACK_ANGULAR) { it('should mount a passing test', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('app.component.cy.ts').click() cy.waitForSpecToFinish({ passCount: 1 }, 60000) @@ -62,6 +64,7 @@ for (const project of WEBPACK_ANGULAR) { it('should live-reload on src changes', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('app.component.cy.ts').click() cy.waitForSpecToFinish({ passCount: 1 }, 60000) @@ -94,6 +97,7 @@ for (const project of WEBPACK_ANGULAR) { it('should show compilation errors on src changes', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('app.component.cy.ts').click() cy.waitForSpecToFinish({ passCount: 1 }, 60000) @@ -126,6 +130,7 @@ for (const project of WEBPACK_ANGULAR) { // TODO: fix flaky test https://github.com/cypress-io/cypress/issues/23455 it('should detect new spec', { retries: 15 }, () => { cy.visitApp() + cy.specsPageIsVisible() cy.withCtx(async (ctx) => { await ctx.actions.file.writeFileInProject( diff --git a/npm/webpack-dev-server/cypress/e2e/create-react-app.cy.ts b/npm/webpack-dev-server/cypress/e2e/create-react-app.cy.ts index 615b7e7499e6..3032513ba971 100644 --- a/npm/webpack-dev-server/cypress/e2e/create-react-app.cy.ts +++ b/npm/webpack-dev-server/cypress/e2e/create-react-app.cy.ts @@ -20,12 +20,14 @@ for (const project of WEBPACK_REACT) { it('should mount a passing test', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('App.cy.js').click() cy.waitForSpecToFinish({ passCount: 1 }) }) it('should live-reload on src changes', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('App.cy.js').click() cy.waitForSpecToFinish({ passCount: 1 }) @@ -52,6 +54,7 @@ for (const project of WEBPACK_REACT) { it('should show compilation errors on src changes', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('App.cy.js').click() cy.waitForSpecToFinish({ passCount: 1 }) @@ -70,6 +73,7 @@ for (const project of WEBPACK_REACT) { it('should detect new spec', () => { cy.visitApp() + cy.specsPageIsVisible() cy.withCtx(async (ctx) => { await ctx.actions.file.writeFileInProject( diff --git a/npm/webpack-dev-server/cypress/e2e/next.cy.ts b/npm/webpack-dev-server/cypress/e2e/next.cy.ts index c36c72f31bc3..0db22bf783c9 100644 --- a/npm/webpack-dev-server/cypress/e2e/next.cy.ts +++ b/npm/webpack-dev-server/cypress/e2e/next.cy.ts @@ -20,12 +20,14 @@ for (const project of WEBPACK_REACT) { it('should mount a passing test', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('index.cy.js').click() cy.waitForSpecToFinish({ passCount: 1 }) }) it('should live-reload on src changes', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('index.cy.js').click() cy.waitForSpecToFinish({ passCount: 1 }) @@ -56,6 +58,7 @@ for (const project of WEBPACK_REACT) { it('should show compilation errors on src changes', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('index.cy.js').click() cy.waitForSpecToFinish({ passCount: 1 }) @@ -78,6 +81,7 @@ for (const project of WEBPACK_REACT) { // TODO: fix flaky test https://github.com/cypress-io/cypress/issues/23417 it('should detect new spec', { retries: 15 }, () => { cy.visitApp() + cy.specsPageIsVisible() cy.withCtx(async (ctx) => { const newTestPath = ctx.path.join('pages', 'New.cy.js') @@ -96,6 +100,7 @@ for (const project of WEBPACK_REACT) { // TODO: fix flaky test https://github.com/cypress-io/cypress/issues/23417 it('should allow import of global styles in support file', { retries: 15 }, () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('styles.cy.js').click() cy.waitForSpecToFinish({ passCount: 1 }) }) diff --git a/npm/webpack-dev-server/cypress/e2e/nuxt.cy.ts b/npm/webpack-dev-server/cypress/e2e/nuxt.cy.ts index 1820ae184379..1feabb3c414a 100644 --- a/npm/webpack-dev-server/cypress/e2e/nuxt.cy.ts +++ b/npm/webpack-dev-server/cypress/e2e/nuxt.cy.ts @@ -22,6 +22,7 @@ for (const project of PROJECTS) { it('should mount a passing test and live-reload', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('Tutorial.cy.js').click() cy.waitForSpecToFinish({ passCount: 1 }) @@ -51,6 +52,7 @@ for (const project of PROJECTS) { it('should show compilation errors on src changes', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('Tutorial.cy.js').click() cy.waitForSpecToFinish({ passCount: 1 }) @@ -73,6 +75,7 @@ for (const project of PROJECTS) { // TODO: fix flaky test https://github.com/cypress-io/cypress/issues/23455 it('should detect new spec', { retries: 15 }, () => { cy.visitApp() + cy.specsPageIsVisible() cy.withCtx(async (ctx) => { const newSpecPath = ctx.path.join('components', 'New.cy.js') diff --git a/npm/webpack-dev-server/cypress/e2e/react.cy.ts b/npm/webpack-dev-server/cypress/e2e/react.cy.ts index a4f625ab4b60..b7b09b86b694 100644 --- a/npm/webpack-dev-server/cypress/e2e/react.cy.ts +++ b/npm/webpack-dev-server/cypress/e2e/react.cy.ts @@ -23,6 +23,7 @@ for (const project of WEBPACK_REACT) { it('should mount a passing test', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('App.cy.jsx').click() cy.waitForSpecToFinish({ passCount: 2 }) }) @@ -34,6 +35,7 @@ for (const project of WEBPACK_REACT) { }) cy.visitApp() + cy.specsPageIsVisible() cy.contains('MissingReact.cy.jsx').click() cy.waitForSpecToFinish({ failCount: 1 }) cy.get('.test-err-code-frame').should('be.visible') @@ -53,6 +55,7 @@ for (const project of WEBPACK_REACT) { }) cy.visitApp() + cy.specsPageIsVisible() cy.contains('MissingReactInSpec.cy.jsx').click() cy.waitForSpecToFinish({ failCount: 1 }) cy.get('.test-err-code-frame').should('be.visible') @@ -71,6 +74,7 @@ for (const project of WEBPACK_REACT) { }) cy.visitApp() + cy.specsPageIsVisible() cy.contains('AppCompilationError.cy.jsx').click() cy.waitForSpecToFinish({ failCount: 1 }) cy.contains('An uncaught error was detected outside of a test') @@ -114,6 +118,7 @@ for (const project of WEBPACK_REACT) { // https://cypress-io.atlassian.net/browse/UNIFY-1697 it('filters missing spec files from loader during pre-compilation', () => { cy.visitApp() + cy.specsPageIsVisible() // 1. assert spec executes successfully cy.contains('App.cy.jsx').click() diff --git a/npm/webpack-dev-server/cypress/e2e/vue-cli.cy.ts b/npm/webpack-dev-server/cypress/e2e/vue-cli.cy.ts index 5b0b32bc7313..bb1af5751089 100644 --- a/npm/webpack-dev-server/cypress/e2e/vue-cli.cy.ts +++ b/npm/webpack-dev-server/cypress/e2e/vue-cli.cy.ts @@ -20,6 +20,7 @@ for (const project of PROJECTS) { it('should mount a passing test', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('HelloWorld.cy.js').click() cy.waitForSpecToFinish({ passCount: 1 }) cy.get('.commands-container').within(() => { @@ -30,6 +31,7 @@ for (const project of PROJECTS) { it('should live-reload on src changes', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('HelloWorld.cy.js').click() cy.waitForSpecToFinish({ passCount: 1 }) @@ -60,6 +62,7 @@ for (const project of PROJECTS) { it('should show compilation errors on src changes', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('HelloWorld.cy.js').click() cy.waitForSpecToFinish({ passCount: 1 }) diff --git a/npm/webpack-dev-server/cypress/e2e/webpack-dev-server.cy.ts b/npm/webpack-dev-server/cypress/e2e/webpack-dev-server.cy.ts index b8609bf52a3b..20aeb097a76a 100644 --- a/npm/webpack-dev-server/cypress/e2e/webpack-dev-server.cy.ts +++ b/npm/webpack-dev-server/cypress/e2e/webpack-dev-server.cy.ts @@ -7,6 +7,7 @@ describe('Config options', () => { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() cy.contains('App.cy.jsx').click() cy.waitForSpecToFinish() cy.get('.passed > .num').should('contain', 1) @@ -18,6 +19,7 @@ describe('Config options', () => { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() cy.contains('foo.cy.js').click() cy.waitForSpecToFinish() cy.get('.passed > .num').should('contain', 1) @@ -29,6 +31,7 @@ describe('Config options', () => { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() cy.contains('App.cy.jsx').click() cy.waitForSpecToFinish() cy.get('.passed > .num').should('contain', 1) @@ -40,6 +43,7 @@ describe('Config options', () => { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() cy.contains('App.cy.jsx').click() cy.waitForSpecToFinish() cy.get('.passed > .num').should('contain', 2) @@ -57,6 +61,7 @@ describe('Config options', () => { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() cy.withCtx(async (ctx) => { await ctx.actions.file.writeFileInProject( @@ -75,6 +80,7 @@ describe('Config options', () => { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() cy.contains('relative-url.cy.jsx').click() cy.waitForSpecToFinish() cy.get('.passed > .num').should('contain', 1) diff --git a/npm/webpack-dev-server/src/helpers/createReactAppHandler.ts b/npm/webpack-dev-server/src/helpers/createReactAppHandler.ts index a99c756645c4..d0915b76265a 100644 --- a/npm/webpack-dev-server/src/helpers/createReactAppHandler.ts +++ b/npm/webpack-dev-server/src/helpers/createReactAppHandler.ts @@ -90,7 +90,11 @@ function addCypressToWebpackEslintRulesInPlace (webpackConfig: Configuration) { if (eslintPlugin) { const cypressGlobalsRules = cypressGlobals - .reduce((acc, global) => ({ ...acc, [global]: 'writable' }), {}) + .reduce>((acc, global) => { + acc[global] = 'writable' + + return acc + }, {}) eslintPlugin.options.baseConfig = { ...eslintPlugin.options.baseConfig, diff --git a/package.json b/package.json index d023848fcfde..13edb74f8f5b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cypress", - "version": "13.6.3", + "version": "13.7.1", "description": "Cypress is a next generation front end testing tool built for the modern web", "private": true, "scripts": { @@ -10,6 +10,7 @@ "binary-ensure": "node ./scripts/binary.js ensure", "binary-purge": "node ./scripts/binary.js purge-version", "binary-release": "node ./scripts/binary.js release", + "binary-smoke-test": "node ./scripts/binary.js smoke", "binary-upload": "node ./scripts/binary.js upload", "binary-zip": "node ./scripts/binary.js zip", "binary-package": "cross-env NODE_OPTIONS=--max_old_space_size=8192 node ./scripts/binary.js package", @@ -90,8 +91,8 @@ "@graphql-tools/utils": "8.2.3", "@graphql-tools/wrap": "8.1.1", "@nrwl/nx-cloud": "16.0.5", - "@octokit/auth-app": "3.6.1", - "@octokit/core": "3.6.0", + "@octokit/auth-app": "6.0.3", + "@octokit/core": "5.0.2", "@percy/cli": "1.27.4", "@semantic-release/changelog": "5.0.1", "@semantic-release/git": "9.0.0", @@ -145,7 +146,7 @@ "dedent": "^0.7.0", "del": "3.0.0", "detect-port": "^1.3.0", - "electron": "25.8.4", + "electron": "27.1.3", "electron-builder": "^23.6.0", "enzyme-adapter-react-16": "1.12.1", "eslint": "7.22.0", @@ -211,7 +212,7 @@ "yarn-deduplicate": "3.1.0" }, "engines": { - "node": ">=18.15.0", + "node": ">=18.17.0", "yarn": ">=1.17.3" }, "productName": "Cypress", diff --git a/packages/app/cypress/component/support/index.ts b/packages/app/cypress/component/support/index.ts index 744aa00fed7a..18d1ee68dad2 100644 --- a/packages/app/cypress/component/support/index.ts +++ b/packages/app/cypress/component/support/index.ts @@ -48,5 +48,5 @@ registerMountFn({ plugins: [() => createRouter(), () => pinia] }) installCustomPercyCommand() -Cypress.on('uncaught:exception', (err) => !err.message.includes('ResizeObserver loop limit exceeded')) +Cypress.on('uncaught:exception', (err) => !err.message.includes('ResizeObserver loop completed with undelivered notifications.')) Cypress.Commands.add('tabUntil', tabUntil) diff --git a/packages/app/cypress/e2e/create-from-component.cy.ts b/packages/app/cypress/e2e/create-from-component.cy.ts index 83c6f012b721..ad634e3eb803 100644 --- a/packages/app/cypress/e2e/create-from-component.cy.ts +++ b/packages/app/cypress/e2e/create-from-component.cy.ts @@ -211,6 +211,7 @@ describe('Create from component card', () => { cy.openProject('no-specs-vue-2', ['--component']) cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible('new-project') cy.findAllByTestId('card').eq(0).as('ComponentCard') }, 'src/components/HelloWorld.cy.js') @@ -222,6 +223,7 @@ describe('Create from component card', () => { cy.openProject('no-specs-vue-2', ['--config-file', 'cypress-custom-spec-pattern.config.js', '--component']) cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible('no-specs') cy.findByText('New spec').click() cy.findAllByTestId('card').eq(0).as('ComponentCard') @@ -236,6 +238,7 @@ describe('Create from component card', () => { cy.openProject('no-specs', ['--component']) cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible('new-project') cy.findAllByTestId('card').eq(0).as('ComponentCard') }, 'src/App.cy.jsx') @@ -247,6 +250,7 @@ describe('Create from component card', () => { cy.openProject('no-specs', ['--config-file', 'cypress-custom-spec-pattern.config.ts', '--component']) cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible('no-specs') cy.findByText('New spec').click() cy.findAllByTestId('card').eq(0).as('ComponentCard') diff --git a/packages/app/cypress/e2e/cypress-in-cypress-component.cy.ts b/packages/app/cypress/e2e/cypress-in-cypress-component.cy.ts index fda672f7e7d0..b6ce3b93d8cf 100644 --- a/packages/app/cypress/e2e/cypress-in-cypress-component.cy.ts +++ b/packages/app/cypress/e2e/cypress-in-cypress-component.cy.ts @@ -14,6 +14,7 @@ describe('Cypress In Cypress CT', { viewportWidth: 1500, defaultCommandTimeout: it('test component', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('TestComponent.spec').click() cy.waitForSpecToFinish() cy.get('[data-model-state="passed"]').should('contain', 'renders the test component') @@ -64,6 +65,7 @@ describe('Cypress In Cypress CT', { viewportWidth: 1500, defaultCommandTimeout: it('navigation between specs and other parts of the app works', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('TestComponent.spec').click() cy.waitForSpecToFinish() cy.get('[data-model-state="passed"]').should('contain', 'renders the test component') @@ -88,6 +90,7 @@ describe('Cypress In Cypress CT', { viewportWidth: 1500, defaultCommandTimeout: // TODO: fix flaky test https://github.com/cypress-io/cypress/issues/23159 it('redirects to the specs list with error if a spec is not found', { retries: 15 }, () => { cy.visitApp() + cy.specsPageIsVisible() const { title, intro, explainer } = defaultMessages.specPage.noSpecError const badFilePath = 'src/DoesNotExist.spec.js' @@ -129,6 +132,7 @@ describe('Cypress In Cypress CT', { viewportWidth: 1500, defaultCommandTimeout: it('browser picker in runner calls mutation with current spec path', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('TestComponent.spec').click() cy.waitForSpecToFinish() cy.get('[data-model-state="passed"]').should('contain', 'renders the test component') @@ -158,6 +162,7 @@ describe('Cypress In Cypress CT', { viewportWidth: 1500, defaultCommandTimeout: it('restarts server on devServer config change', () => { cy.visitApp() + cy.specsPageIsVisible() cy.get('[data-cy="spec-item"]') cy.withCtx(async (ctx, { sinon }) => { @@ -191,6 +196,7 @@ describe('Cypress In Cypress CT', { viewportWidth: 1500, defaultCommandTimeout: cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() cy.contains('TestComponent.spec').click() cy.get('#unified-runner').should('have.css', 'width', '333px') diff --git a/packages/app/cypress/e2e/cypress-in-cypress-e2e.cy.ts b/packages/app/cypress/e2e/cypress-in-cypress-e2e.cy.ts index 3429a79c3748..9311dfa15860 100644 --- a/packages/app/cypress/e2e/cypress-in-cypress-e2e.cy.ts +++ b/packages/app/cypress/e2e/cypress-in-cypress-e2e.cy.ts @@ -12,6 +12,7 @@ describe('Cypress In Cypress E2E', { viewportWidth: 1500, defaultCommandTimeout: it('test e2e', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('dom-content.spec').click() cy.waitForSpecToFinish() @@ -82,6 +83,7 @@ describe('Cypress In Cypress E2E', { viewportWidth: 1500, defaultCommandTimeout: it('navigation between specs and other parts of the app works', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('dom-content.spec').click() cy.waitForSpecToFinish() cy.get('[data-model-state="passed"]').should('contain', 'renders the test content') @@ -147,6 +149,7 @@ describe('Cypress In Cypress E2E', { viewportWidth: 1500, defaultCommandTimeout: it('should show blank page', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('blank-contents.spec') .click() @@ -157,6 +160,7 @@ describe('Cypress In Cypress E2E', { viewportWidth: 1500, defaultCommandTimeout: const expectedAutHeight = 456 // based on explicitly setting viewport in this test to 596 cy.visitApp() + cy.specsPageIsVisible() cy.withCtx(async (ctx, o) => { await ctx.actions.file.writeFileInProject(o.path, `describe('Bad spec', () => { it('has a syntax error', () => { expect(true).to.be.true }) }`) @@ -183,6 +187,7 @@ describe('Cypress In Cypress E2E', { viewportWidth: 1500, defaultCommandTimeout: it('should show visit failure blank page', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('blank-contents.spec') .click() @@ -195,6 +200,7 @@ describe('Cypress In Cypress E2E', { viewportWidth: 1500, defaultCommandTimeout: cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() cy.contains('dom-content.spec').click() cy.get('.toggle-specs-wrapper').click() @@ -205,6 +211,7 @@ describe('Cypress In Cypress E2E', { viewportWidth: 1500, defaultCommandTimeout: it('stops correctly running spec while switching specs', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('withFailure.spec').click() cy.contains('[aria-controls=reporter-inline-specs-list]', 'Specs') cy.get('body').type('f') @@ -218,6 +225,7 @@ describe('Cypress In Cypress E2E', { viewportWidth: 1500, defaultCommandTimeout: it('executes a test, navigates back to the spec list, creates a new spec, and runs the new spec', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('dom-content.spec').click() cy.waitForSpecToFinish() cy.get('[data-model-state="passed"]').should('contain', 'renders the test content') @@ -234,12 +242,14 @@ describe('Cypress In Cypress E2E', { viewportWidth: 1500, defaultCommandTimeout: describe('accessibility', () => { it('has no axe violations in specs list panel', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('withFailure.spec').click() cy.get('button[aria-controls="reporter-inline-specs-list"]').click() }) it('has no axe violations in reporter panel', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('withFailure.spec').click() cy.get('button[aria-controls="reporter-inline-specs-list"]').click() }) diff --git a/packages/app/cypress/e2e/cypress-in-cypress.cy.ts b/packages/app/cypress/e2e/cypress-in-cypress.cy.ts index a8e817f8cfd7..d586c9c982bb 100644 --- a/packages/app/cypress/e2e/cypress-in-cypress.cy.ts +++ b/packages/app/cypress/e2e/cypress-in-cypress.cy.ts @@ -17,6 +17,7 @@ function startAtSpecsPage (testingType: typeof testingTypes[number]) { cy.startAppServer(testingType) cy.visitApp() + cy.specsPageIsVisible() } function openProject (testingType: typeof testingTypes[number]) { @@ -122,6 +123,7 @@ describe('Cypress in Cypress', { viewportWidth: 1500, defaultCommandTimeout: 100 cy.startAppServer(testingType) cy.visitApp() + cy.specsPageIsVisible() cy.get('[data-cy="spec-item"]').first().click() // Let runner stabilize @@ -196,10 +198,8 @@ describe('Cypress in Cypress', { viewportWidth: 1500, defaultCommandTimeout: 100 cy.get('[data-cy="select-browser"]').as('selectBrowser') cy.viewport(500, 600) - cy.get('@selectBrowser') - .should('not.be.visible') - .scrollIntoView() - .should('be.visible') // with no specs list open, we should see this by scrolling + cy.get('@selectBrowser').scrollIntoView() + cy.get('@selectBrowser').should('be.visible') // with no specs list open, we should see this by scrolling dragHandleToClientX('panel2', 200).then(() => { cy.contains('Chrome 1').should('be.visible') @@ -208,10 +208,9 @@ describe('Cypress in Cypress', { viewportWidth: 1500, defaultCommandTimeout: 100 cy.contains('[aria-controls=reporter-inline-specs-list]', 'Specs') .click({ force: true }) - cy.get('@selectBrowser') - .should('not.be.visible') - .scrollIntoView() - .should('not.be.visible') // with specs list open, scrolling is not enough to see this + cy.get('@selectBrowser').should('not.be.visible') + cy.get('@selectBrowser').scrollIntoView() + cy.get('@selectBrowser').should('not.be.visible') // with specs list open, scrolling is not enough to see this dragHandleToClientX('panel1', 130) cy.get('@selectBrowser') @@ -253,6 +252,7 @@ describe('Cypress in Cypress', { viewportWidth: 1500, defaultCommandTimeout: 100 }) cy.visitApp() + cy.specsPageIsVisible() cy.contains('dom-content.spec').click() cy.findByTestId('aut-url-input').invoke('val').should('contain', 'http://localhost:4455/cypress/e2e/dom-content.html') @@ -268,6 +268,7 @@ describe('Cypress in Cypress', { viewportWidth: 1500, defaultCommandTimeout: 100 cy.openProject('cypress-in-cypress') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() cy.contains('dom-content.spec').should('exist') cy.withCtx(async (ctx, o) => { ctx.coreData.app.browserStatus = 'open' diff --git a/packages/app/cypress/e2e/cypress-origin-communicator.cy.ts b/packages/app/cypress/e2e/cypress-origin-communicator.cy.ts index b4c7c5e1d0a4..33471b646745 100644 --- a/packages/app/cypress/e2e/cypress-origin-communicator.cy.ts +++ b/packages/app/cypress/e2e/cypress-origin-communicator.cy.ts @@ -17,6 +17,7 @@ describe('Cypress In Cypress Origin Communicator', () => { */ it('cleans up the primaryOriginCommunicator events when navigating away from the /specs to /runs', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('dom-content.spec').click() cy.waitForSpecToFinish() @@ -35,6 +36,7 @@ describe('Cypress In Cypress Origin Communicator', () => { it('cleans up the primaryOriginCommunicator events when navigating away from the /specs to /settings', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('dom-content.spec').click() cy.waitForSpecToFinish() @@ -53,6 +55,7 @@ describe('Cypress In Cypress Origin Communicator', () => { it('cleans up the primaryOriginCommunicator events when navigating to run a different spec', () => { cy.visitApp() + cy.specsPageIsVisible() cy.contains('dom-content.spec').click() cy.waitForSpecToFinish() @@ -90,6 +93,7 @@ describe('Cypress In Cypress Origin Communicator', () => { }) cy.visitApp() + cy.specsPageIsVisible() cy.contains('simple_origin.cy').click() cy.waitForSpecToFinish() @@ -116,6 +120,7 @@ describe('Cypress In Cypress Origin Communicator', () => { }) cy.visitApp() + cy.specsPageIsVisible() cy.contains('simple_origin.cy').click() cy.waitForSpecToFinish() diff --git a/packages/app/cypress/e2e/debug.cy.ts b/packages/app/cypress/e2e/debug.cy.ts index c2c39129028b..00996344cd23 100644 --- a/packages/app/cypress/e2e/debug.cy.ts +++ b/packages/app/cypress/e2e/debug.cy.ts @@ -48,6 +48,7 @@ describe('App - Debug Page', () => { }) cy.visitApp() + cy.specsPageIsVisible() cy.get('[data-cy="debug-badge"]').should('be.visible').contains('0') @@ -125,6 +126,7 @@ describe('App - Debug Page', () => { }) cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('sidebar-link-debug-page').click() cy.findByTestId('debug-container').should('be.visible') @@ -183,7 +185,7 @@ describe('App - Debug Page', () => { const run = options.testRun - run.totalInstanceCount = 5 + run.totalInstanceCount = 3 if (run.completedInstanceCount === undefined) { run.completedInstanceCount = 0 run.createdAt = (new Date()).toISOString() @@ -211,10 +213,10 @@ describe('App - Debug Page', () => { } if (obj.operationName === 'RelevantRunSpecsDataSource_Specs' && obj.result.data) { - //NOTE Figure out how to manually trigger polling instead of adjusting polling intervals + // NOTE Figure out how to manually trigger polling instead of adjusting polling intervals obj.result.data.pollingIntervals = { __typename: 'CloudPollingIntervals', - runByNumber: 1, //Increase polling interval for debugging test + runByNumber: 1.5, //Increase polling interval for debugging test } if (run.totalInstanceCount === run.completedInstanceCount) { @@ -232,19 +234,19 @@ describe('App - Debug Page', () => { }, { RelevantRunsDataSource_RunsByCommitShas, DebugDataFailing }) cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('sidebar-link-debug-page').click() cy.findByTestId('debug-container').should('be.visible') - cy.findByTestId('header-top').contains('chore: testing cypress') - - cy.findByTestId('debug-testing-progress').as('progress') + cy.findByTestId('header-top').contains('chore: testing cypress').should('be.visible') - cy.get('@progress').contains('Testing in progress...') cy.get('[data-cy="debug-badge"]').contains('0').should('be.visible') - cy.get('@progress').contains('1 of 5 specs completed') - cy.get('@progress').contains('2 of 5 specs completed') - cy.get('@progress').contains('3 of 5 specs completed') + + cy.get('[data-cy=debug-testing-progress]').contains('Testing in progress...') + cy.findByTestId('debug-testing-progress').contains('1 of 3 specs completed') + cy.findByTestId('debug-testing-progress').contains('2 of 3 specs completed') + cy.findByTestId('debug-testing-progress').contains('3 of 3 specs completed') cy.get('[data-cy="debug-badge"]').contains('1').should('be.visible') cy.findByTestId('spec-contents').within(() => { diff --git a/packages/app/cypress/e2e/reporter_header.cy.ts b/packages/app/cypress/e2e/reporter_header.cy.ts index 306b1940a504..004b14e8048b 100644 --- a/packages/app/cypress/e2e/reporter_header.cy.ts +++ b/packages/app/cypress/e2e/reporter_header.cy.ts @@ -5,6 +5,7 @@ describe('Reporter Header', () => { cy.openProject('cypress-in-cypress') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() cy.contains('dom-content.spec').click() cy.waitForSpecToFinish() }) @@ -46,6 +47,7 @@ describe('Reporter Header', () => { cy.openProject('cypress-in-cypress') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() cy.contains('dom-content.spec').click() cy.waitForSpecToFinish() }) @@ -76,6 +78,7 @@ describe('Reporter Header', () => { cy.openProject('cypress-in-cypress') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() cy.contains('dom-content-scrollable-commands.spec').click() // wait for the test to scroll all the way to the bottom diff --git a/packages/app/cypress/e2e/run-all-specs.cy.ts b/packages/app/cypress/e2e/run-all-specs.cy.ts index 2acc735672f5..d5f17c82eb23 100644 --- a/packages/app/cypress/e2e/run-all-specs.cy.ts +++ b/packages/app/cypress/e2e/run-all-specs.cy.ts @@ -30,6 +30,7 @@ describe('run-all-specs', () => { cy.openProject('run-all-specs') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() // Spawns new browser so we need to stub this cy.withCtx((ctx, { sinon }) => { diff --git a/packages/app/cypress/e2e/runner/pluginEvents.cy.ts b/packages/app/cypress/e2e/runner/pluginEvents.cy.ts index 223b3019a026..27276e97c62d 100644 --- a/packages/app/cypress/e2e/runner/pluginEvents.cy.ts +++ b/packages/app/cypress/e2e/runner/pluginEvents.cy.ts @@ -11,6 +11,7 @@ describe('plugin events', () => { cy.openProject('plugin-run-events') cy.startAppServer('e2e') cy.visitApp() + cy.specsPageIsVisible() cy.get('[data-cy-row="run_events_spec_1.cy.js"]').eq(1).click() cy.waitForSpecToFinish({ @@ -36,6 +37,7 @@ describe('plugin events', () => { cy.openProject('plugin-run-events') cy.startAppServer('e2e') cy.visitApp() + cy.specsPageIsVisible() cy.get('[data-cy-row="run_events_spec_1.cy.js"]').eq(1).click() cy.waitForSpecToFinish({ diff --git a/packages/app/cypress/e2e/runner/reporter-ct-mount-hover.cy.ts b/packages/app/cypress/e2e/runner/reporter-ct-mount-hover.cy.ts index 0bf0a1c299aa..1a8b20e86c79 100644 --- a/packages/app/cypress/e2e/runner/reporter-ct-mount-hover.cy.ts +++ b/packages/app/cypress/e2e/runner/reporter-ct-mount-hover.cy.ts @@ -28,6 +28,7 @@ for (const { projectName, test } of PROJECTS) { cy.openProject(projectName, ['--config-file', 'cypress-vite-default.config.ts', '--component']) cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() cy.contains(`${test}`).click() cy.waitForSpecToFinish(undefined) cy.get('.collapsible-header-inner:first').click().get('.command.command-name-mount > .command-wrapper').click().then(() => { @@ -39,6 +40,7 @@ for (const { projectName, test } of PROJECTS) { cy.openProject(projectName, ['--component']) cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() cy.contains(`${test}`).click() cy.waitForSpecToFinish(undefined) cy.get('.command.command-name-mount > .command-wrapper').click().then(() => { diff --git a/packages/app/cypress/e2e/runner/selector-playground.cy.ts b/packages/app/cypress/e2e/runner/selector-playground.cy.ts index 992288ab4984..bdf1b85108dc 100644 --- a/packages/app/cypress/e2e/runner/selector-playground.cy.ts +++ b/packages/app/cypress/e2e/runner/selector-playground.cy.ts @@ -3,6 +3,7 @@ function launchApp () { cy.openProject('selector-playground') cy.startAppServer('e2e') cy.visitApp() + cy.specsPageIsVisible() cy.get(`[data-cy-row="spec.cy.js"]`).click() cy.waitForSpecToFinish() diff --git a/packages/app/cypress/e2e/runner/sessions.ui.cy.ts b/packages/app/cypress/e2e/runner/sessions.ui.cy.ts index c6435e12ee4d..133ba4654213 100644 --- a/packages/app/cypress/e2e/runner/sessions.ui.cy.ts +++ b/packages/app/cypress/e2e/runner/sessions.ui.cy.ts @@ -736,6 +736,7 @@ describe('runner/cypress sessions.open_mode.spec', () => { cy.openProject('session-and-origin-e2e-specs') cy.startAppServer('e2e') cy.visitApp() + cy.specsPageIsVisible() cy.get('[data-cy-row="multiple_sessions.cy.js"]').click() cy.waitForSpecToFinish({ @@ -807,6 +808,7 @@ describe('global sessions', () => { cy.openProject('session-and-origin-e2e-specs') cy.startAppServer('e2e') cy.visitApp() + cy.specsPageIsVisible() cy.get('[data-cy-row="global_sessions.cy.js"]').click() cy.waitForSpecToFinish({ diff --git a/packages/app/cypress/e2e/runs.cy.ts b/packages/app/cypress/e2e/runs.cy.ts index 75e91a526e9f..e06ecde05ef7 100644 --- a/packages/app/cypress/e2e/runs.cy.ts +++ b/packages/app/cypress/e2e/runs.cy.ts @@ -30,6 +30,7 @@ function scaffoldTestingTypeAndVisitRunsPage (testingType: 'e2e' | 'component'): }) cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() } @@ -45,6 +46,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { it('resolves the runs page', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() cy.get('[data-cy="runs"]') cy.get('[data-cy="app-header-bar"]').findByText('Runs').should('be.visible') @@ -59,6 +61,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { }) cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('sidebar-link-runs-page').click() cy.get('[data-cy*="runsSkeleton-"]') cy.get('[data-cy="runs"]') @@ -74,12 +77,14 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { it('when logged out, shows call to action', () => { cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() cy.contains(defaultMessages.runs.connect.buttonUser).should('exist') }) it('clicking the login button will open the login modal', () => { cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() cy.contains(defaultMessages.runs.connect.buttonUser).click() cy.withCtx((ctx, o) => { @@ -101,6 +106,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { it('if logged in and connected', { viewportWidth: 1200 }, () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() cy.findByTestId('runNumber-status-OVERLIMIT').click() @@ -131,6 +137,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() @@ -175,6 +182,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() @@ -210,6 +218,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() @@ -239,6 +248,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() @@ -263,6 +273,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() cy.withCtx(async (ctx, options) => { @@ -318,6 +329,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { cy.startAppServer('e2e') cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.withCtx(async (ctx, o) => { o.sinon.spy(ctx.cloud, 'executeRemoteGraphQL') @@ -360,6 +372,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { cy.startAppServer('e2e') cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.withCtx(async (ctx) => { const config = await ctx.project.getConfig() @@ -395,6 +408,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { cy.startAppServer('e2e') cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.withCtx(async (ctx) => { const config = await ctx.project.getConfig() @@ -449,6 +463,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { }) cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() }) @@ -577,6 +592,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { }) cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() }) @@ -604,6 +620,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { }) cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() cy.findByText(defaultMessages.runs.connect.buttonProject).should('exist') }) @@ -627,6 +644,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { o.sinon.stub(ctx.config.electronApi, 'copyTextToClipboard') }) + cy.get('[data-cy="terminal-prompt-input').should('have.value', 'npx cypress run --component --record --key 2aaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa') cy.get('[data-cy="copy-button"]').click() cy.contains('Copied!') cy.withRetryableCtx((ctx) => { @@ -636,10 +654,12 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { it('displays a copy button and copies correct command in E2E', () => { scaffoldTestingTypeAndVisitRunsPage('e2e') + cy.withCtx(async (ctx, o) => { o.sinon.stub(ctx.config.electronApi, 'copyTextToClipboard') }) + cy.get('[data-cy="terminal-prompt-input').should('have.value', 'npx cypress run --record --key 2aaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa') cy.get('[data-cy="copy-button"]').click() cy.contains('Copied!') cy.withRetryableCtx((ctx) => { @@ -659,6 +679,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { it('displays a list of recorded runs if a run has been recorded', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() cy.get('[data-cy="runs"]') }) @@ -666,6 +687,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { it('displays each run with correct information', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() cy.get('[data-cy="runCard-status-CANCELLED"]').first().within(() => { @@ -698,6 +720,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { it('opens the run page if a run is clicked', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() cy.get('[data-cy="runNumber-status-CANCELLED"]').first().click() @@ -723,6 +746,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { }) cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() @@ -754,6 +778,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { it('displays a list of recorded runs if a run has been recorded', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() cy.get('[data-cy="runs"]') }) @@ -761,6 +786,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { it('displays each run with correct information', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() cy.findByText('fix: using Git data CANCELLED') @@ -786,6 +812,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { it('opens the run page if a run is clicked', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() moveToRunsPage() cy.get('[data-cy="runNumber-status-CANCELLED"]').first().click() @@ -807,6 +834,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { it('shows alert warning if runs have been returned already', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.wait(1000) moveToRunsPage() cy.get('[data-cy="runs"]') @@ -821,6 +849,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { it('should remove the alert warning if the app reconnects to the internet', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.wait(1000) moveToRunsPage() cy.get('[data-cy="runs"]') @@ -855,6 +884,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.get('[href="#/runs"]').click() @@ -880,6 +910,7 @@ describe('App: Runs', { viewportWidth: 1200 }, () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.remoteGraphQLIntercept(async (obj) => { if (obj.result.data?.cloudViewer?.organizations?.nodes) { diff --git a/packages/app/cypress/e2e/settings.cy.ts b/packages/app/cypress/e2e/settings.cy.ts index c7789c635358..78f213ebe8ec 100644 --- a/packages/app/cypress/e2e/settings.cy.ts +++ b/packages/app/cypress/e2e/settings.cy.ts @@ -15,6 +15,7 @@ describe('App: Settings', () => { it('visits settings page', () => { cy.startAppServer('e2e') cy.visitApp() + cy.specsPageIsVisible() cy.get(SidebarSettingsLinkSelector).click() cy.contains('[data-cy="app-header-bar"]', 'Settings') @@ -33,6 +34,7 @@ describe('App: Settings', () => { cy.startAppServer('e2e') cy.visitApp() + cy.specsPageIsVisible() cy.get(SidebarSettingsLinkSelector).click() cy.findByText('Cypress Cloud settings').click() cy.findByText('Project ID').should('be.visible') @@ -49,6 +51,7 @@ describe('App: Settings', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.get(SidebarSettingsLinkSelector).click() cy.findByText('Cypress Cloud settings').click() cy.findByText('Record key').should('be.visible') @@ -59,6 +62,7 @@ describe('App: Settings', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.get(SidebarSettingsLinkSelector).click() cy.findByText('Cypress Cloud settings').click() cy.get('[data-cy="code-box"]').should('contain', '***') @@ -91,6 +95,7 @@ describe('App: Settings', () => { cy.startAppServer('e2e') cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('spec-list-container').scrollTo('bottom') // Visit the test to trigger the ws.off() for the TR websockets cy.contains('test1.js').click() @@ -108,6 +113,7 @@ describe('App: Settings', () => { cy.startAppServer('e2e') cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.withCtx((ctx, o) => { o.sinon.spy(ctx.actions.auth, 'logout') }) @@ -137,6 +143,7 @@ describe('App: Settings', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('sidebar-link-settings-page').click() cy.findByText('Project settings').click() cy.get('[data-cy="file-match-indicator"]').contains('2 matches') @@ -155,6 +162,7 @@ describe('App: Settings', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.get(SidebarSettingsLinkSelector).click() cy.findByText('Project settings').click() cy.get('[data-cy="file-match-indicator"]').contains('19 matches') @@ -166,6 +174,7 @@ describe('App: Settings', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.get(SidebarSettingsLinkSelector).click() cy.findByText('Project settings').click() cy.get('[data-cy="settings-experiments"]').within(() => { @@ -217,6 +226,7 @@ describe('App: Settings', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.get(SidebarSettingsLinkSelector).click() cy.findByText('Project settings').click() cy.get('[data-cy="config-code"]').contains('{') @@ -227,6 +237,7 @@ describe('App: Settings', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.get(SidebarSettingsLinkSelector).click() cy.findByText('Project settings').click() cy.get('[data-cy="config-legend"]').within(() => { @@ -270,6 +281,7 @@ describe('App: Settings', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.get(SidebarSettingsLinkSelector).click() cy.findByText('Project settings').click() cy.get('[data-cy="config-legend"]').within(() => { @@ -331,6 +343,7 @@ describe('App: Settings', () => { // navigate away and come back // preferred editor selected from dropdown should have been persisted cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('sidebar-link-settings-page').click() cy.wait(200) cy.get('[data-cy="Device settings"]').click() @@ -380,6 +393,7 @@ describe('App: Settings', () => { // navigate away and come back // preferred editor selected from dropdown should have been persisted cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('sidebar-link-settings-page').click() cy.wait(200) cy.get('[data-cy="Device settings"]').click() @@ -410,6 +424,7 @@ describe('App: Settings', () => { cy.startAppServer('e2e') cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.get('button').contains('Enable desktop notifications').click() // We specifically scroll this anchor into view when clicking the "Enable desktop notifications" button. cy.get('section#notifications').should('be.visible') @@ -540,6 +555,7 @@ describe('App: Settings without cloud', () => { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() cy.get(SidebarSettingsLinkSelector).click() cy.findByText('Cypress Cloud settings').click() cy.findByText('Project ID').should('not.exist') @@ -566,6 +582,7 @@ describe('App: Settings without cloud', () => { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() cy.get(SidebarSettingsLinkSelector).click() cy.findByText('Project settings').click() diff --git a/packages/app/cypress/e2e/sidebar_navigation.cy.ts b/packages/app/cypress/e2e/sidebar_navigation.cy.ts index 412d5e78d037..d6e46fdfeeae 100644 --- a/packages/app/cypress/e2e/sidebar_navigation.cy.ts +++ b/packages/app/cypress/e2e/sidebar_navigation.cy.ts @@ -7,6 +7,7 @@ describe('Sidebar Navigation', { viewportWidth: 1280 }, () => { cy.openProject('todos') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() cy.contains('todos') }) @@ -51,6 +52,7 @@ describe('Sidebar Navigation', { viewportWidth: 1280 }, () => { cy.openProject('todos') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() cy.contains('fixture.js').click() @@ -68,6 +70,7 @@ describe('Sidebar Navigation', { viewportWidth: 1280 }, () => { cy.openProject('todos') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() cy.contains('todos') }) @@ -323,6 +326,7 @@ describe('Sidebar Navigation', { viewportWidth: 1280 }, () => { cy.openProject('pristine-with-ct-testing', ['--component']) cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible('new-project') cy.get('[data-cy="sidebar-header"]').as('switchTestingType').click() cy.findByRole('dialog', { diff --git a/packages/app/cypress/e2e/specs.cy.ts b/packages/app/cypress/e2e/specs.cy.ts index 99768e9cc389..b739188438eb 100644 --- a/packages/app/cypress/e2e/specs.cy.ts +++ b/packages/app/cypress/e2e/specs.cy.ts @@ -10,6 +10,7 @@ describe('App: Specs', () => { cy.openProject('no-specs') cy.startAppServer('e2e') cy.visitApp() + cy.specsPageIsVisible('new-project') // With no specs present, the page renders two cards, one for scaffolding example specs, // another for creating a new blank spec. @@ -192,7 +193,9 @@ describe('App: Specs', () => { cy.get('[aria-label="Close"]').click() - cy.visitApp().get('[data-cy="spec-list-file"]').contains('MyTest.cy.js') + cy.visitApp() + cy.specsPageIsVisible() + cy.get('[data-cy="spec-list-file"]').contains('MyTest.cy.js') }) it('should not show trouble rendering alert', () => { @@ -230,6 +233,7 @@ describe('App: Specs', () => { cy.startAppServer('e2e') cy.visitApp() + cy.specsPageIsVisible('new-project') // With no specs present, the page renders two cards, one for scaffolding example specs, // another for creating a new blank spec. @@ -301,7 +305,9 @@ describe('App: Specs', () => { cy.get('[aria-label="Close"]').click() - cy.visitApp().get('[data-cy="spec-list-file"]').contains('MyTest.cy.ts') + cy.visitApp() + cy.specsPageIsVisible() + cy.get('[data-cy="spec-list-file"]').contains('MyTest.cy.ts') }) }) }) @@ -327,6 +333,7 @@ describe('App: Specs', () => { cy.startAppServer('e2e') cy.visitApp() + cy.specsPageIsVisible('no-specs') }) it('shows No Specs page with specPattern from config', () => { @@ -436,7 +443,9 @@ describe('App: Specs', () => { cy.get('[aria-label="Close"]').click() - cy.visitApp().get('[data-cy-row]').contains('MyTest.cy.js') + cy.visitApp() + cy.specsPageIsVisible() + cy.get('[data-cy-row]').contains('MyTest.cy.js') }) it('generates spec with file name that does not contain a known spec extension', () => { @@ -504,6 +513,7 @@ describe('App: Specs', () => { cy.openProject('pristine-with-e2e-testing') cy.startAppServer('e2e') cy.visitApp() + cy.specsPageIsVisible('new-project') }) context('scaffold example files', () => { @@ -540,6 +550,7 @@ describe('App: Specs', () => { cy.openProject('no-specs', ['--component']) cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible('new-project') cy.findAllByTestId('card').eq(1).as('TemplateSpecCard') }) @@ -670,6 +681,7 @@ describe('App: Specs', () => { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible('no-specs') }) it('shows No Specs page with specPattern from config', () => { @@ -775,6 +787,7 @@ describe('App: Specs', () => { cy.openProject('no-specs') cy.startAppServer('e2e') cy.visitApp() + cy.specsPageIsVisible('new-project') cy.findByRole('heading', { level: 1, diff --git a/packages/app/cypress/e2e/specs_list_actual_git_repo.cy.ts b/packages/app/cypress/e2e/specs_list_actual_git_repo.cy.ts index 7715b07ea308..593db486e42b 100644 --- a/packages/app/cypress/e2e/specs_list_actual_git_repo.cy.ts +++ b/packages/app/cypress/e2e/specs_list_actual_git_repo.cy.ts @@ -9,6 +9,7 @@ describe('Spec List - Last updated with git info', () => { cy.openProject('cypress-in-cypress') cy.startAppServer('e2e') cy.visitApp() + cy.specsPageIsVisible() }) }) diff --git a/packages/app/cypress/e2e/specs_list_component.cy.ts b/packages/app/cypress/e2e/specs_list_component.cy.ts index 7288eeac8dee..35de1ce4c6d1 100644 --- a/packages/app/cypress/e2e/specs_list_component.cy.ts +++ b/packages/app/cypress/e2e/specs_list_component.cy.ts @@ -6,6 +6,7 @@ describe('App: Spec List (Component)', () => { cy.openProject('component-tests', ['--component']) cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() }) it('opens spec pattern modal', () => { diff --git a/packages/app/cypress/e2e/specs_list_e2e.cy.ts b/packages/app/cypress/e2e/specs_list_e2e.cy.ts index 6d05d6c3e909..fbb53d041c58 100644 --- a/packages/app/cypress/e2e/specs_list_e2e.cy.ts +++ b/packages/app/cypress/e2e/specs_list_e2e.cy.ts @@ -41,6 +41,7 @@ describe('App: Spec List (E2E)', () => { }) cy.visitApp() + cy.specsPageIsVisible() cy.verifyE2ESelected() } @@ -317,13 +318,23 @@ describe('App: Spec List (E2E)', () => { const targetSpecFile = 'accounts_list.spec.js' clearSearchAndType(targetSpecFile) + + // wait for filter + cy.findAllByTestId('spec-item').should('have.length', 1) + cy.contains('a', targetSpecFile).click() + // make sure we are on the spec view before clicking back to the specs list + cy.findByTestId('runnable-header').contains(targetSpecFile) + cy.contains('input', targetSpecFile).should('not.exist') - cy.get('button[aria-controls="reporter-inline-specs-list"]').click({ force: true }) + cy.contains('button', 'Specs').click({ force: true }) + + // wait until specs list is visible + cy.findByTestId('specs-list-container').should('be.visible') - cy.get('input').should('be.visible').and('have.value', targetSpecFile) + cy.get('@searchField').should('have.value', targetSpecFile) cy.findByTestId('sidebar-link-specs-page').click() diff --git a/packages/app/cypress/e2e/specs_list_flaky.cy.ts b/packages/app/cypress/e2e/specs_list_flaky.cy.ts index 2220cdb6d70f..7008d95cf70f 100644 --- a/packages/app/cypress/e2e/specs_list_flaky.cy.ts +++ b/packages/app/cypress/e2e/specs_list_flaky.cy.ts @@ -115,6 +115,7 @@ describe('App: Spec List - Flaky Indicator', () => { }) cy.visitApp() + cy.specsPageIsVisible() cy.verifyE2ESelected() }) diff --git a/packages/app/cypress/e2e/specs_list_latest_runs.cy.ts b/packages/app/cypress/e2e/specs_list_latest_runs.cy.ts index afae5642a3a4..80923b676e9a 100644 --- a/packages/app/cypress/e2e/specs_list_latest_runs.cy.ts +++ b/packages/app/cypress/e2e/specs_list_latest_runs.cy.ts @@ -199,7 +199,8 @@ describe('App/Cloud Integration - Latest runs and Average duration', { viewportW }) }) - context('when no runs are recorded', () => { + // TODO: Flaky test: Sometimes this test renders the empty view instead of the placeholder + context.skip('when no runs are recorded', () => { it('shows placeholders for all visible specs', { defaultCommandTimeout: 6000 }, () => { cy.loginUser() @@ -212,6 +213,7 @@ describe('App/Cloud Integration - Latest runs and Average duration', { viewportW }) cy.visitApp() + cy.specsPageIsVisible() allVisibleSpecsShouldBePlaceholders() }) }) @@ -219,6 +221,7 @@ describe('App/Cloud Integration - Latest runs and Average duration', { viewportW context('when logged out', () => { beforeEach(() => { cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('sidebar-link-specs-page').click() }) @@ -265,6 +268,7 @@ describe('App/Cloud Integration - Latest runs and Average duration', { viewportW }) cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('sidebar-link-specs-page').click() }) @@ -310,6 +314,7 @@ describe('App/Cloud Integration - Latest runs and Average duration', { viewportW cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('sidebar-link-specs-page').click() }) @@ -325,6 +330,7 @@ describe('App/Cloud Integration - Latest runs and Average duration', { viewportW simulateRunData() cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('sidebar-link-specs-page').click() }) @@ -571,6 +577,7 @@ describe('App/Cloud Integration - Latest runs and Average duration', { viewportW }) cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('sidebar-link-specs-page').click() }) @@ -608,6 +615,7 @@ describe('App/Cloud Integration - Latest runs and Average duration', { viewportW simulateRunData() cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('sidebar-link-specs-page').click() diff --git a/packages/app/cypress/e2e/specs_list_no_git_repo.cy.ts b/packages/app/cypress/e2e/specs_list_no_git_repo.cy.ts index 24311a6ebcc4..7a9e55c0f682 100644 --- a/packages/app/cypress/e2e/specs_list_no_git_repo.cy.ts +++ b/packages/app/cypress/e2e/specs_list_no_git_repo.cy.ts @@ -4,6 +4,7 @@ describe('Spec List - Last updated with no git info', () => { cy.openProject('cypress-in-cypress') cy.startAppServer('e2e') cy.visitApp() + cy.specsPageIsVisible() }) // TODO: fix flaky test https://github.com/cypress-io/cypress/issues/23474 diff --git a/packages/app/cypress/e2e/specs_list_switcher.cy.ts b/packages/app/cypress/e2e/specs_list_switcher.cy.ts index a3976c82d1cf..d01da083ab72 100644 --- a/packages/app/cypress/e2e/specs_list_switcher.cy.ts +++ b/packages/app/cypress/e2e/specs_list_switcher.cy.ts @@ -14,6 +14,7 @@ describe('App: Spec List Testing Type Switcher', () => { }) cy.visitApp() + cy.specsPageIsVisible() cy.verifyCtSelected() }) @@ -43,6 +44,7 @@ describe('App: Spec List Testing Type Switcher', () => { }) cy.visitApp() + cy.specsPageIsVisible() cy.verifyE2ESelected() }) @@ -68,6 +70,7 @@ describe('App: Spec List Testing Type Switcher', () => { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() cy.verifyCtSelected() }) diff --git a/packages/app/cypress/e2e/studio/helper.ts b/packages/app/cypress/e2e/studio/helper.ts index 59a98e57f520..fbc25ac4b420 100644 --- a/packages/app/cypress/e2e/studio/helper.ts +++ b/packages/app/cypress/e2e/studio/helper.ts @@ -3,6 +3,7 @@ export function launchStudio () { cy.openProject('experimental-studio') cy.startAppServer('e2e') cy.visitApp() + cy.specsPageIsVisible() cy.get(`[data-cy-row="spec.cy.js"]`).click() cy.waitForSpecToFinish() diff --git a/packages/app/cypress/e2e/studio/studio.cy.ts b/packages/app/cypress/e2e/studio/studio.cy.ts index d60bae8cd6ab..f332f231b51d 100644 --- a/packages/app/cypress/e2e/studio/studio.cy.ts +++ b/packages/app/cypress/e2e/studio/studio.cy.ts @@ -231,6 +231,7 @@ it('visits a basic html page', () => { cy.openProject('experimental-studio') cy.startAppServer('e2e') cy.visitApp() + cy.specsPageIsVisible() cy.get(`[title="empty.cy.js"]`).should('be.visible').click() cy.waitForSpecToFinish() diff --git a/packages/app/cypress/e2e/subscriptions/authChange-subscription.cy.ts b/packages/app/cypress/e2e/subscriptions/authChange-subscription.cy.ts index 7041f8823151..5c2e3349a1a8 100644 --- a/packages/app/cypress/e2e/subscriptions/authChange-subscription.cy.ts +++ b/packages/app/cypress/e2e/subscriptions/authChange-subscription.cy.ts @@ -28,6 +28,7 @@ describe('authChange subscription', () => { cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() }) it('responds to authChange subscription for login', () => { @@ -65,6 +66,7 @@ describe('authChange subscription', () => { cy.startAppServer('component') cy.visitApp() + cy.specsPageIsVisible() }) it('responds to authChange subscription for login', () => { diff --git a/packages/app/cypress/e2e/subscriptions/configChange-subscription.cy.ts b/packages/app/cypress/e2e/subscriptions/configChange-subscription.cy.ts index 19bd6498ba54..0837414d27c5 100644 --- a/packages/app/cypress/e2e/subscriptions/configChange-subscription.cy.ts +++ b/packages/app/cypress/e2e/subscriptions/configChange-subscription.cy.ts @@ -22,6 +22,7 @@ describe('configChange subscription', () => { cy.openProject('cypress-in-cypress') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() }) describe('on config page', () => { diff --git a/packages/app/cypress/e2e/subscriptions/createCloudOrgModal-subscription.cy.ts b/packages/app/cypress/e2e/subscriptions/createCloudOrgModal-subscription.cy.ts index 50150edbabed..fdb0a0d700ce 100644 --- a/packages/app/cypress/e2e/subscriptions/createCloudOrgModal-subscription.cy.ts +++ b/packages/app/cypress/e2e/subscriptions/createCloudOrgModal-subscription.cy.ts @@ -31,6 +31,7 @@ describe('CreateCloudOrgModalSubscription', { viewportWidth: 1200 }, () => { }) cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('sidebar-link-runs-page').click() diff --git a/packages/app/cypress/e2e/subscriptions/errorWarningChange-subscription.cy.ts b/packages/app/cypress/e2e/subscriptions/errorWarningChange-subscription.cy.ts index 6c74cb846f23..16904259ae53 100644 --- a/packages/app/cypress/e2e/subscriptions/errorWarningChange-subscription.cy.ts +++ b/packages/app/cypress/e2e/subscriptions/errorWarningChange-subscription.cy.ts @@ -13,6 +13,7 @@ describe('errorWarningChange subscription', () => { beforeEach(() => { cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() }) describe('when the config file is saved with errors', () => { diff --git a/packages/app/cypress/e2e/subscriptions/specChange-subscription.cy.ts b/packages/app/cypress/e2e/subscriptions/specChange-subscription.cy.ts index 57def43dd55d..cd6d0a6662fb 100644 --- a/packages/app/cypress/e2e/subscriptions/specChange-subscription.cy.ts +++ b/packages/app/cypress/e2e/subscriptions/specChange-subscription.cy.ts @@ -7,6 +7,7 @@ describe('specChange subscription', () => { cy.openProject('cypress-in-cypress') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() }) describe('specs list', () => { diff --git a/packages/app/cypress/e2e/top-nav.cy.ts b/packages/app/cypress/e2e/top-nav.cy.ts index 2c5315d99210..d030ded6893e 100644 --- a/packages/app/cypress/e2e/top-nav.cy.ts +++ b/packages/app/cypress/e2e/top-nav.cy.ts @@ -25,6 +25,7 @@ describe('App Top Nav Workflows', () => { cy.openProject('launchpad') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('app-header-bar').should('be.visible').and('contain', 'Specs') }) @@ -37,6 +38,7 @@ describe('App Top Nav Workflows', () => { cy.openProject('launchpad', ['--browser', 'firefox']) cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('top-nav-active-browser-icon') .should('have.attr', 'src') @@ -57,6 +59,7 @@ describe('App Top Nav Workflows', () => { cy.openProject('launchpad') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() }) it('shows the current browser in the top nav browser list button', () => { @@ -143,6 +146,7 @@ describe('App Top Nav Workflows', () => { cy.openProject('launchpad') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('app-header-bar').validateExternalLink({ name: 'v10.0.0', @@ -175,6 +179,7 @@ describe('App Top Nav Workflows', () => { cy.openProject('launchpad') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() }) it('shows dropdown with version info if user version is outdated', () => { @@ -243,6 +248,7 @@ describe('App Top Nav Workflows', () => { cy.openProject('launchpad') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('app-header-bar').validateExternalLink({ name: `v${pkg.version}`, @@ -258,6 +264,7 @@ describe('App Top Nav Workflows', () => { cy.openProject('launchpad') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('app-header-bar').findByRole('button', { name: 'Docs', expanded: false }).as('docsButton') }) @@ -334,12 +341,13 @@ describe('App Top Nav Workflows', () => { cy.startAppServer() cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() - cy.findByTestId('app-header-bar').findByRole('button', { name: 'Profile and logout', expanded: false }).as('logInButton') + cy.findByTestId('app-header-bar').findByRole('button', { name: 'Profile and logout', expanded: false }).as('profileButton') }) it('shows user in top nav when logged in', () => { - cy.get('@logInButton').click() + cy.get('@profileButton').click() cy.findByTestId('login-panel').contains('Test User').should('be.visible') cy.findByTestId('login-panel').contains('test@example.com').should('be.visible') @@ -353,7 +361,7 @@ describe('App Top Nav Workflows', () => { }) it('replaces user avatar after logout', () => { - cy.get('@logInButton').click() + cy.get('@profileButton').click() cy.withCtx((ctx, o) => { o.sinon.stub(ctx._apis.authApi, 'logOut').callsFake(async () => { @@ -371,6 +379,10 @@ describe('App Top Nav Workflows', () => { cy.openProject('component-tests', ['--component']) cy.startAppServer('component') + cy.loginUser() + cy.visitApp() + cy.specsPageIsVisible() + cy.remoteGraphQLIntercept((obj) => { if (obj.result.data?.cloudProjectBySlug) { return new obj.Response('Unauthorized', { status: 401 }) @@ -379,20 +391,16 @@ describe('App Top Nav Workflows', () => { return obj.result }) - cy.loginUser() - cy.visitApp() - - cy.get('@logInButton').click() + cy.get('@profileButton').click() cy.findByTestId('login-panel').contains('Test User').should('be.visible') cy.findByTestId('login-panel').contains('test@example.com').should('be.visible') cy.findByTestId('sidebar-link-runs-page').click() - cy.get('@logInButton').click() cy.findByTestId('app-header-bar').within(() => { cy.findByTestId('user-avatar-title').should('not.exist') - cy.findByRole('button', { name: 'Log in' }).click() + cy.findByRole('button', { name: 'Log in' }) }) }) }) @@ -457,6 +465,7 @@ describe('App Top Nav Workflows', () => { cy.openProject('component-tests', ['--config-file', 'cypressWithoutProjectId.config.js']) cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() cy.remoteGraphQLIntercept(async (obj) => { if (obj.result.data?.cloudViewer) { obj.result.data.cloudViewer.organizations = { @@ -489,6 +498,7 @@ describe('App Top Nav Workflows', () => { cy.openProject('component-tests') cy.startAppServer() cy.visitApp() + cy.specsPageIsVisible() }) it('shows log in modal workflow for user with name and email', () => { @@ -699,6 +709,7 @@ describe('App Top Nav Workflows', () => { cy.openProject('launchpad') cy.startAppServer('e2e', { skipMockingPrompts: true }) cy.visitApp() + cy.specsPageIsVisible() verifyBannerDoesNotExist() }) @@ -709,6 +720,7 @@ describe('App Top Nav Workflows', () => { cy.startAppServer('e2e', { skipMockingPrompts: true }) cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() verifyBannerDoesNotExist() }) @@ -729,6 +741,7 @@ describe('App Top Nav Workflows', () => { cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() verifyBannerDoesNotExist() }) @@ -740,6 +753,7 @@ describe('App Top Nav Workflows', () => { cy.startAppServer() cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() verifyBannerDoesNotExist() }) @@ -753,6 +767,7 @@ describe('App Top Nav Workflows', () => { cy.startAppServer() cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('enable-notifications-banner').should('be.visible') }) @@ -765,6 +780,7 @@ describe('App Top Nav Workflows', () => { cy.startAppServer() cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('enable-notifications-banner').should('be.visible') cy.findByRole('button', { name: 'Dismiss banner' }).click() @@ -786,6 +802,7 @@ describe('App Top Nav Workflows', () => { cy.startAppServer() cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('enable-notifications-banner').should('be.visible') cy.contains('button', 'Remind me later').click() @@ -816,6 +833,7 @@ describe('App Top Nav Workflows', () => { cy.startAppServer() cy.loginUser() cy.visitApp() + cy.specsPageIsVisible() cy.findByTestId('enable-notifications-banner').should('be.visible') cy.contains('button', 'Enable desktop notifications').click() @@ -851,6 +869,7 @@ describe('Growth Prompts Can Open Automatically', () => { ) cy.visitApp() + cy.specsPageIsVisible() cy.verifyE2ESelected() cy.wait(1000) cy.contains('Configure CI').should('be.visible') @@ -869,6 +888,7 @@ describe('Growth Prompts Can Open Automatically', () => { ) cy.visitApp() + cy.specsPageIsVisible() cy.verifyE2ESelected() cy.wait(1000) cy.contains('Configure CI').should('not.exist') diff --git a/packages/app/package.json b/packages/app/package.json index b715fafb2b85..0faf67f0ba13 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -21,7 +21,7 @@ }, "dependencies": {}, "devDependencies": { - "@cypress-design/vue-button": "^0.10.2", + "@cypress-design/vue-button": "^0.11.6", "@cypress-design/vue-icon": "^0.26.0", "@cypress-design/vue-statusicon": "^0.5.0", "@cypress-design/vue-tabs": "^0.5.1", @@ -66,7 +66,7 @@ "rollup-plugin-polyfill-node": "^0.7.0", "unplugin-icons": "0.13.2", "unplugin-vue-components": "^0.24.1", - "vite": "4.3.2", + "vite": "4.5.2", "vite-plugin-pages": "0.29.0", "vite-plugin-vue-layouts": "0.8.0", "vite-svg-loader": "4.0.0", @@ -85,4 +85,4 @@ "@packages/graphql" ] } -} +} \ No newline at end of file diff --git a/packages/app/src/components/Slideshow.vue b/packages/app/src/components/Slideshow.vue index b6a34bb04008..7a752833c8cd 100644 --- a/packages/app/src/components/Slideshow.vue +++ b/packages/app/src/components/Slideshow.vue @@ -2,7 +2,7 @@

- - +
diff --git a/packages/app/src/debug/DebugFailedTest.cy.tsx b/packages/app/src/debug/DebugFailedTest.cy.tsx index 924435f8a653..5740e9b7551f 100644 --- a/packages/app/src/debug/DebugFailedTest.cy.tsx +++ b/packages/app/src/debug/DebugFailedTest.cy.tsx @@ -186,8 +186,6 @@ describe('', () => { cy.contains('...').realHover() cy.contains('[data-cy=tooltip-content]', 'Test content 2 > Test content 3 > Test content 4').should('be.visible') - - cy.percySnapshot() }) it('conditionally renders artifacts', () => { diff --git a/packages/app/src/debug/empty/DebugEmptyStates.cy.tsx b/packages/app/src/debug/empty/DebugEmptyStates.cy.tsx index 25508bd93095..22ee6e78beeb 100644 --- a/packages/app/src/debug/empty/DebugEmptyStates.cy.tsx +++ b/packages/app/src/debug/empty/DebugEmptyStates.cy.tsx @@ -64,6 +64,11 @@ describe('Debug page empty states', { defaultCommandTimeout: 250 }, () => { cy.percySnapshot(`slideshow step ${step}`) } + // ensure the promos are done transitioning before clicking on the control + // since 2 buttons could display if both promos are easing in and out + cy.findAllByTestId('guide-card', { timeout: 350 }).should('not.have.class', 'ease-in') + .and('not.have.class', 'ease-out') + cy.findByTestId('promo-action-control').click() } } diff --git a/packages/app/src/debug/guide/DebugGuide.vue b/packages/app/src/debug/guide/DebugGuide.vue index 22bc7073743c..cf532fd4d691 100644 --- a/packages/app/src/debug/guide/DebugGuide.vue +++ b/packages/app/src/debug/guide/DebugGuide.vue @@ -20,14 +20,17 @@ diff --git a/packages/app/src/runner/events/capture-protocol.ts b/packages/app/src/runner/events/capture-protocol.ts index 41053217ba39..3559cf291c38 100644 --- a/packages/app/src/runner/events/capture-protocol.ts +++ b/packages/app/src/runner/events/capture-protocol.ts @@ -79,12 +79,17 @@ export const addCaptureProtocolListeners = (Cypress: Cypress.Cypress) => { Cypress.primaryOriginCommunicator.on('viewport:changed', viewportChangedHandler) Cypress.on('test:before:run:async', async (attributes) => { + const timestamp = performance.now() + performance.timeOrigin + attachCypressProtocolInfo({ type: 'test:before:run:async', - timestamp: performance.now() + performance.timeOrigin, + timestamp, }) - await Cypress.backend('protocol:test:before:run:async', attributes) + await Cypress.backend('protocol:test:before:run:async', { + ...attributes, + timestamp, + }) }) Cypress.on('url:changed', (url) => { diff --git a/packages/app/src/runner/selector-playground/SelectorPlayground.cy.tsx b/packages/app/src/runner/selector-playground/SelectorPlayground.cy.tsx index 8ba672b90ed2..9883da4be15f 100644 --- a/packages/app/src/runner/selector-playground/SelectorPlayground.cy.tsx +++ b/packages/app/src/runner/selector-playground/SelectorPlayground.cy.tsx @@ -82,13 +82,9 @@ describe('SelectorPlayground', () => { cy.get('[data-cy="playground-num-elements"]').contains('10 matches') - cy.percySnapshot() - cy.then(() => selectorPlaygroundStore.setValidity(false)) cy.get('[data-cy="playground-num-elements"]').contains('Invalid') - - cy.percySnapshot('Invalid playground selector') }) it('focuses and copies selector text', () => { diff --git a/packages/app/src/runs/RunCard.cy.tsx b/packages/app/src/runs/RunCard.cy.tsx index 530932b51e20..fcdd658b19e5 100644 --- a/packages/app/src/runs/RunCard.cy.tsx +++ b/packages/app/src/runs/RunCard.cy.tsx @@ -84,8 +84,6 @@ describe('', { viewportHeight: 400 }, () => { .and('contain', 'tag1') .and('contain', 'tag2') } - - cy.percySnapshot() }) }) }) diff --git a/packages/data-context/package.json b/packages/data-context/package.json index cfbcf55c2489..7087cf659de9 100644 --- a/packages/data-context/package.json +++ b/packages/data-context/package.json @@ -27,7 +27,7 @@ "ast-types": "^0.14.2", "chokidar": "3.5.1", "common-path-prefix": "3.0.0", - "cross-fetch": "^3.1.4", + "cross-fetch": "^3.1.8", "dataloader": "^2.0.0", "dayjs": "^1.9.3", "dedent": "^0.7.0", diff --git a/packages/data-context/src/sources/WizardDataSource.ts b/packages/data-context/src/sources/WizardDataSource.ts index 9a400a32177c..69864d9e9cc0 100644 --- a/packages/data-context/src/sources/WizardDataSource.ts +++ b/packages/data-context/src/sources/WizardDataSource.ts @@ -31,7 +31,7 @@ export class WizardDataSource { async installDependenciesCommand () { const commands = { 'npm': 'npm install -D', - 'pnpm': 'pnpm install -D', + 'pnpm': 'pnpm add -D', 'yarn': 'yarn add -D', } as const diff --git a/packages/driver/cypress/e2e/commands/actions/click.cy.js b/packages/driver/cypress/e2e/commands/actions/click.cy.js index 98650cb31341..bc679e8c6b9f 100644 --- a/packages/driver/cypress/e2e/commands/actions/click.cy.js +++ b/packages/driver/cypress/e2e/commands/actions/click.cy.js @@ -546,6 +546,30 @@ describe('src/cy/commands/actions/click', () => { cy.getAll('span2', 'focus click mousedown').each(shouldNotBeCalled) }) + // https://github.com/cypress-io/cypress/issues/28788 + it('no click when element is disabled', () => { + const btn = cy.$$('button:first') + const span = $('foooo') + + attachFocusListeners({ btn, span }) + attachMouseClickListeners({ btn, span }) + attachMouseHoverListeners({ btn, span }) + + btn.html('') + btn.attr('disabled', true) + btn.append(span) + + cy.get('button:first span').click() + + if (Cypress.browser.name === 'chrome') { + cy.getAll('btn', 'mouseenter mousedown mouseup').each(shouldBeCalled) + } + + cy.getAll('btn', 'focus click').each(shouldNotBeCalled) + cy.getAll('span', 'mouseenter mousedown mouseup').each(shouldBeCalled) + cy.getAll('span', 'focus click').each(shouldNotBeCalled) + }) + it('no click when new element at coords is not ancestor', () => { const btn = cy.$$('button:first') const span1 = $('foooo') diff --git a/packages/driver/cypress/e2e/commands/actions/focus.cy.js b/packages/driver/cypress/e2e/commands/actions/focus.cy.js index 2fc0d830e206..d718e1cba5ff 100644 --- a/packages/driver/cypress/e2e/commands/actions/focus.cy.js +++ b/packages/driver/cypress/e2e/commands/actions/focus.cy.js @@ -202,6 +202,19 @@ describe('src/cy/commands/actions/focus', () => { }) }) + it('can focus element in nested shadow dom', () => { + const onFocus = cy.stub() + + cy.visit('/fixtures/shadow-dom.html') + cy.get('.shadow-5 + input', { includeShadowDom: true }).as('shadow-input').then(($el) => { + $el.on('focus', onFocus) + }) + + cy.get('@shadow-input').focus().then(() => { + expect(onFocus).to.be.calledOnce + }) + }) + describe('assertion verification', () => { beforeEach(function () { cy.on('log:added', (attrs, log) => { @@ -673,7 +686,7 @@ describe('src/cy/commands/actions/focus', () => { }) }) - it('can focus svg elements', () => { + it('can blur svg elements', () => { const onBlur = cy.stub() cy.$$('[data-cy=rect]').blur(onBlur) @@ -683,6 +696,19 @@ describe('src/cy/commands/actions/focus', () => { }) }) + it('can blur element in nested shadow dom', () => { + const onBlur = cy.stub() + + cy.visit('/fixtures/shadow-dom.html') + cy.get('.shadow-5 + input', { includeShadowDom: true }).as('shadow-input').then(($el) => { + $el.on('blur', onBlur).get(0).focus() + }) + + cy.get('@shadow-input').blur().then(() => { + expect(onBlur).to.be.calledOnce + }) + }) + describe('assertion verification', () => { beforeEach(function () { cy.on('log:added', (attrs, log) => { diff --git a/packages/driver/cypress/e2e/commands/actions/select.cy.js b/packages/driver/cypress/e2e/commands/actions/select.cy.js index e6f83b15e192..3beebb2d8b5f 100644 --- a/packages/driver/cypress/e2e/commands/actions/select.cy.js +++ b/packages/driver/cypress/e2e/commands/actions/select.cy.js @@ -87,12 +87,6 @@ describe('src/cy/commands/actions/select', () => { }) }) - it('can select an array of values', () => { - cy.get('select[name=movies]').select(['apoc', 'br']).then(($select) => { - expect($select.val()).to.deep.eq(['apoc', 'br']) - }) - }) - it('can select an array of texts', () => { cy.get('select[name=movies]').select(['The Human Condition', 'There Will Be Blood']).then(($select) => { expect($select.val()).to.deep.eq(['thc', 'twbb']) diff --git a/packages/driver/cypress/e2e/commands/navigation.cy.js b/packages/driver/cypress/e2e/commands/navigation.cy.js index ba1252da74df..51c0ae9e340a 100644 --- a/packages/driver/cypress/e2e/commands/navigation.cy.js +++ b/packages/driver/cypress/e2e/commands/navigation.cy.js @@ -2779,37 +2779,15 @@ describe('src/cy/commands/navigation', () => { }) context('resets state', () => { - context('test isolation on', { testIsolation: true }, () => { - it('resets the server state', () => { - cy.stub(Cypress, 'backend').log(false).callThrough() + it('resets the server state', () => { + cy.stub(Cypress, 'backend').log(false).callThrough() - Cypress.emitThen('test:before:run:async', { - id: 'r1', - currentRetry: 1, - }) - .then(() => { - expect(Cypress.backend).to.be.calledWith( - 'reset:server:state', - { testIsolation: true }, - ) - }) + Cypress.emitThen('test:before:run:async', { + id: 'r1', + currentRetry: 1, }) - }) - - context('test isolation off', { testIsolation: false }, () => { - it('resets the server state', () => { - cy.stub(Cypress, 'backend').log(false).callThrough() - - Cypress.emitThen('test:before:run:async', { - id: 'r1', - currentRetry: 1, - }) - .then(() => { - expect(Cypress.backend).to.be.calledWith( - 'reset:server:state', - { testIsolation: false }, - ) - }) + .then(() => { + expect(Cypress.backend).to.be.calledWith('reset:server:state') }) }) }) diff --git a/packages/driver/cypress/e2e/commands/net_stubbing.cy.ts b/packages/driver/cypress/e2e/commands/net_stubbing.cy.ts index 6ed6c827796d..f890965275d3 100644 --- a/packages/driver/cypress/e2e/commands/net_stubbing.cy.ts +++ b/packages/driver/cypress/e2e/commands/net_stubbing.cy.ts @@ -2199,7 +2199,7 @@ describe('network stubbing', { retries: 15 }, function () { context('with `times`', function () { // TODO: fix flaky test https://github.com/cypress-io/cypress/issues/23434 - it('only uses each handler N times', { retries: 15 }, function () { + it('only uses each handler N times', { browser: '!webkit', retries: 15 }, function () { const url = uniqueRoute('/foo') const third = sinon.stub() diff --git a/packages/driver/cypress/e2e/commands/request.cy.js b/packages/driver/cypress/e2e/commands/request.cy.js index 8e69f51f1d65..3fe89f44362f 100644 --- a/packages/driver/cypress/e2e/commands/request.cy.js +++ b/packages/driver/cypress/e2e/commands/request.cy.js @@ -129,6 +129,60 @@ describe('src/cy/commands/request', () => { }) }) + // https://github.com/cypress-io/cypress/issues/28789 + context('accepts trivial RFC 8259 compliant body objects', () => { + it('accepts body equal to true', () => { + cy.request({ method: 'POST', url: 'http://www.github.com/projects/foo', body: true }).then(function () { + this.expectOptionsToBe({ + method: 'POST', + url: 'http://www.github.com/projects/foo', + body: true, + json: true, + }) + }) + }) + + it('accepts body equal to false', () => { + cy.request({ method: 'POST', url: 'http://www.github.com/projects/foo', body: false }).then(function () { + this.expectOptionsToBe({ + method: 'POST', + url: 'http://www.github.com/projects/foo', + body: false, + json: true, + }) + }) + }) + + it('accepts (explicitly defined) null body', () => { + cy.request({ method: 'POST', url: 'http://www.github.com/projects/foo', body: null }).then(function () { + this.expectOptionsToBe({ + method: 'POST', + url: 'http://www.github.com/projects/foo', + //body: null, + json: true, + }) + }) + + cy.request('POST', 'http://www.github.com/projects/foo', null).then(function () { + this.expectOptionsToBe({ + method: 'POST', + url: 'http://www.github.com/projects/foo', + //body: null, + json: true, + }) + }) + + cy.request('http://www.github.com/projects/foo', null).then(function () { + this.expectOptionsToBe({ + method: 'POST', + url: 'http://www.github.com/projects/foo', + //body: null, + json: true, + }) + }) + }) + }) + context('method normalization', () => { it('uppercases method', () => { cy.request('post', 'https://www.foo.com').then(function () { diff --git a/packages/driver/cypress/e2e/commands/screenshot.cy.js b/packages/driver/cypress/e2e/commands/screenshot.cy.js index 3937df4b4f17..b80f3dd18ee6 100644 --- a/packages/driver/cypress/e2e/commands/screenshot.cy.js +++ b/packages/driver/cypress/e2e/commands/screenshot.cy.js @@ -76,27 +76,6 @@ describe('src/cy/commands/screenshot', () => { }) }) - it('is noop when screenshotOnRunFailure is false', () => { - Cypress.config('isInteractive', false) - cy.stub(Screenshot, 'getConfig').returns({ - screenshotOnRunFailure: false, - }) - - cy.spy(Cypress, 'action').log(false) - - const test = { - err: new Error, - } - - const runnable = cy.state('runnable') - - Cypress.action('runner:runnable:after:run:async', test, runnable) - .then(() => { - expect(Cypress.action).not.to.be.calledWith('test:set:state') - expect(Cypress.automation).not.to.be.called - }) - }) - it('is noop when screenshotOnRunFailure is false', () => { Cypress.config('isInteractive', false) Cypress.config('screenshotOnRunFailure', false) diff --git a/packages/driver/cypress/e2e/cy/snapshot.cy.js b/packages/driver/cypress/e2e/cy/snapshot.cy.js index f6733a9af47c..81bd45fd6dfc 100644 --- a/packages/driver/cypress/e2e/cy/snapshot.cy.js +++ b/packages/driver/cypress/e2e/cy/snapshot.cy.js @@ -255,6 +255,31 @@ describe('driver/src/cy/snapshots', () => { expect(name).to.equal('snapshot') expect(timestamp).to.be.a('number') }) + + it('captures shadow DOM selectors structure properly', { + protocolEnabled: true, + }, () => { + cy.visit('/fixtures/shadow-dom-type.html') + cy.window().then((win) => { + win.__cypressProtocolMetadata = { frameId: 'test-frame-id' } + + cy.get('#shadow-dom-input', { + includeShadowDom: true, + }).then((shadowDomSlot) => { + const { elementsToHighlight, name, timestamp } = cy.createSnapshot('snapshot', shadowDomSlot) + + expect(elementsToHighlight?.length).to.equal(1) + const elementToHighlight = elementsToHighlight[0] + + expect(elementToHighlight.selector.length).to.equal(2) + expect(elementToHighlight.selector[0]).to.equal('#element') + expect(elementToHighlight.selector[1]).to.equal('#shadow-dom-input') + expect(elementToHighlight.frameId).to.equal('test-frame-id') + expect(name).to.equal('snapshot') + expect(timestamp).to.be.a('number') + }) + }) + }) }) }) diff --git a/packages/driver/cypress/e2e/cy/timers.cy.js b/packages/driver/cypress/e2e/cy/timers.cy.js index c97669b191ed..980c5f58be38 100644 --- a/packages/driver/cypress/e2e/cy/timers.cy.js +++ b/packages/driver/cypress/e2e/cy/timers.cy.js @@ -187,9 +187,9 @@ describe('driver/src/cy/timers', () => { // now go ahead and run all the queued timers return cy.pauseTimers(false) }) - .then(() => { - expect(win.bar).to.eq('bar') + cy.window().its('bar').should('eq', 'bar') + .and(() => { // requestAnimationFrame should have passed through // its high res timestamp from performance.now() expect(rafStub).to.be.calledWithMatch(Number) diff --git a/packages/driver/cypress/e2e/cypress/cypress.cy.js b/packages/driver/cypress/e2e/cypress/cypress.cy.js index dfa9e945e3f5..341adfbfd686 100644 --- a/packages/driver/cypress/e2e/cypress/cypress.cy.js +++ b/packages/driver/cypress/e2e/cypress/cypress.cy.js @@ -86,96 +86,6 @@ describe('driver/src/cypress/index', () => { }) }) - context('.currentRetry', () => { - describe('test is not retried', () => { - before(() => { - expect(Cypress.currentRetry).to.eq(0) - }) - - beforeEach(() => { - expect(Cypress.currentRetry).to.eq(0) - }) - - afterEach(() => { - expect(Cypress.currentRetry).to.eq(0) - }) - - after(() => { - expect(Cypress.currentRetry).to.eq(0) - }) - - it('correctly returns currentRetry', () => { - expect(Cypress.currentRetry).to.eq(0) - }) - }) - - describe('test is retried due to beforeEach hook failure', { retries: 1 }, () => { - before(() => { - expect(Cypress.currentRetry).to.be.oneOf([0, 1]) - }) - - beforeEach(() => { - expect(Cypress.currentRetry).to.eq(1) - }) - - it('correctly returns currentRetry', () => { - expect(Cypress.currentRetry).to.eq(1) - }) - - afterEach(() => { - expect(Cypress.currentRetry).to.eq(1) - }) - - after(() => { - expect(Cypress.currentRetry).to.eq(1) - }) - }) - - describe('test is retried due to test failure', { retries: 1 }, () => { - before(() => { - expect(Cypress.currentRetry).to.be.oneOf([0, 1]) - }) - - beforeEach(() => { - expect(Cypress.currentRetry).to.be.oneOf([0, 1]) - }) - - it('correctly returns currentRetry', () => { - expect(Cypress.currentRetry).to.eq(1) - }) - - afterEach(() => { - expect(Cypress.currentRetry).to.eq(1) - }) - - after(() => { - expect(Cypress.currentRetry).to.eq(1) - }) - }) - - describe('test is retried due to afterEach hook failure', { retries: 1 }, () => { - before(() => { - expect(Cypress.currentRetry).to.be.oneOf([0, 1]) - }) - - beforeEach(() => { - expect(Cypress.currentRetry).to.be.oneOf([0, 1]) - }) - - it('correctly returns currentRetry', () => { - expect(Cypress.currentRetry).to.be.oneOf([0, 1]) - }) - - afterEach(() => { - expect(Cypress.currentRetry).to.eq(1) - }) - - after(() => { - expect(Cypress.currentRetry).to.eq(1) - }) - }) - }) - context('.isCy', () => { it('returns true on cy, cy chainable', () => { expect(Cypress.isCy(cy)).to.be.true diff --git a/packages/driver/cypress/e2e/cypress/error_utils.cy.ts b/packages/driver/cypress/e2e/cypress/error_utils.cy.ts index a62012594748..abdde21c0c2d 100644 --- a/packages/driver/cypress/e2e/cypress/error_utils.cy.ts +++ b/packages/driver/cypress/e2e/cypress/error_utils.cy.ts @@ -372,17 +372,6 @@ describe('driver/src/cypress/error_utils', () => { }) }) - context('.throwErrByPath', () => { - it('looks up error and throws it', () => { - // @ts-ignore - $errorMessages.__test_error = 'simple error message' - - const fn = () => $errUtils.throwErrByPath('__test_error') - - expect(fn).to.throw('simple error message') - }) - }) - context('.enhanceStack', () => { const userInvocationStack = ' at userInvoked (app.js:1:1)' const sourceStack = { diff --git a/packages/driver/cypress/e2e/e2e/origin/origin.cy.ts b/packages/driver/cypress/e2e/e2e/origin/origin.cy.ts index c8c64bc1525c..379f41d656e2 100644 --- a/packages/driver/cypress/e2e/e2e/origin/origin.cy.ts +++ b/packages/driver/cypress/e2e/e2e/origin/origin.cy.ts @@ -154,69 +154,6 @@ describe('cy.origin', { browser: '!webkit' }, () => { cy.log('after cy.origin') }) - ;[{ - title: 'first attempt', - retries: 0, - }, { - title: 'on retry', - retries: 1, - }].forEach(({ title, retries }) => { - it(`passes runnable state to the secondary origin ${title}`, { retries }, () => { - const runnable = cy.state('runnable') - const expectedRunnable = { - clearTimeout: null, - isPending: null, - resetTimeout: null, - timeout: null, - id: runnable.id, - _currentRetry: retries, - _timeout: 4000, - type: 'test', - title: `passes runnable state to the secondary origin ${title}`, - titlePath: [ - 'cy.origin', - 'withBeforeEach', - `passes runnable state to the secondary origin ${title}`, - ], - parent: { - id: runnable.parent.id, - type: 'suite', - title: 'withBeforeEach', - titlePath: [ - 'withBeforeEach', - ], - parent: { - id: runnable.parent.parent.id, - type: 'suite', - title: '', - titlePath: undefined, - ctx: {}, - }, - ctx: {}, - }, - ctx: {}, - } - - cy.origin('http://www.foobar.com:3500', { args: expectedRunnable }, (expectedRunnable) => { - const actualRunnable = cy.state('runnable') - - expect(actualRunnable.titlePath()).to.deep.equal(expectedRunnable.titlePath) - expectedRunnable.titlePath = actualRunnable.titlePath - - expect(actualRunnable.title).to.equal(expectedRunnable.title) - expect(actualRunnable.id).to.equal(expectedRunnable.id) - expect(actualRunnable.ctx).to.deep.equal(expectedRunnable.ctx) - expect(actualRunnable._currentRetry).to.equal(expectedRunnable._currentRetry) - expect(actualRunnable._timeout).to.equal(expectedRunnable._timeout) - expect(actualRunnable.type).to.equal(expectedRunnable.type) - expect(actualRunnable.callback).to.exist - expect(actualRunnable.timeout).to.exist - expect(actualRunnable.parent.title).to.equal(expectedRunnable.parent.title) - expect(actualRunnable.parent.type).to.equal(expectedRunnable.parent.type) - }) - }) - }) - it('handles querying nested elements', () => { cy.origin('http://www.foobar.com:3500', () => { cy diff --git a/packages/driver/cypress/e2e/e2e/rerun.cy.js b/packages/driver/cypress/e2e/e2e/rerun.cy.js index 3c2ac08cd1dc..3219e1b8cae8 100644 --- a/packages/driver/cypress/e2e/e2e/rerun.cy.js +++ b/packages/driver/cypress/e2e/e2e/rerun.cy.js @@ -10,7 +10,10 @@ if (window.top.runCount == null) { const isTextTerminal = Cypress.config('isTextTerminal') -describe('rerun state bugs', () => { +// TODO: UNSKIP this for chromium browsers. @see https://github.com/cypress-io/cypress/issues/29181 +describe('rerun state bugs', { browser: { + family: '!chromium', +} }, () => { // NOTE: there's probably other ways to cause a re-run // event more programatically (like firing it through Cypress) // but we get the hashchange coverage for free on this. diff --git a/packages/driver/cypress/e2e/e2e/service-worker.cy.js b/packages/driver/cypress/e2e/e2e/service-worker.cy.js new file mode 100644 index 000000000000..d4e93d663c93 --- /dev/null +++ b/packages/driver/cypress/e2e/e2e/service-worker.cy.js @@ -0,0 +1,669 @@ +// decrease the timeouts to ensure we don't hit the 2s correlation timeout +describe('service workers', { defaultCommandTimeout: 1000, pageLoadTimeout: 1000 }, () => { + let sessionId + + const getSessionId = async () => { + if (!sessionId) { + const targets = (await Cypress.automation('remote:debugger:protocol', { command: 'Target.getTargets', params: {} })).targetInfos + const serviceWorkerTarget = targets.reverse().find((target) => target.type === 'service_worker' && target.url === 'http://localhost:3500/fixtures/service-worker.js') + + ;({ sessionId } = await Cypress.automation('remote:debugger:protocol', { command: 'Target.attachToTarget', params: { targetId: serviceWorkerTarget.targetId, flatten: true } })) + } + + return sessionId + } + + const getEventListenersLength = async () => { + const sessionId = await getSessionId() + let result = await Cypress.automation('remote:debugger:protocol', { command: 'Runtime.evaluate', params: { expression: 'getEventListeners(self).fetch', includeCommandLineAPI: true }, sessionId }) + + if (result.result.type === 'undefined') return 0 + + result = await Cypress.automation('remote:debugger:protocol', { command: 'Runtime.getProperties', params: { objectId: result.result.objectId }, sessionId }) + + const length = result.result.find((prop) => prop.name === 'length').value.value + + return length + } + + const getOnFetchHandlerType = async () => { + const sessionId = await getSessionId() + + const result = await Cypress.automation('remote:debugger:protocol', { command: 'Runtime.evaluate', params: { expression: 'self.onfetch', includeCommandLineAPI: true }, sessionId }) + + return result.result.type + } + + const detachFromTarget = async () => { + await Cypress.automation('remote:debugger:protocol', { command: 'Target.detachFromTarget', params: { sessionId } }) + } + + const validateFetchHandlers = ({ listenerCount, onFetchHandlerType }) => { + // skip validation in non-Chromium and electron browsers + // non-Chromium browsers do not fully support the remote debugger protocol + // possibly remove the electron check on https://github.com/cypress-io/cypress/issues/2118 is resolved + if (Cypress.browser.family !== 'chromium' || Cypress.browser.name === 'electron') { + cy.log('Skipping fetch handlers validation in non-Chromium and electron browsers') + + return + } + + cy.then(() => { + cy.wrap(getEventListenersLength()).should('equal', listenerCount).then(() => { + if (onFetchHandlerType) cy.wrap(getOnFetchHandlerType()).should('equal', onFetchHandlerType) + }).then(() => { + cy.wrap(detachFromTarget()) + }) + }) + } + + const unregisterServiceWorker = () => { + cy.wrap(navigator.serviceWorker.getRegistrations()).then((registrations) => { + cy.wrap(Promise.all(registrations.map((registration) => registration.unregister()))) + }) + } + + beforeEach(() => { + sessionId = null + + // unregister the service worker to ensure it does not affect other tests + unregisterServiceWorker() + }) + + describe('a service worker that handles requests', () => { + it('supports using addEventListener with function', () => { + const script = () => { + self.addEventListener('fetch', function (event) { + event.respondWith(fetch(event.request)) + }) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 1 }) + }) + + it('supports using addEventListener with object', () => { + const script = () => { + const obj = { + handleEvent (event) { + event.respondWith(fetch(event.request)) + }, + } + + self.addEventListener('fetch', obj) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 1 }) + }) + + it('supports using addEventListener with delayed handleEvent', () => { + const script = () => { + const obj = {} + + self.addEventListener('fetch', obj) + obj.handleEvent = function (event) { + event.respondWith(fetch(event.request)) + } + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 1 }) + }) + + it('adds both listeners when addEventListener and onfetch use the same listener', () => { + const script = () => { + const listener = function (event) { + event.respondWith(fetch(event.request)) + } + + self.onfetch = listener + self.addEventListener('fetch', listener) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + // onfetch will add an event listener + validateFetchHandlers({ listenerCount: 2, onFetchHandlerType: 'function' }) + }) + + it('supports using onfetch', () => { + const script = () => { + self.onfetch = function (event) { + event.respondWith(fetch(event.request)) + } + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + // onfetch will add an event listener + validateFetchHandlers({ listenerCount: 1, onFetchHandlerType: 'function' }) + }) + }) + + describe('a service worker that does not handle requests', () => { + it('supports using addEventListener', () => { + const script = () => { + self.addEventListener('fetch', function (event) { + return + }) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 1 }) + }) + + it('supports using onfetch', () => { + const script = () => { + self.onfetch = function (event) { + return + } + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + // onfetch will add an event listener + validateFetchHandlers({ listenerCount: 1, onFetchHandlerType: 'function' }) + }) + + it('does not add a null listener', () => { + const script = () => { + // does not add the listener because it is null + self.addEventListener('fetch', null) + // does not add the listener because it is undefined + self.addEventListener('fetch', undefined) + + // adds the listener because it is a function + self.addEventListener('fetch', () => { + return + }) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 1 }) + }) + }) + + describe('a service worker that removes fetch handlers', () => { + it('supports using addEventListener', () => { + const script = () => { + const handler = function (event) { + return new Response('Network error', { + status: 400, + headers: { 'Content-Type': 'text/plain' }, + }) + } + + self.addEventListener('fetch', handler) + self.removeEventListener('fetch', handler) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 0 }) + }) + + it('supports removing event listener on delay', () => { + const script = () => { + const handler = function (event) { + return new Response('Network error', { + status: 400, + headers: { 'Content-Type': 'text/plain' }, + }) + } + + self.addEventListener('fetch', handler) + // remove the listener after a delay + setTimeout(() => { + self.removeEventListener('fetch', handler) + }, 0) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 0 }) + }) + + it('supports using onfetch', () => { + const script = () => { + self.onfetch = function (event) { + return new Response('Network error', { + status: 400, + headers: { 'Content-Type': 'text/plain' }, + }) + } + + self.onfetch = undefined + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 0 }) + }) + + it('does not fail when removing a non-existent listener', () => { + const script = () => { + const listener = function (event) { + return + } + + self.addEventListener('fetch', listener) + + // this does not remove the listener because the listener is not the same function + self.removeEventListener('fetch', function (event) { + return + }) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 1 }) + }) + + it('does not fail when removing a null listener', () => { + const script = () => { + self.addEventListener('fetch', () => { + return + }) + + self.removeEventListener('fetch', null) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 1 }) + }) + }) + + describe('a service worker with multiple fetch handlers', () => { + it('supports using addEventListener and onfetch', () => { + const script = () => { + self.addEventListener('fetch', function (event) { + event.respondWith(fetch(event.request)) + }) + + self.onfetch = function (event) { + event.respondWith(fetch(event.request)) + } + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + // onfetch will add an event listener + validateFetchHandlers({ listenerCount: 2, onFetchHandlerType: 'function' }) + }) + + it('supports other options', () => { + const script = () => { + const handler = function (event) { + event.respondWith(fetch(event.request)) + } + + self.addEventListener('fetch', handler) + + // this one does not get added because capture is the same + self.addEventListener('fetch', handler, { capture: false }) + + // this one gets added because capture is different + self.addEventListener('fetch', handler, { capture: true }) + + // this one does not get added because capture is the same + self.addEventListener('fetch', handler, { once: true }) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 2 }) + }) + }) + + describe('multiple concurrent requests', () => { + it('page request sent (handled by service worker) and then service worker request', () => { + const script = () => { + self.addEventListener('fetch', function (event) { + const response = fetch(event.request) + + // send a request from the service worker after the page request + if (event.request.url.includes('timeout')) { + fetch('/timeout').catch(() => {}) + } + + event.respondWith(response) + }) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('/fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + }) + + it('service worker request sent and then page request (handled by service worker):', () => { + const script = () => { + self.addEventListener('fetch', function (event) { + // send a request from the service worker before the page request + if (event.request.url.includes('timeout')) { + fetch('/timeout').catch(() => {}) + } + + const response = fetch(event.request) + + event.respondWith(response) + }) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('/fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + }) + + it('page request sent (NOT handled by service worker) and then service worker request:', () => { + const script = () => { + self.addEventListener('fetch', function (event) { + if (event.request.url.includes('timeout')) { + fetch('/timeout').catch(() => {}) + } + + return + }) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('/fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + }) + }) + + it('supports aborted listeners', () => { + const script = () => { + const alreadyAborted = new AbortController() + + alreadyAborted.abort() + + // this one does not get added because the signal is aborted before adding the listener + self.addEventListener('fetch', () => { + return + }, { signal: alreadyAborted.signal }) + + const notAborted = new AbortController() + + // this one gets added because the signal is not aborted + self.addEventListener('fetch', (event) => { + event.respondWith(fetch(event.request)) + }, { signal: notAborted.signal }) + + const aborted = new AbortController() + + // this one gets added but then immediately removed because the signal is aborted after adding the listener + self.addEventListener('fetch', (event) => { + event.respondWith(fetch(event.request)) + }, { signal: aborted.signal }) + + aborted.abort() + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 1 }) + }) + + it('supports changing the handleEvent function', () => { + const script = () => { + const listener = { + handleEvent (event) { + event.respondWith(new Response('Network error', { + status: 400, + headers: { 'Content-Type': 'text/plain' }, + })) + }, + } + + self.addEventListener('fetch', listener) + + listener.handleEvent = function (event) { + event.respondWith(fetch(event.request)) + } + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 1 }) + }) + + it('supports changing the handleEvent function prior to adding', () => { + const script = () => { + const listener = { + handleEvent (event) { + event.respondWith(new Response('Network error', { + status: 400, + headers: { 'Content-Type': 'text/plain' }, + })) + }, + } + + listener.handleEvent = function (event) { + event.respondWith(fetch(event.request)) + } + + self.addEventListener('fetch', listener) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 1 }) + }) + + it('succeeds when there are no listeners', () => { + const script = () => {} + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 0 }) + }) + + it('supports caching', () => { + const script = () => { + self.addEventListener('install', function (event) { + event.waitUntil( + caches.open('v1').then(function (cache) { + return cache.addAll([ + '/fixtures/1mb', + ]) + }), + ) + }) + + self.addEventListener('fetch', function (event) { + event.respondWith( + caches.match(event.request).then(function (response) { + return response || fetch(event.request) + }), + ) + }) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html').then(async (win) => { + const response = await win.fetch('/1mb') + + expect(response.ok).to.be.true + }) + + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 1 }) + }) + + it('supports clients.claim', () => { + const script = () => { + self.addEventListener('activate', (event) => { + event.waitUntil(self.clients.claim()) + }) + + self.addEventListener('fetch', function (event) { + event.respondWith(fetch(event.request)) + }) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 1 }) + }) + + it('supports async fetch handler', () => { + const script = () => { + self.addEventListener('fetch', async function (event) { + await Promise.resolve() + event.respondWith(fetch(event.request)) + }) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 1 }) + }) + + it('does not fail when the listener throws an error', () => { + const script = () => { + self.addEventListener('fetch', function (event) { + throw new Error('Error in fetch listener') + }) + } + + cy.intercept('/fixtures/service-worker.js', (req) => { + req.reply(`(${script})()`, + { 'Content-Type': 'application/javascript' }) + }) + + cy.visit('fixtures/service-worker.html') + + cy.get('#output').should('have.text', 'done') + validateFetchHandlers({ listenerCount: 1 }) + }) +}) diff --git a/packages/driver/cypress/e2e/issues/28545.cy.ts b/packages/driver/cypress/e2e/issues/28545.cy.ts deleted file mode 100644 index 0d0ec7bc7f5c..000000000000 --- a/packages/driver/cypress/e2e/issues/28545.cy.ts +++ /dev/null @@ -1,38 +0,0 @@ -// https://github.com/cypress-io/cypress/issues/28545 - -describe('lots of requests', () => { - beforeEach(() => { - cy.intercept('/lots-of-requests', (req) => { - req.reply( - ` - - Lots of Requests - - - - - `, - ) - }) - }) - - describe('test isolation off', { testIsolation: false }, () => { - it('test 1', () => { - cy.visit('http://localhost:3500/lots-of-requests') - }) - - it('test 2', () => { - cy.get('#done').should('contain', 'Done') - }) - }) -}) diff --git a/packages/driver/cypress/fixtures/service-worker.html b/packages/driver/cypress/fixtures/service-worker.html new file mode 100644 index 000000000000..6ca9ad9eebf5 --- /dev/null +++ b/packages/driver/cypress/fixtures/service-worker.html @@ -0,0 +1,38 @@ + + + + + + + +

hi

+
+ + diff --git a/packages/driver/cypress/fixtures/shadow-dom-type.html b/packages/driver/cypress/fixtures/shadow-dom-type.html index 75ff6a161bd7..57826c10733e 100644 --- a/packages/driver/cypress/fixtures/shadow-dom-type.html +++ b/packages/driver/cypress/fixtures/shadow-dom-type.html @@ -10,6 +10,7 @@ this._shadow = this.attachShadow({mode: "open"}); const input = document.createElement("input"); + input.id = 'shadow-dom-input' this._shadow.appendChild(input); } } diff --git a/packages/driver/cypress/plugins/index.js b/packages/driver/cypress/plugins/index.js index 65e3b4d31002..966a202bed51 100644 --- a/packages/driver/cypress/plugins/index.js +++ b/packages/driver/cypress/plugins/index.js @@ -10,7 +10,6 @@ const Jimp = require('jimp') const webpackConfig = require('@packages/runner/webpack.config.ts') async function getWebpackOptions () { - process.env.NO_LIVERELOAD = '1' const opts = await webpackConfig.default() const webpackOptions = opts[0] @@ -43,6 +42,15 @@ module.exports = async (on, config) => { on('file:preprocessor', wp({ webpackOptions })) + on('before:browser:launch', (browser, launchOptions) => { + if (browser.family === 'firefox') { + // set testing_localhost_is_secure_when_hijacked to true so localhost will be considered a secure context + launchOptions.preferences['network.proxy.testing_localhost_is_secure_when_hijacked'] = true + } + + return launchOptions + }) + on('task', { 'return:arg' (arg) { return arg diff --git a/packages/driver/cypress/plugins/server.js b/packages/driver/cypress/plugins/server.js index 8aaad9d1a460..32407ecae4b7 100644 --- a/packages/driver/cypress/plugins/server.js +++ b/packages/driver/cypress/plugins/server.js @@ -122,7 +122,7 @@ const createApp = (port) => { return res.send(req.body) }) - app.get('/1mb', (req, res) => { + app.get('*/1mb', (req, res) => { return res.type('text').send('X'.repeat(1024 * 1024)) }) diff --git a/packages/driver/package.json b/packages/driver/package.json index 315bdd6b90c2..98582dc5ee7f 100644 --- a/packages/driver/package.json +++ b/packages/driver/package.json @@ -57,7 +57,7 @@ "express": "4.17.3", "is-valid-domain": "0.0.20", "is-valid-hostname": "1.0.1", - "jimp": "0.14.0", + "jimp": "0.22.12", "jquery": "3.1.1", "js-cookie": "2.2.1", "json-stable-stringify": "1.0.1", @@ -83,7 +83,7 @@ "unfetch": "4.1.0", "url-parse": "1.5.9", "vanilla-text-mask": "5.1.1", - "vite": "4.3.2", + "vite": "4.5.2", "webpack": "^5.88.2", "zone.js": "0.9.0" }, diff --git a/packages/driver/src/cy/commands/navigation.ts b/packages/driver/src/cy/commands/navigation.ts index 85ad1fb32298..7028f49175ab 100644 --- a/packages/driver/src/cy/commands/navigation.ts +++ b/packages/driver/src/cy/commands/navigation.ts @@ -452,7 +452,7 @@ export default (Commands, Cypress, cy, state, config) => { // reset any state on the backend // TODO: this is a bug in e2e it needs to be returned - return Cypress.backend('reset:server:state', { testIsolation: Cypress.config('testIsolation') }) + return Cypress.backend('reset:server:state') }) Cypress.on('test:before:run', reset) diff --git a/packages/driver/src/cy/commands/request.ts b/packages/driver/src/cy/commands/request.ts index b33759abfaef..ddbb7853fc1c 100644 --- a/packages/driver/src/cy/commands/request.ts +++ b/packages/driver/src/cy/commands/request.ts @@ -43,8 +43,9 @@ const hasFormUrlEncodedContentTypeHeader = (headers) => { return header && (_.toLower(header) === 'content-type') } -const isValidJsonObj = (body) => { - return _.isObject(body) && !_.isFunction(body) +const isValidBody = (body, isExplicitlyDefined: boolean = false) => { + return (_.isObject(body) || _.isBoolean(body) || (isExplicitlyDefined && _.isNull(body))) + && !_.isFunction(body) } const whichAreOptional = (val, key) => { @@ -81,9 +82,11 @@ export default (Commands, Cypress, cy, state, config) => { request (...args) { const o: any = {} const userOptions = o + let bodyIsExplicitlyDefined = false if (_.isObject(args[0])) { _.extend(userOptions, args[0]) + bodyIsExplicitlyDefined = _.has(args[0], 'body') } else if (args.length === 1) { o.url = args[0] } else if (args.length === 2) { @@ -96,11 +99,13 @@ export default (Commands, Cypress, cy, state, config) => { // set url + body o.url = args[0] o.body = args[1] + bodyIsExplicitlyDefined = true } } else if (args.length === 3) { o.method = args[0] o.url = args[1] o.body = args[2] + bodyIsExplicitlyDefined = true } let options = _.defaults({}, userOptions, REQUEST_DEFAULTS, { @@ -222,7 +227,7 @@ export default (Commands, Cypress, cy, state, config) => { // only set json to true if form isnt true // and we have a valid object for body - if ((options.form !== true) && isValidJsonObj(options.body)) { + if ((options.form !== true) && isValidBody(options.body, bodyIsExplicitlyDefined)) { options.json = true } diff --git a/packages/driver/src/cy/focused.ts b/packages/driver/src/cy/focused.ts index 7ce40ba9863d..85edd76541eb 100644 --- a/packages/driver/src/cy/focused.ts +++ b/packages/driver/src/cy/focused.ts @@ -242,19 +242,19 @@ export const create = (state: StateFunc) => ({ needsFocus ($elToFocus, $previouslyFocusedEl) { const $focused = this.getFocused() - // if we dont have a focused element + // if we don't have a focused element // we know we want to fire a focus event if (!$focused) { return true } - // if we didnt have a previously focused el + // if we didn't have a previously focused el // then always return true if (!$previouslyFocusedEl) { return true } - // if we are attemping to focus a differnet element + // if we are attempting to focus a different element // than the one we currently have, we know we want // to fire a focus event if ($focused.get(0) !== $elToFocus.get(0)) { @@ -273,11 +273,16 @@ export const create = (state: StateFunc) => ({ return false }, - getFocused (document = state('document')) { + getFocused (document: Document | ShadowRoot | undefined = state('document')) { if (document) { const { activeElement } = document if ($dom.isFocused(activeElement)) { + // if the active element is a shadow root, we need to recursively get the active element of the shadow root + if (activeElement?.shadowRoot && activeElement.shadowRoot.activeElement) { + return this.getFocused(activeElement.shadowRoot) + } + return $dom.wrap(activeElement) } } diff --git a/packages/driver/src/cy/mouse.ts b/packages/driver/src/cy/mouse.ts index 2a34656ac7ff..c87e4b110a4b 100644 --- a/packages/driver/src/cy/mouse.ts +++ b/packages/driver/src/cy/mouse.ts @@ -567,6 +567,21 @@ export const create = (state: StateFunc, keyboard: Keyboard, focused: IFocused, return { skipClickEventReason: 'element was detached' } } + // Only send click event if element is not disabled. + // First find an parent element that can actually be disabled + const findParentThatCanBeDisabled = (el: HTMLElement): HTMLElement | null => { + const elementsThatCanBeDisabled = ['button', 'input', 'select', 'textarea', 'optgroup', 'option', 'fieldset'] + + return elementsThatCanBeDisabled.includes($elements.getTagName(el)) ? el : null + } + + const parentThatCanBeDisabled = $elements.findParent(mouseUpPhase.targetEl, findParentThatCanBeDisabled) || $elements.findParent(mouseDownPhase.targetEl, findParentThatCanBeDisabled) + + // Then check if parent is indeed disabled + if (parentThatCanBeDisabled !== null && $elements.isDisabled($(parentThatCanBeDisabled))) { + return { skipClickEventReason: 'element was disabled' } + } + const commonAncestor = mouseUpPhase.targetEl && mouseDownPhase.targetEl && $elements.getFirstCommonAncestor(mouseUpPhase.targetEl, mouseDownPhase.targetEl) diff --git a/packages/driver/src/cy/snapshots.ts b/packages/driver/src/cy/snapshots.ts index f1f122718c52..9c553221f1c8 100644 --- a/packages/driver/src/cy/snapshots.ts +++ b/packages/driver/src/cy/snapshots.ts @@ -10,6 +10,89 @@ export const HIGHLIGHT_ATTR = 'data-cypress-el' export const FINAL_SNAPSHOT_NAME = 'final state' +type SelectorNode = { + frameId?: string + selector: string + ownerDoc: Document | ShadowRoot + host?: SelectorNode +} + +const returnShadowRootIfShadowDomNode = (node: Element): ShadowRoot | null => { + // the shadowRoot object property only lives on the node context OUTSIDE the shadow DOM, meaning that + // node.parentNode.host.shadowRoot works. Oddly, this is considered an instance of an Object and not + // a ShadowRoot, so checking for the shadowRoot on the host property is likely safe. + const isNodeShadowRoot = (n: any) => !!n?.host?.shadowRoot + + let parent = node && node.parentNode + + while (parent) { + if (isNodeShadowRoot(parent)) { + return parent as ShadowRoot + } + + parent = parent.parentNode + } + + return null +} + +function findSelectorForElement (elem: Element, root: Document | ShadowRoot) { + // finder tries to find the shortest unique selector to an element, + // but since we are more concerned with speed, we set the threshold to 1 and maxNumberOfTries to 0 + // @see https://github.com/antonmedv/finder/issues/75 + return finder(elem, { root: root as unknown as Element, threshold: 1, maxNumberOfTries: 0 }) +} + +/** + * Builds a recursive structure of selectors in order to re-identify during Test Replay. + * + * @param elem - an HTML Element that lives within the shadow DOM or the regular DOM + * @returns SelectorNode if the selector can be discovered. For regular elements, this should only be one object deep, but for shadow DOM + * elements, the SelectorNode tree could be N levels deep until the root is discovered + */ +function constructElementSelectorTree (elem: Element): SelectorNode | undefined { + try { + const ownerDoc = elem.ownerDocument + const elWindow = ownerDoc.defaultView + + if (elWindow === null) { + return undefined + } + + // finder will return a string if it can find the selector. + // otherwise, an error will throw and we will fall back to shadowDom lookup. + const selector = findSelectorForElement(elem, ownerDoc) + + const frameId = elWindow['__cypressProtocolMetadata']?.frameId + + return { selector, frameId, ownerDoc: elem.ownerDocument, host: undefined } + } catch { + // the element may not always be found since it's possible for the element to be removed from the DOM + // Or maybe its in the shadow DOM. + // If it is a shadow DOM element, return the ShadowRoot as well to relate the node to the root document + try { + const shadowRoot = returnShadowRootIfShadowDomNode(elem) + + // If we have a shadow DOM element, get the frameId and unique selector of the ShadowRoot + // see https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot + if (shadowRoot) { + // Look up the details of the shadowRoot to see which element the ShadowRoot is bound to, i.e. the host. + const hostDetails = constructElementSelectorTree(shadowRoot.host) + + // look up our element inside the context of the ShadowRoot + const selectorFromShadowWorld = findSelectorForElement(elem, shadowRoot) + + // gives us enough information to associate the shadow element to the ShadowRoot/host to reconstruct in Test Replay + return { selector: selectorFromShadowWorld, frameId: undefined, ownerDoc: shadowRoot, host: hostDetails } + } + } catch { + return undefined + } + } + + return undefined +} + export const create = ($$: $Cy['$$'], state: StateFunc) => { const snapshotsCss = createSnapshotsCSS($$, state) const snapshotsMap = new WeakMap() @@ -232,6 +315,47 @@ export const create = ($$: $Cy['$$'], state: StateFunc) => { return $dom.isElement($el) && $dom.isJquery($el) } + const buildSelectorArray = (el: HTMLElement) => { + // flatten selector to only include selector string values, which we can imply is a shadowRoot if other values exist in the tree + // this keeps the structure similar to axe-core + // @see https://github.com/dequelabs/axe-core/blob/develop/doc/API.md#results-object -> target + const selectors: string[] | undefined = [] + let frameId: string | undefined + const flattenElementSelectorTree = (el: SelectorNode | undefined): void => { + if (el) { + selectors.unshift(el?.selector) + + if (el?.host) { + flattenElementSelectorTree(el.host) + } else { + frameId = el.frameId + } + } + } + + const elToHighlight = constructElementSelectorTree(el) + + flattenElementSelectorTree(elToHighlight) + + let selector: string | string[] | undefined + + switch (selectors.length) { + case 0: + selector = undefined + break + case 1: + selector = selectors[0] + break + default: + selector = selectors + } + + return selector ? [{ + selector, + frameId, + }] : [] + } + const createSnapshot = (name, $elToHighlight, preprocessedSnapshot) => { Cypress.action('cy:snapshot', name) // when using cy.origin() and in a transitionary state, state('document') @@ -254,34 +378,13 @@ export const create = ($$: $Cy['$$'], state: StateFunc) => { name: string timestamp: number elementsToHighlight?: { - selector: string + selector: string | string [] frameId: string }[] } = { name, timestamp } if (isJqueryElement($elToHighlight)) { - snapshot.elementsToHighlight = $dom.unwrap($elToHighlight).flatMap((el: HTMLElement) => { - try { - const ownerDoc = el.ownerDocument - const elWindow = ownerDoc.defaultView - - if (elWindow === null) { - return [] - } - - // finder tries to find the shortest unique selector to an element, - // but since we are more concerned with speed, we set the threshold to 1 and maxNumberOfTries to 0 - // @ts-expect-error because 'root' can be either Document or Element but is defined as Element - // @see https://github.com/antonmedv/finder/issues/75 - const selector = finder(el, { root: ownerDoc, threshold: 1, maxNumberOfTries: 0 }) - const frameId = elWindow['__cypressProtocolMetadata']?.frameId - - return [{ selector, frameId }] - } catch { - // the element may not always be found since it's possible for the element to be removed from the DOM - return [] - } - }) + snapshot.elementsToHighlight = $dom.unwrap($elToHighlight).flatMap((el: HTMLElement) => buildSelectorArray(el)) } Cypress.action('cy:protocol-snapshot') diff --git a/packages/driver/src/cypress/cy.ts b/packages/driver/src/cypress/cy.ts index 5c87e0d05ce6..c764a6291ea7 100644 --- a/packages/driver/src/cypress/cy.ts +++ b/packages/driver/src/cypress/cy.ts @@ -32,7 +32,7 @@ import { create as createOverrides, IOverrides } from '../cy/overrides' import { historyNavigationTriggeredHashChange } from '../cy/navigation' import { EventEmitter2 } from 'eventemitter2' import { handleCrossOriginCookies } from '../cross-origin/events/cookies' -import { handleTabActivation } from '../util/tab_activation' +import { trackTopUrl } from '../util/trackTopUrl' import type { ICypress } from '../cypress' import type { ICookies } from './cookies' @@ -344,7 +344,10 @@ export class $Cy extends EventEmitter2 implements ITimeouts, IStability, IAssert return Cypress.backend('close:extra:targets') }) - handleTabActivation(Cypress) + if (!Cypress.isCrossOriginSpecBridge) { + trackTopUrl() + } + handleCrossOriginCookies(Cypress) } diff --git a/packages/driver/src/util/tab_activation.ts b/packages/driver/src/util/tab_activation.ts deleted file mode 100644 index f6f8bf0d87d5..000000000000 --- a/packages/driver/src/util/tab_activation.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { ICypress } from '../cypress' - -const isCypressInCypress = document.defaultView !== top - -function activateMainTab () { - // Don't need to activate the main tab if it already has focus - if (document.hasFocus()) return - - return new Promise((resolve) => { - const url = `${window.location.origin}${window.location.pathname}` - - // This sends a message on the window that the extension content script - // listens for in order to carry out activating the main tab - window.postMessage({ message: 'cypress:extension:activate:main:tab', url }, '*') - - function onMessage ({ data, source }) { - // only accept messages from ourself - if (source !== window) return - - if (data.message === 'cypress:extension:main:tab:activated') { - window.removeEventListener('message', onMessage) - - resolve() - } - } - - // The reply from the extension comes back via the same means, a message - // sent on the window - window.addEventListener('message', onMessage) - }) -} - -// Ensures the main Cypress tab has focus before every command -// and at the end of the test run -export function handleTabActivation (Cypress: ICypress) { - // - Only implemented for Chromium right now. Support for Firefox/webkit - // could be added later - // - Electron doesn't have tabs - // - Focus doesn't matter for headless browsers and old headless Chrome - // doesn't run the extension - // - Don't need to worry about tabs for Cypress in Cypress tests (and they - // can't currently communicate with the extension anyway) - if ( - !Cypress.isBrowser({ family: 'chromium', name: '!electron', isHeadless: false }) - || isCypressInCypress - ) return - - Cypress.on('command:start:async', activateMainTab) - Cypress.on('test:after:run:async', activateMainTab) -} diff --git a/packages/driver/src/util/trackTopUrl.ts b/packages/driver/src/util/trackTopUrl.ts new file mode 100644 index 000000000000..3eff1c1872e8 --- /dev/null +++ b/packages/driver/src/util/trackTopUrl.ts @@ -0,0 +1,21 @@ +// trackTopUrl sends messages to the extension about URL changes. The extension needs to +// keep track of these, so it can activate the main tab when the puppeteer plugin +// requests it. + +export const trackTopUrl = () => { + // track the initial url + window.postMessage({ + message: 'cypress:extension:url:changed', + url: window.location.href, + }) + + // and track every time location changes + window.addEventListener('popstate', (ev) => { + const url = window.location.href + + window.postMessage({ + message: 'cypress:extension:url:changed', + url, + }) + }) +} diff --git a/packages/electron/README.md b/packages/electron/README.md index f60086beeaae..c1f2726384ca 100644 --- a/packages/electron/README.md +++ b/packages/electron/README.md @@ -36,7 +36,7 @@ Upgrading `electron` involves more than just bumping this package's `package.jso - the major version number of Node.js changes, since users rely on the bundled Node.js to load plugins and `.js` fixtures, or - there are changes to Electron that require new shared libraries to be installed on Linux, breaking existing CI setups, or - there is some other change that would break existing usage of Cypress (for example, a Web API feature being removed/added to the bundled Chromium) -- [ ] **Create and publish Docker `base-internal` and `browsers-internal` family images matching the Node.js and Chromium versions in Electron.** These images live inside the [`cypress-docker-images`](https://github.com/cypress-io/cypress-docker-images/) repository. The `browsers-internal` image will be used inside our CI pipelines. The `base-internal` image will be used by the `browsers-internal` image and possibly other system images (described below). For general use of Cypress in Docker, we encourage the use of the [Cypress Docker Factory](https://github.com/cypress-io/cypress-docker-images#cypressfactory). This works great for using Cypress as an end user, but doesn't fully suit the needs for developing Cypress, as we require: +- [ ] **Create and publish Docker `base-internal` and `browsers-internal` family images matching the Node.js and Chromium versions in Electron.** These images live inside the [`cypress-docker-images`](https://github.com/cypress-io/cypress-docker-images/) repository. The `browsers-internal` image will be used inside our CI pipelines. The `base-internal` image will be used by the `browsers-internal` image and possibly other system images (described below). The Chromium version can be determined from the [DEPS](https://github.com/electron/electron/blob/main/DEPS) file in Electron's repository on the correct tag. The Node version can be determined from the [Electron Releases page](https://www.electronjs.org/docs/latest/tutorial/electron-timelines). For general use of Cypress in Docker, we encourage the use of the [Cypress Docker Factory](https://github.com/cypress-io/cypress-docker-images#cypressfactory). This works great for using Cypress as an end user, but doesn't fully suit the needs for developing Cypress, as we require: - The installation of packages, such as `curl`, `xauth`, and `build-essential`/`make` needed for our [`circleci`](../../.circleci/config.yml) jobs/pipelines. - Specific images targeted to test Cypress on various node versions and distributions of linux, such as different versions of `ubuntu`. @@ -45,19 +45,49 @@ Upgrading `electron` involves more than just bumping this package's `package.jso - The Ubuntu images in [base-internal](https://github.com/cypress-io/cypress-docker-images/tree/master/base-internal) are updated to be used in the [system binary tests](../../system-tests/test-binary) if any of the following are true for the images used inside the system binary tests: - The last two major [Ubuntu LTS Releases](https://ubuntu.com/about/release-cycle) are out-of-date. - The [NodeJS](https://nodejs.org/en) version is not the active LTS. +- [ ] **Update `workflows.yml`** + - [ ] Ensure it references the new `base-internal` and `browsers-internal` Docker images + - [ ] Ensure the new Electron version is used as a build target in the `Build better-sqlite3 for CentOS 7` step - [ ] **Ensure that a matching Node.js version is enforced in the monorepo for local development and CI.** When Electron is upgraded, oftentimes, the bundled Node.js version that comes with Electron is updated as well. Because all unit and integration tests run in normal Node.js (not Electron's Node.js), it's important for this Node.js version to be synced with the monorepo. There are a few places where this needs to be done: - [ ] [`/.node-version`](../../.node-version) - used by `nvm` and other Node version managers - [ ] `@types/node` used throughout the monorepo to determine compatible node types. The major version of this package must reflect the node version set in [`/.node-version`](../../.node-version). - [ ] [github workflows](../../.github) - used for repository templates, vulnerability detection, and V8 snapshots. If the node version for Snyk needs to be updated, then the required pull request check into `develop` must also be updated. A repository administrator will need to accomplish this. - [ ] [`/package.json`](../../package.json) - update `engines` - - [ ] [`/scripts/run-docker-local.sh`](../../scripts/run-docker-local.sh) - update Docker image to the new matching `browsers` image + - [ ] [`docker-compose.yml`](../../docker-compose.yml) - update Docker image to the new matching `browsers` image - [ ] [`/system-tests/test-binary/*`](../../system-tests/test-binary) - update binary system tests to use the newly published Ubuntu and Node images mentioned above, if applicable - [ ] [`/.circleci/config.yml`](../../.circleci/config.yml) - Update the Docker `image`s to the new matching `browsers` image. - Update the `xcode` version to one with the same major Node.js version bundled. There is usually not an exact match, this is ok as long as the major version number as the same. - - [ ] Do a global search for the old Node.js version to identify any new areas that may need updating/unification, and update those locations (and this document!) + - [ ] Do a global search for the old Node.js version to identify any new areas that may need updating/unification, and update those locations (and this document!) + +- [ ] **Update `cypress-publish-binary`** For **binary publishing**, make sure the `electron` version that we updated in [`/package.json`](../../package.json) matches the `electron` version inside the [publish binary project](https://github.com/cypress-io/cypress-publish-binary/blob/main/package.json). This is to make sure add-on tests inside the publish-binary repository work locally, but are not required to install the correct version of `electron` in CI when publishing the binary. Ensure the `electron` target in this project's `.circleci` configuration is updated as well. Set the Remove this before merging, and ensure that branch is merged as well. + - [ ] Create a new branch in `cypress-publish-binary` + - [ ] Update `electron` version in `package.json` + - [ ] Update the target `electron` version in the circle configuration + - [ ] Update the docker image to the new browsers-internal image made in the previous step + - [ ] Temporarily update the circle configuration to allow `cypress` to run against the branch + - [ ] Temporarily set target `cypress-publish-binary` branch as a `branch` property on the request body in [../../scripts/binary/trigger-publish-binary-pipeline.js](../../scripts/binary/trigger-publish-binary-pipeline.js) script, so that you can test against this branch from the electron upgrade branch + + - [ ] **Manually smoke test `cypress open`.** Upgrading Electron can break the `desktop-gui` in unexpected ways. Since testing in this area is weak, double-check that things like launching `cypress open`, signing into Cypress Cloud, and launching Electron tests still work. +- [ ] **Manually smoke test `cypress run` in record mode** Upgrading Electron can cause `better-sqlite3` to SIGSEGV the Electron process. - [ ] **Fix failing tests.** Usually, these are due to breaking changes in either Node.js or Electron. Check the changelogs of both to find relevant changes. -- [ ] For **binary publishing**, make sure the `electron` version that we updated in [`/package.json`](../../package.json) matches the `electron` version inside the [publish binary project](https://github.com/cypress-io/cypress-publish-binary/blob/main/package.json). This is to make sure add-on tests inside the publish-binary repository work locally, but are not required to install the correct version of `electron` in CI when publishing the binary. -- [ ] If needed, update the **[V8 Snapshot Cache](https://github.com/cypress-io/cypress/actions/workflows/update_v8_snapshot_cache.yml)** by running the workflow. Make sure to use the branch that contains the electron updates to populate the `'workflow from'` and `'branch to update'` arguments. Select `'Generate from scratch'` and `'commit directly to branch'`. This will usually take 6-8 hours to complete and is best to not be actively developing on the branch when this workflow runs. + +- [ ] If needed, update the **[V8 Snapshot Cache](https://github.com/cypress-io/cypress/actions/workflows/update_v8_snapshot_cache.yml)** by running the GitHub workflow. Make sure to use the branch that contains the electron updates to populate the `'workflow from'` and `'branch to update'` arguments. Select `'Generate from scratch'` and `'commit directly to branch'`. This will usually take 6-8 hours to complete and is best to not be actively developing on the branch when this workflow runs. + + +### Common Upgrade Issues + +#### Integrity Check Failures + +*Solution*: Update the string representation of `fs.readFileSync` in [scripts/binary/binary-integrity-check-source.js](../../scripts/binary/binary-integrity-check-source.js) to match the string generated by the new version of electron. Create a throw-away script and simply `console.log(fs.readFileSync.toString())`, and execute it with *Electron* rather than *Node*. + +#### ResizeObserver errors in Component Test + +*Solution*: This error is benign. From time to time, the error message we match against in order to swallow the error changes. Update the necessary support files with the new error message. + +#### Electron crashes immediately after initializing the Protocol database + +*Solution*: This is often due to a mismatched prebuild of `better-sqlite3`. Ensure your repository is clear of untracked files with `git clean -xfd`, and run `yarn` again. If the issue persists, ensure you are running the latest version of your operating system. Electron prebuilds key to darwin/linux/windows, and do not differentiate between versions of the same. + diff --git a/packages/errors/__snapshot-html__/INDETERMINATE_CI_BUILD_ID.html b/packages/errors/__snapshot-html__/INDETERMINATE_CI_BUILD_ID.html index e5e81e635832..c7ebc545151e 100644 --- a/packages/errors/__snapshot-html__/INDETERMINATE_CI_BUILD_ID.html +++ b/packages/errors/__snapshot-html__/INDETERMINATE_CI_BUILD_ID.html @@ -65,7 +65,7 @@ - teamfoundation - travis - netlify - - layerci + - webappio Because the ciBuildId could not be auto-detected you must pass the --ci-build-id flag manually. diff --git a/packages/example/README.md b/packages/example/README.md index 377f5f731eb4..b3970c59ffb8 100644 --- a/packages/example/README.md +++ b/packages/example/README.md @@ -25,7 +25,7 @@ When a commit is merged into `master`, a new version of the [`cypress-example-ki 2. Run `yarn` and `yarn workspace @packages/example build` to build the app and spec files. -3. Create a new pull-request following this repo's [pull request instructions](CONTRIBUTING.md#pull-requests). +3. Create a new pull-request following this repo's [pull request instructions](../../CONTRIBUTING.md#pull-requests). ## Building @@ -39,6 +39,8 @@ This copies the `cypress/e2e` and files from [`cypress-example-kitchensink`](htt ## Deploying +This command deploys directly to production! Before executing it, ensure everything looks correct in the `./build` directory. + ```bash yarn workspace @packages/example deploy ``` diff --git a/packages/example/package.json b/packages/example/package.json index 4879017cfecb..02ca5237a128 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -15,7 +15,7 @@ }, "devDependencies": { "cross-env": "6.0.3", - "cypress-example-kitchensink": "2.0.0", + "cypress-example-kitchensink": "2.0.3", "gh-pages": "5.0.0", "gulp": "4.0.2", "gulp-clean": "0.4.0", diff --git a/packages/extension/app/v2/background.js b/packages/extension/app/v2/background.js index 6fe74d24dcf0..6be1573b4343 100644 --- a/packages/extension/app/v2/background.js +++ b/packages/extension/app/v2/background.js @@ -1,3 +1,4 @@ +/* global window */ const get = require('lodash/get') const map = require('lodash/map') const pick = require('lodash/pick') @@ -287,8 +288,25 @@ const automation = { resetBrowserTabsForNextTest (fn) { return Promise.try(() => { return browser.windows.getCurrent({ populate: true }) - }).then((windowInfo) => { - return browser.tabs.remove(windowInfo.tabs.map((tab) => tab.id)) + }).then(async (windowInfo) => { + let newTabId = null + + try { + // credit to https://stackoverflow.com/questions/7000190/detect-all-firefox-versions-in-js + const match = window.navigator.userAgent.match(/Firefox\/([0-9]+)\./) + const version = match ? parseInt(match[1]) : 0 + + // in versions of Firefox 124 and up, firefox no longer creates a new tab for us when we close all tabs in the browser. + // to keep change minimal and backwards compatible, we are creating an 'about:blank' tab here to keep the behavior consistent. + if (version >= 124) { + const newAboutBlankTab = await browser.tabs.create({ url: 'about:blank', active: false }) + + newTabId = newAboutBlankTab.id + } + // eslint-disable-next-line no-empty + } catch (e) {} + + return browser.tabs.remove(windowInfo.tabs.map((tab) => tab.id).filter((tab) => tab.id !== newTabId)) }).then(fn) }, @@ -337,7 +355,6 @@ const automation = { }) .then(fn) }, - } module.exports = automation diff --git a/packages/extension/app/v3/content.js b/packages/extension/app/v3/content.js index f30ab8034bb3..8c34f18b27d3 100644 --- a/packages/extension/app/v3/content.js +++ b/packages/extension/app/v3/content.js @@ -14,10 +14,14 @@ window.addEventListener('message', ({ data, source }) => { // only accept messages from ourself if (source !== window) return - // this is the only message we're currently interested in, which tells us - // to activate the main tab if (data.message === 'cypress:extension:activate:main:tab') { - port.postMessage({ message: 'activate:main:tab', url: data.url }) + port.postMessage({ message: 'activate:main:tab' }) + } + + // we need to keep track of the url that the main tab is on, so that we can + // activate the correct tab after a puppeteer task + if (data.message === 'cypress:extension:url:changed') { + port.postMessage({ message: 'url:changed', url: data.url }) } }) diff --git a/packages/extension/app/v3/manifest.json b/packages/extension/app/v3/manifest.json index 3460edc44b81..d2bd97c510c1 100644 --- a/packages/extension/app/v3/manifest.json +++ b/packages/extension/app/v3/manifest.json @@ -1,13 +1,9 @@ { "name": "Cypress", "description": "Adds theme and WebExtension APIs for testing with Cypress", - "applications": { - "gecko": { - "id": "automation-extension-v3@cypress.io" - } - }, "permissions": [ - "tabs" + "tabs", + "storage" ], "host_permissions": [ "http://*/*", @@ -20,7 +16,7 @@ "48": "icons/icon_48x48.png", "128": "icons/icon_128x128.png" }, - "browser_action": { + "action": { "default_title": "Cypress", "default_icon": { "19": "icons/icon_19x19.png", diff --git a/packages/extension/app/v3/service-worker.js b/packages/extension/app/v3/service-worker.js index 71374bdece7b..cbc47dc53618 100644 --- a/packages/extension/app/v3/service-worker.js +++ b/packages/extension/app/v3/service-worker.js @@ -10,8 +10,17 @@ // extension. sometimes that doesn't work and requires re-launching Chrome // and then reloading the extension via `chrome://extensions` -async function activateMainTab (url) { +async function getFromStorage (key) { + return new Promise((resolve) => { + chrome.storage.local.get(key, (storage) => { + resolve(storage[key]) + }) + }) +} + +async function activateMainTab () { try { + const url = await getFromStorage('mostRecentUrl') const tabs = await chrome.tabs.query({}) const cypressTab = tabs.find((tab) => tab.url.includes(url)) @@ -35,11 +44,15 @@ async function activateMainTab (url) { chrome.runtime.onConnect.addListener((port) => { port.onMessage.addListener(async ({ message, url }) => { if (message === 'activate:main:tab') { - await activateMainTab(url) + await activateMainTab() // send an ack back to let the content script know we successfully // activated the main tab port.postMessage({ message: 'main:tab:activated' }) } + + if (message === 'url:changed') { + chrome.storage.local.set({ mostRecentUrl: url }) + } }) }) diff --git a/packages/extension/test/integration/content_spec.js b/packages/extension/test/integration/content_spec.js deleted file mode 100644 index e949cffd3fd3..000000000000 --- a/packages/extension/test/integration/content_spec.js +++ /dev/null @@ -1,86 +0,0 @@ -require('../spec_helper') - -describe('app/v3/content', () => { - let port - let chrome - let window - - before(() => { - port = { - onMessage: { - addListener: sinon.stub(), - }, - postMessage: sinon.stub(), - } - - chrome = { - runtime: { - connect: sinon.stub().returns(port), - }, - } - - global.chrome = chrome - - window = { - addEventListener: sinon.stub(), - postMessage: sinon.stub(), - }, - - global.window = window - - require('../../app/v3/content') - }) - - beforeEach(() => { - port.postMessage.reset() - window.postMessage.reset() - }) - - it('adds window message listener and port onMessage listener', () => { - expect(window.addEventListener).to.be.calledWith('message', sinon.match.func) - expect(port.onMessage.addListener).to.be.calledWith(sinon.match.func) - }) - - describe('messages from window (i.e Cypress)', () => { - it('posts message to port if message is cypress:extension:activate:main:tab', () => { - const data = { message: 'cypress:extension:activate:main:tab', url: 'the://url' } - - window.addEventListener.yield({ data, source: window }) - - expect(port.postMessage).to.be.calledWith({ - message: 'activate:main:tab', - url: 'the://url', - }) - }) - - it('is a noop if source is not the same window', () => { - window.addEventListener.yield({ source: {} }) - - expect(port.postMessage).not.to.be.called - }) - - it('is a noop if message is not cypress:extension:activate:main:tab', () => { - const data = { message: 'unsupported' } - - window.addEventListener.yield({ data, source: window }) - - expect(port.postMessage).not.to.be.called - }) - }) - - describe('messages from port (i.e. service worker)', () => { - it('posts message to window', () => { - port.onMessage.addListener.yield({ message: 'main:tab:activated' }) - - expect(window.postMessage).to.be.calledWith({ message: 'cypress:extension:main:tab:activated' }, '*') - }) - - it('is a noop if message is not main:tab:activated', () => { - const data = { message: 'unsupported' } - - port.onMessage.addListener.yield({ data, source: window }) - - expect(window.postMessage).not.to.be.called - }) - }) -}) diff --git a/packages/extension/test/integration/service-worker_spec.js b/packages/extension/test/integration/service-worker_spec.js deleted file mode 100644 index 6ea25e6150ea..000000000000 --- a/packages/extension/test/integration/service-worker_spec.js +++ /dev/null @@ -1,88 +0,0 @@ -require('../spec_helper') - -describe('app/v3/service-worker', () => { - let chrome - let port - - before(() => { - chrome = { - runtime: { - onConnect: { - addListener: sinon.stub(), - }, - }, - tabs: { - query: sinon.stub(), - update: sinon.stub(), - }, - } - - global.chrome = chrome - - require('../../app/v3/service-worker') - }) - - beforeEach(() => { - chrome.tabs.query.reset() - chrome.tabs.update.reset() - - port = { - onMessage: { - addListener: sinon.stub(), - }, - postMessage: sinon.stub(), - } - }) - - it('adds onConnect listener', () => { - expect(chrome.runtime.onConnect.addListener).to.be.calledWith(sinon.match.func) - }) - - it('adds port onMessage listener', () => { - chrome.runtime.onConnect.addListener.yield(port) - - expect(port.onMessage.addListener).to.be.calledWith(sinon.match.func) - }) - - it('updates the tab matching the url', async () => { - chrome.runtime.onConnect.addListener.yield(port) - chrome.tabs.query.resolves([{ id: 'tab-id', url: 'the://url' }]) - - await port.onMessage.addListener.yield({ message: 'activate:main:tab', url: 'the://url' })[0] - - expect(chrome.tabs.update).to.be.calledWith('tab-id', { active: true }) - }) - - it('is a noop if message is not activate:main:tab', async () => { - chrome.runtime.onConnect.addListener.yield(port) - - await port.onMessage.addListener.yield({ message: 'unsupported' })[0] - - expect(chrome.tabs.update).not.to.be.called - }) - - it('is a noop if url does not match a tab', async () => { - chrome.runtime.onConnect.addListener.yield(port) - chrome.tabs.query.resolves([{ id: 'tab-id', url: 'the://url' }]) - - await port.onMessage.addListener.yield({ message: 'activate:main:tab', url: 'different://url' })[0] - - expect(chrome.tabs.update).not.to.be.called - }) - - it('is a noop, logging the error, if activating the tab errors', async () => { - sinon.spy(console, 'log') - - chrome.runtime.onConnect.addListener.yield(port) - chrome.tabs.query.resolves([{ id: 'tab-id', url: 'the://url' }]) - - const err = new Error('uh oh') - - chrome.tabs.update.rejects(err) - - await port.onMessage.addListener.yield({ message: 'activate:main:tab', url: 'the://url' })[0] - - // eslint-disable-next-line no-console - expect(console.log).to.be.calledWith('Activating main Cypress tab errored:', err) - }) -}) diff --git a/packages/extension/test/integration/background_spec.js b/packages/extension/test/integration/v2/background_spec.js similarity index 95% rename from packages/extension/test/integration/background_spec.js rename to packages/extension/test/integration/v2/background_spec.js index 1dd316c89198..d46353054e34 100644 --- a/packages/extension/test/integration/background_spec.js +++ b/packages/extension/test/integration/v2/background_spec.js @@ -1,10 +1,10 @@ -require('../spec_helper') +require('../../spec_helper') const _ = require('lodash') const http = require('http') const socket = require('@packages/socket') const Promise = require('bluebird') const mockRequire = require('mock-require') -const client = require('../../app/v2/client') +const client = require('../../../app/v2/client') const browser = { cookies: { @@ -48,7 +48,7 @@ const browser = { mockRequire('webextension-polyfill', browser) -const background = require('../../app/v2/background') +const background = require('../../../app/v2/background') const { expect } = require('chai') const PORT = 12345 @@ -848,6 +848,9 @@ describe('app/background', () => { beforeEach(() => { sinon.stub(browser.windows, 'getCurrent').withArgs({ populate: true }).resolves({ id: '10', tabs: [{ id: '1' }, { id: '2' }, { id: '3' }] }) sinon.stub(browser.tabs, 'remove').withArgs(['1', '2', '3']).resolves() + sinon.stub(browser.tabs, 'create').withArgs({ url: 'about:blank', active: false }).resolves({ + id: 'new-tab', + }) }) it('closes the tabs in the current browser window', function (done) { @@ -857,12 +860,36 @@ describe('app/background', () => { expect(browser.windows.getCurrent).to.be.called expect(browser.tabs.remove).to.be.called + expect(browser.tabs.create).not.to.be.called done() }) this.server.emit('automation:request', 123, 'reset:browser:tabs:for:next:test') }) + + // @see https://github.com/cypress-io/cypress/issues/29172 + describe('firefox 124 and up', () => { + beforeEach(() => { + global.window.navigator = { + userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:124.0) Gecko/20100101 Firefox/124.0', + } + }) + + it('creates a new "about:blank" tab and closes the other tabs in the current browser window', function (done) { + this.socket.on('automation:response', (id, obj) => { + expect(id).to.eq(123) + expect(obj.response).to.be.undefined + + expect(browser.windows.getCurrent).to.be.called + expect(browser.tabs.remove).to.be.calledWith(['1', '2', '3']) + expect(browser.tabs.create).to.be.calledWith({ url: 'about:blank', active: false }) + done() + }) + + this.server.emit('automation:request', 123, 'reset:browser:tabs:for:next:test') + }) + }) }) }) }) diff --git a/packages/extension/test/integration/v3/content_spec.js b/packages/extension/test/integration/v3/content_spec.js new file mode 100644 index 000000000000..8816a6c652d9 --- /dev/null +++ b/packages/extension/test/integration/v3/content_spec.js @@ -0,0 +1,108 @@ +require('../../spec_helper') + +describe('app/v3/content', () => { + let port + let chrome + let window + + before(() => { + port = { + onMessage: { + addListener: sinon.stub(), + }, + postMessage: sinon.stub(), + } + + chrome = { + runtime: { + connect: sinon.stub().returns(port), + }, + } + + global.chrome = chrome + + window = { + addEventListener: sinon.stub(), + postMessage: sinon.stub(), + }, + + global.window = window + + require('../../../app/v3/content') + }) + + beforeEach(() => { + port.postMessage.reset() + window.postMessage.reset() + }) + + it('adds window message listener and port onMessage listener', () => { + expect(window.addEventListener).to.be.calledWith('message', sinon.match.func) + expect(port.onMessage.addListener).to.be.calledWith(sinon.match.func) + }) + + describe('messages from window (i.e Cypress)', () => { + describe('on cypress:extension:activate:main:tab', () => { + const data = { message: 'cypress:extension:activate:main:tab' } + + it('posts message to port', () => { + window.addEventListener.yield({ data, source: window }) + + expect(port.postMessage).to.be.calledWith({ + message: 'activate:main:tab', + }) + }) + + it('is a noop if source is not the same window', () => { + window.addEventListener.yield({ data, source: {} }) + + expect(port.postMessage).not.to.be.called + }) + }) + + describe('on cypress:extension:url:changed', () => { + const data = { message: 'cypress:extension:url:changed', url: 'the://url' } + + it('posts message to port', () => { + window.addEventListener.yield({ data, source: window }) + + expect(port.postMessage).to.be.calledWith({ + message: 'url:changed', + url: data.url, + }) + }) + + it('is a noop if source is not the same window', () => { + window.addEventListener.yield({ data, source: {} }) + + expect(port.postMessage).not.to.be.called + }) + }) + + it('is a noop if message is not supported', () => { + const data = { message: 'unsupported' } + + window.addEventListener.yield({ data, source: window }) + + expect(port.postMessage).not.to.be.called + }) + }) + + describe('messages from port (i.e. service worker)', () => { + describe('on main:tab:activated', () => { + it('posts message to window', () => { + port.onMessage.addListener.yield({ message: 'main:tab:activated' }) + + expect(window.postMessage).to.be.calledWith({ message: 'cypress:extension:main:tab:activated' }, '*') + }) + }) + + it('is a noop if message is not main:tab:activated', () => { + const data = { message: 'unsupported' } + + port.onMessage.addListener.yield({ data, source: window }) + + expect(window.postMessage).not.to.be.called + }) + }) +}) diff --git a/packages/extension/test/integration/v3/service-worker_spec.js b/packages/extension/test/integration/v3/service-worker_spec.js new file mode 100644 index 000000000000..3591f4c0e899 --- /dev/null +++ b/packages/extension/test/integration/v3/service-worker_spec.js @@ -0,0 +1,137 @@ +require('../../spec_helper') + +describe('app/v3/service-worker', () => { + let chrome + let port + + before(() => { + chrome = { + runtime: { + onConnect: { + addListener: sinon.stub(), + }, + }, + tabs: { + query: sinon.stub(), + update: sinon.stub(), + }, + storage: { + local: { + set: sinon.stub(), + get: sinon.stub(), + }, + }, + } + + global.chrome = chrome + + require('../../../app/v3/service-worker') + }) + + beforeEach(() => { + chrome.tabs.query.reset() + chrome.tabs.update.reset() + chrome.storage.local.set.reset() + chrome.storage.local.get.reset() + + port = { + onMessage: { + addListener: sinon.stub(), + }, + postMessage: sinon.stub(), + } + }) + + it('adds onConnect listener', () => { + expect(chrome.runtime.onConnect.addListener).to.be.calledWith(sinon.match.func) + }) + + it('adds port onMessage listener', () => { + chrome.runtime.onConnect.addListener.yield(port) + + expect(port.onMessage.addListener).to.be.calledWith(sinon.match.func) + }) + + describe('on message', () => { + beforeEach(() => { + chrome.runtime.onConnect.addListener.yield(port) + }) + + describe('activate:main:tab', () => { + const tab1 = { id: '1', url: 'the://url' } + const tab2 = { id: '2', url: 'some://other.url' } + + beforeEach(() => { + chrome.tabs.query.resolves([tab1, tab2]) + }) + + describe('when there is a most recent url', () => { + beforeEach(() => { + chrome.storage.local.get.callsArgWith(1, { mostRecentUrl: tab1.url }) + }) + + it('activates the tab matching the url', async () => { + await port.onMessage.addListener.yield({ message: 'activate:main:tab' })[0] + + expect(chrome.tabs.update).to.be.calledWith(tab1.id, { active: true }) + }) + + describe('but no tab matches the most recent url', () => { + beforeEach(() => { + chrome.tabs.query.reset() + chrome.tabs.query.resolves([tab2]) + }) + + it('does not try to activate any tabs', async () => { + await port.onMessage.addListener.yield({ message: 'activate:main:tab' })[0] + expect(chrome.tabs.update).not.to.be.called + }) + }) + + describe('and chrome throws an error while activating the tab', () => { + let err + + beforeEach(() => { + sinon.stub(console, 'log') + err = new Error('uh oh') + chrome.tabs.update.rejects(err) + }) + + it('is a noop, logging the error', async () => { + await port.onMessage.addListener.yield({ message: 'activate:main:tab' })[0] + + // eslint-disable-next-line no-console + expect(console.log).to.be.calledWith('Activating main Cypress tab errored:', err) + }) + }) + }) + + describe('when there is not a most recent url', () => { + beforeEach(() => { + chrome.storage.local.get.callsArgWith(1, {}) + }) + + it('does not try to activate any tabs', async () => { + await port.onMessage.addListener.yield({ message: 'activate:main:tab' })[0] + expect(chrome.tabs.update).not.to.be.called + }) + }) + }) + + describe('url:changed', () => { + it('sets the mostRecentUrl', async () => { + const url = 'some://url' + + await port.onMessage.addListener.yield({ message: 'url:changed', url })[0] + expect(chrome.storage.local.set).to.be.calledWith({ mostRecentUrl: url }) + }) + }) + + it('is a noop if message is not a supported message', async () => { + await port.onMessage.addListener.yield({ message: 'unsupported' })[0] + + expect(chrome.tabs.update).not.to.be.called + expect(chrome.storage.local.set).not.to.be.called + }) + }) +}) diff --git a/packages/frontend-shared/cypress/support/component.ts b/packages/frontend-shared/cypress/support/component.ts index 425304429c60..0f802fec8231 100644 --- a/packages/frontend-shared/cypress/support/component.ts +++ b/packages/frontend-shared/cypress/support/component.ts @@ -82,7 +82,7 @@ function validateWithinViewport (subject: JQuery): Cypress.Chainabl Cypress.Commands.add('validateWithinViewport', { prevSubject: true }, validateWithinViewport) -Cypress.on('uncaught:exception', (err) => !err.message.includes('ResizeObserver loop limit exceeded')) +Cypress.on('uncaught:exception', (err) => !err.message.includes('ResizeObserver loop completed with undelivered notifications.')) registerMountFn() addVueCommand() diff --git a/packages/frontend-shared/cypress/support/e2e.ts b/packages/frontend-shared/cypress/support/e2e.ts index cc236a177242..f509944b695f 100644 --- a/packages/frontend-shared/cypress/support/e2e.ts +++ b/packages/frontend-shared/cypress/support/e2e.ts @@ -158,6 +158,10 @@ declare global { * Visits the Cypress app, for Cypress-in-Cypress testing */ visitApp(href?: string, opts?: Partial): Chainable + /** + * Verifies the specs page is visible (list, no specs, or create spec page) + */ + specsPageIsVisible(specsSetup?: 'new-project' | 'no-specs'): Chainable /** * Visits the Cypress launchpad */ @@ -365,6 +369,21 @@ function visitApp (href?: string, opts?: Partial) { }) } +function specsPageIsVisible (specsSetup) { + if (specsSetup === 'new-project') { + // if this is a new project, we'll be on the create spec page + return cy.get('[data-cy=create-spec-page-cards]').should('be.visible') + } + + if (specsSetup === 'no-specs') { + // if this is an existing project with no specs, we'll be on the no specs found page + return cy.get('[data-cy=create-spec-page-description]').should('be.visible') + } + + // if our tests seeded specs, we'll be on the specs list page + return cy.get('[data-cy=spec-list-container]').should('be.visible') +} + function visitLaunchpad () { return logInternal(`visitLaunchpad ${Cypress.env('e2e_launchpadPort')}`, () => { return cy.visit(`/__launchpad/index.html`, { log: false }).then((val) => { @@ -538,7 +557,7 @@ function getAutIframe () { return cy.get('iframe.aut-iframe').its('0.contentDocument.documentElement').then(cy.wrap) as Cypress.Chainable> } -Cypress.on('uncaught:exception', (err) => !err.message.includes('ResizeObserver loop limit exceeded')) +Cypress.on('uncaught:exception', (err) => !err.message.includes('ResizeObserver loop completed with undelivered notifications.')) Cypress.Commands.add('scaffoldProject', scaffoldProject) @@ -546,6 +565,7 @@ Cypress.Commands.add('getAutIframe', getAutIframe) Cypress.Commands.add('addProject', addProject) Cypress.Commands.add('openGlobalMode', openGlobalMode) Cypress.Commands.add('visitApp', visitApp) +Cypress.Commands.add('specsPageIsVisible', specsPageIsVisible) Cypress.Commands.add('loginUser', loginUser) Cypress.Commands.add('visitLaunchpad', visitLaunchpad) Cypress.Commands.add('skipWelcome', skipWelcome) diff --git a/packages/frontend-shared/package.json b/packages/frontend-shared/package.json index f6a154561835..d61da656914c 100644 --- a/packages/frontend-shared/package.json +++ b/packages/frontend-shared/package.json @@ -17,7 +17,9 @@ "postinstall": "patch-package", "lint": "eslint --ext .js,.jsx,.ts,.tsx,.json,.vue ." }, - "dependencies": {}, + "dependencies": { + "@packages/data-context": "0.0.0-development" + }, "devDependencies": { "@antfu/utils": "^0.7.0", "@cypress-design/css": "^0.13.3", @@ -69,7 +71,7 @@ "tailwindcss": "^3.3.1", "unplugin-icons": "0.13.2", "unplugin-vue-components": "^0.24.1", - "vite": "4.3.2", + "vite": "4.5.2", "vite-plugin-components": "0.11.3", "vite-svg-loader": "4.0.0", "vue": "3.2.47", diff --git a/packages/frontend-shared/src/components/Select.vue b/packages/frontend-shared/src/components/Select.vue index 989ae7b4fe57..b0b8758cdcc9 100644 --- a/packages/frontend-shared/src/components/Select.vue +++ b/packages/frontend-shared/src/components/Select.vue @@ -71,16 +71,18 @@ leave-from-class="opacity-100" leave-to-class="opacity-0" > - + -
  • +
  • + +
  • diff --git a/packages/https-proxy/test/integration/proxy_spec.js b/packages/https-proxy/test/integration/proxy_spec.js index e71a2cdb3ccf..957b56c66761 100644 --- a/packages/https-proxy/test/integration/proxy_spec.js +++ b/packages/https-proxy/test/integration/proxy_spec.js @@ -320,29 +320,32 @@ describe('Proxy', () => { }) }) - it('closes outgoing connections when client disconnects', function () { + it('closes outgoing connections when client disconnects', async function () { this.sandbox.spy(net, 'connect') - return request({ + await request({ strictSSL: false, url: 'https://localhost:8444/replace', proxy: 'http://localhost:3333', resolveWithFullResponse: true, forever: false, }) - .then(() => { - // ensure the outgoing socket created for this connection was destroyed - expect(net.connect).calledOnce - const socket = net.connect.getCalls()[0].returnValue + // ensure the outgoing socket created for this connection was destroyed + expect(net.connect).calledOnce + const socket = net.connect.getCalls()[0].returnValue + + // sometimes the close event happens before we can attach the listener, + // causing this test to flake + if (!socket.destroyed || !socket.readyState === 'closed') { return new Promise((resolve) => { - return socket.on('close', () => { + socket.on('close', () => { expect(socket.destroyed).to.be.true resolve() }) }) - }) + } }) // https://github.com/cypress-io/cypress/issues/4257 diff --git a/packages/launchpad/cypress/e2e/choose-a-browser.cy.ts b/packages/launchpad/cypress/e2e/choose-a-browser.cy.ts index d92814d60023..abf043246ac8 100644 --- a/packages/launchpad/cypress/e2e/choose-a-browser.cy.ts +++ b/packages/launchpad/cypress/e2e/choose-a-browser.cy.ts @@ -1,7 +1,6 @@ import type { FoundBrowser } from '@packages/types' -// TODO: fix flaky tests https://github.com/cypress-io/cypress/issues/23418 -describe.skip('Choose a browser page', () => { +describe('Choose a browser page', () => { beforeEach(() => { cy.scaffoldProject('launchpad') }) @@ -15,8 +14,7 @@ describe.skip('Choose a browser page', () => { }) }) - // TODO: fix flaky test https://github.com/cypress-io/cypress/issues/23158 - it('preselects browser that is provided through the command line', { retries: 15 }, () => { + it('preselects browser that is provided through the command line', () => { cy.withCtx((ctx, o) => { // stub launching project since we have `--browser --testingType --project` here o.sinon.stub(ctx._apis.projectApi, 'launchProject').resolves() @@ -25,6 +23,7 @@ describe.skip('Choose a browser page', () => { cy.openProject('launchpad', ['--e2e', '--browser', 'edge']) cy.visitLaunchpad() + cy.skipWelcome() cy.get('h1').should('contain', 'Choose a browser') @@ -40,6 +39,7 @@ describe.skip('Choose a browser page', () => { it('shows warning when launched with --browser name that cannot be matched to found browsers', () => { cy.openProject('launchpad', ['--e2e', '--browser', 'doesNotExist']) cy.visitLaunchpad() + cy.skipWelcome() cy.get('h1').should('contain', 'Choose a browser') cy.get('[data-cy="alert-header"]').should('contain', 'Warning: Browser Not Found') @@ -63,13 +63,15 @@ describe.skip('Choose a browser page', () => { cy.openProject('launchpad', ['--e2e', '--browser', path]) cy.visitLaunchpad() + cy.skipWelcome() cy.get('h1').should('contain', 'Choose a browser') cy.get('[data-cy="alert-header"]').should('contain', 'Warning: Browser Not Found') cy.get('[data-cy="alert-body"]').as('AlertBody') .should('contain', `We could not identify a known browser at the path you provided: ${path}`) - .validateExternalLink({ + + cy.validateExternalLink({ href: 'https://on.cypress.io/troubleshooting-launching-browsers', }) @@ -96,6 +98,7 @@ describe.skip('Choose a browser page', () => { cy.openProject('launchpad', ['--e2e']) cy.visitLaunchpad() + cy.skipWelcome() cy.get('h1').should('contain', 'Choose a browser') @@ -112,6 +115,7 @@ describe.skip('Choose a browser page', () => { cy.openProject('launchpad', ['--e2e']) cy.visitLaunchpad() + cy.skipWelcome() cy.get('h1').should('contain', 'Choose a browser') @@ -164,6 +168,7 @@ describe.skip('Choose a browser page', () => { cy.openProject('launchpad', ['--e2e']) cy.visitLaunchpad() + cy.skipWelcome() cy.get('h1').should('contain', 'Choose a browser') @@ -188,6 +193,7 @@ describe.skip('Choose a browser page', () => { cy.openProject('launchpad', ['--e2e']) cy.visitLaunchpad() + cy.skipWelcome() cy.get('h1').should('contain', 'Choose a browser') @@ -205,6 +211,7 @@ describe.skip('Choose a browser page', () => { cy.openProject('launchpad', ['--e2e']) cy.visitLaunchpad() + cy.skipWelcome() cy.withCtx((ctx) => { ctx.actions.app.setBrowserStatus('open') @@ -217,11 +224,11 @@ describe.skip('Choose a browser page', () => { cy.wait('@closeBrowser') }) - // TODO: fix flaky test https://github.com/cypress-io/cypress/issues/23220 it('performs mutation to focus open browser when focus button is pressed', { retries: 15 }, () => { cy.openProject('launchpad', ['--e2e']) cy.visitLaunchpad() + cy.skipWelcome() cy.withCtx((ctx) => { ctx.actions.app.setBrowserStatus('open') @@ -262,6 +269,7 @@ describe.skip('Choose a browser page', () => { }) cy.visitLaunchpad() + cy.skipWelcome() cy.get('h1').should('contain', 'Choose a browser') @@ -270,11 +278,11 @@ describe.skip('Choose a browser page', () => { }) }) - // TODO: fix flaky test https://github.com/cypress-io/cypress/issues/23158 it('subscribes to changes to browserStatus/activeBrowser through the browserStatusUpdated subscription', { retries: 15 }, () => { cy.openProject('launchpad', ['--e2e']) cy.visitLaunchpad() + cy.skipWelcome() cy.get('h1').should('contain', 'Choose a browser') @@ -306,6 +314,7 @@ describe.skip('Choose a browser page', () => { it('should return to welcome screen if user modifies the config file to not include the current testing type and recover', () => { cy.openProject('launchpad', ['--e2e']) cy.visitLaunchpad() + cy.skipWelcome() cy.get('h1').should('contain', 'Choose a browser') @@ -314,7 +323,7 @@ describe.skip('Choose a browser page', () => { }) cy.get('h1').should('contain', 'Welcome to Cypress!') - cy.contains('[data-cy-testingtype="e2e"]', 'Not configured') + cy.contains('[data-cy-testingtype="e2e"]', 'Not Configured') cy.withCtx(async (ctx) => { await ctx.actions.file.writeFileInProject('cypress.config.js', @@ -327,7 +336,7 @@ describe.skip('Choose a browser page', () => { }) cy.get('h1').should('contain', 'Welcome to Cypress!') - cy.get('[data-cy-testingtype="e2e"]').should('not.contain', 'Not configured') + cy.get('[data-cy-testingtype="e2e"]').should('not.contain', 'Not Configured') }) }) @@ -343,6 +352,7 @@ describe.skip('Choose a browser page', () => { cy.openProject('launchpad', ['--e2e']) cy.visitLaunchpad() + cy.skipWelcome() cy.get('h1').should('contain', 'Choose a browser') diff --git a/packages/launchpad/cypress/e2e/global-mode.cy.ts b/packages/launchpad/cypress/e2e/global-mode.cy.ts index bda19a0c5e3f..f46d2fda984f 100644 --- a/packages/launchpad/cypress/e2e/global-mode.cy.ts +++ b/packages/launchpad/cypress/e2e/global-mode.cy.ts @@ -187,6 +187,12 @@ describe('Launchpad: Global Mode', () => { }) } + const waitForConfigLoad = () => { + cy.contains('Initializing config...').should('be.visible') + // ensure the config is fully loaded before clicking the breadcrumb back + cy.contains('Initializing config...').should('not.exist') + } + const projectList = ['todos'] setupAndValidateProjectsList(projectList) @@ -200,6 +206,7 @@ describe('Launchpad: Global Mode', () => { // Component testing breadcrumbs cy.get('[data-cy="project-card"]').contains('todos').click() cy.get('[data-cy-testingtype="component"]').click() + waitForConfigLoad() resetSpies() getBreadcrumbLink('Projects').click() getBreadcrumbLink('Projects', { disabled: true }) @@ -212,6 +219,7 @@ describe('Launchpad: Global Mode', () => { cy.get('[data-cy="project-card"]').contains('todos').click() cy.get('[data-cy-testingtype="e2e"]').click() cy.contains('li', 'e2e testing', { matchCase: false }).should('not.have.attr', 'href') + waitForConfigLoad() resetSpies() getBreadcrumbLink('Projects').click() getBreadcrumbLink('Projects', { disabled: true }) @@ -285,17 +293,6 @@ describe('Launchpad: Global Mode', () => { .should('have.length', projectList.length) }) - // FIXME: fix Search by project path logic - https://cypress-io.atlassian.net/browse/UNIFY-646 - it.skip('filters project results when searching by project path', () => { - setupAndValidateProjectsList(projectList) - cy.get('#project-search').type('packages') - cy.get('[data-cy="project-card"') - .should('have.length', projectList.length) - - cy.get('#project-search').type(`${path.sep}todos`) - cy.contains(defaultMessages.globalPage.noResultsMessage) - }) - it('shows "empty results" pages when searching for a non-existent name', () => { setupAndValidateProjectsList(projectList) cy.get('#project-search').type('hi') @@ -309,17 +306,6 @@ describe('Launchpad: Global Mode', () => { cy.get('[data-cy="project-card"]') .should('have.length', projectList.length) }) - - // FIXME: fix Search by project path logic - https://cypress-io.atlassian.net/browse/UNIFY-646 - it.skip('shows "empty results" pages when searching for a non-existent path', () => { - setupAndValidateProjectsList(projectList) - cy.get('#project-search').type('packages') - cy.get('[data-cy="project-card"') - .should('have.length', projectList.length) - - cy.get('#project-search').type(`${path.sep}random`) - cy.contains(defaultMessages.globalPage.noResultsMessage) - }) }) }) diff --git a/packages/launchpad/cypress/e2e/migration.cy.ts b/packages/launchpad/cypress/e2e/migration.cy.ts index 4aec7c34df0d..83ae065e9e7f 100644 --- a/packages/launchpad/cypress/e2e/migration.cy.ts +++ b/packages/launchpad/cypress/e2e/migration.cy.ts @@ -637,55 +637,6 @@ describe('Full migration flow for each project', { retries: { openMode: 0, runMo checkOutcome() }) - it('completes journey for migration-e2e-custom-test-files', () => { - startMigrationFor('migration-e2e-custom-test-files') - // default integration but custom testFiles - // can rename integration->e2e - cy.get(renameAutoStep).should('exist') - // no CT - cy.get(renameManualStep).should('not.exist') - // supportFile is false - cannot migrate - cy.get(renameSupportStep).should('exist') - cy.get(setupComponentStep).should('not.exist') - cy.get(configFileStep).should('exist') - - cy.scaffoldProject('migration-e2e-custom-test-files') - cy.openProject('migration-e2e-custom-test-files') - cy.visitLaunchpad() - - // default testFiles but custom integration - can rename automatically - cy.get(renameAutoStep).should('exist') - // no CT - cy.get(renameManualStep).should('not.exist') - // supportFile is false - cannot migrate - cy.get(renameSupportStep).should('exist') - cy.get(setupComponentStep).should('not.exist') - cy.get(configFileStep).should('exist') - - // Migration workflow - // before auto migration - cy.contains('cypress/integration/basic.test.js') - - // after auto migration - cy.contains('cypress/e2e/basic.test.js') - - runAutoRename() - - cy.withRetryableCtx(async (ctx) => { - const specs = ['cypress/e2e/basic.test.js'] - - for (const spec of specs) { - const stats = await ctx.file.checkIfFileExists(ctx.path.join(spec)) - - expect(stats).to.not.be.null - } - }) - - renameSupport() - migrateAndVerifyConfig() - checkOutcome() - }) - it('completes journey for migration-e2e-custom-test-files', () => { const project = 'migration-e2e-custom-test-files-array' @@ -1073,23 +1024,6 @@ describe('Full migration flow for each project', { retries: { openMode: 0, runMo checkOutcome() }) - // TODO: Do we need to consider this case? - it.skip('completes journey for migration-e2e-defaults-no-specs', () => { - startMigrationFor('migration-e2e-defaults-no-specs') - // no specs, nothing to rename? - cy.get(renameAutoStep).should('not.exist') - // no CT - cy.get(renameManualStep).should('not.exist') - // supportFile is false - cannot migrate - cy.get(renameSupportStep).should('exist') - cy.get(setupComponentStep).should('not.exist') - cy.get(configFileStep).should('exist') - - renameSupport() - migrateAndVerifyConfig() - checkOutcome() - }) - it('completes journey for migration-e2e-plugins-implicit-index-js', () => { startMigrationFor('migration-e2e-plugins-implicit-index-js') // no specs, nothing to rename? diff --git a/packages/launchpad/cypress/e2e/project-setup.cy.ts b/packages/launchpad/cypress/e2e/project-setup.cy.ts index edcfb30b308a..9a1bb69b436d 100644 --- a/packages/launchpad/cypress/e2e/project-setup.cy.ts +++ b/packages/launchpad/cypress/e2e/project-setup.cy.ts @@ -50,8 +50,11 @@ describe('Launchpad: Setup Project', () => { const verifyWelcomePage = ({ e2eIsConfigured, ctIsConfigured }) => { cy.contains('Welcome to Cypress!').should('be.visible') - cy.contains('[data-cy-testingtype="e2e"]', e2eIsConfigured ? 'Configured' : 'Not Configured') - cy.contains('[data-cy-testingtype="component"]', ctIsConfigured ? 'Configured' : 'Not Configured') + cy.contains('[data-cy-testingtype="e2e"]', 'Not Configured') + .should(e2eIsConfigured ? 'not.exist' : 'exist') + + cy.contains('[data-cy-testingtype="component"]', 'Not Configured') + .should(ctIsConfigured ? 'not.exist' : 'exist') } const verifyChooseABrowserPage = () => { @@ -217,7 +220,7 @@ describe('Launchpad: Setup Project', () => { scaffoldAndOpenProject('pristine-with-e2e-testing') cy.visitLaunchpad() - verifyWelcomePage({ e2eIsConfigured: true, ctIsConfigured: true }) + verifyWelcomePage({ e2eIsConfigured: true, ctIsConfigured: false }) cy.get('[data-cy-testingtype="e2e"]').click() @@ -422,7 +425,7 @@ describe('Launchpad: Setup Project', () => { cy.visitLaunchpad() - verifyWelcomePage({ e2eIsConfigured: false, ctIsConfigured: true }) + verifyWelcomePage({ e2eIsConfigured: false, ctIsConfigured: false }) cy.get('[data-cy-testingtype="component"]').click() @@ -578,7 +581,7 @@ describe('Launchpad: Setup Project', () => { cy.get('[data-testid="select-framework"]').click() cy.findByText('Create React App').click() cy.contains('button', 'Next step').should('not.be.disabled').click() - cy.findByDisplayValue('pnpm install -D react-scripts react-dom react') + cy.findByDisplayValue('pnpm add -D react-scripts react-dom react') }) // TODO: Had to revert due to regression: https://github.com/cypress-io/cypress/pull/26452 @@ -670,8 +673,7 @@ describe('Launchpad: Setup Project', () => { verifyScaffoldedFiles('e2e') }) - // TODO: fix failing test https://github.com/cypress-io/cypress/issues/23418 - it.skip('takes the user to first step of ct setup when switching from app', () => { + it('takes the user to first step of ct setup when switching from app', () => { scaffoldAndOpenProject('pristine-with-e2e-testing') cy.visitLaunchpad() verifyWelcomePage({ e2eIsConfigured: true, ctIsConfigured: false }) diff --git a/packages/launchpad/cypress/e2e/scaffold-component-testing.cy.ts b/packages/launchpad/cypress/e2e/scaffold-component-testing.cy.ts index 45f69b86578c..6299e353c491 100644 --- a/packages/launchpad/cypress/e2e/scaffold-component-testing.cy.ts +++ b/packages/launchpad/cypress/e2e/scaffold-component-testing.cy.ts @@ -33,6 +33,7 @@ describe('scaffolding component testing', { cy.get('button').should('be.visible').contains('Vue CLI (Vue 2)(detected)') cy.get('button').contains('Next step').click() cy.findByRole('button', { name: 'Continue' }).click() + cy.get('[data-cy="launchpad-Configuration files"]').should('be.visible') verifyConfigFile(`cypress.config.js`) }) }) @@ -45,6 +46,7 @@ describe('scaffolding component testing', { cy.get('button').should('be.visible').contains('Vue CLI (Vue 3)(detected)') cy.get('button').contains('Next step').click() cy.findByRole('button', { name: 'Continue' }).click() + cy.get('[data-cy="launchpad-Configuration files"]').should('be.visible') verifyConfigFile(`cypress.config.js`) }) }) @@ -57,6 +59,7 @@ describe('scaffolding component testing', { cy.get('button').should('be.visible').contains('Vue CLI (Vue 3)(detected)') cy.get('button').contains('Next step').click() cy.findByRole('button', { name: 'Continue' }).click() + cy.get('[data-cy="launchpad-Configuration files"]').should('be.visible') verifyConfigFile(`cypress.config.js`) }) }) @@ -69,6 +72,7 @@ describe('scaffolding component testing', { cy.get('button').should('be.visible').contains('Create React App(detected)') cy.get('button').contains('Next step').click() cy.findByRole('button', { name: 'Continue' }).click() + cy.get('[data-cy="launchpad-Configuration files"]').should('be.visible') verifyConfigFile(`cypress.config.js`) }) }) @@ -93,6 +97,7 @@ describe('scaffolding component testing', { }) cy.get('button').contains('Skip').click() + cy.get('[data-cy="launchpad-Configuration files"]').should('be.visible') verifyConfigFile(`cypress.config.ts`) }) @@ -112,15 +117,12 @@ describe('scaffolding component testing', { }) cy.contains('Component Testing').click() - cy.get(`[data-testid="select-framework"]`) - - cy.get('button').should('be.visible').contains('React.js(detected)') - - cy.get('button').contains('Next step').click() + cy.contains('button', 'React.js(detected)').should('be.visible') + cy.contains('button', 'Next step').click() // react-dom dependency is missing cy.findByTestId('dependency-react-dom').within(() => { - cy.get('[aria-label="pending installation"]').should('exist') + cy.get('[aria-label="pending installation"]') }) // fake install @@ -149,6 +151,7 @@ describe('scaffolding component testing', { cy.get('button').should('be.visible').contains('Vue.js 3(detected)') cy.get('button').contains('Next step').click() cy.findByRole('button', { name: 'Continue' }).click() + cy.get('[data-cy="launchpad-Configuration files"]').should('be.visible') verifyConfigFile(`cypress.config.ts`) }) }) @@ -162,6 +165,7 @@ describe('scaffolding component testing', { cy.contains('button', /Nuxt\.js \(v2\)\s+Support is in\s+Alpha\(detected\)/).should('be.visible') cy.contains('button', 'Next step').click() cy.findByRole('button', { name: 'Continue' }).click() + cy.get('[data-cy="launchpad-Configuration files"]').should('be.visible') verifyConfigFile(`cypress.config.js`) }) }) @@ -176,6 +180,7 @@ describe('scaffolding component testing', { cy.contains('button', 'Angular(detected)').should('be.visible') cy.contains('button', 'Next step').click() cy.findByRole('button', { name: 'Continue' }).click() + cy.get('[data-cy="launchpad-Configuration files"]').should('be.visible') verifyConfigFile(`cypress.config.ts`) }) }) @@ -189,6 +194,7 @@ describe('scaffolding component testing', { cy.contains('button', /Svelte\.js\s+Support is in\s+Alpha\(detected\)/).should('be.visible') cy.contains('button', 'Next step').click() cy.findByRole('button', { name: 'Continue' }).click() + cy.get('[data-cy="launchpad-Configuration files"]').should('be.visible') verifyConfigFile(`cypress.config.js`) }) }) @@ -202,6 +208,7 @@ describe('scaffolding component testing', { cy.contains('button', /Svelte\.js\s+Support is in\s+Alpha\(detected\)/).should('be.visible') cy.contains('button', 'Next step').click() cy.findByRole('button', { name: 'Continue' }).click() + cy.get('[data-cy="launchpad-Configuration files"]').should('be.visible') verifyConfigFile(`cypress.config.js`) }) }) @@ -234,6 +241,7 @@ describe('scaffolding component testing', { }) cy.contains('button', 'Continue').click() + cy.get('[data-cy="launchpad-Configuration files"]').should('be.visible') verifyConfigFile('cypress.config.js') }) @@ -265,6 +273,7 @@ describe('scaffolding component testing', { }) cy.contains('button', 'Continue').click() + cy.get('[data-cy="launchpad-Configuration files"]').should('be.visible') verifyConfigFile('cypress.config.js') }) diff --git a/packages/launchpad/cypress/e2e/scaffold-project.cy.ts b/packages/launchpad/cypress/e2e/scaffold-project.cy.ts index 0e6687d1d6ad..d6cab46f40b1 100644 --- a/packages/launchpad/cypress/e2e/scaffold-project.cy.ts +++ b/packages/launchpad/cypress/e2e/scaffold-project.cy.ts @@ -167,7 +167,7 @@ describe('scaffolding new projects', { defaultCommandTimeout: 7000 }, () => { assertScaffoldedFilesAreCorrect({ language, testingType: 'component', ctFramework: 'Create React App (v5)', customDirectory: 'without-fixtures' }) }) - // NOTE: Skipping this test because it is flaky + // TODO: Fix flaky test it.skip('generates valid config file for pristine project without cypress installed', () => { cy.intercept('mutation-ScaffoldedFiles_completeSetup').as('mutationScaffoldedFiles') cy.intercept('query-MainLaunchpadQuery').as('mainLaunchpadQuery') diff --git a/packages/launchpad/package.json b/packages/launchpad/package.json index db5bd166963b..cdb3974a40c4 100644 --- a/packages/launchpad/package.json +++ b/packages/launchpad/package.json @@ -20,6 +20,7 @@ }, "dependencies": {}, "devDependencies": { + "@cypress-design/vue-button": "^0.11.6", "@graphql-typed-document-node/core": "^3.1.0", "@headlessui/vue": "1.4.0", "@intlify/unplugin-vue-i18n": "0.10.0", @@ -59,7 +60,7 @@ "rollup-plugin-polyfill-node": "^0.7.0", "type-fest": "^2.3.4", "unplugin-vue-components": "0.24.1", - "vite": "4.3.2", + "vite": "4.5.2", "vite-plugin-optimize-persist": "0.1.2", "vite-plugin-package-config": "0.1.1", "vite-svg-loader": "4.0.0", @@ -77,4 +78,4 @@ "@packages/graphql" ] } -} +} \ No newline at end of file diff --git a/packages/launchpad/src/components/code/FileRow.vue b/packages/launchpad/src/components/code/FileRow.vue index 8340c8c376d4..c106bc1a1d47 100644 --- a/packages/launchpad/src/components/code/FileRow.vue +++ b/packages/launchpad/src/components/code/FileRow.vue @@ -45,7 +45,8 @@

    @@ -60,8 +61,8 @@ + + +

    Preloaded Service worker loaded

    + + diff --git a/system-tests/projects/protocol/cypress/fixtures/shadow-dom-closed.html b/system-tests/projects/protocol/cypress/fixtures/shadow-dom-closed.html new file mode 100644 index 000000000000..8ded19b5876c --- /dev/null +++ b/system-tests/projects/protocol/cypress/fixtures/shadow-dom-closed.html @@ -0,0 +1,18 @@ + + + + Shadow DOM Closed Fixture + + +

    Shadow DOM Closed Fixture

    +
    + + + diff --git a/system-tests/projects/protocol/cypress/fixtures/shadow-dom.html b/system-tests/projects/protocol/cypress/fixtures/shadow-dom.html new file mode 100644 index 000000000000..10228e326537 --- /dev/null +++ b/system-tests/projects/protocol/cypress/fixtures/shadow-dom.html @@ -0,0 +1,18 @@ + + + + Shadow DOM Fixture + + +

    Shadow DOM Fixture

    +
    + + + diff --git a/system-tests/projects/protocol/cypress/support/e2e-preload-service-worker.ts b/system-tests/projects/protocol/cypress/support/e2e-preload-service-worker.ts new file mode 100644 index 000000000000..15fd48fd716e --- /dev/null +++ b/system-tests/projects/protocol/cypress/support/e2e-preload-service-worker.ts @@ -0,0 +1,9 @@ +const setupServiceWorker = async () => { + try { + await window.navigator.serviceWorker?.register(new URL('http://localhost:2121/cypress/fixtures/service-worker-assets/scope/service-worker.js')) + } catch (e) { + // This errors the first time through before top is reloaded + } +} + +Cypress.on('test:before:run:async', setupServiceWorker) diff --git a/system-tests/projects/react-app-webpack-5-unconfigured/yarn.lock b/system-tests/projects/react-app-webpack-5-unconfigured/yarn.lock index 4b122a889cb4..281b788fe4be 100644 --- a/system-tests/projects/react-app-webpack-5-unconfigured/yarn.lock +++ b/system-tests/projects/react-app-webpack-5-unconfigured/yarn.lock @@ -4668,9 +4668,9 @@ http-proxy-agent@^4.0.1: debug "4" http-proxy-middleware@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz#03af0f4676d172ae775cb5c33f592f40e1a4e07a" - integrity "sha1-A68PRnbRcq53XLXDP1kvQOGk4Ho= sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==" + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" diff --git a/system-tests/projects/screen-size/cypress/e2e/default_size.cy.js b/system-tests/projects/screen-size/cypress/e2e/default_size.cy.js index b207691e3f6f..f009576edf2e 100644 --- a/system-tests/projects/screen-size/cypress/e2e/default_size.cy.js +++ b/system-tests/projects/screen-size/cypress/e2e/default_size.cy.js @@ -16,7 +16,7 @@ describe('windowSize', () => { // availHeight: top.screen.availHeight, }).deep.eq({ innerWidth: 1280, - innerHeight: 603, + innerHeight: 599, // chrome 118 reduced the size here from 603 to 599 // screenWidth: 1280, // screenHeight: 603, // availWidth: 1280, diff --git a/system-tests/projects/vite-ct-object-api/package.json b/system-tests/projects/vite-ct-object-api/package.json index 83cc6d90a49d..85d7355c891f 100644 --- a/system-tests/projects/vite-ct-object-api/package.json +++ b/system-tests/projects/vite-ct-object-api/package.json @@ -6,6 +6,6 @@ "@testing-library/cypress": "9.0.0", "ansi-regex": "4.1.1", "typescript": "4.9.5", - "vite": "2.9.15" + "vite": "2.9.17" } } diff --git a/system-tests/projects/vite-ct-object-api/yarn.lock b/system-tests/projects/vite-ct-object-api/yarn.lock index 6afd6f28f7e5..1074b074af5e 100644 --- a/system-tests/projects/vite-ct-object-api/yarn.lock +++ b/system-tests/projects/vite-ct-object-api/yarn.lock @@ -406,10 +406,10 @@ typescript@4.9.5: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== -vite@2.9.15: - version "2.9.15" - resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.15.tgz#2858dd5b2be26aa394a283e62324281892546f0b" - integrity sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ== +vite@2.9.17: + version "2.9.17" + resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.17.tgz#6b770525e12fa2a2e3a0fa0d028d304f4f7dc7d4" + integrity sha512-XxcRzra6d7xrKXH66jZUgb+srThoPu+TLJc06GifUyKq9JmjHkc1Numc8ra0h56rju2jfVWw3B3fs5l3OFMvUw== dependencies: esbuild "^0.14.27" postcss "^8.4.13" diff --git a/system-tests/projects/vuecli5-vue3-type-module/yarn.lock b/system-tests/projects/vuecli5-vue3-type-module/yarn.lock index 9ecb1745d80a..3abf63467b92 100644 --- a/system-tests/projects/vuecli5-vue3-type-module/yarn.lock +++ b/system-tests/projects/vuecli5-vue3-type-module/yarn.lock @@ -2008,9 +2008,9 @@ http-parser-js@>=0.5.1: integrity sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA== http-proxy-middleware@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz#03af0f4676d172ae775cb5c33f592f40e1a4e07a" - integrity sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg== + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" diff --git a/system-tests/projects/vuecli5-vue3/yarn.lock b/system-tests/projects/vuecli5-vue3/yarn.lock index 9ecb1745d80a..3abf63467b92 100644 --- a/system-tests/projects/vuecli5-vue3/yarn.lock +++ b/system-tests/projects/vuecli5-vue3/yarn.lock @@ -2008,9 +2008,9 @@ http-parser-js@>=0.5.1: integrity sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA== http-proxy-middleware@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz#03af0f4676d172ae775cb5c33f592f40e1a4e07a" - integrity sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg== + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" diff --git a/system-tests/projects/vuecli5vue3-configured/yarn.lock b/system-tests/projects/vuecli5vue3-configured/yarn.lock index 859710edf767..f6dc77f6fe4e 100644 --- a/system-tests/projects/vuecli5vue3-configured/yarn.lock +++ b/system-tests/projects/vuecli5vue3-configured/yarn.lock @@ -2084,9 +2084,9 @@ http-parser-js@>=0.5.1: integrity "sha1-18MNXTyQ2GW0ouhwGB+dbyKsesU= sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==" http-proxy-middleware@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.3.tgz#5df04f69a89f530c2284cd71eeaa51ba52243289" - integrity "sha1-XfBPaaifUwwihM1x7qpRulIkMok= sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA==" + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" diff --git a/system-tests/projects/vuecli5vue3-unconfigured/yarn.lock b/system-tests/projects/vuecli5vue3-unconfigured/yarn.lock index ad8ceec74840..815b07eb608d 100644 --- a/system-tests/projects/vuecli5vue3-unconfigured/yarn.lock +++ b/system-tests/projects/vuecli5vue3-unconfigured/yarn.lock @@ -2098,9 +2098,9 @@ http-parser-js@>=0.5.1: integrity "sha1-LgJAarLfivinq/umLg2gHGK5Wv0= sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" http-proxy-middleware@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz#03af0f4676d172ae775cb5c33f592f40e1a4e07a" - integrity "sha1-A68PRnbRcq53XLXDP1kvQOGk4Ho= sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==" + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" diff --git a/system-tests/projects/webpack-react-nested-config/yarn.lock b/system-tests/projects/webpack-react-nested-config/yarn.lock index e804d4b4c328..7356995e5441 100644 --- a/system-tests/projects/webpack-react-nested-config/yarn.lock +++ b/system-tests/projects/webpack-react-nested-config/yarn.lock @@ -1656,9 +1656,9 @@ http-parser-js@>=0.5.1: integrity sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA== http-proxy-middleware@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz#03af0f4676d172ae775cb5c33f592f40e1a4e07a" - integrity sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg== + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" diff --git a/system-tests/projects/webpack4_wds4-react/yarn.lock b/system-tests/projects/webpack4_wds4-react/yarn.lock index 63737097493f..31c5e3718ed8 100644 --- a/system-tests/projects/webpack4_wds4-react/yarn.lock +++ b/system-tests/projects/webpack4_wds4-react/yarn.lock @@ -2858,9 +2858,9 @@ http-parser-js@>=0.5.1: integrity sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA== http-proxy-middleware@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz#03af0f4676d172ae775cb5c33f592f40e1a4e07a" - integrity sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg== + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" diff --git a/system-tests/projects/webpack5_wds4-react/yarn.lock b/system-tests/projects/webpack5_wds4-react/yarn.lock index f6ff4264bf8b..a0f77c725b4d 100644 --- a/system-tests/projects/webpack5_wds4-react/yarn.lock +++ b/system-tests/projects/webpack5_wds4-react/yarn.lock @@ -2770,9 +2770,9 @@ http-parser-js@>=0.5.1: integrity sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA== http-proxy-middleware@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz#03af0f4676d172ae775cb5c33f592f40e1a4e07a" - integrity sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg== + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" diff --git a/system-tests/test-binary/module_api_spec.ts b/system-tests/test-binary/module_api_spec.ts index a49709e7048f..186b8e8b6e21 100644 --- a/system-tests/test-binary/module_api_spec.ts +++ b/system-tests/test-binary/module_api_spec.ts @@ -3,7 +3,7 @@ import systemTests from '../lib/system-tests' describe('module API', () => { systemTests.it('can run module API Mocha spec', { timeout: 240000, - dockerImage: 'cypress/base-internal:18.15.0', + dockerImage: 'cypress/base-internal:18.17.1', withBinary: true, project: 'module-api', browser: 'electron', diff --git a/system-tests/test-binary/node_versions_spec.ts b/system-tests/test-binary/node_versions_spec.ts index 6d2dc775db8e..9a23707f4ffe 100644 --- a/system-tests/test-binary/node_versions_spec.ts +++ b/system-tests/test-binary/node_versions_spec.ts @@ -33,7 +33,7 @@ describe('binary node versions', () => { describe('type: module', () => { [ - 'cypress/base:18.6.0', + 'cypress/base:18.15.0', 'cypress/base:20.5.0', ].forEach((dockerImage) => { systemTests.it(`can run in ${dockerImage}`, { diff --git a/system-tests/test/cy_origin_retries_spec.ts b/system-tests/test/cy_origin_retries_spec.ts index f09ae9deaebd..25af59d702b6 100644 --- a/system-tests/test/cy_origin_retries_spec.ts +++ b/system-tests/test/cy_origin_retries_spec.ts @@ -47,4 +47,10 @@ describe('e2e cy.origin retries', () => { expect(res.stdout).to.contain('expected true to be false') }, }) + + systemTests.it('passes runnable state to the secondary origin', { + browser: '!webkit', // TODO(webkit): fix+unskip (needs multidomain support) + port: PORT, + spec: 'cy_origin_retries_runnable.cy.ts', + }) }) diff --git a/system-tests/test/issue_5016_spec.js b/system-tests/test/issue_5016_spec.js new file mode 100644 index 000000000000..053fe1522d28 --- /dev/null +++ b/system-tests/test/issue_5016_spec.js @@ -0,0 +1,23 @@ +const systemTests = require('../lib/system-tests').default + +describe('e2e issue 5016 - screenshot times out after clicking target _blank', function () { + systemTests.setup() + + // this test originally was scoped to !webkit, but Firefox has a (non-regression) flake + // issue: https://github.com/cypress-io/cypress/issues/29116 + systemTests.it('fails but does not timeout taking screenshot', { + project: 'config-screenshot-on-failure-enabled', + sanitizeScreenshotDimensions: true, + snapshot: true, + expectedExitCode: 1, + browser: 'chrome', + }) + + systemTests.it('fails but does not timeout taking screenshot', { + project: 'config-screenshot-on-failure-enabled', + sanitizeScreenshotDimensions: true, + snapshot: true, + expectedExitCode: 1, + browser: 'electron', + }) +}) diff --git a/system-tests/test/protocol_spec.js b/system-tests/test/protocol_spec.js index ff1ed2bb739a..fc30ed626111 100644 --- a/system-tests/test/protocol_spec.js +++ b/system-tests/test/protocol_spec.js @@ -40,7 +40,7 @@ describe('capture-protocol', () => { return systemTests.exec(this, { key: 'f858a2bc-b469-4e48-be67-0876339ee7e1', project: 'protocol', - spec: 'protocol.cy.js,test-isolation.cy.js', + spec: 'protocol.cy.js,test-isolation.cy.js,shadow-dom.cy.js', record: true, expectedExitCode: 0, port: 2121, diff --git a/system-tests/test/proxy_correlation_spec.js b/system-tests/test/proxy_correlation_spec.js new file mode 100644 index 000000000000..c4fbd59292e9 --- /dev/null +++ b/system-tests/test/proxy_correlation_spec.js @@ -0,0 +1,76 @@ +const systemTests = require('../lib/system-tests').default + +const onServer = (app) => { + app.get('/lots-of-requests', (req, res) => { + const test = req.query.test + const i = req.query.i + + res.send( + ` + + Lots of Requests + + + + Visit + + + `, + ) + }) + + app.get('/1mb', (req, res) => { + return res.type('text').send('x'.repeat(1024 * 1024)) + }) +} + +describe('e2e proxy correlation spec', () => { + const timedOutRequests = (stderr) => { + const matches = stderr.matchAll(/Never received pre-request or url without pre-request for request (.*) after waiting/g) + + // filter out all non-localhost requests since we only care about ones that came from the app, + // browsers make requests that don't have pre-requests for various reasons + // e.g. https://clientservices.googleapis.com/* and https://accounts.google.com/* in chrome + // https://firefox.settings.services.mozilla.com/v1/ and https://tracking-protection.cdn.mozilla.net/* in firefox + return [...matches].filter((match) => match[1].includes('localhost')).map((match) => match[1]) + } + + systemTests.setup({ + servers: { + port: 3500, + onServer, + }, + settings: { + e2e: { + baseUrl: 'http://localhost:3500', + }, + }, + }) + + systemTests.it('correctly correlates requests', { + spec: 'proxy_correlation.cy.js', + processEnv: { + DEBUG: 'cypress:proxy:http:util:prerequests', + }, + config: { + experimentalWebKitSupport: true, + defaultCommandTimeout: 10000, + }, + onStderr (stderr) { + const requests = timedOutRequests(stderr) + + expect(requests).to.be.empty + }, + }) +}) diff --git a/system-tests/test/record_spec.js b/system-tests/test/record_spec.js index 199f427a4e16..3938e1f3e5af 100644 --- a/system-tests/test/record_spec.js +++ b/system-tests/test/record_spec.js @@ -2307,7 +2307,7 @@ describe('e2e record', () => { snapshot: true, }).then((ret) => { const urls = getRequestUrls() - const artifactReport = getRequests().find(({ url }) => url === `PUT /instances/${instanceId}/artifacts`)?.body + const artifactReport = getRequests().find(({ url }) => url.includes(`/instances/${instanceId}/artifacts`))?.body expect(urls).to.include.members([`PUT ${CAPTURE_PROTOCOL_UPLOAD_URL}`]) @@ -2354,20 +2354,13 @@ describe('e2e record', () => { spec: 'simple_multiple.cy.js', configFile: 'cypress-with-project-id.config.js', record: true, - snapshot: true, + snapshot: false, expectedExitCode: 1, }).then(() => { const requests = getRequests() const postResultsRequest = requests.find((r) => r.url === `POST /instances/${instanceId}/results`) - console.log(postResultsRequest) expect(postResultsRequest?.body.exception).to.include('Your configFile threw an error') - expect(postResultsRequest?.body.tests).to.have.length(2) - expect(postResultsRequest?.body.stats.suites).to.equal(1) - expect(postResultsRequest?.body.stats.tests).to.equal(2) - expect(postResultsRequest?.body.stats.passes).to.equal(1) - expect(postResultsRequest?.body.stats.failures).to.equal(1) - expect(postResultsRequest?.body.stats.skipped).to.equal(0) }) }) }) @@ -2548,7 +2541,7 @@ describe('capture-protocol api errors', () => { })) } - describe('upload 500 - retries 8 times and fails', () => { + describe('upload 500 - retries 3 times and fails', () => { stubbedServerWithErrorOn('putCaptureProtocolUpload') it('continues', function () { process.env.API_RETRY_INTERVALS = '1000' @@ -2567,14 +2560,17 @@ describe('capture-protocol api errors', () => { const artifactReport = getRequests().find(({ url }) => url === `PUT /instances/${instanceId}/artifacts`)?.body expect(artifactReport?.protocol).to.exist() - expect(artifactReport?.protocol?.error).to.equal('Failed to upload after 8 attempts. Errors: Internal Server Error, Internal Server Error, Internal Server Error, Internal Server Error, Internal Server Error, Internal Server Error, Internal Server Error, Internal Server Error') + expect(artifactReport?.protocol?.error).to.equal( + 'Failed to upload after 3 attempts. Errors: 500 Internal Server Error (http://localhost:1234/capture-protocol/upload/?x-amz-credential=XXXXXXXX&x-amz-signature=XXXXXXXXXXXXX), 500 Internal Server Error (http://localhost:1234/capture-protocol/upload/?x-amz-credential=XXXXXXXX&x-amz-signature=XXXXXXXXXXXXX), 500 Internal Server Error (http://localhost:1234/capture-protocol/upload/?x-amz-credential=XXXXXXXX&x-amz-signature=XXXXXXXXXXXXX)', + ) + expect(artifactReport?.protocol?.errorStack).to.exist().and.not.to.be.empty() }) }) }) - describe('upload 500 - retries 7 times and succeeds on the last call', () => { - stubbedServerWithErrorOn('putCaptureProtocolUpload', 7) + describe('upload 500 - retries 2 times and succeeds on the last call', () => { + stubbedServerWithErrorOn('putCaptureProtocolUpload', 2) let archiveFile = '' diff --git a/system-tests/test/retries_spec.ts b/system-tests/test/retries_spec.ts index af7032e73e80..6391ffc565a1 100644 --- a/system-tests/test/retries_spec.ts +++ b/system-tests/test/retries_spec.ts @@ -26,6 +26,10 @@ describe('retries', () => { expectedExitCode: 10, }) + it('prints current retries', { + spec: 'current_retries.cy.js', + }) + it('warns about retries plugin', { project: 'plugin-retries', spec: 'main.spec.cy.js', diff --git a/system-tests/test/service_worker_protocol_spec.js b/system-tests/test/service_worker_protocol_spec.js index 7ac93e3ae84f..4c3aaebb1ff0 100644 --- a/system-tests/test/service_worker_protocol_spec.js +++ b/system-tests/test/service_worker_protocol_spec.js @@ -56,6 +56,34 @@ describe('capture-protocol', () => { expect(parsedProtocolEvents.exceptionThrown).to.be.false }) }) + + it(`verifies the types of requests match for a preloaded service worker - ${browser}`, function () { + return systemTests.exec(this, { + key: 'f858a2bc-b469-4e48-be67-0876339ee7e1', + project: 'protocol', + configFile: 'cypress-with-service-worker-preloaded.config.ts', + // Here we are testing that when a service worker is preloaded it can properly be captured + spec: 'service-worker-preloaded.cy.js', + record: true, + expectedExitCode: 0, + port: 2121, + browser, + }).then(() => { + const protocolEvents = fs.readFileSync(getFilePath('e9e81b5e-cc58-4026-b2ff-8ae3161435a6.db'), 'utf8') + + const parsedProtocolEvents = JSON.parse(protocolEvents) + + expect(parsedProtocolEvents.multipleNetworkRequestEventsForSameRequestId).to.be.false + expect(parsedProtocolEvents.correlatedUrls).to.eql({ + 'http://localhost:2121/cypress/fixtures/service-worker-assets/example.json': ['no frame id'], + 'http://localhost:2121/cypress/fixtures/service-worker-assets/scope/cached-service-worker.json': ['no frame id'], + 'http://localhost:2121/cypress/fixtures/service-worker-assets/scope/load-with-service-worker-preloaded.js': ['no frame id'], + 'http://localhost:2121/cypress/fixtures/service-worker-assets/scope/service_worker_preloaded.html': ['no frame id', 'no frame id', 'no frame id', 'no frame id'], + }) + + expect(parsedProtocolEvents.exceptionThrown).to.be.false + }) + }) }) }) }) diff --git a/tooling/v8-snapshot/cache/darwin/snapshot-meta.json b/tooling/v8-snapshot/cache/darwin/snapshot-meta.json index 24e4ba28c193..51c632c38f7d 100644 --- a/tooling/v8-snapshot/cache/darwin/snapshot-meta.json +++ b/tooling/v8-snapshot/cache/darwin/snapshot-meta.json @@ -25,6 +25,7 @@ "./node_modules/express/node_modules/debug/src/node.js", "./node_modules/finalhandler/node_modules/debug/src/node.js", "./node_modules/firefox-profile/node_modules/jsonfile/index.js", + "./node_modules/flatted/cjs/index.js", "./node_modules/fs-extra/node_modules/jsonfile/index.js", "./node_modules/get-package-info/node_modules/debug/src/node.js", "./node_modules/graceful-fs/polyfills.js", @@ -49,7 +50,6 @@ "./node_modules/stream-parser/node_modules/debug/src/node.js", "./node_modules/tcp-port-used/node_modules/debug/src/node.js", "./node_modules/trash/node_modules/make-dir/index.js", - "./node_modules/utif/UTIF.js", "./packages/data-context/node_modules/@babel/generator/node_modules/@babel/types/lib/definitions/core.js", "./packages/data-context/node_modules/debug/src/node.js", "./packages/data-context/node_modules/minimatch/minimatch.js", @@ -76,7 +76,6 @@ "./packages/server/node_modules/graceful-fs/polyfills.js", "./packages/server/node_modules/is-ci/index.js", "./packages/server/node_modules/mocha/node_modules/debug/src/node.js", - "./packages/server/node_modules/signal-exit/index.js", "./process-nextick-args/index.js", "./signal-exit/index.js", "./ws/lib/websocket.js" @@ -195,6 +194,14 @@ "./node_modules/@jimp/jpeg/node_modules/jpeg-js/lib/decoder.js", "./node_modules/@jimp/plugin-print/dist/index.js", "./node_modules/@jimp/plugins/dist/index.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/chunkstream.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/filter-parse-async.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/packer-async.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/packer-sync.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/parser-async.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/parser-sync.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/png.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/sync-inflate.js", "./node_modules/@jimp/tiff/dist/index.js", "./node_modules/@jimp/types/dist/index.js", "./node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js", @@ -255,7 +262,6 @@ "./node_modules/cp-file/fs.js", "./node_modules/cp-file/node_modules/semver/semver.js", "./node_modules/cp-file/progress-emitter.js", - "./node_modules/cross-fetch/node_modules/node-fetch/lib/index.js", "./node_modules/cross-spawn-async/lib/parse.js", "./node_modules/cross-spawn-async/lib/resolveCommand.js", "./node_modules/debug/src/browser.js", @@ -294,7 +300,6 @@ "./node_modules/firefox-profile/node_modules/fs-extra/lib/json/index.js", "./node_modules/firefox-profile/node_modules/fs-extra/lib/json/jsonfile.js", "./node_modules/firefox-profile/node_modules/fs-extra/lib/path-exists/index.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/xml2js.js", "./node_modules/fluent-ffmpeg/index.js", "./node_modules/fluent-ffmpeg/lib/fluent-ffmpeg.js", "./node_modules/fluent-ffmpeg/lib/utils.js", @@ -311,9 +316,6 @@ "./node_modules/fs-extra/lib/path-exists/index.js", "./node_modules/fsevents/fsevents.js", "./node_modules/getenv/index.js", - "./node_modules/gifwrap/src/gifcodec.js", - "./node_modules/gifwrap/src/gifutil.js", - "./node_modules/gifwrap/src/index.js", "./node_modules/glob-parent/index.js", "./node_modules/globby/stream-utils.js", "./node_modules/graceful-fs/graceful-fs.js", @@ -333,9 +335,11 @@ "./node_modules/iconv-lite/lib/index.js", "./node_modules/iconv-lite/lib/streams.js", "./node_modules/ignore/index.js", + "./node_modules/image-q/dist/cjs/image-q.cjs", "./node_modules/image-size/dist/fs.promises.js", "./node_modules/image-size/dist/index.js", "./node_modules/isexe/index.js", + "./node_modules/isomorphic-fetch/fetch-npm-node.js", "./node_modules/istextorbinary/edition-es2019/index.js", "./node_modules/jimp/dist/index.js", "./node_modules/jose/dist/node/cjs/lib/buffer_utils.js", @@ -419,6 +423,7 @@ "./node_modules/nexus/dist/typegenMetadata.js", "./node_modules/nexus/dist/typegenUtils.js", "./node_modules/nexus/dist/utils.js", + "./node_modules/node-fetch/lib/index.js", "./node_modules/node-forge/lib/aes.js", "./node_modules/node-forge/lib/aesCipherSuites.js", "./node_modules/node-forge/lib/asn1-validator.js", @@ -465,6 +470,7 @@ "./node_modules/os-homedir/index.js", "./node_modules/pako/lib/utils/strings.js", "./node_modules/pako/lib/zlib/trees.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/xml2js.js", "./node_modules/performance-now/lib/performance-now.js", "./node_modules/phin/lib/phin.compiled.js", "./node_modules/picocolors/picocolors.js", @@ -473,15 +479,6 @@ "./node_modules/picomatch/lib/picomatch.js", "./node_modules/pidusage/lib/stats.js", "./node_modules/pinkie/index.js", - "./node_modules/pngjs/lib/chunkstream.js", - "./node_modules/pngjs/lib/filter-parse-async.js", - "./node_modules/pngjs/lib/packer-async.js", - "./node_modules/pngjs/lib/packer-sync.js", - "./node_modules/pngjs/lib/parser-async.js", - "./node_modules/pngjs/lib/parser-sync.js", - "./node_modules/pngjs/lib/png.js", - "./node_modules/pngjs/lib/sync-inflate.js", - "./node_modules/prettier/parser-glimmer.js", "./node_modules/process-nextick-args/index.js", "./node_modules/pseudomap/map.js", "./node_modules/pumpify/index.js", @@ -599,6 +596,7 @@ "./node_modules/utf8-stream/node_modules/readable-stream/lib/_stream_transform.js", "./node_modules/utf8-stream/node_modules/readable-stream/lib/_stream_writable.js", "./node_modules/utf8-stream/node_modules/readable-stream/transform.js", + "./node_modules/utif2/UTIF.js", "./node_modules/util-deprecate/node.js", "./node_modules/uuid/dist/index.js", "./node_modules/uuid/dist/md5.js", @@ -669,6 +667,14 @@ "./packages/data-context/node_modules/fs-extra/lib/json/jsonfile.js", "./packages/data-context/node_modules/fs-extra/lib/path-exists/index.js", "./packages/data-context/node_modules/get-stream/buffer-stream.js", + "./packages/data-context/node_modules/prettier/index.js", + "./packages/data-context/node_modules/prettier/parser-babel.js", + "./packages/data-context/node_modules/prettier/parser-espree.js", + "./packages/data-context/node_modules/prettier/parser-flow.js", + "./packages/data-context/node_modules/prettier/parser-glimmer.js", + "./packages/data-context/node_modules/prettier/parser-meriyah.js", + "./packages/data-context/node_modules/prettier/parser-typescript.js", + "./packages/data-context/node_modules/prettier/third-party.js", "./packages/data-context/node_modules/readdirp/index.js", "./packages/data-context/node_modules/supports-color/index.js", "./packages/data-context/src/DataActions.ts", @@ -765,7 +771,6 @@ "./packages/server/lib/util/app_data.js", "./packages/server/lib/util/chrome_policy_check.js", "./packages/server/lib/util/cookies.ts", - "./packages/server/lib/util/exit.js", "./packages/server/lib/util/file.js", "./packages/server/lib/util/glob.js", "./packages/server/lib/util/profile_cleaner.js", @@ -784,7 +789,6 @@ "./packages/server/node_modules/cross-spawn/node_modules/semver/semver.js", "./packages/server/node_modules/duplexify/index.js", "./packages/server/node_modules/execa/lib/errname.js", - "./packages/server/node_modules/execa/node_modules/signal-exit/signals.js", "./packages/server/node_modules/get-stream/buffer-stream.js", "./packages/server/node_modules/glob/glob.js", "./packages/server/node_modules/glob/sync.js", @@ -828,7 +832,6 @@ "./packages/server/node_modules/send/node_modules/debug/src/index.js", "./packages/server/node_modules/send/node_modules/debug/src/node.js", "./packages/server/node_modules/send/node_modules/mime/mime.js", - "./packages/server/node_modules/signal-exit/signals.js", "./packages/server/node_modules/supports-color/index.js", "./packages/server/start-cypress.js", "./packages/server/v8-snapshot-entry.js", @@ -948,34 +951,6 @@ "./node_modules/@babel/plugin-syntax-jsx/lib/index.js", "./node_modules/@babel/plugin-syntax-typescript/lib/index.js", "./node_modules/@babel/preset-typescript/package.json", - "./node_modules/@babel/runtime/helpers/arrayLikeToArray.js", - "./node_modules/@babel/runtime/helpers/arrayWithHoles.js", - "./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js", - "./node_modules/@babel/runtime/helpers/assertThisInitialized.js", - "./node_modules/@babel/runtime/helpers/classCallCheck.js", - "./node_modules/@babel/runtime/helpers/construct.js", - "./node_modules/@babel/runtime/helpers/createClass.js", - "./node_modules/@babel/runtime/helpers/defineProperty.js", - "./node_modules/@babel/runtime/helpers/extends.js", - "./node_modules/@babel/runtime/helpers/getPrototypeOf.js", - "./node_modules/@babel/runtime/helpers/inherits.js", - "./node_modules/@babel/runtime/helpers/interopRequireDefault.js", - "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js", - "./node_modules/@babel/runtime/helpers/isNativeReflectConstruct.js", - "./node_modules/@babel/runtime/helpers/iterableToArray.js", - "./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js", - "./node_modules/@babel/runtime/helpers/nonIterableRest.js", - "./node_modules/@babel/runtime/helpers/nonIterableSpread.js", - "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js", - "./node_modules/@babel/runtime/helpers/regeneratorRuntime.js", - "./node_modules/@babel/runtime/helpers/setPrototypeOf.js", - "./node_modules/@babel/runtime/helpers/slicedToArray.js", - "./node_modules/@babel/runtime/helpers/toConsumableArray.js", - "./node_modules/@babel/runtime/helpers/toPrimitive.js", - "./node_modules/@babel/runtime/helpers/toPropertyKey.js", - "./node_modules/@babel/runtime/helpers/typeof.js", - "./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js", - "./node_modules/@babel/runtime/regenerator/index.js", "./node_modules/@babel/template/lib/builder.js", "./node_modules/@babel/template/lib/formatters.js", "./node_modules/@babel/template/lib/index.js", @@ -1063,6 +1038,8 @@ "./node_modules/@cypress/commit-info/src/index.js", "./node_modules/@cypress/commit-info/src/utils.js", "./node_modules/@cypress/get-windows-proxy/node_modules/debug/src/common.js", + "./node_modules/@cypress/get-windows-proxy/node_modules/registry-js/dist/lib/index.js", + "./node_modules/@cypress/get-windows-proxy/node_modules/registry-js/dist/lib/registry.js", "./node_modules/@cypress/get-windows-proxy/src/index.js", "./node_modules/@cypress/parse-domain/build/tries/icann.complete.json", "./node_modules/@cypress/parse-domain/build/tries/private.complete.json", @@ -1110,7 +1087,10 @@ "./node_modules/@jimp/core/dist/utils/image-bitmap.js", "./node_modules/@jimp/core/dist/utils/mime.js", "./node_modules/@jimp/core/dist/utils/promisify.js", + "./node_modules/@jimp/core/node_modules/file-type/core.js", "./node_modules/@jimp/core/node_modules/file-type/index.js", + "./node_modules/@jimp/core/node_modules/file-type/supported.js", + "./node_modules/@jimp/core/node_modules/file-type/util.js", "./node_modules/@jimp/gif/dist/index.js", "./node_modules/@jimp/jpeg/node_modules/jpeg-js/lib/encoder.js", "./node_modules/@jimp/plugin-blit/dist/index.js", @@ -1138,6 +1118,20 @@ "./node_modules/@jimp/plugin-shadow/dist/index.js", "./node_modules/@jimp/plugin-threshold/dist/index.js", "./node_modules/@jimp/png/dist/index.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/bitmapper.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/bitpacker.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/constants.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/crc.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/filter-pack.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/filter-parse-sync.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/filter-parse.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/format-normaliser.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/interlace.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/packer.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/paeth-predictor.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/parser.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/png-sync.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/sync-reader.js", "./node_modules/@jimp/utils/dist/index.js", "./node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js", "./node_modules/@jridgewell/set-array/dist/set-array.umd.js", @@ -1620,7 +1614,6 @@ "./node_modules/chrome-remote-interface/node_modules/ws/lib/validation.js", "./node_modules/ci-info/index.js", "./node_modules/ci-info/vendors.json", - "./node_modules/circular-json/build/circular-json.node.js", "./node_modules/cli-truncate/index.js", "./node_modules/cli-truncate/node_modules/slice-ansi/index.js", "./node_modules/coffeescript/lib/coffeescript/lexer.js", @@ -1913,11 +1906,6 @@ "./node_modules/firefox-profile/node_modules/jsonfile/node_modules/universalify/index.js", "./node_modules/firefox-profile/node_modules/jsonfile/utils.js", "./node_modules/firefox-profile/node_modules/universalify/index.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/bom.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/builder.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/defaults.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/parser.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/processors.js", "./node_modules/fluent-ffmpeg/lib/capabilities.js", "./node_modules/fluent-ffmpeg/lib/ffprobe.js", "./node_modules/fluent-ffmpeg/lib/options/audio.js", @@ -1997,7 +1985,10 @@ "./node_modules/getos/os.json", "./node_modules/gifwrap/src/bitmapimage.js", "./node_modules/gifwrap/src/gif.js", + "./node_modules/gifwrap/src/gifcodec.js", "./node_modules/gifwrap/src/gifframe.js", + "./node_modules/gifwrap/src/gifutil.js", + "./node_modules/gifwrap/src/index.js", "./node_modules/glob-base/index.js", "./node_modules/glob-base/node_modules/glob-parent/index.js", "./node_modules/glob-base/node_modules/is-extglob/index.js", @@ -2176,7 +2167,7 @@ "./node_modules/iconv-lite/encodings/utf7.js", "./node_modules/iconv-lite/lib/bom-handling.js", "./node_modules/iconv-lite/lib/extend-node.js", - "./node_modules/image-q/dist/iq.js", + "./node_modules/ieee754/index.js", "./node_modules/image-size/dist/detector.js", "./node_modules/image-size/dist/readUInt.js", "./node_modules/image-size/dist/types.js", @@ -2261,7 +2252,6 @@ "./node_modules/jose/dist/node/cjs/lib/decrypt_key_management.js", "./node_modules/jose/dist/node/cjs/lib/encrypt_key_management.js", "./node_modules/jose/dist/node/cjs/lib/epoch.js", - "./node_modules/jose/dist/node/cjs/lib/format_pem.js", "./node_modules/jose/dist/node/cjs/lib/invalid_key_input.js", "./node_modules/jose/dist/node/cjs/lib/is_disjoint.js", "./node_modules/jose/dist/node/cjs/lib/is_object.js", @@ -2282,7 +2272,6 @@ "./node_modules/jose/dist/node/cjs/runtime/dsa_digest.js", "./node_modules/jose/dist/node/cjs/runtime/ecdhes.js", "./node_modules/jose/dist/node/cjs/runtime/encrypt.js", - "./node_modules/jose/dist/node/cjs/runtime/env.js", "./node_modules/jose/dist/node/cjs/runtime/fetch_jwks.js", "./node_modules/jose/dist/node/cjs/runtime/flags.js", "./node_modules/jose/dist/node/cjs/runtime/generate.js", @@ -2294,12 +2283,14 @@ "./node_modules/jose/dist/node/cjs/runtime/pbes2kw.js", "./node_modules/jose/dist/node/cjs/runtime/random.js", "./node_modules/jose/dist/node/cjs/runtime/rsaes.js", + "./node_modules/jose/dist/node/cjs/runtime/runtime.js", "./node_modules/jose/dist/node/cjs/runtime/timing_safe_equal.js", "./node_modules/jose/dist/node/cjs/runtime/zlib.js", "./node_modules/jose/dist/node/cjs/util/base64url.js", "./node_modules/jose/dist/node/cjs/util/decode_jwt.js", "./node_modules/jose/dist/node/cjs/util/decode_protected_header.js", "./node_modules/jose/dist/node/cjs/util/errors.js", + "./node_modules/jose/dist/node/cjs/util/runtime.js", "./node_modules/js-tokens/index.js", "./node_modules/jsesc/jsesc.js", "./node_modules/json-schema/lib/validate.js", @@ -2471,7 +2462,6 @@ "./node_modules/min-indent/index.js", "./node_modules/minimatch/node_modules/brace-expansion/index.js", "./node_modules/minimist/index.js", - "./node_modules/mkdirp/index.js", "./node_modules/mocha-7.0.1/lib/browser/progress.js", "./node_modules/mocha-7.0.1/lib/context.js", "./node_modules/mocha-7.0.1/lib/errors.js", @@ -2645,6 +2635,11 @@ "./node_modules/parse-bmfont-binary/index.js", "./node_modules/parse-bmfont-xml/lib/index.js", "./node_modules/parse-bmfont-xml/lib/parse-attribs.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/bom.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/builder.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/defaults.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/parser.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/processors.js", "./node_modules/parse-glob/index.js", "./node_modules/parse-glob/node_modules/is-extglob/index.js", "./node_modules/parse-glob/node_modules/is-glob/index.js", @@ -2657,6 +2652,10 @@ "./node_modules/path-root-regex/index.js", "./node_modules/path-root/index.js", "./node_modules/path-type/index.js", + "./node_modules/peek-readable/lib/Deferred.js", + "./node_modules/peek-readable/lib/EndOfFileStream.js", + "./node_modules/peek-readable/lib/StreamReader.js", + "./node_modules/peek-readable/lib/index.js", "./node_modules/picomatch/lib/parse.js", "./node_modules/picomatch/lib/scan.js", "./node_modules/picomatch/lib/utils.js", @@ -2708,23 +2707,10 @@ "./node_modules/plist/node_modules/xmlbuilder/lib/XMLWriterBase.js", "./node_modules/plist/node_modules/xmlbuilder/lib/index.js", "./node_modules/pluralize/pluralize.js", - "./node_modules/pngjs/lib/bitmapper.js", - "./node_modules/pngjs/lib/bitpacker.js", - "./node_modules/pngjs/lib/constants.js", - "./node_modules/pngjs/lib/crc.js", - "./node_modules/pngjs/lib/filter-pack.js", - "./node_modules/pngjs/lib/filter-parse-sync.js", - "./node_modules/pngjs/lib/filter-parse.js", - "./node_modules/pngjs/lib/format-normaliser.js", - "./node_modules/pngjs/lib/interlace.js", - "./node_modules/pngjs/lib/packer.js", - "./node_modules/pngjs/lib/paeth-predictor.js", - "./node_modules/pngjs/lib/parser.js", - "./node_modules/pngjs/lib/png-sync.js", - "./node_modules/pngjs/lib/sync-reader.js", "./node_modules/prettier/doc.js", "./node_modules/prettier/package.json", "./node_modules/prettier/parser-angular.js", + "./node_modules/prettier/parser-glimmer.js", "./node_modules/prettier/parser-graphql.js", "./node_modules/prettier/parser-html.js", "./node_modules/prettier/parser-markdown.js", @@ -3179,6 +3165,8 @@ "./node_modules/recast/parsers/babel.js", "./node_modules/recast/parsers/esprima.js", "./node_modules/recast/parsers/typescript.js", + "./node_modules/registry-js/dist/lib/index.js", + "./node_modules/registry-js/dist/lib/registry.js", "./node_modules/request-promise-core/configure/request2.js", "./node_modules/request-promise-core/errors.js", "./node_modules/request-promise-core/lib/errors.js", @@ -3317,6 +3305,13 @@ "./node_modules/strip-ansi/index.js", "./node_modules/strip-eof/index.js", "./node_modules/strip-final-newline/index.js", + "./node_modules/strtok3/lib/AbstractTokenizer.js", + "./node_modules/strtok3/lib/BufferTokenizer.js", + "./node_modules/strtok3/lib/FileTokenizer.js", + "./node_modules/strtok3/lib/FsPromise.js", + "./node_modules/strtok3/lib/ReadStreamTokenizer.js", + "./node_modules/strtok3/lib/core.js", + "./node_modules/strtok3/lib/index.js", "./node_modules/supports-color/node_modules/has-flag/index.js", "./node_modules/syntax-error/index.js", "./node_modules/systeminformation/lib/audio.js", @@ -3346,11 +3341,12 @@ "./node_modules/textextensions/edition-es5/index.js", "./node_modules/through/index.js", "./node_modules/timm/lib/timm.js", - "./node_modules/tinycolor2/tinycolor.js", + "./node_modules/tinycolor2/cjs/tinycolor.js", "./node_modules/to-fast-properties/index.js", "./node_modules/to-regex-range/index.js", "./node_modules/to-regex-range/node_modules/is-number/index.js", "./node_modules/toidentifier/index.js", + "./node_modules/token-types/lib/index.js", "./node_modules/tough-cookie/lib/memstore.js", "./node_modules/tough-cookie/lib/pathMatch.js", "./node_modules/tough-cookie/lib/permuteDomain.js", @@ -3726,6 +3722,14 @@ "./packages/data-context/node_modules/get-stream/index.js", "./packages/data-context/node_modules/micromatch/index.js", "./packages/data-context/node_modules/path-key/index.js", + "./packages/data-context/node_modules/prettier/doc.js", + "./packages/data-context/node_modules/prettier/package.json", + "./packages/data-context/node_modules/prettier/parser-angular.js", + "./packages/data-context/node_modules/prettier/parser-graphql.js", + "./packages/data-context/node_modules/prettier/parser-html.js", + "./packages/data-context/node_modules/prettier/parser-markdown.js", + "./packages/data-context/node_modules/prettier/parser-postcss.js", + "./packages/data-context/node_modules/prettier/parser-yaml.js", "./packages/data-context/node_modules/semver/classes/comparator.js", "./packages/data-context/node_modules/semver/classes/range.js", "./packages/data-context/node_modules/semver/classes/semver.js", @@ -3984,6 +3988,8 @@ "./packages/proxy/lib/http/util/inject.ts", "./packages/proxy/lib/http/util/replace_stream.ts", "./packages/proxy/lib/http/util/rewriter.ts", + "./packages/proxy/lib/http/util/service-worker-injector.ts", + "./packages/proxy/lib/http/util/service-worker-manager.ts", "./packages/proxy/lib/http/util/top-simulation.ts", "./packages/proxy/lib/index.ts", "./packages/proxy/lib/network-proxy.ts", @@ -4111,6 +4117,7 @@ "./packages/server/lib/util/env-editors.ts", "./packages/server/lib/util/env.js", "./packages/server/lib/util/escape_filename.ts", + "./packages/server/lib/util/exit.js", "./packages/server/lib/util/file-opener.ts", "./packages/server/lib/util/find_process.js", "./packages/server/lib/util/fs.ts", @@ -4139,6 +4146,7 @@ "./packages/server/lib/util/terminal.js", "./packages/server/lib/util/tests_utils.ts", "./packages/server/lib/util/tty.js", + "./packages/server/node_modules/@babel/parser/lib/index.js", "./packages/server/node_modules/@benmalka/foxdriver/build/index.js", "./packages/server/node_modules/@benmalka/foxdriver/build/launcher.js", "./packages/server/node_modules/@benmalka/foxdriver/build/logger.js", @@ -4189,7 +4197,6 @@ "./packages/server/node_modules/cross-spawn/lib/util/resolveCommand.js", "./packages/server/node_modules/execa/index.js", "./packages/server/node_modules/execa/lib/stdio.js", - "./packages/server/node_modules/execa/node_modules/signal-exit/index.js", "./packages/server/node_modules/get-stream/index.js", "./packages/server/node_modules/glob/common.js", "./packages/server/node_modules/graceful-fs/clone.js", @@ -4311,5 +4318,5 @@ "./tooling/v8-snapshot/cache/darwin/snapshot-entry.js" ], "deferredHashFile": "yarn.lock", - "deferredHash": "eac0b3a082ef15b9e9470322b24f2a5a7ff7f3f04194507c10c5a02113fc5b6d" + "deferredHash": "19d942f2dc5e92bec7cbf53d697de6876ceae896f8e5edb0bfa9e4ac80ad6d10" } \ No newline at end of file diff --git a/tooling/v8-snapshot/cache/linux/snapshot-meta.json b/tooling/v8-snapshot/cache/linux/snapshot-meta.json index ffe5c6db0609..d7bf9051b529 100644 --- a/tooling/v8-snapshot/cache/linux/snapshot-meta.json +++ b/tooling/v8-snapshot/cache/linux/snapshot-meta.json @@ -25,6 +25,7 @@ "./node_modules/express/node_modules/debug/src/node.js", "./node_modules/finalhandler/node_modules/debug/src/node.js", "./node_modules/firefox-profile/node_modules/jsonfile/index.js", + "./node_modules/flatted/cjs/index.js", "./node_modules/fs-extra/node_modules/jsonfile/index.js", "./node_modules/get-package-info/node_modules/debug/src/node.js", "./node_modules/graceful-fs/polyfills.js", @@ -49,7 +50,6 @@ "./node_modules/stream-parser/node_modules/debug/src/node.js", "./node_modules/tcp-port-used/node_modules/debug/src/node.js", "./node_modules/trash/node_modules/make-dir/index.js", - "./node_modules/utif/UTIF.js", "./packages/data-context/node_modules/@babel/generator/node_modules/@babel/types/lib/definitions/core.js", "./packages/data-context/node_modules/debug/src/node.js", "./packages/data-context/node_modules/minimatch/minimatch.js", @@ -76,7 +76,6 @@ "./packages/server/node_modules/graceful-fs/polyfills.js", "./packages/server/node_modules/is-ci/index.js", "./packages/server/node_modules/mocha/node_modules/debug/src/node.js", - "./packages/server/node_modules/signal-exit/index.js", "./process-nextick-args/index.js", "./signal-exit/index.js", "./ws/lib/websocket.js" @@ -195,6 +194,14 @@ "./node_modules/@jimp/jpeg/node_modules/jpeg-js/lib/decoder.js", "./node_modules/@jimp/plugin-print/dist/index.js", "./node_modules/@jimp/plugins/dist/index.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/chunkstream.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/filter-parse-async.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/packer-async.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/packer-sync.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/parser-async.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/parser-sync.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/png.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/sync-inflate.js", "./node_modules/@jimp/tiff/dist/index.js", "./node_modules/@jimp/types/dist/index.js", "./node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js", @@ -255,7 +262,6 @@ "./node_modules/cp-file/fs.js", "./node_modules/cp-file/node_modules/semver/semver.js", "./node_modules/cp-file/progress-emitter.js", - "./node_modules/cross-fetch/node_modules/node-fetch/lib/index.js", "./node_modules/cross-spawn-async/lib/parse.js", "./node_modules/cross-spawn-async/lib/resolveCommand.js", "./node_modules/debug/src/browser.js", @@ -294,7 +300,6 @@ "./node_modules/firefox-profile/node_modules/fs-extra/lib/json/index.js", "./node_modules/firefox-profile/node_modules/fs-extra/lib/json/jsonfile.js", "./node_modules/firefox-profile/node_modules/fs-extra/lib/path-exists/index.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/xml2js.js", "./node_modules/fluent-ffmpeg/index.js", "./node_modules/fluent-ffmpeg/lib/fluent-ffmpeg.js", "./node_modules/fluent-ffmpeg/lib/utils.js", @@ -310,9 +315,6 @@ "./node_modules/fs-extra/lib/json/jsonfile.js", "./node_modules/fs-extra/lib/path-exists/index.js", "./node_modules/getenv/index.js", - "./node_modules/gifwrap/src/gifcodec.js", - "./node_modules/gifwrap/src/gifutil.js", - "./node_modules/gifwrap/src/index.js", "./node_modules/glob-parent/index.js", "./node_modules/globby/stream-utils.js", "./node_modules/graceful-fs/graceful-fs.js", @@ -332,9 +334,11 @@ "./node_modules/iconv-lite/lib/index.js", "./node_modules/iconv-lite/lib/streams.js", "./node_modules/ignore/index.js", + "./node_modules/image-q/dist/cjs/image-q.cjs", "./node_modules/image-size/dist/fs.promises.js", "./node_modules/image-size/dist/index.js", "./node_modules/isexe/index.js", + "./node_modules/isomorphic-fetch/fetch-npm-node.js", "./node_modules/istextorbinary/edition-es2019/index.js", "./node_modules/jimp/dist/index.js", "./node_modules/jose/dist/node/cjs/lib/buffer_utils.js", @@ -418,6 +422,7 @@ "./node_modules/nexus/dist/typegenMetadata.js", "./node_modules/nexus/dist/typegenUtils.js", "./node_modules/nexus/dist/utils.js", + "./node_modules/node-fetch/lib/index.js", "./node_modules/node-forge/lib/aes.js", "./node_modules/node-forge/lib/aesCipherSuites.js", "./node_modules/node-forge/lib/asn1-validator.js", @@ -464,6 +469,7 @@ "./node_modules/os-homedir/index.js", "./node_modules/pako/lib/utils/strings.js", "./node_modules/pako/lib/zlib/trees.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/xml2js.js", "./node_modules/performance-now/lib/performance-now.js", "./node_modules/phin/lib/phin.compiled.js", "./node_modules/picocolors/picocolors.js", @@ -472,15 +478,6 @@ "./node_modules/picomatch/lib/picomatch.js", "./node_modules/pidusage/lib/stats.js", "./node_modules/pinkie/index.js", - "./node_modules/pngjs/lib/chunkstream.js", - "./node_modules/pngjs/lib/filter-parse-async.js", - "./node_modules/pngjs/lib/packer-async.js", - "./node_modules/pngjs/lib/packer-sync.js", - "./node_modules/pngjs/lib/parser-async.js", - "./node_modules/pngjs/lib/parser-sync.js", - "./node_modules/pngjs/lib/png.js", - "./node_modules/pngjs/lib/sync-inflate.js", - "./node_modules/prettier/parser-glimmer.js", "./node_modules/process-nextick-args/index.js", "./node_modules/pseudomap/map.js", "./node_modules/pumpify/index.js", @@ -598,6 +595,7 @@ "./node_modules/utf8-stream/node_modules/readable-stream/lib/_stream_transform.js", "./node_modules/utf8-stream/node_modules/readable-stream/lib/_stream_writable.js", "./node_modules/utf8-stream/node_modules/readable-stream/transform.js", + "./node_modules/utif2/UTIF.js", "./node_modules/util-deprecate/node.js", "./node_modules/uuid/dist/index.js", "./node_modules/uuid/dist/md5.js", @@ -668,6 +666,14 @@ "./packages/data-context/node_modules/fs-extra/lib/json/jsonfile.js", "./packages/data-context/node_modules/fs-extra/lib/path-exists/index.js", "./packages/data-context/node_modules/get-stream/buffer-stream.js", + "./packages/data-context/node_modules/prettier/index.js", + "./packages/data-context/node_modules/prettier/parser-babel.js", + "./packages/data-context/node_modules/prettier/parser-espree.js", + "./packages/data-context/node_modules/prettier/parser-flow.js", + "./packages/data-context/node_modules/prettier/parser-glimmer.js", + "./packages/data-context/node_modules/prettier/parser-meriyah.js", + "./packages/data-context/node_modules/prettier/parser-typescript.js", + "./packages/data-context/node_modules/prettier/third-party.js", "./packages/data-context/node_modules/readdirp/index.js", "./packages/data-context/node_modules/supports-color/index.js", "./packages/data-context/src/DataActions.ts", @@ -764,7 +770,6 @@ "./packages/server/lib/util/app_data.js", "./packages/server/lib/util/chrome_policy_check.js", "./packages/server/lib/util/cookies.ts", - "./packages/server/lib/util/exit.js", "./packages/server/lib/util/file.js", "./packages/server/lib/util/glob.js", "./packages/server/lib/util/profile_cleaner.js", @@ -783,7 +788,6 @@ "./packages/server/node_modules/cross-spawn/node_modules/semver/semver.js", "./packages/server/node_modules/duplexify/index.js", "./packages/server/node_modules/execa/lib/errname.js", - "./packages/server/node_modules/execa/node_modules/signal-exit/signals.js", "./packages/server/node_modules/get-stream/buffer-stream.js", "./packages/server/node_modules/glob/glob.js", "./packages/server/node_modules/glob/sync.js", @@ -827,7 +831,6 @@ "./packages/server/node_modules/send/node_modules/debug/src/index.js", "./packages/server/node_modules/send/node_modules/debug/src/node.js", "./packages/server/node_modules/send/node_modules/mime/mime.js", - "./packages/server/node_modules/signal-exit/signals.js", "./packages/server/node_modules/supports-color/index.js", "./packages/server/start-cypress.js", "./packages/server/v8-snapshot-entry.js", @@ -947,34 +950,6 @@ "./node_modules/@babel/plugin-syntax-jsx/lib/index.js", "./node_modules/@babel/plugin-syntax-typescript/lib/index.js", "./node_modules/@babel/preset-typescript/package.json", - "./node_modules/@babel/runtime/helpers/arrayLikeToArray.js", - "./node_modules/@babel/runtime/helpers/arrayWithHoles.js", - "./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js", - "./node_modules/@babel/runtime/helpers/assertThisInitialized.js", - "./node_modules/@babel/runtime/helpers/classCallCheck.js", - "./node_modules/@babel/runtime/helpers/construct.js", - "./node_modules/@babel/runtime/helpers/createClass.js", - "./node_modules/@babel/runtime/helpers/defineProperty.js", - "./node_modules/@babel/runtime/helpers/extends.js", - "./node_modules/@babel/runtime/helpers/getPrototypeOf.js", - "./node_modules/@babel/runtime/helpers/inherits.js", - "./node_modules/@babel/runtime/helpers/interopRequireDefault.js", - "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js", - "./node_modules/@babel/runtime/helpers/isNativeReflectConstruct.js", - "./node_modules/@babel/runtime/helpers/iterableToArray.js", - "./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js", - "./node_modules/@babel/runtime/helpers/nonIterableRest.js", - "./node_modules/@babel/runtime/helpers/nonIterableSpread.js", - "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js", - "./node_modules/@babel/runtime/helpers/regeneratorRuntime.js", - "./node_modules/@babel/runtime/helpers/setPrototypeOf.js", - "./node_modules/@babel/runtime/helpers/slicedToArray.js", - "./node_modules/@babel/runtime/helpers/toConsumableArray.js", - "./node_modules/@babel/runtime/helpers/toPrimitive.js", - "./node_modules/@babel/runtime/helpers/toPropertyKey.js", - "./node_modules/@babel/runtime/helpers/typeof.js", - "./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js", - "./node_modules/@babel/runtime/regenerator/index.js", "./node_modules/@babel/template/lib/builder.js", "./node_modules/@babel/template/lib/formatters.js", "./node_modules/@babel/template/lib/index.js", @@ -1111,7 +1086,10 @@ "./node_modules/@jimp/core/dist/utils/image-bitmap.js", "./node_modules/@jimp/core/dist/utils/mime.js", "./node_modules/@jimp/core/dist/utils/promisify.js", + "./node_modules/@jimp/core/node_modules/file-type/core.js", "./node_modules/@jimp/core/node_modules/file-type/index.js", + "./node_modules/@jimp/core/node_modules/file-type/supported.js", + "./node_modules/@jimp/core/node_modules/file-type/util.js", "./node_modules/@jimp/gif/dist/index.js", "./node_modules/@jimp/jpeg/node_modules/jpeg-js/lib/encoder.js", "./node_modules/@jimp/plugin-blit/dist/index.js", @@ -1139,6 +1117,20 @@ "./node_modules/@jimp/plugin-shadow/dist/index.js", "./node_modules/@jimp/plugin-threshold/dist/index.js", "./node_modules/@jimp/png/dist/index.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/bitmapper.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/bitpacker.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/constants.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/crc.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/filter-pack.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/filter-parse-sync.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/filter-parse.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/format-normaliser.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/interlace.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/packer.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/paeth-predictor.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/parser.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/png-sync.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/sync-reader.js", "./node_modules/@jimp/utils/dist/index.js", "./node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js", "./node_modules/@jridgewell/set-array/dist/set-array.umd.js", @@ -1621,7 +1613,6 @@ "./node_modules/chrome-remote-interface/node_modules/ws/lib/validation.js", "./node_modules/ci-info/index.js", "./node_modules/ci-info/vendors.json", - "./node_modules/circular-json/build/circular-json.node.js", "./node_modules/cli-truncate/index.js", "./node_modules/cli-truncate/node_modules/slice-ansi/index.js", "./node_modules/coffeescript/lib/coffeescript/lexer.js", @@ -1914,11 +1905,6 @@ "./node_modules/firefox-profile/node_modules/jsonfile/node_modules/universalify/index.js", "./node_modules/firefox-profile/node_modules/jsonfile/utils.js", "./node_modules/firefox-profile/node_modules/universalify/index.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/bom.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/builder.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/defaults.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/parser.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/processors.js", "./node_modules/fluent-ffmpeg/lib/capabilities.js", "./node_modules/fluent-ffmpeg/lib/ffprobe.js", "./node_modules/fluent-ffmpeg/lib/options/audio.js", @@ -1998,7 +1984,10 @@ "./node_modules/getos/os.json", "./node_modules/gifwrap/src/bitmapimage.js", "./node_modules/gifwrap/src/gif.js", + "./node_modules/gifwrap/src/gifcodec.js", "./node_modules/gifwrap/src/gifframe.js", + "./node_modules/gifwrap/src/gifutil.js", + "./node_modules/gifwrap/src/index.js", "./node_modules/glob-base/index.js", "./node_modules/glob-base/node_modules/glob-parent/index.js", "./node_modules/glob-base/node_modules/is-extglob/index.js", @@ -2177,7 +2166,7 @@ "./node_modules/iconv-lite/encodings/utf7.js", "./node_modules/iconv-lite/lib/bom-handling.js", "./node_modules/iconv-lite/lib/extend-node.js", - "./node_modules/image-q/dist/iq.js", + "./node_modules/ieee754/index.js", "./node_modules/image-size/dist/detector.js", "./node_modules/image-size/dist/readUInt.js", "./node_modules/image-size/dist/types.js", @@ -2262,7 +2251,6 @@ "./node_modules/jose/dist/node/cjs/lib/decrypt_key_management.js", "./node_modules/jose/dist/node/cjs/lib/encrypt_key_management.js", "./node_modules/jose/dist/node/cjs/lib/epoch.js", - "./node_modules/jose/dist/node/cjs/lib/format_pem.js", "./node_modules/jose/dist/node/cjs/lib/invalid_key_input.js", "./node_modules/jose/dist/node/cjs/lib/is_disjoint.js", "./node_modules/jose/dist/node/cjs/lib/is_object.js", @@ -2283,7 +2271,6 @@ "./node_modules/jose/dist/node/cjs/runtime/dsa_digest.js", "./node_modules/jose/dist/node/cjs/runtime/ecdhes.js", "./node_modules/jose/dist/node/cjs/runtime/encrypt.js", - "./node_modules/jose/dist/node/cjs/runtime/env.js", "./node_modules/jose/dist/node/cjs/runtime/fetch_jwks.js", "./node_modules/jose/dist/node/cjs/runtime/flags.js", "./node_modules/jose/dist/node/cjs/runtime/generate.js", @@ -2295,12 +2282,14 @@ "./node_modules/jose/dist/node/cjs/runtime/pbes2kw.js", "./node_modules/jose/dist/node/cjs/runtime/random.js", "./node_modules/jose/dist/node/cjs/runtime/rsaes.js", + "./node_modules/jose/dist/node/cjs/runtime/runtime.js", "./node_modules/jose/dist/node/cjs/runtime/timing_safe_equal.js", "./node_modules/jose/dist/node/cjs/runtime/zlib.js", "./node_modules/jose/dist/node/cjs/util/base64url.js", "./node_modules/jose/dist/node/cjs/util/decode_jwt.js", "./node_modules/jose/dist/node/cjs/util/decode_protected_header.js", "./node_modules/jose/dist/node/cjs/util/errors.js", + "./node_modules/jose/dist/node/cjs/util/runtime.js", "./node_modules/js-tokens/index.js", "./node_modules/jsesc/jsesc.js", "./node_modules/json-schema/lib/validate.js", @@ -2472,7 +2461,6 @@ "./node_modules/min-indent/index.js", "./node_modules/minimatch/node_modules/brace-expansion/index.js", "./node_modules/minimist/index.js", - "./node_modules/mkdirp/index.js", "./node_modules/mocha-7.0.1/lib/browser/progress.js", "./node_modules/mocha-7.0.1/lib/context.js", "./node_modules/mocha-7.0.1/lib/errors.js", @@ -2646,6 +2634,11 @@ "./node_modules/parse-bmfont-binary/index.js", "./node_modules/parse-bmfont-xml/lib/index.js", "./node_modules/parse-bmfont-xml/lib/parse-attribs.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/bom.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/builder.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/defaults.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/parser.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/processors.js", "./node_modules/parse-glob/index.js", "./node_modules/parse-glob/node_modules/is-extglob/index.js", "./node_modules/parse-glob/node_modules/is-glob/index.js", @@ -2658,6 +2651,10 @@ "./node_modules/path-root-regex/index.js", "./node_modules/path-root/index.js", "./node_modules/path-type/index.js", + "./node_modules/peek-readable/lib/Deferred.js", + "./node_modules/peek-readable/lib/EndOfFileStream.js", + "./node_modules/peek-readable/lib/StreamReader.js", + "./node_modules/peek-readable/lib/index.js", "./node_modules/picomatch/lib/parse.js", "./node_modules/picomatch/lib/scan.js", "./node_modules/picomatch/lib/utils.js", @@ -2709,23 +2706,10 @@ "./node_modules/plist/node_modules/xmlbuilder/lib/XMLWriterBase.js", "./node_modules/plist/node_modules/xmlbuilder/lib/index.js", "./node_modules/pluralize/pluralize.js", - "./node_modules/pngjs/lib/bitmapper.js", - "./node_modules/pngjs/lib/bitpacker.js", - "./node_modules/pngjs/lib/constants.js", - "./node_modules/pngjs/lib/crc.js", - "./node_modules/pngjs/lib/filter-pack.js", - "./node_modules/pngjs/lib/filter-parse-sync.js", - "./node_modules/pngjs/lib/filter-parse.js", - "./node_modules/pngjs/lib/format-normaliser.js", - "./node_modules/pngjs/lib/interlace.js", - "./node_modules/pngjs/lib/packer.js", - "./node_modules/pngjs/lib/paeth-predictor.js", - "./node_modules/pngjs/lib/parser.js", - "./node_modules/pngjs/lib/png-sync.js", - "./node_modules/pngjs/lib/sync-reader.js", "./node_modules/prettier/doc.js", "./node_modules/prettier/package.json", "./node_modules/prettier/parser-angular.js", + "./node_modules/prettier/parser-glimmer.js", "./node_modules/prettier/parser-graphql.js", "./node_modules/prettier/parser-html.js", "./node_modules/prettier/parser-markdown.js", @@ -3320,6 +3304,13 @@ "./node_modules/strip-ansi/index.js", "./node_modules/strip-eof/index.js", "./node_modules/strip-final-newline/index.js", + "./node_modules/strtok3/lib/AbstractTokenizer.js", + "./node_modules/strtok3/lib/BufferTokenizer.js", + "./node_modules/strtok3/lib/FileTokenizer.js", + "./node_modules/strtok3/lib/FsPromise.js", + "./node_modules/strtok3/lib/ReadStreamTokenizer.js", + "./node_modules/strtok3/lib/core.js", + "./node_modules/strtok3/lib/index.js", "./node_modules/supports-color/node_modules/has-flag/index.js", "./node_modules/syntax-error/index.js", "./node_modules/systeminformation/lib/audio.js", @@ -3349,11 +3340,12 @@ "./node_modules/textextensions/edition-es5/index.js", "./node_modules/through/index.js", "./node_modules/timm/lib/timm.js", - "./node_modules/tinycolor2/tinycolor.js", + "./node_modules/tinycolor2/cjs/tinycolor.js", "./node_modules/to-fast-properties/index.js", "./node_modules/to-regex-range/index.js", "./node_modules/to-regex-range/node_modules/is-number/index.js", "./node_modules/toidentifier/index.js", + "./node_modules/token-types/lib/index.js", "./node_modules/tough-cookie/lib/memstore.js", "./node_modules/tough-cookie/lib/pathMatch.js", "./node_modules/tough-cookie/lib/permuteDomain.js", @@ -3729,6 +3721,14 @@ "./packages/data-context/node_modules/get-stream/index.js", "./packages/data-context/node_modules/micromatch/index.js", "./packages/data-context/node_modules/path-key/index.js", + "./packages/data-context/node_modules/prettier/doc.js", + "./packages/data-context/node_modules/prettier/package.json", + "./packages/data-context/node_modules/prettier/parser-angular.js", + "./packages/data-context/node_modules/prettier/parser-graphql.js", + "./packages/data-context/node_modules/prettier/parser-html.js", + "./packages/data-context/node_modules/prettier/parser-markdown.js", + "./packages/data-context/node_modules/prettier/parser-postcss.js", + "./packages/data-context/node_modules/prettier/parser-yaml.js", "./packages/data-context/node_modules/semver/classes/comparator.js", "./packages/data-context/node_modules/semver/classes/range.js", "./packages/data-context/node_modules/semver/classes/semver.js", @@ -3987,6 +3987,8 @@ "./packages/proxy/lib/http/util/inject.ts", "./packages/proxy/lib/http/util/replace_stream.ts", "./packages/proxy/lib/http/util/rewriter.ts", + "./packages/proxy/lib/http/util/service-worker-injector.ts", + "./packages/proxy/lib/http/util/service-worker-manager.ts", "./packages/proxy/lib/http/util/top-simulation.ts", "./packages/proxy/lib/index.ts", "./packages/proxy/lib/network-proxy.ts", @@ -4114,6 +4116,7 @@ "./packages/server/lib/util/env-editors.ts", "./packages/server/lib/util/env.js", "./packages/server/lib/util/escape_filename.ts", + "./packages/server/lib/util/exit.js", "./packages/server/lib/util/file-opener.ts", "./packages/server/lib/util/find_process.js", "./packages/server/lib/util/fs.ts", @@ -4142,6 +4145,7 @@ "./packages/server/lib/util/terminal.js", "./packages/server/lib/util/tests_utils.ts", "./packages/server/lib/util/tty.js", + "./packages/server/node_modules/@babel/parser/lib/index.js", "./packages/server/node_modules/@benmalka/foxdriver/build/index.js", "./packages/server/node_modules/@benmalka/foxdriver/build/launcher.js", "./packages/server/node_modules/@benmalka/foxdriver/build/logger.js", @@ -4192,7 +4196,6 @@ "./packages/server/node_modules/cross-spawn/lib/util/resolveCommand.js", "./packages/server/node_modules/execa/index.js", "./packages/server/node_modules/execa/lib/stdio.js", - "./packages/server/node_modules/execa/node_modules/signal-exit/index.js", "./packages/server/node_modules/get-stream/index.js", "./packages/server/node_modules/glob/common.js", "./packages/server/node_modules/graceful-fs/clone.js", @@ -4314,5 +4317,5 @@ "./tooling/v8-snapshot/cache/linux/snapshot-entry.js" ], "deferredHashFile": "yarn.lock", - "deferredHash": "eac0b3a082ef15b9e9470322b24f2a5a7ff7f3f04194507c10c5a02113fc5b6d" + "deferredHash": "19d942f2dc5e92bec7cbf53d697de6876ceae896f8e5edb0bfa9e4ac80ad6d10" } \ No newline at end of file diff --git a/tooling/v8-snapshot/cache/win32/snapshot-meta.json b/tooling/v8-snapshot/cache/win32/snapshot-meta.json index 5c8be345ff62..08caf1536229 100644 --- a/tooling/v8-snapshot/cache/win32/snapshot-meta.json +++ b/tooling/v8-snapshot/cache/win32/snapshot-meta.json @@ -25,6 +25,7 @@ "./node_modules/express/node_modules/debug/src/node.js", "./node_modules/finalhandler/node_modules/debug/src/node.js", "./node_modules/firefox-profile/node_modules/jsonfile/index.js", + "./node_modules/flatted/cjs/index.js", "./node_modules/fs-extra/node_modules/jsonfile/index.js", "./node_modules/get-package-info/node_modules/debug/src/node.js", "./node_modules/graceful-fs/polyfills.js", @@ -49,7 +50,6 @@ "./node_modules/stream-parser/node_modules/debug/src/node.js", "./node_modules/tcp-port-used/node_modules/debug/src/node.js", "./node_modules/trash/node_modules/make-dir/index.js", - "./node_modules/utif/UTIF.js", "./packages/data-context/node_modules/@babel/generator/node_modules/@babel/types/lib/definitions/core.js", "./packages/data-context/node_modules/debug/src/node.js", "./packages/data-context/node_modules/minimatch/minimatch.js", @@ -76,7 +76,6 @@ "./packages/server/node_modules/graceful-fs/polyfills.js", "./packages/server/node_modules/is-ci/index.js", "./packages/server/node_modules/mocha/node_modules/debug/src/node.js", - "./packages/server/node_modules/signal-exit/index.js", "./process-nextick-args/index.js", "./signal-exit/index.js", "./ws/lib/websocket.js" @@ -178,6 +177,8 @@ "./node_modules/@cypress/commit-info/node_modules/semver/semver.js", "./node_modules/@cypress/get-windows-proxy/node_modules/debug/src/browser.js", "./node_modules/@cypress/get-windows-proxy/node_modules/debug/src/index.js", + "./node_modules/@cypress/get-windows-proxy/node_modules/registry-js/dist/lib/index.js", + "./node_modules/@cypress/get-windows-proxy/node_modules/registry-js/dist/lib/registry.js", "./node_modules/@cypress/request-promise/lib/rp.js", "./node_modules/@cypress/request/index.js", "./node_modules/@cypress/request/lib/helpers.js", @@ -195,6 +196,14 @@ "./node_modules/@jimp/jpeg/node_modules/jpeg-js/lib/decoder.js", "./node_modules/@jimp/plugin-print/dist/index.js", "./node_modules/@jimp/plugins/dist/index.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/chunkstream.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/filter-parse-async.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/packer-async.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/packer-sync.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/parser-async.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/parser-sync.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/png.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/sync-inflate.js", "./node_modules/@jimp/tiff/dist/index.js", "./node_modules/@jimp/types/dist/index.js", "./node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js", @@ -255,7 +264,6 @@ "./node_modules/cp-file/fs.js", "./node_modules/cp-file/node_modules/semver/semver.js", "./node_modules/cp-file/progress-emitter.js", - "./node_modules/cross-fetch/node_modules/node-fetch/lib/index.js", "./node_modules/cross-spawn-async/lib/parse.js", "./node_modules/cross-spawn-async/lib/resolveCommand.js", "./node_modules/debug/src/browser.js", @@ -294,7 +302,6 @@ "./node_modules/firefox-profile/node_modules/fs-extra/lib/json/index.js", "./node_modules/firefox-profile/node_modules/fs-extra/lib/json/jsonfile.js", "./node_modules/firefox-profile/node_modules/fs-extra/lib/path-exists/index.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/xml2js.js", "./node_modules/fluent-ffmpeg/index.js", "./node_modules/fluent-ffmpeg/lib/fluent-ffmpeg.js", "./node_modules/fluent-ffmpeg/lib/utils.js", @@ -310,9 +317,6 @@ "./node_modules/fs-extra/lib/json/jsonfile.js", "./node_modules/fs-extra/lib/path-exists/index.js", "./node_modules/getenv/index.js", - "./node_modules/gifwrap/src/gifcodec.js", - "./node_modules/gifwrap/src/gifutil.js", - "./node_modules/gifwrap/src/index.js", "./node_modules/glob-parent/index.js", "./node_modules/globby/stream-utils.js", "./node_modules/graceful-fs/graceful-fs.js", @@ -332,9 +336,11 @@ "./node_modules/iconv-lite/lib/index.js", "./node_modules/iconv-lite/lib/streams.js", "./node_modules/ignore/index.js", + "./node_modules/image-q/dist/cjs/image-q.cjs", "./node_modules/image-size/dist/fs.promises.js", "./node_modules/image-size/dist/index.js", "./node_modules/isexe/index.js", + "./node_modules/isomorphic-fetch/fetch-npm-node.js", "./node_modules/istextorbinary/edition-es2019/index.js", "./node_modules/jimp/dist/index.js", "./node_modules/jose/dist/node/cjs/lib/buffer_utils.js", @@ -418,6 +424,7 @@ "./node_modules/nexus/dist/typegenMetadata.js", "./node_modules/nexus/dist/typegenUtils.js", "./node_modules/nexus/dist/utils.js", + "./node_modules/node-fetch/lib/index.js", "./node_modules/node-forge/lib/aes.js", "./node_modules/node-forge/lib/aesCipherSuites.js", "./node_modules/node-forge/lib/asn1-validator.js", @@ -464,6 +471,7 @@ "./node_modules/os-homedir/index.js", "./node_modules/pako/lib/utils/strings.js", "./node_modules/pako/lib/zlib/trees.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/xml2js.js", "./node_modules/performance-now/lib/performance-now.js", "./node_modules/phin/lib/phin.compiled.js", "./node_modules/picomatch/index.js", @@ -471,15 +479,6 @@ "./node_modules/picomatch/lib/picomatch.js", "./node_modules/pidusage/lib/stats.js", "./node_modules/pinkie/index.js", - "./node_modules/pngjs/lib/chunkstream.js", - "./node_modules/pngjs/lib/filter-parse-async.js", - "./node_modules/pngjs/lib/packer-async.js", - "./node_modules/pngjs/lib/packer-sync.js", - "./node_modules/pngjs/lib/parser-async.js", - "./node_modules/pngjs/lib/parser-sync.js", - "./node_modules/pngjs/lib/png.js", - "./node_modules/pngjs/lib/sync-inflate.js", - "./node_modules/prettier/parser-glimmer.js", "./node_modules/process-nextick-args/index.js", "./node_modules/pseudomap/map.js", "./node_modules/pumpify/index.js", @@ -600,6 +599,7 @@ "./node_modules/utf8-stream/node_modules/readable-stream/lib/_stream_transform.js", "./node_modules/utf8-stream/node_modules/readable-stream/lib/_stream_writable.js", "./node_modules/utf8-stream/node_modules/readable-stream/transform.js", + "./node_modules/utif2/UTIF.js", "./node_modules/util-deprecate/node.js", "./node_modules/uuid/dist/index.js", "./node_modules/uuid/dist/md5.js", @@ -671,6 +671,14 @@ "./packages/data-context/node_modules/fs-extra/lib/json/jsonfile.js", "./packages/data-context/node_modules/fs-extra/lib/path-exists/index.js", "./packages/data-context/node_modules/get-stream/buffer-stream.js", + "./packages/data-context/node_modules/prettier/index.js", + "./packages/data-context/node_modules/prettier/parser-babel.js", + "./packages/data-context/node_modules/prettier/parser-espree.js", + "./packages/data-context/node_modules/prettier/parser-flow.js", + "./packages/data-context/node_modules/prettier/parser-glimmer.js", + "./packages/data-context/node_modules/prettier/parser-meriyah.js", + "./packages/data-context/node_modules/prettier/parser-typescript.js", + "./packages/data-context/node_modules/prettier/third-party.js", "./packages/data-context/node_modules/readdirp/index.js", "./packages/data-context/node_modules/supports-color/index.js", "./packages/data-context/src/DataActions.ts", @@ -767,7 +775,6 @@ "./packages/server/lib/util/app_data.js", "./packages/server/lib/util/chrome_policy_check.js", "./packages/server/lib/util/cookies.ts", - "./packages/server/lib/util/exit.js", "./packages/server/lib/util/file.js", "./packages/server/lib/util/glob.js", "./packages/server/lib/util/profile_cleaner.js", @@ -786,7 +793,6 @@ "./packages/server/node_modules/cross-spawn/node_modules/semver/semver.js", "./packages/server/node_modules/duplexify/index.js", "./packages/server/node_modules/execa/lib/errname.js", - "./packages/server/node_modules/execa/node_modules/signal-exit/signals.js", "./packages/server/node_modules/get-stream/buffer-stream.js", "./packages/server/node_modules/glob/glob.js", "./packages/server/node_modules/glob/sync.js", @@ -830,7 +836,6 @@ "./packages/server/node_modules/send/node_modules/debug/src/index.js", "./packages/server/node_modules/send/node_modules/debug/src/node.js", "./packages/server/node_modules/send/node_modules/mime/mime.js", - "./packages/server/node_modules/signal-exit/signals.js", "./packages/server/node_modules/supports-color/index.js", "./packages/server/start-cypress.js", "./packages/server/v8-snapshot-entry.js", @@ -950,34 +955,6 @@ "./node_modules/@babel/plugin-syntax-jsx/lib/index.js", "./node_modules/@babel/plugin-syntax-typescript/lib/index.js", "./node_modules/@babel/preset-typescript/package.json", - "./node_modules/@babel/runtime/helpers/arrayLikeToArray.js", - "./node_modules/@babel/runtime/helpers/arrayWithHoles.js", - "./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js", - "./node_modules/@babel/runtime/helpers/assertThisInitialized.js", - "./node_modules/@babel/runtime/helpers/classCallCheck.js", - "./node_modules/@babel/runtime/helpers/construct.js", - "./node_modules/@babel/runtime/helpers/createClass.js", - "./node_modules/@babel/runtime/helpers/defineProperty.js", - "./node_modules/@babel/runtime/helpers/extends.js", - "./node_modules/@babel/runtime/helpers/getPrototypeOf.js", - "./node_modules/@babel/runtime/helpers/inherits.js", - "./node_modules/@babel/runtime/helpers/interopRequireDefault.js", - "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js", - "./node_modules/@babel/runtime/helpers/isNativeReflectConstruct.js", - "./node_modules/@babel/runtime/helpers/iterableToArray.js", - "./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js", - "./node_modules/@babel/runtime/helpers/nonIterableRest.js", - "./node_modules/@babel/runtime/helpers/nonIterableSpread.js", - "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js", - "./node_modules/@babel/runtime/helpers/regeneratorRuntime.js", - "./node_modules/@babel/runtime/helpers/setPrototypeOf.js", - "./node_modules/@babel/runtime/helpers/slicedToArray.js", - "./node_modules/@babel/runtime/helpers/toConsumableArray.js", - "./node_modules/@babel/runtime/helpers/toPrimitive.js", - "./node_modules/@babel/runtime/helpers/toPropertyKey.js", - "./node_modules/@babel/runtime/helpers/typeof.js", - "./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js", - "./node_modules/@babel/runtime/regenerator/index.js", "./node_modules/@babel/template/lib/builder.js", "./node_modules/@babel/template/lib/formatters.js", "./node_modules/@babel/template/lib/index.js", @@ -1112,7 +1089,10 @@ "./node_modules/@jimp/core/dist/utils/image-bitmap.js", "./node_modules/@jimp/core/dist/utils/mime.js", "./node_modules/@jimp/core/dist/utils/promisify.js", + "./node_modules/@jimp/core/node_modules/file-type/core.js", "./node_modules/@jimp/core/node_modules/file-type/index.js", + "./node_modules/@jimp/core/node_modules/file-type/supported.js", + "./node_modules/@jimp/core/node_modules/file-type/util.js", "./node_modules/@jimp/gif/dist/index.js", "./node_modules/@jimp/jpeg/node_modules/jpeg-js/lib/encoder.js", "./node_modules/@jimp/plugin-blit/dist/index.js", @@ -1140,6 +1120,20 @@ "./node_modules/@jimp/plugin-shadow/dist/index.js", "./node_modules/@jimp/plugin-threshold/dist/index.js", "./node_modules/@jimp/png/dist/index.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/bitmapper.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/bitpacker.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/constants.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/crc.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/filter-pack.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/filter-parse-sync.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/filter-parse.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/format-normaliser.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/interlace.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/packer.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/paeth-predictor.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/parser.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/png-sync.js", + "./node_modules/@jimp/png/node_modules/pngjs/lib/sync-reader.js", "./node_modules/@jimp/utils/dist/index.js", "./node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js", "./node_modules/@jridgewell/set-array/dist/set-array.umd.js", @@ -1622,7 +1616,6 @@ "./node_modules/chrome-remote-interface/node_modules/ws/lib/validation.js", "./node_modules/ci-info/index.js", "./node_modules/ci-info/vendors.json", - "./node_modules/circular-json/build/circular-json.node.js", "./node_modules/cli-truncate/index.js", "./node_modules/cli-truncate/node_modules/slice-ansi/index.js", "./node_modules/coffeescript/lib/coffeescript/lexer.js", @@ -1915,11 +1908,6 @@ "./node_modules/firefox-profile/node_modules/jsonfile/node_modules/universalify/index.js", "./node_modules/firefox-profile/node_modules/jsonfile/utils.js", "./node_modules/firefox-profile/node_modules/universalify/index.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/bom.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/builder.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/defaults.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/parser.js", - "./node_modules/firefox-profile/node_modules/xml2js/lib/processors.js", "./node_modules/fluent-ffmpeg/lib/capabilities.js", "./node_modules/fluent-ffmpeg/lib/ffprobe.js", "./node_modules/fluent-ffmpeg/lib/options/audio.js", @@ -1999,7 +1987,10 @@ "./node_modules/getos/os.json", "./node_modules/gifwrap/src/bitmapimage.js", "./node_modules/gifwrap/src/gif.js", + "./node_modules/gifwrap/src/gifcodec.js", "./node_modules/gifwrap/src/gifframe.js", + "./node_modules/gifwrap/src/gifutil.js", + "./node_modules/gifwrap/src/index.js", "./node_modules/glob-base/index.js", "./node_modules/glob-base/node_modules/glob-parent/index.js", "./node_modules/glob-base/node_modules/is-extglob/index.js", @@ -2178,7 +2169,7 @@ "./node_modules/iconv-lite/encodings/utf7.js", "./node_modules/iconv-lite/lib/bom-handling.js", "./node_modules/iconv-lite/lib/extend-node.js", - "./node_modules/image-q/dist/iq.js", + "./node_modules/ieee754/index.js", "./node_modules/image-size/dist/detector.js", "./node_modules/image-size/dist/readUInt.js", "./node_modules/image-size/dist/types.js", @@ -2263,7 +2254,6 @@ "./node_modules/jose/dist/node/cjs/lib/decrypt_key_management.js", "./node_modules/jose/dist/node/cjs/lib/encrypt_key_management.js", "./node_modules/jose/dist/node/cjs/lib/epoch.js", - "./node_modules/jose/dist/node/cjs/lib/format_pem.js", "./node_modules/jose/dist/node/cjs/lib/invalid_key_input.js", "./node_modules/jose/dist/node/cjs/lib/is_disjoint.js", "./node_modules/jose/dist/node/cjs/lib/is_object.js", @@ -2284,7 +2274,6 @@ "./node_modules/jose/dist/node/cjs/runtime/dsa_digest.js", "./node_modules/jose/dist/node/cjs/runtime/ecdhes.js", "./node_modules/jose/dist/node/cjs/runtime/encrypt.js", - "./node_modules/jose/dist/node/cjs/runtime/env.js", "./node_modules/jose/dist/node/cjs/runtime/fetch_jwks.js", "./node_modules/jose/dist/node/cjs/runtime/flags.js", "./node_modules/jose/dist/node/cjs/runtime/generate.js", @@ -2296,12 +2285,14 @@ "./node_modules/jose/dist/node/cjs/runtime/pbes2kw.js", "./node_modules/jose/dist/node/cjs/runtime/random.js", "./node_modules/jose/dist/node/cjs/runtime/rsaes.js", + "./node_modules/jose/dist/node/cjs/runtime/runtime.js", "./node_modules/jose/dist/node/cjs/runtime/timing_safe_equal.js", "./node_modules/jose/dist/node/cjs/runtime/zlib.js", "./node_modules/jose/dist/node/cjs/util/base64url.js", "./node_modules/jose/dist/node/cjs/util/decode_jwt.js", "./node_modules/jose/dist/node/cjs/util/decode_protected_header.js", "./node_modules/jose/dist/node/cjs/util/errors.js", + "./node_modules/jose/dist/node/cjs/util/runtime.js", "./node_modules/js-tokens/index.js", "./node_modules/jsesc/jsesc.js", "./node_modules/json-schema/lib/validate.js", @@ -2473,7 +2464,6 @@ "./node_modules/min-indent/index.js", "./node_modules/minimatch/node_modules/brace-expansion/index.js", "./node_modules/minimist/index.js", - "./node_modules/mkdirp/index.js", "./node_modules/mocha-7.0.1/lib/browser/progress.js", "./node_modules/mocha-7.0.1/lib/context.js", "./node_modules/mocha-7.0.1/lib/errors.js", @@ -2647,6 +2637,11 @@ "./node_modules/parse-bmfont-binary/index.js", "./node_modules/parse-bmfont-xml/lib/index.js", "./node_modules/parse-bmfont-xml/lib/parse-attribs.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/bom.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/builder.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/defaults.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/parser.js", + "./node_modules/parse-bmfont-xml/node_modules/xml2js/lib/processors.js", "./node_modules/parse-glob/index.js", "./node_modules/parse-glob/node_modules/is-extglob/index.js", "./node_modules/parse-glob/node_modules/is-glob/index.js", @@ -2659,6 +2654,10 @@ "./node_modules/path-root-regex/index.js", "./node_modules/path-root/index.js", "./node_modules/path-type/index.js", + "./node_modules/peek-readable/lib/Deferred.js", + "./node_modules/peek-readable/lib/EndOfFileStream.js", + "./node_modules/peek-readable/lib/StreamReader.js", + "./node_modules/peek-readable/lib/index.js", "./node_modules/picocolors/picocolors.js", "./node_modules/picomatch/lib/parse.js", "./node_modules/picomatch/lib/scan.js", @@ -2711,23 +2710,10 @@ "./node_modules/plist/node_modules/xmlbuilder/lib/XMLWriterBase.js", "./node_modules/plist/node_modules/xmlbuilder/lib/index.js", "./node_modules/pluralize/pluralize.js", - "./node_modules/pngjs/lib/bitmapper.js", - "./node_modules/pngjs/lib/bitpacker.js", - "./node_modules/pngjs/lib/constants.js", - "./node_modules/pngjs/lib/crc.js", - "./node_modules/pngjs/lib/filter-pack.js", - "./node_modules/pngjs/lib/filter-parse-sync.js", - "./node_modules/pngjs/lib/filter-parse.js", - "./node_modules/pngjs/lib/format-normaliser.js", - "./node_modules/pngjs/lib/interlace.js", - "./node_modules/pngjs/lib/packer.js", - "./node_modules/pngjs/lib/paeth-predictor.js", - "./node_modules/pngjs/lib/parser.js", - "./node_modules/pngjs/lib/png-sync.js", - "./node_modules/pngjs/lib/sync-reader.js", "./node_modules/prettier/doc.js", "./node_modules/prettier/package.json", "./node_modules/prettier/parser-angular.js", + "./node_modules/prettier/parser-glimmer.js", "./node_modules/prettier/parser-graphql.js", "./node_modules/prettier/parser-html.js", "./node_modules/prettier/parser-markdown.js", @@ -3320,6 +3306,13 @@ "./node_modules/strip-ansi/index.js", "./node_modules/strip-eof/index.js", "./node_modules/strip-final-newline/index.js", + "./node_modules/strtok3/lib/AbstractTokenizer.js", + "./node_modules/strtok3/lib/BufferTokenizer.js", + "./node_modules/strtok3/lib/FileTokenizer.js", + "./node_modules/strtok3/lib/FsPromise.js", + "./node_modules/strtok3/lib/ReadStreamTokenizer.js", + "./node_modules/strtok3/lib/core.js", + "./node_modules/strtok3/lib/index.js", "./node_modules/supports-color/node_modules/has-flag/index.js", "./node_modules/syntax-error/index.js", "./node_modules/systeminformation/lib/audio.js", @@ -3348,11 +3341,12 @@ "./node_modules/textextensions/edition-es5/index.js", "./node_modules/through/index.js", "./node_modules/timm/lib/timm.js", - "./node_modules/tinycolor2/tinycolor.js", + "./node_modules/tinycolor2/cjs/tinycolor.js", "./node_modules/to-fast-properties/index.js", "./node_modules/to-regex-range/index.js", "./node_modules/to-regex-range/node_modules/is-number/index.js", "./node_modules/toidentifier/index.js", + "./node_modules/token-types/lib/index.js", "./node_modules/tough-cookie/lib/memstore.js", "./node_modules/tough-cookie/lib/pathMatch.js", "./node_modules/tough-cookie/lib/permuteDomain.js", @@ -3727,6 +3721,14 @@ "./packages/data-context/node_modules/get-stream/index.js", "./packages/data-context/node_modules/micromatch/index.js", "./packages/data-context/node_modules/path-key/index.js", + "./packages/data-context/node_modules/prettier/doc.js", + "./packages/data-context/node_modules/prettier/package.json", + "./packages/data-context/node_modules/prettier/parser-angular.js", + "./packages/data-context/node_modules/prettier/parser-graphql.js", + "./packages/data-context/node_modules/prettier/parser-html.js", + "./packages/data-context/node_modules/prettier/parser-markdown.js", + "./packages/data-context/node_modules/prettier/parser-postcss.js", + "./packages/data-context/node_modules/prettier/parser-yaml.js", "./packages/data-context/node_modules/semver/classes/comparator.js", "./packages/data-context/node_modules/semver/classes/range.js", "./packages/data-context/node_modules/semver/classes/semver.js", @@ -3985,6 +3987,8 @@ "./packages/proxy/lib/http/util/inject.ts", "./packages/proxy/lib/http/util/replace_stream.ts", "./packages/proxy/lib/http/util/rewriter.ts", + "./packages/proxy/lib/http/util/service-worker-injector.ts", + "./packages/proxy/lib/http/util/service-worker-manager.ts", "./packages/proxy/lib/http/util/top-simulation.ts", "./packages/proxy/lib/index.ts", "./packages/proxy/lib/network-proxy.ts", @@ -4112,6 +4116,7 @@ "./packages/server/lib/util/env-editors.ts", "./packages/server/lib/util/env.js", "./packages/server/lib/util/escape_filename.ts", + "./packages/server/lib/util/exit.js", "./packages/server/lib/util/file-opener.ts", "./packages/server/lib/util/find_process.js", "./packages/server/lib/util/fs.ts", @@ -4140,6 +4145,7 @@ "./packages/server/lib/util/terminal.js", "./packages/server/lib/util/tests_utils.ts", "./packages/server/lib/util/tty.js", + "./packages/server/node_modules/@babel/parser/lib/index.js", "./packages/server/node_modules/@benmalka/foxdriver/build/index.js", "./packages/server/node_modules/@benmalka/foxdriver/build/launcher.js", "./packages/server/node_modules/@benmalka/foxdriver/build/logger.js", @@ -4190,7 +4196,6 @@ "./packages/server/node_modules/cross-spawn/lib/util/resolveCommand.js", "./packages/server/node_modules/execa/index.js", "./packages/server/node_modules/execa/lib/stdio.js", - "./packages/server/node_modules/execa/node_modules/signal-exit/index.js", "./packages/server/node_modules/get-stream/index.js", "./packages/server/node_modules/glob/common.js", "./packages/server/node_modules/graceful-fs/clone.js", @@ -4312,5 +4317,5 @@ "./tooling/v8-snapshot/cache/win32/snapshot-entry.js" ], "deferredHashFile": "yarn.lock", - "deferredHash": "30882b5fc0ea16d52dc06032f70d588e3e98eea6fd417da00b88749dd9061ae1" + "deferredHash": "bc2bd545c295dcaaaee830a354dcc4231149abbcc75f489699f5e955124738b3" } \ No newline at end of file diff --git a/tooling/v8-snapshot/src/generator/snapshot-generator.ts b/tooling/v8-snapshot/src/generator/snapshot-generator.ts index 4ddb5e6489ff..176ca9908ca9 100644 --- a/tooling/v8-snapshot/src/generator/snapshot-generator.ts +++ b/tooling/v8-snapshot/src/generator/snapshot-generator.ts @@ -86,6 +86,8 @@ export type GenerationOpts = { minify: boolean supportTypeScript: boolean integrityCheckSource: string | undefined + useExistingSnapshotScript?: boolean + updateSnapshotScriptContents?: (contents: string) => string } function getDefaultGenerationOpts (projectBaseDir: string): GenerationOpts { @@ -98,6 +100,8 @@ function getDefaultGenerationOpts (projectBaseDir: string): GenerationOpts { minify: false, supportTypeScript: false, integrityCheckSource: undefined, + useExistingSnapshotScript: false, + updateSnapshotScriptContents: undefined, } } @@ -153,6 +157,14 @@ export class SnapshotGenerator { * Path where v8context bin is stored, derived from {@link GenerationOpts} snapshotBinDir */ private v8ContextFile?: string + /** + * Whether to use an existing snapshot script instead of creating a new one. + */ + useExistingSnapshotScript?: boolean + /** + * Function to update the contents of an existing snapshot script. + */ + updateSnapshotScriptContents?: ((contents: string) => string) /** * Generated snapshot script, needs to be set before calling `makeSnapshot`. @@ -186,6 +198,8 @@ export class SnapshotGenerator { nodeEnv, minify, integrityCheckSource, + useExistingSnapshotScript, + updateSnapshotScriptContents, }: GenerationOpts = Object.assign( getDefaultGenerationOpts(projectBaseDir), opts, @@ -210,6 +224,8 @@ export class SnapshotGenerator { this.bundlerPath = getBundlerPath() this.minify = minify this.integrityCheckSource = integrityCheckSource + this.useExistingSnapshotScript = useExistingSnapshotScript + this.updateSnapshotScriptContents = updateSnapshotScriptContents const auxiliaryDataKeys = Object.keys(this.auxiliaryData || {}) @@ -235,6 +251,19 @@ export class SnapshotGenerator { * Creates the snapshot script for the provided configuration */ async createScript () { + if (this.useExistingSnapshotScript) { + let contents = await fs.promises.readFile(this.snapshotScriptPath, 'utf8') + + if (this.updateSnapshotScriptContents) { + contents = this.updateSnapshotScriptContents(contents) + } + + this.snapshotScript = Buffer.from(contents) + await fs.promises.writeFile(this.snapshotScriptPath, this.snapshotScript) + + return + } + let deferred let norewrite diff --git a/tooling/v8-snapshot/src/setup/config.ts b/tooling/v8-snapshot/src/setup/config.ts index 81ace9cf6a1a..1349d15b24de 100644 --- a/tooling/v8-snapshot/src/setup/config.ts +++ b/tooling/v8-snapshot/src/setup/config.ts @@ -1,6 +1,6 @@ import path from 'path' -type SnapshotConfig = { +export type SnapshotConfig = { appEntryFile: string cypressAppSnapshotDir: string nodeModulesOnly: boolean @@ -11,6 +11,8 @@ type SnapshotConfig = { metaFile: string minify: boolean integrityCheckSource: string | undefined + useExistingSnapshotScript?: boolean + updateSnapshotScriptContents?: (contents: string) => string } const platformString = process.platform @@ -74,11 +76,15 @@ export function createConfig ({ cypressAppPath, integrityCheckSource, supportCypressInCypress, + useExistingSnapshotScript, + updateSnapshotScriptContents, }: { env?: 'dev' | 'prod' cypressAppPath?: string integrityCheckSource: string | undefined supportCypressInCypress?: boolean + useExistingSnapshotScript?: boolean + updateSnapshotScriptContents?: (contents: string) => string }): SnapshotConfig { /** * If true only node_module dependencies are included in the snapshot. Otherwise app files are included as well @@ -105,6 +111,8 @@ export function createConfig ({ snapshotEntryFile, minify, integrityCheckSource, + useExistingSnapshotScript, + updateSnapshotScriptContents, } } diff --git a/tooling/v8-snapshot/src/setup/index.ts b/tooling/v8-snapshot/src/setup/index.ts index 8b3b635e2a0d..2998881b8549 100644 --- a/tooling/v8-snapshot/src/setup/index.ts +++ b/tooling/v8-snapshot/src/setup/index.ts @@ -5,10 +5,10 @@ import minimist from 'minimist' import { generateEntry } from './generate-entry' import { installSnapshot } from './install-snapshot' -const setupV8Snapshots = async ({ cypressAppPath, integrityCheckSource, supportCypressInCypress }: { cypressAppPath?: string, integrityCheckSource?: string, supportCypressInCypress?: boolean} = {}) => { +const setupV8Snapshots = async ({ cypressAppPath, integrityCheckSource, supportCypressInCypress, useExistingSnapshotScript, updateSnapshotScriptContents }: { cypressAppPath?: string, integrityCheckSource?: string, supportCypressInCypress?: boolean, useExistingSnapshotScript?: boolean, updateSnapshotScriptContents?: (contents: string) => string } = {}) => { try { const args = minimist(process.argv.slice(2)) - const config = createConfig({ env: args.env, cypressAppPath, integrityCheckSource, supportCypressInCypress }) + const config = createConfig({ env: args.env, cypressAppPath, integrityCheckSource, supportCypressInCypress, useExistingSnapshotScript, updateSnapshotScriptContents }) await consolidateDeps(config) diff --git a/tooling/v8-snapshot/src/setup/install-snapshot.ts b/tooling/v8-snapshot/src/setup/install-snapshot.ts index 183c77efeaac..83fb78dda104 100644 --- a/tooling/v8-snapshot/src/setup/install-snapshot.ts +++ b/tooling/v8-snapshot/src/setup/install-snapshot.ts @@ -3,6 +3,7 @@ import { SnapshotGenerator } from '../generator/snapshot-generator' import { prettyPrintError } from '../utils' import fs from 'fs-extra' import forceNoRewrite from './force-no-rewrite' +import type { SnapshotConfig } from './config' const debug = require('debug') const logInfo = debug('cypress:snapgen:info') @@ -16,6 +17,8 @@ function getSnapshotGenerator ({ resolverMap, minify, integrityCheckSource, + useExistingSnapshotScript, + updateSnapshotScriptContents, }: { nodeModulesOnly: boolean projectBaseDir: string @@ -24,6 +27,8 @@ function getSnapshotGenerator ({ resolverMap: Record minify: boolean integrityCheckSource: string | undefined + useExistingSnapshotScript?: boolean + updateSnapshotScriptContents?: (contents: string) => string }) { return new SnapshotGenerator(projectBaseDir, snapshotEntryFile, { cacheDir: snapshotCacheDir, @@ -32,6 +37,8 @@ function getSnapshotGenerator ({ forceNoRewrite, minify, integrityCheckSource, + useExistingSnapshotScript, + updateSnapshotScriptContents, }) } @@ -44,7 +51,10 @@ function getSnapshotGenerator ({ * @param {Partial} opts */ export async function installSnapshot ( - { + config: SnapshotConfig, + resolverMap, +) { + const { cypressAppSnapshotDir, nodeModulesOnly, projectBaseDir, @@ -52,9 +62,10 @@ export async function installSnapshot ( snapshotEntryFile, minify, integrityCheckSource, - }, - resolverMap, -) { + useExistingSnapshotScript, + updateSnapshotScriptContents, + } = config + try { logInfo('Generating snapshot %o', { nodeModulesOnly, @@ -68,6 +79,8 @@ export async function installSnapshot ( resolverMap, minify, integrityCheckSource, + useExistingSnapshotScript, + updateSnapshotScriptContents, }) await snapshotGenerator.createScript() diff --git a/yarn.lock b/yarn.lock index 7896eda9c724..cb74c76dbfb9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1693,11 +1693,16 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.6.tgz#043b9aa3c303c0722e5377fef9197f4cf1796549" integrity sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q== -"@babel/parser@7.23.0", "@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8", "@babel/parser@^7.16.4", "@babel/parser@^7.16.5", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.22.7", "@babel/parser@^7.23.0", "@babel/parser@^7.6.0", "@babel/parser@^7.7.0", "@babel/parser@^7.9.6": +"@babel/parser@7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8", "@babel/parser@^7.16.4", "@babel/parser@^7.16.5", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.22.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.5", "@babel/parser@^7.6.0", "@babel/parser@^7.7.0", "@babel/parser@^7.9.6": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" + integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" @@ -2807,10 +2812,10 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@cypress-design/constants-button@*": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@cypress-design/constants-button/-/constants-button-0.1.0.tgz#d32788484eda0a05ce72a53d9529ec7284174e77" - integrity sha512-HE5QQT6T8GDSgBDUBywOdnTvRXErrvGHm8YQuvj2iqzCTv9B0RhNQUVKSoyN9/LKyVcIXoa/ZaJLeTMVTlf+pg== +"@cypress-design/constants-button@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@cypress-design/constants-button/-/constants-button-0.1.3.tgz#6a3e14bbd0cf6d6c51763f3cc3b286dadc407a77" + integrity sha512-0ZBn1DvctrlypkXmclp9L8jwtaXKKBs2goPh43TgYoDNcX/IrNnmn1K/ivRcEN3Zq00qlz7Jgwv7fIxD/w8beg== "@cypress-design/constants-statusicon@^0.2.0": version "0.2.0" @@ -2858,12 +2863,12 @@ dependencies: "@cypress-design/css" "^0.15.1" -"@cypress-design/vue-button@^0.10.2": - version "0.10.2" - resolved "https://registry.yarnpkg.com/@cypress-design/vue-button/-/vue-button-0.10.2.tgz#40ca760dc76ed9516a2add4c59f06f3d5da96986" - integrity sha512-PwwdLiY3gT0qqtkfY2NJw02/nu9/U3Cea2RxdCJvq0xgVSag9w5idWe1puh6BzSNlHrjsAgdtuL+WOByGNwHJg== +"@cypress-design/vue-button@^0.11.6": + version "0.11.6" + resolved "https://registry.yarnpkg.com/@cypress-design/vue-button/-/vue-button-0.11.6.tgz#57f6a9f03034e1c84f311a1fef2ecb5cf3f50c80" + integrity sha512-tERjqnX07SV9haaq83eOJ35wJ9bW8c1xv6arVxT+mJIPqDAMeob60uUrXDY3m7xRTKNr7PjP1/gcKuuPELR/NQ== dependencies: - "@cypress-design/constants-button" "*" + "@cypress-design/constants-button" "^0.1.3" "@cypress-design/vue-icon@^0.25.0": version "0.25.0" @@ -3256,230 +3261,120 @@ ts-node "^9" tslib "^2" -"@esbuild/android-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" - integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg== - -"@esbuild/android-arm64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz#893ad71f3920ccb919e1757c387756a9bca2ef42" - integrity sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA== - -"@esbuild/android-arm@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" - integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw== - -"@esbuild/android-arm@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.15.tgz#143e0d4e4c08c786ea410b9a7739779a9a1315d8" - integrity sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg== - -"@esbuild/android-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" - integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ== - -"@esbuild/android-x64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.15.tgz#d2d12a7676b2589864281b2274355200916540bc" - integrity sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ== - -"@esbuild/darwin-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" - integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== - -"@esbuild/darwin-arm64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz#2e88e79f1d327a2a7d9d06397e5232eb0a473d61" - integrity sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA== - -"@esbuild/darwin-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" - integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg== - -"@esbuild/darwin-x64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz#9384e64c0be91388c57be6d3a5eaf1c32a99c91d" - integrity sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg== - -"@esbuild/freebsd-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" - integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw== - -"@esbuild/freebsd-arm64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz#2ad5a35bc52ebd9ca6b845dbc59ba39647a93c1a" - integrity sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg== - -"@esbuild/freebsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" - integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug== - -"@esbuild/freebsd-x64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz#b513a48446f96c75fda5bef470e64d342d4379cd" - integrity sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ== - -"@esbuild/linux-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" - integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g== - -"@esbuild/linux-arm64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz#9697b168175bfd41fa9cc4a72dd0d48f24715f31" - integrity sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA== - -"@esbuild/linux-arm@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" - integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ== - -"@esbuild/linux-arm@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz#5b22062c54f48cd92fab9ffd993732a52db70cd3" - integrity sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw== - -"@esbuild/linux-ia32@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" - integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg== - -"@esbuild/linux-ia32@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz#eb28a13f9b60b5189fcc9e98e1024f6b657ba54c" - integrity sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q== +"@esbuild/android-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" + integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== + +"@esbuild/android-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" + integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== + +"@esbuild/android-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" + integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== + +"@esbuild/darwin-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" + integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== + +"@esbuild/darwin-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" + integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== + +"@esbuild/freebsd-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" + integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== + +"@esbuild/freebsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" + integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== + +"@esbuild/linux-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" + integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== + +"@esbuild/linux-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" + integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== + +"@esbuild/linux-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" + integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== "@esbuild/linux-loong64@0.15.7": version "0.15.7" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.7.tgz#1ec4af4a16c554cbd402cc557ccdd874e3f7be53" integrity sha512-IKznSJOsVUuyt7cDzzSZyqBEcZe+7WlBqTVXiF1OXP/4Nm387ToaXZ0fyLwI1iBlI/bzpxVq411QE2/Bt2XWWw== -"@esbuild/linux-loong64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8" - integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ== - -"@esbuild/linux-loong64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz#32454bdfe144cf74b77895a8ad21a15cb81cfbe5" - integrity sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ== - -"@esbuild/linux-mips64el@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" - integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw== - -"@esbuild/linux-mips64el@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz#af12bde0d775a318fad90eb13a0455229a63987c" - integrity sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ== - -"@esbuild/linux-ppc64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" - integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g== - -"@esbuild/linux-ppc64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz#34c5ed145b2dfc493d3e652abac8bd3baa3865a5" - integrity sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg== - -"@esbuild/linux-riscv64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" - integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw== - -"@esbuild/linux-riscv64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz#87bd515e837f2eb004b45f9e6a94dc5b93f22b92" - integrity sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA== - -"@esbuild/linux-s390x@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" - integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w== - -"@esbuild/linux-s390x@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz#20bf7947197f199ddac2ec412029a414ceae3aa3" - integrity sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg== - -"@esbuild/linux-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" - integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw== - -"@esbuild/linux-x64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz#31b93f9c94c195e852c20cd3d1914a68aa619124" - integrity sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg== - -"@esbuild/netbsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" - integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA== - -"@esbuild/netbsd-x64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz#8da299b3ac6875836ca8cdc1925826498069ac65" - integrity sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA== - -"@esbuild/openbsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" - integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg== - -"@esbuild/openbsd-x64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz#04a1ec3d4e919714dba68dcf09eeb1228ad0d20c" - integrity sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w== - -"@esbuild/sunos-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" - integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw== - -"@esbuild/sunos-x64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz#6694ebe4e16e5cd7dab6505ff7c28f9c1c695ce5" - integrity sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ== - -"@esbuild/win32-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" - integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw== - -"@esbuild/win32-arm64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz#1f95b2564193c8d1fee8f8129a0609728171d500" - integrity sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q== - -"@esbuild/win32-ia32@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" - integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig== - -"@esbuild/win32-ia32@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz#c362b88b3df21916ed7bcf75c6d09c6bf3ae354a" - integrity sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w== - -"@esbuild/win32-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" - integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== - -"@esbuild/win32-x64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz#c2e737f3a201ebff8e2ac2b8e9f246b397ad19b8" - integrity sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA== +"@esbuild/linux-loong64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" + integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== + +"@esbuild/linux-mips64el@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" + integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== + +"@esbuild/linux-ppc64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" + integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== + +"@esbuild/linux-riscv64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" + integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== + +"@esbuild/linux-s390x@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" + integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== + +"@esbuild/linux-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" + integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== + +"@esbuild/netbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" + integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== + +"@esbuild/openbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" + integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== + +"@esbuild/sunos-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" + integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== + +"@esbuild/win32-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" + integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== + +"@esbuild/win32-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" + integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== + +"@esbuild/win32-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" + integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== "@eslint/eslintrc@^0.4.0": version "0.4.0" @@ -4511,294 +4406,261 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@jimp/bmp@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.14.0.tgz#6df246026554f276f7b354047c6fff9f5b2b5182" - integrity sha512-5RkX6tSS7K3K3xNEb2ygPuvyL9whjanhoaB/WmmXlJS6ub4DjTqrapu8j4qnIWmO4YYtFeTbDTXV6v9P1yMA5A== +"@jimp/bmp@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.22.12.tgz#0316044dc7b1a90274aef266d50349347fb864d4" + integrity sha512-aeI64HD0npropd+AR76MCcvvRaa+Qck6loCOS03CkkxGHN5/r336qTM5HPUdHKMDOGzqknuVPA8+kK1t03z12g== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" bmp-js "^0.1.0" -"@jimp/core@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.14.0.tgz#870c9ca25b40be353ebda1d2abb48723d9010055" - integrity sha512-S62FcKdtLtj3yWsGfJRdFXSutjvHg7aQNiFogMbwq19RP4XJWqS2nOphu7ScB8KrSlyy5nPF2hkWNhLRLyD82w== +"@jimp/core@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.22.12.tgz#70785ea7d10b138fb65bcfe9f712826f00a10e1d" + integrity sha512-l0RR0dOPyzMKfjUW1uebzueFEDtCOj9fN6pyTYWWOM/VS4BciXQ1VVrJs8pO3kycGYZxncRKhCoygbNr8eEZQA== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" any-base "^1.1.0" buffer "^5.2.0" exif-parser "^0.1.12" - file-type "^9.0.0" - load-bmfont "^1.3.1" - mkdirp "^0.5.1" - phin "^2.9.1" + file-type "^16.5.4" + isomorphic-fetch "^3.0.0" pixelmatch "^4.0.2" - tinycolor2 "^1.4.1" + tinycolor2 "^1.6.0" -"@jimp/custom@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.14.0.tgz#1dbbf0094df7403f4e03bc984ed92e7458842f74" - integrity sha512-kQJMeH87+kWJdVw8F9GQhtsageqqxrvzg7yyOw3Tx/s7v5RToe8RnKyMM+kVtBJtNAG+Xyv/z01uYQ2jiZ3GwA== +"@jimp/custom@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.22.12.tgz#236f2a3f016b533c50869ff22ad1ac00dd0c36be" + integrity sha512-xcmww1O/JFP2MrlGUMd3Q78S3Qu6W3mYTXYuIqFq33EorgYHV/HqymHfXy9GjiCJ7OI+7lWx6nYFOzU7M4rd1Q== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/core" "^0.14.0" + "@jimp/core" "^0.22.12" -"@jimp/gif@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.14.0.tgz#db159f57c3cfd1566bbe8b124958791998614960" - integrity sha512-DHjoOSfCaCz72+oGGEh8qH0zE6pUBaBxPxxmpYJjkNyDZP7RkbBkZJScIYeQ7BmJxmGN4/dZn+MxamoQlr+UYg== +"@jimp/gif@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.22.12.tgz#6caccb45df497fb971b7a88690345596e22163c0" + integrity sha512-y6BFTJgch9mbor2H234VSjd9iwAhaNf/t3US5qpYIs0TSbAvM02Fbc28IaDETj9+4YB4676sz4RcN/zwhfu1pg== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" - gifwrap "^0.9.2" + "@jimp/utils" "^0.22.12" + gifwrap "^0.10.1" omggif "^1.0.9" -"@jimp/jpeg@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.14.0.tgz#8a687a6a653bbbae38c522edef8f84bb418d9461" - integrity sha512-561neGbr+87S/YVQYnZSTyjWTHBm9F6F1obYHiyU3wVmF+1CLbxY3FQzt4YolwyQHIBv36Bo0PY2KkkU8BEeeQ== +"@jimp/jpeg@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.22.12.tgz#b5c74a5aac9826245311370dda8c71a1fcca05ed" + integrity sha512-Rq26XC/uQWaQKyb/5lksCTCxXhtY01NJeBN+dQv5yNYedN0i7iYu+fXEoRsfaJ8xZzjoANH8sns7rVP4GE7d/Q== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" - jpeg-js "^0.4.0" + "@jimp/utils" "^0.22.12" + jpeg-js "^0.4.4" -"@jimp/plugin-blit@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.14.0.tgz#5eb374be1201313b2113899fb842232d8fcfd345" - integrity sha512-YoYOrnVHeX3InfgbJawAU601iTZMwEBZkyqcP1V/S33Qnz9uzH1Uj1NtC6fNgWzvX6I4XbCWwtr4RrGFb5CFrw== +"@jimp/plugin-blit@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.22.12.tgz#0fa8320767fda77434b4408798655ff7c7e415d4" + integrity sha512-xslz2ZoFZOPLY8EZ4dC29m168BtDx95D6K80TzgUi8gqT7LY6CsajWO0FAxDwHz6h0eomHMfyGX0stspBrTKnQ== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" -"@jimp/plugin-blur@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.14.0.tgz#fe07e4932d5a2f5d8c9831e245561553224bfc60" - integrity sha512-9WhZcofLrT0hgI7t0chf7iBQZib//0gJh9WcQMUt5+Q1Bk04dWs8vTgLNj61GBqZXgHSPzE4OpCrrLDBG8zlhQ== +"@jimp/plugin-blur@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.22.12.tgz#0c37b2ff4e588b45f4307b4f13d3d0eef813920d" + integrity sha512-S0vJADTuh1Q9F+cXAwFPlrKWzDj2F9t/9JAbUvaaDuivpyWuImEKXVz5PUZw2NbpuSHjwssbTpOZ8F13iJX4uw== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" -"@jimp/plugin-circle@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-circle/-/plugin-circle-0.14.0.tgz#82c0e904a34e90fa672fb9c286bc892e92088ddf" - integrity sha512-o5L+wf6QA44tvTum5HeLyLSc5eVfIUd5ZDVi5iRfO4o6GT/zux9AxuTSkKwnjhsG8bn1dDmywAOQGAx7BjrQVA== +"@jimp/plugin-circle@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-circle/-/plugin-circle-0.22.12.tgz#9fffda83d3fc5bad8c1e1492b15b1433cb42e16e" + integrity sha512-SWVXx1yiuj5jZtMijqUfvVOJBwOifFn0918ou4ftoHgegc5aHWW5dZbYPjvC9fLpvz7oSlptNl2Sxr1zwofjTg== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" -"@jimp/plugin-color@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.14.0.tgz#772bd2d80a88bc66ea1331d010207870f169a74b" - integrity sha512-JJz512SAILYV0M5LzBb9sbOm/XEj2fGElMiHAxb7aLI6jx+n0agxtHpfpV/AePTLm1vzzDxx6AJxXbKv355hBQ== +"@jimp/plugin-color@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.22.12.tgz#1e49f2e7387186507e917b0686599767c15be336" + integrity sha512-xImhTE5BpS8xa+mAN6j4sMRWaUgUDLoaGHhJhpC+r7SKKErYDR0WQV4yCE4gP+N0gozD0F3Ka1LUSaMXrn7ZIA== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" - tinycolor2 "^1.4.1" + "@jimp/utils" "^0.22.12" + tinycolor2 "^1.6.0" -"@jimp/plugin-contain@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.14.0.tgz#c68115420d182e696f81bbe76fb5e704909b2b6a" - integrity sha512-RX2q233lGyaxiMY6kAgnm9ScmEkNSof0hdlaJAVDS1OgXphGAYAeSIAwzESZN4x3ORaWvkFefeVH9O9/698Evg== +"@jimp/plugin-contain@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.22.12.tgz#ed5ed9af3d4afd02a7568ff8d60603cff340e3f3" + integrity sha512-Eo3DmfixJw3N79lWk8q/0SDYbqmKt1xSTJ69yy8XLYQj9svoBbyRpSnHR+n9hOw5pKXytHwUW6nU4u1wegHNoQ== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" -"@jimp/plugin-cover@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.14.0.tgz#4755322589c5885e44e14e31b86b542e907297ce" - integrity sha512-0P/5XhzWES4uMdvbi3beUgfvhn4YuQ/ny8ijs5kkYIw6K8mHcl820HahuGpwWMx56DJLHRl1hFhJwo9CeTRJtQ== +"@jimp/plugin-cover@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.22.12.tgz#4abbfabe4c78c71d8d46e707c35a65dc55f08afd" + integrity sha512-z0w/1xH/v/knZkpTNx+E8a7fnasQ2wHG5ze6y5oL2dhH1UufNua8gLQXlv8/W56+4nJ1brhSd233HBJCo01BXA== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" -"@jimp/plugin-crop@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.14.0.tgz#4cbd856ca84ffc37230fad2534906f2f75aa3057" - integrity sha512-Ojtih+XIe6/XSGtpWtbAXBozhCdsDMmy+THUJAGu2x7ZgKrMS0JotN+vN2YC3nwDpYkM+yOJImQeptSfZb2Sug== +"@jimp/plugin-crop@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.22.12.tgz#e28329a9f285071442998560b040048d2ef5c32e" + integrity sha512-FNuUN0OVzRCozx8XSgP9MyLGMxNHHJMFt+LJuFjn1mu3k0VQxrzqbN06yIl46TVejhyAhcq5gLzqmSCHvlcBVw== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" -"@jimp/plugin-displace@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.14.0.tgz#b0e6a57d00cb1f893f541413fe9d737d23c3b70c" - integrity sha512-c75uQUzMgrHa8vegkgUvgRL/PRvD7paFbFJvzW0Ugs8Wl+CDMGIPYQ3j7IVaQkIS+cAxv+NJ3TIRBQyBrfVEOg== +"@jimp/plugin-displace@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.22.12.tgz#2e4b2b989a23da6687c49f2f628e1e6d686ec9b6" + integrity sha512-qpRM8JRicxfK6aPPqKZA6+GzBwUIitiHaZw0QrJ64Ygd3+AsTc7BXr+37k2x7QcyCvmKXY4haUrSIsBug4S3CA== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" -"@jimp/plugin-dither@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.14.0.tgz#9185ec4c38e02edc9e5831f5d709f6ba891e1b93" - integrity sha512-g8SJqFLyYexXQQsoh4dc1VP87TwyOgeTElBcxSXX2LaaMZezypmxQfLTzOFzZoK8m39NuaoH21Ou1Ftsq7LzVQ== +"@jimp/plugin-dither@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.22.12.tgz#3cc5f3a58dbf85653c4e532d31a756a4fc8cabf7" + integrity sha512-jYgGdSdSKl1UUEanX8A85v4+QUm+PE8vHFwlamaKk89s+PXQe7eVE3eNeSZX4inCq63EHL7cX580dMqkoC3ZLw== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" -"@jimp/plugin-fisheye@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-fisheye/-/plugin-fisheye-0.14.0.tgz#9f26346cf2fbc660cc2008cd7fd30a83b5029e78" - integrity sha512-BFfUZ64EikCaABhCA6mR3bsltWhPpS321jpeIQfJyrILdpFsZ/OccNwCgpW1XlbldDHIoNtXTDGn3E+vCE7vDg== +"@jimp/plugin-fisheye@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-fisheye/-/plugin-fisheye-0.22.12.tgz#77aef2f3ec59c0bafbd2dbc94b89eab60ce05a3e" + integrity sha512-LGuUTsFg+fOp6KBKrmLkX4LfyCy8IIsROwoUvsUPKzutSqMJnsm3JGDW2eOmWIS/jJpPaeaishjlxvczjgII+Q== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" -"@jimp/plugin-flip@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.14.0.tgz#7966d6aa3b5fe1aa4d2d561ff12b8ef5ccb9b071" - integrity sha512-WtL1hj6ryqHhApih+9qZQYA6Ye8a4HAmdTzLbYdTMrrrSUgIzFdiZsD0WeDHpgS/+QMsWwF+NFmTZmxNWqKfXw== +"@jimp/plugin-flip@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.22.12.tgz#7e2154592da01afcf165a3f9d1d25032aa8d8c57" + integrity sha512-m251Rop7GN8W0Yo/rF9LWk6kNclngyjIJs/VXHToGQ6EGveOSTSQaX2Isi9f9lCDLxt+inBIb7nlaLLxnvHX8Q== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" -"@jimp/plugin-gaussian@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.14.0.tgz#452bc1971a4467ad9b984aa67f4c200bf941bb65" - integrity sha512-uaLwQ0XAQoydDlF9tlfc7iD9drYPriFe+jgYnWm8fbw5cN+eOIcnneEX9XCOOzwgLPkNCxGox6Kxjn8zY6GxtQ== +"@jimp/plugin-gaussian@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.22.12.tgz#49a40950cedbbea6c84b3a6bccc45365fe78d6b7" + integrity sha512-sBfbzoOmJ6FczfG2PquiK84NtVGeScw97JsCC3rpQv1PHVWyW+uqWFF53+n3c8Y0P2HWlUjflEla2h/vWShvhg== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" -"@jimp/plugin-invert@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.14.0.tgz#cd31a555860e9f821394936d15af161c09c42921" - integrity sha512-UaQW9X9vx8orQXYSjT5VcITkJPwDaHwrBbxxPoDG+F/Zgv4oV9fP+udDD6qmkgI9taU+44Fy+zm/J/gGcMWrdg== +"@jimp/plugin-invert@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.22.12.tgz#c569e85c1f59911a9a33ef36a51c9cf26065078e" + integrity sha512-N+6rwxdB+7OCR6PYijaA/iizXXodpxOGvT/smd/lxeXsZ/empHmFFFJ/FaXcYh19Tm04dGDaXcNF/dN5nm6+xQ== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" -"@jimp/plugin-mask@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.14.0.tgz#52619643ac6222f85e6b27dee33c771ca3a6a4c9" - integrity sha512-tdiGM69OBaKtSPfYSQeflzFhEpoRZ+BvKfDEoivyTjauynbjpRiwB1CaiS8En1INTDwzLXTT0Be9SpI3LkJoEA== +"@jimp/plugin-mask@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.22.12.tgz#0ac0d9c282f403255b126556521f90fb8e2997f0" + integrity sha512-4AWZg+DomtpUA099jRV8IEZUfn1wLv6+nem4NRJC7L/82vxzLCgXKTxvNvBcNmJjT9yS1LAAmiJGdWKXG63/NA== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" -"@jimp/plugin-normalize@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.14.0.tgz#bf39e356b6d473f582ce95633ad49c9cdb82492b" - integrity sha512-AfY8sqlsbbdVwFGcyIPy5JH/7fnBzlmuweb+Qtx2vn29okq6+HelLjw2b+VT2btgGUmWWHGEHd86oRGSoWGyEQ== +"@jimp/plugin-normalize@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.22.12.tgz#6c44d216f2489cf9b0e0f1e03aa5dfb97f198c53" + integrity sha512-0So0rexQivnWgnhacX4cfkM2223YdExnJTTy6d06WbkfZk5alHUx8MM3yEzwoCN0ErO7oyqEWRnEkGC+As1FtA== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" -"@jimp/plugin-print@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.14.0.tgz#1c43c2a92a7adc05b464863882cb89ce486d63e6" - integrity sha512-MwP3sH+VS5AhhSTXk7pui+tEJFsxnTKFY3TraFJb8WFbA2Vo2qsRCZseEGwpTLhENB7p/JSsLvWoSSbpmxhFAQ== +"@jimp/plugin-print@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.22.12.tgz#6a49020947a9bf21a5a28324425670a25587ca65" + integrity sha512-c7TnhHlxm87DJeSnwr/XOLjJU/whoiKYY7r21SbuJ5nuH+7a78EW1teOaj5gEr2wYEd7QtkFqGlmyGXY/YclyQ== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" - load-bmfont "^1.4.0" + "@jimp/utils" "^0.22.12" + load-bmfont "^1.4.1" -"@jimp/plugin-resize@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.14.0.tgz#ef7fc6c2e45f8bcab62456baf8fd3bc415b02b64" - integrity sha512-qFeMOyXE/Bk6QXN0GQo89+CB2dQcXqoxUcDb2Ah8wdYlKqpi53skABkgVy5pW3EpiprDnzNDboMltdvDslNgLQ== +"@jimp/plugin-resize@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.22.12.tgz#f92acbf73beb97dd1fe93b166ef367a323b81e81" + integrity sha512-3NyTPlPbTnGKDIbaBgQ3HbE6wXbAlFfxHVERmrbqAi8R3r6fQPxpCauA8UVDnieg5eo04D0T8nnnNIX//i/sXg== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" + "@jimp/utils" "^0.22.12" -"@jimp/plugin-rotate@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.14.0.tgz#3632bc159bf1c3b9ec9f459d9c05d02a11781ee7" - integrity sha512-aGaicts44bvpTcq5Dtf93/8TZFu5pMo/61lWWnYmwJJU1RqtQlxbCLEQpMyRhKDNSfPbuP8nyGmaqXlM/82J0Q== +"@jimp/plugin-rotate@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.22.12.tgz#2235d45aeb4914ff70d99e95750a6d9de45a0d9f" + integrity sha512-9YNEt7BPAFfTls2FGfKBVgwwLUuKqy+E8bDGGEsOqHtbuhbshVGxN2WMZaD4gh5IDWvR+emmmPPWGgaYNYt1gA== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" - -"@jimp/plugin-scale@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.14.0.tgz#d30f0cd1365b8e68f43fa423300ae7f124e9bf10" - integrity sha512-ZcJk0hxY5ZKZDDwflqQNHEGRblgaR+piePZm7dPwPUOSeYEH31P0AwZ1ziceR74zd8N80M0TMft+e3Td6KGBHw== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" - -"@jimp/plugin-shadow@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-shadow/-/plugin-shadow-0.14.0.tgz#471fdb9f109ff2d9e20d533d45e1e18e0b48c749" - integrity sha512-p2igcEr/iGrLiTu0YePNHyby0WYAXM14c5cECZIVnq/UTOOIQ7xIcWZJ1lRbAEPxVVXPN1UibhZAbr3HAb5BjQ== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" - -"@jimp/plugin-threshold@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-threshold/-/plugin-threshold-0.14.0.tgz#ebd72721c7d1d518c5bb6e494e55d97ac3351d3b" - integrity sha512-N4BlDgm/FoOMV/DQM2rSpzsgqAzkP0DXkWZoqaQrlRxQBo4zizQLzhEL00T/YCCMKnddzgEhnByaocgaaa0fKw== + "@jimp/utils" "^0.22.12" + +"@jimp/plugin-scale@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.22.12.tgz#91f1ec3d114ff44092b946a16e66b14d918e32ed" + integrity sha512-dghs92qM6MhHj0HrV2qAwKPMklQtjNpoYgAB94ysYpsXslhRTiPisueSIELRwZGEr0J0VUxpUY7HgJwlSIgGZw== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" - -"@jimp/plugins@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.14.0.tgz#41dba85f15ab8dadb4162100eb54e5f27b93ee2c" - integrity sha512-vDO3XT/YQlFlFLq5TqNjQkISqjBHT8VMhpWhAfJVwuXIpilxz5Glu4IDLK6jp4IjPR6Yg2WO8TmRY/HI8vLrOw== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/plugin-blit" "^0.14.0" - "@jimp/plugin-blur" "^0.14.0" - "@jimp/plugin-circle" "^0.14.0" - "@jimp/plugin-color" "^0.14.0" - "@jimp/plugin-contain" "^0.14.0" - "@jimp/plugin-cover" "^0.14.0" - "@jimp/plugin-crop" "^0.14.0" - "@jimp/plugin-displace" "^0.14.0" - "@jimp/plugin-dither" "^0.14.0" - "@jimp/plugin-fisheye" "^0.14.0" - "@jimp/plugin-flip" "^0.14.0" - "@jimp/plugin-gaussian" "^0.14.0" - "@jimp/plugin-invert" "^0.14.0" - "@jimp/plugin-mask" "^0.14.0" - "@jimp/plugin-normalize" "^0.14.0" - "@jimp/plugin-print" "^0.14.0" - "@jimp/plugin-resize" "^0.14.0" - "@jimp/plugin-rotate" "^0.14.0" - "@jimp/plugin-scale" "^0.14.0" - "@jimp/plugin-shadow" "^0.14.0" - "@jimp/plugin-threshold" "^0.14.0" + "@jimp/utils" "^0.22.12" + +"@jimp/plugin-shadow@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-shadow/-/plugin-shadow-0.22.12.tgz#52e3a1d55f61ddfcfb3265544f8d23b887a667b8" + integrity sha512-FX8mTJuCt7/3zXVoeD/qHlm4YH2bVqBuWQHXSuBK054e7wFRnRnbSLPUqAwSeYP3lWqpuQzJtgiiBxV3+WWwTg== + dependencies: + "@jimp/utils" "^0.22.12" + +"@jimp/plugin-threshold@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugin-threshold/-/plugin-threshold-0.22.12.tgz#1efe20e154bf3a1fc4a5cc016092dbacaa60c958" + integrity sha512-4x5GrQr1a/9L0paBC/MZZJjjgjxLYrqSmWd+e+QfAEPvmRxdRoQ5uKEuNgXnm9/weHQBTnQBQsOY2iFja+XGAw== + dependencies: + "@jimp/utils" "^0.22.12" + +"@jimp/plugins@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.22.12.tgz#45a3b96d2d24cec21d4f8b79d1cfcec6fcb2f1d4" + integrity sha512-yBJ8vQrDkBbTgQZLty9k4+KtUQdRjsIDJSPjuI21YdVeqZxYywifHl4/XWILoTZsjTUASQcGoH0TuC0N7xm3ww== + dependencies: + "@jimp/plugin-blit" "^0.22.12" + "@jimp/plugin-blur" "^0.22.12" + "@jimp/plugin-circle" "^0.22.12" + "@jimp/plugin-color" "^0.22.12" + "@jimp/plugin-contain" "^0.22.12" + "@jimp/plugin-cover" "^0.22.12" + "@jimp/plugin-crop" "^0.22.12" + "@jimp/plugin-displace" "^0.22.12" + "@jimp/plugin-dither" "^0.22.12" + "@jimp/plugin-fisheye" "^0.22.12" + "@jimp/plugin-flip" "^0.22.12" + "@jimp/plugin-gaussian" "^0.22.12" + "@jimp/plugin-invert" "^0.22.12" + "@jimp/plugin-mask" "^0.22.12" + "@jimp/plugin-normalize" "^0.22.12" + "@jimp/plugin-print" "^0.22.12" + "@jimp/plugin-resize" "^0.22.12" + "@jimp/plugin-rotate" "^0.22.12" + "@jimp/plugin-scale" "^0.22.12" + "@jimp/plugin-shadow" "^0.22.12" + "@jimp/plugin-threshold" "^0.22.12" timm "^1.6.1" -"@jimp/png@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.14.0.tgz#0f2dddb5125c0795ca7e67c771204c5437fcda4b" - integrity sha512-0RV/mEIDOrPCcNfXSPmPBqqSZYwGADNRVUTyMt47RuZh7sugbYdv/uvKmQSiqRdR0L1sfbCBMWUEa5G/8MSbdA== +"@jimp/png@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.22.12.tgz#e033586caf38d9c9d33808e92eb87c4d7f0aa1eb" + integrity sha512-Mrp6dr3UTn+aLK8ty/dSKELz+Otdz1v4aAXzV5q53UDD2rbB5joKVJ/ChY310B+eRzNxIovbUF1KVrUsYdE8Hg== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.14.0" - pngjs "^3.3.3" + "@jimp/utils" "^0.22.12" + pngjs "^6.0.0" -"@jimp/tiff@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.14.0.tgz#a5b25bbe7c43fc3b07bad4e2ab90e0e164c1967f" - integrity sha512-zBYDTlutc7j88G/7FBCn3kmQwWr0rmm1e0FKB4C3uJ5oYfT8645lftUsvosKVUEfkdmOaMAnhrf4ekaHcb5gQw== +"@jimp/tiff@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.22.12.tgz#67cac3f2ded6fde3ef631fbf74bea0fa53800123" + integrity sha512-E1LtMh4RyJsoCAfAkBRVSYyZDTtLq9p9LUiiYP0vPtXyxX4BiYBUYihTLSBlCQg5nF2e4OpQg7SPrLdJ66u7jg== dependencies: - "@babel/runtime" "^7.7.2" - utif "^2.0.1" + utif2 "^4.0.1" -"@jimp/types@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.14.0.tgz#ef681ff702883c5f105b5e4e30d49abf39ee9e34" - integrity sha512-hx3cXAW1KZm+b+XCrY3LXtdWy2U+hNtq0rPyJ7NuXCjU7lZR3vIkpz1DLJ3yDdS70hTi5QDXY3Cd9kd6DtloHQ== +"@jimp/types@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.22.12.tgz#6f83761ba171cb8cd5998fa66a5cbfb0b22d3d8c" + integrity sha512-wwKYzRdElE1MBXFREvCto5s699izFHNVvALUv79GXNbsOVqlwlOxlWJ8DuyOGIXoLP4JW/m30YyuTtfUJgMRMA== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/bmp" "^0.14.0" - "@jimp/gif" "^0.14.0" - "@jimp/jpeg" "^0.14.0" - "@jimp/png" "^0.14.0" - "@jimp/tiff" "^0.14.0" + "@jimp/bmp" "^0.22.12" + "@jimp/gif" "^0.22.12" + "@jimp/jpeg" "^0.22.12" + "@jimp/png" "^0.22.12" + "@jimp/tiff" "^0.22.12" timm "^1.6.1" -"@jimp/utils@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.14.0.tgz#296254e63118554c62c31c19ac6b8c4bfe6490e5" - integrity sha512-MY5KFYUru0y74IsgM/9asDwb3ERxWxXEu3CRCZEvE7DtT86y1bR1XgtlSliMrptjz4qbivNGMQSvUBpEFJDp1A== +"@jimp/utils@^0.22.12": + version "0.22.12" + resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.22.12.tgz#8ffaed8f2dc2962539ccaf14727ac60793c7a537" + integrity sha512-yJ5cWUknGnilBq97ZXOyOS0HhsHOyAyjHwYfHxGbSyMTohgQI6sVyE8KPgDwH8HHW/nMKXk8TrSwAE71zt716Q== dependencies: - "@babel/runtime" "^7.7.2" regenerator-runtime "^0.13.3" "@jridgewell/gen-mapping@^0.1.0": @@ -5459,54 +5321,53 @@ dependencies: nx "15.9.4" -"@octokit/auth-app@3.6.1": - version "3.6.1" - resolved "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-3.6.1.tgz#aa5b02cc211175cbc28ce6c03c73373c1206d632" - integrity sha512-6oa6CFphIYI7NxxHrdVOzhG7hkcKyGyYocg7lNDSJVauVOLtylg8hNJzoUyPAYKKK0yUeoZamE/lMs2tG+S+JA== - dependencies: - "@octokit/auth-oauth-app" "^4.3.0" - "@octokit/auth-oauth-user" "^1.2.3" - "@octokit/request" "^5.6.0" - "@octokit/request-error" "^2.1.0" - "@octokit/types" "^6.0.3" - "@types/lru-cache" "^5.1.0" +"@octokit/auth-app@6.0.3": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@octokit/auth-app/-/auth-app-6.0.3.tgz#4c0ba68e8d3b1a55c34d1e68ea0ca92ef018bb7a" + integrity sha512-9N7IlBAKEJR3tJgPSubCxIDYGXSdc+2xbkjYpk9nCyqREnH8qEMoMhiEB1WgoA9yTFp91El92XNXAi+AjuKnfw== + dependencies: + "@octokit/auth-oauth-app" "^7.0.0" + "@octokit/auth-oauth-user" "^4.0.0" + "@octokit/request" "^8.0.2" + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^12.0.0" deprecation "^2.3.1" - lru-cache "^6.0.0" - universal-github-app-jwt "^1.0.1" + lru-cache "^10.0.0" + universal-github-app-jwt "^1.1.2" universal-user-agent "^6.0.0" -"@octokit/auth-oauth-app@^4.3.0": - version "4.3.1" - resolved "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-4.3.1.tgz#c5c423f17519eb7e039a7d60936dfb869c7bdf36" - integrity sha512-FXkKcGtTXS2987rp11mSuhMOXDw8Iy/ED9aXs83T29VeMEWjv40q4ytC0voUDxkBC/of1QYOPQUAdI2tv/dwNg== +"@octokit/auth-oauth-app@^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-app/-/auth-oauth-app-7.0.1.tgz#30fd8fcb4608ca52c29c265a3fc7032897796c8e" + integrity sha512-RE0KK0DCjCHXHlQBoubwlLijXEKfhMhKm9gO56xYvFmP1QTMb+vvwRPmQLLx0V+5AvV9N9I3lr1WyTzwL3rMDg== dependencies: - "@octokit/auth-oauth-device" "^3.1.1" - "@octokit/auth-oauth-user" "^1.2.1" - "@octokit/request" "^5.6.3" - "@octokit/types" "^6.0.3" + "@octokit/auth-oauth-device" "^6.0.0" + "@octokit/auth-oauth-user" "^4.0.0" + "@octokit/request" "^8.0.2" + "@octokit/types" "^12.0.0" "@types/btoa-lite" "^1.0.0" btoa-lite "^1.0.0" universal-user-agent "^6.0.0" -"@octokit/auth-oauth-device@^3.1.1": - version "3.1.2" - resolved "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-3.1.2.tgz#d299f51f491669f37fe7af8738f5ac921e63973c" - integrity sha512-w7Po4Ck6N2aAn2VQyKLuojruiyKROTBv4qs6IwE5rbwF7HhBXXp4A/NKmkpoFIZkiXQtM+N8QtkSck4ApYWdGg== +"@octokit/auth-oauth-device@^6.0.0": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-device/-/auth-oauth-device-6.0.1.tgz#38e5f7f8997c5e8b774f283463ecf4a7e42d7cee" + integrity sha512-yxU0rkL65QkjbqQedgVx3gmW7YM5fF+r5uaSj9tM/cQGVqloXcqP2xK90eTyYvl29arFVCW8Vz4H/t47mL0ELw== dependencies: - "@octokit/oauth-methods" "^1.1.0" - "@octokit/request" "^5.4.14" - "@octokit/types" "^6.10.0" + "@octokit/oauth-methods" "^4.0.0" + "@octokit/request" "^8.0.0" + "@octokit/types" "^12.0.0" universal-user-agent "^6.0.0" -"@octokit/auth-oauth-user@^1.2.1", "@octokit/auth-oauth-user@^1.2.3": - version "1.3.0" - resolved "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-1.3.0.tgz#da4e4529145181a6aa717ae858afb76ebd6e3360" - integrity sha512-3QC/TAdk7onnxfyZ24BnJRfZv8TRzQK7SEFUS9vLng4Vv6Hv6I64ujdk/CUkREec8lhrwU764SZ/d+yrjjqhaQ== +"@octokit/auth-oauth-user@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-user/-/auth-oauth-user-4.0.1.tgz#c8267883935c83f78318c726ff91d7e98de05517" + integrity sha512-N94wWW09d0hleCnrO5wt5MxekatqEJ4zf+1vSe8MKMrhZ7gAXKFOKrDEZW2INltvBWJCyDUELgGRv8gfErH1Iw== dependencies: - "@octokit/auth-oauth-device" "^3.1.1" - "@octokit/oauth-methods" "^1.1.0" - "@octokit/request" "^5.4.14" - "@octokit/types" "^6.12.2" + "@octokit/auth-oauth-device" "^6.0.0" + "@octokit/oauth-methods" "^4.0.0" + "@octokit/request" "^8.0.2" + "@octokit/types" "^12.0.0" btoa-lite "^1.0.0" universal-user-agent "^6.0.0" @@ -5524,7 +5385,25 @@ dependencies: "@octokit/types" "^9.0.0" -"@octokit/core@3.6.0", "@octokit/core@^3.5.1": +"@octokit/auth-token@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" + integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== + +"@octokit/core@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.0.2.tgz#ae7c5d61fdd98ba348a27c3cc510879a130b1234" + integrity sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg== + dependencies: + "@octokit/auth-token" "^4.0.0" + "@octokit/graphql" "^7.0.0" + "@octokit/request" "^8.0.2" + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^12.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/core@^3.5.1": version "3.6.0" resolved "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz#3376cb9f3008d9b3d110370d90e0a1fcd5fe6085" integrity sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q== @@ -5568,6 +5447,14 @@ is-plain-object "^5.0.0" universal-user-agent "^6.0.0" +"@octokit/endpoint@^9.0.0": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.4.tgz#8afda5ad1ffc3073d08f2b450964c610b821d1ea" + integrity sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw== + dependencies: + "@octokit/types" "^12.0.0" + universal-user-agent "^6.0.0" + "@octokit/graphql@^4.5.8": version "4.6.0" resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.6.0.tgz#f9abca55f82183964a33439d5264674c701c3327" @@ -5586,20 +5473,29 @@ "@octokit/types" "^9.0.0" universal-user-agent "^6.0.0" -"@octokit/oauth-authorization-url@^4.3.1": - version "4.3.3" - resolved "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-4.3.3.tgz#6a6ef38f243086fec882b62744f39b517528dfb9" - integrity sha512-lhP/t0i8EwTmayHG4dqLXgU+uPVys4WD/qUNvC+HfB1S1dyqULm5Yx9uKc1x79aP66U1Cb4OZeW8QU/RA9A4XA== +"@octokit/graphql@^7.0.0": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.0.2.tgz#3df14b9968192f9060d94ed9e3aa9780a76e7f99" + integrity sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q== + dependencies: + "@octokit/request" "^8.0.1" + "@octokit/types" "^12.0.0" + universal-user-agent "^6.0.0" -"@octokit/oauth-methods@^1.1.0": - version "1.2.6" - resolved "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-1.2.6.tgz#b9ac65e374b2cc55ee9dd8dcdd16558550438ea7" - integrity sha512-nImHQoOtKnSNn05uk2o76om1tJWiAo4lOu2xMAHYsNr0fwopP+Dv+2MlGvaMMlFjoqVd3fF3X5ZDTKCsqgmUaQ== +"@octokit/oauth-authorization-url@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@octokit/oauth-authorization-url/-/oauth-authorization-url-6.0.2.tgz#cc82ca29cc5e339c9921672f39f2b3f5c8eb6ef2" + integrity sha512-CdoJukjXXxqLNK4y/VOiVzQVjibqoj/xHgInekviUJV73y/BSIcwvJ/4aNHPBPKcPWFnd4/lO9uqRV65jXhcLA== + +"@octokit/oauth-methods@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@octokit/oauth-methods/-/oauth-methods-4.0.1.tgz#90d22c662387056307778d7e5c4763ff559636c4" + integrity sha512-1NdTGCoBHyD6J0n2WGXg9+yDLZrRNZ0moTEex/LSPr49m530WNKcCfXDghofYptr3st3eTii+EHoG5k/o+vbtw== dependencies: - "@octokit/oauth-authorization-url" "^4.3.1" - "@octokit/request" "^5.4.14" - "@octokit/request-error" "^2.0.5" - "@octokit/types" "^6.12.2" + "@octokit/oauth-authorization-url" "^6.0.2" + "@octokit/request" "^8.0.2" + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^12.0.0" btoa-lite "^1.0.0" "@octokit/openapi-types@^12.11.0": @@ -5617,6 +5513,11 @@ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-17.1.0.tgz#9a712b5bb9d644940d8a1f24115c798c317a64a5" integrity sha512-rnI26BAITDZTo5vqFOmA7oX4xRd18rO+gcK4MiTpJmsRMxAw0JmevNjPsjpry1bb9SVNo56P/0kbiyXXa4QluA== +"@octokit/openapi-types@^19.1.0": + version "19.1.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-19.1.0.tgz#75ec7e64743870fc73e1ab4bc6ec252ecdd624dc" + integrity sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw== + "@octokit/plugin-enterprise-rest@6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" @@ -5675,7 +5576,16 @@ deprecation "^2.0.0" once "^1.4.0" -"@octokit/request@^5.3.0", "@octokit/request@^5.4.14", "@octokit/request@^5.6.0", "@octokit/request@^5.6.3": +"@octokit/request-error@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.0.1.tgz#277e3ce3b540b41525e07ba24c5ef5e868a72db9" + integrity sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ== + dependencies: + "@octokit/types" "^12.0.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^5.3.0", "@octokit/request@^5.6.3": version "5.6.3" resolved "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz#19a022515a5bba965ac06c9d1334514eb50c48b0" integrity sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A== @@ -5699,6 +5609,16 @@ node-fetch "^2.6.7" universal-user-agent "^6.0.0" +"@octokit/request@^8.0.0", "@octokit/request@^8.0.1", "@octokit/request@^8.0.2": + version "8.1.6" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.1.6.tgz#a76a859c30421737a3918b40973c2ff369009571" + integrity sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ== + dependencies: + "@octokit/endpoint" "^9.0.0" + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^12.0.0" + universal-user-agent "^6.0.0" + "@octokit/rest@19.0.3": version "19.0.3" resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.3.tgz#b9a4e8dc8d53e030d611c053153ee6045f080f02" @@ -5719,7 +5639,14 @@ "@octokit/plugin-request-log" "^1.0.4" "@octokit/plugin-rest-endpoint-methods" "^5.9.0" -"@octokit/types@^6.0.3", "@octokit/types@^6.10.0", "@octokit/types@^6.12.2", "@octokit/types@^6.16.1", "@octokit/types@^6.27.1", "@octokit/types@^6.41.0": +"@octokit/types@^12.0.0": + version "12.4.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.4.0.tgz#8f97b601e91ce6b9776ed8152217e77a71be7aac" + integrity sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ== + dependencies: + "@octokit/openapi-types" "^19.1.0" + +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.27.1", "@octokit/types@^6.41.0": version "6.41.0" resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.41.0.tgz#e58ef78d78596d2fb7df9c6259802464b5f84a04" integrity sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg== @@ -7106,6 +7033,11 @@ lz-string "^1.4.4" pretty-format "^27.0.2" +"@tokenizer/token@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" + integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" @@ -7670,13 +7602,20 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/jsonwebtoken@^8.3.3", "@types/jsonwebtoken@^8.5.0": +"@types/jsonwebtoken@^8.5.0": version "8.5.8" resolved "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz#01b39711eb844777b7af1d1f2b4cf22fda1c0c44" integrity sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A== dependencies: "@types/node" "*" +"@types/jsonwebtoken@^9.0.0": + version "9.0.5" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz#0bd9b841c9e6c5a937c17656e2368f65da025588" + integrity sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA== + dependencies: + "@types/node" "*" + "@types/keyv@*": version "3.1.1" resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7" @@ -7694,11 +7633,6 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== -"@types/lru-cache@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03" - integrity sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w== - "@types/markdown-it@12.2.3": version "12.2.3" resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-12.2.3.tgz#0d6f6e5e413f8daaa26522904597be3d6cd93b51" @@ -7786,6 +7720,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.3.tgz#e5188135fc2909b46530c798ef49be65083be3fd" integrity sha512-0OVfGupTl3NBFr8+iXpfZ8NR7jfFO+P1Q+IO/q0wbo02wYkP5gy36phojeYWpLQ6WAMjl+VfmqUk2YbUfp0irA== +"@types/node@16.9.1": + version "16.9.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.9.1.tgz#0611b37db4246c937feef529ddcc018cf8e35708" + integrity sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g== + "@types/node@18.17.5": version "18.17.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.5.tgz#c58b12bca8c2a437b38c15270615627e96dd0bc5" @@ -8569,6 +8508,17 @@ "@vue/compiler-core" "3.2.47" "@vue/shared" "3.2.47" +"@vue/compiler-sfc@2.7.16": + version "2.7.16" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz#ff81711a0fac9c68683d8bb00b63f857de77dc83" + integrity sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg== + dependencies: + "@babel/parser" "^7.23.5" + postcss "^8.4.14" + source-map "^0.6.1" + optionalDependencies: + prettier "^1.18.2 || ^2.0.0" + "@vue/compiler-sfc@3.2.47", "@vue/compiler-sfc@^3.2.20", "@vue/compiler-sfc@^3.2.31", "@vue/compiler-sfc@^3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d" @@ -9506,7 +9456,7 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.2.1, ansi-styles@^4.3.0: dependencies: color-convert "^2.0.1" -ansi-styles@^5: +ansi-styles@^5, ansi-styles@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== @@ -9926,7 +9876,7 @@ asn1.js@^5.2.0: minimalistic-assert "^1.0.0" safer-buffer "^2.1.0" -asn1@^0.2.4, asn1@~0.2.3: +asn1@^0.2.6, asn1@~0.2.3: version "0.2.6" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== @@ -11008,7 +10958,7 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.1.0, buffer@^5.2.0, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0, buffer@^5.7.0: +buffer@^5.1.0, buffer@^5.2.0, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.7.0, buffer@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -11016,6 +10966,11 @@ buffer@^5.1.0, buffer@^5.2.0, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0, buffe base64-js "^1.3.1" ieee754 "^1.1.13" +buildcheck@~0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/buildcheck/-/buildcheck-0.0.6.tgz#89aa6e417cfd1e2196e3f8fe915eb709d2fe4238" + integrity sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A== + builder-util-runtime@9.1.1: version "9.1.1" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.1.1.tgz#2da7b34e78a64ad14ccd070d6eed4662d893bd60" @@ -12773,12 +12728,13 @@ cpr@^3.0.1: mkdirp "~0.5.1" rimraf "^2.5.4" -cpu-features@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.2.tgz#9f636156f1155fd04bdbaa028bb3c2fbef3cea7a" - integrity sha512-/2yieBqvMcRj8McNzkycjW2v3OIUOibBfd2dLEJ0nWts8NobAxwiyw9phVNS6oDL8x8tz9F7uNVFEVpJncQpeA== +cpu-features@~0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.9.tgz#5226b92f0f1c63122b0a3eb84cb8335a4de499fc" + integrity sha512-AKjgn2rP2yJyfbepsmLfiYcmtNn/2eUvocUyM/09yB0YDiz39HteK/5/T4Onf0pmdYDMgkBoGvRLvEguzyL7wQ== dependencies: - nan "^2.14.1" + buildcheck "~0.0.6" + nan "^2.17.0" crc@^3.8.0: version "3.8.0" @@ -12867,12 +12823,12 @@ cross-fetch@4.0.0: dependencies: node-fetch "^2.6.12" -cross-fetch@^3.0.4, cross-fetch@^3.0.6, cross-fetch@^3.1.4, cross-fetch@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== +cross-fetch@^3.0.4, cross-fetch@^3.0.6, cross-fetch@^3.1.4, cross-fetch@^3.1.5, cross-fetch@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== dependencies: - node-fetch "2.6.7" + node-fetch "^2.6.12" cross-spawn-async@^2.1.1: version "2.2.5" @@ -13079,10 +13035,10 @@ csstype@^2.6.8: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.17.tgz#4cf30eb87e1d1a005d8b6510f95292413f6a1c0e" integrity sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A== -csstype@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.7.tgz#2a5fb75e1015e84dd15692f71e89a1450290950b" - integrity sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g== +csstype@^3.0.2, csstype@^3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== cyclist@^1.0.1: version "1.0.1" @@ -13094,12 +13050,12 @@ cypress-each@^1.11.0: resolved "https://registry.yarnpkg.com/cypress-each/-/cypress-each-1.11.0.tgz#013c9b43a950f157bcf082d4bd0bb424fb370441" integrity sha512-zeqeQkppPL6BKLIJdfR5IUoZRrxRudApJapnFzWCkkrmefQSqdlBma2fzhmniSJ3TRhxe5xpK3W3/l8aCrHvwQ== -cypress-example-kitchensink@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cypress-example-kitchensink/-/cypress-example-kitchensink-2.0.0.tgz#16b0e5c226eca08d937d0057293c5d168d0498fd" - integrity sha512-Uoqz+E5UNdmraQ/s+BtKOQ/diRacfB4vGl6mXM37nHKDJFCRo6PGV9Ooy68m5IGZQs97aclL9ALPb2GpTUcTmg== +cypress-example-kitchensink@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/cypress-example-kitchensink/-/cypress-example-kitchensink-2.0.3.tgz#e6334175cedeecffa05c8391796771e744e78f89" + integrity sha512-t+pL02tO7LLz24atqQvyLuSiRrNffvSRG571y4y7DDVZZNt4F8Udv4OY7ABLYdmLKbR6/7rYlW1G4JGU7uKiag== dependencies: - npm-run-all "^4.1.2" + npm-run-all2 "^5.0.0" serve "14.2.1" cypress-expect@^2.5.3: @@ -13882,14 +13838,14 @@ dns-txt@^2.0.2: buffer-indexof "^1.0.0" docker-modem@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/docker-modem/-/docker-modem-3.0.3.tgz#ac4bb1f32f81ac2e7120c5e99a068fab2458a32f" - integrity sha512-Tgkn2a+yiNP9FoZgMa/D9Wk+D2Db///0KOyKSYZRJa8w4+DzKyzQMkczKSdR/adQ0x46BOpeNkoyEOKjPhCzjw== + version "3.0.8" + resolved "https://registry.yarnpkg.com/docker-modem/-/docker-modem-3.0.8.tgz#ef62c8bdff6e8a7d12f0160988c295ea8705e77a" + integrity sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ== dependencies: debug "^4.1.1" readable-stream "^3.5.0" split-ca "^1.0.1" - ssh2 "^1.4.0" + ssh2 "^1.11.0" dockerode@3.3.1: version "3.3.1" @@ -14127,10 +14083,10 @@ duplexer@^0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -duplexify@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.1.tgz#7027dc374f157b122a8ae08c2d3ea4d2d953aa61" - integrity sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA== +duplexify@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" + integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== dependencies: end-of-stream "^1.4.1" inherits "^2.0.3" @@ -14303,10 +14259,10 @@ electron-to-chromium@^1.4.477: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.480.tgz#40e32849ca50bc23ce29c1516c5adb3fddac919d" integrity sha512-IXTgg+bITkQv/FLP9FjX6f9KFCs5hQWeh5uNSKxB9mqYj/JXhHDbu+ekS43LVvbkL3eW6/oZy4+r9Om6lan1Uw== -electron@25.8.4: - version "25.8.4" - resolved "https://registry.yarnpkg.com/electron/-/electron-25.8.4.tgz#b50877aac7d96323920437baf309ad86382cb455" - integrity sha512-hUYS3RGdaa6E1UWnzeGnsdsBYOggwMMg4WGxNGvAoWtmRrr6J1BsjFW/yRq4WsJHJce2HdzQXtz4OGXV6yUCLg== +electron@27.1.3: + version "27.1.3" + resolved "https://registry.yarnpkg.com/electron/-/electron-27.1.3.tgz#3fd6decda95c1dd0a7e51a9ac77ee0ba37b7c5c6" + integrity sha512-7eD8VMhhlL5J531OOawn00eMthUkX1e3qN5Nqd7eMK8bg5HxQBrn8bdPlvUEnCano9KhrVwaDnGeuzWoDOGpjQ== dependencies: "@electron/get" "^2.0.0" "@types/node" "^18.11.18" @@ -14864,61 +14820,33 @@ esbuild@^0.15.3: esbuild-windows-64 "0.15.7" esbuild-windows-arm64 "0.15.7" -esbuild@^0.16.14: - version "0.16.17" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" - integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== +esbuild@^0.18.10: + version "0.18.20" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" + integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== optionalDependencies: - "@esbuild/android-arm" "0.16.17" - "@esbuild/android-arm64" "0.16.17" - "@esbuild/android-x64" "0.16.17" - "@esbuild/darwin-arm64" "0.16.17" - "@esbuild/darwin-x64" "0.16.17" - "@esbuild/freebsd-arm64" "0.16.17" - "@esbuild/freebsd-x64" "0.16.17" - "@esbuild/linux-arm" "0.16.17" - "@esbuild/linux-arm64" "0.16.17" - "@esbuild/linux-ia32" "0.16.17" - "@esbuild/linux-loong64" "0.16.17" - "@esbuild/linux-mips64el" "0.16.17" - "@esbuild/linux-ppc64" "0.16.17" - "@esbuild/linux-riscv64" "0.16.17" - "@esbuild/linux-s390x" "0.16.17" - "@esbuild/linux-x64" "0.16.17" - "@esbuild/netbsd-x64" "0.16.17" - "@esbuild/openbsd-x64" "0.16.17" - "@esbuild/sunos-x64" "0.16.17" - "@esbuild/win32-arm64" "0.16.17" - "@esbuild/win32-ia32" "0.16.17" - "@esbuild/win32-x64" "0.16.17" - -esbuild@^0.17.5: - version "0.17.15" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.15.tgz#209ebc87cb671ffb79574db93494b10ffaf43cbc" - integrity sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw== - optionalDependencies: - "@esbuild/android-arm" "0.17.15" - "@esbuild/android-arm64" "0.17.15" - "@esbuild/android-x64" "0.17.15" - "@esbuild/darwin-arm64" "0.17.15" - "@esbuild/darwin-x64" "0.17.15" - "@esbuild/freebsd-arm64" "0.17.15" - "@esbuild/freebsd-x64" "0.17.15" - "@esbuild/linux-arm" "0.17.15" - "@esbuild/linux-arm64" "0.17.15" - "@esbuild/linux-ia32" "0.17.15" - "@esbuild/linux-loong64" "0.17.15" - "@esbuild/linux-mips64el" "0.17.15" - "@esbuild/linux-ppc64" "0.17.15" - "@esbuild/linux-riscv64" "0.17.15" - "@esbuild/linux-s390x" "0.17.15" - "@esbuild/linux-x64" "0.17.15" - "@esbuild/netbsd-x64" "0.17.15" - "@esbuild/openbsd-x64" "0.17.15" - "@esbuild/sunos-x64" "0.17.15" - "@esbuild/win32-arm64" "0.17.15" - "@esbuild/win32-ia32" "0.17.15" - "@esbuild/win32-x64" "0.17.15" + "@esbuild/android-arm" "0.18.20" + "@esbuild/android-arm64" "0.18.20" + "@esbuild/android-x64" "0.18.20" + "@esbuild/darwin-arm64" "0.18.20" + "@esbuild/darwin-x64" "0.18.20" + "@esbuild/freebsd-arm64" "0.18.20" + "@esbuild/freebsd-x64" "0.18.20" + "@esbuild/linux-arm" "0.18.20" + "@esbuild/linux-arm64" "0.18.20" + "@esbuild/linux-ia32" "0.18.20" + "@esbuild/linux-loong64" "0.18.20" + "@esbuild/linux-mips64el" "0.18.20" + "@esbuild/linux-ppc64" "0.18.20" + "@esbuild/linux-riscv64" "0.18.20" + "@esbuild/linux-s390x" "0.18.20" + "@esbuild/linux-x64" "0.18.20" + "@esbuild/netbsd-x64" "0.18.20" + "@esbuild/openbsd-x64" "0.18.20" + "@esbuild/sunos-x64" "0.18.20" + "@esbuild/win32-arm64" "0.18.20" + "@esbuild/win32-ia32" "0.18.20" + "@esbuild/win32-x64" "0.18.20" escalade@^3.1.1: version "3.1.1" @@ -15866,16 +15794,20 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-type@^16.5.4: + version "16.5.4" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.4.tgz#474fb4f704bee427681f98dd390058a172a6c2fd" + integrity sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw== + dependencies: + readable-web-to-node-stream "^3.0.0" + strtok3 "^6.2.4" + token-types "^4.1.1" + file-type@^3.1.0, file-type@^3.8.0: version "3.9.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= -file-type@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18" - integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw== - file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" @@ -16773,12 +16705,12 @@ gh-pages@5.0.0: fs-extra "^8.1.0" globby "^6.1.0" -gifwrap@^0.9.2: - version "0.9.2" - resolved "https://registry.yarnpkg.com/gifwrap/-/gifwrap-0.9.2.tgz#348e286e67d7cf57942172e1e6f05a71cee78489" - integrity sha512-fcIswrPaiCDAyO8xnWvHSZdWChjKXUanKKpAiWWJ/UTkEi/aYKn5+90e7DE820zbEaVR9CE2y4z9bzhQijZ0BA== +gifwrap@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/gifwrap/-/gifwrap-0.10.1.tgz#9ed46a5d51913b482d4221ce9c727080260b681e" + integrity sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw== dependencies: - image-q "^1.1.1" + image-q "^4.0.0" omggif "^1.0.10" git-hooks-list@1.0.3: @@ -18040,9 +17972,9 @@ http-proxy-middleware@^1.0.0: micromatch "^4.0.2" http-proxy-middleware@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz#03af0f4676d172ae775cb5c33f592f40e1a4e07a" - integrity sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg== + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" @@ -18243,10 +18175,12 @@ ignore@^5.0.4, ignore@^5.1.1, ignore@^5.1.4, ignore@^5.2.0, ignore@^5.2.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -image-q@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/image-q/-/image-q-1.1.1.tgz#fc84099664460b90ca862d9300b6bfbbbfbf8056" - integrity sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY= +image-q@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/image-q/-/image-q-4.0.0.tgz#31e075be7bae3c1f42a85c469b4732c358981776" + integrity sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw== + dependencies: + "@types/node" "16.9.1" image-size@0.8.3: version "0.8.3" @@ -19464,15 +19398,14 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -jimp@0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.14.0.tgz#fde55f69bdb918c1b01ac633d89a25853af85625" - integrity sha512-8BXU+J8+SPmwwyq9ELihpSV4dWPTiOKBWCEgtkbnxxAVMjXdf3yGmyaLSshBfXc8sP/JQ9OZj5R8nZzz2wPXgA== +jimp@0.22.12: + version "0.22.12" + resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.22.12.tgz#f99d1f3ec0d9d930cb7bd8f5b479859ee3a15694" + integrity sha512-R5jZaYDnfkxKJy1dwLpj/7cvyjxiclxU3F4TrI/J4j2rS0niq6YDUMoPn5hs8GDpO+OZGo7Ky057CRtWesyhfg== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/custom" "^0.14.0" - "@jimp/plugins" "^0.14.0" - "@jimp/types" "^0.14.0" + "@jimp/custom" "^0.22.12" + "@jimp/plugins" "^0.22.12" + "@jimp/types" "^0.22.12" regenerator-runtime "^0.13.3" jimp@^0.2.21: @@ -19502,10 +19435,10 @@ jiti@^1.18.2: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd" integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== -jose@^4.11.2: - version "4.11.2" - resolved "https://registry.yarnpkg.com/jose/-/jose-4.11.2.tgz#d9699307c02e18ff56825843ba90e2fae9f09e23" - integrity sha512-njj0VL2TsIxCtgzhO+9RRobBvws4oYyCM8TpvoUQwl/MbIM3NFJRR9+e6x0sS5xXaP1t6OCBkaBME98OV9zU5A== +jose@^4.15.5: + version "4.15.5" + resolved "https://registry.yarnpkg.com/jose/-/jose-4.15.5.tgz#6475d0f467ecd3c630a1b5dadd2735a7288df706" + integrity sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg== jpeg-js@^0.1.1: version "0.1.2" @@ -19517,10 +19450,10 @@ jpeg-js@^0.2.0: resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.2.0.tgz#53e448ec9d263e683266467e9442d2c5a2ef5482" integrity sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII= -jpeg-js@^0.4.0: - version "0.4.3" - resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.3.tgz#6158e09f1983ad773813704be80680550eff977b" - integrity sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q== +jpeg-js@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.4.tgz#a9f1c6f1f9f0fa80cdb3484ed9635054d28936aa" + integrity sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg== jquery@3.1.1: version "3.1.1" @@ -19800,6 +19733,22 @@ jsonwebtoken@^8.5.1: ms "^2.1.1" semver "^5.6.0" +jsonwebtoken@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" + integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^7.5.4" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -20482,7 +20431,7 @@ livereload-js@^2.3.0: resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c" integrity sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw== -load-bmfont@^1.2.3, load-bmfont@^1.3.1, load-bmfont@^1.4.0: +load-bmfont@^1.2.3, load-bmfont@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.1.tgz#c0f5f4711a1e2ccff725a7b6078087ccfcddd3e9" integrity sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA== @@ -20972,6 +20921,11 @@ lru-cache@2: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= +lru-cache@^10.0.0, "lru-cache@^9.1.1 || ^10.0.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" + integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== + lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -20999,11 +20953,6 @@ lru-cache@^7.14.1, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -"lru-cache@^9.1.1 || ^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.0.tgz#b9e2a6a72a129d81ab317202d93c7691df727e61" - integrity sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw== - ltgt@^2.1.2: version "2.2.1" resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" @@ -21844,7 +21793,7 @@ mobx@5.15.4: resolved "https://registry.yarnpkg.com/mobx/-/mobx-5.15.4.tgz#9da1a84e97ba624622f4e55a0bf3300fb931c2ab" integrity sha512-xRFJxSU2Im3nrGCdjSuOTFmxVDGeqOHL+TyADCGbT0k4HHqGmx5u2yaHNryvoORpI4DfbzjJ5jPmuv+d7sioFw== -"mocha-7.0.1@npm:mocha@7.0.1", mocha@7.0.1: +"mocha-7.0.1@npm:mocha@7.0.1": version "7.0.1" resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.0.1.tgz#276186d35a4852f6249808c6dd4a1376cbf6c6ce" integrity sha512-9eWmWTdHLXh72rGrdZjNbG3aa1/3NRPpul1z0D979QpEnFdCG0Q5tv834N+94QEN2cysfV72YocQ3fn87s70fg== @@ -21977,6 +21926,36 @@ mocha@6.2.2: yargs-parser "13.1.1" yargs-unparser "1.6.0" +mocha@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.0.1.tgz#276186d35a4852f6249808c6dd4a1376cbf6c6ce" + integrity sha512-9eWmWTdHLXh72rGrdZjNbG3aa1/3NRPpul1z0D979QpEnFdCG0Q5tv834N+94QEN2cysfV72YocQ3fn87s70fg== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + chokidar "3.3.0" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "2.2.0" + minimatch "3.0.4" + mkdirp "0.5.1" + ms "2.1.1" + node-environment-flags "1.0.6" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.0" + yargs-parser "13.1.1" + yargs-unparser "1.6.0" + mocha@7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.0.tgz#c784f579ad0904d29229ad6cb1e2514e4db7d249" @@ -22420,10 +22399,10 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.10.0, nan@^2.12.1, nan@^2.14.1, nan@^2.15.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== +nan@^2.10.0, nan@^2.12.1, nan@^2.17.0, nan@^2.18.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" + integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== nano-time@1.0.0: version "1.0.0" @@ -22447,10 +22426,10 @@ nanoid@3.3.4: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== -nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== nanomatch@^1.2.9: version "1.2.13" @@ -23153,7 +23132,20 @@ npm-registry-fetch@^14.0.0, npm-registry-fetch@^14.0.3: npm-package-arg "^10.0.0" proc-log "^3.0.0" -npm-run-all@^4.1.2, npm-run-all@^4.1.5: +npm-run-all2@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/npm-run-all2/-/npm-run-all2-5.0.2.tgz#7dae8e11ba90be9edd05379414a01407416b336c" + integrity sha512-S2G6FWZ3pNWAAKm2PFSOtEAG/N+XO/kz3+9l6V91IY+Y3XFSt7Lp7DV92KCgEboEW0hRTu0vFaMe4zXDZYaOyA== + dependencies: + ansi-styles "^5.0.0" + cross-spawn "^7.0.3" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.5.0" + read-pkg "^5.2.0" + shell-quote "^1.6.1" + +npm-run-all@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== @@ -24100,7 +24092,7 @@ pacote@^15.0.0, pacote@^15.0.8: ssri "^10.0.0" tar "^6.1.11" -pako@^1.0.5, pako@~1.0.5: +pako@^1.0.11, pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== @@ -24528,6 +24520,11 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +peek-readable@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-4.1.0.tgz#4ece1111bf5c2ad8867c314c81356847e8a62e72" + integrity sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg== + pegjs@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd" @@ -24573,6 +24570,11 @@ pidtree@^0.3.0: resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== +pidtree@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.5.0.tgz#ad5fbc1de78b8a5f99d6fbdd4f6e4eee21d1aca1" + integrity sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA== + pidusage@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/pidusage/-/pidusage-3.0.2.tgz#6faa5402b2530b3af2cf93d13bcf202889724a53" @@ -24748,7 +24750,7 @@ pluralize@8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -pngjs@^3.0.0, pngjs@^3.2.0, pngjs@^3.3.3: +pngjs@^3.0.0, pngjs@^3.2.0: version "3.4.0" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== @@ -24926,12 +24928,12 @@ postcss@^7.0.11, postcss@^7.0.18, postcss@^7.0.26, postcss@^7.0.32: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.1.10, postcss@^8.2.14, postcss@^8.2.7, postcss@^8.4.21, postcss@^8.4.22, postcss@^8.4.23, postcss@^8.4.27: - version "8.4.27" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.27.tgz#234d7e4b72e34ba5a92c29636734349e0d9c3057" - integrity sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ== +postcss@^8.1.10, postcss@^8.2.14, postcss@^8.2.7, postcss@^8.4.14, postcss@^8.4.21, postcss@^8.4.22, postcss@^8.4.23, postcss@^8.4.27: + version "8.4.33" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" + integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== dependencies: - nanoid "^3.3.6" + nanoid "^3.3.7" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -24989,10 +24991,10 @@ prettier@2.5.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== -prettier@^2.0.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" - integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== +"prettier@^1.18.2 || ^2.0.0", prettier@^2.0.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== pretty-bytes@^5.6.0: version "5.6.0" @@ -26060,6 +26062,13 @@ readable-stream@~1.0.2, readable-stream@~1.0.26, readable-stream@~1.0.26-4: isarray "0.0.1" string_decoder "~0.10.x" +readable-web-to-node-stream@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb" + integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== + dependencies: + readable-stream "^3.6.0" + readdir-scoped-modules@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" @@ -26785,10 +26794,10 @@ rollup@3.7.3: optionalDependencies: fsevents "~2.3.2" -rollup@^3.10.0, rollup@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.21.0.tgz#0a71517db56e150222670f88e5e7acfa4fede7c8" - integrity sha512-ANPhVcyeHvYdQMUyCbczy33nbLzI7RzrBje4uvNiTDJGIMtlKoOStmympwr9OtS1LZxiDmE2wvxHyVhoLtf1KQ== +rollup@^3.27.1: + version "3.29.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" + integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== optionalDependencies: fsevents "~2.3.2" @@ -27121,7 +27130,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semve resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: +semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -27416,11 +27425,6 @@ sigmund@^1.0.1, sigmund@~1.0.0: resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= -signal-exit@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - signal-exit@3.0.7, signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -28180,7 +28184,7 @@ speed-measure-webpack-plugin@1.4.2: split-ca@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/split-ca/-/split-ca-1.0.1.tgz#6c83aff3692fa61256e0cd197e05e9de157691a6" - integrity sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY= + integrity sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -28237,16 +28241,16 @@ ssestream@1.0.1: resolved "https://registry.yarnpkg.com/ssestream/-/ssestream-1.0.1.tgz#351551b12c00e91e7550f38d558323f3f47b54c2" integrity sha1-NRVRsSwA6R51UPONVYMj8/R7VMI= -ssh2@^1.4.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.6.0.tgz#61aebc3a6910fe488f9c85cd8355bdf8d4724e05" - integrity sha512-lxc+uvXqOxyQ99N2M7k5o4pkYDO5GptOTYduWw7hIM41icxvoBcCNHcj+LTKrjkL0vFcAl+qfZekthoSFRJn2Q== +ssh2@^1.11.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.15.0.tgz#2f998455036a7f89e0df5847efb5421748d9871b" + integrity sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw== dependencies: - asn1 "^0.2.4" + asn1 "^0.2.6" bcrypt-pbkdf "^1.0.2" optionalDependencies: - cpu-features "0.0.2" - nan "^2.15.0" + cpu-features "~0.0.9" + nan "^2.18.0" sshpk@^1.14.1, sshpk@^1.7.0: version "1.16.1" @@ -28479,7 +28483,7 @@ string-template@~0.2.1: resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -28505,6 +28509,15 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" @@ -28590,7 +28603,7 @@ stringify-object@^3.0.0, stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -28632,6 +28645,13 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" @@ -28719,6 +28739,14 @@ strong-log-transformer@2.1.0, strong-log-transformer@^2.1.0: minimist "^1.2.0" through "^2.3.4" +strtok3@^6.2.4: + version "6.3.0" + resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.3.0.tgz#358b80ffe6d5d5620e19a073aa78ce947a90f9a0" + integrity sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw== + dependencies: + "@tokenizer/token" "^0.3.0" + peek-readable "^4.1.0" + subscriptions-transport-ws@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.10.0.tgz#91fce775b31935e4ca995895a40942268877d23f" @@ -29395,10 +29423,10 @@ tiny-relative-date@^1.3.0: resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A== -tinycolor2@^1.1.2, tinycolor2@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" - integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== +tinycolor2@^1.1.2, tinycolor2@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" + integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== title-case@^2.1.0: version "2.1.1" @@ -29534,6 +29562,14 @@ token-stream@1.0.0: resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4" integrity sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ= +token-types@^4.1.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/token-types/-/token-types-4.2.1.tgz#0f897f03665846982806e138977dbe72d44df753" + integrity sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ== + dependencies: + "@tokenizer/token" "^0.3.0" + ieee754 "^1.2.1" + totalist@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.0.tgz#4ef9c58c5f095255cdc3ff2a0a55091c57a3a1bd" @@ -30176,13 +30212,13 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -universal-github-app-jwt@^1.0.1: - version "1.1.0" - resolved "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-1.1.0.tgz#0abaa876101cdf1d3e4c546be2768841c0c1b514" - integrity sha512-3b+ocAjjz4JTyqaOT+NNBd5BtTuvJTxWElIoeHSVelUV9J3Jp7avmQTdLKCaoqi/5Ox2o/q+VK19TJ233rVXVQ== +universal-github-app-jwt@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/universal-github-app-jwt/-/universal-github-app-jwt-1.1.2.tgz#8c1867a394d7d9d42cda34f11d1bcb023797d8df" + integrity sha512-t1iB2FmLFE+yyJY9+3wMx0ejB+MQpEVkH0gQv7dR6FZyltyq+ZZO0uDpbopxhrZ3SLEO4dCEkIujOMldEQ2iOA== dependencies: - "@types/jsonwebtoken" "^8.3.3" - jsonwebtoken "^8.5.1" + "@types/jsonwebtoken" "^9.0.0" + jsonwebtoken "^9.0.2" universal-user-agent@^6.0.0: version "6.0.0" @@ -30477,12 +30513,12 @@ utf8-stream@0.0.0: dependencies: readable-stream "~1.0.2" -utif@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/utif/-/utif-2.0.1.tgz#9e1582d9bbd20011a6588548ed3266298e711759" - integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg== +utif2@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/utif2/-/utif2-4.1.0.tgz#e768d37bd619b995d56d9780b5d2b4611a3d932b" + integrity sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w== dependencies: - pako "^1.0.5" + pako "^1.0.11" util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" @@ -30807,26 +30843,14 @@ vite-svg-loader@4.0.0: "@vue/compiler-sfc" "^3.2.20" svgo "^3.0.2" -vite@4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.1.4.tgz#170d93bcff97e0ebc09764c053eebe130bfe6ca0" - integrity sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg== - dependencies: - esbuild "^0.16.14" - postcss "^8.4.21" - resolve "^1.22.1" - rollup "^3.10.0" - optionalDependencies: - fsevents "~2.3.2" - -vite@4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.2.tgz#95a5e0ebee80ae218849312019318aa9e3a05c26" - integrity sha512-9R53Mf+TBoXCYejcL+qFbZde+eZveQLDYd9XgULILLC1a5ZwPaqgmdVpL8/uvw2BM/1TzetWjglwm+3RO+xTyw== +vite@4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.2.tgz#d6ea8610e099851dad8c7371599969e0f8b97e82" + integrity sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w== dependencies: - esbuild "^0.17.5" - postcss "^8.4.21" - rollup "^3.21.0" + esbuild "^0.18.10" + postcss "^8.4.27" + rollup "^3.27.1" optionalDependencies: fsevents "~2.3.2" @@ -31048,10 +31072,13 @@ vue3-file-selector@^1.0.1: resolved "https://registry.yarnpkg.com/vue3-file-selector/-/vue3-file-selector-1.0.1.tgz#bcae2f5ab44c406c1d72a60885990883051b688b" integrity sha512-popFgEvLrkRFo9MWs8mzlb4HH+Mg2+5DhJF7MzKmUrE9179rtVt4Wf7/w+0FvhDRVELQ6f8Z9BhF+SDSUSpRVw== -vue@2.6.12: - version "2.6.12" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.12.tgz#f5ebd4fa6bd2869403e29a896aed4904456c9123" - integrity sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg== +vue@2.7.16: + version "2.7.16" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.7.16.tgz#98c60de9def99c0e3da8dae59b304ead43b967c9" + integrity sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw== + dependencies: + "@vue/compiler-sfc" "2.7.16" + csstype "^3.1.0" vue@3.2.47: version "3.2.47" @@ -31603,7 +31630,7 @@ workerpool@6.2.0: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -31646,6 +31673,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"