diff --git a/.circleci/cache-version.txt b/.circleci/cache-version.txt index a9991ea23cc..9b015ca4cd3 100644 --- a/.circleci/cache-version.txt +++ b/.circleci/cache-version.txt @@ -1,2 +1,2 @@ # Bump this version to force CI to re-create the cache from scratch. -8-7-2025 +8-13-2025 diff --git a/.circleci/workflows.yml b/.circleci/workflows.yml index 554229ae7a3..5ebef8f97c0 100644 --- a/.circleci/workflows.yml +++ b/.circleci/workflows.yml @@ -38,7 +38,7 @@ mainBuildFilters: &mainBuildFilters - /^release\/\d+\.\d+\.\d+$/ # use the following branch as well to ensure that v8 snapshot cache updates are fully tested - 'update-v8-snapshot-cache-on-develop' - - 'mabel/issue-10425-studio-redesign' + - 'breaking/update_execa' # usually we don't build Mac app - it takes a long time # but sometimes we want to really confirm we are doing the right thing @@ -49,7 +49,7 @@ 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: [ 'feat/support_vite_7', << pipeline.git.branch >> ] + - equal: [ 'breaking/update_execa', << pipeline.git.branch >> ] - equal: [ 'chore/test_cypress_recipes_15', << pipeline.git.branch >> ] - equal: [ 'mabel/issue-31677-reporter-redesign', << pipeline.git.branch >> ] - matches: @@ -62,7 +62,7 @@ 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: [ 'feat/support_vite_7', << pipeline.git.branch >> ] + - equal: [ 'breaking/update_execa', << pipeline.git.branch >> ] - matches: pattern: /^release\/\d+\.\d+\.\d+$/ value: << pipeline.git.branch >> @@ -85,7 +85,7 @@ 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: [ 'feat/support_vite_7', << pipeline.git.branch >> ] + - equal: [ 'breaking/update_execa', << pipeline.git.branch >> ] - matches: pattern: /^release\/\d+\.\d+\.\d+$/ value: << pipeline.git.branch >> @@ -159,7 +159,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" != "mabel/issue-10425-studio-redesign" ]]; then + echo 'if ! [[ "$CIRCLE_BRANCH" != "develop" && "$CIRCLE_BRANCH" != "release/"* && "$CIRCLE_BRANCH" != "breaking/update_execa" ]]; 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 diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md index cb2d8abd235..98df3029a28 100644 --- a/cli/CHANGELOG.md +++ b/cli/CHANGELOG.md @@ -14,6 +14,7 @@ _Released 08/12/2025 (PENDING)_ - The application under test's `pagehide` event in Chromium browsers will no longer trigger Cypress's `window:unload` event. Addressed in [#31853](https://github.com/cypress-io/cypress/pull/31853). - The `Cypress.SelectorPlayground` API has been renamed to `Cypress.ElementSelector`. This API was renamed to accommodate its use for defining `selectorPriority` in Cypress Studio and our future [`cy.prompt` release](https://on.cypress.io/cy-prompt-early-access?utm_source=docs&utm_medium=app-changelog&utm_content=cy-prompt-release). Additionally, the `getSelector` method and the `onElement` option of `defaults` were removed from this API. Addresses [#31801](https://github.com/cypress-io/cypress/issues/31801). Addressed in [#31889](https://github.com/cypress-io/cypress/pull/31889) and [#32098](https://github.com/cypress-io/cypress/pull/32098). - The direct download option for installing Cypress is no longer supported. Users should install via a package manager. Addressed in [#32249](https://github.com/cypress-io/cypress/pull/32249). +- Updated `execa` from `1.0.0` to `4.1.0`. This changes the `code` property returned by [`cy.exec()`](https://docs.cypress.io/api/commands/exec) to `exitCode`. Addressed in [#32238](https://github.com/cypress-io/cypress/pull/32238). - **Component Testing breaking changes:** - Removed support for Angular 17. The minimum supported version is now `18.0.0`. Addresses [#31303](https://github.com/cypress-io/cypress/issues/31303). - `@cypress/angular` now requires a minimum of `zone.js` `0.14.0`. Addresses [#31582](https://github.com/cypress-io/cypress/issues/31582). diff --git a/package.json b/package.json index 92749381f01..40d9607f9bd 100644 --- a/package.json +++ b/package.json @@ -154,7 +154,7 @@ "eslint-plugin-react": "7.22.0", "eslint-plugin-react-hooks": "4.2.0", "eslint-plugin-vue": "7.18.0", - "execa": "4.0.0", + "execa": "4.1.0", "fast-xml-parser": "^4.5.1", "filesize": "10.1.1", "fs-extra": "9.1.0", diff --git a/packages/data-context/package.json b/packages/data-context/package.json index 7f2716e29cc..08ed0adec95 100644 --- a/packages/data-context/package.json +++ b/packages/data-context/package.json @@ -36,7 +36,7 @@ "dedent": "^0.7.0", "ejs": "^3.1.10", "endent": "2.0.1", - "execa": "1.0.0", + "execa": "4.1.0", "front-matter": "^4.0.2", "fs-extra": "8.1.0", "get-tsconfig": "4.10.0", diff --git a/packages/driver/cypress/e2e/commands/exec.cy.js b/packages/driver/cypress/e2e/commands/exec.cy.js index d02717a2f1c..da2c2d6fe14 100644 --- a/packages/driver/cypress/e2e/commands/exec.cy.js +++ b/packages/driver/cypress/e2e/commands/exec.cy.js @@ -2,7 +2,7 @@ const { assertLogLength } = require('../../support/utils') const { _, Promise } = Cypress describe('src/cy/commands/exec', () => { - const okResponse = { code: 0 } + const okResponse = { exitCode: 0 } context('#exec', { execTimeout: 2500, @@ -302,7 +302,7 @@ describe('src/cy/commands/exec', () => { describe('when error code is non-zero', () => { it('throws error that includes useful information and exit code', (done) => { - Cypress.backend.resolves({ code: 1 }) + Cypress.backend.resolves({ exitCode: 1 }) cy.on('fail', (err) => { expect(err.message).to.contain('`cy.exec(\'ls\')` failed because the command exited with a non-zero code.\n\nPass `{failOnNonZeroExit: false}` to ignore exit code failures.') @@ -316,7 +316,7 @@ describe('src/cy/commands/exec', () => { }) it('throws error that includes stderr if it exists and is non-empty', (done) => { - Cypress.backend.resolves({ code: 1, stderr: 'error output', stdout: '' }) + Cypress.backend.resolves({ exitCode: 1, stderr: 'error output', stdout: '' }) cy.on('fail', (err) => { expect(err.message).to.contain('Stderr:\nerror output') @@ -329,7 +329,7 @@ describe('src/cy/commands/exec', () => { }) it('throws error that includes stdout if it exists and is non-empty', (done) => { - Cypress.backend.resolves({ code: 1, stderr: '', stdout: 'regular output' }) + Cypress.backend.resolves({ exitCode: 1, stderr: '', stdout: 'regular output' }) cy.on('fail', (err) => { expect(err.message).to.contain('\nStdout:\nregular output') @@ -342,7 +342,7 @@ describe('src/cy/commands/exec', () => { }) it('throws error that includes stdout and stderr if they exists and are non-empty', (done) => { - Cypress.backend.resolves({ code: 1, stderr: 'error output', stdout: 'regular output' }) + Cypress.backend.resolves({ exitCode: 1, stderr: 'error output', stdout: 'regular output' }) cy.on('fail', (err) => { expect(err.message).to.contain('\nStdout:\nregular output\nStderr:\nerror output') @@ -355,7 +355,7 @@ describe('src/cy/commands/exec', () => { it('truncates the stdout and stderr in the error message', (done) => { Cypress.backend.resolves({ - code: 1, + exitCode: 1, stderr: `${_.range(200).join()}stderr should be truncated`, stdout: `${_.range(200).join()}stdout should be truncated`, }) @@ -381,7 +381,7 @@ describe('src/cy/commands/exec', () => { expect(Yielded).to.deep.eq({ stdout: 'foo', stderr: '', - code: 1, + exitCode: 1, }) done() @@ -392,7 +392,7 @@ describe('src/cy/commands/exec', () => { describe('and failOnNonZeroExit is false', () => { it('does not error', () => { - const response = { code: 1, stderr: 'error output', stdout: 'regular output' } + const response = { exitCode: 1, stderr: 'error output', stdout: 'regular output' } Cypress.backend.resolves(response) diff --git a/packages/driver/cypress/e2e/e2e/origin/commands/misc.cy.ts b/packages/driver/cypress/e2e/e2e/origin/commands/misc.cy.ts index a58e07bda1e..b9a88953f60 100644 --- a/packages/driver/cypress/e2e/e2e/origin/commands/misc.cy.ts +++ b/packages/driver/cypress/e2e/e2e/origin/commands/misc.cy.ts @@ -93,7 +93,7 @@ context('cy.origin misc', { browser: '!webkit' }, () => { expect(consoleProps.name).to.equal('exec') expect(consoleProps.type).to.equal('command') expect(consoleProps.props['Shell Used']).to.be.undefined - expect(consoleProps.props.Yielded).to.have.property('code').that.equals(0) + expect(consoleProps.props.Yielded).to.have.property('exitCode').that.equals(0) expect(consoleProps.props.Yielded).to.have.property('stderr').that.equals('') expect(consoleProps.props.Yielded).to.have.property('stdout').that.equals('foobar') }) diff --git a/packages/driver/src/cy/commands/exec.ts b/packages/driver/src/cy/commands/exec.ts index f01633a8e72..7539c011bc6 100644 --- a/packages/driver/src/cy/commands/exec.ts +++ b/packages/driver/src/cy/commands/exec.ts @@ -63,7 +63,7 @@ export default (Commands, Cypress, cy) => { consoleOutput['Shell Used'] = result.shell } - if ((result.code === 0) || !options.failOnNonZeroExit) { + if ((result.exitCode === 0) || !options.failOnNonZeroExit) { return result } @@ -79,7 +79,7 @@ export default (Commands, Cypress, cy) => { return $errUtils.throwErrByPath('exec.non_zero_exit', { onFail: options._log, - args: { cmd, output, code: result.code }, + args: { cmd, output, code: result.exitCode }, }) }) .catch(Promise.TimeoutError, { timedOut: true }, () => { diff --git a/packages/example/package.json b/packages/example/package.json index 3ee4f951d3c..dc87df58a23 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -14,7 +14,7 @@ "test-unit": "echo 'no unit tests'" }, "devDependencies": { - "cypress-example-kitchensink": "5.0.0", + "cypress-example-kitchensink": "5.1.0", "gh-pages": "5.0.0", "gulp": "4.0.2", "gulp-clean": "0.4.0", diff --git a/packages/frontend-shared/package.json b/packages/frontend-shared/package.json index 1422e88fca2..7b6672afae4 100644 --- a/packages/frontend-shared/package.json +++ b/packages/frontend-shared/package.json @@ -74,7 +74,7 @@ "cypress-real-events": "1.14.0", "dayjs": "^1.9.3", "dedent": "^0.7.0", - "execa": "4.0.0", + "execa": "4.1.0", "fake-uuid": "^1.0.0", "floating-vue": "2.0.0-beta.17", "fs-extra": "9.1.0", diff --git a/packages/launcher/package.json b/packages/launcher/package.json index 6667a6d8750..db0f0c9a611 100644 --- a/packages/launcher/package.json +++ b/packages/launcher/package.json @@ -17,7 +17,7 @@ "dependencies": { "bluebird": "3.5.3", "debug": "^4.3.4", - "execa": "4.0.0", + "execa": "4.1.0", "fs-extra": "9.1.0", "lodash": "^4.17.21", "plist": "3.1.0", diff --git a/packages/launchpad/cypress/e2e/open-mode.cy.ts b/packages/launchpad/cypress/e2e/open-mode.cy.ts index bccc142145c..13df346c1df 100644 --- a/packages/launchpad/cypress/e2e/open-mode.cy.ts +++ b/packages/launchpad/cypress/e2e/open-mode.cy.ts @@ -289,12 +289,14 @@ describe('Launchpad: Open Mode', () => { // so just adding one here { id: 'well-known-editor', - binary: '/usr/bin/well-known', + binary: o.platform === 'win32' ? 'cmd.exe' : '/bin/bash', name: 'Well known editor', }, ] ctx.coreData.app.projects = [{ projectRoot: '/some/project', savedState: () => Promise.resolve({}) }] + }, { + platform: Cypress.platform, }) cy.visitLaunchpad() @@ -315,7 +317,7 @@ describe('Launchpad: Open Mode', () => { cy.get('@modal').contains('Choose your editor...').click() cy.get('@modal').contains('Well known editor').click() cy.get('@modal').contains('Save changes').click() - cy.wait('@SetPreferred').its('request.body.variables.value').should('include', '/usr/bin/well-known') + cy.wait('@SetPreferred').its('request.body.variables.value').should('include', Cypress.platform === 'win32' ? 'cmd.exe' : '/bin/bash') }) it('opens using finder', () => { diff --git a/packages/server/lib/exec.js b/packages/server/lib/exec.js index d8f61eecc7c..1d6d1c41f6a 100644 --- a/packages/server/lib/exec.js +++ b/packages/server/lib/exec.js @@ -2,10 +2,10 @@ const Promise = require('bluebird') const execa = require('execa') const shellEnv = require('shell-env') const _ = require('lodash') -const log = require('./log') +const log = require('debug')('cypress:server:exec') const utils = require('./util/shell') -const pickMainProps = (val) => _.pick(val, ['stdout', 'stderr', 'code']) +const pickMainProps = (val) => _.pick(val, ['stdout', 'stderr', 'exitCode']) const trimStdio = (val) => { const result = { ...val } @@ -32,7 +32,7 @@ module.exports = { log('and is running command:', options.cmd) log('in folder:', projectRoot) - return execa.shell(cmd, { cwd, env, shell }) + return execa(cmd, { cwd, env, shell: shell || true }) .then((result) => { // do we want to return all fields returned by execa? result.shell = shell diff --git a/packages/server/lib/util/shell.js b/packages/server/lib/util/shell.js index ca107de7145..a4227fce84c 100644 --- a/packages/server/lib/util/shell.js +++ b/packages/server/lib/util/shell.js @@ -3,7 +3,7 @@ const Promise = require('bluebird') const execa = require('execa') const os = require('os') const commandExistsModule = require('command-exists') -const log = require('../log') +const log = require('debug')('cypress:server:util:shell') const isWindows = () => { return os.platform() === 'win32' @@ -69,7 +69,7 @@ const sourceShellCommand = function (cmd, shell) { } const findBash = () => { - return execa.shell('which bash') + return execa('which bash', { shell: true }) .then((val) => val.stdout) } diff --git a/packages/server/package.json b/packages/server/package.json index 995d41bb061..e463733397f 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -69,7 +69,7 @@ "electron-context-menu": "3.6.1", "errorhandler": "1.5.1", "evil-dns": "0.2.0", - "execa": "1.0.0", + "execa": "4.1.0", "express": "4.21.0", "fetch-retry-ts": "^1.3.1", "find-process": "1.4.7", diff --git a/packages/server/test/scripts/run.js b/packages/server/test/scripts/run.js index ad1c9456787..eaa5babda08 100644 --- a/packages/server/test/scripts/run.js +++ b/packages/server/test/scripts/run.js @@ -167,12 +167,12 @@ console.log('specfiles:', run) console.log('test command:') console.log(cmd) -const child = execa.shell(cmd, { env, stdio: 'inherit' }) +const child = execa(cmd, { env, stdio: 'inherit', shell: true }) -child.on('exit', (code, signal) => { +child.on('exit', (exitCode, signal) => { if (signal) { console.error(`tests exited with signal ${signal}`) } - process.exit(code === null ? 1 : code) + process.exit(exitCode === null ? 1 : exitCode) }) diff --git a/packages/server/test/unit/exec_spec.js b/packages/server/test/unit/exec_spec.js index a19dc598016..b22ea5795fd 100644 --- a/packages/server/test/unit/exec_spec.js +++ b/packages/server/test/unit/exec_spec.js @@ -27,12 +27,12 @@ describe('lib/exec', function () { this.timeout(10000) describe('basic tests', () => { - it('returns only stdout, stderr, and code', () => { + it('returns only stdout, stderr, and exitCode', () => { return runCommand('echo foo') .then((result) => { const props = Object.keys(result) - expect(props).to.deep.eq(['stdout', 'stderr', 'code']) + expect(props).to.deep.eq(['stdout', 'stderr', 'exitCode']) }) }) @@ -42,7 +42,7 @@ describe('lib/exec', function () { const expected = { stdout: 'foo', stderr: '', - code: 0, + exitCode: 0, } expect(result).to.deep.eq(expected) @@ -64,7 +64,7 @@ describe('lib/exec', function () { const expected = { stdout: '\'foo\'', stderr: '', - code: 0, + exitCode: 0, } expect(result).to.deep.eq(expected) @@ -77,7 +77,7 @@ describe('lib/exec', function () { const expected = { stdout: '\'foo bar\'', stderr: '', - code: 0, + exitCode: 0, } expect(result).to.deep.eq(expected) @@ -119,7 +119,7 @@ describe('lib/exec', function () { it('reports the stderr', () => { return runCommand('>&2 echo \'some error\'') .then((result) => { - expect(result.code).to.eq(0) + expect(result.exitCode).to.eq(0) expect(result.stderr).to.equal('\'some error\'') }) @@ -131,7 +131,7 @@ describe('lib/exec', function () { .then((result) => { expect(result.stdout).to.equal('') expect(result.stderr).to.equal('The system cannot find the file specified.') - expect(result.code).to.equal(1) + expect(result.exitCode).to.equal(1) // stderr should be trimmed already expect(result.stderr.trim()).to.equal(result.stderr) @@ -165,7 +165,7 @@ describe('lib/exec', function () { const expected = { stdout: 'foo', stderr: '', - code: 0, + exitCode: 0, } expect(result).to.deep.eq(expected) @@ -178,7 +178,7 @@ describe('lib/exec', function () { const expected = { stdout: 'foo bar', stderr: '', - code: 0, + exitCode: 0, } expect(result).to.deep.eq(expected) @@ -218,7 +218,7 @@ describe('lib/exec', function () { it('reports the stderr', () => { return runCommand('>&2 echo \'some error\'') .then((result) => { - expect(result.code).to.eq(0) + expect(result.exitCode).to.eq(0) expect(result.stderr).to.equal('some error') }) @@ -230,7 +230,7 @@ describe('lib/exec', function () { .then((result) => { expect(result.stdout).to.equal('') expect(result.stderr).to.equal('cat: nooope: No such file or directory') - expect(result.code).to.equal(1) + expect(result.exitCode).to.equal(1) // stderr should be trimmed already expect(result.stderr.trim()).to.equal(result.stderr) diff --git a/packages/server/test/unit/util/suppress_warnings_spec.ts b/packages/server/test/unit/util/suppress_warnings_spec.ts index 6e3951c1e2c..43877e4233c 100644 --- a/packages/server/test/unit/util/suppress_warnings_spec.ts +++ b/packages/server/test/unit/util/suppress_warnings_spec.ts @@ -10,7 +10,8 @@ const SUPPRESS_WARNING = `require('${__dirname}/../../../lib/util/suppress_warni describe('lib/util/suppress_warnings', function () { it('tls.connect emits warning if NODE_TLS_REJECT_UNAUTHORIZED=0 and not suppressed', function () { - return execa.shell(`node -e "${TLS_CONNECT}"`, { + return execa(`node -e "${TLS_CONNECT}"`, { + shell: true, env: { 'NODE_TLS_REJECT_UNAUTHORIZED': '0', }, @@ -22,7 +23,8 @@ describe('lib/util/suppress_warnings', function () { it('tls.connect does not emit warning if NODE_TLS_REJECT_UNAUTHORIZED=0 and suppressed', function () { // test 2 sequential tls.connects - return execa.shell(`node -e "${SUPPRESS_WARNING} ${TLS_CONNECT} ${TLS_CONNECT}"`, { + return execa(`node -e "${SUPPRESS_WARNING} ${TLS_CONNECT} ${TLS_CONNECT}"`, { + shell: true, env: { 'NODE_TLS_REJECT_UNAUTHORIZED': '0', }, diff --git a/system-tests/package.json b/system-tests/package.json index a95257cb19b..f9198674125 100644 --- a/system-tests/package.json +++ b/system-tests/package.json @@ -59,7 +59,7 @@ "dedent": "^0.7.0", "dockerode": "3.3.1", "esbuild": "^0.15.3", - "execa": "4", + "execa": "4.1.0", "express": "4.21.0", "express-session": "1.16.1", "express-useragent": "1.0.15", diff --git a/yarn.lock b/yarn.lock index c4336935a79..4c56ba69320 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13781,10 +13781,10 @@ 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@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cypress-example-kitchensink/-/cypress-example-kitchensink-5.0.0.tgz#d3757014cd38c94e1cda0d18d953a19dd4c1d7d5" - integrity sha512-/u81WtivUHX9gObcr4Fjj6a0FhJFqIQoN++k2Wqmeo2bVkO7AtOwVFGoy/V0LhY6MsfXXkQ0pklVFhcDLi4yxA== +cypress-example-kitchensink@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cypress-example-kitchensink/-/cypress-example-kitchensink-5.1.0.tgz#fd5dce57b6251d1642cc1a523e4715fc474528f9" + integrity sha512-vuGHIz4fi3CpQ+/TFIXMbaB6qODFDRZGlbhpbKmKn0Iytwj5EMvGhHxCoDXRNXa1DUCp7AMQrl/i16HwcLFKRw== dependencies: npm-run-all2 "7.0.2" serve "14.2.4" @@ -16279,7 +16279,7 @@ execa@1.0.0, execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@4, execa@4.1.0: +execa@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== @@ -16294,21 +16294,6 @@ execa@4, execa@4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.0.tgz#7f37d6ec17f09e6b8fc53288611695b6d12b9daf" - integrity sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - execa@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376"