diff --git a/.gitignore b/.gitignore index dde0a80db9..fa13d14549 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,4 @@ binary-url.json # Allows us to dynamically create eslint rules that override the default for Decaffeinate scripts .eslintrc.js +cli/visual-snapshots diff --git a/.percy.yml b/.percy.yml new file mode 100644 index 0000000000..95b2c84e90 --- /dev/null +++ b/.percy.yml @@ -0,0 +1,12 @@ +# https://docs.percy.io/v1/docs/configuration +version: 1 +snapshot: + widths: [1280] + min-height: 1024 +agent: + asset-discovery: + # let Percy wait for network to fetch static resources + # like images and fonts to avoid missing icons + network-idle-timeout: 250 # ms + # assets that don't change could be cached + cache-responses: true diff --git a/appveyor.yml b/appveyor.yml index d1ef8d0b13..3df8ed4ef6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -73,8 +73,8 @@ test_script: - node --version - yarn --version - 7z - - echo *** Browsers installed on this system *** - - cd packages/launcher && node index.js && cd ../.. + - echo *** System info *** + - node cli/bin/cypress info --dev - echo *** Kitchensink tests run on Chrome browser *** - npm run dev -- --run-project %CD%/packages/example --browser chrome diff --git a/circle.yml b/circle.yml index 763e8d4b80..cf89e12253 100644 --- a/circle.yml +++ b/circle.yml @@ -255,8 +255,35 @@ jobs: at: ~/ ## this will catch .only's in js/coffee as well - run: yarn lint-all + - run: + name: cypress info (dev) + command: node cli/bin/cypress info --dev - store-npm-logs + cli-visual-tests: + <<: *defaults + parallelism: 1 + steps: + - attach_workspace: + 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 + - run: + command: node cli/bin/cypress help | yarn --silent term-to-html > cli/visual-snapshots/cypress-help.html + environment: + FORCE_COLOR: 2 + - store_artifacts: + path: cli/visual-snapshots + - run: + name: Upload CLI snapshots for diffing + command: | + PERCY_TOKEN=$PERCY_TOKEN_CLI \ + yarn percy snapshot ./cli/visual-snapshots + unit-tests: <<: *defaults parallelism: 1 @@ -901,6 +928,14 @@ jobs: name: Verify Cypress binary working_directory: test-binary command: $(yarn bin)/cypress verify + - run: + name: Cypress help + working_directory: test-binary + command: $(yarn bin)/cypress help + - run: + name: Cypress info + working_directory: test-binary + command: $(yarn bin)/cypress info - store-npm-logs # install NPM + binary zip and run against staging API @@ -1027,6 +1062,14 @@ jobs: working_directory: test-binary # 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 + command: $(yarn bin)/cypress help + - run: + name: Cypress info + working_directory: test-binary + command: $(yarn bin)/cypress info - run: name: Add Cypress demo working_directory: test-binary @@ -1052,6 +1095,9 @@ linux-workflow: &linux-workflow requires: - build # unit, integration and e2e tests + - cli-visual-tests: + requires: + - build - unit-tests: requires: - build diff --git a/cli/__snapshots__/cli_spec.js b/cli/__snapshots__/cli_spec.js index fb33d71545..93a8d0249e 100644 --- a/cli/__snapshots__/cli_spec.js +++ b/cli/__snapshots__/cli_spec.js @@ -205,6 +205,7 @@ exports['cli help command shows help 1'] = ` verify [options] Verifies that Cypress is installed correctly and executable cache [options] Manages the Cypress binary cache + info [options] Prints Cypress and system information ------- stderr: ------- @@ -240,6 +241,7 @@ exports['cli help command shows help for -h 1'] = ` verify [options] Verifies that Cypress is installed correctly and executable cache [options] Manages the Cypress binary cache + info [options] Prints Cypress and system information ------- stderr: ------- @@ -275,6 +277,7 @@ exports['cli help command shows help for --help 1'] = ` verify [options] Verifies that Cypress is installed correctly and executable cache [options] Manages the Cypress binary cache + info [options] Prints Cypress and system information ------- stderr: ------- @@ -311,6 +314,7 @@ exports['cli unknown command shows usage and exits 1'] = ` verify [options] Verifies that Cypress is installed correctly and executable cache [options] Manages the Cypress binary cache + info [options] Prints Cypress and system information ------- stderr: ------- diff --git a/cli/__snapshots__/info_spec.js b/cli/__snapshots__/info_spec.js new file mode 100644 index 0000000000..fe92e46295 --- /dev/null +++ b/cli/__snapshots__/info_spec.js @@ -0,0 +1,55 @@ +exports['cypress info without browsers or vars'] = ` + +Proxy Settings: none detected +Environment Variables: none detected + +Application Data: /user/app/data/path +Browser Profiles: /user/app/data/path/to/browsers +Binary Caches: /user/path/to/binary/cache + +Cypress Version: 0.0.0 +System Platform: linux (Foo-OsVersion) +System Memory: 1.2 GB free 400 MB + +` + +exports['cypress info with proxy and vars'] = ` + +Proxy Settings: +PROXY_ENV_VAR1: some proxy variable +PROXY_ENV_VAR2: another proxy variable + +Learn More: https://on.cypress.io/proxy-configuration + +Environment Variables: +CYPRESS_ENV_VAR1: my Cypress variable +CYPRESS_ENV_VAR2: my other Cypress variable + +Application Data: /user/app/data/path +Browser Profiles: /user/app/data/path/to/browsers +Binary Caches: /user/path/to/binary/cache + +Cypress Version: 0.0.0 +System Platform: linux (Foo-OsVersion) +System Memory: 1.2 GB free 400 MB + +` + +exports['cypress redacts sensitive vars'] = ` + +Proxy Settings: none detected +Environment Variables: +CYPRESS_ENV_VAR1: my Cypress variable +CYPRESS_ENV_VAR2: my other Cypress variable +CYPRESS_PROJECT_ID: abc123 +CYPRESS_RECORD_KEY: + +Application Data: /user/app/data/path +Browser Profiles: /user/app/data/path/to/browsers +Binary Caches: /user/path/to/binary/cache + +Cypress Version: 0.0.0 +System Platform: linux (Foo-OsVersion) +System Memory: 1.2 GB free 400 MB + +` diff --git a/cli/lib/cli.js b/cli/lib/cli.js index 6f024516cb..77caf972cc 100644 --- a/cli/lib/cli.js +++ b/cli/lib/cli.js @@ -129,6 +129,7 @@ const knownCommands = [ '-v', '--version', 'version', + 'info', ] const text = (description) => { @@ -298,6 +299,18 @@ module.exports = { cache[command]() }) + program + .command('info') + .usage('[command]') + .description('Prints Cypress and system information') + .option('--dev', text('dev'), coerceFalse) + .action((opts) => { + require('./exec/info') + .start(opts) + .then(util.exit) + .catch(util.logErrorExit1) + }) + debug('cli starts with arguments %j', args) util.printNodeOptions() diff --git a/cli/lib/errors.js b/cli/lib/errors.js index 2c394c0d07..a4dd99075b 100644 --- a/cli/lib/errors.js +++ b/cli/lib/errors.js @@ -1,4 +1,3 @@ -const os = require('os') const chalk = require('chalk') const { stripIndent, stripIndents } = require('common-tags') const { merge } = require('ramda') @@ -245,17 +244,8 @@ const CYPRESS_RUN_BINARY = { }, } -function getPlatformInfo () { - return util.getOsVersionAsync().then((version) => { - return stripIndent` - Platform: ${os.platform()} (${version}) - Cypress Version: ${util.pkgVersion()} - ` - }) -} - function addPlatformInformation (info) { - return getPlatformInfo().then((platform) => { + return util.getPlatformInfo().then((platform) => { return merge(info, { platform }) }) } diff --git a/cli/lib/exec/info.js b/cli/lib/exec/info.js new file mode 100644 index 0000000000..415d276f1c --- /dev/null +++ b/cli/lib/exec/info.js @@ -0,0 +1,93 @@ +/* eslint-disable no-console */ +const spawn = require('./spawn') +const util = require('../util') +const state = require('../tasks/state') +const os = require('os') +const chalk = require('chalk') +const prettyBytes = require('pretty-bytes') +const _ = require('lodash') +const R = require('ramda') + +// color for numbers and show values +const g = chalk.green +// color for paths +const p = chalk.cyan +// urls +const link = chalk.blue.underline + +// to be exported +const methods = {} + +methods.findProxyEnvironmentVariables = () => { + return _.pick(process.env, ['HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY']) +} + +const maskSensitiveVariables = R.evolve({ + CYPRESS_RECORD_KEY: R.always(''), +}) + +methods.findCypressEnvironmentVariables = () => { + const isCyVariable = (val, key) => key.startsWith('CYPRESS_') + + return R.pickBy(isCyVariable)(process.env) +} + +const formatCypressVariables = () => { + const vars = methods.findCypressEnvironmentVariables() + + return maskSensitiveVariables(vars) +} + +methods.start = (options = {}) => { + const args = ['--mode=info'] + + return spawn.start(args, { + dev: options.dev, + }) + .then(() => { + console.log() + const proxyVars = methods.findProxyEnvironmentVariables() + + if (_.isEmpty(proxyVars)) { + console.log('Proxy Settings: none detected') + } else { + console.log('Proxy Settings:') + _.forEach(proxyVars, (value, key) => { + console.log('%s: %s', key, g(value)) + }) + + console.log() + console.log('Learn More: %s', link('https://on.cypress.io/proxy-configuration')) + console.log() + } + }) + .then(() => { + const cyVars = formatCypressVariables() + + if (_.isEmpty(cyVars)) { + console.log('Environment Variables: none detected') + } else { + console.log('Environment Variables:') + _.forEach(cyVars, (value, key) => { + console.log('%s: %s', key, g(value)) + }) + } + }) + .then(() => { + console.log() + console.log('Application Data:', p(util.getApplicationDataFolder())) + console.log('Browser Profiles:', p(util.getApplicationDataFolder('browsers'))) + console.log('Binary Caches: %s', p(state.getCacheDir())) + }) + .then(() => { + console.log() + + return util.getOsVersionAsync().then((osVersion) => { + console.log('Cypress Version: %s', g(util.pkgVersion())) + console.log('System Platform: %s (%s)', g(os.platform()), g(osVersion)) + console.log('System Memory: %s free %s', g(prettyBytes(os.totalmem())), g(prettyBytes(os.freemem()))) + }) + }) +} + +module.exports = methods diff --git a/cli/lib/tasks/cache.js b/cli/lib/tasks/cache.js index 0c53f353f0..83d3ebd616 100644 --- a/cli/lib/tasks/cache.js +++ b/cli/lib/tasks/cache.js @@ -14,16 +14,21 @@ const clear = () => { } const list = () => { - return fs - .readdirAsync(state.getCacheDir()) - .filter(util.isSemver) + return getCachedVersions() .then((versions) => { logger.log(versions.join(', ')) }) } +const getCachedVersions = () => { + return fs + .readdirAsync(state.getCacheDir()) + .filter(util.isSemver) +} + module.exports = { path, clear, list, + getCachedVersions, } diff --git a/cli/lib/util.js b/cli/lib/util.js index 458569bfdc..5a02ffa0b6 100644 --- a/cli/lib/util.js +++ b/cli/lib/util.js @@ -1,6 +1,7 @@ const _ = require('lodash') const R = require('ramda') const os = require('os') +const ospath = require('ospath') const crypto = require('crypto') const la = require('lazy-ass') const is = require('check-more-types') @@ -225,6 +226,26 @@ const parseOpts = (opts) => { return cleanOpts } +/** + * Copy of packages/server/lib/browsers/utils.ts + * because we need same functionality in CLI to show the path :( + */ +const getApplicationDataFolder = (...paths) => { + const { env } = process + + // allow overriding the app_data folder + const folder = env.CYPRESS_KONFIG_ENV || env.CYPRESS_ENV || 'development' + + const PRODUCT_NAME = pkg.productName || pkg.name + const OS_DATA_PATH = ospath.data() + + const ELECTRON_APP_DATA_PATH = path.join(OS_DATA_PATH, PRODUCT_NAME) + + const p = path.join(ELECTRON_APP_DATA_PATH, 'cy', folder, ...paths) + + return p +} + const util = { normalizeModuleOptions, parseOpts, @@ -380,6 +401,15 @@ const util = { }) }, + getPlatformInfo () { + return util.getOsVersionAsync().then((version) => { + return stripIndent` + Platform: ${os.platform()} (${version}) + Cypress Version: ${util.pkgVersion()} + ` + }) + }, + // attention: // when passing relative path to NPM post install hook, the current working // directory is set to the `node_modules/cypress` folder @@ -457,6 +487,8 @@ const util = { getFileChecksum, getFileSize, + + getApplicationDataFolder, } module.exports = util diff --git a/cli/package.json b/cli/package.json index 25787ea9d1..06ca1a6c35 100644 --- a/cli/package.json +++ b/cli/package.json @@ -46,6 +46,8 @@ "log-symbols": "3.0.0", "minimist": "1.2.0", "moment": "2.24.0", + "ospath": "1.2.2", + "pretty-bytes": "5.3.0", "ramda": "0.26.1", "request": "2.88.0", "request-progress": "3.0.0", diff --git a/cli/test/lib/cli_spec.js b/cli/test/lib/cli_spec.js index c23cda5c28..74eb37de76 100644 --- a/cli/test/lib/cli_spec.js +++ b/cli/test/lib/cli_spec.js @@ -4,12 +4,14 @@ const os = require('os') const cli = require(`${lib}/cli`) const util = require(`${lib}/util`) const logger = require(`${lib}/logger`) +const info = require(`${lib}/exec/info`) const run = require(`${lib}/exec/run`) const open = require(`${lib}/exec/open`) const state = require(`${lib}/tasks/state`) const verify = require(`${lib}/tasks/verify`) const install = require(`${lib}/tasks/install`) const snapshot = require('../support/snapshot') +const debug = require('debug')('test') const execa = require('execa-wrap') describe('cli', () => { @@ -22,7 +24,11 @@ describe('cli', () => { // sinon.stub(util, 'exit') sinon.stub(util, 'logErrorExit1') this.exec = (args) => { - return cli.init(`node test ${args}`.split(' ')) + const cliArgs = `node test ${args}`.split(' ') + + debug('calling cli.init with: %o', cliArgs) + + return cli.init(cliArgs) } }) @@ -449,4 +455,16 @@ describe('cli', () => { }) }) }) + + context('cypress info', () => { + beforeEach(() => { + sinon.stub(info, 'start').resolves(0) + sinon.stub(util, 'exit').withArgs(0) + }) + + it('calls info start', () => { + this.exec('info') + expect(info.start).to.have.been.calledWith() + }) + }) }) diff --git a/cli/test/lib/exec/info_spec.js b/cli/test/lib/exec/info_spec.js new file mode 100644 index 0000000000..495dddaa07 --- /dev/null +++ b/cli/test/lib/exec/info_spec.js @@ -0,0 +1,71 @@ +require('../../spec_helper') + +const os = require('os') +const util = require(`${lib}/util`) +const state = require(`${lib}/tasks/state`) +const info = require(`${lib}/exec/info`) +const spawn = require(`${lib}/exec/spawn`) + +const snapshot = require('../../support/snapshot') +const stdout = require('../../support/stdout') +const normalize = require('../../support/normalize') + +describe('exec info', function () { + beforeEach(function () { + sinon.stub(process, 'exit') + + // common stubs + sinon.stub(spawn, 'start').resolves() + os.platform.returns('linux') + sinon.stub(os, 'totalmem').returns(1.2e+9) + sinon.stub(os, 'freemem').returns(4e+8) + sinon.stub(info, 'findProxyEnvironmentVariables').returns({}) + sinon.stub(info, 'findCypressEnvironmentVariables').returns({}) + sinon.stub(util, 'getApplicationDataFolder') + .withArgs('browsers').returns('/user/app/data/path/to/browsers') + .withArgs().returns('/user/app/data/path') + + sinon.stub(state, 'getCacheDir').returns('/user/path/to/binary/cache') + }) + + const startInfoAndSnapshot = async (snapshotName) => { + expect(snapshotName, 'missing snapshot name').to.be.a('string') + + const output = stdout.capture() + + await info.start() + stdout.restore() + + snapshot(snapshotName, normalize(output.toString())) + } + + it('prints collected info without env vars', async () => { + await startInfoAndSnapshot('cypress info without browsers or vars') + expect(spawn.start).to.be.calledWith(['--mode=info'], { dev: undefined }) + }) + + it('prints proxy and cypress env vars', async () => { + info.findProxyEnvironmentVariables.returns({ + PROXY_ENV_VAR1: 'some proxy variable', + PROXY_ENV_VAR2: 'another proxy variable', + }) + + info.findCypressEnvironmentVariables.returns({ + CYPRESS_ENV_VAR1: 'my Cypress variable', + CYPRESS_ENV_VAR2: 'my other Cypress variable', + }) + + await startInfoAndSnapshot('cypress info with proxy and vars') + }) + + it('redacts sensitive cypress variables', async () => { + info.findCypressEnvironmentVariables.returns({ + CYPRESS_ENV_VAR1: 'my Cypress variable', + CYPRESS_ENV_VAR2: 'my other Cypress variable', + CYPRESS_PROJECT_ID: 'abc123', // not sensitive + CYPRESS_RECORD_KEY: 'really really secret stuff', // should not be printed + }) + + await startInfoAndSnapshot('cypress redacts sensitive vars') + }) +}) diff --git a/cli/test/support/normalize.js b/cli/test/support/normalize.js index 528ea4834f..25e2d4b85a 100644 --- a/cli/test/support/normalize.js +++ b/cli/test/support/normalize.js @@ -8,9 +8,12 @@ const removeExcessWhiteSpace = (str) => { return str.replace(whitespaceAtEndOfLineRe, '') } -module.exports = (str) => { - // strip dates and ansi codes - // and excess whitespace +/** + * strip dates and ansi codes and excess whitespace + * @param {string} str input string + * @returns {string} cleaned output string + */ +const normalize = (str) => { return stripAnsi( str .replace(datesRe, 'xx:xx:xx') @@ -20,3 +23,5 @@ module.exports = (str) => { .replace(downloadQueryRe, '?platform=OS&arch=ARCH') ) } + +module.exports = normalize diff --git a/package.json b/package.json index ad03f70343..4460434dce 100644 --- a/package.json +++ b/package.json @@ -159,6 +159,7 @@ "mock-fs": "4.9.0", "parse-github-repo-url": "1.4.1", "patch-package": "6.2.0", + "percy": "0.21.0", "plist": "2.1.0", "pluralize": "8.0.0", "postinstall-postinstall": "2.0.0", @@ -175,6 +176,7 @@ "snap-shot-it": "7.9.1", "stop-only": "3.0.1", "strip-ansi": "4.0.0", + "term-to-html": "1.0.0", "terminal-banner": "1.1.0", "through": "2.3.8", "ts-node": "8.3.0", diff --git a/packages/server/__snapshots__/info_spec.js b/packages/server/__snapshots__/info_spec.js new file mode 100644 index 0000000000..e6222ae351 --- /dev/null +++ b/packages/server/__snapshots__/info_spec.js @@ -0,0 +1,82 @@ +exports['two browsers with firefox having profile folder'] = ` +Displaying Cypress info... + +Detected 2 browsers installed: + +1. Chrome + - Name: chrome + - Channel: stable + - Version: 12.34.56 + - Executable: /path/to/google-chrome + +2. Firefox Dev + - Name: firefox + - Channel: dev + - Version: 79.0a1 + - Executable: /path/to/firefox + - Profile: /path/to/user/firefox/profile + +Note: to run these browsers, pass : to the '--browser' field + +Examples: +- cypress run --browser chrome +- cypress run --browser firefox:dev + +Learn More: https://on.cypress.io/launching-browsers + +` + +exports['output without any browsers'] = ` +Displaying Cypress info... + +Detected no known browsers installed + + +` + +exports['single chrome:stable'] = ` +Displaying Cypress info... + +Detected 1 browser installed: + +1. Chrome + - Name: chrome + - Channel: stable + - Version: 12.34.56 + - Executable: /path/to/google-chrome + +Note: to run these browsers, pass : to the '--browser' field + +Examples: +- cypress run --browser chrome + +Learn More: https://on.cypress.io/launching-browsers + +` + +exports['two browsers'] = ` +Displaying Cypress info... + +Detected 2 browsers installed: + +1. Chrome + - Name: chrome + - Channel: stable + - Version: 12.34.56 + - Executable: /path/to/google-chrome + +2. Firefox Dev + - Name: firefox + - Channel: dev + - Version: 79.0a1 + - Executable: /path/to/firefox + +Note: to run these browsers, pass : to the '--browser' field + +Examples: +- cypress run --browser chrome +- cypress run --browser firefox:dev + +Learn More: https://on.cypress.io/launching-browsers + +` diff --git a/packages/server/lib/browsers/utils.ts b/packages/server/lib/browsers/utils.ts index 4a0c6ff01e..145cee2c7b 100644 --- a/packages/server/lib/browsers/utils.ts +++ b/packages/server/lib/browsers/utils.ts @@ -19,6 +19,7 @@ const PATH_TO_BROWSERS = appData.path('browsers') const pathToProfiles = path.join(PATH_TO_BROWSERS, '*') const getBrowserPath = (browser) => { + // TODO need to check if browser.name is an unempty string return path.join( PATH_TO_BROWSERS, `${browser.name}-${browser.channel}` @@ -178,6 +179,8 @@ export = { copyExtension, + getBrowserPath, + getProfileDir, getExtensionDir, diff --git a/packages/server/lib/cypress.js b/packages/server/lib/cypress.js index 378bc5366b..e18cead1cd 100644 --- a/packages/server/lib/cypress.js +++ b/packages/server/lib/cypress.js @@ -188,6 +188,11 @@ module.exports = { }).then(exit0) .catch(exitErr) + case 'info': + return require('./modes/info')(options) + .then(exit0) + .catch(exitErr) + case 'smokeTest': return this.runElectron(mode, options) .then((pong) => { diff --git a/packages/server/lib/environment.coffee b/packages/server/lib/environment.coffee index bb56b53d5e..8235156a57 100644 --- a/packages/server/lib/environment.coffee +++ b/packages/server/lib/environment.coffee @@ -8,6 +8,7 @@ os = require("os") ## to the "packages/server" folder cwd = require("./cwd") Promise = require("bluebird") +debug = require("debug")("cypress:server") ## never cut off stack traces Error.stackTraceLimit = Infinity @@ -64,7 +65,6 @@ try electronLaunchArguments.forEach app.commandLine.appendArgument catch e - if env is "development" - console.error(e.message) + debug("environment error %s", e.message) module.exports = env diff --git a/packages/server/lib/modes/info.js b/packages/server/lib/modes/info.js new file mode 100644 index 0000000000..ca6a20a44e --- /dev/null +++ b/packages/server/lib/modes/info.js @@ -0,0 +1,139 @@ +/* eslint-disable no-console */ +const debug = require('debug')('cypress:server:info') +const launcher = require('@packages/launcher') +const pluralize = require('pluralize') +const { stripIndent } = require('common-tags') +const { sortWith, ascend, prop } = require('ramda') +const browserUtils = require('../browsers/utils') +const _ = require('lodash') +const chalk = require('chalk') +const fs = require('../util/fs') + +// color for numbers and short values +const n = chalk.green +// color for paths +const p = chalk.cyan +// color for accents and examples +const a = chalk.yellow +// urls +const link = chalk.blue.underline + +/** + * If the list has at least 1 item, picks a random item + * and returns it AND the remaining items. + */ +const pickRandomItem = (list) => { + if (!list.length) { + return { + item: null, + remaining: list, + } + } + + const item = _.sample(list) + const remaining = _.without(list, item) + + return { + item, remaining, + } +} + +// Usually the full browser name to pass via --browser +// is :. If the channel is stable, you +// can just do "--browser " +const formBrowserName = (browser) => { + if (browser.channel === 'stable') { + return browser.name + } + + return `${browser.name}:${browser.channel}` +} + +// for each browser computes the profile folder +// and checks if the folder exists. If exists, +// adds it to the browser object as a property +const addProfilePath = async (browsers = []) => { + for (const browser of browsers) { + const profilePath = browserUtils.getBrowserPath(browser) + + debug('checking profile path %s for browser %s:%s', profilePath, browser.name, browser.channel) + try { + const profileExists = await fs.statAsync(profilePath) + + if (profileExists && profileExists.isDirectory()) { + debug('profile folder exists %s', profilePath) + browser.profilePath = profilePath + } + } catch (e) { + debug('problem checking profile folder %s %s', profilePath, e.message) + } + } + + return browsers +} + +const print = (browsers = []) => { + console.log('Displaying Cypress info...') + console.log('') + if (browsers.length) { + console.log('Detected %s %s installed:', n(browsers.length), pluralize('browser', browsers.length)) + } else { + console.log('Detected no known browsers installed') + } + + console.log('') + + const sortByNameAndMajor = sortWith([ + ascend(prop('name')), + ascend(prop('majorVersion')), + ]) + const sortedByNameAndMajorVersion = sortByNameAndMajor(browsers) + + sortedByNameAndMajorVersion.forEach((browser, k) => { + const text = stripIndent` + ${k + 1}. ${a(browser.displayName)} + - Name: ${browser.name} + - Channel: ${browser.channel} + - Version: ${n(browser.version)} + - Executable: ${p(browser.path)} + ${browser.profilePath ? `- Profile: ${browser.profilePath}` : ''} + ` + + console.log(text) + console.log('') + }) + + // randomly a few detected browsers to use as examples + if (browsers.length) { + const highlightedBrowser = a('--browser') + + console.log('Note: to run these browsers, pass : to the \'%s\' field', + highlightedBrowser) + + console.log('') + + const firstDraw = pickRandomItem(browsers) + + if (firstDraw.item) { + console.log('Examples:') + console.log(a(`- cypress run --browser ${formBrowserName(firstDraw.item)}`)) + + const secondDraw = pickRandomItem(firstDraw.remaining) + + if (secondDraw.item) { + console.log(a(`- cypress run --browser ${formBrowserName(secondDraw.item)}`)) + } + } + + console.log('') + console.log('Learn More: %s', link('https://on.cypress.io/launching-browsers')) + } +} + +const info = () => { + return launcher.detect() + .then(addProfilePath) + .then(print) +} + +module.exports = info diff --git a/packages/server/test/unit/modes/info_spec.js b/packages/server/test/unit/modes/info_spec.js new file mode 100644 index 0000000000..68359dc44b --- /dev/null +++ b/packages/server/test/unit/modes/info_spec.js @@ -0,0 +1,96 @@ +require('../../spec_helper') + +const info = require(`${root}../lib/modes/info`) +const capture = require(`${root}../lib/capture`) +const browserUtils = require(`${root}../lib/browsers/utils`) +const fs = require(`${root}../lib/util/fs`) +const launcher = require('@packages/launcher') +const snapshot = require('snap-shot-it') +const stripAnsi = require('strip-ansi') +const _ = require('lodash') + +describe('lib/modes/info', () => { + beforeEach(() => { + capture.restore() + }) + + afterEach(() => { + capture.restore() + }) + + const chromeStable = { + displayName: 'Chrome', + name: 'chrome', + channel: 'stable', + version: '12.34.56', + majorVersion: 12, + path: '/path/to/google-chrome', + } + + const firefoxDev = { + displayName: 'Firefox Dev', + name: 'firefox', + channel: 'dev', + version: '79.0a1', + majorVersion: 79, + path: '/path/to/firefox', + } + + const infoAndSnapshot = async (snapshotName) => { + expect(snapshotName, 'missing snapshot name').to.be.a('string') + + const captured = capture.stdout() + + await info() + + capture.restore() + snapshot(snapshotName, stripAnsi(captured.toString())) + } + + it('prints no browsers', async () => { + sinon.stub(launcher, 'detect').resolves([]) + await infoAndSnapshot('output without any browsers') + }) + + it('prints 1 found browser', async () => { + sinon.stub(launcher, 'detect').resolves([chromeStable]) + await infoAndSnapshot('single chrome:stable') + }) + + it('prints 2 found browsers', async () => { + sinon.stub(launcher, 'detect').resolves([chromeStable, firefoxDev]) + // have to make sure random sampling from the browser list + // to create examples returns same order + // so Chrome will be picked first, Firefox will be second + const sample = sinon.stub(_, 'sample') + + sample.onFirstCall().returns(chromeStable) + sample.onSecondCall().returns(firefoxDev) + + await infoAndSnapshot('two browsers') + expect(sample, 'two browsers were picked to create examples').to.be.calledTwice + }) + + it('adds profile for browser if folder exists', async () => { + sinon.stub(launcher, 'detect').resolves([chromeStable, firefoxDev]) + sinon.stub(browserUtils, 'getBrowserPath') + .withArgs(chromeStable).returns('/path/to/user/chrome/profile') + .withArgs(firefoxDev).returns('/path/to/user/firefox/profile') + + sinon.stub(fs, 'statAsync') + .withArgs('/path/to/user/chrome/profile').throws('No Chrome profile folder') + .withArgs('/path/to/user/firefox/profile').resolves({ + isDirectory: _.stubTrue, + }) + + // have to make sure random sampling from the browser list + // to create examples returns same order + // so Chrome will be picked first, Firefox will be second + const sample = sinon.stub(_, 'sample') + + sample.onFirstCall().returns(chromeStable) + sample.onSecondCall().returns(firefoxDev) + + await infoAndSnapshot('two browsers with firefox having profile folder') + }) +}) diff --git a/scripts/sanitize.js b/scripts/sanitize.js new file mode 100644 index 0000000000..15dbded117 --- /dev/null +++ b/scripts/sanitize.js @@ -0,0 +1,51 @@ +// call this script to sanitize output of the command +// AFTER converting ANSI escape codes into HTML tags +const arg = require('arg') + +const args = arg({ + '--type': String, +}) + +const sanitizeCliInfo = () => { + const chromiumVersion = /- Version: (<.+>)(\d{2,3}.\d\.\d+.\d+)(<.+>)/g + const firefoxVersion = /- Version: (<.+>)(\d{2,3}.\d\.\d+|\d+\.[0-9a-z])(<.+>)+/g + const browserArgument = /--browser (\w+:?\w+)/g + // there is only a single line with memory usage + const systemMemory = /System Memory: (<.+>)([\w.]+ \w+)(<.+>) free (<.+>)([\w.]+ \w+)(<.+>)/ + + const replaceChromiumVersion = (match, openTag, version, closeTag) => { + return `- Version: ${openTag}***chromium version***${closeTag}` + } + + const replaceFirefoxVersion = (match, openTag, version, closeTag) => { + return `- Version: ${openTag}***firefox version***${closeTag}` + } + + const replaceBrowserArgument = (match, browserName) => { + return '--browser ***name:channel***' + } + + const replaceSystemMemory = (match, tag1, total, tag2, tag3, free, tag4) => { + return `System Memory: ${tag1}***total memory***${tag2} free ${tag3}***free memory***${tag4}` + } + + const sanitize = (chunk) => { + return chunk.replace(chromiumVersion, replaceChromiumVersion) + .replace(firefoxVersion, replaceFirefoxVersion) + .replace(browserArgument, replaceBrowserArgument) + .replace(systemMemory, replaceSystemMemory) + } + + process.stdin.setEncoding('utf8') + process.stdin.on('data', function (chunk) { + return process.stdout.write(sanitize(chunk)) + }) +} + +switch (args['--type']) { + case 'cli-info': + sanitizeCliInfo() + break + default: + throw new Error(`Unknown STDOUT type to sanitize "${args['--type']}"`) +} diff --git a/yarn.lock b/yarn.lock index 9f2092cc14..303504767a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3740,6 +3740,92 @@ "@nodelib/fs.scandir" "2.1.3" fastq "^1.6.0" +"@oclif/color@^0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@oclif/color/-/color-0.0.0.tgz#54939bbd16d1387511bf1a48ccda1a417248e6a9" + integrity sha512-KKd3W7eNwfNF061tr663oUNdt8EMnfuyf5Xv55SGWA1a0rjhWqS/32P7OeB7CbXcJUBdfVrPyR//1afaW12AWw== + dependencies: + ansi-styles "^3.2.1" + supports-color "^5.4.0" + tslib "^1" + +"@oclif/command@1.5.19", "@oclif/command@^1.5.13", "@oclif/command@^1.5.3": + version "1.5.19" + resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.5.19.tgz#13f472450eb83bd6c6871a164c03eadb5e1a07ed" + integrity sha512-6+iaCMh/JXJaB2QWikqvGE9//wLEVYYwZd5sud8aLoLKog1Q75naZh2vlGVtg5Mq/NqpqGQvdIjJb3Bm+64AUQ== + dependencies: + "@oclif/config" "^1" + "@oclif/errors" "^1.2.2" + "@oclif/parser" "^3.8.3" + "@oclif/plugin-help" "^2" + debug "^4.1.1" + semver "^5.6.0" + +"@oclif/config@^1": + version "1.14.0" + resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.14.0.tgz#0af93facd5c5087f804489f1603c4f3bc0c45014" + integrity sha512-KsOP/mx9lzTah+EtGqLUXN3PDL0J3zb9/dTneFyiUK2K6T7vFEGhV6OasmqTh4uMZHGYTGrNPV8x/Yw6qZNL6A== + dependencies: + "@oclif/errors" "^1.0.0" + "@oclif/parser" "^3.8.0" + debug "^4.1.1" + tslib "^1.9.3" + +"@oclif/errors@^1.0.0", "@oclif/errors@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@oclif/errors/-/errors-1.2.2.tgz#9d8f269b15f13d70aa93316fed7bebc24688edc2" + integrity sha512-Eq8BFuJUQcbAPVofDxwdE0bL14inIiwt5EaKRVY9ZDIG11jwdXZqiQEECJx0VfnLyUZdYfRd/znDI/MytdJoKg== + dependencies: + clean-stack "^1.3.0" + fs-extra "^7.0.0" + indent-string "^3.2.0" + strip-ansi "^5.0.0" + wrap-ansi "^4.0.0" + +"@oclif/linewrap@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@oclif/linewrap/-/linewrap-1.0.0.tgz#aedcb64b479d4db7be24196384897b5000901d91" + integrity sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw== + +"@oclif/parser@^3.8.0", "@oclif/parser@^3.8.3": + version "3.8.4" + resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.8.4.tgz#1a90fc770a42792e574fb896325618aebbe8c9e4" + integrity sha512-cyP1at3l42kQHZtqDS3KfTeyMvxITGwXwH1qk9ktBYvqgMp5h4vHT+cOD74ld3RqJUOZY/+Zi9lb4Tbza3BtuA== + dependencies: + "@oclif/linewrap" "^1.0.0" + chalk "^2.4.2" + tslib "^1.9.3" + +"@oclif/plugin-help@^2": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-2.2.3.tgz#b993041e92047f0e1762668aab04d6738ac06767" + integrity sha512-bGHUdo5e7DjPJ0vTeRBMIrfqTRDBfyR5w0MP41u0n3r7YG5p14lvMmiCXxi6WDaP2Hw5nqx3PnkAIntCKZZN7g== + dependencies: + "@oclif/command" "^1.5.13" + chalk "^2.4.1" + indent-string "^4.0.0" + lodash.template "^4.4.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + widest-line "^2.0.1" + wrap-ansi "^4.0.0" + +"@oclif/plugin-not-found@^1.2": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@oclif/plugin-not-found/-/plugin-not-found-1.2.3.tgz#00f9e7a0a793a5e2f616d8280075f4592de8f079" + integrity sha512-Igbw2T4gLrb/f28Llr730FeMXBSI2PXdky2YvQfsZeQGDsyBZmC4gprJJtmrMWQcjz0B51IInRBnZYERvwfIpw== + dependencies: + "@oclif/color" "^0.0.0" + "@oclif/command" "^1.5.3" + cli-ux "^4.9.0" + fast-levenshtein "^2.0.6" + lodash "^4.17.13" + +"@oclif/screen@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@oclif/screen/-/screen-1.0.4.tgz#b740f68609dfae8aa71c3a6cab15d816407ba493" + integrity sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw== + "@octokit/app@2.2.2": version "2.2.2" resolved "https://registry.yarnpkg.com/@octokit/app/-/app-2.2.2.tgz#a1b8248f64159eeccbe4000d888fdae4163c4ad8" @@ -4291,6 +4377,11 @@ dependencies: "@types/linkify-it" "*" +"@types/mime-types@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.0.tgz#9ca52cda363f699c69466c2a6ccdaad913ea7a73" + integrity sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM= + "@types/mime@*": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" @@ -4895,6 +4986,11 @@ agent-base@4, agent-base@^4.3.0: dependencies: es6-promisify "^5.0.0" +agent-base@5: + version "5.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" + integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== + agent-base@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" @@ -5035,7 +5131,7 @@ ansi-escapes@4.3.0: dependencies: type-fest "^0.8.1" -ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: +ansi-escapes@^3.0.0, ansi-escapes@^3.1.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== @@ -5099,6 +5195,13 @@ ansi-styles@~1.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" integrity sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg= +ansi-to-html@0.6.14: + version "0.6.14" + resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.14.tgz#65fe6d08bba5dd9db33f44a20aec331e0010dad8" + integrity sha512-7ZslfB1+EnFSDO5Ju+ue5Y6It19DRnZXWv8jrGHgIlPna5Mh4jz7BV5jCbQneXNFurQcKoolaaAjHtgSBfOIuA== + dependencies: + entities "^1.1.2" + ansi-wrap@0.1.0, ansi-wrap@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" @@ -5718,7 +5821,7 @@ async@^0.9.0: resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= -async@^2.0.0, async@^2.0.1, async@^2.4.1, async@^2.5.0, async@^2.6.2: +async@^2.0.0, async@^2.0.1, async@^2.4.1, async@^2.5.0, async@^2.6.1, async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -5846,6 +5949,13 @@ axios@0.19.0: follow-redirects "1.5.10" is-buffer "^2.0.2" +axios@^0.19.0: + version "0.19.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" + integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== + dependencies: + follow-redirects "1.5.10" + babel-cli@6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" @@ -6996,7 +7106,7 @@ bluebird-lst@^1.0.7: dependencies: bluebird "^3.5.5" -bluebird-retry@0.11.0: +bluebird-retry@0.11.0, bluebird-retry@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/bluebird-retry/-/bluebird-retry-0.11.0.tgz#1289ab22cbbc3a02587baad35595351dd0c1c047" integrity sha1-EomrIsu8OgJYe6rTVZU1HdDBwEc= @@ -7072,7 +7182,7 @@ body-parser@1.18.3: raw-body "2.3.3" type-is "~1.6.16" -body-parser@1.19.0: +body-parser@1.19.0, body-parser@^1.18.3: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== @@ -7878,6 +7988,14 @@ capture-stack-trace@^1.0.0: resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== +cardinal@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" + integrity sha1-fMEFXYItISlU0HsIXeolHMe8VQU= + dependencies: + ansicolors "~0.3.2" + redeyed "~2.1.0" + caseless@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" @@ -8240,6 +8358,11 @@ clean-css@4.2.x: dependencies: source-map "~0.6.0" +clean-stack@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.3.0.tgz#9e821501ae979986c46b1d66d2d432db2fd4ae31" + integrity sha1-noIVAa6XmYbEax1m0tQy2y/UrjE= + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -8297,6 +8420,33 @@ cli-truncate@^2.0.0: slice-ansi "^3.0.0" string-width "^4.2.0" +cli-ux@^4.9.0: + version "4.9.3" + resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-4.9.3.tgz#4c3e070c1ea23eef010bbdb041192e0661be84ce" + integrity sha512-/1owvF0SZ5Gn54cgrikJ0QskgTzeg30HGjkmjFoaHDJzAqFpuX1DBpFR8aLvsE1J5s9MgeYRENQK4BFwOag5VA== + dependencies: + "@oclif/errors" "^1.2.2" + "@oclif/linewrap" "^1.0.0" + "@oclif/screen" "^1.0.3" + ansi-escapes "^3.1.0" + ansi-styles "^3.2.1" + cardinal "^2.1.1" + chalk "^2.4.1" + clean-stack "^2.0.0" + extract-stack "^1.0.0" + fs-extra "^7.0.0" + hyperlinker "^1.0.0" + indent-string "^3.2.0" + is-wsl "^1.1.0" + lodash "^4.17.11" + password-prompt "^1.0.7" + semver "^5.6.0" + strip-ansi "^5.0.0" + supports-color "^5.5.0" + supports-hyperlinks "^1.0.1" + treeify "^1.1.0" + tslib "^1.9.3" + cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" @@ -8514,7 +8664,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -8543,7 +8693,7 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@1.5.3: +color-string@1.5.3, color-string@^1.5.2: version "1.5.3" resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== @@ -8556,16 +8706,37 @@ color-support@^1.1.3: resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== +color@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" + integrity sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +colornames@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/colornames/-/colornames-1.1.1.tgz#f8889030685c7c4ff9e2a559f5077eb76a816f96" + integrity sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y= + colors@1.0.x: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -colors@^1.1.2: +colors@^1.1.2, colors@^1.2.1, colors@^1.3.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== +colorspace@1.1.x: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.2.tgz#e0128950d082b86a2168580796a0aa5d6c68d8c5" + integrity sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ== + dependencies: + color "3.0.x" + text-hex "1.0.x" + columnify@^1.5.4, columnify@~1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" @@ -8837,6 +9008,13 @@ content-disposition@0.5.2: resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + content-type@1.0.4, content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" @@ -8972,6 +9150,11 @@ cookie@0.3.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + cookiejar@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" @@ -9043,7 +9226,7 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cors@2.8.5: +cors@2.8.5, cors@^2.8.4: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== @@ -9459,7 +9642,7 @@ deasync@^0.1.9: bindings "~1.2.1" node-addon-api "^1.6.0" -debug@*, debug@4.1.1, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0: +debug@*, debug@4, debug@4.1.1, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -9639,6 +9822,11 @@ deepmerge@3.2.0: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.2.0.tgz#58ef463a57c08d376547f8869fdc5bcee957f44e" integrity sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow== +deepmerge@^4.0.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + default-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" @@ -10020,6 +10208,15 @@ dezalgo@^1.0.0, dezalgo@^1.0.1, dezalgo@~1.0.3: asap "^2.0.0" wrappy "1" +diagnostics@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/diagnostics/-/diagnostics-1.1.1.tgz#cab6ac33df70c9d9a727490ae43ac995a769b22a" + integrity sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ== + dependencies: + colorspace "1.1.x" + enabled "1.0.x" + kuler "1.0.x" + diff-match-patch@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.4.tgz#6ac4b55237463761c4daf0dc603eb869124744b1" @@ -10223,6 +10420,11 @@ dotenv@^6.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== +dotenv@^8.1.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + dts-critic@^2.0.0: version "2.2.3" resolved "https://registry.yarnpkg.com/dts-critic/-/dts-critic-2.2.3.tgz#37b6b604dd2df77d960e59ab501aadc165ef6309" @@ -10503,6 +10705,13 @@ emojis-list@^2.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= +enabled@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-1.0.2.tgz#965f6513d2c2d1c5f4652b64a2e3396467fc2f93" + integrity sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M= + dependencies: + env-variable "0.0.x" + encodeurl@^1.0.2, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -10580,7 +10789,7 @@ enhanced-resolve@^4.1.0: memory-fs "^0.5.0" tapable "^1.0.0" -entities@^1.1.1, entities@~1.1.1: +entities@^1.1.1, entities@^1.1.2, entities@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== @@ -10608,6 +10817,11 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== +env-variable@0.0.x: + version "0.0.6" + resolved "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.6.tgz#74ab20b3786c545b62b4a4813ab8cf22726c9808" + integrity sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg== + enzyme-adapter-react-16@1.12.1: version "1.12.1" resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.12.1.tgz#6a2d74c80559d35ac0a91ca162fa45f4186290cf" @@ -10752,6 +10966,11 @@ es6-object-assign@^1.0.3: resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= +es6-promise-pool@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/es6-promise-pool/-/es6-promise-pool-2.5.0.tgz#147c612b36b47f105027f9d2bf54a598a99d9ccb" + integrity sha1-FHxhKza0fxBQJ/nSv1SlmKmdnMs= + es6-promise@^3.0.0: version "3.3.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" @@ -10787,7 +11006,7 @@ es6-weak-map@^2.0.1: es6-iterator "^2.0.3" es6-symbol "^3.1.1" -escape-html@~1.0.3: +escape-html@1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= @@ -11393,6 +11612,42 @@ express@4.16.4: utils-merge "1.0.1" vary "~1.1.2" +express@^4.16.3: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + ext-list@^2.0.0: version "2.2.2" resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" @@ -11481,6 +11736,11 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-stack@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/extract-stack/-/extract-stack-1.0.0.tgz#b97acaf9441eea2332529624b732fc5a1c8165fa" + integrity sha1-uXrK+UQe6iMyUpYktzL8WhyBZfo= + extract-text-webpack-plugin@4.0.0-beta.0: version "4.0.0-beta.0" resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-4.0.0-beta.0.tgz#f7361d7ff430b42961f8d1321ba8c1757b5d4c42" @@ -11491,7 +11751,7 @@ extract-text-webpack-plugin@4.0.0-beta.0: schema-utils "^0.4.5" webpack-sources "^1.1.0" -extract-zip@1.6.7, extract-zip@^1.0.3: +extract-zip@1.6.7, extract-zip@^1.0.3, extract-zip@^1.6.6: version "1.6.7" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= @@ -11569,7 +11829,7 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -11579,7 +11839,7 @@ fast-safe-stringify@^1.0.8, fast-safe-stringify@^1.2.1: resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-1.2.3.tgz#9fe22c37fb2f7f86f06b8f004377dbf8f1ee7bc1" integrity sha512-QJYT/i0QYoiZBQ71ivxdyTqkwKkQ0oxACXHYxH2zYHJEgzi2LsbjgvtzTbLi1SZcF190Db2YP7I7eTsU2egOlw== -fast-safe-stringify@^2.0.7: +fast-safe-stringify@^2.0.4, fast-safe-stringify@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== @@ -11639,6 +11899,11 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" +fecha@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd" + integrity sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg== + figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -11769,6 +12034,19 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" @@ -12011,7 +12289,7 @@ follow-redirects@1.5.10: dependencies: debug "=3.1.0" -follow-redirects@^1.0.0: +follow-redirects@1.9.0, follow-redirects@^1.0.0: version "1.9.0" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.9.0.tgz#8d5bcdc65b7108fe1508649c79c12d732dcedb4f" integrity sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A== @@ -12049,6 +12327,11 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" +foreachasync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/foreachasync/-/foreachasync-3.0.0.tgz#5502987dc8714be3392097f32e0071c9dee07cf6" + integrity sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY= + forever-agent@~0.6.0, forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -12371,6 +12654,11 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" +generic-pool@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.7.1.tgz#36fe5bb83e7e0e032e5d32cd05dc00f5ff119aa8" + integrity sha512-ug6DAZoNgWm6q5KhPFA+hzXfBLFQu5sTXxPpv44DmE0A2g+CiHoq9LTVdkXpZMkYVMoGw83F6W+WT0h0MFMK/w== + genfun@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" @@ -13263,6 +13551,11 @@ has-flag@^1.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -13667,6 +13960,14 @@ https-proxy-agent@^2.2.3: agent-base "^4.3.0" debug "^3.1.0" +https-proxy-agent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" + integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== + dependencies: + agent-base "5" + debug "4" + human-interval@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/human-interval/-/human-interval-0.1.6.tgz#0057973454764c3abcbeb2aed612fc9644e68488" @@ -13700,6 +14001,11 @@ husky@2.4.1: run-node "^1.0.0" slash "^3.0.0" +hyperlinker@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" + integrity sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ== + iconv-lite@0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" @@ -13775,6 +14081,13 @@ image-size@0.7.4: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.7.4.tgz#092c1e541a93511917bfc957a1fc7add21c72e87" integrity sha512-GqPgxs+VkOr12aWwjSkyRzf5atzObWpFtiRuDgxCl2I/SDpZOKZFRD3iIAeAN6/usmn8SeLWRt7a8JRYK0Whbw== +image-size@^0.8.2: + version "0.8.3" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.8.3.tgz#f0b568857e034f29baffd37013587f2c0cad8b46" + integrity sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg== + dependencies: + queue "6.0.1" + immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -13846,7 +14159,7 @@ in-publish@^2.0.0: resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= -indent-string@3.2.0, indent-string@^3.0.0: +indent-string@3.2.0, indent-string@^3.0.0, indent-string@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= @@ -15552,6 +15865,11 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jssha@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/jssha/-/jssha-2.3.1.tgz#147b2125369035ca4b2f7d210dc539f009b3de9a" + integrity sha1-FHshJTaQNcpLL30hDcU58Amz3po= + jsx-ast-utils@^2.1.0, jsx-ast-utils@^2.2.1: version "2.2.3" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f" @@ -15668,6 +15986,13 @@ konfig@0.2.1: js-yaml "~3.2.7" lazy.js "~0.4.0" +kuler@1.0.x: + version "1.0.1" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-1.0.1.tgz#ef7c784f36c9fb6e16dd3150d152677b2b0228a6" + integrity sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ== + dependencies: + colornames "^1.1.1" + labeled-stream-splicer@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21" @@ -16275,7 +16600,7 @@ lodash.template@^3.0.0: lodash.restparam "^3.0.0" lodash.templatesettings "^3.0.0" -lodash.template@^4.0.2, lodash.template@^4.5.0: +lodash.template@^4.0.2, lodash.template@^4.4.0, lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== @@ -16363,6 +16688,17 @@ log-update@^2.3.0: cli-cursor "^2.0.0" wrap-ansi "^3.0.1" +logform@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.1.2.tgz#957155ebeb67a13164069825ce67ddb5bb2dd360" + integrity sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ== + dependencies: + colors "^1.2.1" + fast-safe-stringify "^2.0.4" + fecha "^2.3.3" + ms "^2.1.1" + triple-beam "^1.3.0" + lolex@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" @@ -16811,6 +17147,11 @@ mime-db@1.42.0, "mime-db@>= 1.40.0 < 2", mime-db@^1.28.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== +mime-db@1.43.0: + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + mime-db@~1.33.0: version "1.33.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" @@ -16830,6 +17171,13 @@ mime-types@^2.1.11, mime-types@^2.1.12, mime-types@^2.1.21, mime-types@~2.1.19, dependencies: mime-db "1.42.0" +mime-types@^2.1.25: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" @@ -16840,7 +17188,7 @@ mime@1.6.0, mime@^1.2.11, mime@^1.3.4, mime@^1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.0: +mime@^2.0.3, mime@^2.4.0: version "2.4.4" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== @@ -18447,6 +18795,11 @@ once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.3.3, once@^1.4.0, once@ dependencies: wrappy "1" +one-time@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e" + integrity sha1-+M33eISCb+Tf+T46nMN7HkSAdC4= + onetime@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" @@ -18973,7 +19326,7 @@ parseuri@0.0.5: dependencies: better-assert "~1.0.0" -parseurl@~1.3.2: +parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -18996,6 +19349,14 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +password-prompt@^1.0.7: + version "1.1.2" + resolved "https://registry.yarnpkg.com/password-prompt/-/password-prompt-1.1.2.tgz#85b2f93896c5bd9e9f2d6ff0627fa5af3dc00923" + integrity sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA== + dependencies: + ansi-escapes "^3.1.0" + cross-spawn "^6.0.5" + patch-package@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.0.tgz#677de858e352b6ca4e6cb48a6efde2cec9fde566" @@ -19165,6 +19526,49 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= +percy-client@^3.2.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/percy-client/-/percy-client-3.6.1.tgz#f85167104a458616ec85afbeeff35293b7b1277c" + integrity sha512-J0/ohIYZF5O0PaU+Jn8AOmsx7FSgd8k94QjCCixuAo/hcuIZI4nkLGS0bXAQDPPTkbNWQKxhSlapPYkk9+gf4g== + dependencies: + bluebird "^3.5.1" + bluebird-retry "^0.11.0" + dotenv "^8.1.0" + es6-promise-pool "^2.5.0" + jssha "^2.1.0" + regenerator-runtime "^0.13.1" + request "^2.87.0" + request-promise "^4.2.2" + walk "^2.3.14" + +percy@0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/percy/-/percy-0.21.0.tgz#aaa2535fed6667d440a34f2dade9c04b63030818" + integrity sha512-gAUh8XcHHY8/nouM8uHWgwhU7zDrzUmUbCORFJuEMDWobzaAL3T1E3dD7SXab93bj3G70rt6uNlcjNsW5rDOxw== + dependencies: + "@oclif/command" "1.5.19" + "@oclif/config" "^1" + "@oclif/plugin-help" "^2" + "@oclif/plugin-not-found" "^1.2" + axios "^0.19.0" + body-parser "^1.18.3" + colors "^1.3.2" + cors "^2.8.4" + cosmiconfig "^5.2.1" + cross-spawn "^6.0.5" + deepmerge "^4.0.0" + express "^4.16.3" + follow-redirects "1.9.0" + generic-pool "^3.7.1" + globby "^10.0.1" + image-size "^0.8.2" + js-yaml "^3.13.1" + percy-client "^3.2.0" + puppeteer "^2.0.0" + retry-axios "^1.0.1" + which "^2.0.1" + winston "^3.0.0" + performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" @@ -19532,6 +19936,11 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= +pretty-bytes@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" + integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg== + pretty-error@^2.0.2: version "2.1.1" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" @@ -19600,7 +20009,7 @@ progress-stream@^2.0.0: speedometer "~1.0.0" through2 "~2.0.3" -progress@^2.0.0, progress@^2.0.3: +progress@^2.0.0, progress@^2.0.1, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -19695,7 +20104,7 @@ protoduck@^5.0.1: dependencies: genfun "^5.0.0" -proxy-addr@~2.0.4: +proxy-addr@~2.0.4, proxy-addr@~2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== @@ -19703,7 +20112,7 @@ proxy-addr@~2.0.4: forwarded "~0.1.2" ipaddr.js "1.9.0" -proxy-from-env@1.0.0: +proxy-from-env@1.0.0, proxy-from-env@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= @@ -19797,6 +20206,22 @@ pupa@^1.0.0: resolved "https://registry.yarnpkg.com/pupa/-/pupa-1.0.0.tgz#9a9568a5af7e657b8462a6e9d5328743560ceff6" integrity sha1-mpVopa9+ZXuEYqbp1TKHQ1YM7/Y= +puppeteer@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-2.1.1.tgz#ccde47c2a688f131883b50f2d697bd25189da27e" + integrity sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg== + dependencies: + "@types/mime-types" "^2.1.0" + debug "^4.1.0" + extract-zip "^1.6.6" + https-proxy-agent "^4.0.0" + mime "^2.0.3" + mime-types "^2.1.25" + progress "^2.0.1" + proxy-from-env "^1.0.0" + rimraf "^2.6.1" + ws "^6.1.0" + q@^1.1.2, q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -19851,6 +20276,13 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== +queue@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.1.tgz#abd5a5b0376912f070a25729e0b6a7d565683791" + integrity sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg== + dependencies: + inherits "~2.0.3" + quick-format-unescaped@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-1.1.2.tgz#0ca581de3174becef25ac3c2e8956342381db698" @@ -20541,6 +20973,13 @@ redent@^2.0.0: indent-string "^3.0.0" strip-indent "^2.0.0" +redeyed@~2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" + integrity sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs= + dependencies: + esprima "~4.0.0" + reflect.ownkeys@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460" @@ -20573,7 +21012,7 @@ regenerator-runtime@^0.12.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== -regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.3: +regenerator-runtime@^0.13.1, regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.3: version "0.13.3" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== @@ -20856,7 +21295,7 @@ request-promise@4.2.4: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request-promise@4.2.5: +request-promise@4.2.5, request-promise@^4.2.2: version "4.2.5" resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.5.tgz#186222c59ae512f3497dfe4d75a9c8461bd0053c" integrity sha512-ZgnepCykFdmpq86fKGwqntyTiUrHycALuGggpyCZwMvGaZWgxW6yagT0FHkgo5LzYvOaCNvxYwWYIjevSH1EDg== @@ -21151,6 +21590,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +retry-axios@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/retry-axios/-/retry-axios-1.0.2.tgz#f1b5895ad0ef69656036c48fd7952f72340ed772" + integrity sha512-PeR6ZVYscfOHrbN3A6EiP8M6UlseHpDkwVDsT6YMcZH0qyMubuFIq6gwydn+ZkvBzry3xmAZwZ3pW1zmJbvLOA== + retry@0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -21621,6 +22065,16 @@ serve-static@1.13.2: parseurl "~1.3.2" send "0.16.2" +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + serve@11.3.0: version "11.3.0" resolved "https://registry.yarnpkg.com/serve/-/serve-11.3.0.tgz#1d342e13e310501ecf17b6602f1f35da640d6448" @@ -22969,13 +23423,21 @@ supports-color@^3.1.0: dependencies: has-flag "^1.0.0" -supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: +supports-color@^5.0.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" +supports-hyperlinks@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" + integrity sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw== + dependencies: + has-flag "^2.0.0" + supports-color "^5.0.0" + sver-compat@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" @@ -23147,6 +23609,14 @@ 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== + dependencies: + ansi-to-html "0.6.14" + escape-html "1.0.3" + terminal-banner@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/terminal-banner/-/terminal-banner-1.1.0.tgz#ef81ce7d9d7e541a81d09eb2c0257c3d5463c3ea" @@ -23191,6 +23661,11 @@ text-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + text-mask-addons@3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/text-mask-addons/-/text-mask-addons-3.8.0.tgz#17b61ef665a4f36811f2ea1f01a223b4be61ab26" @@ -23498,6 +23973,11 @@ tree-kill@^1.1.0: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== +treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" + integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -23518,6 +23998,11 @@ trim-right@^1.0.0, trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= +triple-beam@^1.2.0, triple-beam@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" + integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== + "true-case-path@^1.0.2": version "1.0.3" resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" @@ -23572,7 +24057,7 @@ ts-toolbelt@^4.12.0: resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-4.14.6.tgz#9a232f62276caeee4fa9e81e0c4bffa047de0765" integrity sha512-SONcnRd93+LuYGfn/CZg5A5qhCODohZslAVZKHHu5bnwUxoXLqd2k2VIdwRUXYfKnY+UCeNbI2pTPz+Dno6Mpg== -tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== @@ -23679,7 +24164,7 @@ type-fest@^0.8.0, type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@~1.6.16, type-is@~1.6.17: +type-is@~1.6.16, type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -24373,6 +24858,13 @@ wait-on@3.3.0: request "^2.88.0" rx "^4.1.0" +walk@^2.3.14: + version "2.3.14" + resolved "https://registry.yarnpkg.com/walk/-/walk-2.3.14.tgz#60ec8631cfd23276ae1e7363ce11d626452e1ef3" + integrity sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg== + dependencies: + foreachasync "^3.0.0" + walker@^1.0.7, walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -24687,7 +25179,7 @@ widest-line@3.1.0: dependencies: string-width "^4.0.0" -widest-line@^2.0.0: +widest-line@^2.0.0, widest-line@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== @@ -24706,6 +25198,14 @@ windows-release@^3.1.0: dependencies: execa "^1.0.0" +winston-transport@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.3.0.tgz#df68c0c202482c448d9b47313c07304c2d7c2c66" + integrity sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A== + dependencies: + readable-stream "^2.3.6" + triple-beam "^1.2.0" + winston@2.4.4: version "2.4.4" resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.4.tgz#a01e4d1d0a103cf4eada6fc1f886b3110d71c34b" @@ -24718,6 +25218,21 @@ winston@2.4.4: isstream "0.1.x" stack-trace "0.0.x" +winston@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.2.1.tgz#63061377976c73584028be2490a1846055f77f07" + integrity sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw== + dependencies: + async "^2.6.1" + diagnostics "^1.1.1" + is-stream "^1.1.0" + logform "^2.1.1" + one-time "0.0.4" + readable-stream "^3.1.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.3.0" + word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -24761,6 +25276,15 @@ wrap-ansi@^3.0.1: string-width "^2.1.1" strip-ansi "^4.0.0" +wrap-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-4.0.0.tgz#b3570d7c70156159a2d42be5cc942e957f7b1131" + integrity sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg== + dependencies: + ansi-styles "^3.2.0" + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -24857,7 +25381,7 @@ ws@5.2.2, ws@^5.2.0: dependencies: async-limiter "~1.0.0" -ws@^6.1.2: +ws@^6.1.0, ws@^6.1.2: version "6.2.1" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==