diff --git a/.node-version b/.node-version
index acd405b1d6..a8759e7438 100644
--- a/.node-version
+++ b/.node-version
@@ -1 +1 @@
-8.6.0
+8.16.0
\ No newline at end of file
diff --git a/.textlintrc b/.textlintrc
index 3a66b77781..26986269fa 100644
--- a/.textlintrc
+++ b/.textlintrc
@@ -15,6 +15,7 @@
["test runner", "Test Runner"],
// Brands and Technologies
+ ["ansi", "ANSI"],
"AppVeyor",
"Babel",
["^Blob(?! %)", "Blob"],
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 57b048ef0c..1438ecae1e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -12,6 +12,7 @@ Thanks for taking the time to contribute! :smile:
- [Adding Plugins](#adding-plugins)
- [Adding Pages](#adding-pages)
- [Writing the Changelog](#writing-the-changelog)
+ - [Translating](#translating)
- [Committing Code](#committing-code)
- [Linting](#linting)
- [Pull Requests](#pull-requests)
@@ -103,9 +104,19 @@ To add a page such as a new guide or API documentation:
- Link to your new page in the [`sidebar.yml`](/source/_data/sidebar.yml).
- Add translations for the sidebar link for each supported language (for English, this is located in [`en.yml`](/themes/cypress/languages/en.yml)).
- Build the documentation site locally so that you can visually inspect your new page and the links to it.
-- Commit the new file using git - we auto-generate the doc to display within each supported language, this auto-generation depends on the file existing in git.
+- **REQUIRED**: Commit the new file using git - we auto-generate the doc to display within each supported language, this auto-generation depends on the file existing in git.
- Submit a [pull request](#Pull-Requests) for your change.
+### Deleting Pages
+
+To delete a page:
+
+- Delete the page from the relevant directory under [`source`](/source).
+- Remove the link from the the [`sidebar.yml`](/source/_data/sidebar.yml).
+- Remove the translations for the sidebar link for each supported language (for English, this is located in [`en.yml`](/themes/cypress/languages/en.yml)).
+- **REQUIRED**: Commit the change using git - we auto-remove the doc within each supported language, this auto-generation depends on the file being deleted in git, the build will not work until this is commited.
+- Build the documentation site locally so that you can visually inspect and make sure it was properly deleted.
+
#### A Worked Example
Let's imagine that the Cypress team has just added a new command called `privateState` and you've picked up the task to document it.
diff --git a/circle.yml b/circle.yml
index 30ee00c53b..b0b04a6549 100644
--- a/circle.yml
+++ b/circle.yml
@@ -137,6 +137,9 @@ jobs:
path: cypress/screenshots
- store_artifacts:
path: npm-debug.log
+ # store NPM logs in case there was a problem
+ - store_artifacts:
+ path: ~/.npm/_logs
"deploy-docs-production":
<<: *defaults
@@ -150,6 +153,11 @@ jobs:
# use script that just deploys without rebuilding the production docs
- run: npm run deploy-prebuilt -- --environment production --scrape
- run: cat public/build.json
+ - store_artifacts:
+ path: npm-debug.log
+ # store NPM logs in case there was a problem
+ - store_artifacts:
+ path: ~/.npm/_logs
workflows:
version: 2
diff --git a/cy_scripts/deploy.js b/cy_scripts/deploy.js
index fd6b127ecf..0f06c37e38 100644
--- a/cy_scripts/deploy.js
+++ b/cy_scripts/deploy.js
@@ -88,7 +88,8 @@ function deployEnvironmentBranch (env, branch) {
checkBranchEnvFolder(branch)(env)
debug('uploading to S3 dist folder %s', distDir)
- uploadToS3(distDir, env)
+
+ return uploadToS3(distDir, env)
.then(() => scrapeDocs(env, branch))
.then(() => {
console.log(chalk.yellow('\n==============================\n'))
diff --git a/cy_scripts/scrape.js b/cy_scripts/scrape.js
index b7a091c1db..c5186021b4 100644
--- a/cy_scripts/scrape.js
+++ b/cy_scripts/scrape.js
@@ -33,6 +33,14 @@ function checkToken (token) {
}
function getCircleCredentials () {
+ // the JSON file should have an object like
+ // { "token": "abc123..." }
+ // where the token is your personal API token from CircleCI
+ // alternatively, put the JSON object into environment variable
+ // with file shown by filenameToShellVariable(jsonFile) call
+ // which is something like _circle_credentials_json
+ // you can load such environment variable quickly from local terminal with
+ // https://github.com/bahmutov/as-a
const jsonFile = path.join('support', '.circle-credentials.json')
const config = configFromEnvOrJsonFile(jsonFile)
diff --git a/cypress/integration/i18n_spec.js b/cypress/integration/i18n_spec.js
index 3669fc10aa..d3d7261b13 100644
--- a/cypress/integration/i18n_spec.js
+++ b/cypress/integration/i18n_spec.js
@@ -7,6 +7,30 @@ describe('i18n', () => {
cy.url().should('contain', 'why-cypress')
})
+ context('alternate links', () => {
+ it('provides an alternate link for available English languages', function () {
+ cy.wrap(this.langValues).each((lang) => {
+ cy.get(`link[hreflang="${lang}"]`).should(($linkTag) => {
+ let expectedPath = `${lang}/guides/overview/why-cypress.html`
+
+ if (lang === 'en') {
+ expectedPath = 'guides/overview/why-cypress.html'
+ }
+
+ expect($linkTag[0].rel).to.eq('alternate')
+ expect($linkTag[0].href).to.include(expectedPath)
+ })
+ })
+ })
+
+ it('provides a default', function () {
+ cy.get('link[hreflang="x-default"]').should(($linkTag) => {
+ expect($linkTag[0].rel).to.eq('alternate')
+ expect($linkTag[0].href).to.include('guides/overview/why-cypress.html')
+ })
+ })
+ })
+
context('language select', () => {
it('selects English by default', () => {
cy.get('#lang-select').find('option')
diff --git a/cypress/integration/main_spec.js b/cypress/integration/main_spec.js
index a47ffb94e2..d41236d1a0 100644
--- a/cypress/integration/main_spec.js
+++ b/cypress/integration/main_spec.js
@@ -9,18 +9,6 @@ describe('Main', () => {
cy.server()
})
- context('robots.txt', () => {
- if (!Cypress.isDevelopment()) {
- it('has robots.txt', () => {
- cy.request('/robots.txt').its('body')
- .should('include', 'Disallow: /ja/')
- .and('include', 'Disallow: /zh-cn/')
- .and('include', 'Disallow: /pt-br/')
- .and('include', 'Disallow: /ru/')
- })
- }
- })
-
context('CSS', () => {
beforeEach(() => {
cy.visit('/')
diff --git a/package-lock.json b/package-lock.json
index 94fb12801f..47b54013dd 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -767,6 +767,12 @@
"integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
"dev": true
},
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@@ -1063,10 +1069,13 @@
}
},
"@hapi/address": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
- "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==",
- "dev": true
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.0.0.tgz",
+ "integrity": "sha512-GDDpkCdSUfkQCznmWUHh9dDN85BWf/V8TFKQ2JLuHdGB4Yy3YTEGBzZxoBNxfNBEvreSR/o+ZxBBSNNEVzY+lQ==",
+ "dev": true,
+ "requires": {
+ "@hapi/hoek": "^9.0.0"
+ }
},
"@hapi/formula": {
"version": "1.2.0",
@@ -1075,22 +1084,36 @@
"dev": true
},
"@hapi/hoek": {
- "version": "8.5.1",
- "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz",
- "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==",
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.0.3.tgz",
+ "integrity": "sha512-jKtjLLDiH95b002sJVc5c74PE6KKYftuyVdVmsuYId5stTaWcRFqE+5ukZI4gDUKjGn8wv2C3zPn3/nyjEI7gg==",
"dev": true
},
"@hapi/joi": {
- "version": "16.1.8",
- "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.8.tgz",
- "integrity": "sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==",
+ "version": "17.1.0",
+ "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-17.1.0.tgz",
+ "integrity": "sha512-ob67RcPlwRWxBzLCnWvcwx5qbwf88I3ykD7gcJLWOTRfLLgosK7r6aeChz4thA3XRvuBfI0KB1tPVl2EQFlPXw==",
"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": "^4.0.0",
+ "@hapi/formula": "^2.0.0",
+ "@hapi/hoek": "^9.0.0",
+ "@hapi/pinpoint": "^2.0.0",
+ "@hapi/topo": "^5.0.0"
+ },
+ "dependencies": {
+ "@hapi/formula": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-2.0.0.tgz",
+ "integrity": "sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A==",
+ "dev": true
+ },
+ "@hapi/pinpoint": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.0.tgz",
+ "integrity": "sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw==",
+ "dev": true
+ }
}
},
"@hapi/pinpoint": {
@@ -1100,12 +1123,12 @@
"dev": true
},
"@hapi/topo": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz",
- "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz",
+ "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==",
"dev": true,
"requires": {
- "@hapi/hoek": "^8.3.0"
+ "@hapi/hoek": "^9.0.0"
}
},
"@istanbuljs/load-nyc-config": {
@@ -2779,9 +2802,9 @@
}
},
"@types/jest": {
- "version": "25.1.2",
- "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.1.2.tgz",
- "integrity": "sha512-EsPIgEsonlXmYV7GzUqcvORsSS9Gqxw/OvkGwHfAdpjduNRxMlhsav0O5Kb0zijc/eXSO/uW6SJt9nwull8AUQ==",
+ "version": "25.1.4",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.1.4.tgz",
+ "integrity": "sha512-QDDY2uNAhCV7TMCITrxz+MRk1EizcsevzfeS6LykIlq2V1E5oO4wXG8V2ZEd9w7Snxeeagk46YbMgZ8ESHx3sw==",
"dev": true,
"requires": {
"jest-diff": "^25.1.0",
@@ -2824,9 +2847,9 @@
"dev": true
},
"@types/yargs": {
- "version": "15.0.3",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.3.tgz",
- "integrity": "sha512-XCMQRK6kfpNBixHLyHUsGmXrpEmFFxzMrcnSXFMziHd8CoNJo8l16FkHyQq4x+xbM7E2XL83/O78OD8u+iZTdQ==",
+ "version": "15.0.4",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz",
+ "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==",
"dev": true,
"requires": {
"@types/yargs-parser": "*"
@@ -3719,9 +3742,9 @@
"integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
},
"axios": {
- "version": "0.19.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.1.tgz",
- "integrity": "sha512-Yl+7nfreYKaLRvAvjNPkvfjnQHJM1yLBY3zhqAwcJSwR/6ETkanUgylgtIvkvz0xJ+p/vZuNw8X7Hnb7Whsbpw==",
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
+ "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
"requires": {
"follow-redirects": "1.5.10"
}
@@ -4843,6 +4866,35 @@
}
}
},
+ "cli-table3": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz",
+ "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==",
+ "dev": true,
+ "requires": {
+ "colors": "^1.1.2",
+ "object-assign": "^4.1.0",
+ "string-width": "^2.1.1"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ }
+ }
+ },
"cli-truncate": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz",
@@ -5324,9 +5376,9 @@
}
},
"contentful": {
- "version": "7.13.1",
- "resolved": "https://registry.npmjs.org/contentful/-/contentful-7.13.1.tgz",
- "integrity": "sha512-wXKyKYGquLQ/PvFQFDyyrA1C19YxO5HgI5vgeQBEO/IoKNVv0dJp41x6WWXwEVf5Q3/8EfVVmhAMT0OeAJJLcQ==",
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/contentful/-/contentful-7.14.0.tgz",
+ "integrity": "sha512-edoiQx0AkmNqnGofmLHGVt84k2S8XuPyw2UOct/Oc3HEW0Z66osMJ4M/XA9GeByCCD5ZC7qotseBRyag/1g0iA==",
"requires": {
"axios": "^0.19.1",
"contentful-resolve-response": "^1.1.4",
@@ -5564,9 +5616,9 @@
}
},
"cypress": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-4.0.2.tgz",
- "integrity": "sha512-WRzxOoSd+TxyXKa7Zi9orz3ii5VW7yhhVYstCU+EpOKfPan9x5Ww2Clucmy4H/W0GHUYAo7GYFZRD33ZCSNBQA==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-4.2.0.tgz",
+ "integrity": "sha512-8LdreL91S/QiTCLYLNbIjLL8Ht4fJmu/4HGLxUI20Tc7JSfqEfCmXELrRfuPT0kjosJwJJZacdSji9XSRkPKUw==",
"dev": true,
"requires": {
"@cypress/listr-verbose-renderer": "0.4.1",
@@ -5575,13 +5627,14 @@
"arch": "2.1.1",
"bluebird": "3.7.2",
"cachedir": "2.3.0",
- "chalk": "3.0.0",
+ "chalk": "2.4.2",
"check-more-types": "2.24.0",
+ "cli-table3": "0.5.1",
"commander": "4.1.0",
"common-tags": "1.8.0",
"debug": "4.1.1",
"eventemitter2": "4.1.2",
- "execa": "3.3.0",
+ "execa": "1.0.0",
"executable": "4.1.1",
"extract-zip": "1.6.7",
"fs-extra": "8.1.0",
@@ -5592,10 +5645,12 @@
"listr": "0.14.3",
"lodash": "4.17.15",
"log-symbols": "3.0.0",
- "minimist": "1.2.0",
+ "minimist": "1.2.2",
"moment": "2.24.0",
+ "ospath": "1.2.2",
+ "pretty-bytes": "5.3.0",
"ramda": "0.26.1",
- "request": "2.88.0",
+ "request": "github:cypress-io/request#b5af0d1fa47eec97ba980cde90a13e69a2afcd16",
"request-progress": "3.0.0",
"supports-color": "7.1.0",
"tmp": "0.1.0",
@@ -5604,6 +5659,28 @@
"yauzl": "2.10.0"
},
"dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "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"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
"ci-info": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
@@ -5617,38 +5694,37 @@
"dev": true
},
"cross-spawn": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
- "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"dev": true,
"requires": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
}
},
"execa": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-3.3.0.tgz",
- "integrity": "sha512-j5Vit5WZR/cbHlqU97+qcnw9WHRCIL4V1SVe75VcHcD1JRBdt8fv0zw89b7CQHQdUHTt2VjuhcF5ibAgVOxqpg==",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
"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",
- "p-finally": "^2.0.0",
- "signal-exit": "^3.0.2",
- "strip-final-newline": "^2.0.0"
+ "cross-spawn": "^6.0.0",
+ "get-stream": "^4.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"
}
},
"get-stream": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
- "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"dev": true,
"requires": {
"pump": "^3.0.0"
@@ -5677,12 +5753,6 @@
"ci-info": "^2.0.0"
}
},
- "is-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
- "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
- "dev": true
- },
"log-symbols": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
@@ -5690,70 +5760,12 @@
"dev": true,
"requires": {
"chalk": "^2.4.2"
- },
- "dependencies": {
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "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"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
}
},
- "merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "dev": true
- },
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true
- },
- "npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dev": true,
- "requires": {
- "path-key": "^3.0.0"
- }
- },
- "onetime": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
- "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
- "dev": true,
- "requires": {
- "mimic-fn": "^2.1.0"
- }
- },
- "p-finally": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
- "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
- "dev": true
- },
- "path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "minimist": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.2.tgz",
+ "integrity": "sha512-rIqbOrKb8GJmx/5bc2M0QchhUouMXSpd1RTclXsB41JdL+VtnojfaJR+h7F9k18/4kHUsBFgk80Uk+q569vjPA==",
"dev": true
},
"pump": {
@@ -5766,18 +5778,39 @@
"once": "^1.3.1"
}
},
- "punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
- "dev": true
- },
"ramda": {
"version": "0.26.1",
"resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz",
"integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==",
"dev": true
},
+ "request": {
+ "version": "github:cypress-io/request#b5af0d1fa47eec97ba980cde90a13e69a2afcd16",
+ "from": "github:cypress-io/request#b5af0d1fa47eec97ba980cde90a13e69a2afcd16",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ }
+ },
"rimraf": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
@@ -5787,21 +5820,6 @@
"glob": "^7.1.3"
}
},
- "shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "requires": {
- "shebang-regex": "^3.0.0"
- }
- },
- "shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true
- },
"supports-color": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
@@ -5828,6 +5846,16 @@
"rimraf": "^2.6.3"
}
},
+ "tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ }
+ },
"url": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
@@ -5836,15 +5864,14 @@
"requires": {
"punycode": "1.3.2",
"querystring": "0.2.0"
- }
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+ "dev": true
+ }
}
}
}
@@ -6643,6 +6670,12 @@
"integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
"dev": true
},
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@@ -7558,7 +7591,7 @@
"integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
"dev": true,
"requires": {
- "pump": "3.0.0"
+ "pump": "^3.0.0"
}
},
"is-stream": {
@@ -7585,7 +7618,7 @@
"integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==",
"dev": true,
"requires": {
- "path-key": "3.1.1"
+ "path-key": "^3.0.0"
}
},
"onetime": {
@@ -7594,7 +7627,7 @@
"integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
"dev": true,
"requires": {
- "mimic-fn": "2.1.0"
+ "mimic-fn": "^2.1.0"
}
},
"p-finally": {
@@ -7615,8 +7648,8 @@
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"dev": true,
"requires": {
- "end-of-stream": "1.4.1",
- "once": "1.4.0"
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
}
},
"shebang-command": {
@@ -9742,9 +9775,9 @@
},
"dependencies": {
"async": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/async/-/async-3.1.1.tgz",
- "integrity": "sha512-X5Dj8hK1pJNC2Wzo2Rcp9FBVdJMGRR/S7V+lH46s8GVFhtbo5O4Le5GECCF/8PISVdkUA6mMPvgz7qTTD1rf1g==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
+ "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==",
"dev": true
}
}
@@ -10083,7 +10116,7 @@
},
"readable-stream": {
"version": "1.0.34",
- "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
"integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
"dev": true,
"requires": {
@@ -12745,11 +12778,11 @@
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"dev": true,
"requires": {
- "nice-try": "1.0.5",
- "path-key": "2.0.1",
- "semver": "5.7.0",
- "shebang-command": "1.2.0",
- "which": "1.3.1"
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
}
},
"execa": {
@@ -12758,13 +12791,13 @@
"integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
"dev": true,
"requires": {
- "cross-spawn": "6.0.5",
- "get-stream": "4.1.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"
+ "cross-spawn": "^6.0.0",
+ "get-stream": "^4.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"
}
},
"get-stdin": {
@@ -12779,7 +12812,7 @@
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"dev": true,
"requires": {
- "pump": "3.0.0"
+ "pump": "^3.0.0"
}
},
"parse-json": {
@@ -12788,10 +12821,10 @@
"integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
"dev": true,
"requires": {
- "@babel/code-frame": "7.0.0",
- "error-ex": "1.3.2",
- "json-parse-better-errors": "1.0.2",
- "lines-and-columns": "1.1.6"
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1",
+ "lines-and-columns": "^1.1.6"
}
},
"please-upgrade-node": {
@@ -12800,7 +12833,7 @@
"integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
"dev": true,
"requires": {
- "semver-compare": "1.0.0"
+ "semver-compare": "^1.0.0"
}
},
"pump": {
@@ -12809,8 +12842,8 @@
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"dev": true,
"requires": {
- "end-of-stream": "1.4.1",
- "once": "1.4.0"
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
}
},
"read-pkg": {
@@ -12819,10 +12852,10 @@
"integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
"dev": true,
"requires": {
- "@types/normalize-package-data": "2.4.0",
- "normalize-package-data": "2.5.0",
- "parse-json": "5.0.0",
- "type-fest": "0.6.0"
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
}
},
"slash": {
@@ -13924,7 +13957,7 @@
"integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
"dev": true,
"requires": {
- "ci-info": "2.0.0"
+ "ci-info": "^2.0.0"
}
},
"is-fullwidth-code-point": {
@@ -14182,8 +14215,8 @@
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"dev": true,
"requires": {
- "end-of-stream": "1.4.1",
- "once": "1.4.0"
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
}
},
"shebang-command": {
@@ -15683,7 +15716,7 @@
"integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
"dev": true,
"requires": {
- "ci-info": "2.0.0"
+ "ci-info": "^2.0.0"
}
},
"minimist": {
@@ -17890,14 +17923,14 @@
}
},
"make-empty-github-commit": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/make-empty-github-commit/-/make-empty-github-commit-1.2.0.tgz",
- "integrity": "sha512-Rkme2QetJ4+C0eV32wHGW8myhYM12NL0ComCWIJhhr9fgxcHyCBpaC5Ljb2cdsi44ck20IugyUmlzBqoONtrDg==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/make-empty-github-commit/-/make-empty-github-commit-1.2.1.tgz",
+ "integrity": "sha512-lOZ/CPWEDbao3oaLai1bc1+YQcNKW5eTKrOcG+LF3EXkyj0/Xw6W2PIv+4ZtOJRkLAiyLvZ9/Z+pfr8jV5PAPw==",
"dev": true,
"requires": {
"debug": "3.1.0",
"github": "11.0.0",
- "minimist": "1.2.0",
+ "minimist": "1.2.5",
"parse-github-repo-url": "1.4.1"
},
"dependencies": {
@@ -18503,9 +18536,9 @@
}
},
"minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"minipass": {
"version": "2.3.5",
@@ -20007,6 +20040,12 @@
"os-tmpdir": "^1.0.0"
}
},
+ "ospath": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
+ "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=",
+ "dev": true
+ },
"ow": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/ow/-/ow-0.8.0.tgz",
@@ -20721,6 +20760,12 @@
"resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
"integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
},
+ "pretty-bytes": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz",
+ "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==",
+ "dev": true
+ },
"pretty-data": {
"version": "0.40.0",
"resolved": "https://registry.npmjs.org/pretty-data/-/pretty-data-0.40.0.tgz",
@@ -21230,9 +21275,9 @@
}
},
"react-is": {
- "version": "16.12.0",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz",
- "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==",
+ "version": "16.13.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz",
+ "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==",
"dev": true
},
"read-chunk": {
@@ -22889,7 +22934,7 @@
"dependencies": {
"commander": {
"version": "2.8.1",
- "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
"integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
"requires": {
"graceful-readlink": ">= 1.0.0"
@@ -23205,9 +23250,9 @@
}
},
"sinon-chai": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.4.0.tgz",
- "integrity": "sha512-BpVxsjEkGi6XPbDXrgWUe7Cb1ZzIfxKUbu/MmH5RoUnS7AXpKo3aIYIyQUg0FMvlUL05aPt7VZuAdaeQhEnWxg==",
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.5.0.tgz",
+ "integrity": "sha512-IifbusYiQBpUxxFJkR3wTU68xzBN0+bxCScEaKMjBvAQERg6FnTTc1F17rseLb1tjmkJ23730AXpFI0c47FgAg==",
"dev": true
},
"sisteransi": {
@@ -23657,7 +23702,7 @@
},
"chalk": {
"version": "1.1.3",
- "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"requires": {
"ansi-styles": "^2.2.1",
@@ -23721,15 +23766,15 @@
"dev": true
},
"start-server-and-test": {
- "version": "1.10.8",
- "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.10.8.tgz",
- "integrity": "sha512-5I190MiIHBqmArTnxk9dfHlwO8I35B1hFhuAgv2L/UMDArRCtIXL/QftgNtgfuIz5NQN3yrN0kCsY+zYkX+dUg==",
+ "version": "1.10.11",
+ "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.10.11.tgz",
+ "integrity": "sha512-CZilaj293uQWdD4vgOxTOuzlCWxOyBm6bzmH1r6OGLG/q5zcBmGYevLfOimkg0kSn9jLHwYSXLuoKG/DDQJhww==",
"dev": true,
"requires": {
- "bluebird": "3.7.1",
+ "bluebird": "3.7.2",
"check-more-types": "2.24.0",
"debug": "4.1.1",
- "execa": "4.0.0",
+ "execa": "3.4.0",
"lazy-ass": "1.6.0",
"ps-tree": "1.2.0",
"wait-on": "4.0.0"
@@ -23742,9 +23787,9 @@
"dev": true
},
"@hapi/hoek": {
- "version": "8.5.0",
- "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.0.tgz",
- "integrity": "sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw==",
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz",
+ "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==",
"dev": true
},
"@hapi/joi": {
@@ -23753,11 +23798,11 @@
"integrity": "sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==",
"dev": true,
"requires": {
- "@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/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/topo": {
@@ -23766,41 +23811,36 @@
"integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==",
"dev": true,
"requires": {
- "@hapi/hoek": "8.5.0"
+ "@hapi/hoek": "^8.3.0"
}
},
- "bluebird": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz",
- "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==",
- "dev": true
- },
"cross-spawn": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
"integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
"dev": true,
"requires": {
- "path-key": "3.1.1",
- "shebang-command": "2.0.0",
- "which": "2.0.2"
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
}
},
"execa": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz",
- "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==",
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz",
+ "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==",
"dev": true,
"requires": {
- "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"
+ "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",
+ "p-finally": "^2.0.0",
+ "signal-exit": "^3.0.2",
+ "strip-final-newline": "^2.0.0"
}
},
"get-stream": {
@@ -23809,7 +23849,7 @@
"integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
"dev": true,
"requires": {
- "pump": "3.0.0"
+ "pump": "^3.0.0"
}
},
"is-stream": {
@@ -23836,7 +23876,7 @@
"integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
"dev": true,
"requires": {
- "path-key": "3.1.1"
+ "path-key": "^3.0.0"
}
},
"onetime": {
@@ -23845,9 +23885,15 @@
"integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
"dev": true,
"requires": {
- "mimic-fn": "2.1.0"
+ "mimic-fn": "^2.1.0"
}
},
+ "p-finally": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
+ "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
+ "dev": true
+ },
"path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@@ -23860,17 +23906,8 @@
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"dev": true,
"requires": {
- "end-of-stream": "1.4.1",
- "once": "1.4.0"
- }
- },
- "rxjs": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
- "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
- "dev": true,
- "requires": {
- "tslib": "1.9.3"
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
}
},
"shebang-command": {
@@ -23879,7 +23916,7 @@
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"requires": {
- "shebang-regex": "3.0.0"
+ "shebang-regex": "^3.0.0"
}
},
"shebang-regex": {
@@ -23894,12 +23931,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": {
@@ -23908,7 +23945,7 @@
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"requires": {
- "isexe": "2.0.0"
+ "isexe": "^2.0.0"
}
}
}
@@ -26029,13 +26066,13 @@
},
"minimist": {
"version": "0.0.8",
- "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"dev": true
},
"mkdirp": {
"version": "0.5.1",
- "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"dev": true,
"requires": {
@@ -26128,12 +26165,12 @@
}
},
"wait-on": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-4.0.0.tgz",
- "integrity": "sha512-QrW3J8LzS5ADPfD9Rx5S6KJck66xkqyiFKQs9jmUTkIhiEOmkzU7WRZc+MjsnmkrgjitS2xQ4bb13hnlQnKBUQ==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-4.0.1.tgz",
+ "integrity": "sha512-x83fmTH2X0KL7vXoGt9aV5x4SMCvO8A/NbwWpaYYh4NJ16d3KSgbHwBy9dVdHj0B30cEhOFRvDob4fnpUmZxvA==",
"dev": true,
"requires": {
- "@hapi/joi": "^16.1.8",
+ "@hapi/joi": "^17.1.0",
"lodash": "^4.17.15",
"minimist": "^1.2.0",
"request": "^2.88.0",
diff --git a/package.json b/package.json
index 4aee01039e..b0fc6c8988 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,7 @@
"version": "3.9.0"
},
"engines": {
- "node": "^8.6.0"
+ "node": "^12.8.1"
},
"license": "MIT",
"bugs": "https://github.com/cypress-io/cypress-documentation/issues",
@@ -83,7 +83,7 @@
"@cypress/skip-test": "2.5.0",
"@keyv/redis": "github:bahmutov/keyv-redis#b64f44cd1d1e87893d989b1469068af8292299d5",
"@types/fluent-ffmpeg": "2.1.14",
- "@types/jest": "25.1.2",
+ "@types/jest": "25.1.4",
"beeper": "2.0.0",
"bluebird": "3.7.2",
"chai": "4.2.0",
@@ -91,7 +91,7 @@
"cheerio": "1.0.0-rc.3",
"coffee-react": "5.0.1",
"common-tags": "1.8.0",
- "cypress": "4.0.2",
+ "cypress": "4.2.0",
"dependency-check": "3.4.1",
"deps-ok": "1.4.1",
"eslint": "6.1.0",
@@ -112,8 +112,8 @@
"jest": "25.1.0",
"keyv": "4.0.0",
"lint-staged": "8.2.1",
- "make-empty-github-commit": "1.2.0",
- "minimist": "1.2.0",
+ "make-empty-github-commit": "1.2.1",
+ "minimist": "1.2.5",
"nock": "10.0.6",
"ora": "3.4.0",
"pluralize": "8.0.0",
@@ -121,20 +121,20 @@
"ramda": "0.27.0",
"request-promise": "4.2.5",
"sinon": "8.1.1",
- "sinon-chai": "3.4.0",
- "start-server-and-test": "1.10.8",
+ "sinon-chai": "3.5.0",
+ "start-server-and-test": "1.10.11",
"textlint": "11.6.3",
"textlint-filter-rule-comments": "1.2.2",
"textlint-rule-eslint": "3.2.1",
"textlint-rule-terminology": "2.1.3",
"utf8": "3.0.0",
- "wait-on": "4.0.0",
+ "wait-on": "4.0.1",
"yamljs": "0.3.0"
},
"dependencies": {
"@contentful/rich-text-html-renderer": "13.4.0",
"check-more-types": "2.24.0",
- "contentful": "7.13.1",
+ "contentful": "7.14.0",
"debug": "4.1.1",
"docsearch.js": "2.6.3",
"font-awesome": "4.7.0",
diff --git a/robots.txt b/robots.txt
deleted file mode 100644
index b81cb5e8d1..0000000000
--- a/robots.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-User-agent: *
-Disallow: /ja/
-Disallow: /zh-cn/
-Disallow: /pt-br/
-Disallow: /ru/
-Disallow: /fonts/
diff --git a/source/_changelogs/3.1.0.md b/source/_changelogs/3.1.0.md
index f6df2061e5..a61c56f8da 100644
--- a/source/_changelogs/3.1.0.md
+++ b/source/_changelogs/3.1.0.md
@@ -29,7 +29,7 @@
- We have added support for more CI providers to automatically detect and show more relevant information in the Dashboard, instead of showing 'Unknown'. Fixes {% issue 2146 %}.
- We have added better checks and reliability for detecting runs in Jenkins. Fixes {% issue 1990 %}.
- The built in {% url "`cypress-browserify-preprocessor`" https://github.com/cypress-io/cypress-browserify-preprocessor %} was bumped to `1.1.0`. This supports more JavaScript features by default, including async/await, object rest spread, and class properties. Fixes {% issue 2254 %}.
-- {% url "`cypress run`" command-line#cypress-run %} now creates a new browser profile per run per browser, but keeps the same browser profile for interactive mode with {% url "`cypress open`" command-line#cypress-open %}. This means you can run Cypress locally over multiple processes and the browser profiles will not conflict with each other. Fixes {% issue 1566 %}.
+- {% url "`cypress run`" command-line#cypress-run %} now creates a new browser profile per run per browser, but keeps the same browser profile when run via {% url "`cypress open`" command-line#cypress-open %}. This means you can run Cypress locally over multiple processes and the browser profiles will not conflict with each other. Fixes {% issue 1566 %}.
- The Desktop-GUI has been updated to get the new routes provided by the Cypress API for runs. Fixes {% issue 2189 %}.
- Cypress now retries multiple times (with a backoff strategy) when communicating with our API fails while recording runs. This will provide better feedback in situations when the API is temporarily unavailable. Fixes {% issue 1590 %}.
- When Cypress retries due to an API timeout or failure it now displays a very nice message indicating to you the delay and number of retries left. Fixes {% issue 2280 %}.
diff --git a/source/_changelogs/3.4.0.md b/source/_changelogs/3.4.0.md
index 93cea6cfaa..01e67a4201 100644
--- a/source/_changelogs/3.4.0.md
+++ b/source/_changelogs/3.4.0.md
@@ -24,7 +24,7 @@
- Environment variables for Semaphore 2.0 are now captured when recording tests to the Dashboard. Fixes {% issue 4671 %}.
- We now capture environment variables set from Concourse CI when recording tests to the Dashboard. Fixes {% issue 4376 %}.
- We replaced capturing environment variables from SnapCI (which is no longer available) to instead capture ones set from GoCD when recording tests to the Dashboard. Fixes {% issue 2680 %}.
-- The {% url "JSON schema file" https://on.cypress.io/cypress.schema.json %} used for {% url "intelligent code completion" https://on.cypress.io/intelligent-code-completion#Configuration %} for the Cypress configuration file has been updated to match our documentation.
+- The {% url "JSON schema file" https://on.cypress.io/cypress.schema.json %} used for {% url "intelligent code completion" IDE-integration#Intelligent-Code-Completion %} for the Cypress configuration file has been updated to match our documentation.
**Documentation Changes:**
diff --git a/source/_changelogs/3.8.0.md b/source/_changelogs/3.8.0.md
index a6b7d761e2..fcf770786f 100644
--- a/source/_changelogs/3.8.0.md
+++ b/source/_changelogs/3.8.0.md
@@ -17,7 +17,7 @@
- We fixed a regression in {% url "3.5.0" changelog-3-5-0 %} where calling `.type({ force: true })` on hidden inputs would not type the correct characters. Fixes {% issue 5835 %}.
- We fixed a regression in {% url "3.5.0" changelog-3-5-0 %} where {% url "`.type()`" type %} was not respecting previous selections if the current value of the input was the same as the key. This also fixed an where {% url "`.type()`" type %} would not respect previous selections in non-selectionRange inputs (like email or number inputs). Fixes {% issue 5703 %}.
- During visibility checks, Cypress now properly evaluates a DOM element transformed by `scale(0)` or `rotateY(90deg)` as not visible. Fixes {% issue 723 %}.
-- Fixed a bug where the specs list in interactive mode would not refresh when files are changed on disk. Fixes {% issue 5933 %}.
+- Fixed a bug where the specs list during `cypress open` would not refresh when files are changed on disk. Fixes {% issue 5933 %}.
- `env` configuration option displays properly within the settings panel. Previously, setting env options would incorrectly render `"undefined"` as the value. Fixes {% issue 5859 %}.
**Misc:**
diff --git a/source/_changelogs/3.8.3.md b/source/_changelogs/3.8.3.md
index b8a31d798e..8d94b349cc 100644
--- a/source/_changelogs/3.8.3.md
+++ b/source/_changelogs/3.8.3.md
@@ -17,7 +17,6 @@
**Dependency Updates:**
-- Upgraded `electron` from `7.1.9` to `7.1.10`. Addressed in {% PR 6242 %}.
-- Upgraded `electron` from `7.1.7` to `7.1.9`. Addressed in {% PR 6180 %}.
+- Upgraded `electron` from `7.1.7` to `7.1.10`. Addressed in {% PR 6180 %} and {% PR 6242 %}.
- Upgraded `http-status-codes` from `1.3.2` to `1.4.0`. Addressed in {% PR 6134 %}.
- Upgraded `socket.io` and `socket.io-client` from `2.2.0` to `2.3.0`. Addressed in {% PR 6179 %}.
diff --git a/source/_changelogs/4.0.0.md b/source/_changelogs/4.0.0.md
index 9e7ff77481..d2efa5daf6 100644
--- a/source/_changelogs/4.0.0.md
+++ b/source/_changelogs/4.0.0.md
@@ -48,7 +48,7 @@ Cypress 4.0.0 includes support for {% url "Mozilla Firefox" https://www.mozilla.
- The browser icons in the Test Runner now display as images with the proper branding. Addresses {% issue 6188 %}.
- We updated the styling of browser dropdown in the Test Runner to look more like a button. Addresses {% issue 6298 %}.
- The timer in the Test Runner now always displays at a consistent length. Addresses {% issue 6168 %}.
-- You can print debug information about the memory & CPU usage of Cypress, which can be accessed by enabling the {% url "`cypress:server:util:process_profiler` debug stream" debugging#Log-memory-and-CPU-usage %}. Addresses {% issue 6169 %}.
+- You can print debug information about the memory & CPU usage of Cypress, which can be accessed by enabling the {% url "`cypress:server:util:process_profiler` debug stream" troubleshooting#Log-memory-and-CPU-usage %}. Addresses {% issue 6169 %}.
- We added types for plugin events. Addresses {% issue 6322 %}.
**Dependency Updates**
diff --git a/source/_changelogs/4.0.2.md b/source/_changelogs/4.0.2.md
index 5e92d5085e..1fd6127485 100644
--- a/source/_changelogs/4.0.2.md
+++ b/source/_changelogs/4.0.2.md
@@ -4,13 +4,17 @@
**Bugfixes:**
-- Fixed a bug where Firefox tests could fail to run on macOS if another instance of Firefox was open. Addresses {% issue 6380 %}.
-- Updated `@cypress/browserify-preprocessor` to `2.1.4`, fixing a regression involving non-top-level `require()`s in tests. Addresses {% issue 6403 %}.
-- Fixed a bug where re-running a failed workflow in GitHub Actions would not generate a new Dashboard run. Addresses {% issue 6450 %}.
-- Fixed incorrect type definitions for `Cypress.isBrowser`. Addresses {% issue 6447 %}.
-- Fixed a regression introduced in 4.0.0 where using `.should('contain', ...)` on a `cy.contains()` would produce unexpected results. Addresses {% issue 6384 %}.
+- We fixed a bug where tests in Firefox would not open on macOS if another instance of Firefox was open. Fixes {% issue 6380 %}.
+- We fixed a regression in {% url "4.0.0" changelog-4-0-0 %} where using `.should('not.contain', ...)` chained after a {% url "`.contains()`" contains %} would produce unexpected results. Fixes {% issue 6384 %}.
+- We fixed a regression in {% url "4.0.0" changelog-4-0-0 %} where non-top-level `require()`s in tests no longer worked. Fixes {% issue 6403 %}.
+- Re-running a failed workflow in GitHub Actions now properly generates a new Dashboard run. Fixes {% issue 6450 %}.
**Misc:**
-- Improved the error experience GUI when launching a browser fails. Addresses {% issue 6432 %}.
-- Improved the error experience when visiting the Cypress server outside of a Cypress-launched browser. Addresses {% issue 6435 %}.
+- We fixed incorrect type definitions for {% url "`Cypress.isBrowser`" isbrowser %}. Addresses {% issue 6447 %}.
+- We improved the error experience when launching a browser fails. Addresses {% issue 6432 %}.
+- We improved the error experience when visiting the Cypress server outside of a Cypress-launched browser. Addresses {% issue 6435 %}.
+
+**Dependency Updates**
+
+- Upgraded `@cypress/browserify-preprocessor` from `2.1.1` to `2.1.4`. Addressed in {% PR 6419 %}.
diff --git a/source/_changelogs/4.1.0.md b/source/_changelogs/4.1.0.md
new file mode 100644
index 0000000000..83beda40e5
--- /dev/null
+++ b/source/_changelogs/4.1.0.md
@@ -0,0 +1,34 @@
+# 4.1.0
+
+*Released 2/28/2020*
+
+**Features:**
+
+- There is a new `cypress info` command to see the locally detected browsers and other information related to Cypress. Addresses {% issue 4540 %}.
+- You can now click a 'Try Again' button to recheck if the server at the designated `baseUrl` is running within the warning message during `cypress open`. Addresses {% issue 3284 %}.
+- There are "collapse all" and "expand all" links in the Test Runner's "Tests" tab to collapse or expand all folders within the "Integration Tests". Addresses {% issue 6282 %}.
+- The plugins file function's {% url "`config`" configuration-api %} argument now includes `projectRoot` (absolute path to the root of the project) and `configFile` (absolute path to the configuration file). Addresses {% issue 5941 %}.
+
+**Bugfixes:**
+
+- Fixed a regression in {% url "4.0.2" changelog-4-0-2 %} where Cypress could throw a "Maximum call stack size exceeded" error when transmitting a circular object over the internal WebSocket. Fixes {% issue 6582 %}.
+- We fixed an issue where using Chromium-family browsers could cause Cypress to throw a "WebSocket is not open: readyState 3" error under certain conditions. Fixes {% issue 5685 %}.
+- We now more thoroughly ensure the parent of an element exists when recursively calling visibility and existence checks in order to prevent some maximum call stack errors. Fixes {% issue 4373 %}.
+- We fixed an issue where a maximum call stack error would throw in some circumstances when `xhr.onreadystatechange` is accessed. Fixes {% issue 5864 %}.
+- We fixed a regression in {% url "3.5.0" changelog-3-5-0 %} where typing into an iframe with a body element with the contenteditable attribute would throw an error. Fixes {% issue 5930 %}.
+- We now set the default window size when running Chrome headlessly to 1280x720. Fixes {% issue 6210 %}.
+- We fixed an issue where `cypress install` would not complete on Node.js 8.0.0. Fixes {% issue 6512 %} and {% issue 6568 %}.
+- {% url "`cy.clearLocalStorage()`" clearlocalstorage %} now properly accepts the `log` option to disable logging. Fixes {% issue 6342 %}.
+
+**Misc:**
+
+- The error messages displayed when rerouting to a non same-origin domain has been updated to more accurately reflect the rules around same-origin policy. Addresses {% issue 6048 %}.
+- We fixed an error message that would display the wrong available browser families during validation. Addressed in {% PR 6517 %}.
+- We fixed some typos in some of our error messages. Addressed in {% PR 6508 %}.
+- We're collecting more environment variables when running Cypress with GitLab CI. Addresses {% issue 6231 %}.
+- The typing of `cy.$$` has been updated to distinguish differences between it and `Cypress.$`. {% url "More info here" $#Cypress-vs-cy %} Addresses {% issue 2027 %}.
+- We're continuing to make progress in converting our codebase from CoffeeScript to JavaScript. Addresses {% issue 2690 %} in {% PR 6552 %}, {% PR 6523 %}, and {% PR 6545 %}.
+
+**Dependency Updates**
+
+- Upgraded `electron` from `7.1.10` to `7.1.13`. Addressed in {% PR 6566 %}.
diff --git a/source/_changelogs/4.2.0.md b/source/_changelogs/4.2.0.md
new file mode 100644
index 0000000000..7795cee236
--- /dev/null
+++ b/source/_changelogs/4.2.0.md
@@ -0,0 +1,41 @@
+# 4.2.0
+
+*Released 3/16/2020*
+
+**Features:**
+
+- Videos can now be recorded when running Electron in `--headed` mode. Addresses {% issue 1767 %}.
+- {% url "`cypress cache list`" command-line#cypress-cache-list %} now prints the last time the cached binary was accessed for each version present. Addresses {% issue 6682 %}.
+
+**Bugfixes:**
+
+- We fixed a regression in {% url "3.8.3" changelog-3-8-3 %} where HTTPS requests could experience slowdown. Fixes {% issue 6659 %}.
+- We now detect some installations of Firefox that were previously undetected. Fixes {% issue 6669 %}.
+- We fixed a race condition where an asynchronous error could fail to be caught when running the plugins file process. Fixes {% issue 6570 %}.
+- We now more thoroughly ensure the parent of an element exists when recursively calling actionability checks in order to prevent some maximum call stack errors. Fixes {% issue 6707 %}.
+- Specfiles containing `&` or `%` characters now correctly run instead of erroring. Fixes {% issue 4210 %}.
+- We added support for running tests on Jira plugins even when Jira scripts were not minified. Fixes {% issue 1436 %}.
+- We fixed a bug causing specs to hang after rerunning tests during `cypress open` when there was an exception if thrown in an `after` hook. Fixes {% issue 6619 %}.
+- {% url "`cypress verify`" command-line#cypress-verify %} no longer incorrectly prints messaging about this being the first time using that Cypress version. Fixes {% issue 6607 %}.
+- Screenshots no longer fail to be taken in Electron when Cypress `DEBUG` logs are enabled. Fixes {% issue 6662 %}.
+
+**Misc:**
+
+- A warning is now printed when setting the reserved key `CYPRESS_INTERNAL_ENV` to a non-production value. Addresses {% issue 6436 %}.
+- When DEBUG logs are printed from `cypress:launcher`, they now print a clearer log during browser detection for easier reading. Addresses {% issue 6700 %}.
+- The Test Runner now renders ANSI colors when there is a syntax error in the spec file. Addresses {% issue 6533 %}.
+- The Test Runner now has an icon indicating whether the specs list parent folder is collapsed. Addresses {% issue 6277 %}.
+- There's better type information for {% url "`.click`" click %}, {% url "`.dblclick`" dblclick %}, and {% url "`.rightclick`" rightclick %} command's `position` argument. Addresses {% issue 6341 %}.
+- There's a more robust type signature for {% url "`.its()`" its %} and {% url "`.invoke()`" invoke %}. Addresses {% issue 6431 %}.
+- Using {% url "`Cypress.dom.isDetached`" dom#Is-detached %} no longer throws a type error in TypeScript projects. Addresses {% issue 4408 %}.
+- Using {% url "`cy.clearLocalStorage({ log:false })`" clearlocalstorage %} no longer throws a type error in TypeScript projects. Addresses {% issue 6615 %}.
+- We added types for {% url "`Cypress.sinon`" sinon %}. Addresses {% issue 6720 %}.
+- We've added the foundational work required to support experimental features in the Test Runner. Addresses {% issue 6257 %}.
+
+**Dependency Updates**
+
+- Upgraded Chrome browser version used during `cypress run` and when selecting Electron browser in `cypress open` from `78` to `80`. Addressed in {% PR 6555 %}.
+- Upgraded `electron` from `7.1.13` to `8.1.1`. This bumps the bundled Chromium to 80.0.3987.141 and the bundled Node to 12.13.0. Addressed in {% PR 6555 %}.
+- Upgraded `@ffmpeg-installer/ffmpeg` from `1.0.19` to `1.0.20`. Addressed in {% PR 6686 %}.
+- Upgraded `minimist` from `1.2.0` to `1.2.2`. Addressed in {% PR 6726 %}.
+- Replaced deprecated `request` with `cypress-io/request`. Addressed in {% PR 6679 %}.
diff --git a/source/_data/plugins.yml b/source/_data/plugins.yml
index 3bcfd54bf6..4c263251d8 100755
--- a/source/_data/plugins.yml
+++ b/source/_data/plugins.yml
@@ -341,6 +341,11 @@
link: https://github.com/matzeeable/wp-reactjs-starter
keywords: [wp, wordpress]
+ - name: Next Right Now - Next.js Boilerplate
+ description: Next.js boilerplate with Jest/Cypress and CI/CD pipeline built-in (monorepo, multi-tenants)
+ link: https://github.com/UnlyEd/next-right-now
+ keywords: [next.js, react, monorepo, multi-tenants]
+
- name: Elm Batteries Included
description: A project template to learn how Elm, Parcel, Cypress and Netlify work together.
link: https://github.com/cedricss/elm-batteries
@@ -395,7 +400,7 @@
keywords: [component, vue, vue.js]
- name: Visual Testing
- description:
+ description: Visual testing is a great complement to functional testing, read our {% url "full visual testing guide" visual-testing %}
plugins:
- name: Applitools
description: Fast, easy and reliable visual UI testing with Cypress
@@ -407,6 +412,11 @@
link: https://docs.percy.io/docs/cypress
keywords: [screenshots, visual regression]
+ - name: Happo
+ description: Cross-platform, cross-browser screenshot testing for modern user interfaces.
+ link: https://github.com/happo/happo-cypress
+ keywords: [screenshots, visual regression]
+
- name: cypress-plugin-snapshots
description: Plugin for snapshot tests in Cypress. Same API as Jest, but with graphical interface for reviewing and approving changes.
link: https://github.com/meinaart/cypress-plugin-snapshots
diff --git a/source/_data/projects.yml b/source/_data/projects.yml
index 4a88c2d4bd..1e10c4b1dd 100644
--- a/source/_data/projects.yml
+++ b/source/_data/projects.yml
@@ -36,6 +36,17 @@
description: A graphical interactive in-browser GraphQL IDE
url: https://github.com/graphql/graphiql/tree/master/packages/graphiql
+- name: What Got Done
+ description: An easy, lightweight tool for sharing your weekly progress reports.
+ url: https://github.com/mtlynch/whatgotdone
- name: React Admin
description: A frontend Framework for building B2B applications running in the browser on top of REST/GraphQL APIs, using ES6, React and Material Design
url: https://github.com/marmelab/react-admin
+
+- name: Webiny
+ description: Serverless CMS (GraphQL + React + Node.js + AWS Lambda)
+ url: https://github.com/webiny/webiny-js
+
+- name: Userbase
+ description: Create secure and private web apps using only static JavaScript, HTML, and CSS.
+ url: https://github.com/encrypted-dev/userbase
diff --git a/source/_data/sidebar.yml b/source/_data/sidebar.yml
index ac40c485c7..7a946861a9 100644
--- a/source/_data/sidebar.yml
+++ b/source/_data/sidebar.yml
@@ -36,7 +36,7 @@ guides:
cross-browser-testing: cross-browser-testing.html
web-security: web-security.html
tooling:
- intelligent-code-completion: intelligent-code-completion.html
+ IDE-integration: IDE-integration.html
plugins-guide: plugins-guide.html
reporters: reporters.html
typescript-support: typescript-support.html
@@ -51,6 +51,7 @@ guides:
error-messages: error-messages.html
bundled-tools: bundled-tools.html
trade-offs: trade-offs.html
+ troubleshooting: troubleshooting.html
changelog: changelog.html
migration-guide: migration-guide.html
roadmap: roadmap.html
@@ -151,6 +152,7 @@ api:
minimatch: minimatch.html
moment: moment.html
promise: promise.html
+ sinon: sinon.html
cypress-api:
custom-commands: custom-commands.html
cookies: cookies.html
diff --git a/source/_data/webinars.yml b/source/_data/webinars.yml
index b032728781..8c6bdeaf9b 100644
--- a/source/_data/webinars.yml
+++ b/source/_data/webinars.yml
@@ -1,5 +1,24 @@
+# small links with title and url
+# Using this to post subscribe to updates link
+small:
+ - title: "Get notified of upcoming webcasts by subscribing to emails from Cypress"
+ sourceUrl: https://go.cypress.io/subscribe
+ - title: "Follow us on Twitter!"
+ sourceUrl: https://twitter.com/Cypress_io
+
# large links with thumbnails, links, embedded video
large:
+ - title: "CircleCI and Cypress.io: Easily integrate end to end web application testing"
+ date: Dec 10, 2018
+ author: Cypress & CircleCI with Gleb Bahmutov & Eddie Webb
+ youtubeId: J-xbNtKgXfY
+ slides: https://slides.com/bahmutov/circleci-cypress-orb
+
+ - title: "Cypress + Gatsby: Confidently fast web development"
+ date: Sep 4, 2019
+ author: Cypress & Gatsby with Amir Rustamzadeh & Dustin Schau
+ youtubeId: Tx6Lg9mwcCE
+
- title: "From Zero to Hero with Cypress: Slido’s journey of creating E2E tests without JS experience"
date: Aug 7, 2019
author: Cypress & sli.do with Filip Hric, Lubo Droby, & Steven Yi
diff --git a/source/api/commands/hover.md b/source/api/commands/hover.md
index a7b58369a2..91b70017ba 100644
--- a/source/api/commands/hover.md
+++ b/source/api/commands/hover.md
@@ -22,6 +22,12 @@ Oftentimes you can use {% url `.trigger()` trigger %}, {% url `.invoke()` invoke
If the hover behavior depends on a JavaScript event like `mouseover`, you can trigger the event to achieve that behavior.
+{% note danger %}
+Using `.trigger()` will only affect events in JavaScript and will not trigger any effects in CSS.
+{% endnote %}
+
+As a workaround, check out the {% url 'recipe leveraging Chrome remote debugging' recipes#Fundamentals %} to set pseudo classes like `hover`.
+
### Simulating `mouseover` event to get popover to display
```javascript
diff --git a/source/api/commands/invoke.md b/source/api/commands/invoke.md
index ce33b190c7..88a12d75a0 100644
--- a/source/api/commands/invoke.md
+++ b/source/api/commands/invoke.md
@@ -24,13 +24,13 @@ If you want to get a property that is not a function on the previously yielded s
```javascript
cy.wrap({ animate: fn }).invoke('animate') // Invoke the 'animate' function
-cy.get('.modal').invoke('show') // Invoke the jQuery 'show' function
+cy.get('.modal').invoke('show') // Invoke the jQuery 'show' function
```
**{% fa fa-exclamation-triangle red %} Incorrect Usage**
```javascript
-cy.invoke('convert') // Errors, cannot be chained off 'cy'
+cy.invoke('convert') // Errors, cannot be chained off 'cy'
cy.wrap({ name: 'Jane' }).invoke('name') // Errors, 'name' is not a function
```
@@ -77,11 +77,11 @@ cy.wrap({ foo: fn }).invoke('foo').should('eq', 'bar') // true
In the example below, we use `.invoke()` to force a hidden div to be `'display: block'` so we can interact with its children elements.
```javascript
-cy.get('div.container').should('be.hidden') // true
-
+cy.get('div.container').should('be.hidden') // element is hidden
.invoke('show') // call jquery method 'show' on the '.container'
- .should('be.visible') // true
- .find('input').type('Cypress is great')
+ .should('be.visible') // element is visible now
+ .find('input') // drill down into a child "input" element
+ .type('Cypress is great') // and type text
```
### Use `.invoke('show')` and `.invoke('trigger')`
@@ -142,7 +142,7 @@ Our input field
```
-The Cypress Test with `cy.inkoke()` awaiting the promise:
+The Cypress Test with `cy.invoke()` awaiting the promise:
```javascript
function disableElementAsync (element) {
return new Promise((resolve) => {
@@ -194,6 +194,30 @@ cy
.invoke('val').should('match', /apples/)
```
+## Retries
+
+`.invoke()` automatically retries invoking the specified method until the returned value satisfies the attached assertions. The example below passes after 1 second.
+
+```javascript
+let message = 'hello'
+const english = {
+ greeting () {
+ return message
+ }
+}
+
+setTimeout(() => {
+ message = 'bye'
+}, 1000)
+
+// initially the english.greeting() returns "hello" failing the assertion.
+// .invoke('greeting') tries again and again until after 1 second
+// the returned message becomes "bye" and the assertion passes
+cy.wrap(english).invoke('greeting').should('equal', 'bye')
+```
+
+{% imgTag /img/api/invoke/invoke-retries.gif "Invoke retries example" width-600 %}
+
# Rules
## Requirements {% helper_icon requirements %}
diff --git a/source/api/commands/select.md b/source/api/commands/select.md
index c664e6732c..01aaec6065 100644
--- a/source/api/commands/select.md
+++ b/source/api/commands/select.md
@@ -162,4 +162,5 @@ When clicking on `select` within the command log, the console outputs the follow
# See also
+- Read {% url 'Working with Select elements and Select2 widgets in Cypress' https://www.cypress.io/blog/2020/03/20/working-with-select-elements-and-select2-widgets-in-cypress/ %}
- {% url `.click()` click %}
diff --git a/source/api/commands/should.md b/source/api/commands/should.md
index 6af775df62..c209d14bbc 100644
--- a/source/api/commands/should.md
+++ b/source/api/commands/should.md
@@ -174,10 +174,9 @@ cy
})
```
-{% note warning %}
-Any value returned from a `.should()` callback function will be ignored. The original subject will be yielded to the next command.
+**{% fa fa-warning red %} Warning** Any value returned from a `.should()` callback function will be ignored. The original subject will be yielded to the next command.
-```
+```js
cy
.get('p')
.should(($p) => {
@@ -189,7 +188,6 @@ cy
// the argument $p will be the 3 elements, not "foo"
})
```
-{% endnote %}
### Assert class name contains `heading-`
@@ -236,9 +234,9 @@ cy.get('.docs-header')
})
```
-### Assert text contents of 3 elements
+### Assert text content of 3 elements
-Example below first asserts that there are 3 elements, and then checks the text contents of each one.
+Example below first asserts that there are 3 elements, and then checks the text content of each one.
```html
diff --git a/source/api/commands/task.md b/source/api/commands/task.md
index 8ff91973e4..c85c05f8e3 100644
--- a/source/api/commands/task.md
+++ b/source/api/commands/task.md
@@ -84,7 +84,7 @@ Option | Default | Description
# Examples
-## Command
+## Event
`cy.task()` provides an escape hatch for running arbitrary Node code, so you can take actions necessary for your tests outside of the scope of Cypress. This is great for:
@@ -176,6 +176,50 @@ module.exports = (on, config) => {
}
```
+### Save a variable across non same-origin URL visits
+
+When visiting non same-origin URL, Cypress will {% url "change the hosted URL to the new URL" web-security %}, wiping the state of any local variables. We want to save a variable across visiting non same-origin URLs.
+
+We can save the variable and retrieve the saved variable outside of the test using `cy.task()` as shown below.
+
+```javascript
+// in test
+describe('Href visit', () => {
+ it('captures href', () => {
+ cy.visit('https://www.mywebapp.com')
+ cy.get('a').invoke('attr', 'href')
+ .then((href) => {
+ // href is not same-origin as current url
+ // like https://www.anotherwebapp.com
+ cy.task('setHref', href)
+ })
+ })
+
+ it('visit href', () => {
+ cy.task('getHref').then((href) => {
+ // visit non same-origin url https://www.anotherwebapp.com
+ cy.visit(href)
+ })
+ })
+})
+```
+
+```javascript
+// in plugins/index.js
+let href
+
+module.exports = (on, config) => {
+ on('task', {
+ setHref: (val) => {
+ return href = val
+ },
+ getHref: () => {
+ return href
+ }
+ })
+}
+```
+
## Options
### Change the timeout
diff --git a/source/api/commands/wait.md b/source/api/commands/wait.md
index 791d008788..842bbd579b 100644
--- a/source/api/commands/wait.md
+++ b/source/api/commands/wait.md
@@ -136,6 +136,8 @@ cy.get('#book-results').should('have.length', 1)
### You can pass an array of aliases that will be waited on before resolving.
+When passing an array of aliases to `cy.wait()`, Cypress will wait for all requests to complete within the given `requestTimeout` and `responseTimeout`.
+
```javascript
cy.server()
cy.route('users/*').as('getUsers')
@@ -209,6 +211,10 @@ This means Cypress will now wait up to 20 seconds for the external server to res
This gives you the best of both worlds - a fast error feedback loop when requests never go out and a much longer duration for the actual external response.
+### Using an Array of Aliases
+
+When passing an array of aliases to `cy.wait()`, Cypress will wait for all requests to complete within the given `requestTimeout` and `responseTimeout`.
+
# Rules
## Requirements {% helper_icon requirements %}
diff --git a/source/api/cypress-api/custom-commands.md b/source/api/cypress-api/custom-commands.md
index e0acada249..4e24978317 100644
--- a/source/api/cypress-api/custom-commands.md
+++ b/source/api/cypress-api/custom-commands.md
@@ -402,7 +402,7 @@ For more complex use cases feel free to overwrite existing commands.
### Overwrite `screenshot` command
-This example overwrites `screenshot` to always wait until a certain element is visible.
+This example overwrites {% url "`cy.screenshot()`" screenshot %} to always wait until a certain element is visible.
```javascript
Cypress.Commands.overwrite('screenshot', (originalFn, subject, name, options) => {
@@ -420,6 +420,25 @@ Cypress.Commands.overwrite('screenshot', (originalFn, subject, name, options) =>
})
```
+## Overwrite `contains` command
+
+This example overwrites {% url "`.contains()`" contains %} to always have the `matchCase` option set to `false`.
+
+```js
+Cypress.Commands.overwrite('contains', (originalFn, subject, filter, text, options = {}) => {
+ // determine if a filter argument was passed
+ if (typeof text === 'object') {
+ options = text
+ text = filter
+ filter = undefined
+ }
+
+ options.matchCase = false
+
+ return originalFn(subject, filter, text, options)
+})
+```
+
# Validations
As noted in the {% urlHash 'Arguments' 'Arguments' %} above, you can also set `prevSubject` to one of:
diff --git a/source/api/cypress-api/cypress-log.md b/source/api/cypress-api/cypress-log.md
index e5fbb855fc..4b55c3ddb7 100644
--- a/source/api/cypress-api/cypress-log.md
+++ b/source/api/cypress-api/cypress-log.md
@@ -1,16 +1,11 @@
---
title: Cypress.log
-
---
This is the internal API for controlling what gets printed to the Command Log.
Useful when writing your own {% url "custom commands" custom-commands %}.
-{% note info WIP %}
-This page is currently a work in progress and is not fully documented.
-{% endnote %}
-
# Syntax
```javascript
@@ -33,22 +28,37 @@ Option | Default | Description
# Examples
+We want the Command Log and the console in the DevTools to log specific properties of our custom command.
+
```javascript
-Cypress.Commands.add('myCustomCommand', (arg1, arg2) => {
+Cypress.Commands.add('setSessionStorage', (key, value) => {
+ // Turn off logging of the cy.window() to command log
+ cy.window({ log: false }).then((window) => {
+ window.sessionStorage.setItem(key, value)
+ })
+
const log = Cypress.log({
+ name: 'setSessionStorage',
+ // shorter name for the Command Log
+ displayName: 'setSS',
+ message: `${key}, ${value}`,
consoleProps: () => {
- // return an object literal which will
- // be printed to the dev tools console
- // on click
+ // return an object which will
+ // print to dev tools console on click
return {
- 'Some': 'values',
- 'For': 'debugging'
+ 'Key': key,
+ 'Value': value,
+ 'Session Storage': window.sessionStorage
}
}
})
})
```
+The code above displays in the Command Log as shown below, with the console properties shown on click of the command.
+
+{% imgTag /img/api/Cypress.log-custom-logging-and-console.png "Custom logging of custom command" %}
+
# See also
- {% url `Commands` custom-commands %}
diff --git a/source/api/events/catalog-of-events.md b/source/api/events/catalog-of-events.md
index 57da16b79d..aa41773fc3 100644
--- a/source/api/events/catalog-of-events.md
+++ b/source/api/events/catalog-of-events.md
@@ -117,13 +117,13 @@ Event | Details
Event | Details
--- | ---
**Name:** | `log:added`
-**Yields:** | log attributes **(Object)**, whether Cypress is in interactive mode **(Boolean)**
+**Yields:** | log attributes **(Object)**, whether Cypress is in interactive mode (running via `cypress open`) **(Boolean)**
**Description:** | Fires whenever a command emits this event so it can be displayed in the Command Log. Useful to see how internal cypress commands utilize the {% url 'Cypress.log()' cypress-log %} API.
Event | Details
--- | ---
**Name:** | `log:changed`
-**Yields:** | log attributes **(Object)**, whether Cypress is in interactive mode **(Boolean)**
+**Yields:** | log attributes **(Object)**, whether Cypress is in interactive mode (running via `cypress open`) **(Boolean)**
**Description:** | Fires whenever a command's attributes changes. This event is debounced to prevent it from firing too quickly and too often. Useful to see how internal cypress commands utilize the {% url 'Cypress.log()' cypress-log %} API.
Event | Details
diff --git a/source/api/plugins/after-screenshot-api.md b/source/api/plugins/after-screenshot-api.md
index 1cb66ae01e..f9128a4f6f 100644
--- a/source/api/plugins/after-screenshot-api.md
+++ b/source/api/plugins/after-screenshot-api.md
@@ -2,46 +2,71 @@
title: After Screenshot API
---
-After a screenshot is taken, you can get details about the screenshot via the `after:screenshot` plugin event. This event is called whether a screenshot is taken with {% url `cy.screenshot()` screenshot %} or as a result of a test failure. The event is called after the screenshot image is written to disk.
+After a screenshot is taken, you can get details about the screenshot via the `after:screenshot` plugin event. This event is called when a screenshot is taken with {% url `cy.screenshot()` screenshot %} or as a result of a test failure. The event is called after the screenshot image is written to disk.
-This allows you to record those details or manipulate the image as needed. You can also return updated details about the image.
+This allows you to record those details, manipulate the image as needed, and return the updated details about the image.
+
+# Syntax
+
+```js
+on('after:screenshot', (details) => { /* ... */ })
+```
+
+**{% fa fa-angle-right %} details** ***(object)***
+
+An object describing the screenshot that was taken, with the following properties:
+
+Property | Type | Description
+--- | --- | ---
+`size`| `number` | The size of the image file (in bytes).
+`takenAt` | `string` | The date and time the screenshot was taken. ISO 8601 format in UTC (example: `'2020-03-09T07:30:37.686Z'`)
+`duration` | `number` | Duration taking and saving the screenshot (in milliseconds).
+`dimensions` | `object` | The width and height of the image in pixels (example: `{ width: 100, height: 50 }`)
+`multipart` | `boolean` | Whether the screenshot was stitched together from multiple screenshot images.
+`pixelRatio` | `number` | *(Optional)* The ratio of screenshot pixels to the browser's displayed pixels.
+`name` | `string` | *(Optional)* The `fileName` argument passed in via {% url `cy.screenshot()`" screenshot#Arguments %}
+`specName` | `string` | The name of the specfile where the screenshot was taken.
+`path` | `string` | The absolute path to the image.
+`scaled` | `boolean` | Whether the application under test was scaled to fit into the browser viewport. May be `scale` argument passed in via {% url `cy.screenshot()`" screenshot#Arguments %}
+`blackout` | `array` | The `blackout` argument passed in via {% url `cy.screenshot()`" screenshot#Arguments %}
# Usage
+## Modify screenshot details
+
Using your {% url "`pluginsFile`" plugins-guide %} you can tap into the `after:screenshot` event.
+If you change the `path`, `size` or `dimensions` of the image, you'll want to update the new values so that the details are correctly reported in the test results. *Any other properties besides `path`, `size`, and `dimensions` will be ignored.*
+
+You can return an object or a promise that resolves to an object from the callback function. *Any type of returned value other than an object will be ignored.* The object can contain the following properties:
+
+* **path**: The absolute path to the current location of the image
+* **size**: The size of the current image file (in bytes)
+* **dimensions**: The width and height of the current image in pixels (as an object with the shape `{ width: 100, height: 50 }`)
+
+The properties will be merged into the screenshot details and passed to the `onAfterScreenshot` callback (if defined with {% url 'Cypress.Screenshot.defaults()' screenshot-api %} and/or {% url 'cy.screenshot()' screenshot %}).
+
+### Modify screenshot path
+
+If you move the location of the screenshot image, you'll want to specify the new `path` of the image.
+
```js
// cypress/plugins/index.js
-
const fs = require('fs')
module.exports = (on, config) => {
on('after:screenshot', (details) => {
- // details will look something like this:
- // {
- // size: 10248
- // takenAt: '2018-06-27T20:17:19.537Z'
- // duration: 4071
- // dimensions: { width: 1000, height: 660 }
- // multipart: false
- // pixelRatio: 1
- // name: 'my-screenshot'
- // specName: 'integration/my-spec.js'
- // testFailure: true
- // path: '/path/to/my-screenshot.png'
- // scaled: true
- // blackout: []
- // }
-
- // example of renaming the screenshot file
+ console.log(details) // print all details to terminal
const newPath = '/new/path/to/screenshot.png'
return new Promise((resolve, reject) => {
+ // fs.rename moves the file to the existing directory 'new/path/to'
+ // and renames the image to 'screenshot.png'
fs.rename(details.path, newPath, (err) => {
if (err) return reject(err)
- // because we renamed/moved the image, resolve with the new path
+ // because we renamed and moved the image, resolve with the new path
// so it is accurate in the test results
resolve({ path: newPath })
})
@@ -50,16 +75,6 @@ module.exports = (on, config) => {
}
```
-You can return an object or a promise that resolves an object from the callback function. Any type of value other than an object will be ignored. The object can contain the following properties:
-
-* **path**: absolute path to the image
-* **size**: size of the image file in bytes
-* **dimensions**: width and height of the image in pixels (as an object with the shape `{ width: 100, height: 50 }`)
-
-If you change any of those properties of the image, you should include the new values in the returned object, so that the details are correctly reported in the test results. For example, if you crop the image, return the new size and dimensions of the image.
-
-The properties will be merged into the screenshot details and passed to the `onAfterScreenshot` callback (if defined with {% url 'Cypress.Screenshot.defaults()' screenshot-api %} and/or {% url 'cy.screenshot()' screenshot %}). Any other properties besides *path*, *size*, and *dimensions* will be ignored.
-
# See also
- {% url "`cy.screenshot()`" screenshot %}
diff --git a/source/api/plugins/configuration-api.md b/source/api/plugins/configuration-api.md
index cab6b1b360..f53003f93d 100644
--- a/source/api/plugins/configuration-api.md
+++ b/source/api/plugins/configuration-api.md
@@ -29,7 +29,14 @@ Whenever you return an object from your `pluginFile`, Cypress will take this and
If you don't return an object, then configuration will not be modified.
-Resolved values will show up in your Settings tab.
+{% note warning %}
+The `config` object also includes the following extra values that are not part of the standard configuration. **These values are read only and cannot be modified from the plugins file.**
+
+* `configFile`: The absolute path to the config file. By default, this is `/cypress.json`, but may be a custom path or `false` if using the {% url "`--config-file` flag" command-line#cypress-open-config-file-lt-config-file-gt %}.
+* `projectRoot`: The absolute path to the root of the project (e.g. `/Users/me/dev/my-project`)
+{% endnote %}
+
+Resolved values will show up in the "Settings" tab of the Test Runner.
{% imgTag /img/guides/plugin-configuration.png "Resolved configuration in the Desktop app" %}
diff --git a/source/api/plugins/writing-a-plugin.md b/source/api/plugins/writing-a-plugin.md
index 4d17a1301b..e164c738a1 100644
--- a/source/api/plugins/writing-a-plugin.md
+++ b/source/api/plugins/writing-a-plugin.md
@@ -63,6 +63,13 @@ Some plugins may utilize or require these values, so they can take certain actio
You can programmatically modify these values and Cypress will then respect these changes. This enables you to swap out configuration based on things like the environment you're running in.
+{% note warning %}
+The `config` object also includes the following extra values that are not part of the standard configuration. **These values are read only and cannot be modified from the plugins file.**
+
+* `configFile`: The absolute path to the config file. By default, this is `/cypress.json`, but may be a custom path or `false` if using the {% url "`--config-file` flag" command-line#cypress-open-config-file-lt-config-file-gt %}.
+* `projectRoot`: The absolute path to the root of the project (e.g. `/Users/me/dev/my-project`)
+{% endnote %}
+
{% url "Please check out our API docs for modifying configuration here." configuration-api %}
## List of events
diff --git a/source/api/utilities/$.md b/source/api/utilities/$.md
index fa3a27ddc3..b2c60ca536 100644
--- a/source/api/utilities/$.md
+++ b/source/api/utilities/$.md
@@ -78,3 +78,7 @@ cy.$$.each([1, 2, 3], (index, value) => {
expect(index).to.eq(value)
}) // fails
```
+
+# See also
+
+- {% url 'Bundled Tools' bundled-tools %}
\ No newline at end of file
diff --git a/source/api/utilities/_.md b/source/api/utilities/_.md
index c7b5146d58..2457c2097c 100644
--- a/source/api/utilities/_.md
+++ b/source/api/utilities/_.md
@@ -55,3 +55,7 @@ cy
expect(ids).to.deep.eq([1, 2, 3])
})
```
+
+# See also
+
+- {% url 'Bundled Tools' bundled-tools %}
diff --git a/source/api/utilities/blob.md b/source/api/utilities/blob.md
index 4da765df1a..ddc6b123fa 100644
--- a/source/api/utilities/blob.md
+++ b/source/api/utilities/blob.md
@@ -62,3 +62,7 @@ return Cypress.Blob.imgSrcToDataURL('/assets/img/logo.png').then((dataUrl) => {
cy.get('.utility-blob img').click().should('have.attr', 'src', dataUrl)
})
```
+
+# See also
+
+- {% url 'Bundled Tools' bundled-tools %}
\ No newline at end of file
diff --git a/source/api/utilities/minimatch.md b/source/api/utilities/minimatch.md
index 11ab16789e..2df06d4c1d 100644
--- a/source/api/utilities/minimatch.md
+++ b/source/api/utilities/minimatch.md
@@ -66,3 +66,7 @@ Cypress.minimatch('/foo/bar/baz/123/quux?a=b&c=2', '/foo/*', {
matchBase: false
})
```
+
+# See also
+
+- {% url 'Bundled Tools' bundled-tools %}
\ No newline at end of file
diff --git a/source/api/utilities/moment.md b/source/api/utilities/moment.md
index b1f6618947..4b74140c9a 100644
--- a/source/api/utilities/moment.md
+++ b/source/api/utilities/moment.md
@@ -36,3 +36,8 @@ const todaysDate = Cypress.moment().format('MMM DD, YYYY')
cy.get('span').should('contain', 'Order shipped on: ' + todaysDate)
```
+
+# See also
+
+- {% url 'Bundled Tools' bundled-tools %}
+- {% url `cy.clock()` clock %}
diff --git a/source/api/utilities/promise.md b/source/api/utilities/promise.md
index 61d575d104..3bc5ebfae2 100644
--- a/source/api/utilities/promise.md
+++ b/source/api/utilities/promise.md
@@ -69,3 +69,7 @@ it('waits for promises to resolve', function () {
})
})
```
+
+# See also
+
+- {% url 'Bundled Tools' bundled-tools %}
diff --git a/source/api/utilities/sinon.md b/source/api/utilities/sinon.md
new file mode 100644
index 0000000000..d8949086d5
--- /dev/null
+++ b/source/api/utilities/sinon.md
@@ -0,0 +1,66 @@
+---
+title: Cypress.sinon
+---
+
+Cypress automatically includes {% url 'Sinon.JS' http://sinonjs.org/ %} and exposes it as `Cypress.sinon`. Because commands {% url `cy.spy` spy %} and {% url `cy.stub` stub %} are already wrapping Sinon methods, the most common use for `Cypress.sinon` is to provide flexible {% url matchers https://sinonjs.org/releases/latest/matchers/ %} when doing assertions.
+
+# Syntax
+
+```javascript
+Cypress.sinon.match(value)
+Cypress.sinon.match.
+```
+
+## Usage
+
+**{% fa fa-check-circle green %} Correct Usage**
+
+```javascript
+Cypress.sinon.match.string
+```
+
+**{% fa fa-exclamation-triangle red %} Incorrect Usage**
+
+```javascript
+cy.sinon.match.string // Errors, cannot be chained off 'cy'
+```
+
+# Examples
+
+## `match.string`
+
+This example comes from the recipe {% url "Root style" https://github.com/cypress-io/cypress-example-recipes#testing-the-dom %}. Imagine an application code where the method `setProperty` is called to change a CSS variable:
+
+```js
+document.querySelector('input[type=color]').addEventListener('change', (e) => {
+ document.documentElement.style.setProperty('--background-color', e.target.value)
+})
+```
+
+We can write a test to confirm that the method `setProperty` was called with two strings; we don't care about value of the first string, but we do want to check if it was indeed a string.
+
+```javascript
+cy.document()
+ .its('documentElement.style')
+ .then((style) => {
+ cy.spy(style, 'setProperty').as('setColor')
+ })
+
+cy.get('input[type=color]')
+ .invoke('val', '#ff0000')
+ .trigger('change')
+
+// we don't care about '--background-color' exact
+// value but know it should be a string
+cy.get('@setColor')
+ .should('have.been.calledWith', Cypress.sinon.match.string, '#ff0000')
+```
+
+# See also
+
+- {% url 'Spies, stubs & clocks' https://example.cypress.io/commands/spies-stubs-clocks %} example page
+- {% url 'Sinon matchers' https://sinonjs.org/releases/latest/matchers/ %} documentation page
+- {% url 'Bundled Tools' bundled-tools %}
+- {% url `cy.spy()` spy %}
+- {% url `cy.stub()` stub %}
+- {% url "Stubs, Spies, and Clocks" stubs-spies-and-clocks %} guide
diff --git a/source/examples/examples/recipes.md b/source/examples/examples/recipes.md
index 65f8689573..66b6b80e07 100644
--- a/source/examples/examples/recipes.md
+++ b/source/examples/examples/recipes.md
@@ -7,27 +7,37 @@ Recipes show you how to test common scenarios in Cypress.
{% fa fa-github %} {% url https://github.com/cypress-io/cypress-example-recipes %}
-## Fundamentals
+## Fundamentals
+
Recipe | Description
---- | ---
+--- | ---
{% url 'Node Modules' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/fundamentals__node-modules %} | Import your own Node modules
{% url 'Environment variables' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/server-communication__env-variables %} | Passing environment variables to tests
{% url 'Dynamic tests' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/fundamentals__dynamic-tests %} | Create tests dynamically from data
{% url 'Fixtures' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/fundamentals__fixtures %} | Loading single or multiple fixtures
{% url 'Adding Chai Assertions' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/extending-cypress__chai-assertions %} | Add new or custom chai assertions
{% url 'Cypress module API' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/fundamentals__module-api %} | Run Cypress via its module API
+{% url 'Custom browsers' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/fundamentals__custom-browsers %} | Control which browsers the project can use, or even add a custom browser into the list
+{% url 'Use Chrome Remote Interface' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/fundamentals__chrome-remote-debugging %} | Use Chrome debugger protocol to trigger hover state and print media style
## Testing the DOM
+
Recipe | Description
---- | ---
+--- | ---
{% url 'Tab Handling and Links' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/testing-dom__tab-handling-links %} | Links that open in a new tab
{% url 'Hover and Hidden Elements' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/testing-dom__hover-hidden-elements %} | Test hidden elements requiring hover
{% url 'Form Interactions' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/testing-dom__form-interactions %} | Test form elements like input type `range`
{% url 'Drag and Drop' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/testing-dom__drag-drop %} | Use `.trigger()` to test drag and drop
{% url 'Shadow DOM' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/testing-dom__shadow-dom %} | You need to use any of available custom commands
{% url 'Website monitoring' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/testing-dom__performance-metrics %} | Utilize `cypress` to monitor your website
+{% url 'Waiting for static resource' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/testing-dom__wait-for-resource %} | Shows how to wait for CSS, image, or any other static resource to load
+{% url 'CSV load and table test' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/testing-dom__csv-table %} | Loads CSV file and compares objects against cells in a table
+{% url 'Evaluate performance metrics' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/testing-dom__performance-metrics %} | Utilize Cypress to monitor a website
+{% url 'Root style' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/testing-dom__root-style %} | Trigger input color change that modifies CSS variable
+{% url 'Select widgets' https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/testing-dom__select2 %} | Working with `