diff --git a/.eslintignore b/.eslintignore index e88d53b38534..088756bc013e 100644 --- a/.eslintignore +++ b/.eslintignore @@ -11,8 +11,8 @@ **/support/fixtures/* !**/support/fixtures/projects **/support/fixtures/projects/**/_fixtures/* +**/support/fixtures/projects/**/static/* **/support/fixtures/projects/**/*.jsx -**/support/fixtures/projects/**/jquery.js **/support/fixtures/projects/**/fail.js **/test/fixtures **/vendor @@ -41,4 +41,4 @@ npm/webpack-preprocessor/examples/use-babelrc/cypress/integration/spec.js **/.cy **/.git -/npm/react/bin/* \ No newline at end of file +/npm/react/bin/* diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.md b/.github/ISSUE_TEMPLATE/1-bug-report.md index 6cf5ce6aad9c..f2e186c56683 100644 --- a/.github/ISSUE_TEMPLATE/1-bug-report.md +++ b/.github/ISSUE_TEMPLATE/1-bug-report.md @@ -8,6 +8,8 @@ assignees: '' ### Current behavior diff --git a/.github/ISSUE_TEMPLATE/2-install-issue.md b/.github/ISSUE_TEMPLATE/2-install-issue.md index 4b62b9f56821..24e5c8fc3cf7 100644 --- a/.github/ISSUE_TEMPLATE/2-install-issue.md +++ b/.github/ISSUE_TEMPLATE/2-install-issue.md @@ -8,6 +8,8 @@ assignees: '' ### Current behavior diff --git a/.github/ISSUE_TEMPLATE/3-feature.md b/.github/ISSUE_TEMPLATE/3-feature.md index 574660a202da..d814199486eb 100644 --- a/.github/ISSUE_TEMPLATE/3-feature.md +++ b/.github/ISSUE_TEMPLATE/3-feature.md @@ -8,6 +8,8 @@ assignees: '' ### What would you like? diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 5abfb8a37045..aae61eb3798c 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,8 @@ blank_issues_enabled: false contact_links: - name: 🤔 Questions and Help - url: https://www.cypress.io/support - about: This issue tracker is not for support questions. Please refer to the Cypress community's support. + url: https://github.com/cypress-io/cypress/discussions + about: This issue tracker is not for support questions. Please refer to our Discussions. - name: 📊 Cypress Dashboard Feature url: https://portal.productboard.com/cypress-io/1-cypress-dashboard about: This issue tracker is not for requesting Cypress Dashboard features. Please express interest here. diff --git a/.releaserc.js b/.releaserc.js index 97ebb82363cb..4025bd1ff581 100644 --- a/.releaserc.js +++ b/.releaserc.js @@ -2,5 +2,6 @@ module.exports = { ...require('./.releaserc.base'), branches: [ 'master', + { name: 'chore/webpack-5', channel: 'channel-next' }, ], } diff --git a/appveyor.yml b/appveyor.yml index c3fa5dd3891c..14fe3df6c6b1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,6 +2,7 @@ branches: only: - master - develop + - v6.0-release - /win*/ # https://www.appveyor.com/docs/lang/nodejs-iojs/ diff --git a/circle.yml b/circle.yml index c32c35b2a5e6..079de8a81c03 100644 --- a/circle.yml +++ b/circle.yml @@ -8,7 +8,7 @@ macBuildFilters: &macBuildFilters branches: only: - develop - - remove-old-binary-file + - v6.0-release defaults: &defaults parallelism: 1 @@ -35,6 +35,7 @@ testBinaryFirefox: &testBinaryFirefox branches: only: - develop + - v6.0-release requires: - build-npm-package - build-binary @@ -61,7 +62,7 @@ executors: mac: macos: # Executor should have Node >= required version - xcode: "11.2.1" + xcode: "11.3.1" environment: PLATFORM: mac @@ -120,7 +121,7 @@ commands: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: environment: CYPRESS_KONFIG_ENV: production @@ -162,7 +163,7 @@ commands: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: command: | cmd=$([[ <> == 'true' ]] && echo 'yarn percy exec --') || true @@ -186,7 +187,7 @@ commands: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: command: yarn workspace @packages/server test ./test/e2e/$(( $CIRCLE_NODE_INDEX ))_*spec* --browser <> - verify-mocha-results @@ -237,6 +238,7 @@ commands: steps: - attach_workspace: at: ~/ + - check-conditional-ci - run: name: "Cloning test project: <>" command: | @@ -284,7 +286,6 @@ commands: steps: - attach_workspace: at: ~/ - - check-halt # make sure the binary and NPM package files are present - run: ls -l - run: ls -l cypress.zip cypress.tgz @@ -385,12 +386,12 @@ commands: name: "Waiting on Circle CI jobs: <>" command: node ./scripts/wait-on-circle-jobs.js --job-names="<>" - check-halt: + check-conditional-ci: description: Halt CI if the package that this job corresponds to is unchanged steps: - run: name: Check if job should run - command: yarn check-halt || circleci-agent step halt + command: node scripts/check-conditional-ci.js jobs: ## code checkout and yarn installs @@ -536,7 +537,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: mkdir -p cli/visual-snapshots - run: command: node cli/bin/cypress info --dev | yarn --silent term-to-html | node scripts/sanitize --type cli-info > cli/visual-snapshots/cypress-info.html @@ -561,7 +562,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci # make sure mocha runs - run: yarn test-mocha # test binary build code @@ -607,7 +608,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - install-required-node - run: name: Mocha tests @@ -627,7 +628,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: yarn test-unit --scope @packages/server - verify-mocha-results: expectedResultCount: 1 @@ -641,7 +642,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: yarn test-integration --scope @packages/server - verify-mocha-results: expectedResultCount: 1 @@ -654,7 +655,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: command: yarn workspace @packages/server test-performance - verify-mocha-results: @@ -735,7 +736,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: command: yarn build-prod working_directory: packages/desktop-gui @@ -761,7 +762,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: command: yarn build-prod working_directory: packages/desktop-gui @@ -796,7 +797,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: # builds JS and CSS, and we need the app CSS # to correctly apply component styles @@ -830,7 +831,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: command: yarn build-for-tests working_directory: packages/reporter @@ -852,7 +853,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: command: yarn build-for-tests working_directory: packages/ui-components @@ -874,7 +875,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: command: node index.js working_directory: packages/launcher @@ -884,7 +885,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: name: Build command: yarn workspace @cypress/webpack-preprocessor build @@ -923,7 +924,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: name: Build command: yarn workspace @cypress/vue build @@ -937,7 +938,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: name: Build command: yarn workspace @cypress/react build @@ -966,7 +967,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - restore_cache: name: Restore Cache keys: @@ -990,7 +991,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: name: Run tests command: yarn workspace @cypress/eslint-plugin-dev test @@ -1037,7 +1038,7 @@ jobs: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: $(yarn bin)/print-arch - install-required-node - run: @@ -1070,7 +1071,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: ls -l - run: name: upload unique binary @@ -1088,7 +1089,6 @@ jobs: test-kitchensink: <<: *defaults steps: - - check-halt - clone-repo-and-checkout-release-branch: repo: cypress-example-kitchensink - install-required-node @@ -1115,7 +1115,6 @@ jobs: "test-kitchensink-against-staging": <<: *defaults steps: - - check-halt - clone-repo-and-checkout-release-branch: repo: cypress-example-kitchensink - run: @@ -1140,7 +1139,6 @@ jobs: "test-against-staging": <<: *defaults steps: - - check-halt - clone-repo-and-checkout-release-branch: repo: cypress-test-tiny - run: @@ -1157,7 +1155,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - install-required-node - run: name: Check next dev version @@ -1204,7 +1202,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: ls -l # NPM package file should have filename cypress-.tgz - run: @@ -1227,7 +1225,7 @@ jobs: # needs uploaded NPM and test binary - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: ls -la # make sure JSON files with uploaded urls are present - run: ls -la binary-url.json npm-package-url.json @@ -1265,7 +1263,7 @@ jobs: # needs uploaded NPM and test binary - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: ls -la - post-install-comment @@ -1274,7 +1272,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci # make sure we have cypress.zip received - run: ls -l - run: ls -l cypress.zip cypress.tgz @@ -1310,7 +1308,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci # make sure we have cypress.zip received - run: ls -l - run: ls -l cypress.zip cypress.tgz @@ -1352,7 +1350,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci # make sure we have cypress.zip received - run: ls -l - run: ls -l cypress.zip cypress.tgz @@ -1396,7 +1394,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci # make sure we have cypress.zip received - run: ls -l - run: ls -l cypress.zip cypress.tgz @@ -1440,7 +1438,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci # make sure we have cypress.zip received - run: ls -l - run: ls -l cypress.zip cypress.tgz @@ -1473,7 +1471,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci - run: ls -l # make sure we have the binary and NPM package - run: ls -l cypress.zip cypress.tgz @@ -1609,7 +1607,7 @@ jobs: steps: - attach_workspace: at: ~/ - - check-halt + - check-conditional-ci # the user should be "node" - run: whoami - run: pwd @@ -1830,6 +1828,7 @@ linux-workflow: &linux-workflow branches: only: - develop + - v6.0-release requires: - build - test-kitchensink: @@ -1847,6 +1846,7 @@ linux-workflow: &linux-workflow branches: only: - develop + - v6.0-release requires: - build - build-npm-package: @@ -1858,7 +1858,7 @@ linux-workflow: &linux-workflow branches: only: - develop - - v5.0-release + - v6.0-release requires: - build-npm-package - build-binary: @@ -1870,7 +1870,7 @@ linux-workflow: &linux-workflow branches: only: - develop - - v5.0-release + - v6.0-release requires: - build-binary - test-npm-module-on-minimum-node-version: @@ -1927,7 +1927,7 @@ linux-workflow: &linux-workflow branches: only: - develop - - v5.0-release + - v6.0-release requires: - upload-npm-package - upload-binary @@ -1937,6 +1937,7 @@ linux-workflow: &linux-workflow branches: only: - develop + - v6.0-release requires: - upload-npm-package - upload-binary @@ -1945,6 +1946,7 @@ linux-workflow: &linux-workflow branches: only: - develop + - v6.0-release requires: - build-npm-package - build-binary @@ -1954,6 +1956,7 @@ linux-workflow: &linux-workflow branches: only: - develop + - v6.0-release requires: - build-npm-package - build-binary @@ -1979,8 +1982,7 @@ linux-workflow: &linux-workflow branches: only: - develop - - kevin-v5.0-release-rwa - - v5.0-release + - v6.0-release requires: - build-npm-package - build-binary @@ -2074,6 +2076,7 @@ mac-workflow: &mac-workflow branches: only: - develop + - v6.0-release requires: - Mac NPM package - Mac binary @@ -2086,6 +2089,7 @@ mac-workflow: &mac-workflow branches: only: - develop + - v6.0-release requires: - Mac NPM package upload - Mac binary upload @@ -2098,6 +2102,7 @@ mac-workflow: &mac-workflow branches: only: - develop + - v6.0-release requires: - Mac NPM package upload - Mac binary upload diff --git a/npm/react/CHANGELOG.md b/npm/react/CHANGELOG.md index cabf02a7468a..8bc515cad4fc 100644 --- a/npm/react/CHANGELOG.md +++ b/npm/react/CHANGELOG.md @@ -1,3 +1,10 @@ +# [@cypress/react-v4.15.15](https://github.com/cypress-io/cypress/compare/@cypress/react-v4.15.14...@cypress/react-v4.15.15) (2020-11-10) + + +### Bug Fixes + +* adding build-prod tasks to all of the npm dependencies that need artifacts ([#9045](https://github.com/cypress-io/cypress/issues/9045)) ([550c05c](https://github.com/cypress-io/cypress/commit/550c05cc3d7a2a179de21138ae5f8118277df6ef)) + # [@cypress/react-v4.15.14](https://github.com/cypress-io/cypress/compare/@cypress/react-v4.15.13...@cypress/react-v4.15.14) (2020-10-30) diff --git a/npm/vue/CHANGELOG.md b/npm/vue/CHANGELOG.md index e16df139dec2..3c10ba75195d 100644 --- a/npm/vue/CHANGELOG.md +++ b/npm/vue/CHANGELOG.md @@ -1,3 +1,10 @@ +# [@cypress/vue-v1.0.1-alpha.7](https://github.com/cypress-io/cypress/compare/@cypress/vue-v1.0.1-alpha.6...@cypress/vue-v1.0.1-alpha.7) (2020-11-10) + + +### Bug Fixes + +* adding build-prod tasks to all of the npm dependencies that need artifacts ([#9045](https://github.com/cypress-io/cypress/issues/9045)) ([550c05c](https://github.com/cypress-io/cypress/commit/550c05cc3d7a2a179de21138ae5f8118277df6ef)) + # [@cypress/vue-v1.0.1-alpha.6](https://github.com/cypress-io/cypress/compare/@cypress/vue-v1.0.1-alpha.5...@cypress/vue-v1.0.1-alpha.6) (2020-10-30) diff --git a/npm/vue/package.json b/npm/vue/package.json index 0b3967dfc14e..a91476d5c6c4 100644 --- a/npm/vue/package.json +++ b/npm/vue/package.json @@ -28,14 +28,9 @@ "@babel/preset-env": "7.9.5", "axios": "0.19.2", "babel-loader": "8.1.0", - "ban-sensitive-files": "1.9.7", "css-loader": "3.4.2", "cypress": "*", - "dependency-check": "3.4.1", - "deps-ok": "1.4.1", "eslint-plugin-vue": "^6.2.2", - "git-issues": "1.3.1", - "license-checker": "19.0.0", "mocha": "7.1.1", "tailwindcss": "1.1.4", "typescript": "3.9.6", diff --git a/npm/webpack-preprocessor/CHANGELOG.md b/npm/webpack-preprocessor/CHANGELOG.md index e72aab290d66..96576b35d580 100644 --- a/npm/webpack-preprocessor/CHANGELOG.md +++ b/npm/webpack-preprocessor/CHANGELOG.md @@ -1,3 +1,10 @@ +# [@cypress/webpack-preprocessor-v5.4.11](https://github.com/cypress-io/cypress/compare/@cypress/webpack-preprocessor-v5.4.10...@cypress/webpack-preprocessor-v5.4.11) (2020-11-10) + + +### Bug Fixes + +* adding build-prod tasks to all of the npm dependencies that need artifacts ([#9045](https://github.com/cypress-io/cypress/issues/9045)) ([550c05c](https://github.com/cypress-io/cypress/commit/550c05cc3d7a2a179de21138ae5f8118277df6ef)) + # [@cypress/webpack-preprocessor-v5.4.10](https://github.com/cypress-io/cypress/compare/@cypress/webpack-preprocessor-v5.4.9...@cypress/webpack-preprocessor-v5.4.10) (2020-10-30) diff --git a/package.json b/package.json index 6cd7688d4bc3..f1573892eeec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cypress", - "version": "5.5.0", + "version": "5.6.0", "description": "Cypress.io end to end testing tool", "private": true, "scripts": { @@ -14,7 +14,6 @@ "build": "lerna run build --stream", "build-prod": "lerna run build-prod --stream", "bump": "node ./scripts/binary.js bump", - "check-halt": "node scripts/check-halt.js", "check-next-dev-version": "node scripts/check-next-dev-version.js", "check-node-version": "node scripts/check-node-version.js", "check-terminal": "node scripts/check-terminal.js", diff --git a/packages/desktop-gui/cypress/integration/release_notes_spec.js b/packages/desktop-gui/cypress/integration/release_notes_spec.js index c67d89841329..121056ad83c0 100644 --- a/packages/desktop-gui/cypress/integration/release_notes_spec.js +++ b/packages/desktop-gui/cypress/integration/release_notes_spec.js @@ -10,7 +10,7 @@ describe('Release Notes', () => { cy.fixture('user').then((theUser) => user = theUser) cy.fixture('release_notes').then((theReleaseNotes) => releaseNotes = theReleaseNotes) - cy.route2('cypress-banner.jpg', { fixture: 'cypress-banner.jpg' }) + cy.http('cypress-banner.jpg', { fixture: 'cypress-banner.jpg' }) cy.visitIndex().then((win) => { ipc = win.App.ipc @@ -43,6 +43,15 @@ describe('Release Notes', () => { cy.contains('Update to Version 1.2.3').should('be.visible') }) + it('shows update instructions if release notes does not include title or content', () => { + // if this hasn't been released on on.cypress.io yet, it will use the default redirect + // and not a 404 error, which returns an empty object + // also protects against the data not being correct in any case + getReleaseNotes.resolve({}) + cy.get('.update-notice').contains('Learn more').click() + cy.contains('Update to Version 1.2.3').should('be.visible') + }) + it('shows update instructions if getting release notes errors', () => { getReleaseNotes.reject(new Error('something went wrong')) cy.get('.update-notice').contains('Learn more').click() diff --git a/packages/desktop-gui/cypress/support/index.js b/packages/desktop-gui/cypress/support/index.js index d2f7e8fce683..fae0e84e7afd 100644 --- a/packages/desktop-gui/cypress/support/index.js +++ b/packages/desktop-gui/cypress/support/index.js @@ -26,7 +26,7 @@ Cypress.Commands.add('visitIndex', (options = {}) => { // disable livereload within the Cypress-loaded desktop GUI. it doesn't fully // reload the app because the stubbed out ipc calls don't work after the first // time, so it ends up a useless white page - cy.route2({ path: /livereload/ }, '') + cy.http({ path: /livereload/ }, '') cy.visit('/', options) }) diff --git a/packages/desktop-gui/src/update/updates.js b/packages/desktop-gui/src/update/updates.js index e000001ff06e..37e77b4c266a 100644 --- a/packages/desktop-gui/src/update/updates.js +++ b/packages/desktop-gui/src/update/updates.js @@ -42,10 +42,17 @@ export const getReleaseNotes = (version) => { ipc.getReleaseNotes(version) .then((releaseNotes) => { + if (!releaseNotes || !releaseNotes.title || !releaseNotes.content) { + updateStore.setReleaseNotes(undefined) + updateStore.setState(updateStore.SHOW_INSTRUCTIONS) + + return + } + updateStore.setReleaseNotes(releaseNotes) - updateStore.setState(releaseNotes ? updateStore.SHOW_RELEASE_NOTES : updateStore.SHOW_INSTRUCTIONS) + updateStore.setState(updateStore.SHOW_RELEASE_NOTES) }) - .catch((err) => { + .catch(() => { updateStore.setReleaseNotes(undefined) updateStore.setState(updateStore.SHOW_INSTRUCTIONS) }) diff --git a/packages/driver/cypress/fixtures/boolean.json b/packages/driver/cypress/fixtures/boolean.json new file mode 100644 index 000000000000..27ba77ddaf61 --- /dev/null +++ b/packages/driver/cypress/fixtures/boolean.json @@ -0,0 +1 @@ +true diff --git a/packages/driver/cypress/fixtures/number.json b/packages/driver/cypress/fixtures/number.json new file mode 100644 index 000000000000..8351c19397f4 --- /dev/null +++ b/packages/driver/cypress/fixtures/number.json @@ -0,0 +1 @@ +14 diff --git a/packages/driver/cypress/integration/commands/actions/type_spec.js b/packages/driver/cypress/integration/commands/actions/type_spec.js index aab86427598e..422c9478a700 100644 --- a/packages/driver/cypress/integration/commands/actions/type_spec.js +++ b/packages/driver/cypress/integration/commands/actions/type_spec.js @@ -2378,6 +2378,77 @@ describe('src/cy/commands/actions/type - #type', () => { }) }) + // https://github.com/cypress-io/cypress/issues/5694 + describe('shortcuts', () => { + beforeEach(function () { + cy.visit('fixtures/dom.html') + cy.on('log:added', (attrs, log) => { + this.lastLog = log + }) + }) + + it('releases modfier keys at the end of the shortcut sequence', () => { + cy.get(':text:first').type('h{ctrl+alt++}i') + .then(function ($input) { + const table = this.lastLog.invoke('consoleProps').table[2]() + + // eslint-disable-next-line + console.table(table.data, table.columns) + + const beforeinput = Cypress.isBrowser('firefox') ? '' : ' beforeinput,' + + expect(table.name).to.eq('Keyboard Events') + const expectedTable = { + 1: { 'Details': '{ code: KeyH, which: 72 }', Typed: 'h', 'Events Fired': `keydown, keypress,${beforeinput} textInput, input, keyup`, 'Active Modifiers': null, 'Prevented Default': null, 'Target Element': $input[0] }, + 2: { 'Details': '{ code: ControlLeft, which: 17 }', Typed: '{ctrl}', 'Events Fired': 'keydown', 'Active Modifiers': 'ctrl', 'Prevented Default': null, 'Target Element': $input[0] }, + 3: { 'Details': '{ code: AltLeft, which: 18 }', Typed: '{alt}', 'Events Fired': 'keydown', 'Active Modifiers': 'alt, ctrl', 'Prevented Default': null, 'Target Element': $input[0] }, + 4: { 'Details': '{ code: Equal, which: 187 }', Typed: '+', 'Events Fired': 'keydown, keyup', 'Active Modifiers': 'alt, ctrl', 'Prevented Default': null, 'Target Element': $input[0] }, + 5: { 'Details': '{ code: AltLeft, which: 18 }', Typed: '{alt}', 'Events Fired': 'keyup', 'Active Modifiers': 'ctrl', 'Prevented Default': null, 'Target Element': $input[0] }, + 6: { 'Details': '{ code: ControlLeft, which: 17 }', Typed: '{ctrl}', 'Events Fired': 'keyup', 'Active Modifiers': null, 'Prevented Default': null, 'Target Element': $input[0] }, + 7: { 'Details': '{ code: KeyI, which: 73 }', Typed: 'i', 'Events Fired': `keydown, keypress,${beforeinput} textInput, input, keyup`, 'Active Modifiers': null, 'Prevented Default': null, 'Target Element': $input[0] }, + } + + // uncomment for debugging + // _.each(table.data, (v, i) => expect(v).containSubset(expectedTable[i])) + expect(table.data).to.deep.eq(expectedTable) + }) + }) + + it('can type a shortcut with special characters', () => { + // NOTE: the default actions we implement will NOT be taken into account with modifiers + // e.g. we do not the delete the entire word with ctrl+backspace + // this matches the same behavior as cy.type('{ctrl}{backspace}') + // TODO: maybe change this in the future, it's just more work + cy.get(':text:first').type('foo{ctrl+backspace}bar') + .should('have.value', 'fobar') + }) + + it('does not input text when non-shift modifier', () => { + // NOTE: in this case the modifier DOES change the default action (when modifier other than Shift is applied, do not insert text) + // since most users want to test a user issuing a shortcut, and it's simple for us to implement + cy.get(':text:first').type('{ctrl+b}hi') + .should('have.value', 'hi') + }) + + it('throws an error when a wrong modifier is given', () => { + cy.on('fail', (err) => { + expect(err.message).to.eq('`asdf` is not a modifier.') + }) + + cy.get(':text:first').type('{asdf+x}hi') + }) + + it('throws an error when shortcut is missing key', () => { + cy.on('fail', (err) => { + expect(err.message).to.contain('{ctrl+}') + expect(err.message).to.contain('is not recognized') + expect(err.message).to.contain('alt, option, ctrl') + }) + + cy.get(':text:first').type('{ctrl+}hi') + }) + }) + describe('case-insensitivity', () => { it('special chars are case-insensitive', () => { cy.get(':text:first').invoke('val', 'bar').type('{leftarrow}{DeL}').then(($input) => { diff --git a/packages/driver/cypress/integration/commands/net_stubbing_spec.ts b/packages/driver/cypress/integration/commands/net_stubbing_spec.ts index 6b494a3cc20c..b52b79c8a94f 100644 --- a/packages/driver/cypress/integration/commands/net_stubbing_spec.ts +++ b/packages/driver/cypress/integration/commands/net_stubbing_spec.ts @@ -6,13 +6,35 @@ describe('network stubbing', { retries: 2 }, function () { }) context('cy.route2()', function () { + it('emits a warning', function () { + cy.route2('*') + .then(() => expect(Cypress.utils.warning).to.be.calledWith('`cy.route2()` was renamed to `cy.http()` and will be removed in a future release. Please update usages of `cy.route2()` to use `cy.http()` instead.')) + }) + + it('calls through to cy.http()', function (done) { + cy.route2('*', 'hello world').then(() => { + $.get('/abc123').done((responseText, _, xhr) => { + expect(responseText).to.eq('hello world') + + done() + }) + }) + }) + + it('can be used with cy.wait', function () { + cy.route2('*', 'hello world').as('foo') + .then(() => $.get('/abc123')).wait('@foo') + }) + }) + + context('cy.http()', function () { beforeEach(function () { // we don't use cy.spy() because it causes an infinite loop with logging events this.sandbox = sinon.createSandbox() this.emit = this.sandbox.spy(Cypress, 'emit').withArgs('backend:request', 'net', 'route:added') this.testRoute = function (options, handler, expectedEvent, expectedRoute) { - cy.route2(options, handler).then(function () { + cy.http(options, handler).then(function () { const handlerId = _.findKey(state('routes'), { handler }) const route = state('routes')[handlerId!] @@ -174,7 +196,7 @@ describe('network stubbing', { retries: 2 }, function () { // https://github.com/cypress-io/cypress/issues/8729 it('resolve ambiguity between overloaded definitions', () => { - cy.route2('POST', 'http://dummy.restapiexample.com/api/v1/create').as('create') + cy.http('POST', 'http://dummy.restapiexample.com/api/v1/create').as('create') cy.window().then((win) => { win.eval( @@ -187,17 +209,17 @@ describe('network stubbing', { retries: 2 }, function () { cy.wait('@create') }) - // TODO: implement warning in cy.route2 if appropriate + // TODO: implement warning in cy.http if appropriate // https://github.com/cypress-io/cypress/issues/2372 it.skip('warns if a percent-encoded URL is used', function () { - cy.route2('GET', '/foo%25bar').then(function () { - expect(Cypress.utils.warning).to.be.calledWith('A URL with percent-encoded characters was passed to cy.route2(), but cy.route2() expects a decoded URL.\n\nDid you mean to pass "/foo%bar"?') + cy.http('GET', '/foo%25bar').then(function () { + expect(Cypress.utils.warning).to.be.calledWith('A URL with percent-encoded characters was passed to cy.http(), but cy.http() expects a decoded URL.\n\nDid you mean to pass "/foo%bar"?') }) }) // NOTE: see todo on 'warns if a percent-encoded URL is used' it.skip('does not warn if an invalid percent-encoded URL is used', function () { - cy.route2('GET', 'http://example.com/%E0%A4%A').then(function () { + cy.http('GET', 'http://example.com/%E0%A4%A').then(function () { expect(Cypress.utils.warning).to.not.be.called }) }) @@ -215,7 +237,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('has name of route', function () { - cy.route2('/foo', {}).then(function () { + cy.http('/foo', {}).then(function () { let lastLog lastLog = this.lastLog @@ -225,7 +247,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('uses the wildcard URL', function () { - cy.route2('*', {}).then(function () { + cy.http('*', {}).then(function () { let lastLog lastLog = this.lastLog @@ -236,7 +258,7 @@ describe('network stubbing', { retries: 2 }, function () { // TODO: implement log niceties it.skip('#consoleProps', function () { - cy.route2('*', { + cy.http('*', { foo: 'bar', }).as('foo').then(function () { expect(this.lastLog.invoke('consoleProps')).to.deep.eq({ @@ -254,7 +276,7 @@ describe('network stubbing', { retries: 2 }, function () { describe('numResponses', function () { it('is initially 0', function () { - cy.route2(/foo/, {}).then(() => { + cy.http(/foo/, {}).then(() => { let lastLog lastLog = this.lastLog @@ -264,13 +286,13 @@ describe('network stubbing', { retries: 2 }, function () { }) it('is incremented to 2', function () { - cy.route2(/foo/, {}).then(function () { + cy.http(/foo/, {}).then(function () { $.get('/foo') }).wrap(this).invoke('lastLog.get', 'numResponses').should('eq', 1) }) it('is incremented for each matching request', function () { - cy.route2(/foo/, {}).then(function () { + cy.http(/foo/, {}).then(function () { return Promise.all([$.get('/foo'), $.get('/foo'), $.get('/foo')]) }).wrap(this).invoke('lastLog.get', 'numResponses').should('eq', 3) }) @@ -295,7 +317,7 @@ describe('network stubbing', { retries: 2 }, function () { }) // @ts-ignore: should fail - cy.route2({ + cy.http({ // @ts-ignore url: {}, }) @@ -304,12 +326,12 @@ describe('network stubbing', { retries: 2 }, function () { // TODO: not currently implemented it.skip('fails when method is invalid', function (done) { cy.on('fail', function (err) { - expect(err.message).to.include('cy.route2() was called with an invalid method: \'POSTS\'.') + expect(err.message).to.include('cy.http() was called with an invalid method: \'POSTS\'.') done() }) - cy.route2('post', '/foo', {}) + cy.http('post', '/foo', {}) }) it('requires a url when given a response', function (done) { @@ -319,18 +341,18 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2({}) + cy.http({}) }) it('requires arguments', function (done) { cy.on('fail', function (err) { - expect(err.message).to.include('An invalid RouteMatcher was supplied to `cy.route2()`. The RouteMatcher does not contain any keys. You must pass something to match on.') + expect(err.message).to.include('An invalid RouteMatcher was supplied to `cy.http()`. The RouteMatcher does not contain any keys. You must pass something to match on.') done() }) // @ts-ignore - should fail - cy.route2() + cy.http() }) context('with invalid RouteMatcher', function () { @@ -341,7 +363,7 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2({ + cy.http({ headers: { foo: 'bar', FOO: 'bar', @@ -357,7 +379,7 @@ describe('network stubbing', { retries: 2 }, function () { }) // @ts-ignore this is invalid on purpose - cy.route2({ + cy.http({ headers: { good: 'string', fine: /regexp/, @@ -381,7 +403,7 @@ describe('network stubbing', { retries: 2 }, function () { }) // @ts-ignore - this should error - cy.route2('/', handler) + cy.http('/', handler) }) }) }) @@ -425,7 +447,7 @@ describe('network stubbing', { retries: 2 }, function () { }) // @ts-ignore - this should error - cy.route2('/', handler) + cy.http('/', handler) }) }) }) @@ -451,7 +473,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('different origin (HTTP)', function () { - cy.route2('/foo').as('foo') + cy.http('/foo').as('foo') .then(() => { $.get('http://baz.foobar.com:3501/foo') }) @@ -459,7 +481,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('different origin with response interception (HTTP)', function () { - cy.route2('/xhr.html', (req) => { + cy.http('/xhr.html', (req) => { req.reply((res) => { expect(res.body).to.include('xhr fixture') res.body = 'replaced the body' @@ -476,7 +498,7 @@ describe('network stubbing', { retries: 2 }, function () { // @see https://github.com/cypress-io/cypress/issues/8487 it('different origin (HTTPS)', function () { - cy.route2('/foo', 'somethin').as('foo') + cy.http('/foo', 'somethin').as('foo') .then(() => { $.get('https://bar.foobar.com.invalid:3502/foo') }) @@ -484,7 +506,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('different origin with response interception (HTTPS)', function () { - cy.route2('/xhr.html', (req) => { + cy.http('/xhr.html', (req) => { req.reply((res) => { expect(res.body).to.include('xhr fixture') res.body = 'replaced the body' @@ -503,7 +525,7 @@ describe('network stubbing', { retries: 2 }, function () { context('stubbing with static responses', function () { it('can stub a response with static body as string', function (done) { - cy.route2({ + cy.http({ url: '*', }, 'hello world').then(() => { $.get('/abc123').done((responseText, _, xhr) => { @@ -516,11 +538,11 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can stub a cy.visit with static body', function () { - cy.route2('/foo', 'hello cruel world').visit('/foo').document().should('contain.text', 'hello cruel world') + cy.http('/foo', 'hello cruel world').visit('/foo').document().should('contain.text', 'hello cruel world') }) it('can stub a response with an empty StaticResponse', function (done) { - cy.route2('/', {}).then(() => { + cy.http('/', {}).then(() => { $.get('/').done((responseText, _, xhr) => { expect(xhr.status).to.eq(200) expect(responseText).to.eq('') @@ -531,7 +553,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can stub a response with a network error', function (done) { - cy.route2('/', { + cy.http('/', { forceNetworkError: true, }).then(() => { $.get('/').fail((xhr) => { @@ -544,7 +566,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can use regular strings as response', function () { - cy.route2('/foo', 'foo bar baz').as('getFoo').then(function (win) { + cy.http('/foo', 'foo bar baz').as('getFoo').then(function (win) { $.get('/foo') }).wait('@getFoo').then(function (res) { expect(res.response.body).to.eq('foo bar baz') @@ -552,7 +574,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can stub requests with uncommon HTTP methods', function () { - cy.route2('PROPFIND', '/foo', 'foo bar baz').as('getFoo').then(function (win) { + cy.http('PROPFIND', '/foo', 'foo bar baz').as('getFoo').then(function (win) { $.ajax({ url: '/foo', method: 'PROPFIND', @@ -565,7 +587,7 @@ describe('network stubbing', { retries: 2 }, function () { it('can stub a response with an array', function (done) { const response = ['foo', 'bar', { foo: 'baz' }] - cy.route2({ + cy.http({ url: '*', }, response).then(() => { $.get('/abc123').done((responseJson, _, xhr) => { @@ -580,7 +602,7 @@ describe('network stubbing', { retries: 2 }, function () { // TODO: flaky - unable to reproduce outside of CI it('still works after a cy.visit', { retries: 2 }, function () { - cy.route2(/foo/, { + cy.http(/foo/, { body: JSON.stringify({ foo: 'bar' }), headers: { 'content-type': 'application/json', @@ -611,7 +633,7 @@ describe('network stubbing', { retries: 2 }, function () { } it('with explicit StaticResponse', function (done) { - cy.route2({ + cy.http({ url: '*', }, { body: [], @@ -619,25 +641,25 @@ describe('network stubbing', { retries: 2 }, function () { }) it('with body shorthand', function (done) { - cy.route2('*', []).then(assertEmptyArray(done)) + cy.http('*', []).then(assertEmptyArray(done)) }) it('with method, url, res shorthand', function (done) { - cy.route2('GET', '*', []).then(assertEmptyArray(done)) + cy.http('GET', '*', []).then(assertEmptyArray(done)) }) it('in req.reply', function (done) { - cy.route2('*', (req) => req.reply([])).then(assertEmptyArray(done)) + cy.http('*', (req) => req.reply([])).then(assertEmptyArray(done)) }) it('in res.send', function (done) { - cy.route2('*', (req) => req.reply((res) => res.send(200, []))).then(assertEmptyArray(done)) + cy.http('*', (req) => req.reply((res) => res.send(200, []))).then(assertEmptyArray(done)) }) }) context('fixtures', function () { it('can stub a response with a JSON object', function () { - cy.route2({ + cy.http({ method: 'POST', url: '/test-xhr', }, { @@ -648,7 +670,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('works with content-type override', function () { - cy.route2({ + cy.http({ method: 'POST', url: '/test-xhr', }, { @@ -662,7 +684,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('works if the JSON file has null content', function () { - cy.route2({ + cy.http({ method: 'POST', url: '/test-xhr', }, { @@ -676,7 +698,7 @@ describe('network stubbing', { retries: 2 }, function () { it('works with images', function () { cy.visit('/fixtures/img-embed.html') .contains('div', 'error loading image') - .route2('non-existing-image.png', { fixture: 'media/cypress.png' }) + .http('non-existing-image.png', { fixture: 'media/cypress.png' }) .reload() .contains('div', 'it loaded') }) @@ -685,7 +707,7 @@ describe('network stubbing', { retries: 2 }, function () { context('intercepting request', function () { it('receives the original request in handler', function (done) { - cy.route2('/def456', function (req) { + cy.http('/def456', function (req) { req.reply({ statusCode: 404, }) @@ -704,7 +726,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('receives the original request body in handler', function (done) { - cy.route2('/aaa', function (req) { + cy.http('/aaa', function (req) { expect(req.body).to.eq('foo-bar-baz') done() @@ -714,16 +736,16 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can modify original request body and have it passed to next handler', function (done) { - cy.route2('/post-only', function (req) { + cy.http('/post-only', function (req) { expect(req.body).to.eq('foo-bar-baz') req.body = 'quuz' }).then(function () { - cy.route2('/post-only', function (req) { + cy.http('/post-only', function (req) { expect(req.body).to.eq('quuz') req.body = 'quux' }) }).then(function () { - cy.route2('/post-only', function (req) { + cy.http('/post-only', function (req) { expect(req.body).to.eq('quux') done() @@ -734,7 +756,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can modify a cy.visit before it goes out', function () { - cy.route2('/dump-headers', function (req) { + cy.http('/dump-headers', function (req) { expect(req.headers['foo']).to.eq('bar') req.headers['foo'] = 'quux' @@ -751,7 +773,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can modify the request URL and headers', function (done) { - cy.route2('/does-not-exist', function (req) { + cy.http('/does-not-exist', function (req) { expect(req.headers['foo']).to.eq('bar') req.url = 'http://localhost:3500/dump-headers' @@ -772,7 +794,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can modify the request method', function (done) { - cy.route2('/dump-method', function (req) { + cy.http('/dump-method', function (req) { expect(req.method).to.eq('POST') req.method = 'PATCH' @@ -788,7 +810,7 @@ describe('network stubbing', { retries: 2 }, function () { it('can modify the request body', function (done) { const body = '{"foo":"bar"}' - cy.route2('/post-only', function (req) { + cy.http('/post-only', function (req) { expect(req.body).to.eq('quuz') req.headers['content-type'] = 'application/json' @@ -805,7 +827,7 @@ describe('network stubbing', { retries: 2 }, function () { it('can add a body to a request that does not have one', function (done) { const body = '{"foo":"bar"}' - cy.route2('/post-only', function (req) { + cy.http('/post-only', function (req) { expect(req.body).to.eq('') expect(req.method).to.eq('GET') req.method = 'POST' @@ -822,7 +844,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can reply with a JSON fixture', function () { - cy.route2({ + cy.http({ method: 'POST', url: '/test-xhr', }, (req) => { @@ -840,7 +862,7 @@ describe('network stubbing', { retries: 2 }, function () { const delayMs = 250 const expectedSeconds = payload.length / (1024 * throttleKbps) + delayMs / 1000 - cy.route2('/timeout', (req) => { + cy.http('/timeout', (req) => { this.start = Date.now() req.reply({ @@ -861,19 +883,19 @@ describe('network stubbing', { retries: 2 }, function () { context('matches requests as expected', function () { it('handles querystrings as expected', function () { - cy.route2({ + cy.http({ query: { foo: 'b*r', baz: /quu[x]/, }, }).as('first') - .route2({ + .http({ path: '/abc?foo=bar&baz=qu*x*', }).as('second') - .route2({ + .http({ pathname: '/abc', }).as('third') - .route2('*', 'it worked').as('final') + .http('*', 'it worked').as('final') .then(() => { return $.get('/abc?foo=bar&baz=quux') }) @@ -885,7 +907,7 @@ describe('network stubbing', { retries: 2 }, function () { // @see https://github.com/cypress-io/cypress/issues/8921 it('with case-insensitive header matching', function () { - cy.route2({ + cy.http({ headers: { 'X-some-Thing': 'foo', }, @@ -905,7 +927,7 @@ describe('network stubbing', { retries: 2 }, function () { context('with StaticResponse shorthand', function () { it('req.reply(body)', function () { - cy.route2('/foo', function (req) { + cy.http('/foo', function (req) { req.reply('baz') }) .then(() => $.get('/foo')) @@ -913,7 +935,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('req.reply(json)', function () { - cy.route2('/foo', function (req) { + cy.http('/foo', function (req) { req.reply({ baz: 'quux' }) }) .then(() => $.getJSON('/foo')) @@ -921,7 +943,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('req.reply(status)', function () { - cy.route2('/foo', function (req) { + cy.http('/foo', function (req) { req.reply(777) }) .then(() => { @@ -933,7 +955,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('req.reply(status, body)', function () { - cy.route2('/foo', function (req) { + cy.http('/foo', function (req) { req.reply(777, 'bar') }) .then(() => { @@ -947,7 +969,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('req.reply(status, json)', function () { - cy.route2('/foo', function (req) { + cy.http('/foo', function (req) { req.reply(777, { bar: 'baz' }) }) .then(() => { @@ -961,7 +983,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('req.reply(status, json, headers)', function () { - cy.route2('/foo', function (req) { + cy.http('/foo', function (req) { req.reply(777, { bar: 'baz' }, { 'x-quux': 'quuz' }) }) .then(() => { @@ -977,7 +999,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can forceNetworkError', function (done) { - cy.route2('/foo', function (req) { + cy.http('/foo', function (req) { req.reply({ forceNetworkError: true }) }) .then(() => { @@ -996,13 +1018,13 @@ describe('network stubbing', { retries: 2 }, function () { context('request handler chaining', function () { it('passes request through in order', function () { - cy.route2('/dump-method', function (req) { + cy.http('/dump-method', function (req) { expect(req.method).to.eq('GET') req.method = 'POST' - }).route2('/dump-method', function (req) { + }).http('/dump-method', function (req) { expect(req.method).to.eq('POST') req.method = 'PATCH' - }).route2('/dump-method', function (req) { + }).http('/dump-method', function (req) { expect(req.method).to.eq('PATCH') req.reply() @@ -1010,10 +1032,10 @@ describe('network stubbing', { retries: 2 }, function () { }) it('stops passing request through once req.reply called', function () { - cy.route2('/dump-method', function (req) { + cy.http('/dump-method', function (req) { expect(req.method).to.eq('GET') req.method = 'POST' - }).route2('/dump-method', function (req) { + }).http('/dump-method', function (req) { expect(req.method).to.eq('POST') req.reply() @@ -1028,7 +1050,7 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2('/dump-method', function (req) { + cy.http('/dump-method', function (req) { req.reply() req.reply() @@ -1041,7 +1063,7 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2('/dump-method', function (req) { + cy.http('/dump-method', function (req) { setTimeout(() => req.reply(), 50) }).visit('/dump-method') }) @@ -1052,7 +1074,7 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2('/dump-method', function (req) { + cy.http('/dump-method', function (req) { setTimeout(() => req.reply(), 50) return Promise.resolve() @@ -1061,7 +1083,7 @@ describe('network stubbing', { retries: 2 }, function () { it('fails test if an exception is thrown in req handler', function (done) { cy.on('fail', (err2) => { - expect(err2.message).to.contain('A request callback passed to `cy.route2()` threw an error while intercepting a request') + expect(err2.message).to.contain('A request callback passed to `cy.http()` threw an error while intercepting a request') .and.contain(err.message) done() @@ -1069,20 +1091,20 @@ describe('network stubbing', { retries: 2 }, function () { const err = new Error('bar') - cy.route2('/foo', () => { + cy.http('/foo', () => { throw err }).visit('/foo') }) it('fails test if req.reply is called with an invalid StaticResponse', function (done) { cy.on('fail', (err) => { - expect(err.message).to.contain('A request callback passed to `cy.route2()` threw an error while intercepting a request') + expect(err.message).to.contain('A request callback passed to `cy.http()` threw an error while intercepting a request') .and.contain('must be a number between 100 and 999 (inclusive).') done() }) - cy.route2('/foo', (req) => { + cy.http('/foo', (req) => { req.reply({ statusCode: 1 }) }).visit('/foo') }) @@ -1091,12 +1113,12 @@ describe('network stubbing', { retries: 2 }, function () { defaultCommandTimeout: 50, }, function (done) { cy.on('fail', (err) => { - expect(err.message).to.match(/^A request callback passed to `cy.route2\(\)` timed out after returning a Promise that took more than the `defaultCommandTimeout` of `50ms` to resolve\./) + expect(err.message).to.match(/^A request callback passed to `cy.http\(\)` timed out after returning a Promise that took more than the `defaultCommandTimeout` of `50ms` to resolve\./) done() }) - cy.route2('/foo', () => { + cy.http('/foo', () => { return Promise.delay(200) }).visit('/foo') }) @@ -1105,7 +1127,7 @@ describe('network stubbing', { retries: 2 }, function () { context('intercepting response', function () { it('receives the original response in handler', function (done) { - cy.route2('/json-content-type', function (req) { + cy.http('/json-content-type', function (req) { req.reply(function (res) { expect(res.body).to.eq('{}') @@ -1122,7 +1144,7 @@ describe('network stubbing', { retries: 2 }, function () { const href = `/fixtures/generic.html?t=${Date.now()}` const url = `/redirect?href=${encodeURIComponent(href)}` - cy.route2('/redirect', (req) => { + cy.http('/redirect', (req) => { req.reply((res) => { expect(res.statusCode).to.eq(301) expect(res.headers.location).to.eq(href) @@ -1130,7 +1152,7 @@ describe('network stubbing', { retries: 2 }, function () { }) }) .as('redirect') - .route2('/fixtures/generic.html').as('dest') + .http('/fixtures/generic.html').as('dest') .then(() => fetch(url)) .wait('@redirect') .wait('@dest') @@ -1141,7 +1163,7 @@ describe('network stubbing', { retries: 2 }, function () { const href = `/fixtures/generic.html?t=${Date.now()}` const url = `/redirect?href=${encodeURIComponent(href)}` - cy.route2('/redirect', (req) => { + cy.http('/redirect', (req) => { req.followRedirect = true req.reply((res) => { expect(res.body).to.include('Some generic content') @@ -1159,7 +1181,7 @@ describe('network stubbing', { retries: 2 }, function () { const url = `/fixtures/generic.html?t=${Date.now()}` let hits = 0 - cy.route2('/fixtures/generic.html', (req) => { + cy.http('/fixtures/generic.html', (req) => { req.reply((res) => { // the second time the request is sent, headers should have been passed // that result in Express serving a 304 @@ -1184,7 +1206,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can intercept a large proxy response', function (done) { - cy.route2('/1mb', (req) => { + cy.http('/1mb', (req) => { req.reply((res) => { res.send() }) @@ -1199,7 +1221,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can delay a proxy response using res.delay', function (done) { - cy.route2('/timeout', (req) => { + cy.http('/timeout', (req) => { req.reply((res) => { this.start = Date.now() @@ -1217,7 +1239,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can \'delay\' a proxy response using Promise.delay', function (done) { - cy.route2('/timeout', (req) => { + cy.http('/timeout', (req) => { req.reply((res) => { this.start = Date.now() @@ -1237,7 +1259,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can throttle a proxy response using res.throttle', function (done) { - cy.route2('/1mb', (req) => { + cy.http('/1mb', (req) => { // don't let gzip make response smaller and throw off the timing delete req.headers['accept-encoding'] @@ -1262,7 +1284,7 @@ describe('network stubbing', { retries: 2 }, function () { const kbps = 10 const expectedSeconds = payload.length / (1024 * kbps) - cy.route2('/timeout', (req) => { + cy.http('/timeout', (req) => { req.reply((res) => { this.start = Date.now() @@ -1286,7 +1308,7 @@ describe('network stubbing', { retries: 2 }, function () { expectedSeconds += delayMs / 1000 - cy.route2('/timeout', (req) => { + cy.http('/timeout', (req) => { req.reply((res) => { this.start = Date.now() @@ -1306,7 +1328,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can reply with a JSON fixture', function () { - cy.route2({ + cy.http({ method: 'POST', url: '/test-xhr', }, (req) => { @@ -1327,7 +1349,7 @@ describe('network stubbing', { retries: 2 }, function () { context('with StaticResponse', function () { it('res.send(body)', function () { - cy.route2('/custom-headers', function (req) { + cy.http('/custom-headers', function (req) { req.reply((res) => { res.send('baz') }) @@ -1344,7 +1366,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('res.send(json)', function () { - cy.route2('/custom-headers', function (req) { + cy.http('/custom-headers', function (req) { req.reply((res) => { res.send({ baz: 'quux' }) }) @@ -1363,7 +1385,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('res.send(status)', function (done) { - cy.route2('/custom-headers', function (req) { + cy.http('/custom-headers', function (req) { req.reply((res) => { res.send(777) }) @@ -1383,7 +1405,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('res.send(status, body)', function (done) { - cy.route2('/custom-headers', function (req) { + cy.http('/custom-headers', function (req) { req.reply((res) => { res.send(777, 'bar') }) @@ -1402,7 +1424,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('res.send(status, json)', function (done) { - cy.route2('/custom-headers', function (req) { + cy.http('/custom-headers', function (req) { req.reply((res) => { res.send(777, { bar: 'baz' }) }) @@ -1422,7 +1444,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('res.send(status, json, headers)', function (done) { - cy.route2('/custom-headers', function (req) { + cy.http('/custom-headers', function (req) { req.reply((res) => { res.send(777, { bar: 'baz' }, { 'x-quux': 'quuz' }) }) @@ -1443,7 +1465,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can forceNetworkError', function (done) { - cy.route2('/foo', function (req) { + cy.http('/foo', function (req) { req.reply((res) => { res.send({ forceNetworkError: true }) }) @@ -1467,7 +1489,7 @@ describe('network stubbing', { retries: 2 }, function () { const delayMs = 50 const expectedSeconds = payload.length / (1024 * throttleKbps) + delayMs / 1000 - cy.route2('/timeout', (req) => { + cy.http('/timeout', (req) => { req.reply((res) => { this.start = Date.now() @@ -1497,7 +1519,7 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2('/dump-method', function (req) { + cy.http('/dump-method', function (req) { req.reply(function (res) { res.send() @@ -1516,7 +1538,7 @@ describe('network stubbing', { retries: 2 }, function () { const err = new Error('bar') - cy.route2('/foo', (req) => { + cy.http('/foo', (req) => { req.reply(() => { throw err }) @@ -1535,7 +1557,7 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2('/foo', (req) => { + cy.http('/foo', (req) => { req.reply((res) => { res.send({ statusCode: 1 }) }) @@ -1554,7 +1576,7 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2('/should-err', function (req) { + cy.http('/should-err', function (req) { req.reply(() => {}) }).then(function () { $.get('http://localhost:3333/should-err') @@ -1571,7 +1593,7 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2('/should-err', function (req) { + cy.http('/should-err', function (req) { req.reply() }) .as('err') @@ -1600,7 +1622,7 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2('/timeout', (req) => { + cy.http('/timeout', (req) => { req.reply(() => { return Promise.delay(200) }) @@ -1617,7 +1639,7 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2('/timeout', (req) => { + cy.http('/timeout', (req) => { req.reply(_.noop) }).then(() => { $.get('/timeout?ms=50') @@ -1628,7 +1650,7 @@ describe('network stubbing', { retries: 2 }, function () { context('waiting and aliasing', function () { it('can wait on a single response using "alias"', function () { - cy.route2('/foo', 'bar') + cy.http('/foo', 'bar') .as('foo.bar') .then(() => { $.get('/foo') @@ -1642,7 +1664,7 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2('/foo', () => new Promise(_.noop)) + cy.http('/foo', () => new Promise(_.noop)) .as('foo.bar') .then(() => { $.get('/foo') @@ -1651,7 +1673,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can wait on a single response using "alias.response"', function () { - cy.route2('/foo', 'bar') + cy.http('/foo', 'bar') .as('foo.bar') .then(() => { $.get('/foo') @@ -1665,7 +1687,7 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2('/foo', () => new Promise(_.noop)) + cy.http('/foo', () => new Promise(_.noop)) .as('foo.bar') .then(() => { $.get('/foo') @@ -1674,7 +1696,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can wait on a single request using "alias.request"', function () { - cy.route2('/foo') + cy.http('/foo') .as('foo.bar') .then(() => { $.get('/foo') @@ -1688,13 +1710,13 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2('/foo') + cy.http('/foo') .as('foo.bar') .wait('@foo.bar.request', { timeout: 100 }) }) it('can incrementally wait on responses', function () { - cy.route2('/foo', 'bar') + cy.http('/foo', 'bar') .as('foo.bar') .then(() => { $.get('/foo') @@ -1712,7 +1734,7 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2('/foo', () => new Promise(_.noop)) + cy.http('/foo', () => new Promise(_.noop)) .as('foo.bar') .then(() => { $.get('/foo') @@ -1723,7 +1745,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can incrementally wait on requests', function () { - cy.route2('/foo', (req) => { + cy.http('/foo', (req) => { req.reply(_.noop) // only request will be received, no response }) .as('foo.bar') @@ -1743,7 +1765,7 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2('/foo', (req) => { + cy.http('/foo', (req) => { req.reply(_.noop) // only request will be received, no response }) .as('foo.bar') @@ -1755,7 +1777,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('can alias a route without stubbing it', function () { - cy.route2(/fixtures\/app/).as('getFoo').then(function () { + cy.http(/fixtures\/app/).as('getFoo').then(function () { $.get('/fixtures/app.json') }).wait('@getFoo').then(function (res) { const log = cy.queue.logs({ @@ -1775,7 +1797,7 @@ describe('network stubbing', { retries: 2 }, function () { context('with an intercepted request', function () { it('can dynamically alias the request', function () { - cy.route2('/foo', (req) => { + cy.http('/foo', (req) => { req.alias = 'fromInterceptor' }) .then(() => { @@ -1790,7 +1812,7 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2('/foo', (req) => { + cy.http('/foo', (req) => { req.alias = 'fromInterceptor' }) .wait('@fromInterceptor', { timeout: 100 }) @@ -1802,7 +1824,7 @@ describe('network stubbing', { retries: 2 }, function () { done() }) - cy.route2('/foo', (req) => { + cy.http('/foo', (req) => { req.alias = 'fromInterceptor' }) .as('fromAs') @@ -1815,10 +1837,10 @@ describe('network stubbing', { retries: 2 }, function () { }) it('fulfills both dynamic aliases when two are defined', function () { - cy.route2('/foo', (req) => { + cy.http('/foo', (req) => { req.alias = 'fromInterceptor' }) - .route2('/foo', (req) => { + .http('/foo', (req) => { expect(req.alias).to.be.undefined req.alias = 'fromInterceptor2' }) @@ -1833,14 +1855,14 @@ describe('network stubbing', { retries: 2 }, function () { // @see https://github.com/cypress-io/cypress/issues/8695 context('yields request', function () { it('when not intercepted', function () { - cy.route2('/post-only').as('foo') + cy.http('/post-only').as('foo') .then(() => { $.post('/post-only', 'some body') }).wait('@foo').its('request.body').should('eq', 'some body') }) it('when intercepted', function () { - cy.route2('/post-only', (req) => { + cy.http('/post-only', (req) => { req.body = 'changed' }).as('foo') .then(() => { @@ -1849,7 +1871,7 @@ describe('network stubbing', { retries: 2 }, function () { }) it('when static response body is provided', function () { - cy.route2('/post-only', { static: 'response' }).as('foo') + cy.http('/post-only', { static: 'response' }).as('foo') .then(() => { $.post('/post-only', 'some body') }).wait('@foo').its('request.body').should('eq', 'some body') @@ -1870,24 +1892,24 @@ describe('network stubbing', { retries: 2 }, function () { } it('when not stubbed', function (done) { - cy.route2('/xml').as('foo') + cy.http('/xml').as('foo') .then(testResponse('bar', done)) }) it('when stubbed with StaticResponse', function (done) { - cy.route2('/xml', 'something different') + cy.http('/xml', 'something different') .as('foo') .then(testResponse('something different', done)) }) it('when stubbed with req.reply', function (done) { - cy.route2('/xml', (req) => req.reply('something different')) + cy.http('/xml', (req) => req.reply('something different')) .as('foo') .then(testResponse('something different', done)) }) it('when stubbed with res.send', function (done) { - cy.route2('/xml', (req) => req.reply((res) => res.send('something different'))) + cy.http('/xml', (req) => req.reply((res) => res.send('something different'))) .as('foo') .then(testResponse('something different', done)) }) diff --git a/packages/driver/cypress/integration/commands/xhr_spec.js b/packages/driver/cypress/integration/commands/xhr_spec.js index 30111cab541e..76238f293f84 100644 --- a/packages/driver/cypress/integration/commands/xhr_spec.js +++ b/packages/driver/cypress/integration/commands/xhr_spec.js @@ -1771,6 +1771,36 @@ describe('src/cy/commands/xhr', () => { cy.contains('#result', '""').should('be.visible') }) + + it('works if the JSON file has number content', () => { + cy + .server() + .route({ + method: 'POST', + url: '/test-xhr', + response: 'fixture:number.json', + }) + .visit('/fixtures/xhr-triggered.html') + .get('#trigger-xhr') + .click() + + cy.contains('#result', 14).should('be.visible') + }) + + it('works if the JSON file has boolean content', () => { + cy + .server() + .route({ + method: 'POST', + url: '/test-xhr', + response: 'fixture:boolean.json', + }) + .visit('/fixtures/xhr-triggered.html') + .get('#trigger-xhr') + .click() + + cy.contains('#result', /true/).should('be.visible') + }) }) describe('errors', { diff --git a/packages/driver/cypress/integration/cy/snapshot_spec.js b/packages/driver/cypress/integration/cy/snapshot_spec.js index 3a313875281f..996d0865f771 100644 --- a/packages/driver/cypress/integration/cy/snapshot_spec.js +++ b/packages/driver/cypress/integration/cy/snapshot_spec.js @@ -112,7 +112,7 @@ describe('driver/src/cy/snapshots', () => { it('does not cause images to be requested multiple times', function () { let timesRequested = 0 - cy.route2('media/cypress.png', () => { + cy.http('media/cypress.png', () => { timesRequested++ }) .then(() => { diff --git a/packages/driver/src/cy/commands/waiting.js b/packages/driver/src/cy/commands/waiting.js index b39b246623be..f284983a1b0c 100644 --- a/packages/driver/src/cy/commands/waiting.js +++ b/packages/driver/src/cy/commands/waiting.js @@ -118,8 +118,8 @@ module.exports = (Commands, Cypress, cy, state) => { try { aliasObj = cy.getAlias(str, 'wait', log) } catch (err) { - // before cy.route2, we could know when an alias did/did not exist, because they - // were declared synchronously. with cy.route2, req.alias can be used to dynamically + // before cy.http, we could know when an alias did/did not exist, because they + // were declared synchronously. with cy.http, req.alias can be used to dynamically // create aliases, so we cannot know at wait-time if an alias exists or not if (!isDynamicAliasingPossible()) { throw err @@ -162,7 +162,7 @@ module.exports = (Commands, Cypress, cy, state) => { log.set('referencesAlias', aliases) } - if (command && !['route', 'route2'].includes(command.get('name'))) { + if (command && !['route', 'route2', 'http'].includes(command.get('name'))) { $errUtils.throwErrByPath('wait.invalid_alias', { onFail: options._log, args: { alias }, diff --git a/packages/driver/src/cy/keyboard.ts b/packages/driver/src/cy/keyboard.ts index 67c33d2a9fe0..3fb56216e289 100644 --- a/packages/driver/src/cy/keyboard.ts +++ b/packages/driver/src/cy/keyboard.ts @@ -42,7 +42,10 @@ type SimulatedDefault = ( options: typeOptions ) => void +type KeyInfo = KeyDetails | ShortcutDetails + interface KeyDetails { + type: 'key' key: string text: string | null code: string @@ -59,6 +62,13 @@ interface KeyDetails { } } +interface ShortcutDetails { + type: 'shortcut' + modifiers: KeyDetails[] + key: KeyDetails + originalSequence: string +} + const dateRe = /^\d{4}-\d{2}-\d{2}/ const monthRe = /^\d{4}-(0\d|1[0-2])/ const weekRe = /^\d{4}-W(0[1-9]|[1-4]\d|5[0-3])/ @@ -138,11 +148,15 @@ const modifiersToString = (modifiers: KeyboardModifiers) => { })).join(', ') } -const joinKeyArrayToString = (keyArr: KeyDetails[]) => { - return _.map(keyArr, (keyDetails) => { - if (keyDetails.text) return keyDetails.key +const joinKeyArrayToString = (keyArr: KeyInfo[]) => { + return _.map(keyArr, (key) => { + if (key.type === 'key') { + if (key.text) return key.key - return `{${keyDetails.key}}` + return `{${key.key}}` + } + + return `{${key.originalSequence}}` }).join('') } @@ -150,8 +164,8 @@ type modifierKeyDetails = KeyDetails & { key: keyof typeof keyToModifierMap } -const isModifier = (details: KeyDetails): details is modifierKeyDetails => { - return !!keyToModifierMap[details.key] +const isModifier = (details: KeyInfo): details is modifierKeyDetails => { + return details.type === 'key' && !!keyToModifierMap[details.key] } const getFormattedKeyString = (details: KeyDetails) => { @@ -170,7 +184,7 @@ const getFormattedKeyString = (details: KeyDetails) => { return details.originalSequence } -const countNumIndividualKeyStrokes = (keys: KeyDetails[]) => { +const countNumIndividualKeyStrokes = (keys: KeyInfo[]) => { return _.countBy(keys, isModifier)['false'] } @@ -188,7 +202,7 @@ const findKeyDetailsOrLowercase = (key: string): KeyDetailsPartial => { const getTextLength = (str) => _.toArray(str).length const getKeyDetails = (onKeyNotFound) => { - return (key: string): KeyDetails => { + return (key: string): KeyDetails | ShortcutDetails => { let foundKey: KeyDetailsPartial if (getTextLength(key) === 1) { @@ -199,6 +213,7 @@ const getKeyDetails = (onKeyNotFound) => { if (foundKey) { const details = _.defaults({}, foundKey, { + type: 'key', key: '', keyCode: 0, code: '', @@ -211,11 +226,67 @@ const getKeyDetails = (onKeyNotFound) => { details.text = details.key } + details.type = 'key' details.originalSequence = key return details } + if (key.includes('+')) { + if (key.endsWith('++')) { + key = key.replace('++', '+plus') + } + + const keys = key.split('+') + let lastKey = _.last(keys) + + if (lastKey === 'plus') { + keys[keys.length - 1] = '+' + lastKey = '+' + } + + if (!lastKey) { + return onKeyNotFound(key, _.keys(getKeymap()).join(', ')) + } + + const keyWithModifiers = getKeyDetails(onKeyNotFound)(lastKey) as KeyDetails + + let hasModifierBesidesShift = false + + const modifiers = keys.slice(0, -1) + .map((m) => { + if (!Object.keys(modifierChars).includes(m)) { + $errUtils.throwErrByPath('type.not_a_modifier', { + args: { + key: m, + }, + }) + } + + if (m !== 'shift') { + hasModifierBesidesShift = true + } + + return getKeyDetails(onKeyNotFound)(m) + }) as KeyDetails[] + + const details: ShortcutDetails = { + type: 'shortcut', + modifiers, + key: keyWithModifiers, + originalSequence: key, + } + + // if we are going to type {ctrl+b}, the 'b' shouldn't be input as text + // normally we don't bypass text input but for shortcuts it's definitely what the user wants + // since the modifiers only apply to this single key. + if (hasModifierBesidesShift) { + details.key.text = null + } + + return details + } + onKeyNotFound(key, _.keys(getKeymap()).join(', ')) throw new Error('this can never happen') @@ -311,7 +382,7 @@ const getKeymap = () => { } const validateTyping = ( el: HTMLElement, - keys: KeyDetails[], + keys: KeyInfo[], currentIndex: number, onFail: Function, skipCheckUntilIndex: number | undefined, @@ -684,12 +755,18 @@ export class Keyboard { const typeKeyFns = _.map( keyDetailsArr, - (key: KeyDetails, currentKeyIndex: number) => { + (key: KeyInfo, currentKeyIndex: number) => { return () => { - debug('typing key:', key.key) - const activeEl = getActiveEl(doc) + if (key.type === 'shortcut') { + this.simulateShortcut(activeEl, key, options) + + return null + } + + debug('typing key:', key.key) + _skipCheckUntilIndex = _skipCheckUntilIndex && _skipCheckUntilIndex - 1 if (!_skipCheckUntilIndex) { @@ -717,21 +794,27 @@ export class Keyboard { // singleValueChange inputs must have their value set once at the end // performing the simulatedDefault for a key would try to insert text on each character // we still send all the events as normal, however - key.simulatedDefault = _.noop + if (key.type === 'key') { + key.simulatedDefault = _.noop + } }) - _.last(keysToType)!.simulatedDefault = () => { - options.onValueChange(originalText, activeEl) + const lastKeyToType = _.last(keysToType)! - const valToSet = isClearChars ? '' : joinKeyArrayToString(keysToType) + if (lastKeyToType.type === 'key') { + lastKeyToType.simulatedDefault = () => { + options.onValueChange(originalText, activeEl) - debug('setting element value', valToSet, activeEl) + const valToSet = isClearChars ? '' : joinKeyArrayToString(keysToType) - return $elements.setNativeProp( - activeEl as $elements.HTMLTextLikeInputElement, - 'value', - valToSet, - ) + debug('setting element value', valToSet, activeEl) + + return $elements.setNativeProp( + activeEl as $elements.HTMLTextLikeInputElement, + 'value', + valToSet, + ) + } } } } else { @@ -1126,6 +1209,25 @@ export class Keyboard { this.simulatedKeyup(elToKeyup, key, options) } + simulateShortcut (el: HTMLElement, key: ShortcutDetails, options) { + key.modifiers.forEach((key) => { + this.simulatedKeydown(el, key, options) + }) + + this.simulatedKeydown(el, key.key, options) + this.simulatedKeyup(el, key.key, options) + + options.id = _.uniqueId('char') + + const elToKeyup = this.getActiveEl(options) + + key.modifiers.reverse().forEach((key) => { + delete key.events.keyup + options.id = _.uniqueId('char') + this.simulatedKeyup(elToKeyup, key, options) + }) + } + simulatedKeyup (el: HTMLElement, _key: KeyDetails, options: typeOptions) { if (shouldIgnoreEvent('keyup', _key.events)) { debug('simulatedKeyup: ignoring event') diff --git a/packages/driver/src/cy/net-stubbing/add-command.ts b/packages/driver/src/cy/net-stubbing/add-command.ts index 98ea3c5bd61d..6394efcf433d 100644 --- a/packages/driver/src/cy/net-stubbing/add-command.ts +++ b/packages/driver/src/cy/net-stubbing/add-command.ts @@ -208,7 +208,7 @@ export function addCommand (Commands, Cypress: Cypress.Cypress, cy: Cypress.cy, hasInterceptor = true break case _.isUndefined(handler): - // user is doing something like cy.route2('foo').as('foo') to wait on a URL + // user is doing something like cy.http('foo').as('foo') to wait on a URL break case _.isString(handler): staticResponse = { body: handler } @@ -222,12 +222,12 @@ export function addCommand (Commands, Cypress: Cypress.Cypress, cy: Cypress.cy, } } - validateStaticResponse('cy.route2', handler) + validateStaticResponse('cy.http', handler) staticResponse = handler as StaticResponse break default: - return $errUtils.throwErrByPath('net_stubbing.route2.invalid_handler', { args: { handler } }) + return $errUtils.throwErrByPath('net_stubbing.http.invalid_handler', { args: { handler } }) } const routeMatcher = annotateMatcherOptionsTypes(matcher) @@ -263,7 +263,14 @@ export function addCommand (Commands, Cypress: Cypress.Cypress, cy: Cypress.cy, return emitNetEvent('route:added', frame) } - function route2 (matcher: RouteMatcher, handler?: RouteHandler | StringMatcher, arg2?: RouteHandler) { + function route2 (...args) { + $errUtils.warnByPath('net_stubbing.route2_renamed') + + // @ts-ignore + return http.apply(undefined, args) + } + + function http (matcher: RouteMatcher, handler?: RouteHandler | StringMatcher, arg2?: RouteHandler) { function getMatcherOptions (): RouteMatcherOptions { if (_.isString(matcher) && $utils.isValidHttpMethod(matcher) && isStringMatcher(handler)) { // method, url, handler @@ -291,7 +298,7 @@ export function addCommand (Commands, Cypress: Cypress.Cypress, cy: Cypress.cy, const { isValid, message } = validateRouteMatcherOptions(routeMatcherOptions) if (!isValid) { - $errUtils.throwErrByPath('net_stubbing.route2.invalid_route_matcher', { args: { message, matcher: routeMatcherOptions } }) + $errUtils.throwErrByPath('net_stubbing.http.invalid_route_matcher', { args: { message, matcher: routeMatcherOptions } }) } return addRoute(routeMatcherOptions, handler as RouteHandler) @@ -299,6 +306,7 @@ export function addCommand (Commands, Cypress: Cypress.Cypress, cy: Cypress.cy, } Commands.addAll({ + http, route2, }) } diff --git a/packages/driver/src/cy/net-stubbing/wait-for-route.ts b/packages/driver/src/cy/net-stubbing/wait-for-route.ts index 7d129d2e2681..bba9ab005983 100644 --- a/packages/driver/src/cy/net-stubbing/wait-for-route.ts +++ b/packages/driver/src/cy/net-stubbing/wait-for-route.ts @@ -22,7 +22,7 @@ export function waitForRoute (alias: string, state: Cypress.State, specifier: 'r const candidateRequests = _.filter(state('aliasedRequests'), { alias }) .map(({ request }) => request) - // Now add route-level (cy.route2(...).as()) aliased requests. + // Now add route-level (cy.http(...).as()) aliased requests. const route: Route = _.find(state('routes'), { alias }) if (route) { diff --git a/packages/driver/src/cypress/error_messages.js b/packages/driver/src/cypress/error_messages.js index 1344a571865a..6e79f01677ea 100644 --- a/packages/driver/src/cypress/error_messages.js +++ b/packages/driver/src/cypress/error_messages.js @@ -909,22 +909,23 @@ module.exports = { }, net_stubbing: { + route2_renamed: `${cmd('route2')} was renamed to ${cmd('http')} and will be removed in a future release. Please update usages of ${cmd('route2')} to use ${cmd('http')} instead.`, invalid_static_response: ({ cmd, message, staticResponse }) => { return cyStripIndent(`\ An invalid StaticResponse was supplied to \`${cmd}()\`. ${message} You passed: ${format(staticResponse)}`, 8) }, - route2: { + http: { invalid_handler: ({ handler }) => { return stripIndent`\ - ${cmd('route2')}'s \`handler\` argument must be a String, StaticResponse, or HttpController function. + ${cmd('http')}'s \`handler\` argument must be a String, StaticResponse, or HttpController function. You passed: ${format(handler)}` }, invalid_route_matcher: ({ message, matcher }) => { return stripIndent`\ - An invalid RouteMatcher was supplied to ${cmd('route2')}. ${message} + An invalid RouteMatcher was supplied to ${cmd('http')}. ${message} You passed: ${format(matcher)}` }, @@ -932,7 +933,7 @@ module.exports = { request_handling: { cb_failed: ({ err, req, route }) => { return cyStripIndent(`\ - A request callback passed to ${cmd('route2')} threw an error while intercepting a request: + A request callback passed to ${cmd('http')} threw an error while intercepting a request: ${err.message} @@ -942,7 +943,7 @@ module.exports = { }, cb_timeout: ({ timeout, req, route }) => { return cyStripIndent(`\ - A request callback passed to ${cmd('route2')} timed out after returning a Promise that took more than the \`defaultCommandTimeout\` of \`${timeout}ms\` to resolve. + A request callback passed to ${cmd('http')} timed out after returning a Promise that took more than the \`defaultCommandTimeout\` of \`${timeout}ms\` to resolve. If the request callback is expected to take longer than \`${timeout}ms\`, increase the configured \`defaultCommandTimeout\` value. @@ -1637,6 +1638,10 @@ module.exports = { message: `${cmd('type')} can only be called on a single element. Your subject contained {{num}} elements.`, docsUrl: 'https://on.cypress.io/type', }, + not_a_modifier: { + message: `\`{{key}}\` is not a modifier.`, + docsUrl: 'https://on.cypress.io/type', + }, not_actionable_textlike: { message: stripIndent`\ ${cmd('type')} failed because it targeted a disabled element. diff --git a/packages/net-stubbing/lib/external-types.ts b/packages/net-stubbing/lib/external-types.ts index a000762f4328..05dfe74899bf 100644 --- a/packages/net-stubbing/lib/external-types.ts +++ b/packages/net-stubbing/lib/external-types.ts @@ -332,29 +332,39 @@ declare global { namespace Cypress { interface Chainable { /** - * Use `cy.route2()` to stub and intercept HTTP requests and responses. + * Use `cy.http()` to stub and intercept HTTP requests and responses. * - * @see https://on.cypress.io/route2 + * @see https://on.cypress.io/http * @example - * cy.route2('https://localhost:7777/users', [{id: 1, name: 'Pat'}]) + * cy.http('https://localhost:7777/users', [{id: 1, name: 'Pat'}]) * @example - * cy.route2('https://localhost:7777/protected-endpoint', (req) => { + * cy.http('https://localhost:7777/protected-endpoint', (req) => { * req.headers['authorization'] = 'basic fooabc123' * }) * @example - * cy.route2('https://localhost:7777/some-response', (req) => { + * cy.http('https://localhost:7777/some-response', (req) => { * req.reply(res => { * res.body = 'some new body' * }) * }) */ - route2(url: RouteMatcher, response?: RouteHandler): Chainable + http(url: RouteMatcher, response?: RouteHandler): Chainable /** - * Use `cy.route2()` to stub and intercept HTTP requests and responses. + * Use `cy.http()` to stub and intercept HTTP requests and responses. * - * @see https://on.cypress.io/route2 + * @see https://on.cypress.io/http * @example - * cy.route2('GET', 'http://foo.com/fruits', ['apple', 'banana', 'cherry']) + * cy.http('GET', 'http://foo.com/fruits', ['apple', 'banana', 'cherry']) + */ + http(method: Method, url: RouteMatcher, response?: RouteHandler): Chainable + /** + * Deprecated - use `cy.http()` instead. + * @deprecated + */ + route2(url: RouteMatcher, response?: RouteHandler): Chainable + /** + * Deprecated - use `cy.http()` instead. + * @deprecated */ route2(method: Method, url: RouteMatcher, response?: RouteHandler): Chainable } diff --git a/packages/proxy/lib/http/response-middleware.ts b/packages/proxy/lib/http/response-middleware.ts index 17c499f34025..2a21253c04b7 100644 --- a/packages/proxy/lib/http/response-middleware.ts +++ b/packages/proxy/lib/http/response-middleware.ts @@ -237,12 +237,13 @@ const PatchExpressSetHeader: ResponseMiddleware = function () { const SetInjectionLevel: ResponseMiddleware = function () { this.res.isInitial = this.req.cookies['__cypress.initial'] === 'true' + const isReqMatchOriginPolicy = reqMatchesOriginPolicy(this.req, this.getRemoteState()) const getInjectionLevel = () => { if (this.incomingRes.headers['x-cypress-file-server-error'] && !this.res.isInitial) { return 'partial' } - if (!resContentTypeIs(this.incomingRes, 'text/html') || !reqMatchesOriginPolicy(this.req, this.getRemoteState())) { + if (!resContentTypeIs(this.incomingRes, 'text/html') || !isReqMatchOriginPolicy) { return false } @@ -261,7 +262,7 @@ const SetInjectionLevel: ResponseMiddleware = function () { this.res.wantsInjection = getInjectionLevel() } - this.res.wantsSecurityRemoved = this.config.modifyObstructiveCode && ( + this.res.wantsSecurityRemoved = this.config.modifyObstructiveCode && isReqMatchOriginPolicy && ( (this.res.wantsInjection === 'full') || resContentTypeIsJavaScript(this.incomingRes) ) diff --git a/packages/server/lib/controllers/xhrs.js b/packages/server/lib/controllers/xhrs.js index b6f32c6d1cbc..092786bd4db3 100644 --- a/packages/server/lib/controllers/xhrs.js +++ b/packages/server/lib/controllers/xhrs.js @@ -61,6 +61,10 @@ module.exports = { data = '' } + if (_.isNumber(data) || _.isBoolean(data)) { + data = String(data) + } + const chunk = Buffer.from(data, encoding) headers['content-length'] = chunk.length diff --git a/packages/server/test/e2e/7_proxying_spec.ts b/packages/server/test/e2e/7_proxying_spec.ts new file mode 100644 index 000000000000..ac71241f7ca9 --- /dev/null +++ b/packages/server/test/e2e/7_proxying_spec.ts @@ -0,0 +1,16 @@ +import e2e from '../support/helpers/e2e' + +describe('e2e proxying spec', () => { + e2e.setup({ + servers: { + port: 7878, + static: true, + cors: true, + https: true, + }, + }) + + e2e.it('integrity check', { + spec: 'proxying_spec.js', + }) +}) diff --git a/packages/server/test/support/fixtures/projects/e2e/cypress/integration/proxying_spec.js b/packages/server/test/support/fixtures/projects/e2e/cypress/integration/proxying_spec.js new file mode 100644 index 000000000000..7409d2f96702 --- /dev/null +++ b/packages/server/test/support/fixtures/projects/e2e/cypress/integration/proxying_spec.js @@ -0,0 +1,24 @@ +describe('proxying', () => { + // load a script that has obstructive code and would otherwise be modified by the proxy + // https://github.com/cypress-io/cypress/issues/8983 + it('does not fail integrity check for cross-origin scripts', () => { + cy.visit('/index.html') + .then((win) => { + /** + * @type {Document} + */ + const document = win.document + const script = document.createElement('script') + + script.src = 'https://localhost:7878/static/simple_obstructive_code.js' + script.integrity = 'sha256-iVKZPZrzbe7YNdMKYWJ1+f74j5lD3gRFvGjqtLyji6A=' + script.crossOrigin = 'anonymous' + document.head.append(script) + + return new Promise((resolve, reject) => { + script.onload = resolve + script.onerror = () => reject(new Error('script failed to load, check the console. Possibly a failed integrity check')) + }) + }) + }) +}) diff --git a/packages/server/test/support/fixtures/projects/e2e/cypress/plugins/index.js b/packages/server/test/support/fixtures/projects/e2e/cypress/plugins/index.js index b88d7624d7c3..c758734b1157 100644 --- a/packages/server/test/support/fixtures/projects/e2e/cypress/plugins/index.js +++ b/packages/server/test/support/fixtures/projects/e2e/cypress/plugins/index.js @@ -8,6 +8,9 @@ const path = require('path') const Promise = require('bluebird') const { useFixedFirefoxResolution } = require('../../../utils') +/** + * @type {Cypress.PluginConfig} + */ module.exports = (on, config) => { let performance = { track: () => Promise.resolve(), diff --git a/packages/server/test/support/fixtures/projects/e2e/static/simple_obstructive_code.js b/packages/server/test/support/fixtures/projects/e2e/static/simple_obstructive_code.js new file mode 100644 index 000000000000..867d1ce67fea --- /dev/null +++ b/packages/server/test/support/fixtures/projects/e2e/static/simple_obstructive_code.js @@ -0,0 +1,3 @@ +(function () { + if (top != self) {console.log('loaded!')} +})() diff --git a/packages/server/test/support/helpers/e2e.ts b/packages/server/test/support/helpers/e2e.ts index 3a55ad772700..0426060490d1 100644 --- a/packages/server/test/support/helpers/e2e.ts +++ b/packages/server/test/support/helpers/e2e.ts @@ -202,6 +202,10 @@ const startServer = function (obj) { app.use(morgan('dev')) + if (obj.cors) { + app.use(require('cors')()) + } + const s = obj.static if (s) { diff --git a/scripts/check-halt.js b/scripts/check-conditional-ci.js similarity index 85% rename from scripts/check-halt.js rename to scripts/check-conditional-ci.js index 6dbe0917c385..e60b67d31ccd 100644 --- a/scripts/check-halt.js +++ b/scripts/check-conditional-ci.js @@ -1,20 +1,17 @@ /* eslint-disable no-console */ +const { execSync } = require('child_process') const { getCurrentBranch, readPackageJson } = require('./utils') const { getChangedPackagesAndDependents, getLernaPackages } = require('./changed-packages') -const runTestsAndExit = () => { - process.exit(0) -} - -const skipTestsAndExit = () => { - process.exit(1) +const skipTests = () => { + execSync('circleci-agent step halt') } const main = async (ciJob) => { if (!ciJob) { console.log(`Could not get current CI job`) - return skipTestsAndExit() + process.exit(1) } const currentBranch = await getCurrentBranch() @@ -22,7 +19,7 @@ const main = async (ciJob) => { if (currentBranch === 'develop' || currentBranch === 'master') { console.log(`Currently on ${currentBranch} - all tests run`) - return runTestsAndExit() + return } const packages = await getLernaPackages() @@ -44,7 +41,7 @@ const main = async (ciJob) => { if (Object.keys(changed).includes(pack)) { console.log(`${pack} was directly changed, so tests run.`) - return runTestsAndExit() + return } const dependenciesChanged = [] @@ -58,12 +55,14 @@ const main = async (ciJob) => { if (dependenciesChanged.length) { console.log(`${pack} is listed as a dependant of ${dependenciesChanged.join(', ')}, so tests run.`) - return runTestsAndExit() + return } console.log(`${pack} is unchanged and not dependent on any changed packages, so tests do not run.`) - return skipTestsAndExit() + return skipTests() } -main(process.env.CIRCLE_JOB) +main(process.env.CIRCLE_JOB).catch(() => { + process.exit(1) +}) diff --git a/scripts/win-appveyor-build.js b/scripts/win-appveyor-build.js index 2d3cff76b726..15a049c99436 100755 --- a/scripts/win-appveyor-build.js +++ b/scripts/win-appveyor-build.js @@ -26,7 +26,7 @@ const isRightBranch = () => { process.env.APPVEYOR_REPO_COMMIT_MESSAGE || '' ).includes('[build binary]') - const branchesToBuildBinary = ['develop', 'update-build-instructions'] + const branchesToBuildBinary = ['develop', 'v6.0-release'] return branchesToBuildBinary.includes(branch) || shouldForceBinaryBuild } diff --git a/yarn.lock b/yarn.lock index 88c21be2eae6..08807176e446 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6057,13 +6057,6 @@ abbrev@1.0.x: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= -abs@^1.0.0: - version "1.3.14" - resolved "https://registry.yarnpkg.com/abs/-/abs-1.3.14.tgz#7b078d5d0735082d5bfb23d45c2d9f440a5c2222" - integrity sha512-PrS26IzwKLWwuURpiKl8wRmJ2KdR/azaVrLEBWG/TALwT20Y7qjtYp1qcMLHA4206hBHY5phv3w4pjf9NPv4Vw== - dependencies: - ul "^5.0.0" - accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -6131,11 +6124,6 @@ acorn@^7.0.0, acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== -add-subtract-date@^1.0.0: - version "1.0.15" - resolved "https://registry.yarnpkg.com/add-subtract-date/-/add-subtract-date-1.0.15.tgz#dd81b9236795b3ed113131dc1a325833c856c8bc" - integrity sha512-MiL4wnMyM999meyCrSA3LME9uZ/b5ptSd0ACDVUoTfutFwvkMyIN7nG7gjrU56WEk5RlFLBghabcgdYwY8s+nQ== - add-variable-declarations@^4.0.6: version "4.0.7" resolved "https://registry.yarnpkg.com/add-variable-declarations/-/add-variable-declarations-4.0.7.tgz#c5fd52f39e427f2dd7b1d1814e847748a1136629" @@ -6302,11 +6290,6 @@ alter@~0.2.0: dependencies: stable "~0.1.3" -always-error@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/always-error/-/always-error-1.0.0.tgz#95c84042cfa86f38c86ca6c2cc42c0a0103441b2" - integrity sha1-lchAQs+obzjIbKbCzELAoBA0QbI= - amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -6398,21 +6381,6 @@ ansi-html@0.0.7: resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= -ansi-parser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-parser/-/ansi-parser-2.0.0.tgz#433498af32fee8c2a1df2c4e47941bc029bcf407" - integrity sha1-QzSYrzL+6MKh3yxOR5QbwCm89Ac= - -ansi-parser@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-parser/-/ansi-parser-3.0.0.tgz#945c0e7232caf5675217375b3eb8892008c14629" - integrity sha1-lFwOcjLK9WdSFzdbPriJIAjBRik= - -ansi-parser@^3.2.5: - version "3.2.10" - resolved "https://registry.yarnpkg.com/ansi-parser/-/ansi-parser-3.2.10.tgz#6ddcf8a1c41339394f0e64c7b075985fb2a87c95" - integrity sha512-CGKGIbd678lm15IXJXI1cTyOVAnMQw0jES+klW/yIc+GzYccsYanLMhczPIIj2hE64B79g75QfiuWrEWd6nJdg== - ansi-red@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" @@ -6445,7 +6413,7 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== -ansi-styles@3.2.1, ansi-styles@^3.0.0, ansi-styles@^3.1.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@3.2.1, ansi-styles@^3.1.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -6502,16 +6470,6 @@ ansistyles@~0.1.3: resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539" integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk= -ansy@^1.0.0: - version "1.0.15" - resolved "https://registry.yarnpkg.com/ansy/-/ansy-1.0.15.tgz#3915c82eb71aa8ddc37721c8c6db66d50d44c207" - integrity sha512-mQyNSn58HN7aEthofkap0hn8jg7/5SJWrB0ypExgcECOwLppc0njH+QBA9X5VMiEN9SM0JlFZWJQGycxxInAqg== - dependencies: - ansi-styles "^3.0.0" - custom-return "^1.0.0" - supports-color "^3.1.2" - ul "^5.2.1" - any-base@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" @@ -6789,7 +6747,7 @@ array-filter@^1.0.0: resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= -array-find-index@^1.0.1, array-find-index@^1.0.2: +array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= @@ -8384,20 +8342,6 @@ ban-sensitive-files@1.9.0: ramda "0.22.1" update-notifier "1.0.3" -ban-sensitive-files@1.9.7: - version "1.9.7" - resolved "https://registry.yarnpkg.com/ban-sensitive-files/-/ban-sensitive-files-1.9.7.tgz#e0b5179db6c8636f6b0e0c89e54e6c1f30d411d7" - integrity sha512-EkBv0nOOOnXer2R9IAXQ4VjCB7sIyOQaEn8J3URNb9WPzdA+44S6qEOA5lKNMx1Hxe25XX0r55/DOl8GCLQa4g== - dependencies: - bluebird "3.7.2" - check-more-types "2.24.0" - debug "4.1.1" - ggit "2.4.12" - lazy-ass "1.6.0" - pluralize "8.0.0" - ramda "0.27.0" - update-notifier "4.1.0" - base64-arraybuffer@0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" @@ -8571,11 +8515,6 @@ bluebird@3.5.0: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" integrity sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw= -bluebird@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== - bluebird@3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" @@ -9187,17 +9126,6 @@ buffer@~5.2.1: base64-js "^1.0.2" ieee754 "^1.1.4" -bug-killer@^4.0.0: - version "4.4.4" - resolved "https://registry.yarnpkg.com/bug-killer/-/bug-killer-4.4.4.tgz#96e0322b9437a2b0672d78aacd1ed2bef11f945a" - integrity sha1-luAyK5Q3orBnLXiqzR7SvvEflFo= - dependencies: - ansi-parser "^3.2.5" - couleurs "^6.0.6" - daty "^1.0.7" - deffy "^2.2.2" - typpy "^2.3.6" - builder-util-runtime@8.7.2: version "8.7.2" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.2.tgz#d93afc71428a12789b437e13850e1fa7da956d72" @@ -9798,16 +9726,6 @@ chdir-promise@0.4.0: q "1.1.2" spots "0.4.0" -chdir-promise@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/chdir-promise/-/chdir-promise-0.6.2.tgz#d4cfa0a96a112a8149341b69e2866d162f0e2dbd" - integrity sha512-EG5MutQt4qTxoQPfBtPCfU1A/MqborgaO66xrPSD/dRTB40OLN0wy+YAo5ZAw7DawhtCPdZHAdQ206fyWkhoiw== - dependencies: - bluebird "^3.5.1" - check-more-types "2.24.0" - debug "3.1.0" - lazy-ass "1.6.0" - check-code-coverage@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/check-code-coverage/-/check-code-coverage-1.9.2.tgz#24b334ee085b089d49457f41fabda88ab039204d" @@ -10075,15 +9993,6 @@ circular-json@^0.3.1: resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== -class-methods@^1.0.4: - version "1.0.12" - resolved "https://registry.yarnpkg.com/class-methods/-/class-methods-1.0.12.tgz#982d86601990256abffa412e0ad329784c966210" - integrity sha512-14T82nNlU+OAhPNm4Fw4kJUS8klgt9n1+CdtB6LHvmWC5Wb89TZQ6CuCwEK2YR03O/hT0eHGIpQxtovAnN9CtA== - dependencies: - exclude-arr "^1.0.0" - static-methods "^1.0.0" - ul "^5.2.1" - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -10125,14 +10034,6 @@ clean-webpack-plugin@2.0.2: dependencies: del "^4.0.0" -cli-box@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cli-box/-/cli-box-5.0.0.tgz#870ea8aa77e7c25179416ceccfe5ed0690804602" - integrity sha1-hw6oqnfnwlF5QWzsz+XtBpCARgI= - dependencies: - ansi-parser "3.0.0" - ul "5.0.0" - cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" @@ -10392,15 +10293,6 @@ cloneable-readable@^1.0.0: process-nextick-args "^2.0.0" readable-stream "^2.3.5" -clp@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/clp/-/clp-3.2.1.tgz#af1ed66db895a5c9ce9b6d32e9c33dee02b3edf2" - integrity sha1-rx7WbbiVpcnOm20y6cM97gKz7fI= - dependencies: - ansi-parser "2.0.0" - le-table "4.0.0" - ul "5.0.0" - clsx@^1.0.2, clsx@^1.0.4: version "1.1.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" @@ -10495,7 +10387,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.0.0, color-convert@^1.9.0, color-convert@^1.9.1: +color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -10571,11 +10463,6 @@ colors@1.1.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= -colors@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" - integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ== - colors@^1.1.2, colors@^1.2.1, colors@^1.3.2, colors@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -10629,7 +10516,7 @@ commander@2.11.x: resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" integrity sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ== -commander@2.17.1, commander@2.17.x: +commander@2.17.x: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== @@ -11148,34 +11035,6 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" -couleurs@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/couleurs/-/couleurs-5.0.0.tgz#1cd3ace5cca1bec0041578b27464b2676387f6db" - integrity sha1-HNOs5cyhvsAEFXiydGSyZ2OH9ts= - dependencies: - flat-colors "3.0.0" - typpy "2.0.0" - x256 "0.0.2" - -couleurs@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/couleurs/-/couleurs-5.2.1.tgz#5399f9f7a159852ec14244f841bd858f04dc52a3" - integrity sha1-U5n596FZhS7BQkT4Qb2FjwTcUqM= - dependencies: - flat-colors "3.0.0" - typpy "2.0.0" - x256 "0.0.2" - -couleurs@^6.0.6: - version "6.0.11" - resolved "https://registry.yarnpkg.com/couleurs/-/couleurs-6.0.11.tgz#15aa838cba5df3036c01a1c782d40ca9ed47e480" - integrity sha512-y5WUDtgQKw/tVViZCj3ACX8VseU0ONxiet8SRsE89uH4s/otRLXGOMymfVbKMFzedKOdxQpTcYWukRwkvgRYdw== - dependencies: - ansy "^1.0.0" - color-convert "^1.0.0" - iterate-object "^1.3.1" - typpy "^2.3.1" - cp-file@^6.1.0: version "6.2.0" resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-6.2.0.tgz#40d5ea4a1def2a9acdd07ba5c0b0246ef73dc10d" @@ -11674,13 +11533,6 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -custom-return@^1.0.0: - version "1.0.12" - resolved "https://registry.yarnpkg.com/custom-return/-/custom-return-1.0.12.tgz#371bcda1f4baa63cd98c00e16b2d6523ba1b741e" - integrity sha512-Xy6IlEV6gW5Iu4YRoQe0A5RG1mzezawcTXzAk7u28oB2UilRfbbOc1C7RmWE6AJ1inSm8gghCkIpo0LUQfLbvw== - dependencies: - noop6 "^1.0.0" - cycle@1.0.x: version "1.0.3" resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" @@ -11916,11 +11768,6 @@ date-fns@^1.27.2: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== -date-unit-ms@^1.1.0: - version "1.1.14" - resolved "https://registry.yarnpkg.com/date-unit-ms/-/date-unit-ms-1.1.14.tgz#82dc972bbe03a65c0c73b0c7b42075ce6b510de9" - integrity sha512-6vUHdMQkblV8lKYQqnTM2kUmWlFVG6F/0mzUbcnNygcR2vuUPeHAIE7BO7mj/brmgV1INSAG9D2GpgTLOEOHvg== - dateformat@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" @@ -11931,27 +11778,11 @@ dateformat@^3.0.0, dateformat@^3.0.2: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -daty@^1.0.7: - version "1.2.1" - resolved "https://registry.yarnpkg.com/daty/-/daty-1.2.1.tgz#ceee91a4ca89ca6435b107f5f8ce4617dd753baf" - integrity sha512-0ScX8eww2sJ1fnJuuLhP6JXonVrIIJZiVlGL6ve+Dnv3vPVFf3ZMDlose5+h/SnR4gQ1nmG3acoBP3Slycr4ag== - dependencies: - add-subtract-date "^1.0.0" - class-methods "^1.0.4" - date-unit-ms "^1.1.0" - diff-dates "^1.0.0" - formatoid "^1.0.0" - dayjs@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.9.3.tgz#b7f94b22ad2a136a4ca02a01ab68ae893fe1a268" integrity sha512-V+1SyIvkS+HmNbN1G7A9+ERbFTV9KTXu6Oor98v2xHmzzpp52OIJhQuJSTywWuBY5pyAEmlwbCi1Me87n/SLOw== -days@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/days/-/days-1.1.1.tgz#b039d1e5ad5335ca689401855546f02d4cfcb362" - integrity sha512-vzeIwVsEIyA35GH4+mPd4hjVDNI87wYANyZFs0BHjBr5kIBH5zEl7LfD6Wr4SFZca4D3CU9IH1w4DuZLlXzKRw== - de-indent@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" @@ -12233,20 +12064,6 @@ defer-to-connect@^2.0.0: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.0.tgz#83d6b199db041593ac84d781b5222308ccf4c2c1" integrity sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg== -deffy@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/deffy/-/deffy-2.0.0.tgz#f82e08eea518c4a0a30b1f03ec504d248af28932" - integrity sha1-+C4I7qUYxKCjCx8D7FBNJIryiTI= - dependencies: - typpy "^2.0.0" - -deffy@^2.0.0, deffy@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/deffy/-/deffy-2.2.4.tgz#53c1b5f59b58a58150b1c9de5529229875c4cc17" - integrity sha512-pLc9lsbsWjr6RxmJ2OLyvm+9l4j1yK69h+TML/gUit/t3vTijpkNGh8LioaJYTGO7F25m6HZndADcUOo2PsiUg== - dependencies: - typpy "^2.0.0" - define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -12450,20 +12267,6 @@ deps-ok@1.2.1: quote "0.4.0" semver "5.3.0" -deps-ok@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/deps-ok/-/deps-ok-1.4.1.tgz#87550ff1e980cf8484b503bc0bc866aa7a2709c5" - integrity sha512-5S216xoLM4mwrBUZBVVXIdkIxnp8TLjK1QeghAEJHiwxIpNpGJd5RkNR59duRCNPey8k/UlWh39WknjXH3mBDQ== - dependencies: - check-more-types "2.24.0" - debug "3.1.0" - lazy-ass "1.6.0" - lodash "4.17.10" - minimist "1.2.0" - q "2.0.3" - quote "0.4.0" - semver "5.5.0" - deps-sort@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d" @@ -12653,13 +12456,6 @@ dezalgo@^1.0.0, dezalgo@~1.0.3: asap "^2.0.0" wrappy "1" -diff-dates@^1.0.0: - version "1.0.13" - resolved "https://registry.yarnpkg.com/diff-dates/-/diff-dates-1.0.13.tgz#723afcb36610c2004eec0981a87efd0c8b2d3487" - integrity sha512-hm55xMn/9TnTxpriMRvLEHEvFNr0Oxdx+OQczVC6P6z6WfXrK7vm7EAmC9Kfl2GMpMW5o5G4srDHs9VMGoTyug== - dependencies: - date-unit-ms "^1.1.0" - diff-match-patch@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37" @@ -14184,19 +13980,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -exclude-arr@^1.0.0: - version "1.0.11" - resolved "https://registry.yarnpkg.com/exclude-arr/-/exclude-arr-1.0.11.tgz#007ba6a9a51df3a93731b46e200bf8cd89006531" - integrity sha512-yQVFDXkkpDOhSPGOu2yG4fKmDsBiufj2M5uJRS6ijcLW7/pUvCxAHJ2YQTJUkLJ4nWbl+XZn/qwMzrWYfWFgFg== - -exec-limiter@^3.0.0: - version "3.2.13" - resolved "https://registry.yarnpkg.com/exec-limiter/-/exec-limiter-3.2.13.tgz#5f30f5990b9b10908512394b9b997ed066a574d0" - integrity sha512-86Ri699bwiHZVBzTzNj8gspqAhCPchg70zPVWIh3qzUOA1pUMcb272Em3LPk8AE0mS95B9yMJhtqF8vFJAn0dA== - dependencies: - limit-it "^3.0.0" - typpy "^2.1.0" - exec-sh@^0.3.2: version "0.3.4" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" @@ -14942,11 +14725,6 @@ filled-array@^1.0.0: resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84" integrity sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q= -fillo@^1.0.0: - version "1.0.13" - resolved "https://registry.yarnpkg.com/fillo/-/fillo-1.0.13.tgz#31ff0dba75f33b04bada715277bd220448d80553" - integrity sha512-9LYJ0ww96DUYETd2Bia5NS1b8rj42nEE5zsfcUwDErMopTs6BRBe4dRIVjrZGXSiK4vNSL/Q3u0dyqbmkA2Zdg== - finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -15204,11 +14982,6 @@ flat-cache@^2.0.1: rimraf "2.6.3" write "1.0.3" -flat-colors@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/flat-colors/-/flat-colors-3.0.0.tgz#253ab1a23989c321f13b0acd4bf73fff4072ecb7" - integrity sha1-JTqxojmJwyHxOwrNS/c//0By7Lc= - flat@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" @@ -15407,16 +15180,6 @@ formatio@1.1.1: dependencies: samsam "~1.1" -formatoid@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/formatoid/-/formatoid-1.2.4.tgz#924e5328566ad867a3c7658ec12f8b629fcbfe97" - integrity sha512-9wWHOPJvbIheSpiHGl0xaBwdszlzPaeh2KqHVexGQnKpO85xrMoKvuf6M3q0B4uC3I9lkXjH6+8ipQC8PQ/7Gw== - dependencies: - days "^1.0.1" - fillo "^1.0.0" - months "^1.0.0" - parse-it "^1.0.0" - formidable@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9" @@ -15673,13 +15436,6 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.name@^1.0.3: - version "1.0.13" - resolved "https://registry.yarnpkg.com/function.name/-/function.name-1.0.13.tgz#eef045abc4b5ff4e3e9d001a53ce14e090c971c6" - integrity sha512-mVrqdoy5npWZyoXl4DxCeuVF6delDcQjVS9aPdvLYlBxtMTZDR2B5GVEQEoM1jJyspCqg3C0v4ABkLE7tp9xFA== - dependencies: - noop6 "^1.0.1" - function.prototype.name@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.2.tgz#5cdf79d7c05db401591dfde83e3b70c5123e9a45" @@ -15937,33 +15693,6 @@ ggit@1.13.6: quote "0.4.0" ramda "0.9.1" -ggit@2.4.12: - version "2.4.12" - resolved "https://registry.yarnpkg.com/ggit/-/ggit-2.4.12.tgz#0e605322d316c6772425757c17680bf830535d62" - integrity sha512-29DxkCEmqhXNk+JrV8GNQ+IY8OaJ1J2jC+B/vPvOk7CWs/2K8uX2DQeMlnFy7S+NeJrTNcLWfPJDdi6IflDt/A== - dependencies: - always-error "1.0.0" - bluebird "3.5.1" - chdir-promise "0.6.2" - check-more-types "2.24.0" - cli-table "0.3.1" - colors "1.3.2" - commander "2.17.1" - d3-helpers "0.3.0" - debug "3.2.6" - find-up "3.0.0" - glob "7.1.3" - lazy-ass "1.6.0" - lodash "4.17.15" - moment "2.23.0" - moment-timezone "0.5.23" - optimist "0.6.1" - pluralize "7.0.0" - q "2.0.3" - quote "0.4.0" - ramda "0.26.1" - semver "5.6.0" - gift@0.10.2, gift@^0.10.2: version "0.10.2" resolved "https://registry.yarnpkg.com/gift/-/gift-0.10.2.tgz#4600efe8f284b51fcb01c3527b321e22b494e156" @@ -15985,21 +15714,6 @@ git-hooks-list@1.0.3: resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-1.0.3.tgz#be5baaf78203ce342f2f844a9d2b03dba1b45156" integrity sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ== -git-issues@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/git-issues/-/git-issues-1.3.1.tgz#6d2d757c7fb4167b76508dfd635bfb9b66833317" - integrity sha1-bS11fH+0Fnt2UI39Y1v7m2aDMxc= - dependencies: - abs "^1.0.0" - bug-killer "^4.0.0" - clp "^3.0.0" - couleurs "^5.0.0" - git-url-parse "^4.0.0" - gry "^4.1.0" - is-there "^4.1.0" - le-table "^4.0.0" - request "^2.55.0" - git-log-parser@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/git-log-parser/-/git-log-parser-1.2.0.tgz#2e6a4c1b13fc00028207ba795a7ac31667b9fd4a" @@ -16039,14 +15753,6 @@ git-semver-tags@^2.0.3: meow "^4.0.0" semver "^6.0.0" -git-up@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/git-up/-/git-up-1.2.1.tgz#264480a006b1d84261ac1fe09a3a5169c57ea19d" - integrity sha1-JkSAoAax2EJhrB/gmjpRacV+oZ0= - dependencies: - is-ssh "^1.0.0" - parse-url "^1.0.0" - git-up@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.1.tgz#cb2ef086653640e721d2042fe3104857d89007c0" @@ -16062,13 +15768,6 @@ git-url-parse@^11.1.2: dependencies: git-up "^4.0.0" -git-url-parse@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-4.2.1.tgz#0409b419188e75cfba26357528a7d43bec22b517" - integrity sha1-BAm0GRiOdc+6JjV1KKfUO+witRc= - dependencies: - git-up "^1.0.0" - gitconfiglocal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" @@ -16640,15 +16339,6 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -gry@^4.1.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/gry/-/gry-4.3.1.tgz#278f6fdf89d5e8972e4b7c78ac2d1a0ccd632941" - integrity sha1-J49v34nV6JcuS3x4rC0aDM1jKUE= - dependencies: - exec-limiter "^3.0.0" - one-by-one "^2.0.0" - ul "^5.0.0" - gulp-awspublish@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/gulp-awspublish/-/gulp-awspublish-4.0.0.tgz#7d61c25d993ebc053ea58c7345ff544b8ac3756c" @@ -18485,7 +18175,7 @@ is-set@^2.0.1: resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== -is-ssh@^1.0.0, is-ssh@^1.3.0: +is-ssh@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.2.tgz#a4b82ab63d73976fd8263cceee27f99a88bdae2b" integrity sha512-elEw0/0c2UscLrNG+OAorbP539E3rhliKPg+hDMWN9VwrDXfYK+4PBEykDPfxlYYtQvl84TascnQyobfQLHEhQ== @@ -18533,11 +18223,6 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-there@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/is-there/-/is-there-4.5.1.tgz#ea292e7fad3fc4d70763fe0af40a286c9f5e1e2e" - integrity sha512-vIZ7HTXAoRoIwYSsTnxb0sg9L6rth+JOulNcavsbskQkCIWoSM2cjFOWZs4wGziGZER+Xgs/HXiCQZgiL8ppxQ== - is-typed-array@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.3.tgz#a4ff5a5e672e1a55f99c7f54e59597af5c1df04d" @@ -18860,11 +18545,6 @@ iterate-iterator@^1.0.1: resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.1.tgz#1693a768c1ddd79c969051459453f082fe82e9f6" integrity sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw== -iterate-object@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/iterate-object/-/iterate-object-1.3.4.tgz#fa50b1d9e58e340a7dd6b4c98c8a5e182e790096" - integrity sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw== - iterate-value@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57" @@ -20157,24 +19837,6 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" -le-table@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/le-table/-/le-table-4.0.0.tgz#3bfeb72d24cbfc37752f01539f9006d711d9be93" - integrity sha1-O/63LSTL/Dd1LwFTn5AG1xHZvpM= - dependencies: - cli-box "5.0.0" - overlap "2.0.0" - ul "5.0.0" - -le-table@^4.0.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/le-table/-/le-table-4.2.2.tgz#7da16a0399d01d9ceb9536289188a27415cf10c1" - integrity sha1-faFqA5nQHZzrlTYokYiidBXPEME= - dependencies: - cli-box "5.0.0" - overlap "2.0.0" - ul "5.0.0" - lead@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" @@ -20386,23 +20048,6 @@ license-checker@13.0.3: spdx-satisfies "^0.1.3" treeify "^1.0.1" -license-checker@19.0.0: - version "19.0.0" - resolved "https://registry.yarnpkg.com/license-checker/-/license-checker-19.0.0.tgz#fbf52a0878924cffea8bf4608aed61482ebe2d35" - integrity sha512-E9gODofeQYqNWnW7HhvnP6Ax0L6zllaPCRiPni5qYQT2GpVVZiyo00OghHdpCPqfXG2Gor8JEVukPJOdazLLrQ== - dependencies: - chalk "^2.4.1" - debug "^3.1.0" - mkdirp "^0.5.1" - nopt "^4.0.1" - read-installed "~4.0.3" - semver "^5.5.0" - spdx "^0.5.1" - spdx-correct "^3.0.0" - spdx-satisfies "^4.0.0" - strip-ansi "^4.0.0" - treeify "^1.1.0" - liftoff@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" @@ -20417,13 +20062,6 @@ liftoff@^3.1.0: rechoir "^0.6.2" resolve "^1.1.7" -limit-it@^3.0.0: - version "3.2.10" - resolved "https://registry.yarnpkg.com/limit-it/-/limit-it-3.2.10.tgz#a0e12007c9e7aeb46296309bca39bd7646d82887" - integrity sha512-T0NK99pHnkimldr1WUqvbGV1oWDku/xC9J/OqzJFsV1jeOS6Bwl8W7vkeQIBqwiON9dTALws+rX/XPMQqWerDQ== - dependencies: - typpy "^2.0.0" - line-column@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2" @@ -20950,11 +20588,6 @@ lodash@3.10.1, lodash@^3.1.0, lodash@^3.10.0, lodash@^3.5.0, lodash@^3.7.0, loda resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@4.17.10: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== - lodash@4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" @@ -22464,38 +22097,21 @@ module-not-found-error@^1.0.1: resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" integrity sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA= -moment-timezone@0.5.23: - version "0.5.23" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.23.tgz#7cbb00db2c14c71b19303cb47b0fb0a6d8651463" - integrity sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w== - dependencies: - moment ">= 2.9.0" - moment@2.17.0: version "2.17.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.17.0.tgz#a4c292e02aac5ddefb29a6eed24f51938dd3b74f" integrity sha1-pMKS4CqsXd77Kabu0k9Rk43Tt08= -moment@2.23.0: - version "2.23.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.23.0.tgz#759ea491ac97d54bac5ad776996e2a58cc1bc225" - integrity sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA== - moment@2.27.0: version "2.27.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d" integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ== -"moment@>= 2.9.0", moment@^2.19.1, moment@^2.27.0, moment@^2.9.0: +moment@^2.19.1, moment@^2.27.0, moment@^2.9.0: version "2.29.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.0.tgz#fcbef955844d91deb55438613ddcec56e86a3425" integrity sha512-z6IJ5HXYiuxvFTI6eiQ9dm77uE0gyy1yXNApVHqTcnIKfY9tIwEjlzsZ6u1LQXvVgKeTnv9Xm7NDvJ7lso3MtA== -months@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/months/-/months-1.2.0.tgz#beef54873960334abe0b03f6b38db8adb44a13ac" - integrity sha512-zFM7hUpziSYGk2DNObYGWgHdRRxAOgjl8CC1Rbl50p/q0rGDsREfk0nbxxmSIquVi/lEAuUY8nwbwkZ8biNCOQ== - moo@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4" @@ -23022,11 +22638,6 @@ noop-logger@^0.1.1: resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= -noop6@^1.0.0, noop6@^1.0.1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/noop6/-/noop6-1.0.9.tgz#8749944c15c09f2cd2d562ac24f5a8341762a950" - integrity sha512-DB3Hwyd89dPr5HqEPg3YHjzvwh/mCqizC1zZ8vyofqc+TQRyPDnT4wgXXbLGF4z9YAzwwTLi8pNLhGqcbSjgkA== - nopt@1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" @@ -23674,13 +23285,6 @@ once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0, once@~1.4.0: dependencies: wrappy "1" -one-by-one@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/one-by-one/-/one-by-one-2.2.1.tgz#61c812e013475f4bdb2af5d38e056963bf6355c4" - integrity sha1-YcgS4BNHX0vbKvXTjgVpY79jVcQ= - dependencies: - deffy "^2.0.0" - one-time@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" @@ -23873,15 +23477,6 @@ output-file-sync@^1.1.0: mkdirp "^0.5.1" object-assign "^4.1.0" -overlap@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/overlap/-/overlap-2.0.0.tgz#b29b6bb2ad7569c4e66faef28cb5d74361179cb4" - integrity sha1-sptrsq11acTmb67yjLXXQ2EXnLQ= - dependencies: - ansi-parser "3.0.0" - cli-box "5.0.0" - couleurs "5.0.0" - p-cancelable@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" @@ -24285,13 +23880,6 @@ parse-headers@^2.0.0: resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== -parse-it@^1.0.0: - version "1.0.10" - resolved "https://registry.yarnpkg.com/parse-it/-/parse-it-1.0.10.tgz#1b54b770e1703f257cee71c234db8f924f9293b8" - integrity sha512-VAG4EuoNd2TT2wSRUuKyLEkZR3MhdWc+3UPp5CDQzqSt/FiniG+yJ5RXyJYiuzVAMEKL4d97gx6O3LR5jEB3uQ== - dependencies: - regex-escape "^3.4.0" - parse-json@^2.1.0, parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -24340,14 +23928,6 @@ parse-path@^4.0.0: is-ssh "^1.3.0" protocols "^1.4.0" -parse-url@^1.0.0: - version "1.3.11" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-1.3.11.tgz#57c15428ab8a892b1f43869645c711d0e144b554" - integrity sha1-V8FUKKuKiSsfQ4aWRccR0OFEtVQ= - dependencies: - is-ssh "^1.3.0" - protocols "^1.4.0" - parse-url@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-5.0.1.tgz#99c4084fc11be14141efa41b3d117a96fcb9527f" @@ -24843,16 +24423,16 @@ pluralize@3.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-3.0.0.tgz#72799a9ef41a53ff0c03de6522e286b40d5c932d" integrity sha1-cnmanvQaU/8MA95lIuKGtA1cky0= -pluralize@7.0.0, pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== - pluralize@8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== + pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" @@ -27379,11 +26959,6 @@ regex-cache@^0.4.2: dependencies: is-equal-shallow "^0.1.3" -regex-escape@^3.4.0: - version "3.4.10" - resolved "https://registry.yarnpkg.com/regex-escape/-/regex-escape-3.4.10.tgz#b45afec7a6e793b786ad193dc3d18b46b5ae08e6" - integrity sha512-qEqf7uzW+iYcKNLMDFnMkghhQBnGdivT6KqVQyKsyjSWnoFyooXVnxrw9dtv3AFLnD6VBGXxtZGAQNFGFTnCqA== - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -27649,7 +27224,7 @@ request-promise@^4.2.2: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.55.0, request@^2.87.0, request@^2.88.0, request@^2.88.2: +request@^2.87.0, request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -28511,11 +28086,6 @@ semver@5.5.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== -semver@5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== - semver@6.3.0, semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -29512,15 +29082,6 @@ spdx-compare@^0.1.2: spdx-expression-parse "^1.0.0" spdx-ranges "^1.0.0" -spdx-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/spdx-compare/-/spdx-compare-1.0.0.tgz#2c55f117362078d7409e6d7b08ce70a857cd3ed7" - integrity sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A== - dependencies: - array-find-index "^1.0.2" - spdx-expression-parse "^3.0.0" - spdx-ranges "^2.0.0" - spdx-correct@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-2.0.4.tgz#d1652ad2ebc516f656f66ea93398558065f1b4a4" @@ -29588,11 +29149,6 @@ spdx-ranges@^1.0.0: resolved "https://registry.yarnpkg.com/spdx-ranges/-/spdx-ranges-1.0.1.tgz#0f4eec7b8ea48ed202e374bb8942e8d18dc0113e" integrity sha1-D07se46kjtIC43S7iULo0Y3AET4= -spdx-ranges@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/spdx-ranges/-/spdx-ranges-2.1.1.tgz#87573927ba51e92b3f4550ab60bfc83dd07bac20" - integrity sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA== - spdx-satisfies@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/spdx-satisfies/-/spdx-satisfies-0.1.3.tgz#67a1f274e6115d4aae28afe474db76164be10bdc" @@ -29601,15 +29157,6 @@ spdx-satisfies@^0.1.3: spdx-compare "^0.1.2" spdx-expression-parse "^1.0.0" -spdx-satisfies@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/spdx-satisfies/-/spdx-satisfies-4.0.1.tgz#9a09a68d80f5f1a31cfaebb384b0c6009e4969fe" - integrity sha512-WVzZ/cXAzoNmjCWiEluEA3BjHp5tiUmmhn9MK+X0tBbR9sOqtC6UQwmgCNrAIZvNlMuBUYAaHYfb2oqlF9SwKA== - dependencies: - spdx-compare "^1.0.0" - spdx-expression-parse "^3.0.0" - spdx-ranges "^2.0.0" - spdx@^0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/spdx/-/spdx-0.5.2.tgz#76a428b9b97e7904ef83e62a4af0d06fdb50c265" @@ -29807,11 +29354,6 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -static-methods@^1.0.0: - version "1.0.12" - resolved "https://registry.yarnpkg.com/static-methods/-/static-methods-1.0.12.tgz#1484d57f59a9e0ca346c0c3fb9e9917507295683" - integrity sha512-QreySTr3LHtHk0OhrZ3RKvrV/4nBRyUPPCycmTUQTENIopEaDalZzI+q+KfmNmcxeHhA3WKe3h25lAxXZEDGVw== - "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" @@ -30360,7 +29902,7 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^3.1.0, supports-color@^3.1.2: +supports-color@^3.1.0: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= @@ -31466,18 +31008,6 @@ typescript@next: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.0-dev.20200711.tgz#c98738ca78d3b2caaa91adaaef72d2abdb5f7a48" integrity sha512-ynscKsQt5G6NStIzPpzCEhPJK0qp/DYyI6uTl5Mn1mDhBqnrMXQWXGoYDl9DA6Mf5plK64zSD9CoSn4L8vDyig== -typpy@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/typpy/-/typpy-2.0.0.tgz#adef3bacc12ff47aff920fab03a8ff3279d737d6" - integrity sha1-re87rMEv9Hr/kg+rA6j/MnnXN9Y= - -typpy@^2.0.0, typpy@^2.1.0, typpy@^2.3.1, typpy@^2.3.4, typpy@^2.3.6: - version "2.3.12" - resolved "https://registry.yarnpkg.com/typpy/-/typpy-2.3.12.tgz#252209373a980b9be4b152b3d7ef17b7036a498c" - integrity sha512-VginyZYxadNyFnB763lvFGNUqsIRtJt2V33pLfdnjRreObbKaxexUC+39EVb3MavWU9ggekvT1ojEU0kvtumfA== - dependencies: - function.name "^1.0.3" - ua-parser-js@^0.7.18: version "0.7.21" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" @@ -31528,22 +31058,6 @@ uid-safe@2.1.5, uid-safe@~2.1.5: dependencies: random-bytes "~1.0.0" -ul@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ul/-/ul-5.0.0.tgz#ca80d793025f3fd5dc9bf83469818d310a7c9a62" - integrity sha1-yoDXkwJfP9Xcm/g0aYGNMQp8mmI= - dependencies: - deffy "2.0.0" - typpy "2.0.0" - -ul@^5.0.0, ul@^5.2.1: - version "5.2.15" - resolved "https://registry.yarnpkg.com/ul/-/ul-5.2.15.tgz#426425355ae15df2d5d09b351aade26ed06dd9ed" - integrity sha512-svLEUy8xSCip5IWnsRa0UOg+2zP0Wsj4qlbjTmX6GJSmvKMHADBuHOm1dpNkWqWPIGuVSqzUkV3Cris5JrlTRQ== - dependencies: - deffy "^2.2.2" - typpy "^2.3.4" - ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" @@ -31850,7 +31364,23 @@ update-notifier@1.0.3: semver-diff "^2.0.0" xdg-basedir "^2.0.0" -update-notifier@4.1.0, update-notifier@^4.1.0: +update-notifier@^2.2.0, update-notifier@^2.3.0, update-notifier@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +update-notifier@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3" integrity sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew== @@ -31869,22 +31399,6 @@ update-notifier@4.1.0, update-notifier@^4.1.0: semver-diff "^3.1.1" xdg-basedir "^4.0.0" -update-notifier@^2.2.0, update-notifier@^2.3.0, update-notifier@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" - integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== - dependencies: - boxen "^1.2.1" - chalk "^2.0.1" - configstore "^3.0.0" - import-lazy "^2.1.0" - is-ci "^1.0.10" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - upper-case-first@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" @@ -33721,11 +33235,6 @@ ws@~6.1.0: dependencies: async-limiter "~1.0.0" -x256@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/x256/-/x256-0.0.2.tgz#c9af18876f7a175801d564fe70ad9e8317784934" - integrity sha1-ya8Yh296F1gB1WT+cK2egxd4STQ= - xdg-basedir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2"