From 690dffd55e50a31ca0c2616c478f5d3f2b0f69a2 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Wed, 22 May 2019 16:45:42 -0400 Subject: [PATCH 01/73] add 4.0 migration guide --- source/_data/sidebar.yml | 1 + source/guides/references/error-messages.md | 4 + source/guides/references/migration-guide.md | 129 ++++++++++++++++++++ themes/cypress/languages/en.yml | 1 + 4 files changed, 135 insertions(+) create mode 100644 source/guides/references/migration-guide.md diff --git a/source/_data/sidebar.yml b/source/_data/sidebar.yml index f97a6bd795..ef6fa49b10 100644 --- a/source/_data/sidebar.yml +++ b/source/_data/sidebar.yml @@ -54,6 +54,7 @@ guides: trade-offs: trade-offs.html # contributing: contributing.html changelog: changelog.html + migration-guide: migration-guide.html roadmap: roadmap.html api: diff --git a/source/guides/references/error-messages.md b/source/guides/references/error-messages.md index 1cecfd2dc5..1baa7d3811 100644 --- a/source/guides/references/error-messages.md +++ b/source/guides/references/error-messages.md @@ -345,6 +345,10 @@ While this works in practice, it's often indicative of an anti-pattern. You almo `cy` commands themselves are already promise like, and you can likely avoid the use of the separate Promise. +## {% fa fa-exclamation-triangle red %} Cypress detected that you returned a promise in a test, but also invoked a done callback. + +The version of mocha was upgraded with Cypress 4.0. Mocha 3+ no longer allows returning a promise and invoking a done callback. Read more about it in the {% url "4.0 migration guide" migration-guide#Make-changes-related-to-Mocha-upgrade %}. + ## {% fa fa-exclamation-triangle red %} Passing `cy.route({stub: false})` or `cy.server({stub: false})` is now deprecated. You can safely remove: `{stub: false}`. diff --git a/source/guides/references/migration-guide.md b/source/guides/references/migration-guide.md new file mode 100644 index 0000000000..5dd49df362 --- /dev/null +++ b/source/guides/references/migration-guide.md @@ -0,0 +1,129 @@ +--- +title: Migration Guide +--- + +# Migrating to Cypress 4.0 + +Changes in Cypress 4.0 mainly relate to upgrading Cypress's own dependencies, which themselves have breaking changes. This guide details the changes and how to change your code to migrate to Cypress 4.0. + +## Cypress no longer supports Node.js 6 or earlier + +Read more about the reasoning in [this issue](https://github.com/cypress-io/cypress/issues/4200). + +## Changes related to mocha upgrade + +Mocha has been upgraded to Mocha 6. + +Starting with [mocha 3.0.0](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md#300--2016-07-31), invoking a `done` callback *and* returning a promise in a test results in an error. + +This error originates from mocha and is discussed at length [here](https://github.com/mochajs/mocha/pull/1320) and [here](https://github.com/mochajs/mocha/issues/2407). + +The reason is that using two different ways to signal that a test is finished is usually a mistake, and there is always a way to only use one. There is a [proposal to handle this situation without erroring](https://github.com/mochajs/mocha/issues/2509) that may be released in a future version of mocha. + +In the meantime, you can fix the error by choosing one way or the other to signal the end of your test's execution. + +Given the following test: + +```javascript +it('uses invokes done and returns promise', function (done) { + return codeUnderTest.doSomethingThatReturnsPromise().then((result) => { + // assertions here + done() + }) +}) +``` + +You don't need the `done` callback. Just return the promise instead: + +```javascript +it('uses invokes done and returns promise', function () { + return codeUnderTest.doSomethingThatReturnsPromise().then((result) => { + // assertions here + }) +}) +``` + +Sometimes it might make more sense to use the `done` callback and not return a promise: + +```javascript +it('uses invokes done and returns promise', function (done) { + eventEmitter.on('change', () => { + // assertions + done() + }) + return eventEmitter.doSomethingThatEmitsChange() +}) +``` + +In this case, you don't need to return the promise: + +```javascript +it('uses invokes done and returns promise', function (done) { + eventEmitter.on('change', () => { + // assertions + done() + }) + eventEmitter.doSomethingThatEmitsChange() +}) +``` + +Test functions using `async/await` automatically return a promise, so they need to be refactored to not use a `done` callback. + +```javascript +// Will cause overspecified error +it('uses async/await', async function (done) { + const eventEmitter = await getEventEmitter() + eventEmitter.on('change', () => done()) + eventEmitter.doSomethingThatEmitsChange() +}) + // Update to this +it('uses async/await', async function () { + const eventEmitter = await getEventEmitter() + return new Promise((resolve) => { + eventEmitter.on('change', () => resolve()) + eventEmitter.doSomethingThatEmitsChange() + }) +}) +``` + + ## Changes related to Chai upgrade + + Chai has been upgraded to Chai 4, which includes a number of breaking changes and new features outlined in [Chai's migration guide](https://github.com/chaijs/chai/issues/781). Some changes you might notice include: + +- The assertions: `within`, `above`, `least`, `below`, `most`, `increase`, `decrease` will throw an error if the assertion's target or arguments are not numbers. + +```javascript +// These will throw errors: +expect(null).to.be.within(0, 1) +expect(null).to.be.above(10) + // This will not: +expect('string').to.have.a.length.of.at.least(3) +``` + +- The `.empty` assertion will now throw when it is passed non-string primitives and functions: + +```javascript +// These will throw TypeErrors: +expect(Symbol()).to.be.empty +expect(function() {}).to.be.empty +``` + +- An error will throw when a non-existent property is read. If there are typos in property assertions, they will now appear as failures. + +```javascript +// Would pass in Chai 3 but will fail in 4 +expect(true).to.be.ture +``` + +## Changes related to Sinon upgrade + +Sinon has been upgraded to Sinon 7 with some [breaking changes](https://sinonjs.org/releases/v7.1.1/#migration-guides), including: + +- An error will throw when trying to stub a non-existent property. + +```javascript +// Would pass in Sinon 3 but will fail in 4+ +cy.stub(obj, 'nonExistingProperty') +``` + + - `cy.spy.reset()` was replaced by `cy.spy.resetHistory()`. diff --git a/themes/cypress/languages/en.yml b/themes/cypress/languages/en.yml index 6e42f7388e..d326f41167 100644 --- a/themes/cypress/languages/en.yml +++ b/themes/cypress/languages/en.yml @@ -66,6 +66,7 @@ sidebar: trade-offs: Trade-offs contributing: Contributing changelog: Changelog + migration-guide: Migration Guide roadmap: Roadmap cypress-api-design: API Design all-videos: Videos From 3550c0fc3642c16ff9a8e946f083ff34a7804070 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Thu, 23 May 2019 09:34:55 -0400 Subject: [PATCH 02/73] fix linting issues --- source/guides/references/migration-guide.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/source/guides/references/migration-guide.md b/source/guides/references/migration-guide.md index 5dd49df362..15711d9dff 100644 --- a/source/guides/references/migration-guide.md +++ b/source/guides/references/migration-guide.md @@ -51,7 +51,8 @@ it('uses invokes done and returns promise', function (done) { // assertions done() }) - return eventEmitter.doSomethingThatEmitsChange() + + return eventEmitter.doSomethingThatEmitsChange() }) ``` @@ -63,7 +64,7 @@ it('uses invokes done and returns promise', function (done) { // assertions done() }) - eventEmitter.doSomethingThatEmitsChange() + eventEmitter.doSomethingThatEmitsChange() }) ``` @@ -96,7 +97,7 @@ it('uses async/await', async function () { // These will throw errors: expect(null).to.be.within(0, 1) expect(null).to.be.above(10) - // This will not: +// This will not: expect('string').to.have.a.length.of.at.least(3) ``` @@ -126,4 +127,4 @@ Sinon has been upgraded to Sinon 7 with some [breaking changes](https://sinonjs. cy.stub(obj, 'nonExistingProperty') ``` - - `cy.spy.reset()` was replaced by `cy.spy.resetHistory()`. +- `cy.spy.reset()` was replaced by `cy.spy.resetHistory()`. From b8de00b9138c829e75df5682e9044bdee2044832 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Thu, 23 May 2019 09:58:47 -0400 Subject: [PATCH 03/73] =?UTF-8?q?add=20migration=20guide=20to=20all=20lang?= =?UTF-8?q?uage=E2=80=99s=20sidebars?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/ja/_data/sidebar.yml | 1 + source/zh-cn/_data/sidebar.yml | 1 + themes/cypress/languages/ja.yml | 1 + themes/cypress/languages/zh-cn.yml | 1 + 4 files changed, 4 insertions(+) diff --git a/source/ja/_data/sidebar.yml b/source/ja/_data/sidebar.yml index f97a6bd795..ef6fa49b10 100644 --- a/source/ja/_data/sidebar.yml +++ b/source/ja/_data/sidebar.yml @@ -54,6 +54,7 @@ guides: trade-offs: trade-offs.html # contributing: contributing.html changelog: changelog.html + migration-guide: migration-guide.html roadmap: roadmap.html api: diff --git a/source/zh-cn/_data/sidebar.yml b/source/zh-cn/_data/sidebar.yml index f97a6bd795..ef6fa49b10 100644 --- a/source/zh-cn/_data/sidebar.yml +++ b/source/zh-cn/_data/sidebar.yml @@ -54,6 +54,7 @@ guides: trade-offs: trade-offs.html # contributing: contributing.html changelog: changelog.html + migration-guide: migration-guide.html roadmap: roadmap.html api: diff --git a/themes/cypress/languages/ja.yml b/themes/cypress/languages/ja.yml index adf15c690d..6788d533a4 100644 --- a/themes/cypress/languages/ja.yml +++ b/themes/cypress/languages/ja.yml @@ -66,6 +66,7 @@ sidebar: trade-offs: トレードオフ contributing: 寄与する changelog: 変更履歴 + migration-guide: Migration Guide roadmap: ロードマップ cypress-api-design: APIデザイン all-videos: ビデオ diff --git a/themes/cypress/languages/zh-cn.yml b/themes/cypress/languages/zh-cn.yml index f831ea83f4..00a328f10f 100644 --- a/themes/cypress/languages/zh-cn.yml +++ b/themes/cypress/languages/zh-cn.yml @@ -68,6 +68,7 @@ sidebar: trade-offs: 一些取舍 contributing: 贡献 changelog: 更新日志 + migration-guide: Migration Guide roadmap: 路线图 cypress-api-design: API Design all-videos: Videos From 9c2470fb52689618e1f16bf2013231e658bde3e6 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Fri, 24 May 2019 10:17:40 -0400 Subject: [PATCH 04/73] add dropping cjsx support to 4.0 migration guide --- source/guides/references/migration-guide.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/source/guides/references/migration-guide.md b/source/guides/references/migration-guide.md index 15711d9dff..a4b7aafd2c 100644 --- a/source/guides/references/migration-guide.md +++ b/source/guides/references/migration-guide.md @@ -128,3 +128,23 @@ cy.stub(obj, 'nonExistingProperty') ``` - `cy.spy.reset()` was replaced by `cy.spy.resetHistory()`. + +## Cypress no longer supports CJSX by default + +Cypress no longer supports CJSX (CoffeeScript + JSX), because the library used to transpile it is outdated and unmaintained. + +If you need CJSX support, you can use a pre-2.x version of the browserify preprocessor. + +```shell +npm install @cypress/browserify-preprocessor@1.1.2 +``` + +```javascript +// In cypress/plugins/index.js + +const browserify = require('@cypress/browserify-preprocessor') + +module.exports = (on) => { + on('file:preprocessor', browserify()) +} +``` From dfc426ac0eb93456f2d7baba4d53ef71f30b0bd3 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Thu, 31 Oct 2019 10:24:58 -0400 Subject: [PATCH 05/73] update reference to new mocha version --- source/guides/references/migration-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/guides/references/migration-guide.md b/source/guides/references/migration-guide.md index a4b7aafd2c..54d1b4eb70 100644 --- a/source/guides/references/migration-guide.md +++ b/source/guides/references/migration-guide.md @@ -12,7 +12,7 @@ Read more about the reasoning in [this issue](https://github.com/cypress-io/cypr ## Changes related to mocha upgrade -Mocha has been upgraded to Mocha 6. +Mocha has been upgraded to Mocha 7. Starting with [mocha 3.0.0](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md#300--2016-07-31), invoking a `done` callback *and* returning a promise in a test results in an error. From d9b2496f7f88d38dead2fab5e9f40da843db4010 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Thu, 31 Oct 2019 10:25:25 -0400 Subject: [PATCH 06/73] improve spy/stub reset change description and add example --- source/guides/references/migration-guide.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/source/guides/references/migration-guide.md b/source/guides/references/migration-guide.md index 54d1b4eb70..c8f8285cdd 100644 --- a/source/guides/references/migration-guide.md +++ b/source/guides/references/migration-guide.md @@ -148,3 +148,18 @@ module.exports = (on) => { on('file:preprocessor', browserify()) } ``` + +- For spies and stubs, the `reset()` method was replaced by `resetHistory()`. + +```javascript +const spy = cy.spy() +const stub = cy.stub() + +// Old, no longer works +spy.reset() +stub.reset() + +// Update to this +spy.resetHistory() +stub.resetHistory() +``` From 283c55d8aed170bf015b3bfb5d97f22fb943bc10 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Thu, 31 Oct 2019 10:27:11 -0400 Subject: [PATCH 07/73] fix location of spy/stub item --- source/guides/references/migration-guide.md | 30 ++++++++++----------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/source/guides/references/migration-guide.md b/source/guides/references/migration-guide.md index c8f8285cdd..7cb2cda8a2 100644 --- a/source/guides/references/migration-guide.md +++ b/source/guides/references/migration-guide.md @@ -127,7 +127,20 @@ Sinon has been upgraded to Sinon 7 with some [breaking changes](https://sinonjs. cy.stub(obj, 'nonExistingProperty') ``` -- `cy.spy.reset()` was replaced by `cy.spy.resetHistory()`. +- For spies and stubs, the `reset()` method was replaced by `resetHistory()`. + +```javascript +const spy = cy.spy() +const stub = cy.stub() + +// Old, no longer works +spy.reset() +stub.reset() + +// Update to this +spy.resetHistory() +stub.resetHistory() +``` ## Cypress no longer supports CJSX by default @@ -148,18 +161,3 @@ module.exports = (on) => { on('file:preprocessor', browserify()) } ``` - -- For spies and stubs, the `reset()` method was replaced by `resetHistory()`. - -```javascript -const spy = cy.spy() -const stub = cy.stub() - -// Old, no longer works -spy.reset() -stub.reset() - -// Update to this -spy.resetHistory() -stub.resetHistory() -``` From fede75cb4afe50aebfa25d09a67f45de57dc4662 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Thu, 31 Oct 2019 10:39:06 -0400 Subject: [PATCH 08/73] fix lint errors --- source/guides/references/error-messages.md | 2 +- source/guides/references/migration-guide.md | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/source/guides/references/error-messages.md b/source/guides/references/error-messages.md index 5d7c46f629..d435f764ff 100644 --- a/source/guides/references/error-messages.md +++ b/source/guides/references/error-messages.md @@ -347,7 +347,7 @@ While this works in practice, it's often indicative of an anti-pattern. You almo ## {% fa fa-exclamation-triangle red %} Cypress detected that you returned a promise in a test, but also invoked a done callback. -The version of mocha was upgraded with Cypress 4.0. Mocha 3+ no longer allows returning a promise and invoking a done callback. Read more about it in the {% url "4.0 migration guide" migration-guide#Make-changes-related-to-Mocha-upgrade %}. +The version of Mocha was upgraded with Cypress 4.0. Mocha 3+ no longer allows returning a promise and invoking a done callback. Read more about it in the {% url "4.0 migration guide" migration-guide#Make-changes-related-to-Mocha-upgrade %}. ## {% fa fa-exclamation-triangle red %} Passing `cy.route({stub: false})` or `cy.server({stub: false})` is now deprecated. diff --git a/source/guides/references/migration-guide.md b/source/guides/references/migration-guide.md index 7cb2cda8a2..0dd05c7640 100644 --- a/source/guides/references/migration-guide.md +++ b/source/guides/references/migration-guide.md @@ -6,19 +6,19 @@ title: Migration Guide Changes in Cypress 4.0 mainly relate to upgrading Cypress's own dependencies, which themselves have breaking changes. This guide details the changes and how to change your code to migrate to Cypress 4.0. -## Cypress no longer supports Node.js 6 or earlier +## Cypress no longer supports Node 6 or earlier Read more about the reasoning in [this issue](https://github.com/cypress-io/cypress/issues/4200). -## Changes related to mocha upgrade +## Changes related to Mocha upgrade Mocha has been upgraded to Mocha 7. -Starting with [mocha 3.0.0](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md#300--2016-07-31), invoking a `done` callback *and* returning a promise in a test results in an error. +Starting with [Mocha 3.0.0](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md#300--2016-07-31), invoking a `done` callback *and* returning a promise in a test results in an error. This error originates from mocha and is discussed at length [here](https://github.com/mochajs/mocha/pull/1320) and [here](https://github.com/mochajs/mocha/issues/2407). -The reason is that using two different ways to signal that a test is finished is usually a mistake, and there is always a way to only use one. There is a [proposal to handle this situation without erroring](https://github.com/mochajs/mocha/issues/2509) that may be released in a future version of mocha. +The reason is that using two different ways to signal that a test is finished is usually a mistake, and there is always a way to only use one. There is a [proposal to handle this situation without erroring](https://github.com/mochajs/mocha/issues/2509) that may be released in a future version of Mocha. In the meantime, you can fix the error by choosing one way or the other to signal the end of your test's execution. @@ -116,9 +116,9 @@ expect(function() {}).to.be.empty expect(true).to.be.ture ``` -## Changes related to Sinon upgrade +## Changes related to Sinon.JS upgrade -Sinon has been upgraded to Sinon 7 with some [breaking changes](https://sinonjs.org/releases/v7.1.1/#migration-guides), including: +Sinon.JS has been upgraded to Sinon.JS 7 with some [breaking changes](https://sinonjs.org/releases/v7.1.1/#migration-guides), including: - An error will throw when trying to stub a non-existent property. @@ -146,7 +146,7 @@ stub.resetHistory() Cypress no longer supports CJSX (CoffeeScript + JSX), because the library used to transpile it is outdated and unmaintained. -If you need CJSX support, you can use a pre-2.x version of the browserify preprocessor. +If you need CJSX support, you can use a pre-2.x version of the Browserify preprocessor. ```shell npm install @cypress/browserify-preprocessor@1.1.2 From 3cbeecd09c1cac3070a694151de2ca404a971304 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Thu, 31 Oct 2019 10:44:43 -0400 Subject: [PATCH 09/73] fix one more lint error --- source/guides/references/migration-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/guides/references/migration-guide.md b/source/guides/references/migration-guide.md index 0dd05c7640..87811632d2 100644 --- a/source/guides/references/migration-guide.md +++ b/source/guides/references/migration-guide.md @@ -16,7 +16,7 @@ Mocha has been upgraded to Mocha 7. Starting with [Mocha 3.0.0](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md#300--2016-07-31), invoking a `done` callback *and* returning a promise in a test results in an error. -This error originates from mocha and is discussed at length [here](https://github.com/mochajs/mocha/pull/1320) and [here](https://github.com/mochajs/mocha/issues/2407). +This error originates from Mocha and is discussed at length [here](https://github.com/mochajs/mocha/pull/1320) and [here](https://github.com/mochajs/mocha/issues/2407). The reason is that using two different ways to signal that a test is finished is usually a mistake, and there is always a way to only use one. There is a [proposal to handle this situation without erroring](https://github.com/mochajs/mocha/issues/2509) that may be released in a future version of Mocha. From a8426d255860aabe0b4e2644c2aea73eee1f2814 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Thu, 31 Oct 2019 13:05:21 -0400 Subject: [PATCH 10/73] add migration-guide to pt-br.yml --- themes/cypress/languages/pt-br.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/themes/cypress/languages/pt-br.yml b/themes/cypress/languages/pt-br.yml index aabcef98ce..13a67c659b 100644 --- a/themes/cypress/languages/pt-br.yml +++ b/themes/cypress/languages/pt-br.yml @@ -61,6 +61,7 @@ sidebar: best-practices: Boas Práticas trade-offs: Trade-offs changelog: Changelog + migration-guide: Migration Guide roadmap: Roteiro tooling: Ferramentas intelligent-code-completion: Conclusão Inteligente de Código From 784a08905b7683a5c0f6e623b5808224977c6feb Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Thu, 31 Oct 2019 13:05:37 -0400 Subject: [PATCH 11/73] fix link to migration guide mocha section --- source/guides/references/error-messages.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/guides/references/error-messages.md b/source/guides/references/error-messages.md index d435f764ff..cd0ae434b7 100644 --- a/source/guides/references/error-messages.md +++ b/source/guides/references/error-messages.md @@ -347,7 +347,7 @@ While this works in practice, it's often indicative of an anti-pattern. You almo ## {% fa fa-exclamation-triangle red %} Cypress detected that you returned a promise in a test, but also invoked a done callback. -The version of Mocha was upgraded with Cypress 4.0. Mocha 3+ no longer allows returning a promise and invoking a done callback. Read more about it in the {% url "4.0 migration guide" migration-guide#Make-changes-related-to-Mocha-upgrade %}. +The version of Mocha was upgraded with Cypress 4.0. Mocha 3+ no longer allows returning a promise and invoking a done callback. Read more about it in the {% url "4.0 migration guide" migration-guide#Changes-related-to-Mocha-upgrade %}. ## {% fa fa-exclamation-triangle red %} Passing `cy.route({stub: false})` or `cy.server({stub: false})` is now deprecated. From 050ac6bc4cfc011c15e215393e1a0d3e3b9eb706 Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Thu, 7 Nov 2019 10:41:20 -0500 Subject: [PATCH 12/73] Remove our own reasoning - Node reaching end of life is enough --- source/guides/references/migration-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/guides/references/migration-guide.md b/source/guides/references/migration-guide.md index 87811632d2..ac90a19a69 100644 --- a/source/guides/references/migration-guide.md +++ b/source/guides/references/migration-guide.md @@ -8,7 +8,7 @@ Changes in Cypress 4.0 mainly relate to upgrading Cypress's own dependencies, wh ## Cypress no longer supports Node 6 or earlier -Read more about the reasoning in [this issue](https://github.com/cypress-io/cypress/issues/4200). +Node 4 reached its end of life on April 30, 2018 and Node 6 reached its end of life on April 30, 2019. {% url "See Node's release schedule" https://github.com/nodejs/Release %}. These Node versions will no longer be supported. ## Changes related to Mocha upgrade From 63fa95aeee6b6bd25d1c13c4c963d101573c4ec9 Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Fri, 8 Nov 2019 10:57:26 -0500 Subject: [PATCH 13/73] State we're supporting 8+ more explicitly going forward. --- source/guides/references/migration-guide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/guides/references/migration-guide.md b/source/guides/references/migration-guide.md index ac90a19a69..ab332c7ac4 100644 --- a/source/guides/references/migration-guide.md +++ b/source/guides/references/migration-guide.md @@ -6,9 +6,9 @@ title: Migration Guide Changes in Cypress 4.0 mainly relate to upgrading Cypress's own dependencies, which themselves have breaking changes. This guide details the changes and how to change your code to migrate to Cypress 4.0. -## Cypress no longer supports Node 6 or earlier +## Cypress supports Node 8+ -Node 4 reached its end of life on April 30, 2018 and Node 6 reached its end of life on April 30, 2019. {% url "See Node's release schedule" https://github.com/nodejs/Release %}. These Node versions will no longer be supported. +Node 4 reached its end of life on April 30, 2018 and Node 6 reached its end of life on April 30, 2019. {% url "See Node's release schedule" https://github.com/nodejs/Release %}. These Node versions will no longer be supported. The minimum Node version supported by Cypress is Node 8. ## Changes related to Mocha upgrade From f932eb827f96dcde6070d5574e45f7945bdd7ec8 Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Mon, 25 Nov 2019 15:23:22 +0630 Subject: [PATCH 14/73] Add base 4.0.0 changelog --- source/_changelogs/4.0.0.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 source/_changelogs/4.0.0.md diff --git a/source/_changelogs/4.0.0.md b/source/_changelogs/4.0.0.md new file mode 100644 index 0000000000..7362cebf54 --- /dev/null +++ b/source/_changelogs/4.0.0.md @@ -0,0 +1,13 @@ +# 4.0.0 + +*Released X/X/2019* + +**Breaking Changes:** + +**Features:** + +**Bugfixes:** + +**Misc:** + +**Dependency Updates** From 0a5a64a12cb1944c286204de207c45282a505ccb Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Mon, 25 Nov 2019 15:56:24 +0630 Subject: [PATCH 15/73] Add better formatting to Migration Guide - before/after sections + smaller headings --- source/guides/references/error-messages.md | 2 +- source/guides/references/migration-guide.md | 89 +++++++++++++------- themes/cypress/source/css/_partial/page.scss | 5 ++ 3 files changed, 65 insertions(+), 31 deletions(-) diff --git a/source/guides/references/error-messages.md b/source/guides/references/error-messages.md index cd0ae434b7..8b0834027a 100644 --- a/source/guides/references/error-messages.md +++ b/source/guides/references/error-messages.md @@ -347,7 +347,7 @@ While this works in practice, it's often indicative of an anti-pattern. You almo ## {% fa fa-exclamation-triangle red %} Cypress detected that you returned a promise in a test, but also invoked a done callback. -The version of Mocha was upgraded with Cypress 4.0. Mocha 3+ no longer allows returning a promise and invoking a done callback. Read more about it in the {% url "4.0 migration guide" migration-guide#Changes-related-to-Mocha-upgrade %}. +The version of Mocha was upgraded with Cypress 4.0. Mocha 3+ no longer allows returning a promise and invoking a done callback. Read more about it in the {% url "4.0 migration guide" migration-guide#Mocha-upgrade-changes %}. ## {% fa fa-exclamation-triangle red %} Passing `cy.route({stub: false})` or `cy.server({stub: false})` is now deprecated. diff --git a/source/guides/references/migration-guide.md b/source/guides/references/migration-guide.md index ab332c7ac4..fca5b2f435 100644 --- a/source/guides/references/migration-guide.md +++ b/source/guides/references/migration-guide.md @@ -6,11 +6,11 @@ title: Migration Guide Changes in Cypress 4.0 mainly relate to upgrading Cypress's own dependencies, which themselves have breaking changes. This guide details the changes and how to change your code to migrate to Cypress 4.0. -## Cypress supports Node 8+ +## Node 8+ support Node 4 reached its end of life on April 30, 2018 and Node 6 reached its end of life on April 30, 2019. {% url "See Node's release schedule" https://github.com/nodejs/Release %}. These Node versions will no longer be supported. The minimum Node version supported by Cypress is Node 8. -## Changes related to Mocha upgrade +## Mocha upgrade changes Mocha has been upgraded to Mocha 7. @@ -18,11 +18,13 @@ Starting with [Mocha 3.0.0](https://github.com/mochajs/mocha/blob/master/CHANGEL This error originates from Mocha and is discussed at length [here](https://github.com/mochajs/mocha/pull/1320) and [here](https://github.com/mochajs/mocha/issues/2407). -The reason is that using two different ways to signal that a test is finished is usually a mistake, and there is always a way to only use one. There is a [proposal to handle this situation without erroring](https://github.com/mochajs/mocha/issues/2509) that may be released in a future version of Mocha. +The reason is that using two different ways to signal that a test is finished is usually a mistake and there is always a way to only use one. There is a [proposal to handle this situation without erroring](https://github.com/mochajs/mocha/issues/2509) that may be released in a future version of Mocha. -In the meantime, you can fix the error by choosing one way or the other to signal the end of your test's execution. +In the meantime, you can fix the error by choosing a single way to signal the end of your test's execution. -Given the following test: +### Example #1 + +{% badge danger Before %} This test has a done callback and a promise ```javascript it('uses invokes done and returns promise', function (done) { @@ -33,7 +35,7 @@ it('uses invokes done and returns promise', function (done) { }) ``` -You don't need the `done` callback. Just return the promise instead: +{% badge success After %} You can remove the `done` callback and return the promise instead: ```javascript it('uses invokes done and returns promise', function () { @@ -43,7 +45,9 @@ it('uses invokes done and returns promise', function () { }) ``` -Sometimes it might make more sense to use the `done` callback and not return a promise: +### Example #2 + +{% badge danger Before %} Sometimes it might make more sense to use the `done` callback and not return a promise: ```javascript it('uses invokes done and returns promise', function (done) { @@ -56,7 +60,7 @@ it('uses invokes done and returns promise', function (done) { }) ``` -In this case, you don't need to return the promise: +{% badge success After %} In this case, you don't need to return the promise: ```javascript it('uses invokes done and returns promise', function (done) { @@ -68,16 +72,23 @@ it('uses invokes done and returns promise', function (done) { }) ``` +### Example #3 + Test functions using `async/await` automatically return a promise, so they need to be refactored to not use a `done` callback. +{% badge danger Before %} This will cause an overspecified error. + ```javascript -// Will cause overspecified error it('uses async/await', async function (done) { const eventEmitter = await getEventEmitter() eventEmitter.on('change', () => done()) eventEmitter.doSomethingThatEmitsChange() }) - // Update to this +``` + +{% badge danger Before %} Update to the test code below. + +```javascript it('uses async/await', async function () { const eventEmitter = await getEventEmitter() return new Promise((resolve) => { @@ -87,64 +98,83 @@ it('uses async/await', async function () { }) ``` - ## Changes related to Chai upgrade +## Chai upgrade changes + +Chai has been upgraded to Chai 4, which includes a number of breaking changes and new features outlined in [Chai's migration guide](https://github.com/chaijs/chai/issues/781). Some changes you might notice include: - Chai has been upgraded to Chai 4, which includes a number of breaking changes and new features outlined in [Chai's migration guide](https://github.com/chaijs/chai/issues/781). Some changes you might notice include: +### Example #1 -- The assertions: `within`, `above`, `least`, `below`, `most`, `increase`, `decrease` will throw an error if the assertion's target or arguments are not numbers. +Some assertions will now throw an error if the assertion's target or arguments are not numbers, including `within`, `above`, `least`, `below`, `most`, `increase` and `decrease`. ```javascript -// These will throw errors: +// These will now throw errors: expect(null).to.be.within(0, 1) expect(null).to.be.above(10) -// This will not: +// This will not throw errors: expect('string').to.have.a.length.of.at.least(3) ``` -- The `.empty` assertion will now throw when it is passed non-string primitives and functions: +### Example #2 + +The `.empty` assertion will now throw when it is passed non-string primitives and functions. ```javascript -// These will throw TypeErrors: +// These will now throw TypeErrors expect(Symbol()).to.be.empty expect(function() {}).to.be.empty ``` -- An error will throw when a non-existent property is read. If there are typos in property assertions, they will now appear as failures. +### Example #3 + +An error will throw when a non-existent property is read. If there are typos in property assertions, they will now appear as failures. ```javascript -// Would pass in Chai 3 but will fail in 4 +// Would pass in Cypress 3 but will fail in 4 expect(true).to.be.ture ``` -## Changes related to Sinon.JS upgrade +## Sinon.JS upgrade changes -Sinon.JS has been upgraded to Sinon.JS 7 with some [breaking changes](https://sinonjs.org/releases/v7.1.1/#migration-guides), including: +Sinon.JS has been upgraded to Sinon.JS 7 with some [breaking changes](https://sinonjs.org/releases/v7.1.1/#migration-guides). -- An error will throw when trying to stub a non-existent property. +### Example #1 + +An error will throw when trying to stub a non-existent property. ```javascript -// Would pass in Sinon 3 but will fail in 4+ +// Would pass in Cypress 3 but will fail in 4 cy.stub(obj, 'nonExistingProperty') ``` -- For spies and stubs, the `reset()` method was replaced by `resetHistory()`. +### Example #2 + +For spies and stubs, the `reset()` method was replaced by `resetHistory()`. + +{% badge danger Before %} Spies and stubs using `reset()`. ```javascript const spy = cy.spy() const stub = cy.stub() -// Old, no longer works spy.reset() stub.reset() +``` + +{% badge success After %} Update spies and stubs should now use `resetHistory()`. + +```javascript +const spy = cy.spy() +const stub = cy.stub() -// Update to this spy.resetHistory() stub.resetHistory() ``` -## Cypress no longer supports CJSX by default +## CJSX is no longer supported -Cypress no longer supports CJSX (CoffeeScript + JSX), because the library used to transpile it is outdated and unmaintained. +Cypress no longer supports CJSX (CoffeeScript + JSX), because the library used to transpile it is no longer maintained. + +### Example #1 If you need CJSX support, you can use a pre-2.x version of the Browserify preprocessor. @@ -153,8 +183,7 @@ npm install @cypress/browserify-preprocessor@1.1.2 ``` ```javascript -// In cypress/plugins/index.js - +// cypress/plugins/index.js const browserify = require('@cypress/browserify-preprocessor') module.exports = (on) => { diff --git a/themes/cypress/source/css/_partial/page.scss b/themes/cypress/source/css/_partial/page.scss index 522d4c594e..36ef21dab2 100644 --- a/themes/cypress/source/css/_partial/page.scss +++ b/themes/cypress/source/css/_partial/page.scss @@ -101,6 +101,11 @@ a.article-edit-link { margin: 25px 0; word-wrap: break-word; font-family: $font-sans; + + .badge { + position: relative; + top: -2px; + } } ol { From f62cb853bb5fb17a7c055409e920216d929f402d Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Tue, 24 Dec 2019 15:03:31 +0630 Subject: [PATCH 16/73] Add isFinite assertion, supported in Chai 4+ --- source/guides/references/assertions.md | 1 + 1 file changed, 1 insertion(+) diff --git a/source/guides/references/assertions.md b/source/guides/references/assertions.md index acebdae621..cabe0f80e2 100644 --- a/source/guides/references/assertions.md +++ b/source/guides/references/assertions.md @@ -110,6 +110,7 @@ These assertions are available for TDD assertions (`assert`). You can see the en | .isNotString(*value*, *[message]*) | `assert.isNotString(2, 'val not string')` | | .isNumber(*value*, *[message]*) | `assert.isNumber(2, 'val is number')` | | .isNotNumber(*value*, *[message]*) | `assert.isNotNumber('e2e', 'val not number')` | +| .isFinite(*value*, *[message]*) | `assert.isFinite('e2e', 'val is finite')` | | .isBoolean(*value*, *[message]*) | `assert.isBoolean(true, 'val is bool')` | | .isNotBoolean(*value*, *[message]*) | `assert.isNotBoolean('true', 'val not bool')` | | .typeOf(*value*, *name*, *[message]*) | `assert.typeOf('e2e', 'string', 'val is string')` | From 11e25e1a84a1056ec4bad6229fa287cfb876caa6 Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Tue, 28 Jan 2020 13:53:50 +0630 Subject: [PATCH 17/73] fix eslint error --- source/guides/references/migration-guide.md | 1 + 1 file changed, 1 insertion(+) diff --git a/source/guides/references/migration-guide.md b/source/guides/references/migration-guide.md index fca5b2f435..c76d3f9448 100644 --- a/source/guides/references/migration-guide.md +++ b/source/guides/references/migration-guide.md @@ -68,6 +68,7 @@ it('uses invokes done and returns promise', function (done) { // assertions done() }) + eventEmitter.doSomethingThatEmitsChange() }) ``` From f5af1c652237eb1d96bb3a5459a929b7438be591 Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Tue, 28 Jan 2020 14:11:10 +0630 Subject: [PATCH 18/73] Add 'migration guide' title for russian pages --- themes/cypress/languages/ru.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/themes/cypress/languages/ru.yml b/themes/cypress/languages/ru.yml index fc23c3db41..9b45ccf99c 100644 --- a/themes/cypress/languages/ru.yml +++ b/themes/cypress/languages/ru.yml @@ -62,6 +62,7 @@ sidebar: best-practices: Лучшие практики trade-offs: Компромиссы changelog: Изменения в продукте + migration-guide: Migration Guide roadmap: Карта проекта tooling: Утилиты intelligent-code-completion: Интеллектуальное завершение кода From a21d475b1cc704cd94f09f8cecd27d881aa64214 Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Tue, 28 Jan 2020 04:27:18 -0500 Subject: [PATCH 19/73] add edge to the list of browsers (#2416) * add edge to the list of browsers * Add edge to launching-browsers list / remove 'new' mention (this will become outdated) Co-authored-by: Jennifer Shehane --- source/api/plugins/browser-launch-api.md | 2 +- source/guides/guides/command-line.md | 6 +++--- source/guides/guides/debugging.md | 4 ++++ source/guides/guides/launching-browsers.md | 7 +++++++ 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/source/api/plugins/browser-launch-api.md b/source/api/plugins/browser-launch-api.md index 5aab1e7ef0..b6a0c7bbb0 100644 --- a/source/api/plugins/browser-launch-api.md +++ b/source/api/plugins/browser-launch-api.md @@ -20,7 +20,7 @@ This event will yield you the `browser` as an object, and `args` which are the d Here are options for the currently supported browsers: -* {% url 'Chrome, Chromium, or Canary' "https://peter.sh/experiments/chromium-command-line-switches/" %} +* {% url 'Chrome, Chromium, Chrome Canary, or Microsoft Edge' "https://peter.sh/experiments/chromium-command-line-switches/" %} * {% url 'Electron' "https://github.com/electron/electron/blob/master/docs/api/browser-window.md#new-browserwindowoptions" %} ```js diff --git a/source/guides/guides/command-line.md b/source/guides/guides/command-line.md index f09450397e..3417dfcc15 100644 --- a/source/guides/guides/command-line.md +++ b/source/guides/guides/command-line.md @@ -105,7 +105,7 @@ Option | Description cypress run --browser chrome ``` -The "browser" argument can be set to "chrome", "canary", "chromium", or "electron" to launch a browser detected on your system. Cypress will attempt to automatically find the installed browser for you. +The "browser" argument can be set to "chrome", "canary", "chromium", "edge", "edgeCanary" or "electron" to launch a browser detected on your system. Cypress will attempt to automatically find the installed browser for you. You can also choose a browser by supplying a path: @@ -325,7 +325,7 @@ Give a run multiple tags. cypress run --record --tag "production,nightly" ``` -The Dashboard will display any tags sent with the appropriate run. +The Dashboard will display any tags sent with the appropriate run. {% imgTag /img/dashboard/dashboard-run-with-tags.png "Cypress run in the Dashboard displaying flags" %} @@ -365,7 +365,7 @@ cypress open --browser /usr/bin/chromium If found, the specified browser will be added to the list of available browsers in the Cypress Test Runner. -Currently, only browsers in the Chrome family are supported. +Currently, only browsers in the Chrome family are supported (including the new Chromium-based Microsoft Edge and Brave). {% url "Having trouble launching a browser? Check out the debugging guide" debugging#Launching-browsers %} diff --git a/source/guides/guides/debugging.md b/source/guides/guides/debugging.md index 6a2542a844..849afb9312 100644 --- a/source/guides/guides/debugging.md +++ b/source/guides/guides/debugging.md @@ -160,6 +160,8 @@ Browser Name | Expected Bundle Identifier | Expected Executable `chromium` | `org.chromium.Chromium` | `Contents/MacOS/Chromium` `canary` | `com.google.Chrome.canary` | `Contents/MacOS/Google Chrome Canary` +For the current list, see {% url 'packages/launcher' https://github.com/cypress-io/cypress/blob/develop/packages/launcher/lib/darwin/index.ts %} files. + ### Linux On Linux, Cypress scans your `PATH` for a number of different binary names. If the browser you are trying to use does not exist under one of the expected binary names, Cypress will not be able to find it. @@ -188,6 +190,8 @@ Browser Name | Expected Path `chromium` | `C:/Program Files (x86)/Google/chrome-win32/chrome.exe` `canary` | `%APPDATA%/../Local/Google/Chrome SxS/Application/chrome.exe` +For the current list, see {% url 'packages/launcher' https://github.com/cypress-io/cypress/blob/develop/packages/launcher/lib/windows/index.ts %} files. + To make a browser installed at a different path be auto-detected, create a symbolic link using `mklink` in the location that Cypress expects to find your browser. {% url 'Read more about creating symbolic links on Windows' https://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/ %} diff --git a/source/guides/guides/launching-browsers.md b/source/guides/guides/launching-browsers.md index b991b54698..a18307fbef 100644 --- a/source/guides/guides/launching-browsers.md +++ b/source/guides/guides/launching-browsers.md @@ -14,6 +14,7 @@ When Cypress is initially run from the Test Runner, you can choose to run Cypres - {% url "Canary" https://www.google.com/chrome/browser/canary.html %} - {% url "Chrome" https://www.google.com/chrome/browser/desktop/index.html %} - {% url "Chromium" https://www.chromium.org/Home %} +- {% url "Edge" https://www.microsoft.com/edge %} - {% url "Electron" https://electron.atom.io/ %} Cypress automatically detects available browsers on your OS. You can switch the browser in the Test Runner by using the drop down in the top right corner: @@ -64,6 +65,12 @@ Or Chrome Canary: cypress run --browser canary ``` +Or Microsoft Edge: + +```shell +cypress run --browser edge +``` + {% url 'Having issues launching installed browsers? Read more about debugging browser launching' debugging#Launching-browsers %} ## Launching by a path From 88d5aceec1c060d25aa8281f98badf302569301d Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Tue, 28 Jan 2020 16:27:21 +0630 Subject: [PATCH 20/73] Firefox Support Docs (#2225) * Initial commits for Firefox support * Add 'isBrowser' and 'isBrowserType' to docs (introduced in Firefox PR) * packagelock * Remove 'firefox support' from roadmap + tradoff of no cross browser support * Add notes about chromeWebSecurity only working in Chrome family browsers. * add cross-browser guide * Add 'cross-browser' to textlintrc * Update use of 'cross-browser' hyphenated. * minor editing / mostly fixing broken links and 'url' links * remove references to open --browser flag * add helpful info on cron expressions * rename cross browser guide * add localized titles for cross browser guide * fix typo * package-lock again * add cross browser testing to russian titles * add isBrowser pages to russian titles Co-authored-by: Amir Rustamzadeh <334337+amirrustam@users.noreply.github.com> --- .textlintrc | 1 + package-lock.json | 449 ++++++++---------- source/_data/sidebar.yml | 3 + source/api/cypress-api/isbrowser.md | 28 ++ source/api/cypress-api/isbrowsertype.md | 48 ++ source/api/plugins/browser-launch-api.md | 10 +- source/faq/questions/general-questions-faq.md | 2 +- source/guides/guides/cross-browser-testing.md | 233 +++++++++ source/guides/guides/launching-browsers.md | 25 +- source/guides/guides/module-api.md | 1 - source/guides/guides/web-security.md | 10 +- source/guides/references/configuration.md | 2 +- source/guides/references/error-messages.md | 2 +- source/guides/references/roadmap.md | 3 +- source/guides/references/trade-offs.md | 1 - themes/cypress/languages/en.yml | 3 + themes/cypress/languages/ja.yml | 3 + themes/cypress/languages/pt-br.yml | 3 + themes/cypress/languages/ru.yml | 3 + themes/cypress/languages/zh-cn.yml | 3 + .../cypress-browser-selector.png | Bin 0 -> 145688 bytes 21 files changed, 576 insertions(+), 257 deletions(-) create mode 100644 source/api/cypress-api/isbrowser.md create mode 100644 source/api/cypress-api/isbrowsertype.md create mode 100644 source/guides/guides/cross-browser-testing.md create mode 100644 themes/cypress/source/img/guides/cross-browser-testing/cypress-browser-selector.png diff --git a/.textlintrc b/.textlintrc index 9928f8c7e4..c551ade462 100644 --- a/.textlintrc +++ b/.textlintrc @@ -22,6 +22,7 @@ "BrowserStack", ["^chai", "Chai"], ["^chai-jquery", "chai-jquery"], + ["cross-browser", "cross browser"], ["cross origin", "cross-origin"], "ESLint", ["Express.js", "Express"], diff --git a/package-lock.json b/package-lock.json index f2f82b1915..6b85cf8424 100644 --- a/package-lock.json +++ b/package-lock.json @@ -691,6 +691,15 @@ "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", "dev": true }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -718,15 +727,6 @@ } } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -834,10 +834,10 @@ "integrity": "sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo=", "dev": true, "requires": { - "chalk": "^1.1.3", - "cli-cursor": "^1.0.2", - "date-fns": "^1.27.2", - "figures": "^1.7.0" + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "date-fns": "1.30.1", + "figures": "1.7.0" }, "dependencies": { "ansi-styles": { @@ -852,11 +852,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "cli-cursor": { @@ -865,7 +865,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "restore-cursor": "1.0.1" } }, "onetime": { @@ -880,8 +880,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "exit-hook": "1.1.1", + "onetime": "1.1.0" } }, "strip-ansi": { @@ -890,7 +890,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "supports-color": { @@ -926,8 +926,8 @@ "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", "dev": true, "requires": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" + "debug": "3.2.6", + "lodash.once": "4.1.1" }, "dependencies": { "debug": { @@ -936,7 +936,7 @@ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.1" } } } @@ -2081,7 +2081,6 @@ }, "@keyv/redis": { "version": "github:bahmutov/keyv-redis#b64f44cd1d1e87893d989b1469068af8292299d5", - "from": "@keyv/redis@github:bahmutov/keyv-redis#b64f44cd1d1e87893d989b1469068af8292299d5", "dev": true, "requires": { "pify": "3.0.0", @@ -2789,15 +2788,6 @@ "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", "dev": true }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" - } - }, "a-sync-waterfall": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", @@ -4397,7 +4387,7 @@ "integrity": "sha512-O1ji32oyON9laVPJL1IZ5bmwd2cB46VfpxkDequezH+15FDzzVddEyrGEeX4WusDSqKxdyFdDQDEG1yo1GoWkg==", "dev": true, "requires": { - "os-homedir": "^1.0.1" + "os-homedir": "1.0.2" } }, "call-me-maybe": { @@ -5576,9 +5566,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" } }, "commander": { @@ -5593,11 +5583,11 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "nice-try": "1.0.5", + "path-key": "2.0.1", + "semver": "5.7.0", + "shebang-command": "1.2.0", + "which": "1.3.1" } }, "debug": { @@ -5606,7 +5596,7 @@ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.1" } }, "execa": { @@ -5615,13 +5605,13 @@ "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "6.0.5", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" } }, "fs-extra": { @@ -5630,9 +5620,9 @@ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "graceful-fs": "4.1.15", + "jsonfile": "4.0.0", + "universalify": "0.1.2" } }, "get-stream": { @@ -5647,12 +5637,12 @@ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "is-ci": { @@ -5661,7 +5651,7 @@ "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", "dev": true, "requires": { - "ci-info": "^1.5.0" + "ci-info": "1.6.0" } }, "punycode": { @@ -5682,7 +5672,7 @@ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "glob": "^7.1.3" + "glob": "7.1.6" } }, "tmp": { @@ -5691,7 +5681,7 @@ "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", "dev": true, "requires": { - "rimraf": "^2.6.3" + "rimraf": "2.7.1" } }, "url": { @@ -7286,13 +7276,13 @@ "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" } }, "eventemitter2": { @@ -7718,7 +7708,7 @@ "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", "dev": true, "requires": { - "pend": "~1.2.0" + "pend": "1.2.0" } }, "minimist": { @@ -7748,7 +7738,7 @@ "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", "dev": true, "requires": { - "fd-slicer": "~1.0.1" + "fd-slicer": "1.0.1" } } } @@ -8930,8 +8920,7 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "optional": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "aproba": { "version": "1.2.0", @@ -8952,14 +8941,12 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "optional": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "optional": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -8974,20 +8961,17 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "optional": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "optional": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "optional": true + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "core-util-is": { "version": "1.0.2", @@ -9104,8 +9088,7 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "optional": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", @@ -9117,7 +9100,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "optional": true, "requires": { "number-is-nan": "1.0.1" } @@ -9132,7 +9114,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "optional": true, "requires": { "brace-expansion": "1.1.11" } @@ -9140,14 +9121,12 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "optional": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "optional": true, "requires": { "safe-buffer": "5.1.2", "yallist": "3.0.3" @@ -9166,7 +9145,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "optional": true, "requires": { "minimist": "0.0.8" } @@ -9247,8 +9225,7 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "optional": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "object-assign": { "version": "4.1.1", @@ -9260,7 +9237,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "optional": true, "requires": { "wrappy": "1.0.2" } @@ -9346,8 +9322,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "optional": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safer-buffer": { "version": "2.1.2", @@ -9379,31 +9354,29 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "optional": true }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "optional": true, "requires": { "code-point-at": "1.1.0", "is-fullwidth-code-point": "1.0.0", "strip-ansi": "3.0.1" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "optional": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "optional": true, "requires": { "ansi-regex": "2.1.1" } @@ -9447,14 +9420,12 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "optional": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "optional": true + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" } } }, @@ -9604,7 +9575,7 @@ "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "dev": true, "requires": { - "lodash": "^4.17.10" + "lodash": "4.17.15" } } } @@ -10070,7 +10041,7 @@ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "dev": true, "requires": { - "ini": "^1.3.4" + "ini": "1.3.5" } }, "global-modules": { @@ -13264,8 +13235,8 @@ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "dev": true, "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" } }, "is-jpg": { @@ -15979,6 +15950,15 @@ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, "jsontoxml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/jsontoxml/-/jsontoxml-1.0.1.tgz", @@ -17128,22 +17108,22 @@ "integrity": "sha1-a84sD1YD+klYDqF81qAMwOX6RRo=", "dev": true, "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "figures": "^1.7.0", - "indent-string": "^2.1.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.2.0", - "listr-verbose-renderer": "^0.4.0", - "log-symbols": "^1.0.2", - "log-update": "^1.0.2", - "ora": "^0.2.3", - "p-map": "^1.1.1", - "rxjs": "^5.0.0-beta.11", - "stream-to-observable": "^0.1.0", - "strip-ansi": "^3.0.1" + "chalk": "1.1.3", + "cli-truncate": "0.2.1", + "figures": "1.7.0", + "indent-string": "2.1.0", + "is-promise": "2.1.0", + "is-stream": "1.1.0", + "listr-silent-renderer": "1.1.1", + "listr-update-renderer": "0.2.0", + "listr-verbose-renderer": "0.4.1", + "log-symbols": "1.0.2", + "log-update": "1.0.2", + "ora": "0.2.3", + "p-map": "1.2.0", + "rxjs": "5.5.12", + "stream-to-observable": "0.1.0", + "strip-ansi": "3.0.1" }, "dependencies": { "ansi-styles": { @@ -17158,11 +17138,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "cli-cursor": { @@ -17171,7 +17151,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "restore-cursor": "1.0.1" } }, "log-symbols": { @@ -17180,7 +17160,7 @@ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "chalk": "^1.0.0" + "chalk": "1.1.3" } }, "onetime": { @@ -17195,10 +17175,10 @@ "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", "dev": true, "requires": { - "chalk": "^1.1.1", - "cli-cursor": "^1.0.2", - "cli-spinners": "^0.1.2", - "object-assign": "^4.0.1" + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-spinners": "0.1.2", + "object-assign": "4.1.1" } }, "restore-cursor": { @@ -17207,8 +17187,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "exit-hook": "1.1.1", + "onetime": "1.1.0" } }, "strip-ansi": { @@ -17217,7 +17197,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "supports-color": { @@ -17240,14 +17220,14 @@ "integrity": "sha1-yoDhd5tOcCZoB+ju0a1qvjmFUPk=", "dev": true, "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^1.0.2", - "strip-ansi": "^3.0.1" + "chalk": "1.1.3", + "cli-truncate": "0.2.1", + "elegant-spinner": "1.0.1", + "figures": "1.7.0", + "indent-string": "3.2.0", + "log-symbols": "1.0.2", + "log-update": "1.0.2", + "strip-ansi": "3.0.1" }, "dependencies": { "ansi-styles": { @@ -17262,11 +17242,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "indent-string": { @@ -17281,7 +17261,7 @@ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "chalk": "^1.0.0" + "chalk": "1.1.3" } }, "strip-ansi": { @@ -17290,7 +17270,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "supports-color": { @@ -17307,10 +17287,10 @@ "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", "dev": true, "requires": { - "chalk": "^1.1.3", - "cli-cursor": "^1.0.2", - "date-fns": "^1.27.2", - "figures": "^1.7.0" + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "date-fns": "1.30.1", + "figures": "1.7.0" }, "dependencies": { "ansi-styles": { @@ -17325,11 +17305,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "cli-cursor": { @@ -17338,7 +17318,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "restore-cursor": "1.0.1" } }, "onetime": { @@ -17353,8 +17333,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "exit-hook": "1.1.1", + "onetime": "1.1.0" } }, "strip-ansi": { @@ -17363,7 +17343,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "supports-color": { @@ -17676,8 +17656,8 @@ "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", "dev": true, "requires": { - "ansi-escapes": "^1.0.0", - "cli-cursor": "^1.0.2" + "ansi-escapes": "1.4.0", + "cli-cursor": "1.0.2" }, "dependencies": { "ansi-escapes": { @@ -17692,7 +17672,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "restore-cursor": "1.0.1" } }, "onetime": { @@ -17707,8 +17687,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "exit-hook": "1.1.1", + "onetime": "1.1.0" } } } @@ -19216,14 +19196,12 @@ "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "optional": true + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "optional": true, "requires": { "arr-flatten": "1.1.0", "array-unique": "0.3.2", @@ -19241,7 +19219,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "optional": true, "requires": { "is-extendable": "0.1.1" } @@ -19409,7 +19386,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "optional": true, "requires": { "extend-shallow": "2.0.1", "is-number": "3.0.0", @@ -19421,7 +19397,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "optional": true, "requires": { "is-extendable": "0.1.1" } @@ -19481,8 +19456,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "optional": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-glob": { "version": "4.0.1", @@ -19497,7 +19471,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "optional": true, "requires": { "kind-of": "3.2.2" }, @@ -19506,7 +19479,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "optional": true, "requires": { "is-buffer": "1.1.6" } @@ -19516,14 +19488,12 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "optional": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "optional": true + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" }, "micromatch": { "version": "3.1.10", @@ -20327,7 +20297,7 @@ "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { - "through": "~2.3" + "through": "2.3.8" } }, "pegjs": { @@ -21027,7 +20997,7 @@ "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", "dev": true, "requires": { - "event-stream": "=3.3.4" + "event-stream": "3.3.4" } }, "pseudomap": { @@ -22057,7 +22027,7 @@ "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", "dev": true, "requires": { - "throttleit": "^1.0.0" + "throttleit": "1.0.0" } }, "request-promise": { @@ -23586,7 +23556,7 @@ "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { - "through": "2" + "through": "2.3.8" } }, "split-string": { @@ -23715,11 +23685,11 @@ "integrity": "sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==", "dev": true, "requires": { - "@hapi/address": "^2.1.2", - "@hapi/formula": "^1.2.0", - "@hapi/hoek": "^8.2.4", - "@hapi/pinpoint": "^1.0.2", - "@hapi/topo": "^3.1.3" + "@hapi/address": "2.1.4", + "@hapi/formula": "1.2.0", + "@hapi/hoek": "8.5.0", + "@hapi/pinpoint": "1.0.2", + "@hapi/topo": "3.1.6" } }, "@hapi/topo": { @@ -23728,7 +23698,7 @@ "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", "dev": true, "requires": { - "@hapi/hoek": "^8.3.0" + "@hapi/hoek": "8.5.0" } }, "bluebird": { @@ -23743,9 +23713,9 @@ "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "path-key": "3.1.1", + "shebang-command": "2.0.0", + "which": "2.0.2" } }, "execa": { @@ -23754,15 +23724,15 @@ "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" + "cross-spawn": "7.0.1", + "get-stream": "5.1.0", + "human-signals": "1.1.1", + "is-stream": "2.0.0", + "merge-stream": "2.0.0", + "npm-run-path": "4.0.1", + "onetime": "5.1.0", + "signal-exit": "3.0.2", + "strip-final-newline": "2.0.0" } }, "get-stream": { @@ -23771,7 +23741,7 @@ "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dev": true, "requires": { - "pump": "^3.0.0" + "pump": "3.0.0" } }, "is-stream": { @@ -23798,7 +23768,7 @@ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "path-key": "^3.0.0" + "path-key": "3.1.1" } }, "onetime": { @@ -23807,7 +23777,7 @@ "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, "requires": { - "mimic-fn": "^2.1.0" + "mimic-fn": "2.1.0" } }, "path-key": { @@ -23822,8 +23792,8 @@ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "end-of-stream": "1.4.1", + "once": "1.4.0" } }, "rxjs": { @@ -23832,7 +23802,7 @@ "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", "dev": true, "requires": { - "tslib": "^1.9.0" + "tslib": "1.9.3" } }, "shebang-command": { @@ -23841,7 +23811,7 @@ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^3.0.0" + "shebang-regex": "3.0.0" } }, "shebang-regex": { @@ -23856,12 +23826,12 @@ "integrity": "sha512-QrW3J8LzS5ADPfD9Rx5S6KJck66xkqyiFKQs9jmUTkIhiEOmkzU7WRZc+MjsnmkrgjitS2xQ4bb13hnlQnKBUQ==", "dev": true, "requires": { - "@hapi/joi": "^16.1.8", - "lodash": "^4.17.15", - "minimist": "^1.2.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.8", - "rxjs": "^6.5.4" + "@hapi/joi": "16.1.8", + "lodash": "4.17.15", + "minimist": "1.2.0", + "request": "2.88.0", + "request-promise-native": "1.0.8", + "rxjs": "6.5.4" } }, "which": { @@ -23870,7 +23840,7 @@ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } } } @@ -23954,7 +23924,7 @@ "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { - "duplexer": "~0.1.1" + "duplexer": "0.1.1" } }, "stream-consume": { @@ -24007,6 +23977,14 @@ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, + "string_decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "requires": { + "safe-buffer": "5.1.2" + } + }, "string-argv": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz", @@ -24153,14 +24131,6 @@ "function-bind": "1.1.1" } }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "requires": { - "safe-buffer": "5.1.2" - } - }, "stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", @@ -26144,11 +26114,11 @@ "resolved": "https://registry.npmjs.org/warehouse/-/warehouse-2.2.0.tgz", "integrity": "sha1-XQnWSUKZK+Zn2PfIagnCuK6gQGI=", "requires": { - "JSONStream": "1.3.5", "bluebird": "3.7.2", "cuid": "1.3.8", "graceful-fs": "4.1.15", "is-plain-object": "2.0.4", + "JSONStream": "1.3.5", "lodash": "4.17.15" } }, @@ -26432,8 +26402,7 @@ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yall": { - "version": "github:malchata/yall.js#1c782f1ab7a0becb1a88fd6f3b260e55d5e213a2", - "from": "yall@github:malchata/yall.js#1c782f1ab7a0becb1a88fd6f3b260e55d5e213a2" + "version": "github:malchata/yall.js#1c782f1ab7a0becb1a88fd6f3b260e55d5e213a2" }, "yallist": { "version": "2.1.2", diff --git a/source/_data/sidebar.yml b/source/_data/sidebar.yml index 43a5a5c5cb..1de52c92c1 100644 --- a/source/_data/sidebar.yml +++ b/source/_data/sidebar.yml @@ -33,6 +33,7 @@ guides: stubs-spies-and-clocks: stubs-spies-and-clocks.html screenshots-and-videos: screenshots-and-videos.html launching-browsers: launching-browsers.html + cross-browser-testing: cross-browser-testing.html web-security: web-security.html tooling: intelligent-code-completion: intelligent-code-completion.html @@ -161,6 +162,8 @@ api: config: config.html dom: dom.html env: env.html + isbrowser: isbrowser.html + isbrowsertype: isbrowsertype.html iscy: iscy.html cypress-log: cypress-log.html platform: platform.html diff --git a/source/api/cypress-api/isbrowser.md b/source/api/cypress-api/isbrowser.md new file mode 100644 index 0000000000..f7a1ec8c2e --- /dev/null +++ b/source/api/cypress-api/isbrowser.md @@ -0,0 +1,28 @@ +--- +title: Cypress.isBrowser +comments: false +--- + +`Cypress.isBrowser` returns `true` if the current browser matches the name passed or `false` if it does not. The name is case-insensitive. + +# Syntax + +```javascript +// while running in Chrome +Cypress.isBrowser('chrome') // true +Cypress.isBrowser('Chrome') // true +Cypress.isBrowser('firefox') // false +Cypress.isBrowser('canary') // false +``` + +# Examples + +## Conditionals + +```javascript +if (Cypress.isBrowser('chrome')) { + it('only runs in chrome', function () { + // test some (hypothetical) issue with chrome + }) +} +``` diff --git a/source/api/cypress-api/isbrowsertype.md b/source/api/cypress-api/isbrowsertype.md new file mode 100644 index 0000000000..3a642004a3 --- /dev/null +++ b/source/api/cypress-api/isbrowsertype.md @@ -0,0 +1,48 @@ +--- +title: Cypress.isBrowserType +comments: false +--- + +`Cypress.isBrowserType` returns true if the current browser is of the type of the name passed or false if it does not. The name is case-insensitive. + +These browsers will return true for `Cypress.isBrowserType('chrome')`: + +* Chrome +* Canary +* Chromium +* Electron + +These browsers will return true for `Cypress.isBrowserType('firefox')`: + +* Firefox +* Firefox Developer Edition +* Firefox Nightly + +# Syntax + +```javascript +// while running in Chrome +Cypress.isBrowserType('chrome') // true +Cypress.isBrowserType('Chrome') // true +Cypress.isBrowserType('firefox') // false + +// while running in Canary +Cypress.isBrowserType('chrome') // true +Cypress.isBrowserType('firefox') // false + +// while running Firefox Nightly +Cypress.isBrowserType('firefox') // true +Cypress.isBrowserType('chrome') // false +``` + +# Examples + +## Conditionals + +```javascript +if (Cypress.isBrowserType('chrome')) { + it('only runs in chrome-based browser', function () { + // test some (hypothetical) issue with chrome-based browsers + }) +} +``` \ No newline at end of file diff --git a/source/api/plugins/browser-launch-api.md b/source/api/plugins/browser-launch-api.md index b6a0c7bbb0..4fe4e7ab0e 100644 --- a/source/api/plugins/browser-launch-api.md +++ b/source/api/plugins/browser-launch-api.md @@ -6,7 +6,7 @@ Before Cypress launches a browser, it gives you the ability to modify the argume This is helpful to modify, remove, or add your own arguments. -The most common use case is adding your own web extension - [example recipe](https://www.cypress.io/blog/2020/01/07/how-to-load-the-react-devtools-extension-in-cypress/). +The most common use case is adding your own web extension - {% url "example recipe" https://www.cypress.io/blog/2020/01/07/how-to-load-the-react-devtools-extension-in-cypress/ %}. # Usage @@ -20,7 +20,8 @@ This event will yield you the `browser` as an object, and `args` which are the d Here are options for the currently supported browsers: -* {% url 'Chrome, Chromium, Chrome Canary, or Microsoft Edge' "https://peter.sh/experiments/chromium-command-line-switches/" %} +* {% url 'Chrome, Chromium, Canary, or Microsoft Edge browsers' "https://peter.sh/experiments/chromium-command-line-switches/" %} +* {% url 'Firefox' "http://kb.mozillazine.org/About:config_entries" %} * {% url 'Electron' "https://github.com/electron/electron/blob/master/docs/api/browser-window.md#new-browserwindowoptions" %} ```js @@ -44,6 +45,11 @@ module.exports = (on, config) => { return args } + if (browser.name === 'firefox') { + args.extensions.push('/path/to/my/extension') + args.preferences['browser.blink_allowed'] = true + } + if (browser.name === 'electron') { // `args` is a `BrowserWindow` options object // https://electronjs.org/docs/api/browser-window#new-browserwindowoptions diff --git a/source/faq/questions/general-questions-faq.md b/source/faq/questions/general-questions-faq.md index 97ac30ae3d..1ba683d0c8 100644 --- a/source/faq/questions/general-questions-faq.md +++ b/source/faq/questions/general-questions-faq.md @@ -92,7 +92,7 @@ No. In fact Cypress' architecture is very different from Selenium in a few criti ## {% fa fa-angle-right %} If Cypress runs in the browser, doesn't that mean it's sandboxed? -Yes, technically; it's sandboxed and has to follow the same rules as every other browser. That's actually a good thing because it doesn't require a browser extension, and it naturally will work across all browsers (which enables cross-browser testing). +Yes, technically; it's sandboxed and has to follow the same rules as every other browser. That's actually a good thing because it doesn't require a browser extension, and it naturally will work across all browsers (which enables cross browser testing). But Cypress is actually way beyond a basic JavaScript application running in the browser. It is also a desktop application and communicates with back end web services. diff --git a/source/guides/guides/cross-browser-testing.md b/source/guides/guides/cross-browser-testing.md new file mode 100644 index 0000000000..69ded1d9ad --- /dev/null +++ b/source/guides/guides/cross-browser-testing.md @@ -0,0 +1,233 @@ +--- +title: Cross Browser Testing +--- + +Cypress has the capability to run tests across multiple browsers. Currently, Cypress supports Firefox and {% url "Chrome-family browsers" launching-browsers#Chrome-Browsers %} (including Electron). + +{% note warning 'Web Security' %} +Tests that require the {% url "`chromeWebSecurity` configuration option to be disabled" web-security#Disabling-Web-Security %} may experience issues in non-Chrome family browsers. +{% endnote %} + +Excluding {% url "Electron" launching-browsers#Electron-Browser %}, any browser you want to run Cypress tests in needs to be installed on your local system or CI environment. A full list of detected browsers is displayed within the browser selection menu of the {% url "Test Runner" test-runner %}. + +{% imgTag /img/guides/cross-browser-testing/cypress-browser-selector.png "Cypress Test Runner with Firefox selected as the browser" "no-border" %} + +The desired browser can also specified via the {% url `--browser` command-line#Options %} flag when using {% url `run` command-line#cypress-run %} command to launch Cypress. For example, to run Cypress tests in Firefox: + +```shell +cypress run --browser firefox +``` + +To make launching of Cypress with a specific browser even more convenient, npm scripts can be used as a shortcut: + +```json +"scripts": { + "cy:run:chrome": "cypress run --browser chrome", + "cy:run:firefox": "cypress run --browser firefox" +} +``` + +# Continuous Integration Strategies + +When incorporating testing of multiple browsers within your QA process, you must implement a CI strategy that provides an optimal level of confidence while taking into consideration test duration and infrastructure costs. This optimal strategy will vary by the type and needs of a particular project. This guide we present several strategies to consider when crafting the strategy for your project. + +CI strategies will be demonstrated using the {% url "Circle CI Cypress Orb" https://circleci.com/orbs/registry/orb/cypress-io/cypress %} for its concise and readable configuration, but the same concepts apply for most CI providers. + +{% note info 'Docker Images for Testing' %} +The CI configuration examples within this guide use {% url "Cypress's Docker images" https://github.com/cypress-io/cypress-docker-images/tree/master/browsers %} to provision testing environments with desired versions of Node, Chrome, and Firefox. +{% endnote %} + +## Periodic Basis + +Generally, it is desired to run tests with each pushed commit, but it may not be necessary to do so for all browsers. For example, we can choose to run tests within Chrome for each commit, but only run Firefox on a periodic basis (i.e. nightly). The periodic frequency will depend on the scheduling of your project releases, so consider a test run frequency that is appropriate for the release schedule of your project. + +{% note info 'Cron Scheduling' %} +Typically CI providers allow for the scheduling of CI jobs via {% url "cron expressions" https://en.wikipedia.org/wiki/Cron %}. For example, the expression `0 0 * * *` translates to "everyday at midnight" or nightly. Helpful {% url "online utilities" https://crontab.guru/ %} are available to assist with creation and translation of cron expressions. +{% endnote %} + +The following example demonstrates a nightly CI schedule against production (`master` branch) for Firefox: + +```yaml +version: 2.1 +orbs: + cypress: cypress-io/cypress@1 +workflows: + nightly: + triggers: + - schedule: + cron: "0 0 * * *" + filters: + branches: + only: + - master + jobs: + - cypress/run: + executor: cypress/browsers-chrome73-ff68 + browser: firefox + start: npm start + wait-on: http://localhost:3000 +``` + +## Production Deployment + +For projects that exhibit consistently stable behavior across browsers, it may be better to run tests against additional browsers only before merging changes in the production deployment branch. + +The following example demonstrates only running Firefox tests when commits are merged into a specific branch (`develop` branch in this case) so any potential Firefox issues can be caught before a production release: + +```yaml +version: 2.1 +orbs: + cypress: cypress-io/cypress@1 +workflows: + test_develop: + jobs: + - filters: + branches: + only: + - develop + - cypress/run: + executor: cypress/browsers-chrome73-ff68 + browser: firefox + start: npm start + wait-on: http://localhost:3000 +``` + +## Subset of Tests + +We can choose to only run a subset of tests against a given browser. For example, we can execute only the happy or critical path related test files, or a directory of specific "smoke" test files. It is not always necessary to have both browsers always running *all* tests. + +In the example below, the Chrome `cypress/run` job runs *all* tests against Chrome and reports results to the {% url "Cypress Dashboard" https://on.cypress.io/dashboard %} using a ({% url "group" parallelization#Grouping-test-runs %}) named `chrome`. + +The Firefox `cypress/run` job runs a subset of tests, defined in the `spec` parameter, against the Firefox browser, and reports the results to the {% url "Cypress Dashboard" https://on.cypress.io/dashboard %} under the group `firefox-critical-path`. + +{% note info %} +**Note:** The `name` under each `cypress/run` job which will be shown in the Circle CI workflow UI to distinguish the jobs. +{% endnote %} + +```yaml +version: 2.1 +orbs: + cypress: cypress-io/cypress@1 +workflows: + build: + jobs: + - cypress/install + - cypress/run: + name: Chrome + requires: + - cypress/install + executor: cypress/browsers-chrome73-ff68 + start: npm start + wait-on: http://localhost:3000 + record: true + group: chrome + browser: chrome + - cypress/run: + name: Firefox + requires: + - cypress/install + executor: cypress/browsers-chrome73-ff68 + start: npm start + wait-on: http://localhost:3000 + record: true + group: firefox-critical-path + browser: firefox + spec: "cypress/integration/signup.spec.js,cypress/integration/login.spec.js" +``` + +## Parallelize per browser + +Execution of test files can be parallelized on a per {% url "group" parallelization#Grouping-test-runs %} basis, where test files can be grouped by the browser under test. This versatility enables the ability to allocate the desired amount of CI resources towards a browser to either improve test duration or to minimize CI costs. + +**You do not have to run all browsers at the same parallelization level.** In the example below, the Chrome dedicated `cypress/run` job runs *all* tests in parallel, across **4 machines**, against Chrome and reports results to the {% url "Cypress Dashboard" https://on.cypress.io/dashboard %} under the group name `chrome`. The Firefox dedicated `cypress/run` job runs a *subset* of tests in parallel, across **2 machines**, defined by the `spec` parameter, against the Firefox browser and reports results to the {% url "Cypress Dashboard" https://on.cypress.io/dashboard %} under the group named `firefox`. + +```yaml +version: 2.1 +orbs: + cypress: cypress-io/cypress@1 +workflows: + build: + jobs: + - cypress/install + - cypress/run: + name: Chrome + requires: + - cypress/install + executor: cypress/browsers-chrome73-ff68 + record: true + start: npm start + wait-on: http://localhost:3000 + parallel: true + parallelism: 4 + group: chrome + browser: chrome + - cypress/run: + name: Firefox + requires: + - cypress/install + executor: cypress/browsers-chrome73-ff68 + record: true + start: npm start + wait-on: http://localhost:3000 + parallel: true + parallelism: 2 + group: firefox + browser: firefox + spec: "cypress/integration/app.spec.js,cypress/integration/login.spec.js,cypress/integration/about.spec.js" +``` + +## Running Specific Tests by Browser + +There may be instances where it can be useful to run or ignore one or more tests. For example, test run duration can be reduced by only running smoke-tests against Chrome and not Firefox. This type of granular selection of test execution depends on the type of tests and the level of confidence those specific tests provide to the overall project. + +{% note success 'Tip' %} +When considering to ignore or only run a particular test within a given browser, assess the true need for the test to run on multiple browsers. +{% endnote %} + +In the example below we've implemented two helper functions that utilize {% url "`Cypress.isBrowser()`" isbrowser %}, accepting a browser string (e.g. 'chrome', 'firefox') and a callback function of tests: + +- `runOn` can be used to *only* run a test or suite of tests for a given browser. +- `ignoreOn` can be used to completely ignore the execution of a test or test suite for a given browser. + +```js +const runOn = (browser, fn) => { + if (Cypress.isBrowser(browser) { + fn() + } +} + +const ignoreOn = (browser, fn) => { + if (!Cypress.isBrowser(browser) { + fn() + } +} + +// Run happy path tests if Cypress is run via Firefox +runOn('firefox', () => { + describe('happy path suite', () => { + it('...') + it('...') + it('...') + }) +}) + +// Ignore test if Cypress is running via Firefox +// This test is not recorded to the Cypress Dashboard +ignoreOn('firefox', () => { + it('a test', function() { + // ... test body + }) +} +``` + +It is important to note that *ignoring* tests is different from *skipping* tests. When a test is skipped, it is still displayed within test result reports, but when a test is ignored it will never be displayed within reports. If you need to skip a test by browser, but still include it in a custom report or record it to the Cypress Dashboard, you can utilize the following practice: + +```js +// Skip the test, but still record it to the Cypress Dashboard +it('a test', function() { + if (!Cypress.isBrowser('firefox') { + this.skip() + } + // ... test body +}) +``` diff --git a/source/guides/guides/launching-browsers.md b/source/guides/guides/launching-browsers.md index a18307fbef..9227bfce7b 100644 --- a/source/guides/guides/launching-browsers.md +++ b/source/guides/guides/launching-browsers.md @@ -16,6 +16,9 @@ When Cypress is initially run from the Test Runner, you can choose to run Cypres - {% url "Chromium" https://www.chromium.org/Home %} - {% url "Edge" https://www.microsoft.com/edge %} - {% url "Electron" https://electron.atom.io/ %} +- {% url "Firefox" https://www.mozilla.org/firefox/ %} +- {% url "Firefox Developer Edition" https://www.mozilla.org/firefox/developer/ %} +- {% url "Firefox Nightly" https://www.mozilla.org/firefox/nightly/ %} Cypress automatically detects available browsers on your OS. You can switch the browser in the Test Runner by using the drop down in the top right corner: @@ -73,6 +76,18 @@ cypress run --browser edge {% url 'Having issues launching installed browsers? Read more about debugging browser launching' debugging#Launching-browsers %} +## Firefox Browsers + +All Firefox* flavored browsers will be detected and are supported. + +### You can launch Firefox browsers: + +```bash +cypress run --browser firefox +``` + +To use this command in CI, you need to install these other browsers - or use one of our {% url 'docker images' docker %}. + ## Launching by a path You can launch any supported browser by specifying a path to the binary: @@ -169,7 +184,7 @@ If you modify the list of browsers, you can see the {% url "resolved configurati ## Unsupported Browsers -Many browsers such as Firefox, Safari, and Internet Explorer are not currently supported. While it may be possible to modify the list of browsers found and run Cypress within them - we do not guarantee full functionality. Support for more browsers is on our roadmap. You can read an exhaustive explanation about our future cross browser testing strategy {% issue 310 'here' %}. +Many browsers such as Safari and Internet Explorer are not currently supported. Support for more browsers is on our roadmap. You can read an explanation about our future cross browser roadmap {% issue 310 'here' %}. # Browser Environment @@ -181,8 +196,8 @@ When Cypress goes to launch your browser it will give you an opportunity to modi This enables you to do things like: -- Load your own chrome extension -- Enable or disable experimental chrome features +- Load your own extension +- Enable or disable experimental features {% url 'This part of the API is documented here.' browser-launch-api %} @@ -223,10 +238,10 @@ You might notice that if you already have the browser open you will see two of t We understand that when Cypress is running in its own profile it can be difficult to tell the difference between your normal browser and Cypress. -For this reason we recommend {% url "downloading Chromium" https://www.chromium.org/Home %} or {% url "downloading Canary" https://www.google.com/chrome/browser/canary.html %}. These browsers both have different icons from the standard Chrome browser, making them more distinguishable. You can also use the bundled {% urlHash "Electron browser" Electron-Browser %}, which does not have a Dock icon. +For this reason we recommend {% url "downloading Chromium" https://www.chromium.org/Home %}, {% url "downloading Canary" https://www.google.com/chrome/browser/canary.html %}, {% url "Firefox Developer Edition" https://www.mozilla.org/firefox/developer/ %}, or {% url "Firefox Nightly" https://www.mozilla.org/firefox/nightly/ %}. These browsers both have different icons from the standard Chrome browser, making them more distinguishable. You can also use the bundled {% urlHash "Electron browser" Electron-Browser %}, which does not have a Dock icon. {% video local /img/snippets/switching-cypress-browser-and-canary-browser.mp4 %} -Additionally, we've made the browsers spawned by Cypress look different than regular sessions. You'll see a darker theme around the chrome of the browser. You'll always be able to visually distinguish these. +Additionally, in Chrome-based browsers, we've made the browser spawned by Cypress look different than regular sessions. You'll see a darker theme around the chrome of the browser. You'll always be able to visually distinguish these. {% imgTag /img/guides/cypress-browser-chrome.png "Cypress Browser with darker chrome" %} diff --git a/source/guides/guides/module-api.md b/source/guides/guides/module-api.md index 236f9006c9..863ad49e59 100644 --- a/source/guides/guides/module-api.md +++ b/source/guides/guides/module-api.md @@ -45,7 +45,6 @@ cypress.run({ browser: 'chrome', config: { baseUrl: 'http://localhost:8080', - chromeWebSecurity: false, video: true, }, env: { diff --git a/source/guides/guides/web-security.md b/source/guides/guides/web-security.md index 51def0f2eb..08f1ba5c7b 100644 --- a/source/guides/guides/web-security.md +++ b/source/guides/guides/web-security.md @@ -260,9 +260,13 @@ So if you cannot work around any of the issues using the suggested workarounds a One last thing to consider here is that every once in a while we discover bugs in Cypress that lead to cross-origin errors that can otherwise be fixed. If you think you're experiencing a bug, {% open_an_issue 'open an issue' %}. -To start, you will need to understand that *not all browsers expose a way to turn off web security*. Some do, some don't. If you rely on disabling web security, you will not be able to run tests on browsers that do not support this feature. +{% note warning 'Chrome only' %} +Disabling web security is only supported in Chrome family browsers. Settings in `chromeWebSecurity` will have no effect in other browsers. If you rely on disabling web security, you will not be able to run tests on browsers that do not support this feature. +{% endnote %} + +## Set `chromeWebSecurity` to `false` -## Setting `chromeWebSecurity` to `false` allows you to do the following: +Setting `chromeWebSecurity` to `false` in Chrome family browsers allows you to do the following: - Display insecure content - Navigate to any superdomain without cross-origin errors @@ -272,7 +276,7 @@ One thing you may notice though is that Cypress still enforces visiting a single Still here? That's cool, let's disable web security! -### Set `chromeWebSecurity` to `false` in your {% url "configuration file (`cypress.json` by default)" configuration %}` and we'll take care of the rest +### Set `chromeWebSecurity` to `false` in your {% url "configuration file (`cypress.json` by default)" configuration %}` ```json { diff --git a/source/guides/references/configuration.md b/source/guides/references/configuration.md index f1ef4aed44..0dcd626425 100644 --- a/source/guides/references/configuration.md +++ b/source/guides/references/configuration.md @@ -76,7 +76,7 @@ Option | Default | Description Option | Default | Description ----- | ---- | ---- -`chromeWebSecurity` | `true` | Whether Chrome Web Security for same-origin policy and insecure mixed content is enabled. {% url 'Read more about this here' web-security %} +`chromeWebSecurity` | `true` | Whether Chrome browser's Web Security for same-origin policy and insecure mixed content is enabled. {% url 'Read more about this here' web-security %} `userAgent` | `null` | Enables you to override the default user agent the browser sends in all request headers. User agent values are typically used by servers to help identify the operating system, browser, and browser version. See {% url "User-Agent MDN Documentation" https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent %} for example user agent values. `blacklistHosts` | `null` | A String or Array of hosts that you wish to block traffic for. {% urlHash 'Please read the notes for examples on using this.' blacklistHosts %} `modifyObstructiveCode` | `true` | Whether Cypress will search for and replace obstructive JS code in `.js` or `.html` files. {% urlHash 'Please read the notes for more information on this setting.' modifyObstructiveCode %} diff --git a/source/guides/references/error-messages.md b/source/guides/references/error-messages.md index 290a326c79..4e7c5b970c 100644 --- a/source/guides/references/error-messages.md +++ b/source/guides/references/error-messages.md @@ -517,7 +517,7 @@ When your application navigates to a superdomain outside of the current origin-p 2. You are testing a page that uses Single sign-on (SSO). In this case your web server is likely redirecting you between superdomains, so you receive this error message. You can likely get around this redirect problem by using {% url `cy.request()` request %} to manually handle the session yourself. -If you find yourself stuck and can't work around these issues you can set this in your {% url "configuration file (`cypress.json` by default)" configuration %}. But before doing so you should really understand and {% url 'read about the reasoning here' web-security %}. +If you find yourself stuck and can't work around these issues you can set `chromeWebSecurity` to `false` in your {% url "configuration file (`cypress.json` by default)" configuration %} when running in Chrome family browsers (this setting will not work in other browsers). Before doing so you should really understand and {% url 'read about the reasoning here' web-security %}. ```json { diff --git a/source/guides/references/roadmap.md b/source/guides/references/roadmap.md index 703eca5528..7e56e5f7f8 100644 --- a/source/guides/references/roadmap.md +++ b/source/guides/references/roadmap.md @@ -10,7 +10,6 @@ Our team is always planning and working on really "big" upcoming features. Prior Status | Feature | Issue | PR ---------------------| -----------------------------------|-------------------|--- -*Work in progress* | **Firefox support** | {% issue 1096 %} | {% PR 1359 %} *Work in progress* | **Full network layer stubbing** | {% issue 687 %} | {% PR 4176 %} *Work in progress* | **Improve Test Runner errors** | {% issue 3762 %} | {% PR 3930 %} *Work in progress* | **Testing Electron Apps** | {% issue 2072 %} | @@ -22,4 +21,4 @@ Status | Feature | Issue | ## Dashboard Service -Please see our official {% url "Dashboard Product Board" https://portal.productboard.com/cypress-io/1-cypress-dashboard %}. \ No newline at end of file +Please see our official {% url "Dashboard Product Board" https://portal.productboard.com/cypress-io/1-cypress-dashboard %}. diff --git a/source/guides/references/trade-offs.md b/source/guides/references/trade-offs.md index 9c86eeda36..c0d696c138 100644 --- a/source/guides/references/trade-offs.md +++ b/source/guides/references/trade-offs.md @@ -29,7 +29,6 @@ Many of these issues are currently being worked on or are on our {% url "Roadmap - {% issue 170#issuecomment-340012621 "Testing file uploads is application specific." %} - {% issue 433#issuecomment-280465552 "Testing file downloads is application specific." %} - {% issue 685 "iframe support is somewhat limited, but does work." %} -- {% issue 310 "There is no cross browser support other than Chrome and Electron." %} - {% issue 95#issuecomment-281273126 "You cannot use `cy.route()` on `window.fetch` but there is a workaround." %} See the implementation in {% url "this recipe." https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/stubbing-spying__window-fetch/cypress/integration %} - {% issue 144 "There is no shadow DOM support, but there are workarounds." %} See {% url "this comment." https://github.com/cypress-io/cypress/issues/830#issuecomment-449411701 %} diff --git a/themes/cypress/languages/en.yml b/themes/cypress/languages/en.yml index f475f8d35f..67c680116f 100644 --- a/themes/cypress/languages/en.yml +++ b/themes/cypress/languages/en.yml @@ -51,6 +51,7 @@ sidebar: parallelization: Parallelization environment-variables: Environment Variables launching-browsers: Launching Browsers + cross-browser-testing: Cross Browser Testing custom-commands: Custom Commands web-security: Web Security references: References @@ -176,6 +177,8 @@ sidebar: cypress-api: Cypress API config: config env: env + isbrowser: isBrowser + isbrowsertype: isBrowserType iscy: isCy custom-commands: Commands cookies: Cookies diff --git a/themes/cypress/languages/ja.yml b/themes/cypress/languages/ja.yml index 812d15bf78..916047e1fe 100644 --- a/themes/cypress/languages/ja.yml +++ b/themes/cypress/languages/ja.yml @@ -51,6 +51,7 @@ sidebar: parallelization: Parallelization environment-variables: 環境変数 launching-browsers: ブラウザーを起動する + cross-browser-testing: クロスブラウザテスト custom-commands: カスタムコマンド web-security: ウェブセキュリティー references: 参考 @@ -176,6 +177,8 @@ sidebar: cypress-api: Cypress API config: config env: env + isbrowser: isBrowser + isbrowsertype: isBrowserType iscy: isCy custom-commands: Commands cookies: Cookies diff --git a/themes/cypress/languages/pt-br.yml b/themes/cypress/languages/pt-br.yml index bbb3b0f47f..82ebbd0e4d 100644 --- a/themes/cypress/languages/pt-br.yml +++ b/themes/cypress/languages/pt-br.yml @@ -51,6 +51,7 @@ sidebar: parallelization: Paralelização environment-variables: Variáveis de Ambiente launching-browsers: Iniciando navegadores + cross-browser-testing: Cross Browser Testing custom-commands: Comandos Customizados web-security: Segurança Web references: Referências @@ -176,6 +177,8 @@ sidebar: cypress-api: Cypress API config: config env: env + isbrowser: isBrowser + isbrowsertype: isBrowserType iscy: isCy custom-commands: Commands cookies: Cookies diff --git a/themes/cypress/languages/ru.yml b/themes/cypress/languages/ru.yml index 9b45ccf99c..29fb9513cc 100644 --- a/themes/cypress/languages/ru.yml +++ b/themes/cypress/languages/ru.yml @@ -51,6 +51,7 @@ sidebar: parallelization: Параллелизация environment-variables: Переменные среды launching-browsers: Запуск браузеров + cross-browser-testing: Cross Browser Testing custom-commands: Пользовательские команды web-security: Web-безопасность references: Ссылки @@ -176,6 +177,8 @@ sidebar: cypress-api: Cypress API config: config env: env + isbrowser: isBrowser + isbrowsertype: isBrowserType iscy: isCy custom-commands: Commands cookies: Cookies diff --git a/themes/cypress/languages/zh-cn.yml b/themes/cypress/languages/zh-cn.yml index 670bfa8134..873fee4903 100644 --- a/themes/cypress/languages/zh-cn.yml +++ b/themes/cypress/languages/zh-cn.yml @@ -53,6 +53,7 @@ sidebar: parallelization: 并行化 environment-variables: 环境变量 launching-browsers: 启动浏览器 + cross-browser-testing: 跨浏览器测试 custom-commands: 自定义命令 web-security: Web安全 references: 参考 @@ -178,6 +179,8 @@ sidebar: cypress-api: Cypress API config: config env: env + isbrowser: isBrowser + isbrowsertype: isBrowserType iscy: isCy custom-commands: Commands cookies: Cookies diff --git a/themes/cypress/source/img/guides/cross-browser-testing/cypress-browser-selector.png b/themes/cypress/source/img/guides/cross-browser-testing/cypress-browser-selector.png new file mode 100644 index 0000000000000000000000000000000000000000..ac2a494a59880d7b56cb91df1bb81cb22a46564e GIT binary patch literal 145688 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 literal 0 HcmV?d00001 From 460f50da3d9ed4a7b2a56f5e0ab0386f7fe76634 Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Wed, 29 Jan 2020 16:11:00 +0630 Subject: [PATCH 21/73] remove Node from textlint rules --- .textlintrc | 1 - 1 file changed, 1 deletion(-) diff --git a/.textlintrc b/.textlintrc index c551ade462..3a66b77781 100644 --- a/.textlintrc +++ b/.textlintrc @@ -41,7 +41,6 @@ "Lodash", "minimatch", "Mocha", - ["node.js", "Node"], "node module", "npm", ["React[ .]js", "React"], From fd59fa9ae8777a07f1e61b9b4c5f33171a834c39 Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Wed, 29 Jan 2020 16:12:16 +0630 Subject: [PATCH 22/73] Begin writing changelog for 4.0 --- source/_changelogs/4.0.0.md | 50 ++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/source/_changelogs/4.0.0.md b/source/_changelogs/4.0.0.md index 7362cebf54..6000d619c8 100644 --- a/source/_changelogs/4.0.0.md +++ b/source/_changelogs/4.0.0.md @@ -1,13 +1,61 @@ # 4.0.0 -*Released X/X/2019* +*Released X/X/2020* + +**Summary:** **Breaking Changes:** +Please read our {% url "Migration Guide" migration-guide %} which explains the changes in more detail and how to change your code to migrate to Cypress 4.0. + +- The minimum Node.js version supported by Cypress is now Node.js 8. {% url "Full explanation here." migration-guide#Node-js-8-support %}. Addresses {% issue 5632 %}. +- Due to upgrading Mocha, invoking a `done` callback and returning a promise in a test now results in an error. {% url "Full explanation here." migration-guide#Mocha-upgrade-changes %} Addresses {% issue 2528 %}. +- Chai has been upgraded which includes a number of breaking changes and new features fully outlined in {% url "Chai's migration guide" https://github.com/chaijs/chai/issues/781 %}. {% url "Full explanation here." migration-guide#Chai-upgrade-changes %} Addresses {% issue 2529 %}. +- Sinon.JS has been upgraded which includes a number of breaking changes and new features fully outlined in {% url "Sinon's migration guides" https://sinonjs.org/releases/latest/#migration-guides %}. {% url "Full explanation here." migration-guide#Sinon-JS-upgrade-changes %} Addresses {% issue 2866 %}. +- Cypress no longer support CJSX. {% url "Full explanation here." migration-guide#CJSX-is-no-longer-supported %} Addresses {% issue 3469 %}. +- {% url "`cy.writeFile()`" writefile %} now yields `null` instead of the contents written to the file in order to more align with the behavior of `fs`. {% url "Full explanation here." migration-guide.html#cy-writeFile-yields-null %} Addresses {% issue 2466 %}. + **Features:** **Bugfixes:** +- cy.writeFile should resolve to null https://github.com/cypress-io/cypress/issues/2466 +- Any argument in Mocha callback cause the test to run forever https://github.com/cypress-io/cypress/issues/4805 +- assert.isFinite() is not a function https://github.com/cypress-io/cypress/issues/5669 +- expect(map).to.be.empty does not behave naturally https://github.com/cypress-io/cypress/issues/6072 +- 'Nested' assertions not working in 3.4.1 https://github.com/cypress-io/cypress/issues/5004 https://github.com/cypress-io/cypress/issues/3080 +- Adding `.only` to multiple tests only runs the last one https://github.com/cypress-io/cypress/issues/2828 +- Mocha's afterEach is missing "this" https://github.com/cypress-io/cypress/issues/3895 +- describe.only() does not work when string is the same as another describe() block https://github.com/cypress-io/cypress/issues/5345 +- Unable to use `nested` property in Cypress https://github.com/cypress-io/cypress/issues/3080 + **Misc:** **Dependency Updates** + +- Added `@benmalka/foxdriver`. Addressed in {% PR 1359 %}. +- Upgraded `@cypress/browserify-preprocessor` from `1.1.2` to `2.1.1`. Addressed in {% PR 4308 %} and {% PR 4226 %}. +- Upgraded `bluebird` from `3.5.0` to `3.7.2`. Addressed in {% PR 4226 %}. +- Upgraded `cachedir` from `1.3.0` to `2.3.0`. Addressed in {% PR 4208 %} and {% PR 4226 %}. +- Upgraded `chai` from `3.5.0` to `4.2.0`. Addressed in {% PR 2862 %} and {% PR 4226 %}. +- Upgraded `chai-as-promised` from `6.0.0` to `7.1.1`. Addressed in {% PR 4226 %}. +- Upgraded `chalk` from `2.4.0` to `3.0.0`. Addressed in {% PR 4226 %}. +- Upgraded `commander` from `2.15.1` to `4.0.1`. Addressed in {% PR 4208 %} and {% PR 4226 %}. +- Upgraded `debug` from `2.15.1` to `4.0.1`. Addressed in {% PR 4226 %}. +- Upgraded `execa` from `0.10.0` to `3.3.0`. Addressed in {% PR 4226 %}. +- Added `firefox-profiler`. Addressed in {% PR 1359 %}. +- Added `foxdriver`. Addressed in {% PR 1359 %}. +- Upgraded `fs-extra` from `5.0.0` to `8.1.0`. Addressed in {% PR 4226 %}. +- Upgraded `getos` from `3.1.1` to `3.1.4`. Addressed in {% PR 4226 %}. +- Upgraded `is-ci` from `1.2.1` to `2.0.0`. Addressed in {% PR 4226 %}. +- Upgraded `is-installed-globally` from `0.1.0` to `0.3.1`. Addressed in {% PR 4226 %}. +- Upgraded `mocha` from `2.5.3` to `6.2.2`. Addressed in {% PR 2703 %} and {% PR 4226 %}. +- Upgraded `listr` from `0.12.0` to `0.14.3`. Addressed in {% PR 4226 %}. +- Upgraded `log-symbols` from `2.2.0` to `3.0.0`. Addressed in {% PR 4226 %}. +- Added `marionette-client`. Addressed in {% PR 1359 %}. +- Upgraded `ramda` from `0.24.1` to `0.26.1`. Addressed in {% PR 4226 %}. +- Upgraded `sinon` from `3.2.0` to `7.5.0`. Addressed in {% PR 2881 %} and {% PR 4226 %}. +- Upgraded `strip-ansi` from `3.0.1` to `6.0.0`. Addressed in {% PR 1359 %}. +- Added `systeminformation`. Addressed in {% PR 1359 %}. +- Upgraded `support-colors` from `5.5.0` to `7.1.0`. Addressed in {% PR 4208 %} and {% PR 4226 %}. +- Upgraded `untildify` from `3.0.3` to `4.0.0`. Addressed in {% PR 4226 %}. From bf753c29646a83ab565fff01d68bbc64e69d6210 Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Wed, 29 Jan 2020 16:12:37 +0630 Subject: [PATCH 23/73] Fix broken examples for writeFile yields change + add to migration guide --- source/api/commands/writefile.md | 16 +++++----- source/guides/references/migration-guide.md | 33 ++++++++++++++++++--- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/source/api/commands/writefile.md b/source/api/commands/writefile.md index e469b80ef2..7271eabc6f 100644 --- a/source/api/commands/writefile.md +++ b/source/api/commands/writefile.md @@ -73,11 +73,10 @@ To use encoding with other options, have your options object be your third param If the path to the file does not exist, the file and its path will be created. If the file already exists, it will be over-written. ```javascript -cy - .writeFile('path/to/message.txt', 'Hello World') - .then((text) => { - expect(text).to.equal('Hello World') // true - }) +cy.writeFile('path/to/message.txt', 'Hello World') +cy.readFile('path/to/message.txt').then((text) => { + expect(text).to.equal('Hello World') // true +}) ``` `{projectRoot}/path/to/message.txt` will be created with the following contents: @@ -94,9 +93,9 @@ JavaScript arrays and objects are stringified and formatted into text. ```javascript cy.writeFile('path/to/data.json', { name: 'Eliza', email: 'eliza@example.com' }) - .then((user) => { - expect(user.name).to.equal('Eliza') - }) +cy.readFile('path/to/data.json').then((user) => { + expect(user.name).to.equal('Eliza') // true +}) ``` `{projectRoot}/path/to/data.json` will be created with the following contents: @@ -180,6 +179,7 @@ When clicking on the `writeFile` command within the command log, the console out {% imgTag /img/api/writefile/console-log-shows-contents-written-to-file.png "Console Log writeFile" %} {% history %} +{% url "4.0.0" changelog#4-0-0 %} | `cy.writeFile()` now yields `null` instead of `contents` {% url "3.1.1" changelog#3-1-1 %} | Added `flag` option and appending with `a+` {% url "1.0.0" changelog#1.0.0 %} | `cy.writeFile()` command added {% endhistory %} diff --git a/source/guides/references/migration-guide.md b/source/guides/references/migration-guide.md index c76d3f9448..5603f193fe 100644 --- a/source/guides/references/migration-guide.md +++ b/source/guides/references/migration-guide.md @@ -6,9 +6,9 @@ title: Migration Guide Changes in Cypress 4.0 mainly relate to upgrading Cypress's own dependencies, which themselves have breaking changes. This guide details the changes and how to change your code to migrate to Cypress 4.0. -## Node 8+ support +## Node.js 8+ support -Node 4 reached its end of life on April 30, 2018 and Node 6 reached its end of life on April 30, 2019. {% url "See Node's release schedule" https://github.com/nodejs/Release %}. These Node versions will no longer be supported. The minimum Node version supported by Cypress is Node 8. +Node.js 4 reached its end of life on April 30, 2018 and Node.js 6 reached its end of life on April 30, 2019. {% url "See Node's release schedule" https://github.com/nodejs/Release %}. These Node.js versions will no longer be supported. The minimum Node.js version supported by Cypress is Node.js 8. ## Mocha upgrade changes @@ -87,7 +87,7 @@ it('uses async/await', async function (done) { }) ``` -{% badge danger Before %} Update to the test code below. +{% badge success After %} Update to the test code below. ```javascript it('uses async/await', async function () { @@ -136,7 +136,7 @@ expect(true).to.be.ture ## Sinon.JS upgrade changes -Sinon.JS has been upgraded to Sinon.JS 7 with some [breaking changes](https://sinonjs.org/releases/v7.1.1/#migration-guides). +Sinon.JS has been upgraded to Sinon.JS 7 with some [breaking changes](https://sinonjs.org/releases/latest/#migration-guides). ### Example #1 @@ -191,3 +191,28 @@ module.exports = (on) => { on('file:preprocessor', browserify()) } ``` + +## `cy.writeFile()` yields `null` + +`cy.writeFile()` now yields `null` instead of the `contents` written to the file. This change was made to more closely align with the behavior of Node.js {% url "`fs.writeFile`" https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback %}. + +### Example #1 + +{% badge danger Before %} This assertion will no longer pass + +```js +cy.writeFile('path/to/message.txt', 'Hello World') + .then((text) => { + // Would pass in Cypress 3 but will fail in 4 + expect(text).to.equal('Hello World') // false + }) +``` + +{% badge success After %} Read the contents of the file + +```js +cy.writeFile('path/to/message.txt', 'Hello World') +cy.readFile('path/to/message.txt').then((text) => { + expect(text).to.equal('Hello World') // true +}) +``` From 7e7f98af006d015263bc634554d0933188b77f8c Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Wed, 29 Jan 2020 16:34:11 +0630 Subject: [PATCH 24/73] Write descriptions of features / bugfixes relating to issues in Changelog. --- source/_changelogs/4.0.0.md | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/source/_changelogs/4.0.0.md b/source/_changelogs/4.0.0.md index 6000d619c8..5b116b45f7 100644 --- a/source/_changelogs/4.0.0.md +++ b/source/_changelogs/4.0.0.md @@ -8,7 +8,7 @@ Please read our {% url "Migration Guide" migration-guide %} which explains the changes in more detail and how to change your code to migrate to Cypress 4.0. -- The minimum Node.js version supported by Cypress is now Node.js 8. {% url "Full explanation here." migration-guide#Node-js-8-support %}. Addresses {% issue 5632 %}. +- The minimum Node.js version supported by Cypress is now Node 8. {% url "Full explanation here." migration-guide#Node-js-8-support %}. Addresses {% issue 5632 %}. - Due to upgrading Mocha, invoking a `done` callback and returning a promise in a test now results in an error. {% url "Full explanation here." migration-guide#Mocha-upgrade-changes %} Addresses {% issue 2528 %}. - Chai has been upgraded which includes a number of breaking changes and new features fully outlined in {% url "Chai's migration guide" https://github.com/chaijs/chai/issues/781 %}. {% url "Full explanation here." migration-guide#Chai-upgrade-changes %} Addresses {% issue 2529 %}. - Sinon.JS has been upgraded which includes a number of breaking changes and new features fully outlined in {% url "Sinon's migration guides" https://sinonjs.org/releases/latest/#migration-guides %}. {% url "Full explanation here." migration-guide#Sinon-JS-upgrade-changes %} Addresses {% issue 2866 %}. @@ -17,17 +17,14 @@ Please read our {% url "Migration Guide" migration-guide %} which explains the c **Features:** +- Apending `.only` to multiple test functions will now run all tests with the `.only` property. Addresses {% issue 2828 %}. +- The {% url "`isFinite` assertion" assertions %} is now supported. Addresses {% issue 5669 %}. +- The `empty` assertion is now supported when used against Map objects. Addresses {% issue 6072 %}. +- The `nested` chainer property is now supported. Addresses {% issue 3080 %} and {% issue 5004 %}. + **Bugfixes:** -- cy.writeFile should resolve to null https://github.com/cypress-io/cypress/issues/2466 -- Any argument in Mocha callback cause the test to run forever https://github.com/cypress-io/cypress/issues/4805 -- assert.isFinite() is not a function https://github.com/cypress-io/cypress/issues/5669 -- expect(map).to.be.empty does not behave naturally https://github.com/cypress-io/cypress/issues/6072 -- 'Nested' assertions not working in 3.4.1 https://github.com/cypress-io/cypress/issues/5004 https://github.com/cypress-io/cypress/issues/3080 -- Adding `.only` to multiple tests only runs the last one https://github.com/cypress-io/cypress/issues/2828 -- Mocha's afterEach is missing "this" https://github.com/cypress-io/cypress/issues/3895 -- describe.only() does not work when string is the same as another describe() block https://github.com/cypress-io/cypress/issues/5345 -- Unable to use `nested` property in Cypress https://github.com/cypress-io/cypress/issues/3080 +- Cypress now correctly runs the test or suite appended with an `.only` when multiple tests or suites contained the same title. Fixes {% issue 5345 %}. **Misc:** From a24236120a0690fd6417037bed9e297b48925185 Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Wed, 29 Jan 2020 16:37:07 +0630 Subject: [PATCH 25/73] remove isbrowsertype doc per changes in Firefox branch. --- source/_data/sidebar.yml | 1 - source/api/cypress-api/isbrowsertype.md | 48 ------------------------- themes/cypress/languages/en.yml | 1 - themes/cypress/languages/ja.yml | 1 - themes/cypress/languages/pt-br.yml | 1 - themes/cypress/languages/ru.yml | 1 - themes/cypress/languages/zh-cn.yml | 1 - 7 files changed, 54 deletions(-) delete mode 100644 source/api/cypress-api/isbrowsertype.md diff --git a/source/_data/sidebar.yml b/source/_data/sidebar.yml index 1de52c92c1..ac40c485c7 100644 --- a/source/_data/sidebar.yml +++ b/source/_data/sidebar.yml @@ -163,7 +163,6 @@ api: dom: dom.html env: env.html isbrowser: isbrowser.html - isbrowsertype: isbrowsertype.html iscy: iscy.html cypress-log: cypress-log.html platform: platform.html diff --git a/source/api/cypress-api/isbrowsertype.md b/source/api/cypress-api/isbrowsertype.md deleted file mode 100644 index 3a642004a3..0000000000 --- a/source/api/cypress-api/isbrowsertype.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Cypress.isBrowserType -comments: false ---- - -`Cypress.isBrowserType` returns true if the current browser is of the type of the name passed or false if it does not. The name is case-insensitive. - -These browsers will return true for `Cypress.isBrowserType('chrome')`: - -* Chrome -* Canary -* Chromium -* Electron - -These browsers will return true for `Cypress.isBrowserType('firefox')`: - -* Firefox -* Firefox Developer Edition -* Firefox Nightly - -# Syntax - -```javascript -// while running in Chrome -Cypress.isBrowserType('chrome') // true -Cypress.isBrowserType('Chrome') // true -Cypress.isBrowserType('firefox') // false - -// while running in Canary -Cypress.isBrowserType('chrome') // true -Cypress.isBrowserType('firefox') // false - -// while running Firefox Nightly -Cypress.isBrowserType('firefox') // true -Cypress.isBrowserType('chrome') // false -``` - -# Examples - -## Conditionals - -```javascript -if (Cypress.isBrowserType('chrome')) { - it('only runs in chrome-based browser', function () { - // test some (hypothetical) issue with chrome-based browsers - }) -} -``` \ No newline at end of file diff --git a/themes/cypress/languages/en.yml b/themes/cypress/languages/en.yml index 67c680116f..ae05bd3340 100644 --- a/themes/cypress/languages/en.yml +++ b/themes/cypress/languages/en.yml @@ -178,7 +178,6 @@ sidebar: config: config env: env isbrowser: isBrowser - isbrowsertype: isBrowserType iscy: isCy custom-commands: Commands cookies: Cookies diff --git a/themes/cypress/languages/ja.yml b/themes/cypress/languages/ja.yml index 916047e1fe..a1b64b25a0 100644 --- a/themes/cypress/languages/ja.yml +++ b/themes/cypress/languages/ja.yml @@ -178,7 +178,6 @@ sidebar: config: config env: env isbrowser: isBrowser - isbrowsertype: isBrowserType iscy: isCy custom-commands: Commands cookies: Cookies diff --git a/themes/cypress/languages/pt-br.yml b/themes/cypress/languages/pt-br.yml index 82ebbd0e4d..ab3a7e608a 100644 --- a/themes/cypress/languages/pt-br.yml +++ b/themes/cypress/languages/pt-br.yml @@ -178,7 +178,6 @@ sidebar: config: config env: env isbrowser: isBrowser - isbrowsertype: isBrowserType iscy: isCy custom-commands: Commands cookies: Cookies diff --git a/themes/cypress/languages/ru.yml b/themes/cypress/languages/ru.yml index 29fb9513cc..daf49be6b9 100644 --- a/themes/cypress/languages/ru.yml +++ b/themes/cypress/languages/ru.yml @@ -178,7 +178,6 @@ sidebar: config: config env: env isbrowser: isBrowser - isbrowsertype: isBrowserType iscy: isCy custom-commands: Commands cookies: Cookies diff --git a/themes/cypress/languages/zh-cn.yml b/themes/cypress/languages/zh-cn.yml index 873fee4903..8db469fe9b 100644 --- a/themes/cypress/languages/zh-cn.yml +++ b/themes/cypress/languages/zh-cn.yml @@ -180,7 +180,6 @@ sidebar: config: config env: env isbrowser: isBrowser - isbrowsertype: isBrowserType iscy: isCy custom-commands: Commands cookies: Cookies From c47f02836ae33ac56becadf11239a9fda53ee805 Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Wed, 29 Jan 2020 16:56:11 +0630 Subject: [PATCH 26/73] Improve the isBrowser doc --- source/api/cypress-api/isbrowser.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/source/api/cypress-api/isbrowser.md b/source/api/cypress-api/isbrowser.md index f7a1ec8c2e..a0973a5db4 100644 --- a/source/api/cypress-api/isbrowser.md +++ b/source/api/cypress-api/isbrowser.md @@ -1,6 +1,5 @@ --- title: Cypress.isBrowser -comments: false --- `Cypress.isBrowser` returns `true` if the current browser matches the name passed or `false` if it does not. The name is case-insensitive. @@ -15,6 +14,12 @@ Cypress.isBrowser('firefox') // false Cypress.isBrowser('canary') // false ``` +## Arguments + +**{% fa fa-angle-right %} name** ***(String)*** + +The name of the browser to check against. + # Examples ## Conditionals @@ -26,3 +31,14 @@ if (Cypress.isBrowser('chrome')) { }) } ``` + +{% history %} +{% url "4.0.0" changelog#4-0-0 %} | Added `isBrowser` command. +{% endhistory %} + +# See also + +- {% url "Browser Launch API" browser-launch-api %} +- {% url "Cross Browser Testing" cross-browser-testing %} +- {% url "`Cypress.browser`" browser %} +- {% url "Launching Browsers" launching-browsers %} From 22f1343dd97140fbad9cb163d80345731430241a Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Wed, 29 Jan 2020 17:11:48 +0630 Subject: [PATCH 27/73] Add a summary and features for browser support. --- source/_changelogs/4.0.0.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_changelogs/4.0.0.md b/source/_changelogs/4.0.0.md index 5b116b45f7..8e009ef534 100644 --- a/source/_changelogs/4.0.0.md +++ b/source/_changelogs/4.0.0.md @@ -4,6 +4,8 @@ **Summary:** +Cypress 4.0.0 includes support for {% url "Mozilla Firefox" https://www.mozilla.org/firefox/ %} and {% url "Microsoft Edge" https://www.microsoft.com/edge %} browsers which is a big step forward for {% url "Cross Browser Testing" cross-browser-testing %} in Cypress. We've also updated many of the {% url "underlying tools" bundled-tools %} behind Cypress that bring new powerful features. + **Breaking Changes:** Please read our {% url "Migration Guide" migration-guide %} which explains the changes in more detail and how to change your code to migrate to Cypress 4.0. @@ -17,10 +19,13 @@ Please read our {% url "Migration Guide" migration-guide %} which explains the c **Features:** +- {% url "Mozilla Firefox" https://www.mozilla.org/firefox/ %} browsers are now supported in Cypress. Addresses {% issue 1096 %}. +- {% url "Microsoft Edge" https://www.microsoft.com/edge %} browsers are now supported in Cypress. Addresses {% issue 5433 %}. - Apending `.only` to multiple test functions will now run all tests with the `.only` property. Addresses {% issue 2828 %}. - The {% url "`isFinite` assertion" assertions %} is now supported. Addresses {% issue 5669 %}. - The `empty` assertion is now supported when used against Map objects. Addresses {% issue 6072 %}. - The `nested` chainer property is now supported. Addresses {% issue 3080 %} and {% issue 5004 %}. +- Added a {% url "`Cypress.isBrowser()`" isbrowser %} command. Addresses {% issue 2023 %}. **Bugfixes:** From 7e6298f9afe0dce2f9f786bb62964eb2c545ed26 Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Thu, 30 Jan 2020 15:48:46 +0630 Subject: [PATCH 28/73] Make updates based off of feedback for migration guide + changelog --- source/_changelogs/4.0.0.md | 4 +- source/api/plugins/browser-launch-api.md | 2 +- .../getting-started/installing-cypress.md | 4 ++ source/guides/guides/launching-browsers.md | 4 +- source/guides/references/migration-guide.md | 44 +++++++++---------- 5 files changed, 31 insertions(+), 27 deletions(-) diff --git a/source/_changelogs/4.0.0.md b/source/_changelogs/4.0.0.md index 8e009ef534..e7f2caa821 100644 --- a/source/_changelogs/4.0.0.md +++ b/source/_changelogs/4.0.0.md @@ -4,7 +4,7 @@ **Summary:** -Cypress 4.0.0 includes support for {% url "Mozilla Firefox" https://www.mozilla.org/firefox/ %} and {% url "Microsoft Edge" https://www.microsoft.com/edge %} browsers which is a big step forward for {% url "Cross Browser Testing" cross-browser-testing %} in Cypress. We've also updated many of the {% url "underlying tools" bundled-tools %} behind Cypress that bring new powerful features. +Cypress 4.0.0 includes support for {% url "Mozilla Firefox" https://www.mozilla.org/firefox/ %} and {% url "Microsoft Edge" https://www.microsoft.com/edge %} (Chromium based) browsers which is a big step forward for {% url "Cross Browser Testing" cross-browser-testing %} in Cypress. We've also updated many of the {% url "underlying tools" bundled-tools %} behind Cypress that bring new powerful features. **Breaking Changes:** @@ -20,7 +20,7 @@ Please read our {% url "Migration Guide" migration-guide %} which explains the c **Features:** - {% url "Mozilla Firefox" https://www.mozilla.org/firefox/ %} browsers are now supported in Cypress. Addresses {% issue 1096 %}. -- {% url "Microsoft Edge" https://www.microsoft.com/edge %} browsers are now supported in Cypress. Addresses {% issue 5433 %}. +- {% url "Microsoft Edge" https://www.microsoft.com/edge %} (Chromium based) browsers are now supported in Cypress. Addresses {% issue 5433 %}. - Apending `.only` to multiple test functions will now run all tests with the `.only` property. Addresses {% issue 2828 %}. - The {% url "`isFinite` assertion" assertions %} is now supported. Addresses {% issue 5669 %}. - The `empty` assertion is now supported when used against Map objects. Addresses {% issue 6072 %}. diff --git a/source/api/plugins/browser-launch-api.md b/source/api/plugins/browser-launch-api.md index 4fe4e7ab0e..8ba9d7ba2a 100644 --- a/source/api/plugins/browser-launch-api.md +++ b/source/api/plugins/browser-launch-api.md @@ -20,7 +20,7 @@ This event will yield you the `browser` as an object, and `args` which are the d Here are options for the currently supported browsers: -* {% url 'Chrome, Chromium, Canary, or Microsoft Edge browsers' "https://peter.sh/experiments/chromium-command-line-switches/" %} +* {% url 'Chrome, Chromium, Canary, or Microsoft Edge (Chromium based) browsers' "https://peter.sh/experiments/chromium-command-line-switches/" %} * {% url 'Firefox' "http://kb.mozillazine.org/About:config_entries" %} * {% url 'Electron' "https://github.com/electron/electron/blob/master/docs/api/browser-window.md#new-browserwindowoptions" %} diff --git a/source/guides/getting-started/installing-cypress.md b/source/guides/getting-started/installing-cypress.md index ddc6764e4b..dd6bd1d495 100644 --- a/source/guides/getting-started/installing-cypress.md +++ b/source/guides/getting-started/installing-cypress.md @@ -19,6 +19,10 @@ Cypress is a desktop application that is installed on your computer. The desktop - **Linux** Ubuntu 12.04 and above, Fedora 21 and Debian 8 *(64-bit only)* - **Windows** 7 and above +If using `npm` to install Cypress, we support: + +- **Node.js** 8 and above + # Installing ## {% fa fa-terminal %} `npm install` diff --git a/source/guides/guides/launching-browsers.md b/source/guides/guides/launching-browsers.md index 9227bfce7b..4724e0c98a 100644 --- a/source/guides/guides/launching-browsers.md +++ b/source/guides/guides/launching-browsers.md @@ -68,7 +68,7 @@ Or Chrome Canary: cypress run --browser canary ``` -Or Microsoft Edge: +Or Microsoft Edge (Chromium-based): ```shell cypress run --browser edge @@ -137,7 +137,7 @@ When you open the Test Runner in a project that uses the above modifications to If you return an empty list of browsers or `browsers: null`, the default list will be restored automatically. {% endnote %} -If you have installed a Chromium-based browser like {% url Brave https://brave.com/ %}, {% url Vivaldi https://vivaldi.com/ %} and even the new {% url "Microsoft Edge Beta" https://www.microsoftedgeinsider.com/en-us/ %} you can add them to the list of returned browsers. Here is a plugins file that inserts a local Brave browser into the returned list. +If you have installed a Chromium-based browser like {% url Brave https://brave.com/ %}, {% url Vivaldi https://vivaldi.com/ %} you can add them to the list of returned browsers. Here is a plugins file that inserts a local Brave browser into the returned list. ```javascript // cypress/plugins/index.js diff --git a/source/guides/references/migration-guide.md b/source/guides/references/migration-guide.md index 5603f193fe..84c3df24b7 100644 --- a/source/guides/references/migration-guide.md +++ b/source/guides/references/migration-guide.md @@ -6,13 +6,11 @@ title: Migration Guide Changes in Cypress 4.0 mainly relate to upgrading Cypress's own dependencies, which themselves have breaking changes. This guide details the changes and how to change your code to migrate to Cypress 4.0. -## Node.js 8+ support - -Node.js 4 reached its end of life on April 30, 2018 and Node.js 6 reached its end of life on April 30, 2019. {% url "See Node's release schedule" https://github.com/nodejs/Release %}. These Node.js versions will no longer be supported. The minimum Node.js version supported by Cypress is Node.js 8. +## Mocha upgrade -## Mocha upgrade changes +Mocha was upgraded from `2.5.3` to `6.2.2`, which includes a number of breaking changes and new features outlined in their {% url "changelog" https://github.com/mochajs/mocha/blob/master/CHANGELOG.md#622--2019-10-18 %}. Some changes you might notice are described below. -Mocha has been upgraded to Mocha 7. +### {% fa fa-warning red %} Breaking Change: invoke `done` callback and return a promise Starting with [Mocha 3.0.0](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md#300--2016-07-31), invoking a `done` callback *and* returning a promise in a test results in an error. @@ -22,7 +20,7 @@ The reason is that using two different ways to signal that a test is finished is In the meantime, you can fix the error by choosing a single way to signal the end of your test's execution. -### Example #1 +#### Example #1 {% badge danger Before %} This test has a done callback and a promise @@ -45,7 +43,7 @@ it('uses invokes done and returns promise', function () { }) ``` -### Example #2 +#### Example #2 {% badge danger Before %} Sometimes it might make more sense to use the `done` callback and not return a promise: @@ -73,7 +71,7 @@ it('uses invokes done and returns promise', function (done) { }) ``` -### Example #3 +#### Example #3 Test functions using `async/await` automatically return a promise, so they need to be refactored to not use a `done` callback. @@ -99,11 +97,11 @@ it('uses async/await', async function () { }) ``` -## Chai upgrade changes +## Chai upgrade -Chai has been upgraded to Chai 4, which includes a number of breaking changes and new features outlined in [Chai's migration guide](https://github.com/chaijs/chai/issues/781). Some changes you might notice include: +Mocha was upgraded from `3.5.0` to `4.3.0`, which includes a number of breaking changes and new features outlined in {% url "Chai's migration guide" https://github.com/chaijs/chai/issues/781 %}. Some changes you might notice are described below. -### Example #1 +### {% fa fa-warning red %} Breaking Change: assertions expecting numbers Some assertions will now throw an error if the assertion's target or arguments are not numbers, including `within`, `above`, `least`, `below`, `most`, `increase` and `decrease`. @@ -115,7 +113,7 @@ expect(null).to.be.above(10) expect('string').to.have.a.length.of.at.least(3) ``` -### Example #2 +### {% fa fa-warning red %} Breaking Change: `empty` assertions The `.empty` assertion will now throw when it is passed non-string primitives and functions. @@ -125,7 +123,7 @@ expect(Symbol()).to.be.empty expect(function() {}).to.be.empty ``` -### Example #3 +### {% fa fa-warning red %} Breaking Change: non-existent properties An error will throw when a non-existent property is read. If there are typos in property assertions, they will now appear as failures. @@ -134,11 +132,11 @@ An error will throw when a non-existent property is read. If there are typos in expect(true).to.be.ture ``` -## Sinon.JS upgrade changes +## Sinon.JS upgrade -Sinon.JS has been upgraded to Sinon.JS 7 with some [breaking changes](https://sinonjs.org/releases/latest/#migration-guides). +Sinon.JS was upgraded from `3.2.0` to `7.5.0`, which includes a number of breaking changes and new features outlined in {% url "Sinon.JS's migration guide" https://sinonjs.org/releases/latest/#migration-guides %}. Some changes you might notice are described below. -### Example #1 +### {% fa fa-warning red %} Breaking Change: stub non-existent properties An error will throw when trying to stub a non-existent property. @@ -147,7 +145,7 @@ An error will throw when trying to stub a non-existent property. cy.stub(obj, 'nonExistingProperty') ``` -### Example #2 +### {% fa fa-warning red %} Breaking Change: `reset()` replaced by `resetHistory()` For spies and stubs, the `reset()` method was replaced by `resetHistory()`. @@ -175,8 +173,6 @@ stub.resetHistory() Cypress no longer supports CJSX (CoffeeScript + JSX), because the library used to transpile it is no longer maintained. -### Example #1 - If you need CJSX support, you can use a pre-2.x version of the Browserify preprocessor. ```shell @@ -196,8 +192,6 @@ module.exports = (on) => { `cy.writeFile()` now yields `null` instead of the `contents` written to the file. This change was made to more closely align with the behavior of Node.js {% url "`fs.writeFile`" https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback %}. -### Example #1 - {% badge danger Before %} This assertion will no longer pass ```js @@ -208,7 +202,7 @@ cy.writeFile('path/to/message.txt', 'Hello World') }) ``` -{% badge success After %} Read the contents of the file +{% badge success After %} Instead read the contents of the file ```js cy.writeFile('path/to/message.txt', 'Hello World') @@ -216,3 +210,9 @@ cy.readFile('path/to/message.txt').then((text) => { expect(text).to.equal('Hello World') // true }) ``` + +## Node.js 8+ support + +Cypress comes bundled with it's own {% url "Node.js version" https://github.com/cypress-io/cypress/blob/develop/.node-version %}. But, installing Cypress on your system uses the Node.js version installed on your system. + +Node.js 4 reached its end of life on April 30, 2018 and Node.js 6 reached its end of life on April 30, 2019. {% url "See Node's release schedule" https://github.com/nodejs/Release %}. These Node.js versions will no longer be supported when installing Cypress. The minimum Node.js version supported to install Cypress is Node.js 8. From 43a3e522095b3abcd1386055dba244ece01c945e Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Thu, 30 Jan 2020 12:49:02 -0500 Subject: [PATCH 29/73] update migration guide version references --- source/guides/references/migration-guide.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/guides/references/migration-guide.md b/source/guides/references/migration-guide.md index 84c3df24b7..643af4c08e 100644 --- a/source/guides/references/migration-guide.md +++ b/source/guides/references/migration-guide.md @@ -8,7 +8,7 @@ Changes in Cypress 4.0 mainly relate to upgrading Cypress's own dependencies, wh ## Mocha upgrade -Mocha was upgraded from `2.5.3` to `6.2.2`, which includes a number of breaking changes and new features outlined in their {% url "changelog" https://github.com/mochajs/mocha/blob/master/CHANGELOG.md#622--2019-10-18 %}. Some changes you might notice are described below. +Mocha was upgraded from `2.5.3` to `7.0.1`, which includes a number of breaking changes and new features outlined in their {% url "changelog" https://github.com/mochajs/mocha/blob/master/CHANGELOG.md %}. Some changes you might notice are described below. ### {% fa fa-warning red %} Breaking Change: invoke `done` callback and return a promise @@ -99,7 +99,7 @@ it('uses async/await', async function () { ## Chai upgrade -Mocha was upgraded from `3.5.0` to `4.3.0`, which includes a number of breaking changes and new features outlined in {% url "Chai's migration guide" https://github.com/chaijs/chai/issues/781 %}. Some changes you might notice are described below. +Chai was upgraded from `3.5.0` to `4.2.0`, which includes a number of breaking changes and new features outlined in {% url "Chai's migration guide" https://github.com/chaijs/chai/issues/781 %}. Some changes you might notice are described below. ### {% fa fa-warning red %} Breaking Change: assertions expecting numbers @@ -134,7 +134,7 @@ expect(true).to.be.ture ## Sinon.JS upgrade -Sinon.JS was upgraded from `3.2.0` to `7.5.0`, which includes a number of breaking changes and new features outlined in {% url "Sinon.JS's migration guide" https://sinonjs.org/releases/latest/#migration-guides %}. Some changes you might notice are described below. +Sinon.JS was upgraded from `3.2.0` to `8.1.1`, which includes a number of breaking changes and new features outlined in {% url "Sinon.JS's migration guide" https://sinonjs.org/releases/latest/#migration-guides %}. Some changes you might notice are described below. ### {% fa fa-warning red %} Breaking Change: stub non-existent properties From 33427a9840ea5cd7352089f033f0cc0722323836 Mon Sep 17 00:00:00 2001 From: Jennifer Shehane Date: Fri, 31 Jan 2020 13:41:08 +0630 Subject: [PATCH 30/73] Update dep versions from latest changes. --- source/_changelogs/4.0.0.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_changelogs/4.0.0.md b/source/_changelogs/4.0.0.md index e7f2caa821..fbd29be5cf 100644 --- a/source/_changelogs/4.0.0.md +++ b/source/_changelogs/4.0.0.md @@ -51,12 +51,12 @@ Please read our {% url "Migration Guide" migration-guide %} which explains the c - Upgraded `getos` from `3.1.1` to `3.1.4`. Addressed in {% PR 4226 %}. - Upgraded `is-ci` from `1.2.1` to `2.0.0`. Addressed in {% PR 4226 %}. - Upgraded `is-installed-globally` from `0.1.0` to `0.3.1`. Addressed in {% PR 4226 %}. -- Upgraded `mocha` from `2.5.3` to `6.2.2`. Addressed in {% PR 2703 %} and {% PR 4226 %}. +- Upgraded `mocha` from `2.5.3` to `7.0.1`. Addressed in {% PR 2703 %} and {% PR 4226 %}. - Upgraded `listr` from `0.12.0` to `0.14.3`. Addressed in {% PR 4226 %}. - Upgraded `log-symbols` from `2.2.0` to `3.0.0`. Addressed in {% PR 4226 %}. - Added `marionette-client`. Addressed in {% PR 1359 %}. - Upgraded `ramda` from `0.24.1` to `0.26.1`. Addressed in {% PR 4226 %}. -- Upgraded `sinon` from `3.2.0` to `7.5.0`. Addressed in {% PR 2881 %} and {% PR 4226 %}. +- Upgraded `sinon` from `3.2.0` to `8.1.1`. Addressed in {% PR 2881 %} and {% PR 4226 %}. - Upgraded `strip-ansi` from `3.0.1` to `6.0.0`. Addressed in {% PR 1359 %}. - Added `systeminformation`. Addressed in {% PR 1359 %}. - Upgraded `support-colors` from `5.5.0` to `7.1.0`. Addressed in {% PR 4208 %} and {% PR 4226 %}. From b455acae2c7cc398606e9b24c02bbcf087f83505 Mon Sep 17 00:00:00 2001 From: Kukhyeon Heo Date: Fri, 31 Jan 2020 16:24:07 +0900 Subject: [PATCH 31/73] Cypress issue#92: cy.contains() doc. (#2397) * New option for cy.contains() * Added migration guide for cy.contains(). * Added more documentation for contains(). * Fixed wording. * Fix typo. --- source/api/commands/contains.md | 47 ++++++++++++++++++ source/guides/references/migration-guide.md | 14 ++++++ .../api/contains/contains-pre-exception.png | Bin 0 -> 7902 bytes 3 files changed, 61 insertions(+) create mode 100644 themes/cypress/source/img/api/contains/contains-pre-exception.png diff --git a/source/api/commands/contains.md b/source/api/commands/contains.md index bce931a894..fb9a71e9b2 100644 --- a/source/api/commands/contains.md +++ b/source/api/commands/contains.md @@ -52,6 +52,7 @@ Pass in an options object to change the default behavior of `.contains()`. Option | Default | Description --- | --- | --- +`matchCase` | `true` | Check case sensitivity `log` | `true` | {% usage_options log %} `timeout` | {% url `defaultCommandTimeout` configuration#Timeouts %} | {% usage_options timeout .contains %} @@ -186,6 +187,19 @@ cy.get('form') // yields
...
Without the explicit selector the subject would change to be the `