diff --git a/packages/driver/cypress/integration/util/firefox_forced_gc_spec.ts b/packages/driver/cypress/integration/util/firefox_forced_gc_spec.ts deleted file mode 100644 index 7110e97b8c8c..000000000000 --- a/packages/driver/cypress/integration/util/firefox_forced_gc_spec.ts +++ /dev/null @@ -1,240 +0,0 @@ -import { createIntervalGetter, install } from '../../../src/util/firefox_forced_gc' - -describe('driver/src/util/firefox_forced_gc', () => { - describe('#createIntervalGetter returns a function that', () => { - const run = (configObj) => { - const fakeCypress = { - config: (key) => { - return key ? configObj[key] : configObj - }, - browser: configObj.browser, - } - - // @ts-ignore - return createIntervalGetter(fakeCypress)() - } - - it('returns undefined if not in Firefox', () => { - expect(run({ - browser: { - family: 'chrome', - }, - })).to.be.undefined - }) - - it('returns a number if firefoxGcInterval is a plain number', () => { - expect(run({ - browser: { - family: 'firefox', - majorVersion: 79, - }, - firefoxGcInterval: 99, - })).to.eq(99) - }) - - it('returns null if firefoxGcInterval is null', () => { - expect(run({ - browser: { - family: 'firefox', - majorVersion: 79, - }, - firefoxGcInterval: null, - })).to.eq(null) - }) - - it('returns the appropriate interval for open mode', () => { - expect(run({ - browser: { - family: 'firefox', - majorVersion: 79, - }, - firefoxGcInterval: { - runMode: 10, - openMode: 20, - }, - isInteractive: true, - })).to.eq(20) - }) - - it('returns the appropriate interval for run mode', () => { - expect(run({ - browser: { - family: 'firefox', - majorVersion: 79, - }, - firefoxGcInterval: { - runMode: 10, - openMode: 20, - }, - isInteractive: false, - })).to.eq(10) - }) - - it('has been correctly mounted at Cypress.getFirefoxGcInterval', { - // @ts-ignore - firefoxGcInterval: 5, - }, () => { - const real = Cypress.getFirefoxGcInterval - const fake = createIntervalGetter(Cypress) - - // conditional, so it can pass in non-ff browsers - expect(real()).to.eq(fake()).and.eq(Cypress.isBrowser('firefox') && Cypress.browser.majorVersion < 80 ? 5 : undefined) - }) - }) - - describe('#install', () => { - let MockCypress: any - let commandStartFn: any - let testBeforeRunAsyncFn: any - - beforeEach(() => { - MockCypress = { - on: cy.stub().throws(), - emit: cy.stub().throws(), - browser: { - family: 'firefox', - majorVersion: 79, - }, - getFirefoxGcInterval: cy.stub().throws(), - backend: cy.stub().throws(), - } - - commandStartFn = testBeforeRunAsyncFn = undefined - - MockCypress.on.withArgs('command:start').callsFake((_, fn) => { - commandStartFn = fn - }) - - MockCypress.on.withArgs('test:before:run:async').callsFake((_, fn) => { - testBeforeRunAsyncFn = fn - }) - }) - - const fakeVisit = () => { - commandStartFn({ get: cy.stub().throws().withArgs('name').returns('visit') }) - } - - const fakeBeforeTestRun = (order) => { - return testBeforeRunAsyncFn({ order }) || Promise.resolve() - } - - it('registers no event handlers if not in Firefox', () => { - MockCypress.browser.family = 'chrome' - - install(MockCypress) - - expect(MockCypress.on).to.not.be.called - }) - - // @see https://github.com/cypress-io/cypress/issues/8241 - it('registers no event handlers if in Firefox >= 80', () => { - MockCypress.browser.majorVersion = 80 - - install(MockCypress) - - expect(MockCypress.on).to.not.be.called - }) - - it('triggers a forced GC correctly with interval = 1', () => { - MockCypress.getFirefoxGcInterval.returns(1) - - const forceGc = MockCypress.backend.withArgs('firefox:force:gc').resolves() - const emitBefore = MockCypress.emit.withArgs('before:firefox:force:gc').returns() - const emitAfter = MockCypress.emit.withArgs('after:firefox:force:gc').returns() - - install(MockCypress) - - return fakeBeforeTestRun(0).then(() => { - fakeVisit() - - return fakeBeforeTestRun(1) - }) - .then(() => { - expect(forceGc).to.be.calledOnce - expect(emitBefore).to.be.calledOnce - expect(emitAfter).to.be.calledOnce - }) - .then(() => { - return fakeBeforeTestRun(2) - }) - .then(() => { - return fakeBeforeTestRun(3) - }) - .then(() => { - expect(forceGc).to.be.calledOnce - expect(emitBefore).to.be.calledOnce - expect(emitAfter).to.be.calledOnce - - fakeVisit() - - return fakeBeforeTestRun(4) - }) - .then(() => { - expect(forceGc).to.be.calledTwice - expect(emitBefore).to.be.calledTwice - expect(emitAfter).to.be.calledTwice - }) - }) - - it('triggers a forced GC correctly with interval = 3', () => { - MockCypress.getFirefoxGcInterval.returns(3) - - const forceGc = MockCypress.backend.withArgs('firefox:force:gc').resolves() - const emitBefore = MockCypress.emit.withArgs('before:firefox:force:gc').returns() - const emitAfter = MockCypress.emit.withArgs('after:firefox:force:gc').returns() - - install(MockCypress) - - return fakeBeforeTestRun(0).then(() => { - return fakeBeforeTestRun(1) - }) - .then(() => { - expect(forceGc).to.not.be.called - expect(emitBefore).to.not.be.called - expect(emitAfter).to.not.be.called - - fakeVisit() - }) - .then(() => { - return fakeBeforeTestRun(2) - }) - .then(() => { - return fakeBeforeTestRun(3) - }) - .then(() => { - expect(forceGc).to.be.calledOnce - expect(emitBefore).to.be.calledOnce - expect(emitAfter).to.be.calledOnce - }) - }) - - it('does not trigger any forced GC with falsy interval', () => { - MockCypress.getFirefoxGcInterval.returns(false) - - const forceGc = MockCypress.backend.withArgs('firefox:force:gc').resolves() - const emitBefore = MockCypress.emit.withArgs('before:firefox:force:gc').returns() - const emitAfter = MockCypress.emit.withArgs('after:firefox:force:gc').returns() - - install(MockCypress) - - return fakeBeforeTestRun(0).then(() => { - return fakeBeforeTestRun(1) - }) - .then(() => { - expect(forceGc).to.not.be.called - expect(emitBefore).to.not.be.called - expect(emitAfter).to.not.be.called - - fakeVisit() - }) - .then(() => { - return fakeBeforeTestRun(2) - }) - .then(() => { - expect(forceGc).to.not.be.called - expect(emitBefore).to.not.be.called - expect(emitAfter).to.not.be.called - }) - }) - }) -}) diff --git a/packages/driver/src/cypress.js b/packages/driver/src/cypress.js index d29cd9f27d16..68d57fa7b415 100644 --- a/packages/driver/src/cypress.js +++ b/packages/driver/src/cypress.js @@ -14,7 +14,6 @@ const $Commands = require('./cypress/commands') const $Cookies = require('./cypress/cookies') const $Cy = require('./cypress/cy') const $Events = require('./cypress/events') -const $FirefoxForcedGc = require('./util/firefox_forced_gc') const $Keyboard = require('./cy/keyboard') const $SetterGetter = require('./cypress/setter_getter') const $Log = require('./cypress/log') @@ -137,7 +136,6 @@ class $Cypress { this.originalConfig = _.cloneDeep(config) this.config = $SetterGetter.create(config) this.env = $SetterGetter.create(env) - this.getFirefoxGcInterval = $FirefoxForcedGc.createIntervalGetter(this) this.getTestRetries = function () { const testRetries = this.config('retries') @@ -213,8 +211,6 @@ class $Cypress { this.events.proxyTo(this.cy) - $FirefoxForcedGc.install(this) - $scriptUtils.runScripts(specWindow, scripts) .catch((error) => { this.runner.onSpecError('error')({ error }) diff --git a/packages/driver/src/util/firefox_forced_gc.ts b/packages/driver/src/util/firefox_forced_gc.ts deleted file mode 100644 index c8360d1d5c22..000000000000 --- a/packages/driver/src/util/firefox_forced_gc.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { isNumber, isNull } from 'lodash' - -function usingFirefoxWithGcBug (browser: Cypress.Browser) { - // @see https://github.com/cypress-io/cypress/issues/8241 - return browser.family === 'firefox' && browser.majorVersion < 80 -} - -export function createIntervalGetter (Cypress: Cypress.Cypress) { - return () => { - if (!usingFirefoxWithGcBug(Cypress.browser)) { - return undefined - } - - const intervals = Cypress.config('firefoxGcInterval') - - if (isNumber(intervals) || isNull(intervals)) { - return intervals - } - - // @ts-ignore - return intervals[Cypress.config('isInteractive') ? 'openMode' : 'runMode'] - } -} - -export function install (Cypress: Cypress.Cypress & EventEmitter) { - if (!usingFirefoxWithGcBug(Cypress.browser)) { - return - } - - let cyVisitedSinceLastGc = false - let testsSinceLastForcedGc = 0 - - Cypress.on('command:start', function (cmd) { - if (cmd.get('name') === 'visit') { - cyVisitedSinceLastGc = true - } - }) - - Cypress.on('test:before:run:async', function (testAttrs) { - const { order } = testAttrs - - testsSinceLastForcedGc++ - - // if this is the first test, or the last test didn't run a cy.visit... - if (order === 0 || !cyVisitedSinceLastGc) { - return - } - - const gcInterval = Cypress.getFirefoxGcInterval() - - cyVisitedSinceLastGc = false - - if (gcInterval && gcInterval > 0 && testsSinceLastForcedGc >= gcInterval) { - testsSinceLastForcedGc = 0 - Cypress.emit('before:firefox:force:gc', { gcInterval }) - - return Cypress.backend('firefox:force:gc').then(() => { - return Cypress.emit('after:firefox:force:gc', { gcInterval }) - }) - } - - return - }) -} diff --git a/packages/launcher/lib/detect.ts b/packages/launcher/lib/detect.ts index 6fa4cf68d42a..83114d22d0f4 100644 --- a/packages/launcher/lib/detect.ts +++ b/packages/launcher/lib/detect.ts @@ -133,21 +133,9 @@ function checkOneBrowser (browser: Browser): Promise { .then(pickBrowserProps) .then(tap(logBrowser)) .then((browser) => setMajorVersion(browser)) - .then(maybeSetFirefoxWarning) .catch(failed) } -export const firefoxGcWarning = 'This version of Firefox has a bug that causes excessive memory consumption and will cause your tests to run slowly. It is recommended to upgrade to Firefox 80 or newer. [Learn more.](https://docs.cypress.io/guides/references/configuration.html#firefoxGcInterval)' - -// @see https://github.com/cypress-io/cypress/issues/8241 -const maybeSetFirefoxWarning = (browser: FoundBrowser) => { - if (browser.family === 'firefox' && Number(browser.majorVersion) < 80) { - browser.warning = firefoxGcWarning - } - - return browser -} - /** returns list of detected browsers */ export const detect = (goalBrowsers?: Browser[]): Bluebird => { // we can detect same browser under different aliases @@ -232,7 +220,6 @@ export const detectByPath = ( return setCustomBrowserData(browser, pathData.path, version) }) - .then(maybeSetFirefoxWarning) .catch((err: NotDetectedAtPathError) => { if (err.notDetectedAtPath) { throw err diff --git a/packages/launcher/test/unit/detect_spec.ts b/packages/launcher/test/unit/detect_spec.ts index c665dea41242..139d8c7728b4 100644 --- a/packages/launcher/test/unit/detect_spec.ts +++ b/packages/launcher/test/unit/detect_spec.ts @@ -1,5 +1,5 @@ require('../spec_helper') -import { firefoxGcWarning, detect, detectByPath, setMajorVersion } from '../../lib/detect' +import { detect, detectByPath, setMajorVersion } from '../../lib/detect' import { goalBrowsers } from '../fixtures' import { expect } from 'chai' import { utils } from '../../lib/utils' @@ -167,20 +167,5 @@ describe('browser detection', () => { expect(foundBrowser.warning).to.contain('does not support running Custom Firefox version 85') .and.contain('Firefox newer than or equal to 86') }) - - // @see https://github.com/cypress-io/cypress/issues/8241 - it('adds warnings to Firefox versions less than 80', async () => { - execa.withArgs('/good-firefox', ['--version']) - .resolves({ stdout: 'Mozilla Firefox 80.0' }) - - execa.withArgs('/bad-firefox', ['--version']) - .resolves({ stdout: 'Mozilla Firefox 79.1' }) - - // TODO: remove this warning/auto-GC, since Cy no longer supports FF < 86 - // expect(await detectByPath('/good-firefox')).to.not.have.property('warning') - expect(await detectByPath('/bad-firefox')).to.include({ - warning: firefoxGcWarning, - }) - }) }) }) diff --git a/packages/launcher/test/unit/linux_spec.ts b/packages/launcher/test/unit/linux_spec.ts index 2f33936badf4..a56a968d5acc 100644 --- a/packages/launcher/test/unit/linux_spec.ts +++ b/packages/launcher/test/unit/linux_spec.ts @@ -4,8 +4,7 @@ import _ from 'lodash' import * as linuxHelper from '../../lib/linux' import 'chai-as-promised' import { log } from '../log' -import { detect, firefoxGcWarning } from '../../lib/detect' -import { browsers } from '../../lib/browsers' +import { detect } from '../../lib/detect' import { goalBrowsers } from '../fixtures' import { expect } from 'chai' import { utils } from '../../lib/utils' @@ -94,18 +93,6 @@ describe('linux browser detection', () => { return linuxHelper.detect(goal).then(checkBrowser) }) - // @see https://github.com/cypress-io/cypress/issues/8241 - it('adds warnings to Firefox versions less than 80', async () => { - const goalFirefox = _.find(browsers, { binary: 'firefox' }) - - sinon.stub(os, 'platform').withArgs().returns('linux') - execa.withArgs('firefox', ['--version']).resolves({ stdout: 'Mozilla Firefox 79.1' }) - - expect((await detect([goalFirefox]))[0]).to.include({ - warning: firefoxGcWarning, - }) - }) - // despite using detect(), this test is in linux/spec instead of detect_spec because it is // testing side effects that occur within the Linux-specific detect function // https://github.com/cypress-io/cypress/issues/1400 diff --git a/packages/reporter/cypress/integration/forced_gc_spec.ts b/packages/reporter/cypress/integration/forced_gc_spec.ts deleted file mode 100644 index 86d9a95fbab6..000000000000 --- a/packages/reporter/cypress/integration/forced_gc_spec.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { EventEmitter } from 'events' -import { RootRunnable } from '../../src/runnables/runnables-store' - -describe('forced gc', () => { - let runner: EventEmitter - let runnables: RootRunnable - - beforeEach(() => { - cy.fixture('runnables').then((_runnables) => { - runnables = _runnables - }) - - runner = new EventEmitter() - - cy.visit('/').then((win) => { - win.render({ - runner, - spec: { - name: 'foo', - absolute: '/foo/bar', - relative: 'foo/bar', - }, - }) - }) - - cy.get('.reporter').then(() => { - runner.emit('runnables:ready', runnables) - runner.emit('reporter:start', {}) - }) - }) - - it('does not display the warning when interval is undefined', () => { - cy.get('.forced-gc-warning').should('not.exist') - }) - - describe('when interval is null or a number', () => { - beforeEach(() => { - runner.emit('before:firefox:force:gc', { gcInterval: null }) - }) - - it('expands on click', () => { - cy.contains('GC Interval').click() - cy.contains('Garbage Collection Interval').should('be.visible') - }) - - it('collapses on a second click', () => { - cy.contains('GC Interval').click().click() - cy.contains('Garbage Collection Interval').should('not.be.visible') - }) - - it('collapses on a clicking X', () => { - cy.contains('GC Interval').click() - cy.get('.forced-gc-warning .fa-times').click() - cy.contains('Garbage Collection Interval').should('not.be.visible') - }) - - it('opens links externally', () => { - cy.spy(runner, 'emit') - cy.contains('GC Interval').click() - cy.get('.forced-gc-warning a').each(($link) => { - cy.wrap($link).click() - cy.wrap(runner.emit).should('be.calledWith', 'external:open', $link.attr('href')) - }) - }) - }) - - describe('when interval is null', () => { - beforeEach(() => { - runner.emit('before:firefox:force:gc', { gcInterval: null }) - }) - - it('displays the warning with (disabled)', () => { - cy.get('.forced-gc-warning').should('be.visible') - cy.contains('GC Interval: disabled') - }) - - it('displays the full message with (disabled)', () => { - cy.contains('GC Interval').click() - cy.contains('Garbage Collection Interval: (disabled)').should('be.visible') - }) - }) - - describe('when interval is 0', () => { - beforeEach(() => { - runner.emit('before:firefox:force:gc', { gcInterval: 0 }) - }) - - it('displays the warning with (disabled)', () => { - cy.get('.forced-gc-warning').should('be.visible') - cy.contains('GC Interval: disabled') - }) - - it('displays the full message with (disabled)', () => { - cy.contains('GC Interval').click() - cy.contains('Garbage Collection Interval: (disabled)').should('be.visible') - }) - }) - - describe('when interval is greater than 0', () => { - beforeEach(() => { - runner.emit('before:firefox:force:gc', { gcInterval: 15 }) - }) - - it('displays the warning with duration and running message', () => { - cy.get('.forced-gc-warning').should('be.visible') - cy.contains('GC Duration: 0.00') - cy.contains('Running GC...') - - // ensure the page is loaded before taking snapshot - cy.contains('test 4').should('be.visible') - cy.percySnapshot() - }) - - it('displays the full message with (enabled)', () => { - cy.contains('GC Duration').click() - cy.contains('Garbage Collection Interval: (enabled)').should('be.visible') - }) - }) -}) diff --git a/packages/reporter/cypress/integration/unit/app_state_spec.ts b/packages/reporter/cypress/integration/unit/app_state_spec.ts index aa88263e8c83..4c43bdd0495c 100644 --- a/packages/reporter/cypress/integration/unit/app_state_spec.ts +++ b/packages/reporter/cypress/integration/unit/app_state_spec.ts @@ -141,28 +141,6 @@ describe('app state', () => { }) }) - context('#setForcingGc', () => { - it('sets forcingGc', () => { - const instance = new AppState() - - instance.setForcingGc(false) - expect(instance.forcingGc).to.be.false - instance.setForcingGc(true) - expect(instance.forcingGc).to.be.true - }) - }) - - context('#setFirefoxGcInterval', () => { - it('sets forcingGc', () => { - const instance = new AppState() - - instance.setFirefoxGcInterval(111) - expect(instance.firefoxGcInterval).to.eq(111) - instance.setFirefoxGcInterval(222) - expect(instance.firefoxGcInterval).to.eq(222) - }) - }) - context('#setStudioActive', () => { it('sets studioActive', () => { const instance = new AppState() diff --git a/packages/reporter/cypress/integration/unit/events_spec.ts b/packages/reporter/cypress/integration/unit/events_spec.ts index 919103691bc3..3c3c8320c021 100644 --- a/packages/reporter/cypress/integration/unit/events_spec.ts +++ b/packages/reporter/cypress/integration/unit/events_spec.ts @@ -25,8 +25,6 @@ type AppStateStub = AppState & { resume: SinonSpy end: SinonSpy temporarilySetAutoScrolling: SinonSpy - setFirefoxGcInterval: SinonSpy - setForcingGc: SinonSpy setStudioActive: SinonSpy stop: SinonSpy } @@ -39,8 +37,6 @@ const appStateStub = () => { resume: sinon.spy(), end: sinon.spy(), temporarilySetAutoScrolling: sinon.spy(), - setFirefoxGcInterval: sinon.spy(), - setForcingGc: sinon.spy(), setStudioActive: sinon.spy(), stop: sinon.spy(), } as AppStateStub @@ -194,28 +190,11 @@ describe('events', () => { expect(appState.temporarilySetAutoScrolling).to.have.been.calledWith(false) }) - it('sets firefoxGcInterval on the app state on reporter:start', () => { - runner.on.withArgs('reporter:start').callArgWith(1, { firefoxGcInterval: 111 }) - expect(appState.setFirefoxGcInterval).to.have.been.calledWith(111) - }) - it('sets studioActive on the app state on reporter:start', () => { runner.on.withArgs('reporter:start').callArgWith(1, { studioActive: true }) expect(appState.setStudioActive).to.have.been.calledWith(true) }) - it('sets forcingGc & firefoxGcInterval on the app state on before:firefox:force:gc', () => { - runner.on.withArgs('before:firefox:force:gc').callArgWith(1, { gcInterval: 222 }) - expect(appState.setFirefoxGcInterval).to.have.been.calledWith(222) - expect(appState.setForcingGc).to.have.been.calledWith(true) - }) - - it('sets forcingGc & firefoxGcInterval on the app state on after:firefox:force:gc', () => { - runner.on.withArgs('after:firefox:force:gc').callArgWith(1, { gcInterval: 333 }) - expect(appState.setFirefoxGcInterval).to.have.been.calledWith(333) - expect(appState.setForcingGc).to.have.been.calledWith(false) - }) - it('sets initial scrollTop on the scroller on reporter:start', () => { runner.on.withArgs('reporter:start').callArgWith(1, { scrollTop: 123 }) expect(runnablesStore.setInitialScrollTop).to.have.been.calledWith(123) diff --git a/packages/reporter/src/lib/app-state.ts b/packages/reporter/src/lib/app-state.ts index c6295cafa5bd..abb86f913e48 100644 --- a/packages/reporter/src/lib/app-state.ts +++ b/packages/reporter/src/lib/app-state.ts @@ -2,8 +2,6 @@ import _ from 'lodash' import { observable } from 'mobx' interface DefaultAppState { - forcingGc: boolean - firefoxGcInterval: number | null | undefined isPaused: boolean isRunning: boolean nextCommandName: string | null | undefined @@ -12,8 +10,6 @@ interface DefaultAppState { } const defaults: DefaultAppState = { - forcingGc: false, - firefoxGcInterval: undefined, isPaused: false, isRunning: false, nextCommandName: null, @@ -23,12 +19,10 @@ const defaults: DefaultAppState = { class AppState { @observable autoScrollingEnabled = true - @observable forcingGc = defaults.forcingGc @observable isPaused = defaults.isPaused @observable isRunning = defaults.isRunning @observable nextCommandName = defaults.nextCommandName @observable pinnedSnapshotId = defaults.pinnedSnapshotId - @observable firefoxGcInterval = defaults.firefoxGcInterval @observable studioActive = defaults.studioActive isStopped = false; @@ -59,14 +53,6 @@ class AppState { this._resetAutoScrolling() } - setForcingGc (forcingGc: boolean) { - this.forcingGc = forcingGc - } - - setFirefoxGcInterval (firefoxGcInterval: DefaultAppState['firefoxGcInterval']) { - this.firefoxGcInterval = firefoxGcInterval - } - temporarilySetAutoScrolling (isEnabled?: boolean | null) { if (isEnabled != null) { this.autoScrollingEnabled = isEnabled diff --git a/packages/reporter/src/lib/base.scss b/packages/reporter/src/lib/base.scss index 16a6457edd35..6f60ed3065e4 100644 --- a/packages/reporter/src/lib/base.scss +++ b/packages/reporter/src/lib/base.scss @@ -1,7 +1,5 @@ body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img,a img{border:none;}address,caption,cite,code,dfn,em,strong,th,var,optgroup{font-style:inherit;font-weight:inherit;}del,ins{text-decoration:none;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:baseline;}sub{vertical-align:baseline;}legend{color:#000;} -@import './forced-gc-warning.scss'; - .reporter { background-color: #F6F6F6; bottom: 0; diff --git a/packages/reporter/src/lib/events.ts b/packages/reporter/src/lib/events.ts index b8bc05d32c25..31c5683386ff 100644 --- a/packages/reporter/src/lib/events.ts +++ b/packages/reporter/src/lib/events.ts @@ -34,7 +34,6 @@ export interface Events { interface StartInfo extends StatsStoreStartInfo { autoScrollingEnabled: boolean - firefoxGcInterval: number scrollTop: number studioActive: boolean } @@ -91,7 +90,6 @@ const events: Events = { runner.on('reporter:start', action('start', (startInfo: StartInfo) => { appState.temporarilySetAutoScrolling(startInfo.autoScrollingEnabled) - appState.setFirefoxGcInterval(startInfo.firefoxGcInterval) runnablesStore.setInitialScrollTop(startInfo.scrollTop) appState.setStudioActive(startInfo.studioActive) if (runnablesStore.hasTests) { @@ -135,16 +133,6 @@ const events: Events = { appState.pinnedSnapshotId = null })) - runner.on('before:firefox:force:gc', action('before:firefox:force:gc', ({ gcInterval }) => { - appState.setForcingGc(true) - appState.setFirefoxGcInterval(gcInterval) - })) - - runner.on('after:firefox:force:gc', action('after:firefox:force:gc', ({ gcInterval }) => { - appState.setForcingGc(false) - appState.setFirefoxGcInterval(gcInterval) - })) - localBus.on('resume', action('resume', () => { appState.resume() statsStore.resume() diff --git a/packages/reporter/src/lib/forced-gc-warning.scss b/packages/reporter/src/lib/forced-gc-warning.scss deleted file mode 100644 index 04f2dc75a5cf..000000000000 --- a/packages/reporter/src/lib/forced-gc-warning.scss +++ /dev/null @@ -1,79 +0,0 @@ -.forced-gc-warning { - background-color: $yellow-lightest; - padding: 1em; - bottom: 0; - left: 0; - width: 100%; - box-shadow: 0 -1px 3px #ccc; - border-right: 1px solid #ddd; - - p { - line-height: 1.5 !important; - } - - a.code-link { - &>code { - color: #1079c3; - background: #f7f7f7; - } - - &:hover, &:focus, &:active { - text-decoration: none; - - &>code { - background-color: #e5f1f6; - text-decoration: none; - } - } - - - } - - code { - background-color: #f9f2f4; - color: #c7254e; - border-radius: 2px; - letter-spacing: 0.5px; - padding: 2px 4px; - } - - >.gc-expando { - display: none; - - &.expanded { - display: block; - padding-bottom: 1em; - - .fa-times { - float: right; - font-size: 16px; - } - } - } - - .gc-status { - color: #888; - border-bottom: 1px dotted; - } - - >.gc-status-bar { - .status-text { - float: right; - } - - >.total-time { - >i { - margin-right: .3em; - } - } - } - - .clickable { - cursor: pointer; - opacity: .7; - - &:hover { - opacity: 1; - } - } -} diff --git a/packages/reporter/src/lib/forced-gc-warning.tsx b/packages/reporter/src/lib/forced-gc-warning.tsx deleted file mode 100644 index 4e8615aa99e4..000000000000 --- a/packages/reporter/src/lib/forced-gc-warning.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { isUndefined, round } from 'lodash' -import { observer } from 'mobx-react' -import React from 'react' -import { AppState } from './app-state' -import { Events } from './events' - -export interface Props { - appState: Pick - events: Events -} - -interface State { - expanded: boolean -} - -@observer -class ForcedGcWarning extends React.Component { - gcStartMs: number | null = null - gcTotalMs: number = 0 - persisted = false - state: State - - constructor (props: Props) { - super(props) - this.state = { - expanded: false, - } - } - - _toggleExpando () { - this.setState({ expanded: !this.state.expanded }) - } - - _updateGcTimer () { - const { forcingGc } = this.props.appState - - if (!forcingGc) { - if (this.gcStartMs) { - const duration = Date.now() - this.gcStartMs - - this.gcStartMs = null - this.gcTotalMs += duration - } - } - - if (forcingGc && !this.gcStartMs) { - this.gcStartMs = Date.now() - } - } - - _renderDisabled () { - return ( -
-
-

- - Garbage Collection Interval: (disabled) - - this._toggleExpando()}> -

-
-

- Cypress can force Firefox to run Garbage Collection (GC) between tests by enabling: firefoxGcInterval -

-

- By default, firefoxGcInterval is only enabled in run mode. -

-

- Running GC prevents Firefox from running out of memory during longer test runs. -

-

- Learn more. -

-
-
-
this._toggleExpando()}> - - - GC Interval: disabled - -
-
- ) - } - - _handleLink = (e: React.MouseEvent) => { - if (!e.currentTarget || !e.currentTarget.href) { - return - } - - e.preventDefault() - this.props.events.emit('external:open', e.currentTarget.href) - } - - _renderForcedGcWarning () { - const { forcingGc } = this.props.appState - - return ( -
-
-
-

- - Garbage Collection Interval: (enabled) - - this._toggleExpando()}> -

-
-
-

- Cypress will force Firefox to run Garbage Collection (GC) between tests based on the value of: firefoxGcInterval -

-

- Running GC prevents Firefox from running out of memory during longer test runs. -

-

- Running GC is an expensive operation that can take up to a few seconds to complete. During this time Firefox may "freeze" and become unresponsive to user input. -

-

- To improve performance, you can try setting firefoxGcInterval to a higher value, which will result in running GC less frequently. -

-

- Learn more. -

-
-
-
this._toggleExpando()}> - - - GC Duration: {round(this.gcTotalMs / 1000, 2).toFixed(2)} - - - {forcingGc && - Running GC... - } -
-
- ) - } - - render () { - const { firefoxGcInterval } = this.props.appState - - if (isUndefined(firefoxGcInterval)) { - // we're either still loading or it is disabled - return null - } - - if (firefoxGcInterval === 0 || firefoxGcInterval == null) { - return this._renderDisabled() - } - - this._updateGcTimer() - - return this._renderForcedGcWarning() - } -} - -export default ForcedGcWarning diff --git a/packages/reporter/src/main.tsx b/packages/reporter/src/main.tsx index dd1765fc6633..8b2f127503ed 100644 --- a/packages/reporter/src/main.tsx +++ b/packages/reporter/src/main.tsx @@ -11,7 +11,6 @@ import EQ from 'css-element-queries/src/ElementQueries' import { RunnablesErrorModel } from './runnables/runnable-error' import appState, { AppState } from './lib/app-state' import events, { Runner, Events } from './lib/events' -import ForcedGcWarning from './lib/forced-gc-warning' import runnablesStore, { RunnablesStore } from './runnables/runnables-store' import scroller, { Scroller } from './lib/scroller' import statsStore, { StatsStore } from './header/stats-store' @@ -84,7 +83,6 @@ class Reporter extends Component { runnablesStore, scroller, error, - events, statsStore, experimentalStudioEnabled, renderReporterHeader = (props: ReporterHeaderProps) =>
, @@ -115,11 +113,6 @@ class Reporter extends Component { spec={spec} /> ))} - - ) } diff --git a/packages/runner-ct/src/app/ReporterContainer.tsx b/packages/runner-ct/src/app/ReporterContainer.tsx index 4fbe03a8aa58..e885047e10da 100644 --- a/packages/runner-ct/src/app/ReporterContainer.tsx +++ b/packages/runner-ct/src/app/ReporterContainer.tsx @@ -39,7 +39,6 @@ export const ReporterContainer = namedObserver('ReporterContainer', specRunId={props.state.specRunId} allSpecs={props.state.multiSpecs} error={errorMessages.reporterError(props.state.scriptError, props.state.spec.relative)} - firefoxGcInterval={props.config.firefoxGcInterval} resetStatsOnSpecChange={props.state.runMode === 'single'} renderReporterHeader={renderReporterHeader} experimentalStudioEnabled={false} diff --git a/packages/runner-shared/src/event-manager.js b/packages/runner-shared/src/event-manager.js index e049646b23d0..201417c77f73 100644 --- a/packages/runner-shared/src/event-manager.js +++ b/packages/runner-shared/src/event-manager.js @@ -21,7 +21,7 @@ ws.on('connect', () => { ws.emit('runner:connected') }) -const driverToReporterEvents = 'paused before:firefox:force:gc after:firefox:force:gc'.split(' ') +const driverToReporterEvents = 'paused'.split(' ') const driverToLocalAndReporterEvents = 'run:start run:end'.split(' ') const driverToSocketEvents = 'backend:request automation:request mocha recorder:frame'.split(' ') const driverTestEvents = 'test:before:run:async test:after:run'.split(' ') @@ -507,7 +507,6 @@ export const eventManager = { }) reporterBus.emit('reporter:start', { - firefoxGcInterval: Cypress.getFirefoxGcInterval(), startTime: Cypress.runner.getStartTime(), numPassed: state.passed, numFailed: state.failed, diff --git a/packages/runner/cypress/integration/retries.mochaEvents.spec.js b/packages/runner/cypress/integration/retries.mochaEvents.spec.js index 89ebf87add60..18b3af745bd5 100644 --- a/packages/runner/cypress/integration/retries.mochaEvents.spec.js +++ b/packages/runner/cypress/integration/retries.mochaEvents.spec.js @@ -1,7 +1,7 @@ const helpers = require('../support/helpers') const { shouldHaveTestResults, getRunState, cleanseRunStateMap } = helpers -const { runIsolatedCypress, snapshotMochaEvents, getAutCypress } = helpers.createCypress({ config: { retries: 2, isTextTerminal: true, firefoxGcInterval: null } }) +const { runIsolatedCypress, snapshotMochaEvents, getAutCypress } = helpers.createCypress({ config: { retries: 2, isTextTerminal: true } }) const { sinon } = Cypress const match = Cypress.sinon.match diff --git a/packages/runner/src/app/app.jsx b/packages/runner/src/app/app.jsx index 0ddfad35da07..09725a7b3e35 100644 --- a/packages/runner/src/app/app.jsx +++ b/packages/runner/src/app/app.jsx @@ -87,7 +87,6 @@ class App extends Component { spec={spec} autoScrollingEnabled={this.props.config.state.autoScrollingEnabled} error={errorMessages.reporterError(this.props.state.scriptError, spec.relative)} - firefoxGcInterval={this.props.config.firefoxGcInterval} experimentalStudioEnabled={this.props.config.experimentalStudio} />} diff --git a/packages/runner/src/app/app.spec.jsx b/packages/runner/src/app/app.spec.jsx index 7a0ad675a728..69dc2030e836 100644 --- a/packages/runner/src/app/app.spec.jsx +++ b/packages/runner/src/app/app.spec.jsx @@ -87,15 +87,6 @@ describe('', () => { expect(component.find(Reporter)).to.have.prop('autoScrollingEnabled', true) }) - it('renders the with the firefoxGcInterval flag', () => { - const props = createProps() - - props.config.firefoxGcInterval = 111 - const component = shallowRender() - - expect(component.find(Reporter)).to.have.prop('firefoxGcInterval', 111) - }) - it('renders the runner container with `left` set as the width of the reporter', () => { const props = createProps() diff --git a/packages/server/lib/config_options.ts b/packages/server/lib/config_options.ts index 9205a4e51a91..9db7d0cb6d28 100644 --- a/packages/server/lib/config_options.ts +++ b/packages/server/lib/config_options.ts @@ -107,13 +107,6 @@ export const options = [ defaultValue: '', validation: v.isString, isFolder: true, - }, { - name: 'firefoxGcInterval', - defaultValue: { - runMode: 1, - openMode: null, - }, - validation: v.isValidFirefoxGcInterval, }, { name: 'fixturesFolder', defaultValue: 'cypress/fixtures', @@ -331,5 +324,9 @@ export const breakingOptions = [ name: 'experimentalShadowDomSupport', errorKey: 'EXPERIMENTAL_SHADOW_DOM_REMOVED', isWarning: true, + }, { + name: 'firefoxGcInterval', + errorKey: 'FIREFOX_GC_INTERVAL_REMOVED', + isWarning: true, }, ] diff --git a/packages/server/lib/errors.js b/packages/server/lib/errors.js index 3972131ca5ed..9de60099b5b4 100644 --- a/packages/server/lib/errors.js +++ b/packages/server/lib/errors.js @@ -940,6 +940,13 @@ const getMsgByType = function (type, arg1 = {}, arg2, arg3) { return stripIndent`\ The \`experimentalRunEvents\` configuration option was removed in Cypress version \`6.7.0\`. It is no longer necessary when listening to run events in the plugins file. + You can safely remove this option from your config.` + case 'FIREFOX_GC_INTERVAL_REMOVED': + return stripIndent`\ + The \`firefoxGcInterval\` configuration option was removed in Cypress version \`8.0.0\`. It was introduced to work around a bug in Firefox 79 and below. + + Since Cypress no longer supports Firefox 85 and below in Cypress 8, this option was removed. + You can safely remove this option from your config.` case 'INCOMPATIBLE_PLUGIN_RETRIES': return stripIndent`\ diff --git a/packages/server/lib/util/validation.js b/packages/server/lib/util/validation.js index 51e11148019d..14830fe80218 100644 --- a/packages/server/lib/util/validation.js +++ b/packages/server/lib/util/validation.js @@ -121,25 +121,6 @@ const isValidRetriesConfig = (key, value) => { return errMsg(key, value, 'a positive number or null or an object with keys "openMode" and "runMode" with values of numbers or nulls') } -const isValidFirefoxGcInterval = (key, value) => { - const isIntervalValue = (val) => { - if (isNumber(val)) { - return val >= 0 - } - - return val == null - } - - if (isIntervalValue(value) - || (_.isEqual(_.keys(value), ['runMode', 'openMode']) - && isIntervalValue(value.runMode) - && isIntervalValue(value.openMode))) { - return true - } - - return errMsg(key, value, 'a positive number or null or an object with "openMode" and "runMode" as keys and positive numbers or nulls as values') -} - const isPlainObject = (key, value) => { if (value == null || _.isPlainObject(value)) { return true @@ -283,8 +264,6 @@ module.exports = { isValidBrowserList, - isValidFirefoxGcInterval, - isValidRetriesConfig, isValidConfig, diff --git a/packages/server/test/support/fixtures/projects/firefox-memory/cypress/integration/spec.js b/packages/server/test/support/fixtures/projects/firefox-memory/cypress/integration/spec.js index b82dce85a701..488076533ef9 100644 --- a/packages/server/test/support/fixtures/projects/firefox-memory/cypress/integration/spec.js +++ b/packages/server/test/support/fixtures/projects/firefox-memory/cypress/integration/spec.js @@ -19,18 +19,13 @@ function parse (obj) { const str = JSON.stringify(obj, [ 'usedJSHeapSize', 'totalJSHeapSize', - 'jsHeapSizeLimit', ]) return JSON.parse(str) } const stats = () => { - const { firefoxGcInterval, firefoxGcInOpenMode } = Cypress.config() - cy.task('console', { - firefoxGcInterval, - firefoxGcInOpenMode, numTests: NUM_TESTS, }) } diff --git a/packages/server/test/unit/config_spec.js b/packages/server/test/unit/config_spec.js index 51d7baa382f9..c2733c2ece5c 100644 --- a/packages/server/test/unit/config_spec.js +++ b/packages/server/test/unit/config_spec.js @@ -853,38 +853,6 @@ describe('lib/config', () => { }) }) - context('firefoxGcInterval', () => { - it('passes if a number', function () { - this.setup({ firefoxGcInterval: 1 }) - - return this.expectValidationPasses() - }) - - it('passes if null', function () { - this.setup({ firefoxGcInterval: null }) - - return this.expectValidationPasses() - }) - - it('passes if correctly shaped object', function () { - this.setup({ firefoxGcInterval: { runMode: 1, openMode: null } }) - - return this.expectValidationPasses() - }) - - it('fails if string', function () { - this.setup({ firefoxGcInterval: 'foo' }) - - return this.expectValidationFails('a positive number or null or an object') - }) - - it('fails if invalid object', function () { - this.setup({ firefoxGcInterval: { foo: 'bar' } }) - - return this.expectValidationFails('a positive number or null or an object') - }) - }) - function pemCertificate () { return { clientCertificates: [ @@ -1433,6 +1401,16 @@ describe('lib/config', () => { expect(warning).to.be.calledWith('EXPERIMENTAL_NETWORK_STUBBING_REMOVED') }) + it('warns if firefoxGcInterval is passed', async function () { + const warning = sinon.spy(errors, 'warning') + + await this.defaults('firefoxGcInterval', true, { + firefoxGcInterval: true, + }) + + expect(warning).to.be.calledWith('FIREFOX_GC_INTERVAL_REMOVED') + }) + describe('.resolved', () => { it('sets reporter and port to cli', () => { const obj = { @@ -1465,7 +1443,6 @@ describe('lib/config', () => { experimentalSourceRewriting: { value: false, from: 'default' }, experimentalStudio: { value: false, from: 'default' }, fileServerFolder: { value: '', from: 'default' }, - firefoxGcInterval: { value: { openMode: null, runMode: 1 }, from: 'default' }, fixturesFolder: { value: 'cypress/fixtures', from: 'default' }, hosts: { value: null, from: 'default' }, ignoreTestFiles: { value: '*.hot-update.js', from: 'default' }, @@ -1571,7 +1548,6 @@ describe('lib/config', () => { }, }, fileServerFolder: { value: '', from: 'default' }, - firefoxGcInterval: { value: { openMode: null, runMode: 1 }, from: 'default' }, fixturesFolder: { value: 'cypress/fixtures', from: 'default' }, hosts: { value: null, from: 'default' }, ignoreTestFiles: { value: '*.hot-update.js', from: 'default' }, diff --git a/yarn.lock b/yarn.lock index 372db79bcfa4..795beeba2b89 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3429,7 +3429,7 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" -"@jest/types@^26.6.2": +"@jest/types@^26.3.0", "@jest/types@^26.6.2": version "26.6.2" resolved "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== @@ -7612,7 +7612,7 @@ dependencies: chalk "*" -"@types/cheerio@*": +"@types/cheerio@*", "@types/cheerio@0.22.21": version "0.22.21" resolved "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.21.tgz#5e37887de309ba11b2e19a6e14cad7874b31a8a3" integrity sha512-aGI3DfswwqgKPiEOTaiHV2ZPC9KEhprpgEbJnv0fZl3SGX0cGgEva1126dGrMC6AJM6v/aihlUgJn9M5DbDZ/Q== @@ -7707,7 +7707,7 @@ dependencies: "@types/enzyme" "*" -"@types/enzyme@*": +"@types/enzyme@*", "@types/enzyme@3.10.5": version "3.10.5" resolved "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.10.5.tgz#fe7eeba3550369eed20e7fb565bfb74eec44f1f0" integrity sha512-R+phe509UuUYy9Tk0YlSbipRpfVtIzb/9BHn5pTEtjJTF5LXvUjrIQcZvNyANNEyFrd2YGs196PniNT1fgvOQA== @@ -7917,11 +7917,6 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= - "@types/keyv@*": version "3.1.1" resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7" @@ -9912,7 +9907,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.0.0, ansi-regex@^4.1.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== @@ -14146,11 +14141,6 @@ 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" @@ -31050,25 +31040,15 @@ pretty-error@^2.0.2, pretty-error@^2.1.1: lodash "^4.17.20" renderkid "^2.0.4" -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" "^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== +pretty-format@26.4.0, pretty-format@^24.9.0, pretty-format@^26.6.2: + version "26.4.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.0.tgz#c08073f531429e9e5024049446f42ecc9f933a3b" + integrity sha512-mEEwwpCseqrUtuMbrJG4b824877pM5xald3AkilJ47Po2YLr97/siejYQHqj2oDQBeJNbu+Q0qUuekJ8F0NAPg== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^26.3.0" ansi-regex "^5.0.0" ansi-styles "^4.0.0" - react-is "^17.0.1" + react-is "^16.12.0" pretty-hrtime@^1.0.0, pretty-hrtime@^1.0.3: version "1.0.3" @@ -32099,12 +32079,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.4, 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.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.1, react-is@^17.0.2: +"react-is@^16.8.0 || ^17.0.0", 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== @@ -35075,25 +35055,7 @@ socket.io-client@4.0.1: parseuri "0.0.6" 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: +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: version "4.0.4" resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== @@ -38991,9 +38953,9 @@ 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.11: +vue-template-compiler@2.6.12, vue-template-compiler@^2.6.11: version "2.6.12" - resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz#947ed7196744c8a5285ebe1233fe960437fcc57e" + resolved "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz#947ed7196744c8a5285ebe1233fe960437fcc57e" integrity sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg== dependencies: de-indent "^1.0.2"