From 26570b03d36bd81fe7e11817f7baf315d4f2a147 Mon Sep 17 00:00:00 2001 From: Arne Westphal Date: Wed, 11 Aug 2021 18:30:37 +0200 Subject: [PATCH 1/3] Add explicit NO_PROXY to cypress download Fixes #6304 --- cli/lib/tasks/download.js | 14 +--- cli/lib/tasks/getProxyFromURI.js | 82 ++++++++++++++++++++++ cli/test/lib/tasks/download_spec.js | 26 ------- cli/test/lib/tasks/getProxyFromURI_spec.js | 62 ++++++++++++++++ 4 files changed, 146 insertions(+), 38 deletions(-) create mode 100644 cli/lib/tasks/getProxyFromURI.js create mode 100644 cli/test/lib/tasks/getProxyFromURI_spec.js diff --git a/cli/lib/tasks/download.js b/cli/lib/tasks/download.js index c21d311c2f51..899916341225 100644 --- a/cli/lib/tasks/download.js +++ b/cli/lib/tasks/download.js @@ -9,6 +9,7 @@ const request = require('@cypress/request') const Promise = require('bluebird') const requestProgress = require('request-progress') const { stripIndent } = require('common-tags') +const getProxyFromURI = require('./getProxyFromURI') const { throwFormErrorText, errors } = require('../errors') const fs = require('../fs') @@ -16,16 +17,6 @@ const util = require('../util') const defaultBaseUrl = 'https://download.cypress.io/' -const getProxyUrl = () => { - return process.env.HTTPS_PROXY || - process.env.https_proxy || - process.env.npm_config_https_proxy || - process.env.HTTP_PROXY || - process.env.http_proxy || - process.env.npm_config_proxy || - null -} - const getRealOsArch = () => { // os.arch() returns the arch for which this node was compiled // we want the operating system's arch instead: x64 or x86 @@ -205,7 +196,7 @@ const verifyDownloadedFile = (filename, expectedSize, expectedChecksum) => { // {filename: ..., downloaded: true} const downloadFromUrl = ({ url, downloadDestination, progress, ca }) => { return new Promise((resolve, reject) => { - const proxy = getProxyUrl() + const proxy = getProxyFromURI(new URL(url)) debug('Downloading package', { url, @@ -357,6 +348,5 @@ const start = (opts) => { module.exports = { start, getUrl, - getProxyUrl, getCA, } diff --git a/cli/lib/tasks/getProxyFromURI.js b/cli/lib/tasks/getProxyFromURI.js new file mode 100644 index 000000000000..bea1f53c2e2a --- /dev/null +++ b/cli/lib/tasks/getProxyFromURI.js @@ -0,0 +1,82 @@ +'use strict' + +function formatHostname (hostname) { + // canonicalize the hostname, so that 'oogle.com' won't match 'google.com' + return hostname.replace(/^\.*/, '.').toLowerCase() +} + +function parseNoProxyZone (zone) { + zone = zone.trim().toLowerCase() + + let zoneParts = zone.split(':', 2) + let zoneHost = formatHostname(zoneParts[0]) + let zonePort = zoneParts[1] + let hasPort = zone.indexOf(':') > -1 + + return { hostname: zoneHost, port: zonePort, hasPort } +} + +function uriInNoProxy (uri, noProxy) { + let port = uri.port || (uri.protocol === 'https:' ? '443' : '80') + let hostname = formatHostname(uri.hostname) + let noProxyList = noProxy.split(',') + + // iterate through the noProxyList until it finds a match. + return noProxyList.map(parseNoProxyZone).some(function (noProxyZone) { + let isMatchedAt = hostname.indexOf(noProxyZone.hostname) + let hostnameMatched = ( + isMatchedAt > -1 && + (isMatchedAt === hostname.length - noProxyZone.hostname.length) + ) + + if (noProxyZone.hasPort) { + return (port === noProxyZone.port) && hostnameMatched + } + + return hostnameMatched + }) +} + +function getProxyFromURI (uri) { + // Decide the proper request proxy to use based on the request URI object and the + // environmental variables (NO_PROXY, HTTP_PROXY, etc.) + // respect NO_PROXY environment variables (see: https://lynx.invisible-island.net/lynx2.8.7/breakout/lynx_help/keystrokes/environments.html) + + let noProxy = process.env.NO_PROXY || process.env.no_proxy || '' + + // if the noProxy is a wildcard then return null + + if (noProxy === '*') { + return null + } + + // if the noProxy is not empty and the uri is found return null + + if (noProxy !== '' && uriInNoProxy(uri, noProxy)) { + return null + } + + // Check for HTTP or HTTPS Proxy in environment Else default to null + + if (uri.protocol === 'http:') { + return process.env.HTTP_PROXY || + process.env.http_proxy || + process.env.npm_config_proxy || null + } + + if (uri.protocol === 'https:') { + return process.env.HTTPS_PROXY || + process.env.https_proxy || + process.env.npm_config_https_proxy || + process.env.HTTP_PROXY || + process.env.http_proxy || + process.env.npm_config_proxy || null + } + + // if none of that works, return null + // (What uri protocol are you using then?) + + return null +} + +module.exports = getProxyFromURI diff --git a/cli/test/lib/tasks/download_spec.js b/cli/test/lib/tasks/download_spec.js index fe5a4ebce3ad..54121ae46728 100644 --- a/cli/test/lib/tasks/download_spec.js +++ b/cli/test/lib/tasks/download_spec.js @@ -312,32 +312,6 @@ describe('lib/tasks/download', function () { }) }) - context('with proxy env vars', () => { - beforeEach(function () { - this.env = _.clone(process.env) - }) - - afterEach(function () { - process.env = this.env - }) - - it('prefers https_proxy over http_proxy', () => { - process.env.HTTP_PROXY = 'foo' - expect(download.getProxyUrl()).to.eq('foo') - process.env.https_proxy = 'bar' - expect(download.getProxyUrl()).to.eq('bar') - }) - - it('falls back to npm_config_proxy', () => { - process.env.npm_config_proxy = 'foo' - expect(download.getProxyUrl()).to.eq('foo') - process.env.npm_config_https_proxy = 'bar' - expect(download.getProxyUrl()).to.eq('bar') - process.env.https_proxy = 'baz' - expect(download.getProxyUrl()).to.eq('baz') - }) - }) - context('with CA and CAFILE env vars', () => { beforeEach(function () { this.env = _.clone(process.env) diff --git a/cli/test/lib/tasks/getProxyFromURI_spec.js b/cli/test/lib/tasks/getProxyFromURI_spec.js new file mode 100644 index 000000000000..2fcb1cae6262 --- /dev/null +++ b/cli/test/lib/tasks/getProxyFromURI_spec.js @@ -0,0 +1,62 @@ +require('../../spec_helper') + +const _ = require('lodash') +const os = require('os') +const getProxyFromURI = require(`${lib}/tasks/getProxyFromURI`) + +const stdout = require('../../support/stdout') + +describe('lib/tasks/getProxyFromURI', function () { + require('mocha-banner').register() + + const testUri = new URL('https://anything.com') + + beforeEach(function () { + this.stdout = stdout.capture() + + os.platform.returns('darwin') + }) + + afterEach(function () { + stdout.restore() + }) + + context('with proxy env vars', () => { + beforeEach(function () { + this.env = _.clone(process.env) + // add a default no_proxy which does not match the testUri + process.env.NO_PROXY = 'localhost,.org' + }) + + afterEach(function () { + process.env = this.env + }) + + it('prefers https_proxy over http_proxy', () => { + process.env.HTTP_PROXY = 'foo' + expect(getProxyFromURI(testUri)).to.eq('foo') + process.env.https_proxy = 'bar' + expect(getProxyFromURI(testUri)).to.eq('bar') + }) + + it('falls back to npm_config_proxy', () => { + process.env.npm_config_proxy = 'foo' + expect(getProxyFromURI(testUri)).to.eq('foo') + process.env.npm_config_https_proxy = 'bar' + expect(getProxyFromURI(testUri)).to.eq('bar') + process.env.https_proxy = 'baz' + expect(getProxyFromURI(testUri)).to.eq('baz') + }) + + it('respects no_proxy', () => { + process.env.NO_PROXY = 'localhost,.com' + + process.env.HTTP_PROXY = 'foo' + expect(getProxyFromURI(testUri)).to.eq(null) + process.env.npm_config_https_proxy = 'bar' + expect(getProxyFromURI(testUri)).to.eq(null) + process.env.https_proxy = 'baz' + expect(getProxyFromURI(testUri)).to.eq(null) + }) + }) +}) From 82b00266991d58cf541fe95befd58bc99aa88100 Mon Sep 17 00:00:00 2001 From: Arne Westphal Date: Thu, 12 Aug 2021 00:58:56 +0200 Subject: [PATCH 2/3] Switch to proxy-from-env instead own proxy detection implementation --- cli/lib/tasks/download.js | 12 +++- cli/lib/tasks/getProxyFromURI.js | 82 ---------------------- cli/test/lib/tasks/download_spec.js | 58 +++++++++++++++ cli/test/lib/tasks/getProxyFromURI_spec.js | 62 ---------------- 4 files changed, 68 insertions(+), 146 deletions(-) delete mode 100644 cli/lib/tasks/getProxyFromURI.js delete mode 100644 cli/test/lib/tasks/getProxyFromURI_spec.js diff --git a/cli/lib/tasks/download.js b/cli/lib/tasks/download.js index 899916341225..9fd55cf21da9 100644 --- a/cli/lib/tasks/download.js +++ b/cli/lib/tasks/download.js @@ -9,7 +9,7 @@ const request = require('@cypress/request') const Promise = require('bluebird') const requestProgress = require('request-progress') const { stripIndent } = require('common-tags') -const getProxyFromURI = require('./getProxyFromURI') +const getProxyForUrl = require('proxy-from-env').getProxyForUrl const { throwFormErrorText, errors } = require('../errors') const fs = require('../fs') @@ -17,6 +17,13 @@ const util = require('../util') const defaultBaseUrl = 'https://download.cypress.io/' +const getProxyForUrlWithNpmConfig = (url) => { + return getProxyForUrl(url) || + process.env.npm_config_https_proxy || + process.env.npm_config_proxy || + null +} + const getRealOsArch = () => { // os.arch() returns the arch for which this node was compiled // we want the operating system's arch instead: x64 or x86 @@ -196,7 +203,7 @@ const verifyDownloadedFile = (filename, expectedSize, expectedChecksum) => { // {filename: ..., downloaded: true} const downloadFromUrl = ({ url, downloadDestination, progress, ca }) => { return new Promise((resolve, reject) => { - const proxy = getProxyFromURI(new URL(url)) + const proxy = getProxyForUrlWithNpmConfig(url) debug('Downloading package', { url, @@ -348,5 +355,6 @@ const start = (opts) => { module.exports = { start, getUrl, + getProxyForUrlWithNpmConfig, getCA, } diff --git a/cli/lib/tasks/getProxyFromURI.js b/cli/lib/tasks/getProxyFromURI.js deleted file mode 100644 index bea1f53c2e2a..000000000000 --- a/cli/lib/tasks/getProxyFromURI.js +++ /dev/null @@ -1,82 +0,0 @@ -'use strict' - -function formatHostname (hostname) { - // canonicalize the hostname, so that 'oogle.com' won't match 'google.com' - return hostname.replace(/^\.*/, '.').toLowerCase() -} - -function parseNoProxyZone (zone) { - zone = zone.trim().toLowerCase() - - let zoneParts = zone.split(':', 2) - let zoneHost = formatHostname(zoneParts[0]) - let zonePort = zoneParts[1] - let hasPort = zone.indexOf(':') > -1 - - return { hostname: zoneHost, port: zonePort, hasPort } -} - -function uriInNoProxy (uri, noProxy) { - let port = uri.port || (uri.protocol === 'https:' ? '443' : '80') - let hostname = formatHostname(uri.hostname) - let noProxyList = noProxy.split(',') - - // iterate through the noProxyList until it finds a match. - return noProxyList.map(parseNoProxyZone).some(function (noProxyZone) { - let isMatchedAt = hostname.indexOf(noProxyZone.hostname) - let hostnameMatched = ( - isMatchedAt > -1 && - (isMatchedAt === hostname.length - noProxyZone.hostname.length) - ) - - if (noProxyZone.hasPort) { - return (port === noProxyZone.port) && hostnameMatched - } - - return hostnameMatched - }) -} - -function getProxyFromURI (uri) { - // Decide the proper request proxy to use based on the request URI object and the - // environmental variables (NO_PROXY, HTTP_PROXY, etc.) - // respect NO_PROXY environment variables (see: https://lynx.invisible-island.net/lynx2.8.7/breakout/lynx_help/keystrokes/environments.html) - - let noProxy = process.env.NO_PROXY || process.env.no_proxy || '' - - // if the noProxy is a wildcard then return null - - if (noProxy === '*') { - return null - } - - // if the noProxy is not empty and the uri is found return null - - if (noProxy !== '' && uriInNoProxy(uri, noProxy)) { - return null - } - - // Check for HTTP or HTTPS Proxy in environment Else default to null - - if (uri.protocol === 'http:') { - return process.env.HTTP_PROXY || - process.env.http_proxy || - process.env.npm_config_proxy || null - } - - if (uri.protocol === 'https:') { - return process.env.HTTPS_PROXY || - process.env.https_proxy || - process.env.npm_config_https_proxy || - process.env.HTTP_PROXY || - process.env.http_proxy || - process.env.npm_config_proxy || null - } - - // if none of that works, return null - // (What uri protocol are you using then?) - - return null -} - -module.exports = getProxyFromURI diff --git a/cli/test/lib/tasks/download_spec.js b/cli/test/lib/tasks/download_spec.js index 54121ae46728..02d1c9aac015 100644 --- a/cli/test/lib/tasks/download_spec.js +++ b/cli/test/lib/tasks/download_spec.js @@ -312,6 +312,64 @@ describe('lib/tasks/download', function () { }) }) + context('with proxy env vars', () => { + const testUriHttp = 'http://anything.com' + const testUriHttps = 'https://anything.com' + + beforeEach(function () { + this.env = _.clone(process.env) + // add a default no_proxy which does not match the testUri + process.env.NO_PROXY = 'localhost,.org' + }) + + afterEach(function () { + process.env = this.env + }) + + it('uses http_proxy on http request', () => { + process.env.http_proxy = 'http://foo' + expect(download.getProxyForUrlWithNpmConfig(testUriHttp)).to.eq('http://foo') + }) + + it('ignores http_proxy on https request', () => { + process.env.http_proxy = 'http://foo' + expect(download.getProxyForUrlWithNpmConfig(testUriHttps)).to.eq(null) + process.env.https_proxy = 'https://bar' + expect(download.getProxyForUrlWithNpmConfig(testUriHttps)).to.eq('https://bar') + }) + + it('falls back to npm_config_proxy', () => { + process.env.npm_config_proxy = 'http://foo' + expect(download.getProxyForUrlWithNpmConfig(testUriHttps)).to.eq('http://foo') + process.env.npm_config_https_proxy = 'https://bar' + expect(download.getProxyForUrlWithNpmConfig(testUriHttps)).to.eq('https://bar') + process.env.https_proxy = 'https://baz' + expect(download.getProxyForUrlWithNpmConfig(testUriHttps)).to.eq('https://baz') + }) + + it('respects no_proxy on http and https requests', () => { + process.env.NO_PROXY = 'localhost,.com' + + process.env.http_proxy = 'http://foo' + process.env.https_proxy = 'https://bar' + + expect(download.getProxyForUrlWithNpmConfig(testUriHttp)).to.eq(null) + expect(download.getProxyForUrlWithNpmConfig(testUriHttps)).to.eq(null) + }) + + it('ignores no_proxy for npm proxy configs, prefers https over http', () => { + process.env.NO_PROXY = 'localhost,.com' + + process.env.npm_config_proxy = 'http://foo' + expect(download.getProxyForUrlWithNpmConfig(testUriHttp)).to.eq('http://foo') + expect(download.getProxyForUrlWithNpmConfig(testUriHttps)).to.eq('http://foo') + + process.env.npm_config_https_proxy = 'https://bar' + expect(download.getProxyForUrlWithNpmConfig(testUriHttp)).to.eq('https://bar') + expect(download.getProxyForUrlWithNpmConfig(testUriHttps)).to.eq('https://bar') + }) + }) + context('with CA and CAFILE env vars', () => { beforeEach(function () { this.env = _.clone(process.env) diff --git a/cli/test/lib/tasks/getProxyFromURI_spec.js b/cli/test/lib/tasks/getProxyFromURI_spec.js deleted file mode 100644 index 2fcb1cae6262..000000000000 --- a/cli/test/lib/tasks/getProxyFromURI_spec.js +++ /dev/null @@ -1,62 +0,0 @@ -require('../../spec_helper') - -const _ = require('lodash') -const os = require('os') -const getProxyFromURI = require(`${lib}/tasks/getProxyFromURI`) - -const stdout = require('../../support/stdout') - -describe('lib/tasks/getProxyFromURI', function () { - require('mocha-banner').register() - - const testUri = new URL('https://anything.com') - - beforeEach(function () { - this.stdout = stdout.capture() - - os.platform.returns('darwin') - }) - - afterEach(function () { - stdout.restore() - }) - - context('with proxy env vars', () => { - beforeEach(function () { - this.env = _.clone(process.env) - // add a default no_proxy which does not match the testUri - process.env.NO_PROXY = 'localhost,.org' - }) - - afterEach(function () { - process.env = this.env - }) - - it('prefers https_proxy over http_proxy', () => { - process.env.HTTP_PROXY = 'foo' - expect(getProxyFromURI(testUri)).to.eq('foo') - process.env.https_proxy = 'bar' - expect(getProxyFromURI(testUri)).to.eq('bar') - }) - - it('falls back to npm_config_proxy', () => { - process.env.npm_config_proxy = 'foo' - expect(getProxyFromURI(testUri)).to.eq('foo') - process.env.npm_config_https_proxy = 'bar' - expect(getProxyFromURI(testUri)).to.eq('bar') - process.env.https_proxy = 'baz' - expect(getProxyFromURI(testUri)).to.eq('baz') - }) - - it('respects no_proxy', () => { - process.env.NO_PROXY = 'localhost,.com' - - process.env.HTTP_PROXY = 'foo' - expect(getProxyFromURI(testUri)).to.eq(null) - process.env.npm_config_https_proxy = 'bar' - expect(getProxyFromURI(testUri)).to.eq(null) - process.env.https_proxy = 'baz' - expect(getProxyFromURI(testUri)).to.eq(null) - }) - }) -}) From 995acef976f67e82e1a51e9217fd979134d6a309 Mon Sep 17 00:00:00 2001 From: Zach Bloomquist Date: Tue, 14 Sep 2021 10:48:50 -0400 Subject: [PATCH 3/3] add proxy-from-env@1.0.0 --- cli/package.json | 1 + yarn.lock | 61 +++++++++++++++++++++++++++++++++++++----------- 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/cli/package.json b/cli/package.json index d70337b15b9f..7690f9d04513 100644 --- a/cli/package.json +++ b/cli/package.json @@ -54,6 +54,7 @@ "minimist": "^1.2.5", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", "ramda": "~0.27.1", "request-progress": "^3.0.0", "supports-color": "^8.1.1", diff --git a/yarn.lock b/yarn.lock index 2ce9355ea4f8..96ef97b516d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3457,7 +3457,7 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" -"@jest/types@^26.3.0", "@jest/types@^26.6.2": +"@jest/types@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== @@ -7640,7 +7640,7 @@ dependencies: chalk "*" -"@types/cheerio@*", "@types/cheerio@0.22.21": +"@types/cheerio@*": version "0.22.21" resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.21.tgz#5e37887de309ba11b2e19a6e14cad7874b31a8a3" integrity sha512-aGI3DfswwqgKPiEOTaiHV2ZPC9KEhprpgEbJnv0fZl3SGX0cGgEva1126dGrMC6AJM6v/aihlUgJn9M5DbDZ/Q== @@ -7735,7 +7735,7 @@ dependencies: "@types/enzyme" "*" -"@types/enzyme@*", "@types/enzyme@3.10.5": +"@types/enzyme@*": version "3.10.5" resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.10.5.tgz#fe7eeba3550369eed20e7fb565bfb74eec44f1f0" integrity sha512-R+phe509UuUYy9Tk0YlSbipRpfVtIzb/9BHn5pTEtjJTF5LXvUjrIQcZvNyANNEyFrd2YGs196PniNT1fgvOQA== @@ -10126,7 +10126,7 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.1.0: +ansi-regex@^4.0.0, ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== @@ -14389,6 +14389,11 @@ component-bind@1.0.0: resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + component-emitter@^1.2.0, component-emitter@^1.2.1, component-emitter@^1.3.0, component-emitter@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" @@ -31333,15 +31338,25 @@ pretty-error@^2.0.2, pretty-error@^2.1.1: lodash "^4.17.20" renderkid "^2.0.4" -pretty-format@26.4.0, pretty-format@^24.9.0, pretty-format@^26.6.2: - version "26.4.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.4.0.tgz#c08073f531429e9e5024049446f42ecc9f933a3b" - integrity sha512-mEEwwpCseqrUtuMbrJG4b824877pM5xald3AkilJ47Po2YLr97/siejYQHqj2oDQBeJNbu+Q0qUuekJ8F0NAPg== +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== dependencies: - "@jest/types" "^26.3.0" + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" ansi-regex "^5.0.0" ansi-styles "^4.0.0" - react-is "^16.12.0" + react-is "^17.0.1" pretty-hrtime@^1.0.0, pretty-hrtime@^1.0.3: version "1.0.3" @@ -32475,12 +32490,12 @@ react-inspector@^5.1.0: is-dom "^1.0.0" prop-types "^15.0.0" -react-is@16.13.1, react-is@^16.12.0, react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.6: +react-is@16.13.1, react-is@^16.12.0, react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -"react-is@^16.8.0 || ^17.0.0", react-is@^17.0.2: +"react-is@^16.8.0 || ^17.0.0", react-is@^17.0.1, react-is@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== @@ -35466,7 +35481,25 @@ socket.io-client@4.0.1: parseuri "0.0.6" socket.io-parser "~4.0.4" -socket.io-parser@4.0.4, socket.io-parser@~3.3.0, socket.io-parser@~3.4.0, socket.io-parser@~4.0.3, socket.io-parser@~4.0.4: +socket.io-parser@~3.3.0: + version "3.3.2" + resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz#ef872009d0adcf704f2fbe830191a14752ad50b6" + integrity sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg== + dependencies: + component-emitter "~1.3.0" + debug "~3.1.0" + isarray "2.0.1" + +socket.io-parser@~3.4.0: + version "3.4.1" + resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz#b06af838302975837eab2dc980037da24054d64a" + integrity sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A== + dependencies: + component-emitter "1.2.1" + debug "~4.1.0" + isarray "2.0.1" + +socket.io-parser@~4.0.3, socket.io-parser@~4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== @@ -39504,7 +39537,7 @@ vue-style-loader@^4.1.0, vue-style-loader@^4.1.2: hash-sum "^1.0.2" loader-utils "^1.0.2" -vue-template-compiler@2.6.12, vue-template-compiler@^2.6.11: +vue-template-compiler@^2.6.11: version "2.6.12" resolved "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz#947ed7196744c8a5285ebe1233fe960437fcc57e" integrity sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==