diff --git a/circle.yml b/circle.yml index 115fefd406b8..5d66158f36a3 100644 --- a/circle.yml +++ b/circle.yml @@ -269,7 +269,6 @@ jobs: at: ~/ - run: mkdir -p cli/visual-snapshots - run: - # TODO sanitize "cypress info" output to be consistent command: node cli/bin/cypress info --dev | yarn --silent term-to-html | node scripts/sanitize --type cli-info > cli/visual-snapshots/cypress-info.html environment: FORCE_COLOR: 2 @@ -305,6 +304,9 @@ jobs: expectedResultCount: 6 - store_test_results: path: /tmp/cypress + # CLI tests generate HTML files with sample CLI command output + - store_artifacts: + path: cli/test/html - store-npm-logs lint-types: diff --git a/cli/__snapshots__/cache_spec.js b/cli/__snapshots__/cache_spec.js index 2811dd1a121a..f4809c8128db 100644 --- a/cli/__snapshots__/cache_spec.js +++ b/cli/__snapshots__/cache_spec.js @@ -3,9 +3,35 @@ exports['lib/tasks/cache .clear deletes cache folder and everything inside it 1' ` exports['lib/tasks/cache .list lists all versions of cached binary 1'] = ` -1.2.3, 2.3.4 +┌─────────┬───────────┐ +│ version │ last used │ +├─────────┼───────────┤ +│ 1.2.3 │ unknown │ +├─────────┼───────────┤ +│ 2.3.4 │ unknown │ +└─────────┴───────────┘ ` exports['lib/tasks/cache .path lists path to cache 1'] = ` /.cache/Cypress ` + +exports['lib/tasks/cache .list lists all versions of cached binary with last access 1'] = ` +┌─────────┬──────────────┐ +│ version │ last used │ +├─────────┼──────────────┤ +│ 1.2.3 │ 3 months ago │ +├─────────┼──────────────┤ +│ 2.3.4 │ 5 days ago │ +└─────────┴──────────────┘ +` + +exports['lib/tasks/cache .list some versions have never been opened 1'] = ` +┌─────────┬──────────────┐ +│ version │ last used │ +├─────────┼──────────────┤ +│ 1.2.3 │ 3 months ago │ +├─────────┼──────────────┤ +│ 2.3.4 │ unknown │ +└─────────┴──────────────┘ +` diff --git a/cli/lib/tasks/cache.js b/cli/lib/tasks/cache.js index 83d3ebd61687..4cd9371ec4d9 100644 --- a/cli/lib/tasks/cache.js +++ b/cli/lib/tasks/cache.js @@ -2,7 +2,20 @@ const state = require('./state') const logger = require('../logger') const fs = require('../fs') const util = require('../util') +const { join } = require('path') +const Table = require('cli-table3') +const moment = require('moment') +const chalk = require('chalk') +const _ = require('lodash') +// output colors for the table +const colors = { + titles: chalk.white, + dates: chalk.cyan, + values: chalk.green, +} + +// TODO: rename this function const path = () => { logger.log(state.getCacheDir()) @@ -15,15 +28,59 @@ const clear = () => { const list = () => { return getCachedVersions() - .then((versions) => { - logger.log(versions.join(', ')) + .then((binaries) => { + const table = new Table({ + head: [colors.titles('version'), colors.titles('last used')], + }) + + binaries.forEach((binary) => { + const versionString = colors.values(binary.version) + const lastUsed = binary.accessed ? colors.dates(binary.accessed) : 'unknown' + + return table.push([versionString, lastUsed]) + }) + + logger.log(table.toString()) }) } const getCachedVersions = () => { + const cacheDir = state.getCacheDir() + return fs - .readdirAsync(state.getCacheDir()) + .readdirAsync(cacheDir) .filter(util.isSemver) + .map((version) => { + return { + version, + folderPath: join(cacheDir, version), + } + }) + .mapSeries((binary) => { + // last access time on the folder is different from last access time + // on the Cypress binary + const binaryDir = state.getBinaryDir(binary.version) + const executable = state.getPathToExecutable(binaryDir) + + return fs.statAsync(executable).then((stat) => { + const lastAccessedTime = _.get(stat, 'atime') + + if (!lastAccessedTime) { + // the test runner has never been opened + // or could be a test simulating missing timestamp + return binary + } + + const accessed = moment(lastAccessedTime).fromNow() + + binary.accessed = accessed + + return binary + }, (e) => { + // could not find the binary or gets its stats + return binary + }) + }) } module.exports = { diff --git a/cli/package.json b/cli/package.json index d38f120c6872..3017123b0d38 100644 --- a/cli/package.json +++ b/cli/package.json @@ -38,6 +38,7 @@ "cachedir": "2.3.0", "chalk": "2.4.2", "check-more-types": "2.24.0", + "cli-table3": "0.5.1", "commander": "4.1.0", "common-tags": "1.8.0", "debug": "4.1.1", @@ -58,7 +59,7 @@ "ospath": "1.2.2", "pretty-bytes": "5.3.0", "ramda": "0.26.1", - "request": "2.88.0", + "request": "cypress-io/request#b5af0d1fa47eec97ba980cde90a13e69a2afcd16", "request-progress": "3.0.0", "supports-color": "7.1.0", "tmp": "0.1.0", diff --git a/cli/test/html/list-of-versions.html b/cli/test/html/list-of-versions.html new file mode 100644 index 000000000000..f31e4f4c3ebd --- /dev/null +++ b/cli/test/html/list-of-versions.html @@ -0,0 +1,27 @@ + + +
+ + + +┌─────────┬──────────────┐
+│ version │ last used │
+├─────────┼──────────────┤
+│ 1.2.3 │ 3 months ago │
+├─────────┼──────────────┤
+│ 2.3.4 │ 5 days ago │
+└─────────┴──────────────┘
+
\ No newline at end of file
diff --git a/cli/test/html/second-binary-never-used.html b/cli/test/html/second-binary-never-used.html
new file mode 100644
index 000000000000..705b278e1096
--- /dev/null
+++ b/cli/test/html/second-binary-never-used.html
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+ ┌─────────┬──────────────┐
+│ version │ last used │
+├─────────┼──────────────┤
+│ 1.2.3 │ 3 months ago │
+├─────────┼──────────────┤
+│ 2.3.4 │ unknown │
+└─────────┴──────────────┘
+
\ No newline at end of file
diff --git a/cli/test/lib/tasks/cache_spec.js b/cli/test/lib/tasks/cache_spec.js
index 7036d12b2871..bfb08406b026 100644
--- a/cli/test/lib/tasks/cache_spec.js
+++ b/cli/test/lib/tasks/cache_spec.js
@@ -7,6 +7,12 @@ const state = require(`${lib}/tasks/state`)
const cache = require(`${lib}/tasks/cache`)
const stdout = require('../../support/stdout')
const snapshot = require('../../support/snapshot')
+const moment = require('moment')
+const stripAnsi = require('strip-ansi')
+const path = require('path')
+const termToHtml = require('term-to-html')
+
+const outputHtmlFolder = path.join(__dirname, '..', '..', 'html')
describe('lib/tasks/cache', () => {
beforeEach(() => {
@@ -22,20 +28,54 @@ describe('lib/tasks/cache', () => {
})
sinon.stub(state, 'getCacheDir').returns('/.cache/Cypress')
+ sinon.stub(state, 'getBinaryDir').returns('/.cache/Cypress')
this.stdout = stdout.capture()
})
+ const getSnapshotText = () => {
+ this.stdout = this.stdout.toString().split('\n').slice(0, -1).join('\n')
+ const stdoutAsString = this.stdout.toString() || '[no output]'
+
+ // first restore the STDOUT, then confirm the value
+ // otherwise the error might not even appear or appear twice!
+ stdout.restore()
+
+ return stdoutAsString
+ }
+
+ const saveHtml = async (filename, html) => {
+ await fs.ensureDirAsync(outputHtmlFolder)
+ const htmlFilename = path.join(outputHtmlFolder, filename)
+
+ await fs.writeFileAsync(htmlFilename, html, 'utf8')
+ }
+
afterEach(() => {
mockfs.restore()
- this.stdout = this.stdout.toString().split('\n').slice(0, -2).join('\n')
- snapshot(this.stdout.toString() || '[no output]')
- stdout.restore()
})
+ const defaultSnapshot = () => {
+ const stdoutAsString = getSnapshotText()
+
+ snapshot(stripAnsi(stdoutAsString))
+ }
+
+ const snapshotWithHtml = async (htmlFilename) => {
+ const stdoutAsString = getSnapshotText()
+
+ snapshot(stripAnsi(stdoutAsString))
+
+ // if the sanitized snapshot matches, let's save the ANSI colors converted into HTML
+ const html = termToHtml.strings(stdoutAsString, termToHtml.themes.dark.name)
+
+ await saveHtml(htmlFilename, html)
+ }
+
describe('.path', () => {
it('lists path to cache', () => {
cache.path()
expect(this.stdout.toString()).to.eql('/.cache/Cypress\n')
+ defaultSnapshot()
})
})
@@ -45,18 +85,54 @@ describe('lib/tasks/cache', () => {
.then(() => {
return fs.pathExistsAsync('/.cache/Cypress')
.then((exists) => {
- return expect(exists).to.eql(false)
+ expect(exists).to.eql(false)
+ defaultSnapshot()
})
})
})
})
describe('.list', () => {
- it('lists all versions of cached binary', () => {
- return cache.list()
- .then(() => {
- expect(this.stdout.toString()).to.eql('1.2.3, 2.3.4\n')
+ it('lists all versions of cached binary', async function () {
+ // unknown access times
+ sinon.stub(state, 'getPathToExecutable').returns('/.cache/Cypress/1.2.3/app/cypress')
+
+ await cache.list()
+
+ defaultSnapshot()
+ })
+
+ it('lists all versions of cached binary with last access', async function () {
+ sinon.stub(state, 'getPathToExecutable').returns('/.cache/Cypress/1.2.3/app/cypress')
+
+ const statAsync = sinon.stub(fs, 'statAsync')
+
+ statAsync.onFirstCall().resolves({
+ atime: moment().subtract(3, 'month').valueOf(),
+ })
+
+ statAsync.onSecondCall().resolves({
+ atime: moment().subtract(5, 'day').valueOf(),
})
+
+ await cache.list()
+ await snapshotWithHtml('list-of-versions.html')
+ })
+
+ it('some versions have never been opened', async function () {
+ sinon.stub(state, 'getPathToExecutable').returns('/.cache/Cypress/1.2.3/app/cypress')
+
+ const statAsync = sinon.stub(fs, 'statAsync')
+
+ statAsync.onFirstCall().resolves({
+ atime: moment().subtract(3, 'month').valueOf(),
+ })
+
+ // the second binary has never been accessed
+ statAsync.onSecondCall().resolves()
+
+ await cache.list()
+ await snapshotWithHtml('second-binary-never-used.html')
})
})
})
diff --git a/cli/types/index.d.ts b/cli/types/index.d.ts
index 52c285496379..23226d15ecf1 100644
--- a/cli/types/index.d.ts
+++ b/cli/types/index.d.ts
@@ -627,12 +627,12 @@ declare namespace Cypress {
* @param {string} [key] - name of a particular item to remove (optional).
* @example
```
- // removes all local storage keys
+ // Removes all local storage keys
cy.clearLocalStorage()
.should(ls => {
expect(ls.getItem('prop1')).to.be.null
})
- // removes item "todos"
+ // Removes item "todos"
cy.clearLocalStorage("todos")
```
*/
@@ -644,11 +644,42 @@ declare namespace Cypress {
* @param {RegExp} re - regular expression to match.
* @example
```
- // Clear all local storage matching /app-/
+ // Clears all local storage matching /app-/
cy.clearLocalStorage(/app-/)
```
*/
clearLocalStorage(re: RegExp): Chainable- {error.error.replace(/\{newline\}/g, '\n')} +) }) diff --git a/packages/runner/src/errors/script-error.spec.jsx b/packages/runner/src/errors/script-error.spec.jsx index 134cfcd1acad..fc72732a316f 100644 --- a/packages/runner/src/errors/script-error.spec.jsx +++ b/packages/runner/src/errors/script-error.spec.jsx @@ -5,9 +5,21 @@ import ScriptError from './script-error' describe('', () => { it('renders nothing when there is no script error', () => { - const state = { scriptError: null } - const component = shallow( ) + const state = { error: null } + const component = shallow( ) expect(component).to.be.empty }) + + it('renders ansi as colors', () => { + const state = { error: { error: `Webpack Compilation Error + [0m [90m 11 | [39m it([32m'is true for actual jquery instances'[39m[33m,[39m () [33m=>[39m [0m + @ multi ./cypress/integration/dom/jquery_spec.js main[0]` } } + const component = shallow( ) + const { dangerouslySetInnerHTML } = component.props() + + expect(dangerouslySetInnerHTML.__html).eq(`Webpack Compilation Error + 11 | it('is true for actual jquery instances', () => + @ multi ./cypress/integration/dom/jquery_spec.js main[0]`) + }) }) diff --git a/packages/runner/test/.mocharc.json b/packages/runner/test/.mocharc.json new file mode 100644 index 000000000000..10adafe206a8 --- /dev/null +++ b/packages/runner/test/.mocharc.json @@ -0,0 +1,5 @@ +{ + "file": "test/helper.js", + "require": "../web-config/node-register", + "extension": "ts,jsx,tsx,coffee,js" +} diff --git a/packages/runner/test/mocha.opts b/packages/runner/test/mocha.opts deleted file mode 100644 index 64314467da91..000000000000 --- a/packages/runner/test/mocha.opts +++ /dev/null @@ -1,3 +0,0 @@ ---require ../web-config/node-register ---watch-extensions ts,jsx,tsx,coffee,js ---file test/helper diff --git a/packages/server/lib/browsers/electron.js b/packages/server/lib/browsers/electron.js index 6e83d42cefd2..7197873ee17e 100644 --- a/packages/server/lib/browsers/electron.js +++ b/packages/server/lib/browsers/electron.js @@ -231,12 +231,14 @@ module.exports = { return originalSendCommand.call(webContents.debugger, message, data) .then((res) => { - if (debug.enabled && (_.get(res, 'data.length') > 100)) { - res = _.clone(res) - res.data = `${res.data.slice(0, 100)} [truncated]` + let debugRes = res + + if (debug.enabled && (_.get(debugRes, 'data.length') > 100)) { + debugRes = _.clone(debugRes) + debugRes.data = `${debugRes.data.slice(0, 100)} [truncated]` } - debug('debugger: received response to %s: %o', message, res) + debug('debugger: received response to %s: %o', message, debugRes) return res }).catch((err) => { diff --git a/packages/server/lib/plugins/preprocessor.coffee b/packages/server/lib/plugins/preprocessor.coffee index 6d07c25a2ae9..4ab1791b9b4d 100644 --- a/packages/server/lib/plugins/preprocessor.coffee +++ b/packages/server/lib/plugins/preprocessor.coffee @@ -16,15 +16,9 @@ errorMessage = (err = {}) -> .replace(/From previous event:\n?/g, "") clientSideError = (err) -> - console.log(err.stack) + console.log(err.message) err = errorMessage(err) - ## \n doesn't come through properly so preserve it so the - ## runner can do the right thing - .replace(/\n/g, '{newline}') - ## babel adds syntax highlighting for the console in the form of - ## [90m that need to be stripped out or they appear in the error message - .replace(/\[\d{1,3}m/g, '') """ (function () { @@ -93,7 +87,7 @@ module.exports = { baseEmitter.once "close", -> debug("base emitter native close event") fileObject.emit("close") - + if not plugins.has("file:preprocessor") setDefaultPreprocessor(config) diff --git a/packages/server/lib/request.coffee b/packages/server/lib/request.coffee index 40927bff5302..c82e21121a88 100644 --- a/packages/server/lib/request.coffee +++ b/packages/server/lib/request.coffee @@ -15,6 +15,7 @@ SERIALIZABLE_COOKIE_PROPS = ['name', 'value', 'domain', 'expiry', 'path', 'secur NETWORK_ERRORS = "ECONNREFUSED ECONNRESET EPIPE EHOSTUNREACH EAI_AGAIN ENOTFOUND".split(" ") VERBOSE_REQUEST_OPTS = "followRedirect strictSSL".split(" ") HTTP_CLIENT_REQUEST_EVENTS = "abort connect continue information socket timeout upgrade".split(" ") +TLS_VERSION_ERROR_RE = /TLSV1_ALERT_PROTOCOL_VERSION|UNSUPPORTED_PROTOCOL/ process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" @@ -81,7 +82,15 @@ maybeRetryOnNetworkFailure = (err, options = {}) -> debug("received an error making http request %o", merge(opts, { err })) - if not isRetriableError(err, retryOnNetworkFailure) + isTlsVersionError = TLS_VERSION_ERROR_RE.test(err.message) + + if isTlsVersionError + ## because doing every connection via TLSv1 can lead to slowdowns, we set it only on failure + ## https://github.com/cypress-io/cypress/pull/6705 + debug('detected TLS version error, setting min version to TLSv1') + opts.minVersion = 'TLSv1' + + if not isTlsVersionError and not isRetriableError(err, retryOnNetworkFailure) return onElse() ## else see if we have more delays left... diff --git a/packages/server/package.json b/packages/server/package.json index 83471905ab60..ced0ab97d995 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -27,7 +27,7 @@ "@cypress/get-windows-proxy": "1.6.0", "@cypress/icons": "0.7.0", "@cypress/mocha-teamcity-reporter": "1.0.0", - "@ffmpeg-installer/ffmpeg": "1.0.19", + "@ffmpeg-installer/ffmpeg": "1.0.20", "ansi_up": "4.0.4", "black-hole-stream": "0.0.1", "bluebird": "3.7.0", diff --git a/packages/server/test/e2e/3_plugins_spec.js b/packages/server/test/e2e/3_plugins_spec.js index 9628c92e0ea9..9a59035fd117 100644 --- a/packages/server/test/e2e/3_plugins_spec.js +++ b/packages/server/test/e2e/3_plugins_spec.js @@ -29,7 +29,10 @@ describe('e2e plugins', function () { }) }) - it('fails when there is an async error at the root', function () { + // NOTE: skipping this test for now since it's flaky. the fix requires a + // deeper dive into the error handling of run mode, which will take time. + // better to skip this for now so it doesn't hang up other work + it.skip('fails when there is an async error at the root', function () { return e2e.exec(this, { spec: 'app_spec.js', project: pluginsRootAsyncError, diff --git a/packages/server/test/performance/proxy_performance_spec.js b/packages/server/test/performance/proxy_performance_spec.js index 9cdeae85fe93..321d778b0ef9 100644 --- a/packages/server/test/performance/proxy_performance_spec.js +++ b/packages/server/test/performance/proxy_performance_spec.js @@ -109,7 +109,7 @@ const average = (arr) => { } const percentile = (sortedArr, p) => { - const i = Math.floor(p / 100 * sortedArr.length - 1) + const i = Math.floor(p / 100 * (sortedArr.length - 1)) return Math.round(sortedArr[i]) } @@ -167,6 +167,8 @@ const getResultsFromHar = (har) => { results['Min'] = mins.total + expect(timings.total.length).to.be.at.least(1000) + ;[1, 5, 25, 50, 75, 95, 99, 99.7].forEach((p) => { results[`${p}% <=`] = percentile(timings.total, p) }) @@ -356,10 +358,9 @@ describe('Proxy Performance', function () { }) URLS_UNDER_TEST.map((urlUnderTest) => { - const testCases = _.cloneDeep(TEST_CASES) - describe(urlUnderTest, function () { let baseline + const testCases = _.cloneDeep(TEST_CASES) before(function () { // run baseline test @@ -373,12 +374,20 @@ describe('Proxy Performance', function () { // slice(1) since first test is used as baseline above testCases.slice(1).map((testCase) => { - it(`${testCase.name} loads 1000 images, with 75% loading no more than 2x as slow as the slowest baseline request`, function () { + let multiplier = 3 + + if (testCase.httpsUpstreamProxy) { + // there is extra slowdown when the HTTPS upstream is used, so slightly increase the multiplier + // maybe from higher CPU utilization with debugging-proxy and HTTPS + multiplier *= 1.5 + } + + it(`${testCase.name} loads 1000 images less than ${multiplier}x as slowly as Chrome`, function () { debug('Current test: ', testCase.name) return runBrowserTest(urlUnderTest, testCase) .then((results) => { - expect(results['75% <=']).to.be.lessThan(baseline['Max'] * 2) + expect(results['Total']).to.be.lessThan(multiplier * baseline['Total']) }) }) }) diff --git a/packages/server/test/unit/plugins/preprocessor_spec.coffee b/packages/server/test/unit/plugins/preprocessor_spec.coffee index 553a9bef672f..9f875f753e5b 100644 --- a/packages/server/test/unit/plugins/preprocessor_spec.coffee +++ b/packages/server/test/unit/plugins/preprocessor_spec.coffee @@ -125,11 +125,12 @@ describe "lib/plugins/preprocessor", -> }()) """) - it "replaces new lines with {newline} placeholder", -> - expect(preprocessor.clientSideError("with\nnew\nlines")).to.include('error: "with{newline}new{newline}lines"') - it "removes command line syntax highlighting characters", -> - expect(preprocessor.clientSideError("[30mfoo[100mbar[7mbaz")).to.include('error: "foobarbaz"') + it "does not replace new lines with {newline} placeholder", -> + expect(preprocessor.clientSideError("with\nnew\nlines")).to.include('error: "with\\nnew\\nlines"') + + it "does not remove command line syntax highlighting characters", -> + expect(preprocessor.clientSideError("[30mfoo[100mbar[7mbaz")).to.include('error: "[30mfoo[100mbar[7mbaz"') context "#errorMessage", -> it "handles error strings", -> diff --git a/packages/web-config/node-jsdom-setup.ts b/packages/web-config/node-jsdom-setup.ts index 36967ce89733..87de82d75b14 100644 --- a/packages/web-config/node-jsdom-setup.ts +++ b/packages/web-config/node-jsdom-setup.ts @@ -90,7 +90,8 @@ export const register = ({ } // Follow browser-field spec for importing modules - if (!['path'].includes(args[0])) { + // except chalk so we dont mess up mocha coloring + if (!['path'].includes(args[0]) && !(args[1] && args[1].id.includes('chalk'))) { try { browserPkg = [bresolve.sync.apply(this, args)] } catch (e) { diff --git a/yarn.lock b/yarn.lock index 8337a74624eb..fa744a35e0fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1742,23 +1742,23 @@ resolved "https://registry.yarnpkg.com/@ffmpeg-installer/darwin-x64/-/darwin-x64-4.1.0.tgz#48e1706c690e628148482bfb64acb67472089aaa" integrity sha512-Z4EyG3cIFjdhlY8wI9aLUXuH8nVt7E9SlMVZtWvSPnm2sm37/yC2CwjUzyCQbJbySnef1tQwGG2Sx+uWhd9IAw== -"@ffmpeg-installer/ffmpeg@1.0.19": - version "1.0.19" - resolved "https://registry.yarnpkg.com/@ffmpeg-installer/ffmpeg/-/ffmpeg-1.0.19.tgz#2718bf06a7d215acd12fdfd05097f4e55d2d2c7e" - integrity sha512-cIhboAWGJSiQut6kE5DzljN2CO1RzYDaEJIje/RUl43yK1EQUHnpoeS9BLIulqM93o0ga9SRPKTqOgg76KYyfw== +"@ffmpeg-installer/ffmpeg@1.0.20": + version "1.0.20" + resolved "https://registry.yarnpkg.com/@ffmpeg-installer/ffmpeg/-/ffmpeg-1.0.20.tgz#d3c9c2bbcd76149468fb0886c2b3fe9e4795490b" + integrity sha512-wbgd//6OdwbFXYgV68ZyKrIcozEQpUKlvV66XHaqO2h3sFbX0jYLzx62Q0v8UcFWN21LoxT98NU2P+K0OWsKNA== optionalDependencies: "@ffmpeg-installer/darwin-x64" "4.1.0" "@ffmpeg-installer/linux-arm" "4.1.3" - "@ffmpeg-installer/linux-arm64" "4.1.3" + "@ffmpeg-installer/linux-arm64" "4.1.4" "@ffmpeg-installer/linux-ia32" "4.1.0" "@ffmpeg-installer/linux-x64" "4.1.0" "@ffmpeg-installer/win32-ia32" "4.1.0" "@ffmpeg-installer/win32-x64" "4.1.0" -"@ffmpeg-installer/linux-arm64@4.1.3": - version "4.1.3" - resolved "https://registry.yarnpkg.com/@ffmpeg-installer/linux-arm64/-/linux-arm64-4.1.3.tgz#300c19a89de1fdeafb2d0983758419da7dcfa848" - integrity sha512-QBlK7H8H/ypnh619OJBASrikToEUUejGwLbl5H1UPNpZyLtlhhvvafDktISWAtR2qNHTfbi1ckLIgC6FMrE+lQ== +"@ffmpeg-installer/linux-arm64@4.1.4": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@ffmpeg-installer/linux-arm64/-/linux-arm64-4.1.4.tgz#7219f3f901bb67f7926cb060b56b6974a6cad29f" + integrity sha512-dljEqAOD0oIM6O6DxBW9US/FkvqvQwgJ2lGHOwHDDwu/pX8+V0YsDL1xqHbj1DMX/+nP9rxw7G7gcUvGspSoKg== "@ffmpeg-installer/linux-arm@4.1.3": version "4.1.3" @@ -4663,7 +4663,7 @@ arg@4.1.2: resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.2.tgz#e70c90579e02c63d80e3ad4e31d8bfdb8bd50064" integrity sha512-+ytCkGcBtHZ3V2r2Z06AncYO8jz46UEamcspGoU8lHcEbpn6J77QK0vdWvChsclg/tM5XIJC5tnjmPp7Eq6Obg== -arg@^4.1.0: +arg@4.1.3, arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== @@ -12764,7 +12764,7 @@ har-validator@~4.2.1: ajv "^4.9.1" har-schema "^1.0.5" -har-validator@~5.1.0, har-validator@~5.1.3: +har-validator@~5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== @@ -19380,7 +19380,7 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24, psl@^1.1.28: +psl@^1.1.28: version "1.7.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== @@ -20236,6 +20236,11 @@ regenerator-runtime@^0.13.1, regenerator-runtime@^0.13.2, regenerator-runtime@^0 resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== +regenerator-runtime@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.4.tgz#e96bf612a3362d12bb69f7e8f74ffeab25c7ac91" + integrity sha512-plpwicqEzfEyTQohIKktWigcLzmNStMGwbOUbykx51/29Z3JOGYldaaNGK7ngNXV+UcoqvIMmloZ48Sr74sd+g== + regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" @@ -20526,32 +20531,6 @@ request-promise@4.2.5, request-promise@^4.2.2: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@2.88.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - "request@>=2.76.0 <3.0.0", request@^2.74.0, request@^2.87.0, request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -22877,12 +22856,13 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" -term-to-html@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/term-to-html/-/term-to-html-1.0.0.tgz#63f413a743ead18f8acbf74e359cf35b4e250126" - integrity sha512-XiGrBBJa0+EFPF17xI3AZfD0fnRAPBjxLhO067LdwU5masQh51oMxhr6CefgVwnYz8iPfXBJRIbs68SNcdeM8w== +term-to-html@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-to-html/-/term-to-html-1.2.0.tgz#3c4654b50c70399434eb06bdd2fc838b493fe89a" + integrity sha512-SgsOxkGFBC3aXqM//Zdbf++62+11EVLPyLcIvC7SxtNybwhziZXBQeCM/Vd5CR+6shtLJjMsO8iAN5d7Zdf0NQ== dependencies: ansi-to-html "0.6.14" + arg "4.1.3" escape-html "1.0.3" terminal-banner@1.1.0: @@ -23200,14 +23180,6 @@ tough-cookie@~2.3.0: dependencies: punycode "^1.4.1" -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"