diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..7d30ce8063 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,92 @@ +name: ci +on: + pull_request: + push: + branches: + - master +jobs: + tests: + name: tests + strategy: + matrix: + os: [ubuntu-18.04, macos-latest, windows-2019] + channel: [beta, nightly] + fail-fast: false + runs-on: ${{ matrix.os }} + env: + ATOM_GITHUB_BABEL_ENV: coverage + MOCHA_TIMEOUT: 60000 + UNTIL_TIMEOUT: 30000 + steps: + - uses: actions/checkout@v1 + - name: install Atom + uses: UziTech/action-setup-atom@v1 + with: + channel: ${{ matrix.channel }} + + - name: install dependencies + run: apm ci + + - name: configure git + shell: bash + run: | + git config --global user.name Hubot + git config --global user.email hubot@github.com + + - name: Run the tests + if: ${{ !contains(matrix.os, 'windows') }} + run: atom --test test + + - name: Run the tests on Windows + if: ${{ contains(matrix.os, 'windows') }} + continue-on-error: true # due to https://github.com/atom/github/pull/2459#issuecomment-624725972 + run: atom --test test + + - name: report code coverage + shell: bash + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + SYSTEM_PULLREQUEST_PULLREQUESTNUMBER: ${{ github.event.number }} + SYSTEM_PULLREQUEST_SOURCEBRANCH: ${{ github.head_ref }} + BUILD_SOURCEBRANCH: ${{ github.event.ref }} + OS_NAME: ${{ matrix.os }} + run: | + npm run report:coverage + COVERAGE_NAME=$([[ "${OS_NAME}" == macos* ]] && echo "macOS" || echo "Linux") + bash <(curl -s https://codecov.io/bash) \ + -n "${COVERAGE_NAME}" \ + -P "${SYSTEM_PULLREQUEST_PULLREQUESTNUMBER:-}" \ + -B "${SYSTEM_PULLREQUEST_SOURCEBRANCH:-${BUILD_SOURCEBRANCH}}" + if: | + !contains(matrix.os, 'windows') && + (success() || failure()) + lint: + name: lint + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v1 + - name: install Atom + uses: UziTech/action-setup-atom@v1 + with: + channel: nightly + - name: install dependencies + run: apm ci + - name: lint + run: npm run lint + + snapshot-tests: + name: snapshot tests + runs-on: ubuntu-18.04 + env: + ATOM_GITHUB_BABEL_ENV: coverage + ATOM_GITHUB_TEST_SUITE: snapshot + steps: + - uses: actions/checkout@v1 + - name: install Atom + uses: UziTech/action-setup-atom@v1 + with: + channel: nightly + - name: install dependencies + run: apm ci + - name: run snapshot tests + run: atom --test test/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 54ab8637bf..dc9d7bb021 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ For general contributing information, see the [Atom contributing guide](https:// In particular, the GitHub package is under constant development by a portion of the core Atom team, and there is currently a clear vision for short- to medium-term features and enhancements. That doesn't mean we won't merge pull requests or fix other issues, but it *does* mean that you should consider discussing things with us first so that you don't spend time implementing things in a way that differs from the patterns we want to establish or build a feature that we're already working on. -Feel free to [open an issue](https://github.com/atom/github/issues) if you want to discuss anything with us. Depending on the scope and complexity of your proposal we may ask you to reframe it as a [Feature Request](/docs/how-we-work.md#new-features). If you're curious what we're working on and will be working on in the near future, you can take a look at [our most recent sprint project](https://github.com/atom/github/project) or [accepted Feature Requests](/docs/feature-requests/). +Feel free to [open an issue](https://github.com/atom/github/issues) if you want to discuss anything with us. Depending on the scope and complexity of your proposal we may ask you to reframe it as a [Feature Request](/docs/how-we-work.md#new-features). If you're curious what we're working on and will be working on in the near future, you can take a look at [our most recent sprint project](https://github.com/atom/github/projects) or [accepted Feature Requests](/docs/feature-requests/). ## Getting started diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 2bc88e7f31..42d963a11d 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -20,29 +20,31 @@ Do you want to ask a question? Are you looking for support? The Atom message boa ### Description -[Description of the issue] + ### Steps to Reproduce -1. [First Step] -2. [Second Step] -3. [and so on...] +1. +2. +3. **Expected behavior:** -[What did you expect to happen?] + **Actual behavior:** -[What actually happened instead?] + **Reproduces how often:** -[What percentage of the time does this happen?] + -### Versions +### Platform and Versions -You can get this information from copy and pasting the output of `atom --version` and `apm --version` from the command line. Also, please include the OS and what version of the OS you're running. +What OS and version of OS are you running? + +What version of Atom are you using? You can get this information from copy and pasting the output of `atom --version` and `apm --version` from the command line. ### Additional Information diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index 7e2f5af7de..1be3b35bc2 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -3,7 +3,6 @@ ### Requirements * Filling out the template is required. Any pull request that does not include enough information to be reviewed in a timely manner may be closed at the maintainers' discretion. -* Suggestion: You can use checklists to keep track of progress for the sections on metrics, tests, documentation, and user research. ### Description of the Change @@ -13,70 +12,10 @@ We must be able to understand the design of your change from this description. I --> -### Screenshot/Gif +### Screenshot or Gif -### Alternate Designs - - - -### Benefits - - - -### Possible Drawbacks - - - ### Applicable Issues - - -### Metrics - - - -### Tests - - - -### Documentation - - - -### Release Notes - - - -### User Experience Research (Optional) - - - + diff --git a/README.md b/README.md index 1468dc3ee1..d7d7d2b5ce 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ -# Atom GitHub Package +##### Atom and all repositories under Atom will be archived on December 15, 2022. Learn more in our [official announcement](https://github.blog/2022-06-08-sunsetting-atom/) + # Atom GitHub Package -| Build | Code Coverage | Dependencies | -|-------|---------------|--------------| -| [![Build Status](https://dev.azure.com/atom-github/GitHub%20package%20for%20Atom/_apis/build/status/atom.github)](https://dev.azure.com/atom-github/GitHub%20package%20for%20Atom/_build/latest?definitionId=1) | [![codecov](https://codecov.io/gh/atom/github/branch/master/graph/badge.svg)](https://codecov.io/gh/atom/github) | [![Greenkeeper badge](https://badges.greenkeeper.io/atom/github.svg)](https://greenkeeper.io/) [![Dependency Status](https://david-dm.org/atom/github.svg)](https://david-dm.org/atom/github) | +| Build | Code Coverage | +|-------|---------------| +| [![Build Status](https://github.com/atom/github/workflows/ci/badge.svg)](https://github.com/atom/github/actions?query=workflow%3Aci+branch%3Amaster) | [![codecov](https://codecov.io/gh/atom/github/branch/master/graph/badge.svg)](https://codecov.io/gh/atom/github) | The Atom GitHub package provides Git and GitHub integration for Atom. Check out [github.atom.io](https://github.atom.io) for more information. diff --git a/actions/auto-sprint/package-lock.json b/actions/auto-sprint/package-lock.json index 49fe765296..1c2ecb1028 100644 --- a/actions/auto-sprint/package-lock.json +++ b/actions/auto-sprint/package-lock.json @@ -491,9 +491,9 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" }, "npm-run-path": { "version": "2.0.2", diff --git a/actions/schema-up/package-lock.json b/actions/schema-up/package-lock.json index 69980f44ca..7b29ad2527 100644 --- a/actions/schema-up/package-lock.json +++ b/actions/schema-up/package-lock.json @@ -12,18 +12,18 @@ } }, "@babel/core": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", - "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.2.tgz", + "integrity": "sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ==", "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.5.5", - "@babel/helpers": "^7.5.5", - "@babel/parser": "^7.5.5", - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5", - "convert-source-map": "^1.1.0", + "@babel/generator": "^7.7.2", + "@babel/helpers": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.7.2", + "convert-source-map": "^1.7.0", "debug": "^4.1.0", "json5": "^2.1.0", "lodash": "^4.17.13", @@ -33,128 +33,127 @@ } }, "@babel/generator": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", - "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", + "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", "requires": { - "@babel/types": "^7.5.5", + "@babel/types": "^7.7.2", "jsesc": "^2.5.1", "lodash": "^4.17.13", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz", + "integrity": "sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg==", "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.0" } }, "@babel/helper-builder-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz", - "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.0.tgz", + "integrity": "sha512-LSln3cexwInTMYYoFeVLKnYPPMfWNJ8PubTBs3hkh7wCu9iBaqq1OOyW+xGmEdLxT1nhsl+9SJ+h2oUDYz0l2A==", "requires": { - "@babel/types": "^7.3.0", + "@babel/types": "^7.7.0", "esutils": "^2.0.0" } }, "@babel/helper-call-delegate": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", - "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.0.tgz", + "integrity": "sha512-Su0Mdq7uSSWGZayGMMQ+z6lnL00mMCnGAbO/R0ZO9odIdB/WNU/VfQKqMQU0fdIsxQYbRjDM4BixIa93SQIpvw==", "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/helper-hoist-variables": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz", - "integrity": "sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.0.tgz", + "integrity": "sha512-MZiB5qvTWoyiFOgootmRSDV1udjIqJW/8lmxgzKq6oDqxdmHUjeP2ZUOmgHdYjmUVNABqRrHjYAYRvj8Eox/UA==", "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-member-expression-to-functions": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4" + "@babel/helper-replace-supers": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0" } }, "@babel/helper-define-map": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", - "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz", + "integrity": "sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA==", "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.5.5", + "@babel/helper-function-name": "^7.7.0", + "@babel/types": "^7.7.0", "lodash": "^4.17.13" } }, "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", + "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-get-function-arity": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", + "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.0" } }, "@babel/helper-hoist-variables": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", - "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz", + "integrity": "sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ==", "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.0" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", - "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz", + "integrity": "sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA==", "requires": { - "@babel/types": "^7.5.5" + "@babel/types": "^7.7.0" } }, "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz", + "integrity": "sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==", "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.0" } }, "@babel/helper-module-transforms": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", - "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/template": "^7.4.4", - "@babel/types": "^7.5.5", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz", + "integrity": "sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ==", + "requires": { + "@babel/helper-module-imports": "^7.7.0", + "@babel/helper-simple-access": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0", "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz", + "integrity": "sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg==", "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.0" } }, "@babel/helper-plugin-utils": { @@ -163,41 +162,41 @@ "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" }, "@babel/helper-replace-supers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", - "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz", + "integrity": "sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" + "@babel/helper-member-expression-to-functions": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/helper-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz", + "integrity": "sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g==", "requires": { - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", + "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.0" } }, "@babel/helpers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", - "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.0.tgz", + "integrity": "sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g==", "requires": { - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/highlight": { @@ -211,23 +210,23 @@ } }, "@babel/parser": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", - "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==" + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.3.tgz", + "integrity": "sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A==" }, "@babel/plugin-proposal-class-properties": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", - "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.0.tgz", + "integrity": "sha512-tufDcFA1Vj+eWvwHN+jvMN6QsV5o+vUlytNKrbMiCeDL0F2j92RURzUsUMWE5EJkLyWxjdUslCsMQa9FWth16A==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.5.5", + "@babel/helper-create-class-features-plugin": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", - "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", + "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-object-rest-spread": "^7.2.0" @@ -242,9 +241,9 @@ } }, "@babel/plugin-syntax-flow": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz", - "integrity": "sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.7.0.tgz", + "integrity": "sha512-vQMV07p+L+jZeUnvX3pEJ9EiXGCjB5CTTvsirFD9rpEuATnoAvLBLoYbw1v5tyn3d2XxSuvEKi8cV3KqYUa0vQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -282,26 +281,26 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz", - "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz", + "integrity": "sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", - "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz", + "integrity": "sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.7.0", + "@babel/helper-define-map": "^7.7.0", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/helper-replace-supers": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", "globals": "^11.1.0" } }, @@ -314,17 +313,17 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz", - "integrity": "sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", + "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz", - "integrity": "sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.6.3.tgz", + "integrity": "sha512-l0ETkyEofkqFJ9LS6HChNIKtVJw2ylKbhYMlJ5C6df+ldxxaLIyXY4yOdDQQspfFpV8/vDiaWoJlvflstlYNxg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-flow": "^7.2.0" @@ -339,11 +338,11 @@ } }, "@babel/plugin-transform-function-name": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", - "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.0.tgz", + "integrity": "sha512-P5HKu0d9+CzZxP5jcrWdpe7ZlFDe24bmqP6a6X8BHEBl/eizAsY8K6LX8LASZL0Jxdjm5eEfzp+FIrxCm/p8bA==", "requires": { - "@babel/helper-function-name": "^7.1.0", + "@babel/helper-function-name": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0" } }, @@ -364,13 +363,13 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz", - "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz", + "integrity": "sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg==", "requires": { - "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-module-transforms": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-simple-access": "^7.7.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, @@ -410,11 +409,11 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz", - "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.0.tgz", + "integrity": "sha512-mXhBtyVB1Ujfy+0L6934jeJcSXj/VCg6whZzEcgiiZHNS0PGC7vUCsZDQCxxztkpIdF+dY1fUMcjAgEOC3ZOMQ==", "requires": { - "@babel/helper-builder-react-jsx": "^7.3.0", + "@babel/helper-builder-react-jsx": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-jsx": "^7.2.0" } @@ -428,9 +427,9 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", - "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", + "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -444,53 +443,44 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, - "@babel/polyfill": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.4.4.tgz", - "integrity": "sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg==", - "requires": { - "core-js": "^2.6.5", - "regenerator-runtime": "^0.13.2" - } - }, "@babel/runtime": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", - "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", + "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", "requires": { "regenerator-runtime": "^0.13.2" } }, "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", + "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/parser": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/traverse": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", - "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", + "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.5.5", - "@babel/types": "^7.5.5", + "@babel/generator": "^7.7.2", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/types": "^7.7.2", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", - "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -768,9 +758,9 @@ "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" }, "babel-preset-fbjs": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.2.0.tgz", - "integrity": "sha512-5Jo+JeWiVz2wHUUyAlvb/sSYnXNig9r+HqGAOSfh5Fzxp7SnAaR/tEGRJ1ZX7C77kfk82658w6R5Z+uPATTD9g==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz", + "integrity": "sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw==", "requires": { "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-object-rest-spread": "^7.0.0", @@ -898,9 +888,9 @@ } }, "bser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", - "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "requires": { "node-int64": "^0.4.0" } @@ -1027,9 +1017,9 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "requires": { "safe-buffer": "~5.1.1" } @@ -1040,9 +1030,9 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==" }, "cross-spawn": { "version": "6.0.5", @@ -1167,9 +1157,9 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "execa": { "version": "1.0.0", @@ -1537,9 +1527,9 @@ } }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" }, "iconv-lite": { "version": "0.4.24", @@ -1763,9 +1753,9 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", "requires": { "minimist": "^1.2.0" } @@ -1804,9 +1794,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "lodash.get": { "version": "4.4.2", @@ -1867,9 +1857,9 @@ } }, "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==" }, "micromatch": { "version": "3.1.10", @@ -1972,9 +1962,9 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" }, "node-int64": { "version": "0.4.0", @@ -2319,33 +2309,32 @@ } }, "relay-compiler": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/relay-compiler/-/relay-compiler-5.0.0.tgz", - "integrity": "sha512-q8gKlPRTJe/TwtIokbdXehy1SxDFIyLBZdsfg60J4OcqyviIx++Vhc+h4lXzBY8LsBVaJjTuolftYcXJLhlE6g==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/relay-compiler/-/relay-compiler-7.1.0.tgz", + "integrity": "sha512-8SisbLejjob1CYI9uQP7wxtsWvT+cvbx1iFDgP5U360UBukOGWLehfmn33lygY0LYqnfMShgvL1n7lrqoohs5A==", "requires": { "@babel/core": "^7.0.0", "@babel/generator": "^7.0.0", "@babel/parser": "^7.0.0", - "@babel/polyfill": "^7.0.0", "@babel/runtime": "^7.0.0", "@babel/traverse": "^7.0.0", "@babel/types": "^7.0.0", - "babel-preset-fbjs": "^3.1.2", + "babel-preset-fbjs": "^3.3.0", "chalk": "^2.4.1", "fast-glob": "^2.2.2", "fb-watchman": "^2.0.0", "fbjs": "^1.0.0", "immutable": "~3.7.6", - "nullthrows": "^1.1.0", - "relay-runtime": "5.0.0", + "nullthrows": "^1.1.1", + "relay-runtime": "7.1.0", "signedsource": "^1.0.0", "yargs": "^9.0.0" } }, "relay-runtime": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-5.0.0.tgz", - "integrity": "sha512-lrC2CwfpWWHBAN608eENAt5Bc5zqXXE2O9HSo8tc6Gy5TxfK+fU+x9jdwXQ2mXxVPgANYtYeKzU5UTfcX0aDEw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-7.1.0.tgz", + "integrity": "sha512-19WV0dC4rcbXnVBKEA4ZL41ccfJRUZ7/KKfQsgc9SwjqCi2g3+yYIR9wJ4KoC+rEfG2yN3W1vWBEqr+igH/rzA==", "requires": { "@babel/runtime": "^7.0.0", "fbjs": "^1.0.0" @@ -2372,9 +2361,9 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "requires": { "path-parse": "^1.0.6" } @@ -2774,11 +2763,6 @@ "repeat-string": "^1.6.1" } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, "ua-parser-js": { "version": "0.7.20", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz", diff --git a/actions/schema-up/package.json b/actions/schema-up/package.json index fb2bffdf2d..1fed2b084b 100644 --- a/actions/schema-up/package.json +++ b/actions/schema-up/package.json @@ -8,7 +8,7 @@ "dependencies": { "actions-toolkit": "2.2.0", "graphql": "14.5.8", - "node-fetch": "2.6.0", - "relay-compiler": "5.0.0" + "node-fetch": "2.6.1", + "relay-compiler": "7.1.0" } } diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index f32faac8d2..0000000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,204 +0,0 @@ -trigger: - branches: - include: - - master - - '*-releases' -pr: - branches: - include: - - '*' - -jobs: -- job: Linux - pool: - vmImage: ubuntu-16.04 - variables: - display: ":99" - atom_channel: dev - atom_name: atom-dev - steps: - - template: script/azure-pipelines/linux-install.yml - parameters: - atom_channel: $(atom_channel) - atom_name: $(atom_name) - - bash: | - "/tmp/atom/usr/bin/${ATOM_NAME}" --test test/ - displayName: run tests - env: - TEST_JUNIT_XML_PATH: $(Agent.HomeDirectory)/test-results.xml - ATOM_GITHUB_BABEL_ENV: coverage - FORCE_COLOR: 0 - MOCHA_TIMEOUT: 60000 - UNTIL_TIMEOUT: 30000 - - task: PublishTestResults@2 - inputs: - testResultsFormat: JUnit - testResultsFiles: $(Agent.HomeDirectory)/test-results.xml - testRunTitle: Linux $(atom_channel) - condition: succeededOrFailed() - - bash: npm run report:coverage - displayName: generate code coverage reports - condition: succeededOrFailed() - - bash: > - bash <(curl -s https://codecov.io/bash) - -n "Linux $(atom_channel)" - -P "${SYSTEM_PULLREQUEST_PULLREQUESTNUMBER:-}" - -B "${SYSTEM_PULLREQUEST_SOURCEBRANCH:-${BUILD_SOURCEBRANCH}}" - displayName: publish code coverage to CodeCov - env: - CODECOV_TOKEN: $(codecov.token) - condition: succeededOrFailed() - - task: PublishCodeCoverageResults@1 - inputs: - codeCoverageTool: cobertura - summaryFileLocation: $(System.DefaultWorkingDirectory)/coverage/cobertura-coverage.xml - reportDirectory: $(System.DefaultworkingDirectory)/coverage/ - condition: succeededOrFailed() - -- job: MacOS - pool: - vmImage: macos-10.13 - variables: - atom_channel: dev - atom_app: Atom Dev.app - steps: - - template: script/azure-pipelines/macos-install.yml - parameters: - atom_channel: $(atom_channel) - atom_app: $(atom_app) - - bash: | - "/tmp/atom/${ATOM_APP}/Contents/Resources/app/atom.sh" --test test/ - displayName: run tests - env: - TEST_JUNIT_XML_PATH: $(Agent.HomeDirectory)/test-results.xml - ATOM_GITHUB_BABEL_ENV: coverage - FORCE_COLOR: 0 - MOCHA_TIMEOUT: 60000 - UNTIL_TIMEOUT: 30000 - - task: PublishTestResults@2 - inputs: - testResultsFormat: JUnit - testResultsFiles: $(Agent.HomeDirectory)/test-results.xml - testRunTitle: MacOS $(atom_channel) - condition: succeededOrFailed() - - bash: npm run report:coverage - displayName: generate code coverage reports - condition: succeededOrFailed() - - bash: > - bash <(curl -s https://codecov.io/bash) - -n "MacOS $(atom_channel)" - -P "${SYSTEM_PULLREQUEST_PULLREQUESTNUMBER:-}" - -B "${SYSTEM_PULLREQUEST_SOURCEBRANCH:-${BUILD_SOURCEBRANCH}}" - displayName: publish code coverage to CodeCov - env: - CODECOV_TOKEN: $(codecov.token) - condition: succeededOrFailed() - - task: PublishCodeCoverageResults@1 - inputs: - codeCoverageTool: cobertura - summaryFileLocation: $(System.DefaultWorkingDirectory)/coverage/cobertura-coverage.xml - reportDirectory: $(System.DefaultworkingDirectory)/coverage/ - condition: succeededOrFailed() - -- job: Windows - pool: - vmImage: vs2015-win2012r2 - variables: - atom_channel: dev - atom_directory: Atom Dev - steps: - - template: script/azure-pipelines/windows-install.yml - parameters: - atom_channel: $(atom_channel) - atom_directory: $(atom_directory) - - powershell: | - Set-StrictMode -Version Latest - $script:ATOMROOT = "$env:AGENT_HOMEDIRECTORY/atom" - $script:ATOM_SCRIPT_PATH = "$script:ATOMROOT\$env:ATOM_DIRECTORY\resources\cli\atom.cmd" - - # Normalize %TEMP% as a long (non 8.3) path. - $env:TEMP = (Get-Item -LiteralPath $env:TEMP).FullName - - $env:ELECTRON_NO_ATTACH_CONSOLE = "true" - [Environment]::SetEnvironmentVariable("ELECTRON_NO_ATTACH_CONSOLE", "true", "User") - $env:ELECTRON_ENABLE_LOGGING = "YES" - [Environment]::SetEnvironmentVariable("ELECTRON_ENABLE_LOGGING", "YES", "User") - - Write-Host "Running tests" - & "$script:ATOM_SCRIPT_PATH" --test test 2>&1 | %{ "$_" } - - if ($LASTEXITCODE -ne 0) { - Write-Host "Specs Failed" - $host.SetShouldExit($LASTEXITCODE) - exit - } - displayName: run tests - env: - TEST_JUNIT_XML_PATH: $(Agent.HomeDirectory)/test-results.xml - ATOM_GITHUB_BABEL_ENV: coverage - ATOM_GITHUB_SKIP_SYMLINKS: 1 - FORCE_COLOR: 0 - MOCHA_TIMEOUT: 60000 - UNTIL_TIMEOUT: 30000 - - task: PublishTestResults@2 - inputs: - testResultsFormat: JUnit - testResultsFiles: $(Agent.HomeDirectory)/test-results.xmlq - testRunTitle: Windows $(atom_channel) - condition: succeededOrFailed() - - powershell: npm run report:coverage - displayName: generate code coverage reports - condition: succeededOrFailed() - - bash: > - bash <(curl -s https://codecov.io/bash) - -n "Windows $(atom_channel)" - -P "${SYSTEM_PULLREQUEST_PULLREQUESTNUMBER:-}" - -B "${SYSTEM_PULLREQUEST_SOURCEBRANCH:-${BUILD_SOURCEBRANCH}}" - displayName: publish code coverage to CodeCov - env: - CODECOV_TOKEN: $(codecov.token) - condition: succeededOrFailed() - - task: PublishCodeCoverageResults@1 - inputs: - codeCoverageTool: cobertura - summaryFileLocation: $(System.DefaultWorkingDirectory)/coverage/cobertura-coverage.xml - reportDirectory: $(System.DefaultworkingDirectory)/coverage/ - condition: succeededOrFailed() - -- job: Lint - pool: - vmImage: ubuntu-16.04 - variables: - display: ":99" - atom_channel: dev - steps: - - template: script/azure-pipelines/linux-install.yml - parameters: - atom_channel: $(atom_channel) - atom_name: atom-dev - - bash: /tmp/atom/usr/share/atom-dev/resources/app/apm/node_modules/.bin/npm run lint - displayName: run the linter - -- job: Snapshot - pool: - vmImage: ubuntu-16.04 - variables: - display: ":99" - atom_channel: dev - steps: - - template: script/azure-pipelines/linux-install.yml - parameters: - atom_channel: $(atom_channel) - atom_name: atom-dev - - bash: /tmp/atom/usr/bin/atom-dev --test test/ - displayName: run tests - env: - ATOM_GITHUB_TEST_SUITE: snapshot - TEST_JUNIT_XML_PATH: $(Agent.HomeDirectory)/test-results.xml - FORCE_COLOR: 0 - - task: PublishTestResults@2 - inputs: - testResultsFormat: JUnit - testResultsFiles: $(Agent.HomeDirectory)/test-results.xml - testRunTitle: Snapshot - condition: succeededOrFailed() diff --git a/docs/feature-requests/005-blank-slate.md b/docs/feature-requests/005-blank-slate.md new file mode 100644 index 0000000000..40b0b6d9cc --- /dev/null +++ b/docs/feature-requests/005-blank-slate.md @@ -0,0 +1,200 @@ + + +**_Part 1 - Required information_** + +# Improved Blank Slate Behavior + +## :memo: Summary + +Improve the behavior of the GitHub tab when no GitHub remote is detected to better guide users to start using GitHub features. + +## :checkered_flag: Motivation + +Well, for one thing, we've had TODOs in [GitHubTabView](https://github.com/atom/github/blob/cf1009243a35e2a6880ae3c969f2fe2a11d3f72d/lib/views/github-tab-view.js#L81) and [GitHubTabContainer](https://github.com/atom/github/blob/cf1009243a35e2a6880ae3c969f2fe2a11d3f72d/lib/containers/github-tab-container.js#L78-L81) for these cases since they were written. But we've also received repeated and clear feedback from UXR studies, [issues](https://github.com/atom/github/issues/1962), and [the forum](https://discuss.atom.io/t/github-link/60168) that users are confused about what to do to "link a repository with GitHub" to use our GitHub features. + +This is a roadblock that is almost certainly keeping users who want to use our package from doing so. + +## 🤯 Explanation + +Our goal is to provide prompts for useful next steps when the current repository does not have a unique remote pointing to `https://github.com`. When a user opens the GitHub tab in any of these situations, they should be presented with options to direct their next course of action. + +In each situation below, our user's goal is the same: to have the repository they wish to work on (a) cloned on their computer with a correct remote configuration and (b) on dotcom. + +## GitHub tab + +### No local repository + +We detect this state when the active repository is absent, meaning there are no project root directories. + +github tab, no local repositories + +#### ...no dotcom repository + +_Scenario:_ A user wants to start a new project published on GitHub. + +Clicking the "Create a new GitHub repository" button opens the [Create repository dialog](#create-repository-dialog). + +#### ...existing dotcom repository + +_Scenario:_ A user wishes to contribute to a project that exists on GitHub, but does not yet have a clone on their local machine. Perhaps a friend or co-worker created the repository and they wish to collaborate, or they're working on a personal project on a different machine, or there is an open-source repository they wish to contribute to. + +Clicking the "Clone an existing GitHub repository" button opens the [Clone repository dialog](#clone-repository-dialog). + +### Local repository, uninitialized + +We detect this state when the active repository is empty, meaning the current project root has no Git repository. + +local-uninitialized + +#### ...no dotcom repository + +_Scenario:_ A user has begun a project locally and now wishes to put it under version control and share it on GitHub. + +Clicking the "Publish GitHub repository" button opens the [Publish repository dialog](#publish-repository-dialog). + +### Local repository, initialized, no dotcom remotes + +We detect this state when the active repository is present but has no dotcom remotes. + +github tab, local repository with no GitHub remotes + +#### ...no dotcom repository + +_Scenario:_ A user has begun a project locally and now wishes to share it on GitHub. + +Clicking the "Publish on GitHub" button opens the [Publish repository dialog](#publish-repository-dialog). + +### Local repository, initialized, dotcom remotes + +This is the state we handle now: when an active repository is present and has one or more dotcom remotes. + +## Clone repository dialog + +The clone repository dialog begins in search mode. As you type within the text input, once more than three characters have been entered, repositories on GitHub matching the entered text appear in the result list below. Repositories may be identified by full clone URL, `owner/name` pair, or a unique substring of `owner/name`. + +clone dialog, empty search + +clone dialog, search results + +### GitHub clone mode + +Clicking on an entry in the search result list or entering the full clone URL of a GitHub repository changes the dialog to "GitHub clone" mode: + +clone dialog, GitHub mode + +Clicking the "advanced" arrow expands controls to customize cloning protocol and the created local remote name. + +clone dialog, GitHub mode, advanced section expanded + +The "protocol" toggle is initialized to match the value of the `github.preferredRemoteProtocol` config setting. If the protocol is changed, the setting is changed to match. + +### Non-GitHub clone mode + +Entering the full clone URL of a non-GitHub repository changes the dialog to "non-GitHub clone" mode. Clicking the "advanced" arrow expands controls to customize the created local remote name. (The cloning protocol is inferred from the source URL.) + +clone dialog, non-GitHub mode + +### Common behavior + +The "source remote name" input is pre-populated with the value of the Atom setting `github.cloneSourceRemoteName`. If it's changed to be empty, or to contain characters that are not valid in a git remote name, an error message is shown. + +The clone destination path is pre-populated with the directory specified as `core.projectHome` in the user's Atom settings joined with the repository name. If the destination directory already exists and is nonempty, or is not writable by the current user, the path is considered invalid and an error message is shown. Clicking the button to the right of the destination path text field opens a system directory selection or creation dialog that populates the clone destination path with on accept. + +The "Clone" button is enabled when: + +* A clone source is uniquely identified, by GitHub `name/owner` or git URL; +* The "source remote name" input is populated with a valid git remote name; +* A valid path is entered within the clone destination path input. + +Clicking the "Clone" button: + +* Clones the repository from the chosen clone source to the clone destination path. +* Adds the clone destination path as a project root. +* Ensures that the clone destination is the active GitHub package context. +* Closes the "Clone repository" dialog. + +## Create repository dialog + +create dialog + +The "owner" drop-down is populated with the user's account name and the list of organizations to which the authenticated user belongs. Organizations to which the user has insufficient permissions to create repositories are disabled with an explanatory suffix. + +The "repository name" field is initially empty and focused. As the user types, an error message appears if a repository with the chosen name and owner already exists. + +The clone destination path is pre-populated with the directory specified as `core.projectHome` in the user's Atom settings joined with the repository name. If the destination directory already exists and is nonempty, or is unwritable by the current user, the path is considered invalid and an error message is shown. Clicking the button to the right of the destination path text field opens a system directory selection or creation dialog that populates the clone destination path with on accept. + +Clicking the "advanced" arrow expands controls to customize cloning protocol and the created local remote name. The "source remote name" input is pre-populated with the value of the Atom setting `github.cloneSourceRemoteName`. If it's changed to be empty, or to contain characters that are not valid in a git remote name, an error message is shown. + +Clicking the "Create" button: + +* Creates a repository on GitHub with the chosen owner and name. +* Clones the newly created repository to the clone destination path with its source remote set to the source remote name. +* Adds the clone destination path as a project root. +* Ensures that the clone destination path is the active GitHub package context. +* Closes the "Create repository" dialog. + +## Publish repository dialog + +publish dialog + +The major difference between this dialog and the [Create repository dialog](#create-repository-dialog) is that the local repository's path is displayed in a read-only input field and the directory selection button is disabled. + +* The "source remote" field is invalid if a remote with the given name is already present in the local repository. + +Clicking the "Publish" button also behaves slightly differently from the "Create" button: + +* Initializes a git repository in the local repository path if it is not already a git repository. +* Creates a repository on GitHub with the chosen owner and name. +* Adds a remote with the specified "source remote name" and sets it to the clone URL of the newly created repository, respecting the https/ssh toggle. +* If a branch called `master` is present in the local repository, its push and fetch upstreams are configured to be the source remote. +* The local repository path is added as a project root if it is not already present. +* Ensures that the clone destination path is the active GitHub package context. +* Closes the "Publish repository" dialog. + +## Improved branch publish behavior + +If a remote is present in the current repository with a name matching the setting `github.cloneSourceRemoteName`, both clicking "publish" in the push-pull status bar tile and clicking a "publish ..." button in the GitHub tab push HEAD to the clone source remote instead of `origin`, even if the "chosen" remote differs. + +If a multiple remotes are present in the current repository, and one is present with a name matching the setting `github.upstreamRemoteName` that has a recognized GitHub URL, it will be preferred as the default remote by the `GitTabContainer` component. Otherwise, if one is present with a name matching the setting `github.cloneSourceRemoteName` and a GitHub URL, that one will be used. Finally we'll fall back to our existing `RemoveSelectorView` menu. + +When multiple remotes are present in the current repository and the push-pull status bar tile is in its "publish" state, the push-pull status bar tile's context menu includes a separate "Push" entry for each available remote. + +**_Part 2 - Additional information_** + +## :anchor: Drawbacks + +Modal dialogs are disruptive to UX flow. You can't start creating a repository, have another thought and make a quick edit, then come back to it. This design uses a lot of them. + +The "Create repository" flow is missing some of the functionality that the dotcom page has, like initializing a README and a license. We can make _some_ things nicer with the local context we have to work with - like guessing a repository name from the project directory - but we'd be unlikely to keep up with what's available on dotcom. + +There is no "create repository" mutation available in the GraphQL API, so we'll need to use the REST API for that. + +Some users don't use GitHub, but have remotes hosted elsewhere. We want to avoid being too invasive and annoying these users with prompts that will never apply to them. + +## :thinking: Rationale and alternatives + +We could open dotcom for repository creation, but then we would have no way to smoothly clone or connect the created repository. + +## :question: Unresolved questions + +* Are there better ways to intelligently identify which remotes should be used to push branches and which should be queried for pull requests? +* Are there different, common upstream-and-fork remote setups that these dialogs will support poorly? +* Is the language used in these dialogs and controls familiar enough to git newcomers? + +## :warning: Out of Scope + +This effort should not include: + +* GitHub enterprise support. ( :sad: ) We have separate issues ([#270](https://github.com/atom/github/issues/270), [#919](https://github.com/atom/github/issues/919)) to track that, although this does complicate its eventual implementation, because the clone and create dialogs need to be Enterprise-aware. +* Workflows related to fork creation and management. +* General remote management ([#555](https://github.com/atom/github/issues/555)). + +## :construction: Implementation phases + +_TODO_ + +## :white_check_mark: Feature description for Atom release blog post + +_TODO_ diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 0000000000..714e565367 --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,46 @@ +# Installation + +The GitHub package is bundled as a core package within Atom. This means that you don't have to install it separately - download Atom from [the website](https://atom.io) and it's included automatically. This carries a number of benefits. For example, because it's included in the [v8 snapshot](https://flight-manual.atom.io/behind-atom/sections/how-atom-uses-chromium-snapshots/) produced during each Atom build, it boots extremely quickly and pays very little penalty for things like requiring and bootstrapping React. + +However! The downside of this is that it can take a while for new work in this repository to make its way into your editor. Here's the full lifecycle of a change: + +1. First, the change is done via a pull request to this repository. When it's ready and has full, passing test coverage, it's merged into the default branch. +2. Periodically, we tag and publish batches of changes as new versions to [apm](https://atom.io/packages/github). Typically, this is done after a major bugfix or new feature is merged, or after merging a security-related dependency update. +3. Next, we send a pull request to [the core atom repository](https://github.com/atom/atom) to bump the versions of the GitHub package dependency in its `package.json` and `package-lock.json` files. When that pull request has a green build, we merge it. +4. The next night that the [Atom core nightly build](https://github.visualstudio.com/Atom/_build?definitionId=1) is successful, the new package version is released to the [Atom nightly channel](https://atom.io/nightly). +5. The core Atom team regularly "rolls the railcars" to tag new release. The first time that this happens after the GitHub package dependency bump is merged, it will be included on the next release of the [Atom beta channel](https://atom.io/beta). +6. The next time that the core Atom team "rolls the railcars" after that, the new GitHub package version is shipped to [Atom stable](https://atom.io/). :rocket: :tada: + +Depending on the timing, all of this can take a month and a half to two months, so when you see a pull request get merged and your issue closed, you might think you're out of luck and you'll just have to wait... but, you have a few other options here. + +## Use a non-stable Atom channel + +Instead of living at the end of the line way out on stable, you could switch to the beta or nightly channels of Atom releases. + +* The [beta channel](https://atom.io/beta) updates a little more frequently than the stable channel, but it's about a month ahead. This means that you'll have access to GitHub package work as soon as the next time the railcars are rolled (step 5 up above) - about a month sooner than you would if you stayed on stable. +* The [nightly channel](https://atom.io/nightly) is updated about daily with the latest and greatest Atom build, including everything that was merged into Atom core up to that point. If you use the nightly channel, you'll have access to GitHub package work as soon as it's published in a release and merged into Atom core (step 4 up above). + +### Benefits + +By using a "fresher" Atom channel, you'll have access to features and bug-fixes much sooner than you will if you use a stable build. Despite the names, our beta and nightly channels are pretty stable... I've (@smashwilson) personally been using a nightly build for my day to day editing for years now. + +What's more, if you _do_ experience a serious regression - with the GitHub package or any other core behavior - you can: + +* File an issue to let us know, then: +* Switch to the next channel (from nightly to beta, or beta to stable). + +That gives us a chance to respond to the issue, determine if it's serious enough to warrant delaying a release for if we can't fix it in time, and could prevent an order of magnitude more users from encountering the same problem... _and_ gives you a route to _immediately_ revert to an Atom version that unblocks you! + +## Live on the edge + +If you're using nightly builds, you can have access to fixes and improvements (often) within a few weeks to a month. But, it can take me some time to tag releases and get them into Atom core sometimes. If you're really can't wait, and you want to live on the very, very edge, you can run the absolute latest code as soon as it's merged. + +1. First, install Atom's build requirements. You don't have to clone, bootstrap and build all of Atom to do this - just install the packages and dependencies listed in the "Building" section on [the flight manual documentation](https://flight-manual.atom.io/hacking-atom/sections/hacking-on-atom-core/) for your operating system. +2. Second, run the following command at your terminal or command line prompt: + ``` + apm install atom/github + ``` + +Now you'll be running everything as soon as it's merged... and `apm` will automatically keep it that way, as we merge more work! + +:warning: Be aware! Using this method _will_ have noticeably degrade Atom's startup time. It's especially impactful the first time you launch Atom after each update, because Atom will be transpiling all of the package source. After that, you'll essentially be missing out on the benefits of having it included in the v8 snapshot. diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md new file mode 100644 index 0000000000..ea3ce1e004 --- /dev/null +++ b/docs/troubleshooting.md @@ -0,0 +1,27 @@ +# Troubleshooting guide + +So, you're having a problem with this package, and you're not sure what's going on. Here are a few tools that you can use to collect more information on your problem to help us help you faster. + +The more debugging information you can provide, the easier it will be for us to figure out what's going on, even if your problem is triggered by some configuration or local state on your machine... and the more likely it will be that we'll be able to help you out. + +## Atom debugging guide + +Be sure to look over the [Atom debugging guide](https://flight-manual.atom.io/hacking-atom/sections/debugging/), as everything written there also applies here. + +Take special note of the [section on the developer tools](https://flight-manual.atom.io/hacking-atom/sections/debugging/#check-for-errors-in-the-developer-tools). Any time that the package "crashes" (git and GitHub status bar buttons vanish, tabs go blank, commands are no longer present in the command palette) there's almost certainly a stack trace waiting for you in the developer tools. Copy and paste that into your issue within a triple-backtick code block and it will give us worlds more information about what's going on. For many problems, having a stack trace to work with almost single-handedly makes the difference between us not being able to do anything and us being able to land a fix. + +## Git diagnostics + +If your problem is related to specific git operations or interactions - like problems committing, pushing, or fetching - then it can be very helpful to collect git command diagnostics. + +To enable git diagnostic collection: + +* Open your [Settings tab](https://flight-manual.atom.io/getting-started/sections/atom-basics/#settings-and-preferences). +* Navigate to the "Packages" section on the lefthand side. +* Search for "github" in the search box. +* Click "settings" on the "github" package result. +* Check the checkbox labelled "Git diagnostics". + +Now, reproduce your problem. Every git command that's executed by this package will be logged to the developer console, including input, stdout and stderr, and exit codes, with full verbose tracing. Expand the collapsed sections corresponding to the relevant commands and copy-and-paste the results in your issue. + +:warning: While the git logging will elide things like passphrases for you, you may wish to manually remove references to usernames, paths, or repository URLs if you wish, for privacy reasons. diff --git a/graphql/schema.graphql b/graphql/schema.graphql index d69efddd8c..b91ce825c2 100644 --- a/graphql/schema.graphql +++ b/graphql/schema.graphql @@ -42,21 +42,6 @@ type AcceptTopicSuggestionPayload { topic: Topic } -"""The possible capabilities for action executions setting.""" -enum ActionExecutionCapabilitySetting { - """All action executions are disabled.""" - DISABLED - - """All action executions are enabled.""" - ALL_ACTIONS - - """Only actions defined within the repo are allowed.""" - LOCAL_ACTIONS_ONLY - - """Organization administrators action execution capabilities.""" - NO_POLICY -} - """ Represents an object which can take actions on GitHub. Typically a User or Bot. """ @@ -232,8 +217,11 @@ type AddProjectColumnPayload { """Autogenerated input type of AddPullRequestReviewComment""" input AddPullRequestReviewCommentInput { + """The node ID of the pull request reviewing""" + pullRequestId: ID + """The Node ID of the review to modify.""" - pullRequestReviewId: ID! + pullRequestReviewId: ID """The SHA of the commit to comment on.""" commitOID: GitObjectID @@ -283,6 +271,9 @@ input AddPullRequestReviewInput { """The review line comments.""" comments: [DraftPullRequestReviewComment] + """The review line comment threads.""" + threads: [DraftPullRequestReviewThread] + """A unique identifier for the client performing the mutation.""" clientMutationId: String } @@ -299,6 +290,49 @@ type AddPullRequestReviewPayload { reviewEdge: PullRequestReviewEdge } +"""Autogenerated input type of AddPullRequestReviewThread""" +input AddPullRequestReviewThreadInput { + """Path to the file being commented on.""" + path: String! + + """Body of the thread's first comment.""" + body: String! + + """The node ID of the pull request reviewing""" + pullRequestId: ID + + """The Node ID of the review to modify.""" + pullRequestReviewId: ID + + """ + The line of the blob to which the thread refers. The end of the line range for multi-line comments. + """ + line: Int! + + """ + The side of the diff on which the line resides. For multi-line comments, this is the side for the end of the line range. + """ + side: DiffSide = RIGHT + + """The first line of the range to which the comment refers.""" + startLine: Int + + """The side of the diff on which the start line resides.""" + startSide: DiffSide = RIGHT + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated return type of AddPullRequestReviewThread""" +type AddPullRequestReviewThreadPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The newly created thread.""" + thread: PullRequestReviewThread +} + """Autogenerated input type of AddReaction""" input AddReactionInput { """The Node ID of the subject to modify.""" @@ -375,13 +409,22 @@ type App implements Node { url: URI! } -"""An edge in a connection.""" -type AppEdge { - """A cursor for use in pagination.""" - cursor: String! +"""Autogenerated input type of ArchiveRepository""" +input ArchiveRepositoryInput { + """The ID of the repository to mark as archived.""" + repositoryId: ID! - """The item at the end of the edge.""" - node: App + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated return type of ArchiveRepository""" +type ArchiveRepositoryPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The repository that was marked as archived.""" + repository: Repository } """An object that can have users assigned to it.""" @@ -485,6 +528,48 @@ enum AuditLogOrderField { CREATED_AT } +""" +Represents a 'automatic_base_change_failed' event on a given pull request. +""" +type AutomaticBaseChangeFailedEvent implements Node { + """Identifies the actor who performed the event.""" + actor: Actor + + """Identifies the date and time when the object was created.""" + createdAt: DateTime! + id: ID! + + """The new base for this PR""" + newBase: String! + + """The old base for this PR""" + oldBase: String! + + """PullRequest referenced by event.""" + pullRequest: PullRequest! +} + +""" +Represents a 'automatic_base_change_succeeded' event on a given pull request. +""" +type AutomaticBaseChangeSucceededEvent implements Node { + """Identifies the actor who performed the event.""" + actor: Actor + + """Identifies the date and time when the object was created.""" + createdAt: DateTime! + id: ID! + + """The new base for this PR""" + newBase: String! + + """The old base for this PR""" + oldBase: String! + + """PullRequest referenced by event.""" + pullRequest: PullRequest! +} + """ Represents a 'base_ref_changed' event on a given issue or pull request. """ @@ -495,9 +580,40 @@ type BaseRefChangedEvent implements Node { """Identifies the date and time when the object was created.""" createdAt: DateTime! + """ + Identifies the name of the base ref for the pull request after it was changed. + """ + currentRefName: String! + """Identifies the primary key from the database.""" databaseId: Int id: ID! + + """ + Identifies the name of the base ref for the pull request before it was changed. + """ + previousRefName: String! + + """PullRequest referenced by event.""" + pullRequest: PullRequest! +} + +"""Represents a 'base_ref_deleted' event on a given pull request.""" +type BaseRefDeletedEvent implements Node { + """Identifies the actor who performed the event.""" + actor: Actor + + """ + Identifies the name of the Ref associated with the `base_ref_deleted` event. + """ + baseRefName: String + + """Identifies the date and time when the object was created.""" + createdAt: DateTime! + id: ID! + + """PullRequest referenced by event.""" + pullRequest: PullRequest } """Represents a 'base_ref_force_pushed' event on a given pull request.""" @@ -567,8 +683,10 @@ type Blob implements Node & GitObject { commitUrl: URI! id: ID! - """Indicates whether the Blob is binary or text""" - isBinary: Boolean! + """ + Indicates whether the Blob is binary or text. Returns null if unable to determine the encoding. + """ + isBinary: Boolean """Indicates whether the contents is truncated""" isTruncated: Boolean! @@ -613,6 +731,12 @@ type Bot implements Node & Actor & UniformResourceLocatable { """A branch protection rule.""" type BranchProtectionRule implements Node { + """Can this branch be deleted.""" + allowsDeletions: Boolean! + + """Are force pushes allowed on this branch.""" + allowsForcePushes: Boolean! + """ A list of conflicts matching branches protection rule and other branch protection rules """ @@ -649,6 +773,9 @@ type BranchProtectionRule implements Node { """Repository refs that are protected by this rule""" matchingRefs( + """Filters refs with query on name""" + query: String + """Returns the elements in the list that come after the specified cursor.""" after: String @@ -704,6 +831,9 @@ type BranchProtectionRule implements Node { """Are commits required to be signed.""" requiresCommitSignatures: Boolean! + """Are merge commits prohibited from being pushed to this branch.""" + requiresLinearHistory: Boolean! + """Are status checks required to update matching branches.""" requiresStatusChecks: Boolean! @@ -990,6 +1120,17 @@ enum CheckConclusionState { """The check suite or run was neutral.""" NEUTRAL + + """The check suite or run was skipped.""" + SKIPPED + + """The check suite or run has failed at startup.""" + STARTUP_FAILURE + + """ + The check suite or run was marked stale by GitHub. Only GitHub can use this conclusion. + """ + STALE } """A check run.""" @@ -1379,6 +1520,12 @@ input CloneTemplateRepositoryInput { """Indicates the repository's visibility level.""" visibility: RepositoryVisibility! + """ + Whether to copy all branches from the template to the new repository. Defaults + to copying only the default branch of the template. + """ + includeAllBranches: Boolean = false + """A unique identifier for the client performing the mutation.""" clientMutationId: String } @@ -1497,9 +1644,6 @@ enum CollaboratorAffiliation { ALL } -"""Types that can be inside Collection Items.""" -union CollectionItemContent = Repository | Organization | User - """Represents a comment.""" interface Comment { """The actor who authored the comment.""" @@ -1570,6 +1714,9 @@ enum CommentAuthorAssociation { """Author is the owner of the repository.""" OWNER + """Author is a placeholder for an unclaimed user.""" + MANNEQUIN + """Author has been invited to collaborate on the repository.""" COLLABORATOR @@ -1622,6 +1769,9 @@ type CommentDeletedEvent implements Node { """Identifies the primary key from the database.""" databaseId: Int + + """The user who authored the deleted comment.""" + deletedCommentAuthor: Actor id: ID! } @@ -1662,6 +1812,27 @@ type Commit implements Node & GitObject & Subscribable & UniformResourceLocatabl """The datetime when this commit was authored.""" authoredDate: DateTime! + """ + The list of authors for this commit based on the git author and the Co-authored-by + message trailer. The git author will always be first. + + """ + authors( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the first _n_ elements from the list.""" + first: Int + + """Returns the last _n_ elements from the list.""" + last: Int + ): GitActorConnection! + """Fetches `git blame` information.""" blame( """The file whose Git blame information you want.""" @@ -1749,6 +1920,12 @@ type Commit implements Node & GitObject & Subscribable & UniformResourceLocatabl last: Int ): DeploymentConnection + """The tree entry representing the file located at the given path.""" + file( + """The path for the file""" + path: String! + ): TreeEntry + """ The linear commit history starting from (and including) this commit, in the same order as `git log`. """ @@ -1803,6 +1980,9 @@ type Commit implements Node & GitObject & Subscribable & UniformResourceLocatabl """The Git object ID""" oid: GitObjectID! + """The organization this commit was made on behalf of.""" + onBehalfOf: Organization + """The parents of a commit.""" parents( """Returns the elements in the list that come after the specified cursor.""" @@ -1835,6 +2015,28 @@ type Commit implements Node & GitObject & Subscribable & UniformResourceLocatabl """Status information for this commit""" status: Status + """Check and Status rollup information for this commit.""" + statusCheckRollup: StatusCheckRollup + + """ + Returns a list of all submodules in this repository as of this Commit parsed from the .gitmodules file. + """ + submodules( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the first _n_ elements from the list.""" + first: Int + + """Returns the last _n_ elements from the list.""" + last: Int + ): SubmoduleConnection! + """ Returns a URL to download a tarball archive for a repository. Note: For private repositories, these links are temporary and expire after five minutes. @@ -1885,7 +2087,7 @@ input CommitAuthor { } """Represents a comment on a given Commit.""" -type CommitComment implements Node & Comment & Deletable & Updatable & UpdatableComment & Reactable & RepositoryNode { +type CommitComment implements Node & Comment & Deletable & Minimizable & Updatable & UpdatableComment & Reactable & RepositoryNode { """The actor who authored the comment.""" author: Actor @@ -2168,32 +2370,23 @@ type CommitHistoryConnection { totalCount: Int! } -"""A content attachment""" -type ContentAttachment { - """ - The body text of the content attachment. This parameter supports markdown. - """ - body: String! - - """The content reference that the content attachment is attached to.""" - contentReference: ContentReference! +"""Represents a 'connected' event on a given issue or pull request.""" +type ConnectedEvent implements Node { + """Identifies the actor who performed the event.""" + actor: Actor - """Identifies the primary key from the database.""" - databaseId: Int! + """Identifies the date and time when the object was created.""" + createdAt: DateTime! id: ID! - """The title of the content attachment.""" - title: String! -} + """Reference originated in a different repository.""" + isCrossRepository: Boolean! -"""A content reference""" -type ContentReference { - """Identifies the primary key from the database.""" - databaseId: Int! - id: ID! + """Issue or pull request that made the reference.""" + source: ReferencedSubject! - """The reference of the content reference.""" - reference: String! + """Issue or pull request which was connected.""" + subject: ReferencedSubject! } """ @@ -2291,26 +2484,10 @@ type ContributionCalendarWeek { """Ordering options for contribution connections.""" input ContributionOrder { - """ - The field by which to order contributions. - - **Upcoming Change on 2019-10-01 UTC** - **Description:** `field` will be removed. Only one order field is supported. - **Reason:** `field` will be removed. - - """ - field: ContributionOrderField - """The ordering direction.""" direction: OrderDirection! } -"""Properties by which contribution connections can be ordered.""" -enum ContributionOrderField { - """Order contributions by when they were made.""" - OCCURRED_AT -} - """ A contributions collection aggregates contributions such as opened issues and commits created by a user. """ @@ -2409,7 +2586,7 @@ type ContributionsCollection { excludePopular: Boolean = false """Ordering options for contributions returned from the connection.""" - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + orderBy: ContributionOrder = {direction: DESC} ): CreatedIssueContributionConnection! """Issue contributions made by the user, grouped by repository.""" @@ -2489,7 +2666,7 @@ type ContributionsCollection { excludePopular: Boolean = false """Ordering options for contributions returned from the connection.""" - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + orderBy: ContributionOrder = {direction: DESC} ): CreatedPullRequestContributionConnection! """Pull request contributions made by the user, grouped by repository.""" @@ -2523,7 +2700,7 @@ type ContributionsCollection { last: Int """Ordering options for contributions returned from the connection.""" - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + orderBy: ContributionOrder = {direction: DESC} ): CreatedPullRequestReviewContributionConnection! """ @@ -2556,7 +2733,7 @@ type ContributionsCollection { excludeFirst: Boolean = false """Ordering options for contributions returned from the connection.""" - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + orderBy: ContributionOrder = {direction: DESC} ): CreatedRepositoryContributionConnection! """ @@ -2674,6 +2851,25 @@ type ConvertProjectCardNoteToIssuePayload { projectCard: ProjectCard } +"""Represents a 'convert_to_draft' event on a given pull request.""" +type ConvertToDraftEvent implements Node & UniformResourceLocatable { + """Identifies the actor who performed the event.""" + actor: Actor + + """Identifies the date and time when the object was created.""" + createdAt: DateTime! + id: ID! + + """PullRequest referenced by event.""" + pullRequest: PullRequest! + + """The HTTP path for this convert to draft event.""" + resourcePath: URI! + + """The HTTP URL for this convert to draft event.""" + url: URI! +} + """Autogenerated input type of CreateBranchProtectionRule""" input CreateBranchProtectionRuleInput { """ @@ -2693,6 +2889,15 @@ input CreateBranchProtectionRuleInput { """Are commits required to be signed.""" requiresCommitSignatures: Boolean + """Are merge commits prohibited from being pushed to this branch.""" + requiresLinearHistory: Boolean + + """Are force pushes allowed on this branch.""" + allowsForcePushes: Boolean + + """Can this branch be deleted.""" + allowsDeletions: Boolean + """Can admins overwrite branch protection.""" isAdminEnforced: Boolean @@ -2815,21 +3020,6 @@ type CreateCheckSuitePayload { clientMutationId: String } -"""Autogenerated input type of CreateContentAttachment""" -input CreateContentAttachmentInput { - """The node ID of the content_reference.""" - contentReferenceId: ID! - - """The title of the content attachment.""" - title: String! - - """The body of the content attachment, which may contain markdown.""" - body: String! - - """A unique identifier for the client performing the mutation.""" - clientMutationId: String -} - """Represents the contribution a user made by committing to a repository.""" type CreatedCommitContribution implements Contribution { """How many commits were made on this day to this repository by the user.""" @@ -3161,6 +3351,35 @@ type CreateEnterpriseOrganizationPayload { organization: Organization } +"""Autogenerated input type of CreateIpAllowListEntry""" +input CreateIpAllowListEntryInput { + """The ID of the owner for which to create the new IP allow list entry.""" + ownerId: ID! + + """An IP address or range of addresses in CIDR notation.""" + allowListValue: String! + + """An optional name for the IP allow list entry.""" + name: String + + """ + Whether the IP allow list entry is active when an IP allow list is enabled. + """ + isActive: Boolean! + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated return type of CreateIpAllowListEntry""" +type CreateIpAllowListEntryPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The IP allow list entry that was created.""" + ipAllowListEntry: IpAllowListEntry +} + """Autogenerated input type of CreateIssue""" input CreateIssueInput { """The Node ID of the repository.""" @@ -3184,6 +3403,11 @@ input CreateIssueInput { """An array of Node IDs for projects associated with this issue.""" projectIds: [ID!] + """ + The name of an issue template in the repository, assigns labels and assignees from the template to the issue + """ + issueTemplate: String + """A unique identifier for the client performing the mutation.""" clientMutationId: String } @@ -3258,6 +3482,9 @@ input CreatePullRequestInput { """Indicates whether maintainers can modify the pull request.""" maintainerCanModify: Boolean = true + """Indicates whether this pull request should be a draft.""" + draft: Boolean = false + """A unique identifier for the client performing the mutation.""" clientMutationId: String } @@ -3494,6 +3721,39 @@ type DeleteBranchProtectionRulePayload { clientMutationId: String } +"""Autogenerated input type of DeleteDeployment""" +input DeleteDeploymentInput { + """The Node ID of the deployment to be deleted.""" + id: ID! + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated return type of DeleteDeployment""" +type DeleteDeploymentPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated input type of DeleteIpAllowListEntry""" +input DeleteIpAllowListEntryInput { + """The ID of the IP allow list entry to delete.""" + ipAllowListEntryId: ID! + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated return type of DeleteIpAllowListEntry""" +type DeleteIpAllowListEntryPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The IP allow list entry that was deleted.""" + ipAllowListEntry: IpAllowListEntry +} + """Autogenerated input type of DeleteIssueComment""" input DeleteIssueCommentInput { """The ID of the comment to delete.""" @@ -3527,15 +3787,6 @@ type DeleteIssuePayload { repository: Repository } -"""Autogenerated input type of DeletePackageVersion""" -input DeletePackageVersionInput { - """The ID of the package version to be deleted.""" - packageVersionId: ID! - - """A unique identifier for the client performing the mutation.""" - clientMutationId: String -} - """Autogenerated input type of DeleteProjectCard""" input DeleteProjectCardInput { """The id of the card to delete.""" @@ -3774,7 +4025,7 @@ type Deployment implements Node { createdAt: DateTime! """Identifies the actor who triggered the deployment.""" - creator: Actor + creator: Actor! """Identifies the primary key from the database.""" databaseId: Int @@ -3782,13 +4033,19 @@ type Deployment implements Node { """The deployment description.""" description: String - """The environment to which this deployment was made.""" + """The latest environment to which this deployment was made.""" environment: String id: ID! + """The latest environment to which this deployment was made.""" + latestEnvironment: String + """The latest status of this deployment.""" latestStatus: DeploymentStatus + """The original environment to which this deployment was made.""" + originalEnvironment: String + """Extra information that a deployment system might need.""" payload: String @@ -3912,6 +4169,9 @@ enum DeploymentState { """The deployment is in progress.""" IN_PROGRESS + + """The deployment is waiting.""" + WAITING } """Describes the status of a given deployment attempt.""" @@ -3920,7 +4180,7 @@ type DeploymentStatus implements Node { createdAt: DateTime! """Identifies the actor who triggered the deployment.""" - creator: Actor + creator: Actor! """Identifies the deployment associated with status.""" deployment: Deployment! @@ -3990,6 +4250,34 @@ enum DeploymentStatusState { IN_PROGRESS } +"""The possible sides of a diff.""" +enum DiffSide { + """The left side of the diff.""" + LEFT + + """The right side of the diff.""" + RIGHT +} + +"""Represents a 'disconnected' event on a given issue or pull request.""" +type DisconnectedEvent implements Node { + """Identifies the actor who performed the event.""" + actor: Actor + + """Identifies the date and time when the object was created.""" + createdAt: DateTime! + id: ID! + + """Reference originated in a different repository.""" + isCrossRepository: Boolean! + + """Issue or pull request from which the issue was disconnected.""" + source: ReferencedSubject! + + """Issue or pull request which was disconnected.""" + subject: ReferencedSubject! +} + """Autogenerated input type of DismissPullRequestReview""" input DismissPullRequestReviewInput { """The Node ID of the pull request review to modify.""" @@ -4023,6 +4311,33 @@ input DraftPullRequestReviewComment { body: String! } +""" +Specifies a review comment thread to be left with a Pull Request Review. +""" +input DraftPullRequestReviewThread { + """Path to the file being commented on.""" + path: String! + + """ + The line of the blob to which the thread refers. The end of the line range for multi-line comments. + """ + line: Int! + + """ + The side of the diff on which the line resides. For multi-line comments, this is the side for the end of the line range. + """ + side: DiffSide = RIGHT + + """The first line of the range to which the comment refers.""" + startLine: Int + + """The side of the diff on which the start line resides.""" + startSide: DiffSide = RIGHT + + """Body of the comment to leave.""" + body: String! +} + """ An account to manage multiple organizations with consolidated policy and billing. """ @@ -4116,6 +4431,9 @@ type Enterprise implements Node { """The HTTP path for this enterprise.""" resourcePath: URI! + """The URL-friendly identifier for the enterprise.""" + slug: String! + """The HTTP URL for this enterprise.""" url: URI! @@ -4331,15 +4649,6 @@ enum EnterpriseDefaultRepositoryPermissionSettingValue { NONE } -"""An edge in a connection.""" -type EnterpriseEdge { - """A cursor for use in pagination.""" - cursor: String! - - """The item at the end of the edge.""" - node: Enterprise -} - """The possible values for an enabled/disabled enterprise setting.""" enum EnterpriseEnabledDisabledSettingValue { """The setting is enabled for organizations in the enterprise.""" @@ -4414,7 +4723,7 @@ type EnterpriseIdentityProvider implements Node { } """An object that is a member of an enterprise.""" -union EnterpriseMember = User | EnterpriseUserAccount +union EnterpriseMember = EnterpriseUserAccount | User """The connection type for EnterpriseMember.""" type EnterpriseMemberConnection { @@ -4438,9 +4747,6 @@ type EnterpriseMemberEdge { """A cursor for use in pagination.""" cursor: String! - """Whether the user does not have a license for the enterprise.""" - isUnlicensed: Boolean! - """The item at the end of the edge.""" node: EnterpriseMember } @@ -4494,42 +4800,6 @@ enum EnterpriseMembersCanMakePurchasesSettingValue { DISABLED } -""" -The possible values we have for filtering Platform::Objects::User#enterprises. -""" -enum EnterpriseMembershipType { - """ - Returns all enterprises in which the user is a member, admin, or billing manager. - """ - ALL - - """Returns all enterprises in which the user is an admin.""" - ADMIN - - """Returns all enterprises in which the user is a billing manager.""" - BILLING_MANAGER - - """ - Returns all enterprises in which the user is a member of an org that is owned by the enterprise. - """ - ORG_MEMBERSHIP -} - -"""Ordering options for enterprises.""" -input EnterpriseOrder { - """The field to order enterprises by.""" - field: EnterpriseOrderField! - - """The ordering direction.""" - direction: OrderDirection! -} - -"""Properties by which enterprise connections can be ordered.""" -enum EnterpriseOrderField { - """Order enterprises by name""" - NAME -} - """The connection type for Organization.""" type EnterpriseOrganizationMembershipConnection { """A list of edges.""" @@ -4579,11 +4849,6 @@ type EnterpriseOutsideCollaboratorEdge { """A cursor for use in pagination.""" cursor: String! - """ - Whether the outside collaborator does not have a license for the enterprise. - """ - isUnlicensed: Boolean! - """The item at the end of the edge.""" node: User @@ -4610,28 +4875,6 @@ type EnterpriseOutsideCollaboratorEdge { """Enterprise information only visible to enterprise owners.""" type EnterpriseOwnerInfo { - """ - A list of enterprise organizations configured with the provided action execution capabilities setting value. - """ - actionExecutionCapabilitySettingOrganizations( - """Returns the elements in the list that come after the specified cursor.""" - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - - """Returns the first _n_ elements from the list.""" - first: Int - - """Returns the last _n_ elements from the list.""" - last: Int - - """Ordering options for organizations with this setting.""" - orderBy: OrganizationOrder = {field: LOGIN, direction: ASC} - ): OrganizationConnection! - """A list of all of the administrators for this enterprise.""" admins( """The search string to look for.""" @@ -4767,6 +5010,33 @@ type EnterpriseOwnerInfo { orderBy: EnterpriseServerInstallationOrder = {field: HOST_NAME, direction: ASC} ): EnterpriseServerInstallationConnection! + """ + The setting value for whether the enterprise has an IP allow list enabled. + """ + ipAllowListEnabledSetting: IpAllowListEnabledSettingValue! + + """ + The IP addresses that are allowed to access resources owned by the enterprise. + """ + ipAllowListEntries( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the first _n_ elements from the list.""" + first: Int + + """Returns the last _n_ elements from the list.""" + last: Int + + """Ordering options for IP allow list entries returned.""" + orderBy: IpAllowListEntryOrder = {field: ALLOW_LIST_VALUE, direction: ASC} + ): IpAllowListEntryConnection! + """ Whether or not the default repository permission is currently being updated. """ @@ -5100,16 +5370,16 @@ type EnterpriseOwnerInfo { ): EnterpriseAdministratorInvitationConnection! """ - A list of pending collaborators across the repositories in the enterprise. + A list of pending collaborator invitations across the repositories in the enterprise. """ - pendingCollaborators( + pendingCollaboratorInvitations( """The search string to look for.""" query: String """ Ordering options for pending repository collaborator invitations returned from the connection. """ - orderBy: RepositoryInvitationOrder = {field: INVITEE_LOGIN, direction: ASC} + orderBy: RepositoryInvitationOrder = {field: CREATED_AT, direction: DESC} """Returns the elements in the list that come after the specified cursor.""" after: String @@ -5124,7 +5394,7 @@ type EnterpriseOwnerInfo { """Returns the last _n_ elements from the list.""" last: Int - ): EnterprisePendingCollaboratorConnection! + ): RepositoryInvitationConnection! """ A list of pending member invitations for organizations in the enterprise. @@ -5289,11 +5559,6 @@ type EnterprisePendingCollaboratorEdge { """A cursor for use in pagination.""" cursor: String! - """ - Whether the invited collaborator does not have a license for the enterprise. - """ - isUnlicensed: Boolean! - """The item at the end of the edge.""" node: User @@ -5341,9 +5606,6 @@ type EnterprisePendingMemberInvitationEdge { """A cursor for use in pagination.""" cursor: String! - """Whether the invitation has a license for the enterprise.""" - isUnlicensed: Boolean! - """The item at the end of the edge.""" node: OrganizationInvitation } @@ -5794,13 +6056,13 @@ type EnterpriseUserAccount implements Node & Actor { last: Int ): EnterpriseOrganizationMembershipConnection! - """The HTTP path for this actor.""" + """The HTTP path for this user.""" resourcePath: URI! """Identifies the date and time when the object was last updated.""" updatedAt: DateTime! - """The HTTP URL for this actor.""" + """The HTTP URL for this user.""" url: URI! """The user within the enterprise.""" @@ -5896,16 +6158,55 @@ type ExternalIdentityEdge { """SAML attributes for the External Identity""" type ExternalIdentitySamlAttributes { + """The emails associated with the SAML identity""" + emails: [UserEmailMetadata!] + + """Family name of the SAML identity""" + familyName: String + + """Given name of the SAML identity""" + givenName: String + + """The groups linked to this identity in IDP""" + groups: [String!] + """The NameID of the SAML identity""" nameId: String + + """The userName of the SAML identity""" + username: String } """SCIM attributes for the External Identity""" type ExternalIdentityScimAttributes { + """The emails associated with the SCIM identity""" + emails: [UserEmailMetadata!] + + """Family name of the SCIM identity""" + familyName: String + + """Given name of the SCIM identity""" + givenName: String + + """The groups linked to this identity in IDP""" + groups: [String!] + """The userName of the SCIM identity""" username: String } +"""The possible viewed states of a file .""" +enum FileViewedState { + """The file has new changes since last viewed.""" + DISMISSED + + """The file has been marked as viewed.""" + VIEWED + + """The file has not been marked as viewed.""" + UNVIEWED +} + """The connection type for User.""" type FollowerConnection { """A list of edges.""" @@ -5954,6 +6255,48 @@ type FollowUserPayload { user: User } +"""A funding platform link for a repository.""" +type FundingLink { + """The funding platform this link is for.""" + platform: FundingPlatform! + + """The configured URL for this funding link.""" + url: URI! +} + +"""The possible funding platforms for repository funding links.""" +enum FundingPlatform { + """GitHub funding platform.""" + GITHUB + + """Patreon funding platform.""" + PATREON + + """Open Collective funding platform.""" + OPEN_COLLECTIVE + + """Ko-fi funding platform.""" + KO_FI + + """Tidelift funding platform.""" + TIDELIFT + + """Community Bridge funding platform.""" + COMMUNITY_BRIDGE + + """Liberapay funding platform.""" + LIBERAPAY + + """IssueHunt funding platform.""" + ISSUEHUNT + + """Otechie funding platform.""" + OTECHIE + + """Custom funding platform.""" + CUSTOM +} + """A generic hovercard context with a message and icon""" type GenericHovercardContext implements HovercardContext { """A string describing this context""" @@ -6036,6 +6379,12 @@ type Gist implements Node & Starrable & UniformResourceLocatable { """The HTML path to this resource.""" resourcePath: URI! + """ + Returns a count of how many stargazers there are on this object + + """ + stargazerCount: Int! + """A list of users who have starred this starrable.""" stargazers( """Returns the elements in the list that come after the specified cursor.""" @@ -6069,7 +6418,7 @@ type Gist implements Node & Starrable & UniformResourceLocatable { } """Represents a comment on an Gist.""" -type GistComment implements Node & Comment & Deletable & Updatable & UpdatableComment { +type GistComment implements Node & Comment & Deletable & Minimizable & Updatable & UpdatableComment { """The actor who authored the comment.""" author: Actor @@ -6293,6 +6642,30 @@ type GitActor { user: User } +"""The connection type for GitActor.""" +type GitActorConnection { + """A list of edges.""" + edges: [GitActorEdge] + + """A list of nodes.""" + nodes: [GitActor] + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""An edge in a connection.""" +type GitActorEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: GitActor +} + """Represents information about the GitHub instance.""" type GitHubMetadata { """Returns a String that's a SHA of `github-services`""" @@ -6555,27 +6928,6 @@ enum IdentityProviderConfigurationState { UNCONFIGURED } -"""Autogenerated input type of ImportProject""" -input ImportProjectInput { - """The name of the Organization or User to create the Project under.""" - ownerName: String! - - """The name of Project.""" - name: String! - - """The description of Project.""" - body: String - - """Whether the Project is public or not.""" - public: Boolean = false - - """A list of columns containing issues and pull requests.""" - columnImports: [ProjectColumnImport!]! - - """A unique identifier for the client performing the mutation.""" - clientMutationId: String -} - """Autogenerated input type of InviteEnterpriseAdmin""" input InviteEnterpriseAdminInput { """The ID of the enterprise to which you want to invite an administrator.""" @@ -6603,6 +6955,84 @@ type InviteEnterpriseAdminPayload { invitation: EnterpriseAdministratorInvitation } +"""The possible values for the IP allow list enabled setting.""" +enum IpAllowListEnabledSettingValue { + """The setting is enabled for the owner.""" + ENABLED + + """The setting is disabled for the owner.""" + DISABLED +} + +""" +An IP address or range of addresses that is allowed to access an owner's resources. +""" +type IpAllowListEntry implements Node { + """A single IP address or range of IP addresses in CIDR notation.""" + allowListValue: String! + + """Identifies the date and time when the object was created.""" + createdAt: DateTime! + id: ID! + + """Whether the entry is currently active.""" + isActive: Boolean! + + """The name of the IP allow list entry.""" + name: String + + """The owner of the IP allow list entry.""" + owner: IpAllowListOwner! + + """Identifies the date and time when the object was last updated.""" + updatedAt: DateTime! +} + +"""The connection type for IpAllowListEntry.""" +type IpAllowListEntryConnection { + """A list of edges.""" + edges: [IpAllowListEntryEdge] + + """A list of nodes.""" + nodes: [IpAllowListEntry] + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""An edge in a connection.""" +type IpAllowListEntryEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: IpAllowListEntry +} + +"""Ordering options for IP allow list entry connections.""" +input IpAllowListEntryOrder { + """The field to order IP allow list entries by.""" + field: IpAllowListEntryOrderField! + + """The ordering direction.""" + direction: OrderDirection! +} + +"""Properties by which IP allow list entry connections can be ordered.""" +enum IpAllowListEntryOrderField { + """Order IP allow list entries by creation time.""" + CREATED_AT + + """Order IP allow list entries by the allow list value.""" + ALLOW_LIST_VALUE +} + +"""Types that can own an IP allow list.""" +union IpAllowListOwner = Enterprise | Organization + """ An Issue is a place to discuss ideas, enhancements, tasks, and bugs for a project. """ @@ -6639,9 +7069,15 @@ type Issue implements Node & Assignable & Closable & Comment & Updatable & Updat """The body rendered to HTML.""" bodyHTML: HTML! + """The http path for this issue body""" + bodyResourcePath: URI! + """Identifies the body of the issue rendered to text.""" bodyText: String! + """The http URL for this issue body""" + bodyUrl: URI! + """ `true` if the object is closed (definition of closed may depend on type) """ @@ -6652,6 +7088,9 @@ type Issue implements Node & Assignable & Closable & Comment & Updatable & Updat """A list of comments associated with the Issue.""" comments( + """Ordering options for issue comments returned from the connection.""" + orderBy: IssueCommentOrder + """Returns the elements in the list that come after the specified cursor.""" after: String @@ -6691,8 +7130,14 @@ type Issue implements Node & Assignable & Closable & Comment & Updatable & Updat """ includesCreatedEdit: Boolean! + """Is this issue read by the viewer""" + isReadByViewer: Boolean + """A list of labels associated with the object.""" labels( + """Ordering options for labels returned from the connection.""" + orderBy: LabelOrder = {field: CREATED_AT, direction: ASC} + """Returns the elements in the list that come after the specified cursor.""" after: String @@ -6871,7 +7316,7 @@ type Issue implements Node & Assignable & Closable & Comment & Updatable & Updat } """Represents a comment on an Issue.""" -type IssueComment implements Node & Comment & Deletable & Updatable & UpdatableComment & Reactable & RepositoryNode { +type IssueComment implements Node & Comment & Deletable & Minimizable & Updatable & UpdatableComment & Reactable & RepositoryNode { """The actor who authored the comment.""" author: Actor @@ -7025,6 +7470,21 @@ type IssueCommentEdge { node: IssueComment } +"""Ways in which lists of issue comments can be ordered upon return.""" +input IssueCommentOrder { + """The field in which to order issue comments by.""" + field: IssueCommentOrderField! + + """The direction in which to order issue comments by the specified field.""" + direction: OrderDirection! +} + +"""Properties by which issue comment connections can be ordered.""" +enum IssueCommentOrderField { + """Order issue comments by update time""" + UPDATED_AT +} + """The connection type for Issue.""" type IssueConnection { """A list of edges.""" @@ -7059,7 +7519,7 @@ type IssueContributionsByRepository { last: Int """Ordering options for contributions returned from the connection.""" - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + orderBy: ContributionOrder = {direction: DESC} ): CreatedIssueContributionConnection! """The repository in which the issues were opened.""" @@ -7133,37 +7593,28 @@ enum IssueOrderField { """Used for return value of Repository.issueOrPullRequest.""" union IssueOrPullRequest = Issue | PullRequest -"""An edge in a connection.""" -type IssueOrPullRequestEdge { - """A cursor for use in pagination.""" - cursor: String! +"""The possible states of an issue.""" +enum IssueState { + """An issue that is still open""" + OPEN - """The item at the end of the edge.""" - node: IssueOrPullRequest -} - -"""The possible PubSub channels for an issue.""" -enum IssuePubSubTopic { - """The channel ID for observing issue updates.""" - UPDATED - - """The channel ID for marking an issue as read.""" - MARKASREAD + """An issue that has been closed""" + CLOSED +} - """The channel ID for updating items on the issue timeline.""" - TIMELINE +"""A repository issue template.""" +type IssueTemplate { + """The template purpose.""" + about: String - """The channel ID for observing issue state updates.""" - STATE -} + """The suggested issue body.""" + body: String -"""The possible states of an issue.""" -enum IssueState { - """An issue that is still open""" - OPEN + """The template name.""" + name: String! - """An issue that has been closed""" - CLOSED + """The suggested issue title.""" + title: String } """The connection type for IssueTimelineItem.""" @@ -7182,7 +7633,7 @@ type IssueTimelineConnection { } """An item in an issue timeline""" -union IssueTimelineItem = Commit | IssueComment | CrossReferencedEvent | ClosedEvent | ReopenedEvent | SubscribedEvent | UnsubscribedEvent | ReferencedEvent | AssignedEvent | UnassignedEvent | LabeledEvent | UnlabeledEvent | UserBlockedEvent | MilestonedEvent | DemilestonedEvent | RenamedTitleEvent | LockedEvent | UnlockedEvent | TransferredEvent +union IssueTimelineItem = AssignedEvent | ClosedEvent | Commit | CrossReferencedEvent | DemilestonedEvent | IssueComment | LabeledEvent | LockedEvent | MilestonedEvent | ReferencedEvent | RenamedTitleEvent | ReopenedEvent | SubscribedEvent | TransferredEvent | UnassignedEvent | UnlabeledEvent | UnlockedEvent | UnsubscribedEvent | UserBlockedEvent """An edge in a connection.""" type IssueTimelineItemEdge { @@ -7194,7 +7645,7 @@ type IssueTimelineItemEdge { } """An item in an issue timeline""" -union IssueTimelineItems = IssueComment | CrossReferencedEvent | AddedToProjectEvent | AssignedEvent | ClosedEvent | CommentDeletedEvent | ConvertedNoteToIssueEvent | DemilestonedEvent | LabeledEvent | LockedEvent | MarkedAsDuplicateEvent | MentionedEvent | MilestonedEvent | MovedColumnsInProjectEvent | PinnedEvent | ReferencedEvent | RemovedFromProjectEvent | RenamedTitleEvent | ReopenedEvent | SubscribedEvent | TransferredEvent | UnassignedEvent | UnlabeledEvent | UnlockedEvent | UserBlockedEvent | UnpinnedEvent | UnsubscribedEvent +union IssueTimelineItems = AddedToProjectEvent | AssignedEvent | ClosedEvent | CommentDeletedEvent | ConnectedEvent | ConvertedNoteToIssueEvent | CrossReferencedEvent | DemilestonedEvent | DisconnectedEvent | IssueComment | LabeledEvent | LockedEvent | MarkedAsDuplicateEvent | MentionedEvent | MilestonedEvent | MovedColumnsInProjectEvent | PinnedEvent | ReferencedEvent | RemovedFromProjectEvent | RenamedTitleEvent | ReopenedEvent | SubscribedEvent | TransferredEvent | UnassignedEvent | UnlabeledEvent | UnlockedEvent | UnmarkedAsDuplicateEvent | UnpinnedEvent | UnsubscribedEvent | UserBlockedEvent """The connection type for IssueTimelineItems.""" type IssueTimelineItemsConnection { @@ -7255,6 +7706,9 @@ enum IssueTimelineItemsItemType { """Represents a 'comment_deleted' event on a given issue or pull request.""" COMMENT_DELETED_EVENT + """Represents a 'connected' event on a given issue or pull request.""" + CONNECTED_EVENT + """ Represents a 'converted_note_to_issue' event on a given issue or pull request. """ @@ -7263,6 +7717,9 @@ enum IssueTimelineItemsItemType { """Represents a 'demilestoned' event on a given issue or pull request.""" DEMILESTONED_EVENT + """Represents a 'disconnected' event on a given issue or pull request.""" + DISCONNECTED_EVENT + """Represents a 'labeled' event on a given issue or pull request.""" LABELED_EVENT @@ -7320,6 +7777,11 @@ enum IssueTimelineItemsItemType { """Represents a 'user_blocked' event on a given user.""" USER_BLOCKED_EVENT + """ + Represents an 'unmarked_as_duplicate' event on a given issue or pull request. + """ + UNMARKED_AS_DUPLICATE_EVENT + """Represents an 'unpinned' event on a given issue or pull request.""" UNPINNED_EVENT @@ -7449,6 +7911,9 @@ type Label implements Node { interface Labelable { """A list of labels associated with the object.""" labels( + """Ordering options for labels returned from the connection.""" + orderBy: LabelOrder = {field: CREATED_AT, direction: ASC} + """Returns the elements in the list that come after the specified cursor.""" after: String @@ -7505,6 +7970,24 @@ type LabelEdge { node: Label } +"""Ways in which lists of labels can be ordered upon return.""" +input LabelOrder { + """The field in which to order labels by.""" + field: LabelOrderField! + + """The direction in which to order labels by the specified field.""" + direction: OrderDirection! +} + +"""Properties by which label connections can be ordered.""" +enum LabelOrderField { + """Order labels by name """ + NAME + + """Order labels by creation time""" + CREATED_AT +} + """Represents a given language found in repositories.""" type Language implements Node { """The color defined for the current language.""" @@ -7668,10 +8151,10 @@ type LockedEvent implements Node { """Autogenerated input type of LockLockable""" input LockLockableInput { - """ID of the issue or pull request to be locked.""" + """ID of the item to be locked.""" lockableId: ID! - """A reason for why the issue or pull request will be locked.""" + """A reason for why the item will be locked.""" lockReason: LockReason """A unique identifier for the client performing the mutation.""" @@ -7680,6 +8163,9 @@ input LockLockableInput { """Autogenerated return type of LockLockable""" type LockLockablePayload { + """Identifies the actor who performed the event.""" + actor: Actor + """A unique identifier for the client performing the mutation.""" clientMutationId: String @@ -7748,9 +8234,22 @@ type MarkedAsDuplicateEvent implements Node { """Identifies the actor who performed the event.""" actor: Actor + """ + The authoritative issue or pull request which has been duplicated by another. + """ + canonical: IssueOrPullRequest + """Identifies the date and time when the object was created.""" createdAt: DateTime! + + """ + The issue or pull request which has been marked as a duplicate of another. + """ + duplicate: IssueOrPullRequest id: ID! + + """Canonical and duplicate belong to different repositories.""" + isCrossRepository: Boolean! } """A public description of a Marketplace category.""" @@ -7822,6 +8321,9 @@ type MarketplaceListing implements Node { """Does this listing have a terms of service link?""" hasTermsOfService: Boolean! + """Whether the creator of the app is a verified org""" + hasVerifiedOwner: Boolean! + """A technical description of how this app works with GitHub.""" howItWorks: String @@ -8030,6 +8532,45 @@ type MarketplaceListingEdge { node: MarketplaceListing } +"""Autogenerated input type of MarkFileAsViewed""" +input MarkFileAsViewedInput { + """The Node ID of the pull request.""" + pullRequestId: ID! + + """The path of the file to mark as viewed""" + path: String! + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated return type of MarkFileAsViewed""" +type MarkFileAsViewedPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated pull request.""" + pullRequest: PullRequest +} + +"""Autogenerated input type of MarkPullRequestReadyForReview""" +input MarkPullRequestReadyForReviewInput { + """ID of the pull request to be marked as ready for review.""" + pullRequestId: ID! + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated return type of MarkPullRequestReadyForReview""" +type MarkPullRequestReadyForReviewPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The pull request that is ready for review.""" + pullRequest: PullRequest +} + """Audit log entry for a members_can_delete_repos.clear event.""" type MembersCanDeleteReposClearAuditEntry implements Node & AuditEntry & EnterpriseAuditEntryData & OrganizationAuditEntryData { """The action name""" @@ -8300,6 +8841,9 @@ input MergeBranchInput { """ commitMessage: String + """The email address to associate with this commit.""" + authorEmail: String + """A unique identifier for the client performing the mutation.""" clientMutationId: String } @@ -8364,12 +8908,18 @@ input MergePullRequestInput { """The merge method to use. If omitted, defaults to 'MERGE'""" mergeMethod: PullRequestMergeMethod = MERGE + """The email address to associate with this merge.""" + authorEmail: String + """A unique identifier for the client performing the mutation.""" clientMutationId: String } """Autogenerated return type of MergePullRequest""" type MergePullRequestPayload { + """Identifies the actor who performed the event.""" + actor: Actor + """A unique identifier for the client performing the mutation.""" clientMutationId: String @@ -8400,9 +8950,6 @@ type Milestone implements Node & Closable & UniformResourceLocatable { dueOn: DateTime id: ID! - """Just for debugging on review-lab""" - issuePrioritiesDebug: String! - """A list of issues associated with the milestone.""" issues( """Ordering options for issues returned from the connection.""" @@ -8435,6 +8982,9 @@ type Milestone implements Node & Closable & UniformResourceLocatable { """Identifies the number of the milestone.""" number: Int! + """Indentifies the percentage complete for the milestone""" + progressPercentage: Float! + """A list of pull requests associated with the milestone.""" pullRequests( """A list of states to filter the pull requests by.""" @@ -8562,6 +9112,18 @@ enum MilestoneState { CLOSED } +"""Entities that can be minimized.""" +interface Minimizable { + """Returns whether or not a comment has been minimized.""" + isMinimized: Boolean! + + """Returns why the comment was minimized.""" + minimizedReason: String + + """Check if the current viewer can minimize this object.""" + viewerCanMinimize: Boolean! +} + """Autogenerated input type of MinimizeComment""" input MinimizeCommentInput { """The Node ID of the subject to modify.""" @@ -8574,6 +9136,15 @@ input MinimizeCommentInput { clientMutationId: String } +"""Autogenerated return type of MinimizeComment""" +type MinimizeCommentPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The comment that was minimized.""" + minimizedComment: Minimizable +} + """ Represents a 'moved_columns_in_project' event on a given issue or pull request. """ @@ -8671,12 +9242,18 @@ type Mutation { """Adds a comment to a review.""" addPullRequestReviewComment(input: AddPullRequestReviewCommentInput!): AddPullRequestReviewCommentPayload + """Adds a new thread to a pending Pull Request Review.""" + addPullRequestReviewThread(input: AddPullRequestReviewThreadInput!): AddPullRequestReviewThreadPayload + """Adds a reaction to a subject.""" addReaction(input: AddReactionInput!): AddReactionPayload """Adds a star to a Starrable.""" addStar(input: AddStarInput!): AddStarPayload + """Marks a repository as archived.""" + archiveRepository(input: ArchiveRepositoryInput!): ArchiveRepositoryPayload + """ Cancels a pending invitation for an administrator to join an enterprise. """ @@ -8721,6 +9298,9 @@ type Mutation { """Creates an organization as part of an enterprise account.""" createEnterpriseOrganization(input: CreateEnterpriseOrganizationInput!): CreateEnterpriseOrganizationPayload + """Creates a new IP allow list entry.""" + createIpAllowListEntry(input: CreateIpAllowListEntryInput!): CreateIpAllowListEntryPayload + """Creates a new issue.""" createIssue(input: CreateIssueInput!): CreateIssuePayload @@ -8748,6 +9328,12 @@ type Mutation { """Delete a branch protection rule""" deleteBranchProtectionRule(input: DeleteBranchProtectionRuleInput!): DeleteBranchProtectionRulePayload + """Deletes a deployment.""" + deleteDeployment(input: DeleteDeploymentInput!): DeleteDeploymentPayload + + """Deletes an IP allow list entry.""" + deleteIpAllowListEntry(input: DeleteIpAllowListEntryInput!): DeleteIpAllowListEntryPayload + """Deletes an Issue object.""" deleteIssue(input: DeleteIssueInput!): DeleteIssuePayload @@ -8793,12 +9379,21 @@ type Mutation { """Lock a lockable object""" lockLockable(input: LockLockableInput!): LockLockablePayload + """Mark a pull request file as viewed""" + markFileAsViewed(input: MarkFileAsViewedInput!): MarkFileAsViewedPayload + + """Marks a pull request ready for review.""" + markPullRequestReadyForReview(input: MarkPullRequestReadyForReviewInput!): MarkPullRequestReadyForReviewPayload + """Merge a head into a branch.""" mergeBranch(input: MergeBranchInput!): MergeBranchPayload """Merge a pull request.""" mergePullRequest(input: MergePullRequestInput!): MergePullRequestPayload + """Minimizes a comment on an Issue, Commit, Pull Request, or Gist""" + minimizeComment(input: MinimizeCommentInput!): MinimizeCommentPayload + """Moves a project card to another place.""" moveProjectCard(input: MoveProjectCardInput!): MoveProjectCardPayload @@ -8814,6 +9409,9 @@ type Mutation { """Removes an administrator from the enterprise.""" removeEnterpriseAdmin(input: RemoveEnterpriseAdminInput!): RemoveEnterpriseAdminPayload + """Removes the identity provider from an enterprise""" + removeEnterpriseIdentityProvider(input: RemoveEnterpriseIdentityProviderInput!): RemoveEnterpriseIdentityProviderPayload + """Removes an organization from the enterprise""" removeEnterpriseOrganization(input: RemoveEnterpriseOrganizationInput!): RemoveEnterpriseOrganizationPayload @@ -8844,12 +9442,29 @@ type Mutation { """Marks a review thread as resolved.""" resolveReviewThread(input: ResolveReviewThreadInput!): ResolveReviewThreadPayload + """Creates or updates the identity provider for an enterprise.""" + setEnterpriseIdentityProvider(input: SetEnterpriseIdentityProviderInput!): SetEnterpriseIdentityProviderPayload + + """ + Set an organization level interaction limit for an organization's public repositories. + """ + setOrganizationInteractionLimit(input: SetOrganizationInteractionLimitInput!): SetOrganizationInteractionLimitPayload + + """Sets an interaction limit setting for a repository.""" + setRepositoryInteractionLimit(input: SetRepositoryInteractionLimitInput!): SetRepositoryInteractionLimitPayload + + """Set a user level interaction limit for an user's public repositories.""" + setUserInteractionLimit(input: SetUserInteractionLimitInput!): SetUserInteractionLimitPayload + """Submits a pending pull request review.""" submitPullRequestReview(input: SubmitPullRequestReviewInput!): SubmitPullRequestReviewPayload """Transfer an issue to a different repository""" transferIssue(input: TransferIssueInput!): TransferIssuePayload + """Unarchives a repository.""" + unarchiveRepository(input: UnarchiveRepositoryInput!): UnarchiveRepositoryPayload + """Unfollow a user.""" unfollowUser(input: UnfollowUserInput!): UnfollowUserPayload @@ -8859,9 +9474,15 @@ type Mutation { """Unlock a lockable object""" unlockLockable(input: UnlockLockableInput!): UnlockLockablePayload + """Unmark a pull request file as viewed""" + unmarkFileAsViewed(input: UnmarkFileAsViewedInput!): UnmarkFileAsViewedPayload + """Unmark an issue as a duplicate of another issue.""" unmarkIssueAsDuplicate(input: UnmarkIssueAsDuplicateInput!): UnmarkIssueAsDuplicatePayload + """Unminimizes a comment on an Issue, Commit, Pull Request, or Gist""" + unminimizeComment(input: UnminimizeCommentInput!): UnminimizeCommentPayload + """Marks a review thread as unresolved.""" unresolveReviewThread(input: UnresolveReviewThreadInput!): UnresolveReviewThreadPayload @@ -8874,9 +9495,6 @@ type Mutation { """Modifies the settings of an existing check suite""" updateCheckSuitePreferences(input: UpdateCheckSuitePreferencesInput!): UpdateCheckSuitePreferencesPayload - """Sets the action execution capability setting for an enterprise.""" - updateEnterpriseActionExecutionCapabilitySetting(input: UpdateEnterpriseActionExecutionCapabilitySettingInput!): UpdateEnterpriseActionExecutionCapabilitySettingPayload - """Updates the role of an enterprise administrator.""" updateEnterpriseAdministratorRole(input: UpdateEnterpriseAdministratorRoleInput!): UpdateEnterpriseAdministratorRolePayload @@ -8935,6 +9553,12 @@ type Mutation { """ updateEnterpriseTwoFactorAuthenticationRequiredSetting(input: UpdateEnterpriseTwoFactorAuthenticationRequiredSettingInput!): UpdateEnterpriseTwoFactorAuthenticationRequiredSettingPayload + """Sets whether an IP allow list is enabled on an owner.""" + updateIpAllowListEnabledSetting(input: UpdateIpAllowListEnabledSettingInput!): UpdateIpAllowListEnabledSettingPayload + + """Updates an IP allow list entry.""" + updateIpAllowListEntry(input: UpdateIpAllowListEntryInput!): UpdateIpAllowListEntryPayload + """Updates an Issue.""" updateIssue(input: UpdateIssueInput!): UpdateIssuePayload @@ -9088,20 +9712,6 @@ enum OauthApplicationCreateAuditEntryState { PENDING_DELETION } -"""The state of an OAuth Application when its tokens were revoked.""" -enum OauthApplicationRevokeTokensAuditEntryState { - """The OAuth Application was active and allowed to have OAuth Accesses.""" - ACTIVE - - """ - The OAuth Application was suspended from generating OAuth Accesses due to abuse or security concerns. - """ - SUSPENDED - - """The OAuth Application was in the process of being deleted.""" - PENDING_DELETION -} - """The corresponding operation type for the action""" enum OperationType { """An existing resource was accessed""" @@ -9271,7 +9881,7 @@ enum OrgAddMemberAuditEntryPermission { """ An account on GitHub, with one or more owners, that has repositories, members and teams. """ -type Organization implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch & ProjectOwner & RepositoryOwner & UniformResourceLocatable & MemberStatusable & ProfileOwner & Sponsorable { +type Organization implements Node & Actor & PackageOwner & ProjectOwner & RepositoryOwner & UniformResourceLocatable & MemberStatusable & ProfileOwner & Sponsorable { """ Determine if this repository owner has any items that can be pinned to their profile. """ @@ -9323,9 +9933,47 @@ type Organization implements Node & Actor & RegistryPackageOwner & RegistryPacka """The organization's public email.""" email: String + + """True if this user/organization has a GitHub Sponsors listing.""" + hasSponsorsListing: Boolean! id: ID! - """Whether the organization has verified its profile email and website.""" + """The interaction ability settings for this organization.""" + interactionAbility: RepositoryInteractionAbility + + """ + The setting value for whether the organization has an IP allow list enabled. + """ + ipAllowListEnabledSetting: IpAllowListEnabledSettingValue! + + """ + The IP addresses that are allowed to access resources owned by the organization. + """ + ipAllowListEntries( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the first _n_ elements from the list.""" + first: Int + + """Returns the last _n_ elements from the list.""" + last: Int + + """Ordering options for IP allow list entries returned.""" + orderBy: IpAllowListEntryOrder = {field: ALLOW_LIST_VALUE, direction: ASC} + ): IpAllowListEntryConnection! + + """True if the viewer is sponsored by this user/organization.""" + isSponsoringViewer: Boolean! + + """ + Whether the organization has verified its profile email and website, always false on Enterprise. + """ isVerified: Boolean! """ @@ -9391,6 +10039,35 @@ type Organization implements Node & Actor & RegistryPackageOwner & RegistryPacka """The billing email for the organization.""" organizationBillingEmail: String + """A list of packages under the owner.""" + packages( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the first _n_ elements from the list.""" + first: Int + + """Returns the last _n_ elements from the list.""" + last: Int + + """Find packages by their names.""" + names: [String] + + """Find packages in a repository by ID.""" + repositoryId: ID + + """Filter registry package by type.""" + packageType: PackageType + + """Ordering of the returned packages.""" + orderBy: PackageOrder = {field: CREATED_AT, direction: DESC} + ): PackageConnection! + """A list of users who have been invited to join this organization.""" pendingMembers( """Returns the elements in the list that come after the specified cursor.""" @@ -9495,64 +10172,6 @@ type Organization implements Node & Actor & RegistryPackageOwner & RegistryPacka """The HTTP URL listing organization's projects""" projectsUrl: URI! - """A list of registry packages under the owner.""" - registryPackages( - """Returns the elements in the list that come after the specified cursor.""" - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - - """Returns the first _n_ elements from the list.""" - first: Int - - """Returns the last _n_ elements from the list.""" - last: Int - - """Find registry package by name.""" - name: String - - """Find registry packages by their names.""" - names: [String] - - """Find registry packages in a repository.""" - repositoryId: ID - - """Filter registry package by type.""" - packageType: RegistryPackageType - - """Filter registry package by type (string).""" - registryPackageType: String - - """Filter registry package by whether it is publicly visible""" - publicOnly: Boolean = false - ): RegistryPackageConnection! - - """A list of registry packages for a particular search query.""" - registryPackagesForQuery( - """Returns the elements in the list that come after the specified cursor.""" - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - - """Returns the first _n_ elements from the list.""" - first: Int - - """Returns the last _n_ elements from the list.""" - last: Int - - """Find registry package by search query.""" - query: String - - """Filter registry package by type.""" - packageType: RegistryPackageType - ): RegistryPackageConnection! - """A list of repositories that the user owns.""" repositories( """If non-null, filters repositories according to privacy""" @@ -9566,7 +10185,7 @@ type Organization implements Node & Actor & RegistryPackageOwner & RegistryPacka connection. For example, OWNER will include only repositories that the current viewer owns. """ - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + affiliations: [RepositoryAffiliation] """ Array of owner's affiliation options for repositories returned from the @@ -9618,7 +10237,7 @@ type Organization implements Node & Actor & RegistryPackageOwner & RegistryPacka """The Organization's SAML identity providers""" samlIdentityProvider: OrganizationIdentityProvider - """The GitHub Sponsors listing for this user.""" + """The GitHub Sponsors listing for this user or organization.""" sponsorsListing: SponsorsListing """This object's sponsorships as the maintainer.""" @@ -9724,6 +10343,9 @@ type Organization implements Node & Actor & RegistryPackageOwner & RegistryPacka """The HTTP URL listing organization's teams""" teamsUrl: URI! + """The organization's Twitter username.""" + twitterUsername: String + """Identifies the date and time when the object was last updated.""" updatedAt: DateTime! @@ -9745,9 +10367,15 @@ type Organization implements Node & Actor & RegistryPackageOwner & RegistryPacka """Viewer can create teams on this organization.""" viewerCanCreateTeams: Boolean! + """Whether or not the viewer is able to sponsor this user/organization.""" + viewerCanSponsor: Boolean! + """Viewer is an active member of this organization.""" viewerIsAMember: Boolean! + """True if the viewer is sponsoring this user/organization.""" + viewerIsSponsoring: Boolean! + """The organization's public profile URL.""" websiteUrl: URI } @@ -11210,6 +11838,12 @@ enum OrgRemoveMemberAuditEntryReason { """SAML SSO enforcement requires an external identity""" SAML_SSO_ENFORCEMENT_REQUIRES_EXTERNAL_IDENTITY + + """User account has been deleted""" + USER_ACCOUNT_DELETED + + """User was removed from organization during account recovery""" + TWO_FACTOR_ACCOUNT_RECOVERY } """Audit log entry for a org.remove_outside_collaborator event.""" @@ -11734,6 +12368,34 @@ enum OrgUpdateMemberRepositoryCreationPermissionAuditEntryVisibility { All organization members are restricted from creating public repositories. """ PUBLIC + + """All organization members are allowed to create any repositories.""" + NONE + + """ + All organization members are restricted from creating private repositories. + """ + PRIVATE + + """ + All organization members are restricted from creating internal repositories. + """ + INTERNAL + + """ + All organization members are restricted from creating public or internal repositories. + """ + PUBLIC_INTERNAL + + """ + All organization members are restricted from creating private or internal repositories. + """ + PRIVATE_INTERNAL + + """ + All organization members are restricted from creating public or private repositories. + """ + PUBLIC_PRIVATE } """ @@ -11800,23 +12462,350 @@ type OrgUpdateMemberRepositoryInvitationPermissionAuditEntry implements Node & A userUrl: URI } -"""Information about pagination in a connection.""" -type PageInfo { - """When paginating forwards, the cursor to continue.""" - endCursor: String +"""Information for an uploaded package.""" +type Package implements Node { + id: ID! - """When paginating forwards, are there more items?""" - hasNextPage: Boolean! + """Find the latest version for the package.""" + latestVersion: PackageVersion - """When paginating backwards, are there more items?""" - hasPreviousPage: Boolean! + """Identifies the name of the package.""" + name: String! - """When paginating backwards, the cursor to continue.""" - startCursor: String -} + """Identifies the type of the package.""" + packageType: PackageType! -"""Types that can grant permissions on a repository to a user""" -union PermissionGranter = Organization | Repository | Team + """The repository this package belongs to.""" + repository: Repository + + """Statistics about package activity.""" + statistics: PackageStatistics + + """Find package version by version string.""" + version( + """The package version.""" + version: String! + ): PackageVersion + + """list of versions for this package""" + versions( + """Ordering of the returned packages.""" + orderBy: PackageVersionOrder = {field: CREATED_AT, direction: DESC} + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the first _n_ elements from the list.""" + first: Int + + """Returns the last _n_ elements from the list.""" + last: Int + ): PackageVersionConnection! +} + +"""The connection type for Package.""" +type PackageConnection { + """A list of edges.""" + edges: [PackageEdge] + + """A list of nodes.""" + nodes: [Package] + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""An edge in a connection.""" +type PackageEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: Package +} + +"""A file in a package version.""" +type PackageFile implements Node { + id: ID! + + """MD5 hash of the file.""" + md5: String + + """Name of the file.""" + name: String! + + """The package version this file belongs to.""" + packageVersion: PackageVersion + + """SHA1 hash of the file.""" + sha1: String + + """SHA256 hash of the file.""" + sha256: String + + """Size of the file in bytes.""" + size: Int + + """Identifies the date and time when the object was last updated.""" + updatedAt: DateTime! + + """URL to download the asset.""" + url: URI +} + +"""The connection type for PackageFile.""" +type PackageFileConnection { + """A list of edges.""" + edges: [PackageFileEdge] + + """A list of nodes.""" + nodes: [PackageFile] + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""An edge in a connection.""" +type PackageFileEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: PackageFile +} + +"""Ways in which lists of package files can be ordered upon return.""" +input PackageFileOrder { + """The field in which to order package files by.""" + field: PackageFileOrderField + + """The direction in which to order package files by the specified field.""" + direction: OrderDirection +} + +"""Properties by which package file connections can be ordered.""" +enum PackageFileOrderField { + """Order package files by creation time""" + CREATED_AT +} + +"""Ways in which lists of packages can be ordered upon return.""" +input PackageOrder { + """The field in which to order packages by.""" + field: PackageOrderField + + """The direction in which to order packages by the specified field.""" + direction: OrderDirection +} + +"""Properties by which package connections can be ordered.""" +enum PackageOrderField { + """Order packages by creation time""" + CREATED_AT +} + +"""Represents an owner of a package.""" +interface PackageOwner { + id: ID! + + """A list of packages under the owner.""" + packages( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the first _n_ elements from the list.""" + first: Int + + """Returns the last _n_ elements from the list.""" + last: Int + + """Find packages by their names.""" + names: [String] + + """Find packages in a repository by ID.""" + repositoryId: ID + + """Filter registry package by type.""" + packageType: PackageType + + """Ordering of the returned packages.""" + orderBy: PackageOrder = {field: CREATED_AT, direction: DESC} + ): PackageConnection! +} + +""" +Represents a object that contains package activity statistics such as downloads. +""" +type PackageStatistics { + """Number of times the package was downloaded since it was created.""" + downloadsTotalCount: Int! +} + +"""A version tag contains the mapping between a tag name and a version.""" +type PackageTag implements Node { + id: ID! + + """Identifies the tag name of the version.""" + name: String! + + """Version that the tag is associated with.""" + version: PackageVersion +} + +"""The possible types of a package.""" +enum PackageType { + """An npm package.""" + NPM + + """A rubygems package.""" + RUBYGEMS + + """A maven package.""" + MAVEN + + """A docker image.""" + DOCKER + + """A debian package.""" + DEBIAN + + """A nuget package.""" + NUGET + + """A python package.""" + PYPI +} + +"""Information about a specific package version.""" +type PackageVersion implements Node { + """List of files associated with this package version""" + files( + """Ordering of the returned package files.""" + orderBy: PackageFileOrder = {field: CREATED_AT, direction: ASC} + + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the first _n_ elements from the list.""" + first: Int + + """Returns the last _n_ elements from the list.""" + last: Int + ): PackageFileConnection! + id: ID! + + """The package associated with this version.""" + package: Package + + """The platform this version was built for.""" + platform: String + + """Whether or not this version is a pre-release.""" + preRelease: Boolean! + + """The README of this package version.""" + readme: String + + """The release associated with this package version.""" + release: Release + + """Statistics about package activity.""" + statistics: PackageVersionStatistics + + """The package version summary.""" + summary: String + + """The version string.""" + version: String! +} + +"""The connection type for PackageVersion.""" +type PackageVersionConnection { + """A list of edges.""" + edges: [PackageVersionEdge] + + """A list of nodes.""" + nodes: [PackageVersion] + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""An edge in a connection.""" +type PackageVersionEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: PackageVersion +} + +"""Ways in which lists of package versions can be ordered upon return.""" +input PackageVersionOrder { + """The field in which to order package versions by.""" + field: PackageVersionOrderField + + """ + The direction in which to order package versions by the specified field. + """ + direction: OrderDirection +} + +"""Properties by which package version connections can be ordered.""" +enum PackageVersionOrderField { + """Order package versions by creation time""" + CREATED_AT +} + +""" +Represents a object that contains package version activity statistics such as downloads. +""" +type PackageVersionStatistics { + """Number of times the package was downloaded since it was created.""" + downloadsTotalCount: Int! +} + +"""Information about pagination in a connection.""" +type PageInfo { + """When paginating forwards, the cursor to continue.""" + endCursor: String + + """When paginating forwards, are there more items?""" + hasNextPage: Boolean! + + """When paginating backwards, are there more items?""" + hasPreviousPage: Boolean! + + """When paginating backwards, the cursor to continue.""" + startCursor: String +} + +"""Types that can grant permissions on a repository to a user""" +union PermissionGranter = Organization | Repository | Team """A level of permission and source for a user's access to a repository.""" type PermissionSource { @@ -11830,15 +12819,6 @@ type PermissionSource { source: PermissionGranter! } -"""Autogenerated input type of PinIssue""" -input PinIssueInput { - """The ID of the issue to be pinned""" - issueId: ID! - - """A unique identifier for the client performing the mutation.""" - clientMutationId: String -} - """Types that can be pinned to a profile page.""" union PinnableItem = Gist | Repository @@ -12256,6 +13236,9 @@ type Project implements Node & Closable & Updatable { archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] ): ProjectCardConnection! + """Project progress details.""" + progress: ProjectProgress! + """The HTTP path for this project""" resourcePath: URI! @@ -12351,15 +13334,6 @@ type ProjectCardEdge { node: ProjectCard } -"""An issue or PR and its owning repository to be used in a project card.""" -input ProjectCardImport { - """Repository name with owner (owner/repository).""" - repository: String! - - """The issue or pull request number.""" - number: Int! -} - """Types that can be inside Project Cards.""" union ProjectCardItem = Issue | PullRequest @@ -12447,18 +13421,6 @@ type ProjectColumnEdge { node: ProjectColumn } -"""A project column and a list of its issues and PRs.""" -input ProjectColumnImport { - """The name of the column.""" - columnName: String! - - """The position of the column, starting from 0.""" - position: Int! - - """A list of issues and pull requests in the column.""" - issues: [ProjectCardImport!] -} - """The semantic purpose of the column - todo, in progress, or done.""" enum ProjectColumnPurpose { """The column contains cards still to be worked on""" @@ -12562,7 +13524,33 @@ interface ProjectOwner { viewerCanCreateProjects: Boolean! } -"""State of the project; either 'open' or 'closed'""" +"""Project progress stats.""" +type ProjectProgress { + """The number of done cards.""" + doneCount: Int! + + """The percentage of done cards.""" + donePercentage: Float! + + """ + Whether progress tracking is enabled and cards with purpose exist for this project + """ + enabled: Boolean! + + """The number of in-progress cards.""" + inProgressCount: Int! + + """The percentage of in-progress cards.""" + inProgressPercentage: Float! + + """The number of to do cards.""" + todoCount: Int! + + """The percentage of to do cards.""" + todoPercentage: Float! +} + +"""State of the project; either 'open' or 'closed'""" enum ProjectState { """The project is open.""" OPEN @@ -12708,6 +13696,12 @@ type PullRequest implements Node & Assignable & Closable & Comment & Updatable & """The number of changed files in this pull request.""" changedFiles: Int! + """The HTTP path for the checks of this pull request.""" + checksResourcePath: URI! + + """The HTTP URL for the checks of this pull request.""" + checksUrl: URI! + """`true` if the pull request is closed""" closed: Boolean! @@ -12716,6 +13710,9 @@ type PullRequest implements Node & Assignable & Closable & Comment & Updatable & """A list of comments associated with the pull request.""" comments( + """Ordering options for issue comments returned from the connection.""" + orderBy: IssueCommentOrder + """Returns the elements in the list that come after the specified cursor.""" after: String @@ -12818,8 +13815,17 @@ type PullRequest implements Node & Assignable & Closable & Comment & Updatable & """The head and base repositories are different.""" isCrossRepository: Boolean! + """Identifies if the pull request is a draft.""" + isDraft: Boolean! + + """Is this pull request read by the viewer""" + isReadByViewer: Boolean + """A list of labels associated with the object.""" labels( + """Ordering options for labels returned from the connection.""" + orderBy: LabelOrder = {field: CREATED_AT, direction: ASC} + """Returns the elements in the list that come after the specified cursor.""" after: String @@ -12838,6 +13844,45 @@ type PullRequest implements Node & Assignable & Closable & Comment & Updatable & """The moment the editor made the last edit""" lastEditedAt: DateTime + """A list of latest reviews per user associated with the pull request.""" + latestOpinionatedReviews( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the first _n_ elements from the list.""" + first: Int + + """Returns the last _n_ elements from the list.""" + last: Int + + """Only return reviews from user who have write access to the repository""" + writersOnly: Boolean = false + ): PullRequestReviewConnection + + """ + A list of latest reviews per user associated with the pull request that are not also pending review. + """ + latestReviews( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the first _n_ elements from the list.""" + first: Int + + """Returns the last _n_ elements from the list.""" + last: Int + ): PullRequestReviewConnection + """`true` if the pull request is locked""" locked: Boolean! @@ -12958,6 +14003,9 @@ type PullRequest implements Node & Assignable & Closable & Comment & Updatable & """The HTTP URL for reverting this pull request.""" revertUrl: URI! + """The current status of this pull request with respect to code review.""" + reviewDecision: PullRequestReviewDecision + """A list of review requests associated with the pull request.""" reviewRequests( """Returns the elements in the list that come after the specified cursor.""" @@ -13080,6 +14128,9 @@ type PullRequest implements Node & Assignable & Closable & Comment & Updatable & """Whether or not the viewer can apply suggestion.""" viewerCanApplySuggestion: Boolean! + """Check if the viewer can restore the deleted head ref.""" + viewerCanDeleteHeadRef: Boolean! + """Can user react to this subject""" viewerCanReact: Boolean! @@ -13097,6 +14148,18 @@ type PullRequest implements Node & Assignable & Closable & Comment & Updatable & """Did the viewer author this comment.""" viewerDidAuthor: Boolean! + """The merge body text for the viewer and method.""" + viewerMergeBodyText( + """The merge method for the message.""" + mergeType: PullRequestMergeMethod + ): String! + + """The merge headline text for the viewer and method.""" + viewerMergeHeadlineText( + """The merge method for the message.""" + mergeType: PullRequestMergeMethod + ): String! + """ Identifies if the viewer is watching, not watching, or ignoring the subscribable entity. """ @@ -13113,6 +14176,9 @@ type PullRequestChangedFile { """The path of the file.""" path: String! + + """The state of the file for the viewer.""" + viewerViewedState: FileViewedState! } """The connection type for PullRequestChangedFile.""" @@ -13249,7 +14315,7 @@ type PullRequestContributionsByRepository { last: Int """Ordering options for contributions returned from the connection.""" - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + orderBy: ContributionOrder = {direction: DESC} ): CreatedPullRequestContributionConnection! """The repository in which the pull requests were opened.""" @@ -13303,24 +14369,6 @@ enum PullRequestOrderField { UPDATED_AT } -"""The possible PubSub channels for a pull request.""" -enum PullRequestPubSubTopic { - """The channel ID for observing pull request updates.""" - UPDATED - - """The channel ID for marking an pull request as read.""" - MARKASREAD - - """The channel ID for observing head ref updates.""" - HEAD_REF - - """The channel ID for updating items on the pull request timeline.""" - TIMELINE - - """The channel ID for observing pull request state updates.""" - STATE -} - """A review object for a given pull request.""" type PullRequestReview implements Node & Comment & Deletable & Updatable & UpdatableComment & Reactable & RepositoryNode { """The actor who authored the comment.""" @@ -13329,6 +14377,11 @@ type PullRequestReview implements Node & Comment & Deletable & Updatable & Updat """Author's association with the subject of the comment.""" authorAssociation: CommentAuthorAssociation! + """ + Indicates whether the author of this review has push access to the repository. + """ + authorCanPushToRepository: Boolean! + """Identifies the pull request review body.""" body: String! @@ -13480,7 +14533,7 @@ type PullRequestReview implements Node & Comment & Deletable & Updatable & Updat } """A review comment associated with a given repository pull request.""" -type PullRequestReviewComment implements Node & Comment & Deletable & Updatable & UpdatableComment & Reactable & RepositoryNode { +type PullRequestReviewComment implements Node & Comment & Deletable & Minimizable & Updatable & UpdatableComment & Reactable & RepositoryNode { """The actor who authored the comment.""" author: Actor @@ -13705,13 +14758,25 @@ type PullRequestReviewContributionsByRepository { last: Int """Ordering options for contributions returned from the connection.""" - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + orderBy: ContributionOrder = {direction: DESC} ): CreatedPullRequestReviewContributionConnection! """The repository in which the pull request reviews were made.""" repository: Repository! } +"""The review status of a pull request.""" +enum PullRequestReviewDecision { + """Changes have been requested on the pull request.""" + CHANGES_REQUESTED + + """The pull request has received an approving review.""" + APPROVED + + """A review is required before the pull request can be merged.""" + REVIEW_REQUIRED +} + """An edge in a connection.""" type PullRequestReviewEdge { """A cursor for use in pagination.""" @@ -13775,11 +14840,34 @@ type PullRequestReviewThread implements Node { """Skips the first _n_ elements in the list.""" skip: Int ): PullRequestReviewCommentConnection! + + """The side of the diff on which this thread was placed.""" + diffSide: DiffSide! id: ID! + """Whether or not the thread has been collapsed (outdated or resolved)""" + isCollapsed: Boolean! + + """Indicates whether this thread was outdated by newer changes.""" + isOutdated: Boolean! + """Whether this thread has been resolved""" isResolved: Boolean! + """The line in the file to which this thread refers""" + line: Int + + """The original line in the file to which this thread refers.""" + originalLine: Int + + """ + The original start line in the file to which this thread refers (multi-line only). + """ + originalStartLine: Int + + """Identifies the file path of this thread.""" + path: String! + """Identifies the pull request associated with this thread.""" pullRequest: PullRequest! @@ -13789,6 +14877,19 @@ type PullRequestReviewThread implements Node { """The user who resolved this thread""" resolvedBy: User + """ + The side of the diff that the first line of the thread starts on (multi-line only) + """ + startDiffSide: DiffSide + + """ + The start line in the file to which this thread refers (multi-line only) + """ + startLine: Int + + """Indicates whether the current viewer can reply to this thread.""" + viewerCanReply: Boolean! + """Whether or not the viewer can resolve this thread""" viewerCanResolve: Boolean! @@ -13862,7 +14963,7 @@ type PullRequestTimelineConnection { } """An item in an pull request timeline""" -union PullRequestTimelineItem = Commit | CommitCommentThread | PullRequestReview | PullRequestReviewThread | PullRequestReviewComment | IssueComment | ClosedEvent | ReopenedEvent | SubscribedEvent | UnsubscribedEvent | MergedEvent | ReferencedEvent | CrossReferencedEvent | AssignedEvent | UnassignedEvent | LabeledEvent | UnlabeledEvent | MilestonedEvent | DemilestonedEvent | RenamedTitleEvent | LockedEvent | UnlockedEvent | DeployedEvent | DeploymentEnvironmentChangedEvent | HeadRefDeletedEvent | HeadRefRestoredEvent | HeadRefForcePushedEvent | BaseRefForcePushedEvent | ReviewRequestedEvent | ReviewRequestRemovedEvent | ReviewDismissedEvent | UserBlockedEvent +union PullRequestTimelineItem = AssignedEvent | BaseRefDeletedEvent | BaseRefForcePushedEvent | ClosedEvent | Commit | CommitCommentThread | CrossReferencedEvent | DemilestonedEvent | DeployedEvent | DeploymentEnvironmentChangedEvent | HeadRefDeletedEvent | HeadRefForcePushedEvent | HeadRefRestoredEvent | IssueComment | LabeledEvent | LockedEvent | MergedEvent | MilestonedEvent | PullRequestReview | PullRequestReviewComment | PullRequestReviewThread | ReferencedEvent | RenamedTitleEvent | ReopenedEvent | ReviewDismissedEvent | ReviewRequestRemovedEvent | ReviewRequestedEvent | SubscribedEvent | UnassignedEvent | UnlabeledEvent | UnlockedEvent | UnsubscribedEvent | UserBlockedEvent """An edge in a connection.""" type PullRequestTimelineItemEdge { @@ -13874,7 +14975,7 @@ type PullRequestTimelineItemEdge { } """An item in a pull request timeline""" -union PullRequestTimelineItems = PullRequestCommit | PullRequestCommitCommentThread | PullRequestReview | PullRequestReviewThread | PullRequestRevisionMarker | BaseRefChangedEvent | BaseRefForcePushedEvent | DeployedEvent | DeploymentEnvironmentChangedEvent | HeadRefDeletedEvent | HeadRefForcePushedEvent | HeadRefRestoredEvent | MergedEvent | ReviewDismissedEvent | ReviewRequestedEvent | ReviewRequestRemovedEvent | ReadyForReviewEvent | IssueComment | CrossReferencedEvent | AddedToProjectEvent | AssignedEvent | ClosedEvent | CommentDeletedEvent | ConvertedNoteToIssueEvent | DemilestonedEvent | LabeledEvent | LockedEvent | MarkedAsDuplicateEvent | MentionedEvent | MilestonedEvent | MovedColumnsInProjectEvent | PinnedEvent | ReferencedEvent | RemovedFromProjectEvent | RenamedTitleEvent | ReopenedEvent | SubscribedEvent | TransferredEvent | UnassignedEvent | UnlabeledEvent | UnlockedEvent | UserBlockedEvent | UnpinnedEvent | UnsubscribedEvent +union PullRequestTimelineItems = AddedToProjectEvent | AssignedEvent | AutomaticBaseChangeFailedEvent | AutomaticBaseChangeSucceededEvent | BaseRefChangedEvent | BaseRefDeletedEvent | BaseRefForcePushedEvent | ClosedEvent | CommentDeletedEvent | ConnectedEvent | ConvertToDraftEvent | ConvertedNoteToIssueEvent | CrossReferencedEvent | DemilestonedEvent | DeployedEvent | DeploymentEnvironmentChangedEvent | DisconnectedEvent | HeadRefDeletedEvent | HeadRefForcePushedEvent | HeadRefRestoredEvent | IssueComment | LabeledEvent | LockedEvent | MarkedAsDuplicateEvent | MentionedEvent | MergedEvent | MilestonedEvent | MovedColumnsInProjectEvent | PinnedEvent | PullRequestCommit | PullRequestCommitCommentThread | PullRequestReview | PullRequestReviewThread | PullRequestRevisionMarker | ReadyForReviewEvent | ReferencedEvent | RemovedFromProjectEvent | RenamedTitleEvent | ReopenedEvent | ReviewDismissedEvent | ReviewRequestRemovedEvent | ReviewRequestedEvent | SubscribedEvent | TransferredEvent | UnassignedEvent | UnlabeledEvent | UnlockedEvent | UnmarkedAsDuplicateEvent | UnpinnedEvent | UnsubscribedEvent | UserBlockedEvent """The connection type for PullRequestTimelineItems.""" type PullRequestTimelineItemsConnection { @@ -13932,6 +15033,16 @@ enum PullRequestTimelineItemsItemType { """ PULL_REQUEST_REVISION_MARKER + """ + Represents a 'automatic_base_change_failed' event on a given pull request. + """ + AUTOMATIC_BASE_CHANGE_FAILED_EVENT + + """ + Represents a 'automatic_base_change_succeeded' event on a given pull request. + """ + AUTOMATIC_BASE_CHANGE_SUCCEEDED_EVENT + """ Represents a 'base_ref_changed' event on a given issue or pull request. """ @@ -13940,6 +15051,9 @@ enum PullRequestTimelineItemsItemType { """Represents a 'base_ref_force_pushed' event on a given pull request.""" BASE_REF_FORCE_PUSHED_EVENT + """Represents a 'base_ref_deleted' event on a given pull request.""" + BASE_REF_DELETED_EVENT + """Represents a 'deployed' event on a given pull request.""" DEPLOYED_EVENT @@ -13974,6 +15088,9 @@ enum PullRequestTimelineItemsItemType { """Represents a 'ready_for_review' event on a given pull request.""" READY_FOR_REVIEW_EVENT + """Represents a 'convert_to_draft' event on a given pull request.""" + CONVERT_TO_DRAFT_EVENT + """Represents a comment on an Issue.""" ISSUE_COMMENT @@ -13994,6 +15111,9 @@ enum PullRequestTimelineItemsItemType { """Represents a 'comment_deleted' event on a given issue or pull request.""" COMMENT_DELETED_EVENT + """Represents a 'connected' event on a given issue or pull request.""" + CONNECTED_EVENT + """ Represents a 'converted_note_to_issue' event on a given issue or pull request. """ @@ -14002,6 +15122,9 @@ enum PullRequestTimelineItemsItemType { """Represents a 'demilestoned' event on a given issue or pull request.""" DEMILESTONED_EVENT + """Represents a 'disconnected' event on a given issue or pull request.""" + DISCONNECTED_EVENT + """Represents a 'labeled' event on a given issue or pull request.""" LABELED_EVENT @@ -14059,6 +15182,11 @@ enum PullRequestTimelineItemsItemType { """Represents a 'user_blocked' event on a given user.""" USER_BLOCKED_EVENT + """ + Represents an 'unmarked_as_duplicate' event on a given issue or pull request. + """ + UNMARKED_AS_DUPLICATE_EVENT + """Represents an 'unpinned' event on a given issue or pull request.""" UNPINNED_EVENT @@ -14108,7 +15236,7 @@ type PushAllowance implements Node { } """Types that can be an actor.""" -union PushAllowanceActor = User | Team | App +union PushAllowanceActor = App | Team | User """The connection type for PushAllowance.""" type PushAllowanceConnection { @@ -14448,6 +15576,9 @@ type RateLimit { The time at which the current rate limit window resets in UTC epoch seconds. """ resetAt: DateTime! + + """The number of points used in the current rate limit window.""" + used: Int! } """Represents a subject that can be reacted on.""" @@ -14669,600 +15800,12 @@ type Ref implements Node { """The head ref name to filter the pull requests by.""" headRefName: String - """The base ref name to filter the pull requests by.""" - baseRefName: String - - """Ordering options for pull requests returned from the connection.""" - orderBy: IssueOrder - - """Returns the elements in the list that come after the specified cursor.""" - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - - """Returns the first _n_ elements from the list.""" - first: Int - - """Returns the last _n_ elements from the list.""" - last: Int - ): PullRequestConnection! - id: ID! - - """The ref name.""" - name: String! - - """The ref's prefix, such as `refs/heads/` or `refs/tags/`.""" - prefix: String! - - """The repository the ref belongs to.""" - repository: Repository! - - """The object the ref points to.""" - target: GitObject! -} - -"""The connection type for Ref.""" -type RefConnection { - """A list of edges.""" - edges: [RefEdge] - - """A list of nodes.""" - nodes: [Ref] - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """Identifies the total count of items in the connection.""" - totalCount: Int! -} - -"""An edge in a connection.""" -type RefEdge { - """A cursor for use in pagination.""" - cursor: String! - - """The item at the end of the edge.""" - node: Ref -} - -"""Represents a 'referenced' event on a given `ReferencedSubject`.""" -type ReferencedEvent implements Node { - """Identifies the actor who performed the event.""" - actor: Actor - - """Identifies the commit associated with the 'referenced' event.""" - commit: Commit - - """Identifies the repository associated with the 'referenced' event.""" - commitRepository: Repository! - - """Identifies the date and time when the object was created.""" - createdAt: DateTime! - id: ID! - - """Reference originated in a different repository.""" - isCrossRepository: Boolean! - - """ - Checks if the commit message itself references the subject. Can be false in the case of a commit comment reference. - """ - isDirectReference: Boolean! - - """Object referenced by event.""" - subject: ReferencedSubject! -} - -"""Any referencable object""" -union ReferencedSubject = Issue | PullRequest - -"""Ways in which lists of git refs can be ordered upon return.""" -input RefOrder { - """The field in which to order refs by.""" - field: RefOrderField! - - """The direction in which to order refs by the specified field.""" - direction: OrderDirection! -} - -"""Properties by which ref connections can be ordered.""" -enum RefOrderField { - """Order refs by underlying commit date if the ref prefix is refs/tags/""" - TAG_COMMIT_DATE - - """Order refs by their alphanumeric name""" - ALPHABETICAL -} - -""" -Autogenerated input type of RegenerateEnterpriseIdentityProviderRecoveryCodes -""" -input RegenerateEnterpriseIdentityProviderRecoveryCodesInput { - """The ID of the enterprise on which to set an identity provider.""" - enterpriseId: ID! - - """A unique identifier for the client performing the mutation.""" - clientMutationId: String -} - -""" -Autogenerated return type of RegenerateEnterpriseIdentityProviderRecoveryCodes -""" -type RegenerateEnterpriseIdentityProviderRecoveryCodesPayload { - """A unique identifier for the client performing the mutation.""" - clientMutationId: String - - """The identity provider for the enterprise.""" - identityProvider: EnterpriseIdentityProvider -} - -"""A registry package contains the content for an uploaded package.""" -type RegistryPackage implements Node { - """The package type color""" - color: String! - id: ID! - - """Find the latest version for the package.""" - latestVersion: RegistryPackageVersion - - """Identifies the title of the package.""" - name: String! - - """Identifies the title of the package, with the owner prefixed.""" - nameWithOwner: String! - - """Find the package file identified by the guid.""" - packageFileByGuid( - """The unique identifier of the package_file""" - guid: String! - ): RegistryPackageFile - - """Find the package file identified by the sha256.""" - packageFileBySha256( - """The SHA256 of the package_file""" - sha256: String! - ): RegistryPackageFile - - """Identifies the type of the package.""" - packageType: RegistryPackageType! - - """List the prerelease versions for this package.""" - preReleaseVersions( - """Returns the elements in the list that come after the specified cursor.""" - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - - """Returns the first _n_ elements from the list.""" - first: Int - - """Returns the last _n_ elements from the list.""" - last: Int - ): RegistryPackageVersionConnection - - """The type of the package.""" - registryPackageType: String - - """repository that the release is associated with""" - repository: Repository - - """Statistics about package activity.""" - statistics: RegistryPackageStatistics - - """list of tags for this package""" - tags( - """Returns the elements in the list that come after the specified cursor.""" - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - - """Returns the first _n_ elements from the list.""" - first: Int - - """Returns the last _n_ elements from the list.""" - last: Int - ): RegistryPackageTagConnection! - - """List the topics for this package.""" - topics( - """Returns the elements in the list that come after the specified cursor.""" - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - - """Returns the first _n_ elements from the list.""" - first: Int - - """Returns the last _n_ elements from the list.""" - last: Int - ): TopicConnection - - """Find package version by version string.""" - version( - """The package version.""" - version: String! - ): RegistryPackageVersion - - """Find package version by version string.""" - versionByPlatform( - """The package version.""" - version: String! - - """Find a registry package for a specific platform.""" - platform: String! - ): RegistryPackageVersion - - """Find package version by manifest SHA256.""" - versionBySha256( - """The package SHA256 digest.""" - sha256: String! - ): RegistryPackageVersion - - """list of versions for this package""" - versions( - """Returns the elements in the list that come after the specified cursor.""" - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - - """Returns the first _n_ elements from the list.""" - first: Int - - """Returns the last _n_ elements from the list.""" - last: Int - ): RegistryPackageVersionConnection! - - """List package versions with a specific metadatum.""" - versionsByMetadatum( - """Filter on a specific metadatum.""" - metadatum: RegistryPackageMetadatum! - - """Returns the elements in the list that come after the specified cursor.""" - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - - """Returns the first _n_ elements from the list.""" - first: Int - - """Returns the last _n_ elements from the list.""" - last: Int - ): RegistryPackageVersionConnection -} - -"""The connection type for RegistryPackage.""" -type RegistryPackageConnection { - """A list of edges.""" - edges: [RegistryPackageEdge] - - """A list of nodes.""" - nodes: [RegistryPackage] - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """Identifies the total count of items in the connection.""" - totalCount: Int! -} - -""" -A package dependency contains the information needed to satisfy a dependency. -""" -type RegistryPackageDependency implements Node { - """Identifies the type of dependency.""" - dependencyType: RegistryPackageDependencyType! - id: ID! - - """Identifies the name of the dependency.""" - name: String! - - """Identifies the version of the dependency.""" - version: String! -} - -"""The connection type for RegistryPackageDependency.""" -type RegistryPackageDependencyConnection { - """A list of edges.""" - edges: [RegistryPackageDependencyEdge] - - """A list of nodes.""" - nodes: [RegistryPackageDependency] - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """Identifies the total count of items in the connection.""" - totalCount: Int! -} - -"""An edge in a connection.""" -type RegistryPackageDependencyEdge { - """A cursor for use in pagination.""" - cursor: String! - - """The item at the end of the edge.""" - node: RegistryPackageDependency -} - -"""The possible types of a registry package dependency.""" -enum RegistryPackageDependencyType { - """A default registry package dependency type.""" - DEFAULT - - """A dev registry package dependency type.""" - DEV - - """A test registry package dependency type.""" - TEST - - """A peer registry package dependency type.""" - PEER - - """An optional registry package dependency type.""" - OPTIONAL - - """An optional registry package dependency type.""" - BUNDLED -} - -"""An edge in a connection.""" -type RegistryPackageEdge { - """A cursor for use in pagination.""" - cursor: String! - - """The item at the end of the edge.""" - node: RegistryPackage -} - -"""A file in a specific registry package version.""" -type RegistryPackageFile implements Node { - """A unique identifier for this file.""" - guid: String - id: ID! - - """Identifies the md5.""" - md5: String - - """URL to download the asset metadata.""" - metadataUrl: URI! - - """Name of the file""" - name: String! - - """The package version this file belongs to.""" - packageVersion: RegistryPackageVersion! - - """Identifies the sha1.""" - sha1: String - - """Identifies the sha256.""" - sha256: String - - """Identifies the size.""" - size: Int - - """Identifies the date and time when the object was last updated.""" - updatedAt: DateTime! - - """URL to download the asset.""" - url: URI! -} - -"""The connection type for RegistryPackageFile.""" -type RegistryPackageFileConnection { - """A list of edges.""" - edges: [RegistryPackageFileEdge] - - """A list of nodes.""" - nodes: [RegistryPackageFile] - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """Identifies the total count of items in the connection.""" - totalCount: Int! -} - -"""An edge in a connection.""" -type RegistryPackageFileEdge { - """A cursor for use in pagination.""" - cursor: String! - - """The item at the end of the edge.""" - node: RegistryPackageFile -} - -"""The possible states of a registry package file.""" -enum RegistryPackageFileState { - """Package file doesn't have a blob backing it.""" - NEW - - """All Package file contents have been uploaded.""" - UPLOADED -} - -"""Represents a single registry metadatum""" -input RegistryPackageMetadatum { - """Name of the metadatum.""" - name: String! - - """Value of the metadatum.""" - value: String! - - """True, if the metadatum can be updated if it already exists""" - update: Boolean -} - -"""Represents an owner of a registry package.""" -interface RegistryPackageOwner { - id: ID! - - """A list of registry packages under the owner.""" - registryPackages( - """Returns the elements in the list that come after the specified cursor.""" - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - - """Returns the first _n_ elements from the list.""" - first: Int - - """Returns the last _n_ elements from the list.""" - last: Int - - """Find registry package by name.""" - name: String - - """Find registry packages by their names.""" - names: [String] - - """Find registry packages in a repository.""" - repositoryId: ID - - """Filter registry package by type.""" - packageType: RegistryPackageType - - """Filter registry package by type (string).""" - registryPackageType: String - - """Filter registry package by whether it is publicly visible""" - publicOnly: Boolean = false - ): RegistryPackageConnection! -} - -"""Represents an interface to search packages on an object.""" -interface RegistryPackageSearch { - id: ID! - - """A list of registry packages for a particular search query.""" - registryPackagesForQuery( - """Returns the elements in the list that come after the specified cursor.""" - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - - """Returns the first _n_ elements from the list.""" - first: Int - - """Returns the last _n_ elements from the list.""" - last: Int - - """Find registry package by search query.""" - query: String - - """Filter registry package by type.""" - packageType: RegistryPackageType - ): RegistryPackageConnection! -} - -""" -Represents a object that contains package activity statistics such as downloads. -""" -type RegistryPackageStatistics { - """Number of times the package was downloaded this month.""" - downloadsThisMonth: Int! - - """Number of times the package was downloaded this week.""" - downloadsThisWeek: Int! - - """Number of times the package was downloaded this year.""" - downloadsThisYear: Int! - - """Number of times the package was downloaded today.""" - downloadsToday: Int! - - """Number of times the package was downloaded since it was created.""" - downloadsTotalCount: Int! -} - -"""A version tag contains the mapping between a tag name and a version.""" -type RegistryPackageTag implements Node { - id: ID! - - """Identifies the tag name of the version.""" - name: String! - - """version that the tag is associated with""" - version: RegistryPackageVersion -} - -"""The connection type for RegistryPackageTag.""" -type RegistryPackageTagConnection { - """A list of edges.""" - edges: [RegistryPackageTagEdge] - - """A list of nodes.""" - nodes: [RegistryPackageTag] - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """Identifies the total count of items in the connection.""" - totalCount: Int! -} - -"""An edge in a connection.""" -type RegistryPackageTagEdge { - """A cursor for use in pagination.""" - cursor: String! - - """The item at the end of the edge.""" - node: RegistryPackageTag -} - -"""The possible types of a registry package.""" -enum RegistryPackageType { - """An npm registry package.""" - NPM - - """A rubygems registry package.""" - RUBYGEMS - - """A maven registry package.""" - MAVEN - - """A docker image.""" - DOCKER - - """A debian package.""" - DEBIAN - - """A nuget package.""" - NUGET - - """A python package.""" - PYTHON -} + """The base ref name to filter the pull requests by.""" + baseRefName: String + + """Ordering options for pull requests returned from the connection.""" + orderBy: IssueOrder -""" -A package version contains the information about a specific package version. -""" -type RegistryPackageVersion implements Node { - """list of dependencies for this package""" - dependencies( """Returns the elements in the list that come after the specified cursor.""" after: String @@ -15276,125 +15819,149 @@ type RegistryPackageVersion implements Node { """Returns the last _n_ elements from the list.""" last: Int + ): PullRequestConnection! - """Find dependencies by type.""" - type: RegistryPackageDependencyType - ): RegistryPackageDependencyConnection! - - """A file associated with this registry package version""" - fileByName( - """A specific file to find.""" - filename: String! - ): RegistryPackageFile + """Branch protection rules for this ref""" + branchProtectionRule: BranchProtectionRule + id: ID! - """List of files associated with this registry package version""" - files( - """Returns the elements in the list that come after the specified cursor.""" - after: String + """The ref name.""" + name: String! - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String + """The ref's prefix, such as `refs/heads/` or `refs/tags/`.""" + prefix: String! - """Returns the first _n_ elements from the list.""" - first: Int + """Branch protection rules that are viewable by non-admins""" + refUpdateRule: RefUpdateRule - """Returns the last _n_ elements from the list.""" - last: Int - ): RegistryPackageFileConnection! - id: ID! + """The repository the ref belongs to.""" + repository: Repository! - """A single line of text to install this package version.""" - installationCommand: String + """The object the ref points to. Returns null when object does not exist.""" + target: GitObject +} - """Identifies the package manifest for this package version.""" - manifest: String +"""The connection type for Ref.""" +type RefConnection { + """A list of edges.""" + edges: [RefEdge] - """Identifies the platform this version was built for.""" - platform: String + """A list of nodes.""" + nodes: [Ref] - """Indicates whether this version is a pre-release.""" - preRelease: Boolean! + """Information to aid in pagination.""" + pageInfo: PageInfo! - """The README of this package version""" - readme: String + """Identifies the total count of items in the connection.""" + totalCount: Int! +} - """The HTML README of this package version""" - readmeHtml: HTML +"""An edge in a connection.""" +type RefEdge { + """A cursor for use in pagination.""" + cursor: String! - """Registry package associated with this version.""" - registryPackage: RegistryPackage + """The item at the end of the edge.""" + node: Ref +} - """Release associated with this package.""" - release: Release +"""Represents a 'referenced' event on a given `ReferencedSubject`.""" +type ReferencedEvent implements Node { + """Identifies the actor who performed the event.""" + actor: Actor - """Identifies the sha256.""" - sha256: String + """Identifies the commit associated with the 'referenced' event.""" + commit: Commit - """Identifies the size.""" - size: Int + """Identifies the repository associated with the 'referenced' event.""" + commitRepository: Repository! - """Statistics about package activity.""" - statistics: RegistryPackageVersionStatistics + """Identifies the date and time when the object was created.""" + createdAt: DateTime! + id: ID! - """Identifies the package version summary.""" - summary: String + """Reference originated in a different repository.""" + isCrossRepository: Boolean! """ - Time at which the most recent file upload for this package version finished + Checks if the commit message itself references the subject. Can be false in the case of a commit comment reference. """ - updatedAt: DateTime! - - """Identifies the version number.""" - version: String! + isDirectReference: Boolean! - """Can the current viewer edit this Package version.""" - viewerCanEdit: Boolean! + """Object referenced by event.""" + subject: ReferencedSubject! } -"""The connection type for RegistryPackageVersion.""" -type RegistryPackageVersionConnection { - """A list of edges.""" - edges: [RegistryPackageVersionEdge] +"""Any referencable object""" +union ReferencedSubject = Issue | PullRequest - """A list of nodes.""" - nodes: [RegistryPackageVersion] +"""Ways in which lists of git refs can be ordered upon return.""" +input RefOrder { + """The field in which to order refs by.""" + field: RefOrderField! - """Information to aid in pagination.""" - pageInfo: PageInfo! + """The direction in which to order refs by the specified field.""" + direction: OrderDirection! +} - """Identifies the total count of items in the connection.""" - totalCount: Int! +"""Properties by which ref connections can be ordered.""" +enum RefOrderField { + """Order refs by underlying commit date if the ref prefix is refs/tags/""" + TAG_COMMIT_DATE + + """Order refs by their alphanumeric name""" + ALPHABETICAL } -"""An edge in a connection.""" -type RegistryPackageVersionEdge { - """A cursor for use in pagination.""" - cursor: String! +"""A ref update rules for a viewer.""" +type RefUpdateRule { + """Can this branch be deleted.""" + allowsDeletions: Boolean! - """The item at the end of the edge.""" - node: RegistryPackageVersion + """Are force pushes allowed on this branch.""" + allowsForcePushes: Boolean! + + """Identifies the protection rule pattern.""" + pattern: String! + + """Number of approving reviews required to update matching branches.""" + requiredApprovingReviewCount: Int + + """ + List of required status check contexts that must pass for commits to be accepted to matching branches. + """ + requiredStatusCheckContexts: [String] + + """Are merge commits prohibited from being pushed to this branch.""" + requiresLinearHistory: Boolean! + + """Are commits required to be signed.""" + requiresSignatures: Boolean! + + """Can the viewer push to the branch""" + viewerCanPush: Boolean! } """ -Represents a object that contains package version activity statistics such as downloads. +Autogenerated input type of RegenerateEnterpriseIdentityProviderRecoveryCodes """ -type RegistryPackageVersionStatistics { - """Number of times the package was downloaded this month.""" - downloadsThisMonth: Int! - - """Number of times the package was downloaded this week.""" - downloadsThisWeek: Int! +input RegenerateEnterpriseIdentityProviderRecoveryCodesInput { + """The ID of the enterprise on which to set an identity provider.""" + enterpriseId: ID! - """Number of times the package was downloaded this year.""" - downloadsThisYear: Int! + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} - """Number of times the package was downloaded today.""" - downloadsToday: Int! +""" +Autogenerated return type of RegenerateEnterpriseIdentityProviderRecoveryCodes +""" +type RegenerateEnterpriseIdentityProviderRecoveryCodesPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String - """Number of times the package was downloaded since it was created.""" - downloadsTotalCount: Int! + """The identity provider for the enterprise.""" + identityProvider: EnterpriseIdentityProvider } """A release contains the content for a release.""" @@ -15636,6 +16203,24 @@ type RemoveEnterpriseAdminPayload { viewer: User } +"""Autogenerated input type of RemoveEnterpriseIdentityProvider""" +input RemoveEnterpriseIdentityProviderInput { + """The ID of the enterprise from which to remove the identity provider.""" + enterpriseId: ID! + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated return type of RemoveEnterpriseIdentityProvider""" +type RemoveEnterpriseIdentityProviderPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The identity provider that was removed from the enterprise.""" + identityProvider: EnterpriseIdentityProvider +} + """Autogenerated input type of RemoveEnterpriseOrganization""" input RemoveEnterpriseOrganizationInput { """ @@ -17277,12 +17862,15 @@ enum ReportedContentClassifiers { """An outdated piece of content""" OUTDATED + """A duplicated piece of content""" + DUPLICATE + """The content has been resolved""" RESOLVED } """A repository contains the content for a project.""" -type Repository implements Node & ProjectOwner & RegistryPackageOwner & RegistryPackageSearch & Subscribable & Starrable & UniformResourceLocatable & RepositoryInfo { +type Repository implements Node & ProjectOwner & PackageOwner & Subscribable & Starrable & UniformResourceLocatable & RepositoryInfo { """A list of users that can be assigned to issues in this repository.""" assignableUsers( """Filters users with query on user name and login""" @@ -17363,6 +17951,9 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry last: Int ): CommitCommentConnection! + """Returns a list of contact links associated to the repository""" + contactLinks: [RepositoryContactLink!] + """Identifies the date and time when the object was created.""" createdAt: DateTime! @@ -17372,6 +17963,11 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry """The Ref associated with the repository's default branch.""" defaultBranchRef: Ref + """ + Whether or not branches are automatically deleted when merged in this repository. + """ + deleteBranchOnMerge: Boolean! + """A list of deploy keys that are on this repository.""" deployKeys( """Returns the elements in the list that come after the specified cursor.""" @@ -17439,7 +18035,7 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry connection. For example, OWNER will include only repositories that the current viewer owns. """ - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + affiliations: [RepositoryAffiliation] """ Array of owner's affiliation options for repositories returned from the @@ -17468,9 +18064,15 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry last: Int ): RepositoryConnection! + """The funding links for this repository""" + fundingLinks: [FundingLink!]! + """Indicates if the repository has issues feature enabled.""" hasIssuesEnabled: Boolean! + """Indicates if the repository has the Projects feature enabled.""" + hasProjectsEnabled: Boolean! + """Indicates if the repository has wiki feature enabled.""" hasWikiEnabled: Boolean! @@ -17478,15 +18080,29 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry homepageUrl: URI id: ID! + """The interaction ability settings for this repository.""" + interactionAbility: RepositoryInteractionAbility + """Indicates if the repository is unmaintained.""" isArchived: Boolean! + """Returns true if blank issue creation is allowed""" + isBlankIssuesEnabled: Boolean! + """Returns whether or not this repository disabled.""" isDisabled: Boolean! + """Returns whether or not this repository is empty.""" + isEmpty: Boolean! + """Identifies if the repository is a fork.""" isFork: Boolean! + """ + Indicates if a repository is either owned by an organization, or is a private fork of an organization repository. + """ + isInOrganization: Boolean! + """Indicates if the repository has been locked or not.""" isLocked: Boolean! @@ -17496,11 +18112,17 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry """Identifies if the repository is private.""" isPrivate: Boolean! + """Returns true if this repository has a security policy""" + isSecurityPolicyEnabled: Boolean + """ Identifies if the repository is a template that can be used to generate new repositories. """ isTemplate: Boolean! + """Is this repository a user configuration repository?""" + isUserConfigurationRepository: Boolean! + """Returns a single issue from the current repository by number.""" issue( """The number for the issue to be returned.""" @@ -17515,6 +18137,9 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry number: Int! ): IssueOrPullRequest + """Returns a list of issue templates associated to the repository""" + issueTemplates: [IssueTemplate!] + """A list of issues that have been opened in the repository.""" issues( """Ordering options for issues returned from the connection.""" @@ -17552,6 +18177,9 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry """A list of labels associated with the repository.""" labels( + """Ordering options for labels returned from the connection.""" + orderBy: LabelOrder = {field: CREATED_AT, direction: ASC} + """Returns the elements in the list that come after the specified cursor.""" after: String @@ -17650,6 +18278,9 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry """Ordering options for milestones.""" orderBy: MilestoneOrder + + """Filters milestones with a query on the title""" + query: String ): MilestoneConnection """The repository's original mirror URL.""" @@ -17676,6 +18307,35 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry """The User owner of the repository.""" owner: RepositoryOwner! + """A list of packages under the owner.""" + packages( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the first _n_ elements from the list.""" + first: Int + + """Returns the last _n_ elements from the list.""" + last: Int + + """Find packages by their names.""" + names: [String] + + """Find packages in a repository by ID.""" + repositoryId: ID + + """Filter registry package by type.""" + packageType: PackageType + + """Ordering of the returned packages.""" + orderBy: PackageOrder = {field: CREATED_AT, direction: DESC} + ): PackageConnection! + """The repository parent, if this is a fork.""" parent: Repository @@ -17775,6 +18435,9 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry """Fetch a list of refs from the repository""" refs( + """Filters refs with query on name""" + query: String + """Returns the elements in the list that come after the specified cursor.""" after: String @@ -17799,64 +18462,6 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry orderBy: RefOrder ): RefConnection - """A list of registry packages under the owner.""" - registryPackages( - """Returns the elements in the list that come after the specified cursor.""" - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - - """Returns the first _n_ elements from the list.""" - first: Int - - """Returns the last _n_ elements from the list.""" - last: Int - - """Find registry package by name.""" - name: String - - """Find registry packages by their names.""" - names: [String] - - """Find registry packages in a repository.""" - repositoryId: ID - - """Filter registry package by type.""" - packageType: RegistryPackageType - - """Filter registry package by type (string).""" - registryPackageType: String - - """Filter registry package by whether it is publicly visible""" - publicOnly: Boolean = false - ): RegistryPackageConnection! - - """A list of registry packages for a particular search query.""" - registryPackagesForQuery( - """Returns the elements in the list that come after the specified cursor.""" - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - - """Returns the first _n_ elements from the list.""" - first: Int - - """Returns the last _n_ elements from the list.""" - last: Int - - """Find registry package by search query.""" - query: String - - """Filter registry package by type.""" - packageType: RegistryPackageType - ): RegistryPackageConnection! - """Lookup a single release given various criteria.""" release( """The name of the Tag the Release was created from""" @@ -17903,6 +18508,9 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry """The HTTP path for this repository""" resourcePath: URI! + """The security policy URL.""" + securityPolicyUrl: URI + """ A description of the repository, rendered to HTML without any links in it. """ @@ -17917,6 +18525,12 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry """The SSH URL to clone this repository""" sshUrl: GitSSHRemote! + """ + Returns a count of how many stargazers there are on this object + + """ + stargazerCount: Int! + """A list of users who have starred this starrable.""" stargazers( """Returns the elements in the list that come after the specified cursor.""" @@ -17937,6 +18551,29 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry orderBy: StarOrder ): StargazerConnection! + """ + Returns a list of all submodules in this repository parsed from the + .gitmodules file as of the default branch's HEAD commit. + """ + submodules( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the first _n_ elements from the list.""" + first: Int + + """Returns the last _n_ elements from the list.""" + last: Int + ): SubmoduleConnection! + + """Temporary authentication token for cloning this repository.""" + tempCloneToken: String + """The repository from which this repository was generated, if any.""" templateRepository: Repository @@ -17965,6 +18602,14 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry """Indicates whether the viewer can update the topics of this repository.""" viewerCanUpdateTopics: Boolean! + """The last commit email for the viewer.""" + viewerDefaultCommitEmail: String + + """ + The last used merge method by the viewer or the default for the repository. + """ + viewerDefaultMergeMethod: PullRequestMergeMethod! + """ Returns a boolean indicating whether the viewing user has starred this starrable. """ @@ -17975,6 +18620,9 @@ type Repository implements Node & ProjectOwner & RegistryPackageOwner & Registry """ viewerPermission: RepositoryPermission + """A list of emails this viewer can commit with.""" + viewerPossibleCommitEmails: [String!] + """ Identifies if the viewer is watching, not watching, or ignoring the subscribable entity. """ @@ -18045,15 +18693,6 @@ interface RepositoryAuditEntryData { repositoryUrl: URI } -"""The affiliation type between collaborator and repository.""" -enum RepositoryCollaboratorAffiliation { - """All collaborators of the repository.""" - ALL - - """All outside collaborators of an organization-owned repository.""" - OUTSIDE -} - """The connection type for User.""" type RepositoryCollaboratorConnection { """A list of edges.""" @@ -18100,6 +18739,18 @@ type RepositoryConnection { totalDiskUsage: Int! } +"""A repository contact link.""" +type RepositoryContactLink { + """The contact link purpose.""" + about: String! + + """The contact link name.""" + name: String! + + """The contact link URL.""" + url: URI! +} + """The reason a repository is listed as 'contributed'.""" enum RepositoryContributionType { """Created a commit""" @@ -18146,6 +18797,9 @@ interface RepositoryInfo { """Indicates if the repository has issues feature enabled.""" hasIssuesEnabled: Boolean! + """Indicates if the repository has the Projects feature enabled.""" + hasProjectsEnabled: Boolean! + """Indicates if the repository has wiki feature enabled.""" hasWikiEnabled: Boolean! @@ -18158,6 +18812,11 @@ interface RepositoryInfo { """Identifies if the repository is a fork.""" isFork: Boolean! + """ + Indicates if a repository is either owned by an organization, or is a private fork of an organization repository. + """ + isInOrganization: Boolean! + """Indicates if the repository has been locked or not.""" isLocked: Boolean! @@ -18219,16 +18878,84 @@ interface RepositoryInfo { usesCustomOpenGraphImage: Boolean! } +"""Repository interaction limit that applies to this object.""" +type RepositoryInteractionAbility { + """The time the currently active limit expires.""" + expiresAt: DateTime + + """The current limit that is enabled on this object.""" + limit: RepositoryInteractionLimit! + + """The origin of the currently active interaction limit.""" + origin: RepositoryInteractionLimitOrigin! +} + +"""A repository interaction limit.""" +enum RepositoryInteractionLimit { + """ + Users that have recently created their account will be unable to interact with the repository. + """ + EXISTING_USERS + + """ + Users that have not previously committed to a repository’s default branch will be unable to interact with the repository. + """ + CONTRIBUTORS_ONLY + + """ + Users that are not collaborators will not be able to interact with the repository. + """ + COLLABORATORS_ONLY + + """No interaction limits are enabled.""" + NO_LIMIT +} + +"""The length for a repository interaction limit to be enabled for.""" +enum RepositoryInteractionLimitExpiry { + """The interaction limit will expire after 1 day.""" + ONE_DAY + + """The interaction limit will expire after 3 days.""" + THREE_DAYS + + """The interaction limit will expire after 1 week.""" + ONE_WEEK + + """The interaction limit will expire after 1 month.""" + ONE_MONTH + + """The interaction limit will expire after 6 months.""" + SIX_MONTHS +} + +"""Indicates where an interaction limit is configured.""" +enum RepositoryInteractionLimitOrigin { + """A limit that is configured at the repository level.""" + REPOSITORY + + """A limit that is configured at the organization level.""" + ORGANIZATION + + """A limit that is configured at the user-wide level.""" + USER +} + """An invitation for a user to be added to a repository.""" type RepositoryInvitation implements Node { + """The email address that received the invitation.""" + email: String id: ID! """The user who received the invitation.""" - invitee: User! + invitee: User """The user who created the invitation.""" inviter: User! + """The permalink for this repository invitation.""" + permalink: URI! + """The permission granted on this repository by this invitation.""" permission: RepositoryPermission! @@ -18236,6 +18963,21 @@ type RepositoryInvitation implements Node { repository: RepositoryInfo } +"""The connection type for RepositoryInvitation.""" +type RepositoryInvitationConnection { + """A list of edges.""" + edges: [RepositoryInvitationEdge] + + """A list of nodes.""" + nodes: [RepositoryInvitation] + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + """An edge in a connection.""" type RepositoryInvitationEdge { """A cursor for use in pagination.""" @@ -18258,9 +19000,6 @@ input RepositoryInvitationOrder { enum RepositoryInvitationOrderField { """Order repository invitations by creation time""" CREATED_AT - - """Order repository invitations by invitee login""" - INVITEE_LOGIN } """The possible reasons a given repository could be in a locked state.""" @@ -18336,7 +19075,7 @@ interface RepositoryOwner { connection. For example, OWNER will include only repositories that the current viewer owns. """ - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + affiliations: [RepositoryAffiliation] """ Array of owner's affiliation options for repositories returned from the @@ -18605,6 +19344,9 @@ type RepositoryVisibilityChangeEnableAuditEntry implements Node & AuditEntry & E """A alert for a repository with an affected vulnerability.""" type RepositoryVulnerabilityAlert implements Node & RepositoryNode { + """When was the alert created?""" + createdAt: DateTime! + """The reason the alert was dismissed""" dismissReason: String @@ -18671,7 +19413,7 @@ enum RequestableCheckStatusState { } """Types that can be requested reviewers.""" -union RequestedReviewer = User | Team | Mannequin +union RequestedReviewer = Mannequin | Team | User """Autogenerated input type of RequestReviews""" input RequestReviewsInput { @@ -18693,6 +19435,9 @@ input RequestReviewsInput { """Autogenerated return type of RequestReviews""" type RequestReviewsPayload { + """Identifies the actor who performed the event.""" + actor: Actor + """A unique identifier for the client performing the mutation.""" clientMutationId: String @@ -18783,7 +19528,7 @@ type ReviewDismissalAllowance implements Node { } """Types that can be an actor.""" -union ReviewDismissalAllowanceActor = User | Team +union ReviewDismissalAllowanceActor = Team | User """The connection type for ReviewDismissalAllowance.""" type ReviewDismissalAllowanceConnection { @@ -18856,6 +19601,9 @@ type ReviewDismissedEvent implements Node & UniformResourceLocatable { """A request for a user to review a pull request.""" type ReviewRequest implements Node { + """Whether this request was created for a code owner""" + asCodeOwner: Boolean! + """Identifies the primary key from the database.""" databaseId: Int id: ID! @@ -18934,6 +19682,9 @@ type ReviewStatusHovercardContext implements HovercardContext { """An octicon to accompany this context""" octicon: String! + + """The current status of the pull request with respect to code review.""" + reviewDecision: PullRequestReviewDecision } """ @@ -19029,7 +19780,7 @@ enum SavedReplyOrderField { } """The results of a search.""" -union SearchResultItem = Issue | PullRequest | Repository | User | Organization | MarketplaceListing | App +union SearchResultItem = App | Issue | MarketplaceListing | Organization | PullRequest | Repository | User """A list of results that matched against a search query.""" type SearchResultItemConnection { @@ -19100,6 +19851,9 @@ type SecurityAdvisory implements Node { """The organization that originated the advisory""" origin: String! + """The permalink for the advisory""" + permalink: URI + """When the advisory was published""" publishedAt: DateTime! @@ -19343,6 +20097,117 @@ enum SecurityVulnerabilityOrderField { UPDATED_AT } +"""Autogenerated input type of SetEnterpriseIdentityProvider""" +input SetEnterpriseIdentityProviderInput { + """The ID of the enterprise on which to set an identity provider.""" + enterpriseId: ID! + + """The URL endpoint for the identity provider's SAML SSO.""" + ssoUrl: URI! + + """The Issuer Entity ID for the SAML identity provider""" + issuer: String + + """ + The x509 certificate used by the identity provider to sign assertions and responses. + """ + idpCertificate: String! + + """ + The signature algorithm used to sign SAML requests for the identity provider. + """ + signatureMethod: SamlSignatureAlgorithm! + + """ + The digest algorithm used to sign SAML requests for the identity provider. + """ + digestMethod: SamlDigestAlgorithm! + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated return type of SetEnterpriseIdentityProvider""" +type SetEnterpriseIdentityProviderPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The identity provider for the enterprise.""" + identityProvider: EnterpriseIdentityProvider +} + +"""Autogenerated input type of SetOrganizationInteractionLimit""" +input SetOrganizationInteractionLimitInput { + """The ID of the organization to set a limit for.""" + organizationId: ID! + + """The limit to set.""" + limit: RepositoryInteractionLimit! + + """When this limit should expire.""" + expiry: RepositoryInteractionLimitExpiry + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated return type of SetOrganizationInteractionLimit""" +type SetOrganizationInteractionLimitPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The organization that the interaction limit was set for.""" + organization: Organization +} + +"""Autogenerated input type of SetRepositoryInteractionLimit""" +input SetRepositoryInteractionLimitInput { + """The ID of the repository to set a limit for.""" + repositoryId: ID! + + """The limit to set.""" + limit: RepositoryInteractionLimit! + + """When this limit should expire.""" + expiry: RepositoryInteractionLimitExpiry + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated return type of SetRepositoryInteractionLimit""" +type SetRepositoryInteractionLimitPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The repository that the interaction limit was set for.""" + repository: Repository +} + +"""Autogenerated input type of SetUserInteractionLimit""" +input SetUserInteractionLimitInput { + """The ID of the user to set a limit for.""" + userId: ID! + + """The limit to set.""" + limit: RepositoryInteractionLimit! + + """When this limit should expire.""" + expiry: RepositoryInteractionLimitExpiry + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated return type of SetUserInteractionLimit""" +type SetUserInteractionLimitPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The user that the interaction limit was set for.""" + user: User +} + """Represents an S/MIME signature on a Commit or Tag.""" type SmimeSignature implements GitSignature { """Email used to sign this object.""" @@ -19372,9 +20237,18 @@ type SmimeSignature implements GitSignature { wasSignedByGitHub: Boolean! } +"""Entites that can sponsor others via GitHub Sponsors""" +union Sponsor = Organization | User + """Entities that can be sponsored through GitHub Sponsors""" interface Sponsorable { - """The GitHub Sponsors listing for this user.""" + """True if this user/organization has a GitHub Sponsors listing.""" + hasSponsorsListing: Boolean! + + """True if the viewer is sponsored by this user/organization.""" + isSponsoringViewer: Boolean! + + """The GitHub Sponsors listing for this user or organization.""" sponsorsListing: SponsorsListing """This object's sponsorships as the maintainer.""" @@ -19425,6 +20299,12 @@ interface Sponsorable { """ orderBy: SponsorshipOrder ): SponsorshipConnection! + + """Whether or not the viewer is able to sponsor this user/organization.""" + viewerCanSponsor: Boolean! + + """True if the viewer is sponsoring this user/organization.""" + viewerIsSponsoring: Boolean! } """A sponsorship relationship between a sponsor and a maintainer""" @@ -19433,16 +20313,16 @@ type Sponsorship implements Node { createdAt: DateTime! id: ID! - """The entity that is being sponsored""" - maintainer: User! - """The privacy level for this sponsorship.""" privacyLevel: SponsorshipPrivacy! """ - The entity that is sponsoring. Returns null if the sponsorship is private + The user or organization that is sponsoring, if you have permission to view them. """ - sponsor: User + sponsorEntity: Sponsor + + """The entity that is being sponsored""" + sponsorable: Sponsorable! """The associated sponsorship tier""" tier: SponsorsTier @@ -19498,6 +20378,9 @@ enum SponsorshipPrivacy { """A GitHub Sponsors listing.""" type SponsorsListing implements Node { + """Identifies the date and time when the object was created.""" + createdAt: DateTime! + """The full description of the listing.""" fullDescription: String! @@ -19685,6 +20568,12 @@ enum StarOrderField { interface Starrable { id: ID! + """ + Returns a count of how many stargazers there are on this object + + """ + stargazerCount: Int! + """A list of users who have starred this starrable.""" stargazers( """Returns the elements in the list that come after the specified cursor.""" @@ -19716,6 +20605,11 @@ type StarredRepositoryConnection { """A list of edges.""" edges: [StarredRepositoryEdge] + """ + Is the list of stars for this user truncated? This is true for users that have many stars. + """ + isOverLimit: Boolean! + """A list of nodes.""" nodes: [Repository] @@ -19738,6 +20632,23 @@ type StarredRepositoryEdge { """Represents a commit status.""" type Status implements Node { + """A list of status contexts and check runs for this commit.""" + combinedContexts( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the first _n_ elements from the list.""" + first: Int + + """Returns the last _n_ elements from the list.""" + last: Int + ): StatusCheckRollupContextConnection! + """The commit this status is attached to.""" commit: Commit @@ -19755,6 +20666,60 @@ type Status implements Node { state: StatusState! } +"""Represents the rollup for both the check runs and status for a commit.""" +type StatusCheckRollup implements Node { + """The commit the status and check runs are attached to.""" + commit: Commit + + """A list of status contexts and check runs for this commit.""" + contexts( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the first _n_ elements from the list.""" + first: Int + + """Returns the last _n_ elements from the list.""" + last: Int + ): StatusCheckRollupContextConnection! + id: ID! + + """The combined status for the commit.""" + state: StatusState! +} + +"""Types that can be inside a StatusCheckRollup context.""" +union StatusCheckRollupContext = CheckRun | StatusContext + +"""The connection type for StatusCheckRollupContext.""" +type StatusCheckRollupContextConnection { + """A list of edges.""" + edges: [StatusCheckRollupContextEdge] + + """A list of nodes.""" + nodes: [StatusCheckRollupContext] + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""An edge in a connection.""" +type StatusCheckRollupContextEdge { + """A cursor for use in pagination.""" + cursor: String! + + """The item at the end of the edge.""" + node: StatusCheckRollupContext +} + """Represents an individual commit status context""" type StatusContext implements Node { """ @@ -19808,8 +20773,11 @@ enum StatusState { """Autogenerated input type of SubmitPullRequestReview""" input SubmitPullRequestReviewInput { + """The Pull Request ID to submit any pending reviews.""" + pullRequestId: ID + """The Pull Request Review ID to submit.""" - pullRequestReviewId: ID! + pullRequestReviewId: ID """The event to send to the Pull Request Review.""" event: PullRequestReviewEvent! @@ -19821,13 +20789,59 @@ input SubmitPullRequestReviewInput { clientMutationId: String } -"""Autogenerated return type of SubmitPullRequestReview""" -type SubmitPullRequestReviewPayload { - """A unique identifier for the client performing the mutation.""" - clientMutationId: String +"""Autogenerated return type of SubmitPullRequestReview""" +type SubmitPullRequestReviewPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The submitted pull request review.""" + pullRequestReview: PullRequestReview +} + +""" +A pointer to a repository at a specific revision embedded inside another repository. +""" +type Submodule { + """The branch of the upstream submodule for tracking updates""" + branch: String + + """The git URL of the submodule repository""" + gitUrl: URI! + + """The name of the submodule in .gitmodules""" + name: String! + + """The path in the superproject that this submodule is located in""" + path: String! + + """ + The commit revision of the subproject repository being tracked by the submodule + """ + subprojectCommitOid: GitObjectID +} + +"""The connection type for Submodule.""" +type SubmoduleConnection { + """A list of edges.""" + edges: [SubmoduleEdge] + + """A list of nodes.""" + nodes: [Submodule] + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """Identifies the total count of items in the connection.""" + totalCount: Int! +} + +"""An edge in a connection.""" +type SubmoduleEdge { + """A cursor for use in pagination.""" + cursor: String! - """The submitted pull request review.""" - pullRequestReview: PullRequestReview + """The item at the end of the edge.""" + node: Submodule } """Entities that can be subscribed to for web and email notifications.""" @@ -19972,6 +20986,9 @@ type Team implements Node & Subscribable & MemberStatusable { """Identifies the date and time when the object was created.""" createdAt: DateTime! + """Identifies the primary key from the database.""" + databaseId: Int + """The description of the team.""" description: String @@ -21195,6 +22212,12 @@ type Topic implements Node & Starrable { first: Int = 3 ): [Topic!]! + """ + Returns a count of how many stargazers there are on this object + + """ + stargazerCount: Int! + """A list of users who have starred this starrable.""" stargazers( """Returns the elements in the list that come after the specified cursor.""" @@ -21230,30 +22253,6 @@ interface TopicAuditEntryData { topicName: String } -"""The connection type for Topic.""" -type TopicConnection { - """A list of edges.""" - edges: [TopicEdge] - - """A list of nodes.""" - nodes: [Topic] - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """Identifies the total count of items in the connection.""" - totalCount: Int! -} - -"""An edge in a connection.""" -type TopicEdge { - """A cursor for use in pagination.""" - cursor: String! - - """The item at the end of the edge.""" - node: Topic -} - """Reason that the suggested topic is declined.""" enum TopicSuggestionDeclineReason { """The suggested topic is not relevant to the repository.""" @@ -21332,6 +22331,12 @@ type Tree implements Node & GitObject { """Represents a Git tree entry.""" type TreeEntry { + """The extension of the file""" + extension: String + + """Whether or not this tree entry is generated""" + isGenerated: Boolean! + """Entry file mode.""" mode: Int! @@ -21344,13 +22349,39 @@ type TreeEntry { """Entry file Git object ID.""" oid: GitObjectID! + """The full path of the file.""" + path: String + """The Repository the tree entry belongs to""" repository: Repository! + """ + If the TreeEntry is for a directory occupied by a submodule project, this returns the corresponding submodule + """ + submodule: Submodule + """Entry file type.""" type: String! } +"""Autogenerated input type of UnarchiveRepository""" +input UnarchiveRepositoryInput { + """The ID of the repository to unarchive.""" + repositoryId: ID! + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated return type of UnarchiveRepository""" +type UnarchiveRepositoryPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The repository that was unarchived.""" + repository: Repository +} + """Represents an 'unassigned' event on any assignable object.""" type UnassignedEvent implements Node { """Identifies the actor who performed the event.""" @@ -21478,7 +22509,7 @@ type UnlockedEvent implements Node { """Autogenerated input type of UnlockLockable""" input UnlockLockableInput { - """ID of the issue or pull request to be unlocked.""" + """ID of the item to be unlocked.""" lockableId: ID! """A unique identifier for the client performing the mutation.""" @@ -21487,6 +22518,9 @@ input UnlockLockableInput { """Autogenerated return type of UnlockLockable""" type UnlockLockablePayload { + """Identifies the actor who performed the event.""" + actor: Actor + """A unique identifier for the client performing the mutation.""" clientMutationId: String @@ -21494,6 +22528,52 @@ type UnlockLockablePayload { unlockedRecord: Lockable } +""" +Represents an 'unmarked_as_duplicate' event on a given issue or pull request. +""" +type UnmarkedAsDuplicateEvent implements Node { + """Identifies the actor who performed the event.""" + actor: Actor + + """ + The authoritative issue or pull request which has been duplicated by another. + """ + canonical: IssueOrPullRequest + + """Identifies the date and time when the object was created.""" + createdAt: DateTime! + + """ + The issue or pull request which has been marked as a duplicate of another. + """ + duplicate: IssueOrPullRequest + id: ID! + + """Canonical and duplicate belong to different repositories.""" + isCrossRepository: Boolean! +} + +"""Autogenerated input type of UnmarkFileAsViewed""" +input UnmarkFileAsViewedInput { + """The Node ID of the pull request.""" + pullRequestId: ID! + + """The path of the file to mark as unviewed""" + path: String! + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated return type of UnmarkFileAsViewed""" +type UnmarkFileAsViewedPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The updated pull request.""" + pullRequest: PullRequest +} + """Autogenerated input type of UnmarkIssueAsDuplicate""" input UnmarkIssueAsDuplicateInput { """ID of the issue or pull request currently marked as a duplicate.""" @@ -21526,13 +22606,13 @@ input UnminimizeCommentInput { clientMutationId: String } -"""Autogenerated input type of UnpinIssue""" -input UnpinIssueInput { - """The ID of the issue to be unpinned""" - issueId: ID! - +"""Autogenerated return type of UnminimizeComment""" +type UnminimizeCommentPayload { """A unique identifier for the client performing the mutation.""" clientMutationId: String + + """The comment that was unminimized.""" + unminimizedComment: Minimizable } """Represents an 'unpinned' event on a given issue or pull request.""" @@ -21608,6 +22688,15 @@ input UpdateBranchProtectionRuleInput { """Are commits required to be signed.""" requiresCommitSignatures: Boolean + """Are merge commits prohibited from being pushed to this branch.""" + requiresLinearHistory: Boolean + + """Are force pushes allowed on this branch.""" + allowsForcePushes: Boolean + + """Can this branch be deleted.""" + allowsDeletions: Boolean + """Can admins overwrite branch protection.""" isAdminEnforced: Boolean @@ -21730,40 +22819,6 @@ type UpdateCheckSuitePreferencesPayload { repository: Repository } -""" -Autogenerated input type of UpdateEnterpriseActionExecutionCapabilitySetting -""" -input UpdateEnterpriseActionExecutionCapabilitySettingInput { - """ - The ID of the enterprise on which to set the members can create repositories setting. - """ - enterpriseId: ID! - - """ - The value for the action execution capability setting on the enterprise. - """ - capability: ActionExecutionCapabilitySetting! - - """A unique identifier for the client performing the mutation.""" - clientMutationId: String -} - -""" -Autogenerated return type of UpdateEnterpriseActionExecutionCapabilitySetting -""" -type UpdateEnterpriseActionExecutionCapabilitySettingPayload { - """A unique identifier for the client performing the mutation.""" - clientMutationId: String - - """The enterprise with the updated action execution capability setting.""" - enterprise: Enterprise - - """ - A message confirming the result of updating the action execution capability setting. - """ - message: String -} - """Autogenerated input type of UpdateEnterpriseAdministratorRole""" input UpdateEnterpriseAdministratorRoleInput { """The ID of the Enterprise which the admin belongs to.""" @@ -22313,6 +23368,56 @@ type UpdateEnterpriseTwoFactorAuthenticationRequiredSettingPayload { message: String } +"""Autogenerated input type of UpdateIpAllowListEnabledSetting""" +input UpdateIpAllowListEnabledSettingInput { + """The ID of the owner on which to set the IP allow list enabled setting.""" + ownerId: ID! + + """The value for the IP allow list enabled setting.""" + settingValue: IpAllowListEnabledSettingValue! + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated return type of UpdateIpAllowListEnabledSetting""" +type UpdateIpAllowListEnabledSettingPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The IP allow list owner on which the setting was updated.""" + owner: IpAllowListOwner +} + +"""Autogenerated input type of UpdateIpAllowListEntry""" +input UpdateIpAllowListEntryInput { + """The ID of the IP allow list entry to update.""" + ipAllowListEntryId: ID! + + """An IP address or range of addresses in CIDR notation.""" + allowListValue: String! + + """An optional name for the IP allow list entry.""" + name: String + + """ + Whether the IP allow list entry is active when an IP allow list is enabled. + """ + isActive: Boolean! + + """A unique identifier for the client performing the mutation.""" + clientMutationId: String +} + +"""Autogenerated return type of UpdateIpAllowListEntry""" +type UpdateIpAllowListEntryPayload { + """A unique identifier for the client performing the mutation.""" + clientMutationId: String + + """The IP allow list entry that was updated.""" + ipAllowListEntry: IpAllowListEntry +} + """Autogenerated input type of UpdateIssueComment""" input UpdateIssueCommentInput { """The ID of the IssueComment to modify.""" @@ -22366,6 +23471,9 @@ input UpdateIssueInput { """Autogenerated return type of UpdateIssue""" type UpdateIssuePayload { + """Identifies the actor who performed the event.""" + actor: Actor + """A unique identifier for the client performing the mutation.""" clientMutationId: String @@ -22490,6 +23598,9 @@ input UpdatePullRequestInput { """Autogenerated return type of UpdatePullRequest""" type UpdatePullRequestPayload { + """Identifies the actor who performed the event.""" + actor: Actor + """A unique identifier for the client performing the mutation.""" clientMutationId: String @@ -22719,7 +23830,7 @@ scalar URI """ A user is an individual's account on GitHub that owns repositories and can make new content. """ -type User implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch & ProjectOwner & RepositoryOwner & UniformResourceLocatable & ProfileOwner & Sponsorable { +type User implements Node & Actor & PackageOwner & ProjectOwner & RepositoryOwner & UniformResourceLocatable & ProfileOwner & Sponsorable { """ Determine if this repository owner has any items that can be pinned to their profile. """ @@ -22871,6 +23982,9 @@ type User implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch last: Int ): GistConnection! + """True if this user/organization has a GitHub Sponsors listing.""" + hasSponsorsListing: Boolean! + """The hovercard information for this user in a given context""" hovercard( """The ID of the subject to get the hovercard in the context of""" @@ -22878,6 +23992,9 @@ type User implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch ): Hovercard! id: ID! + """The interaction ability settings for this user.""" + interactionAbility: RepositoryInteractionAbility + """ Whether or not this user is a participant in the GitHub Security Bug Bounty. """ @@ -22900,11 +24017,17 @@ type User implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch """Whether or not this user is a site administrator.""" isSiteAdmin: Boolean! + """True if the viewer is sponsored by this user/organization.""" + isSponsoringViewer: Boolean! + """Whether or not this user is the viewing user.""" isViewer: Boolean! """A list of issue comments made by this user.""" issueComments( + """Ordering options for issue comments returned from the connection.""" + orderBy: IssueCommentOrder + """Returns the elements in the list that come after the specified cursor.""" after: String @@ -22970,6 +24093,14 @@ type User implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch login: String! ): Organization + """ + Verified email addresses that match verified domains for a specified organization the user is a member of. + """ + organizationVerifiedDomainEmails( + """The login of the organization to match verified domains from.""" + login: String! + ): [String!]! + """A list of organizations the user belongs to.""" organizations( """Returns the elements in the list that come after the specified cursor.""" @@ -22987,6 +24118,35 @@ type User implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch last: Int ): OrganizationConnection! + """A list of packages under the owner.""" + packages( + """Returns the elements in the list that come after the specified cursor.""" + after: String + + """ + Returns the elements in the list that come before the specified cursor. + """ + before: String + + """Returns the first _n_ elements from the list.""" + first: Int + + """Returns the last _n_ elements from the list.""" + last: Int + + """Find packages by their names.""" + names: [String] + + """Find packages in a repository by ID.""" + repositoryId: ID + + """Filter registry package by type.""" + packageType: PackageType + + """Ordering of the returned packages.""" + orderBy: PackageOrder = {field: CREATED_AT, direction: DESC} + ): PackageConnection! + """ A list of repositories and gists this profile owner can pin to their profile. """ @@ -23123,64 +24283,6 @@ type User implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch last: Int ): PullRequestConnection! - """A list of registry packages under the owner.""" - registryPackages( - """Returns the elements in the list that come after the specified cursor.""" - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - - """Returns the first _n_ elements from the list.""" - first: Int - - """Returns the last _n_ elements from the list.""" - last: Int - - """Find registry package by name.""" - name: String - - """Find registry packages by their names.""" - names: [String] - - """Find registry packages in a repository.""" - repositoryId: ID - - """Filter registry package by type.""" - packageType: RegistryPackageType - - """Filter registry package by type (string).""" - registryPackageType: String - - """Filter registry package by whether it is publicly visible""" - publicOnly: Boolean = false - ): RegistryPackageConnection! - - """A list of registry packages for a particular search query.""" - registryPackagesForQuery( - """Returns the elements in the list that come after the specified cursor.""" - after: String - - """ - Returns the elements in the list that come before the specified cursor. - """ - before: String - - """Returns the first _n_ elements from the list.""" - first: Int - - """Returns the last _n_ elements from the list.""" - last: Int - - """Find registry package by search query.""" - query: String - - """Filter registry package by type.""" - packageType: RegistryPackageType - ): RegistryPackageConnection! - """A list of repositories that the user owns.""" repositories( """If non-null, filters repositories according to privacy""" @@ -23194,7 +24296,7 @@ type User implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch connection. For example, OWNER will include only repositories that the current viewer owns. """ - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + affiliations: [RepositoryAffiliation] """ Array of owner's affiliation options for repositories returned from the @@ -23294,7 +24396,7 @@ type User implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch orderBy: SavedReplyOrder = {field: UPDATED_AT, direction: DESC} ): SavedReplyConnection - """The GitHub Sponsors listing for this user.""" + """The GitHub Sponsors listing for this user or organization.""" sponsorsListing: SponsorsListing """This object's sponsorships as the maintainer.""" @@ -23348,14 +24450,6 @@ type User implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch """Repositories the user has starred.""" starredRepositories( - """ - Filters starred repositories to only return repositories owned by the viewer. - """ - ownedByViewer: Boolean - - """Order for connection""" - orderBy: StarOrder - """Returns the elements in the list that come after the specified cursor.""" after: String @@ -23369,6 +24463,14 @@ type User implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch """Returns the last _n_ elements from the list.""" last: Int + + """ + Filters starred repositories to only return repositories owned by the viewer. + """ + ownedByViewer: Boolean + + """Order for connection""" + orderBy: StarOrder ): StarredRepositoryConnection! """The user's description of what they're currently doing.""" @@ -23400,6 +24502,9 @@ type User implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch since: DateTime ): RepositoryConnection! + """The user's Twitter username.""" + twitterUsername: String + """Identifies the date and time when the object was last updated.""" updatedAt: DateTime! @@ -23415,9 +24520,15 @@ type User implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch """Whether or not the viewer is able to follow the user.""" viewerCanFollow: Boolean! + """Whether or not the viewer is able to sponsor this user/organization.""" + viewerCanSponsor: Boolean! + """Whether or not this user is followed by the viewer.""" viewerIsFollowing: Boolean! + """True if the viewer is sponsoring this user/organization.""" + viewerIsSponsoring: Boolean! + """A list of repositories the given user is watching.""" watching( """If non-null, filters repositories according to privacy""" @@ -23426,8 +24537,12 @@ type User implements Node & Actor & RegistryPackageOwner & RegistryPackageSearch """Ordering options for repositories returned from the connection""" orderBy: RepositoryOrder - """Affiliation options for repositories returned from the connection""" - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR, ORGANIZATION_MEMBER] + """ + Affiliation options for repositories returned from the connection. If none + specified, the results will include repositories for which the current + viewer is an owner or collaborator, or member. + """ + affiliations: [RepositoryAffiliation] """ Array of owner's affiliation options for repositories returned from the @@ -23567,6 +24682,18 @@ type UserEdge { node: User } +"""Email attributes from External Identity""" +type UserEmailMetadata { + """Boolean to identify primary emails""" + primary: Boolean + + """Type of email""" + type: String + + """Email id""" + value: String! +} + """The user's description of what they're currently doing.""" type UserStatus implements Node { """Identifies the date and time when the object was created.""" diff --git a/img/unlock.svg b/img/unlock.svg new file mode 100644 index 0000000000..9e7927c140 --- /dev/null +++ b/img/unlock.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/lib/atom/octicon.js b/lib/atom/octicon.js index 1f306dda38..c4a3d14676 100644 --- a/lib/atom/octicon.js +++ b/lib/atom/octicon.js @@ -2,8 +2,32 @@ import React from 'react'; import PropTypes from 'prop-types'; import cx from 'classnames'; +/* eslint-disable max-len */ +const SVG = { + unlock: { + viewBox: '0 0 24 16', + element: ( + + ), + }, +}; +/* eslint-enable max-len */ + export default function Octicon({icon, ...others}) { const classes = cx('icon', `icon-${icon}`, others.className); + + const svgContent = SVG[icon]; + if (svgContent) { + return ( + + {svgContent.element} + + ); + } + return ; } diff --git a/lib/atom/pane-item.js b/lib/atom/pane-item.js index f4c306c2de..66563b9949 100644 --- a/lib/atom/pane-item.js +++ b/lib/atom/pane-item.js @@ -71,6 +71,37 @@ export default class PaneItem extends React.Component { } componentDidMount() { + // Listen for and adopt StubItems that are added after this component has + // already been mounted. + this.subs.add(this.props.workspace.onDidAddPaneItem(({item}) => { + if (!item._getStub) { + return; + } + const stub = item._getStub(); + + if (stub.getRealItem() !== null) { + return; + } + + const match = this.state.uriPattern.matches(item.getURI()); + if (!match.ok()) { + return; + } + + const openItem = new OpenItem(match, stub.getElement(), stub); + openItem.hydrateStub({ + copy: () => this.copyOpenItem(openItem), + }); + if (this.props.className) { + openItem.addClassName(this.props.className); + } + this.registerCloseListener(item, openItem); + + this.setState(prevState => ({ + currentlyOpen: [...prevState.currentlyOpen, openItem], + })); + })); + for (const openItem of this.state.currentlyOpen) { this.registerCloseListener(openItem.stubItem, openItem); diff --git a/lib/containers/__generated__/aggregatedReviewsContainerRefetchQuery.graphql.js b/lib/containers/__generated__/aggregatedReviewsContainerRefetchQuery.graphql.js index 3de4b8baeb..048f7ccb26 100644 --- a/lib/containers/__generated__/aggregatedReviewsContainerRefetchQuery.graphql.js +++ b/lib/containers/__generated__/aggregatedReviewsContainerRefetchQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 1a195aa12b0b6f9427454c2b28dfac39 + * @relayHash f294a17e7a12256bf4437f6cb9f06f80 */ /* eslint-disable */ @@ -50,6 +50,29 @@ query aggregatedReviewsContainerRefetchQuery( } } +fragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest { + id + ...reviewSummariesAccumulator_pullRequest_2zzc96 + ...reviewThreadsAccumulator_pullRequest_CKDvj +} + +fragment emojiReactionsController_reactable on Reactable { + id + ...emojiReactionsView_reactable +} + +fragment emojiReactionsView_reactable on Reactable { + id + reactionGroups { + content + viewerHasReacted + users { + totalCount + } + } + viewerCanReact +} + fragment prCheckoutController_pullRequest on PullRequest { number headRefName @@ -66,10 +89,43 @@ fragment prCheckoutController_pullRequest on PullRequest { } } -fragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest { +fragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread { id - ...reviewSummariesAccumulator_pullRequest_2zzc96 - ...reviewThreadsAccumulator_pullRequest_CKDvj + comments(first: $commentCount, after: $commentCursor) { + pageInfo { + hasNextPage + endCursor + } + edges { + cursor + node { + id + author { + __typename + avatarUrl + login + url + ... on Node { + id + } + } + bodyHTML + body + isMinimized + state + viewerCanReact + viewerCanUpdate + path + position + createdAt + lastEditedAt + url + authorAssociation + ...emojiReactionsController_reactable + __typename + } + } + } } fragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest { @@ -131,62 +187,6 @@ fragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest { } } } - -fragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread { - id - comments(first: $commentCount, after: $commentCursor) { - pageInfo { - hasNextPage - endCursor - } - edges { - cursor - node { - id - author { - __typename - avatarUrl - login - url - ... on Node { - id - } - } - bodyHTML - body - isMinimized - state - viewerCanReact - viewerCanUpdate - path - position - createdAt - lastEditedAt - url - authorAssociation - ...emojiReactionsController_reactable - __typename - } - } - } -} - -fragment emojiReactionsController_reactable on Reactable { - id - ...emojiReactionsView_reactable -} - -fragment emojiReactionsView_reactable on Reactable { - id - reactionGroups { - content - viewerHasReacted - users { - totalCount - } - } - viewerCanReact -} */ const node/*: ConcreteRequest*/ = (function(){ @@ -842,7 +842,7 @@ return { "operationKind": "query", "name": "aggregatedReviewsContainerRefetchQuery", "id": null, - "text": "query aggregatedReviewsContainerRefetchQuery(\n $prId: ID!\n $reviewCount: Int!\n $reviewCursor: String\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n $commentCursor: String\n) {\n pullRequest: node(id: $prId) {\n __typename\n ...prCheckoutController_pullRequest\n ...aggregatedReviewsContainer_pullRequest_qdneZ\n id\n }\n}\n\nfragment prCheckoutController_pullRequest on PullRequest {\n number\n headRefName\n headRepository {\n name\n url\n sshUrl\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest {\n id\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n ...reviewThreadsAccumulator_pullRequest_CKDvj\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n body\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n viewerCanUpdate\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n __typename\n }\n }\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", + "text": "query aggregatedReviewsContainerRefetchQuery(\n $prId: ID!\n $reviewCount: Int!\n $reviewCursor: String\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n $commentCursor: String\n) {\n pullRequest: node(id: $prId) {\n __typename\n ...prCheckoutController_pullRequest\n ...aggregatedReviewsContainer_pullRequest_qdneZ\n id\n }\n}\n\nfragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest {\n id\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n ...reviewThreadsAccumulator_pullRequest_CKDvj\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment prCheckoutController_pullRequest on PullRequest {\n number\n headRefName\n headRepository {\n name\n url\n sshUrl\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n body\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n viewerCanUpdate\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n __typename\n }\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/containers/__generated__/commentDecorationsContainerQuery.graphql.js b/lib/containers/__generated__/commentDecorationsContainerQuery.graphql.js index 3e41dc0e96..1bf7d342c3 100644 --- a/lib/containers/__generated__/commentDecorationsContainerQuery.graphql.js +++ b/lib/containers/__generated__/commentDecorationsContainerQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 7fbd3f9952895ce8b0dcee6a0b4dc580 + * @relayHash d80b4439da3a2474f993fc4d9264153c */ /* eslint-disable */ @@ -75,6 +75,12 @@ query commentDecorationsContainerQuery( } } +fragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest { + id + ...reviewSummariesAccumulator_pullRequest_2zzc96 + ...reviewThreadsAccumulator_pullRequest_CKDvj +} + fragment commentDecorationsController_pullRequests on PullRequest { number headRefName @@ -99,10 +105,60 @@ fragment commentDecorationsController_pullRequests on PullRequest { } } -fragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest { +fragment emojiReactionsController_reactable on Reactable { id - ...reviewSummariesAccumulator_pullRequest_2zzc96 - ...reviewThreadsAccumulator_pullRequest_CKDvj + ...emojiReactionsView_reactable +} + +fragment emojiReactionsView_reactable on Reactable { + id + reactionGroups { + content + viewerHasReacted + users { + totalCount + } + } + viewerCanReact +} + +fragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread { + id + comments(first: $commentCount, after: $commentCursor) { + pageInfo { + hasNextPage + endCursor + } + edges { + cursor + node { + id + author { + __typename + avatarUrl + login + url + ... on Node { + id + } + } + bodyHTML + body + isMinimized + state + viewerCanReact + viewerCanUpdate + path + position + createdAt + lastEditedAt + url + authorAssociation + ...emojiReactionsController_reactable + __typename + } + } + } } fragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest { @@ -164,62 +220,6 @@ fragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest { } } } - -fragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread { - id - comments(first: $commentCount, after: $commentCursor) { - pageInfo { - hasNextPage - endCursor - } - edges { - cursor - node { - id - author { - __typename - avatarUrl - login - url - ... on Node { - id - } - } - bodyHTML - body - isMinimized - state - viewerCanReact - viewerCanUpdate - path - position - createdAt - lastEditedAt - url - authorAssociation - ...emojiReactionsController_reactable - __typename - } - } - } -} - -fragment emojiReactionsController_reactable on Reactable { - id - ...emojiReactionsView_reactable -} - -fragment emojiReactionsView_reactable on Reactable { - id - reactionGroups { - content - viewerHasReacted - users { - totalCount - } - } - viewerCanReact -} */ const node/*: ConcreteRequest*/ = (function(){ @@ -997,7 +997,7 @@ return { "operationKind": "query", "name": "commentDecorationsContainerQuery", "id": null, - "text": "query commentDecorationsContainerQuery(\n $headOwner: String!\n $headName: String!\n $headRef: String!\n $reviewCount: Int!\n $reviewCursor: String\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n $commentCursor: String\n $first: Int!\n) {\n repository(owner: $headOwner, name: $headName) {\n ref(qualifiedName: $headRef) {\n associatedPullRequests(first: $first, states: [OPEN]) {\n totalCount\n nodes {\n number\n headRefOid\n ...commentDecorationsController_pullRequests\n ...aggregatedReviewsContainer_pullRequest_qdneZ\n id\n }\n }\n id\n }\n id\n }\n}\n\nfragment commentDecorationsController_pullRequests on PullRequest {\n number\n headRefName\n headRefOid\n headRepository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n repository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest {\n id\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n ...reviewThreadsAccumulator_pullRequest_CKDvj\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n body\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n viewerCanUpdate\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n __typename\n }\n }\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", + "text": "query commentDecorationsContainerQuery(\n $headOwner: String!\n $headName: String!\n $headRef: String!\n $reviewCount: Int!\n $reviewCursor: String\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n $commentCursor: String\n $first: Int!\n) {\n repository(owner: $headOwner, name: $headName) {\n ref(qualifiedName: $headRef) {\n associatedPullRequests(first: $first, states: [OPEN]) {\n totalCount\n nodes {\n number\n headRefOid\n ...commentDecorationsController_pullRequests\n ...aggregatedReviewsContainer_pullRequest_qdneZ\n id\n }\n }\n id\n }\n id\n }\n}\n\nfragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest {\n id\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n ...reviewThreadsAccumulator_pullRequest_CKDvj\n}\n\nfragment commentDecorationsController_pullRequests on PullRequest {\n number\n headRefName\n headRefOid\n headRepository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n repository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n body\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n viewerCanUpdate\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n __typename\n }\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/containers/__generated__/currentPullRequestContainerQuery.graphql.js b/lib/containers/__generated__/currentPullRequestContainerQuery.graphql.js index a9b69b1f57..1ca9ff9057 100644 --- a/lib/containers/__generated__/currentPullRequestContainerQuery.graphql.js +++ b/lib/containers/__generated__/currentPullRequestContainerQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 211c0401afb52b44e2cd596957148b75 + * @relayHash 11d909ebcdc948ee058ed9dced388da7 */ /* eslint-disable */ @@ -65,50 +65,19 @@ query currentPullRequestContainerQuery( } } -fragment issueishListController_results_1oGSNs on PullRequest { - number +fragment checkRunView_checkRun on CheckRun { + name + status + conclusion title - url - author { - __typename - login - avatarUrl - ... on Node { - id - } - } - createdAt - headRefName - repository { - id - name - owner { - __typename - login - id - } - } - commits(last: 1) { - nodes { - commit { - status { - contexts { - id - state - } - id - } - ...checkSuitesAccumulator_commit_1oGSNs - id - } - id - } - } + summary + permalink + detailsUrl } -fragment checkSuitesAccumulator_commit_1oGSNs on Commit { +fragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite { id - checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) { + checkRuns(first: $checkRunCount, after: $checkRunCursor) { pageInfo { hasNextPage endCursor @@ -119,8 +88,7 @@ fragment checkSuitesAccumulator_commit_1oGSNs on Commit { id status conclusion - ...checkSuiteView_checkSuite - ...checkRunsAccumulator_checkSuite_Rvfr1 + ...checkRunView_checkRun __typename } } @@ -136,9 +104,9 @@ fragment checkSuiteView_checkSuite on CheckSuite { conclusion } -fragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite { +fragment checkSuitesAccumulator_commit_1oGSNs on Commit { id - checkRuns(first: $checkRunCount, after: $checkRunCursor) { + checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) { pageInfo { hasNextPage endCursor @@ -149,21 +117,53 @@ fragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite { id status conclusion - ...checkRunView_checkRun + ...checkSuiteView_checkSuite + ...checkRunsAccumulator_checkSuite_Rvfr1 __typename } } } } -fragment checkRunView_checkRun on CheckRun { - name - status - conclusion +fragment issueishListController_results_1oGSNs on PullRequest { + number title - summary - permalink - detailsUrl + url + author { + __typename + login + avatarUrl + ... on Node { + id + } + } + createdAt + headRefName + repository { + id + name + owner { + __typename + login + id + } + } + commits(last: 1) { + nodes { + commit { + status { + contexts { + id + state + } + id + } + ...checkSuitesAccumulator_commit_1oGSNs + id + } + id + } + } } */ @@ -785,7 +785,7 @@ return { "operationKind": "query", "name": "currentPullRequestContainerQuery", "id": null, - "text": "query currentPullRequestContainerQuery(\n $headOwner: String!\n $headName: String!\n $headRef: String!\n $first: Int!\n $checkSuiteCount: Int!\n $checkSuiteCursor: String\n $checkRunCount: Int!\n $checkRunCursor: String\n) {\n repository(owner: $headOwner, name: $headName) {\n ref(qualifiedName: $headRef) {\n associatedPullRequests(first: $first, states: [OPEN]) {\n totalCount\n nodes {\n ...issueishListController_results_1oGSNs\n id\n }\n }\n id\n }\n id\n }\n}\n\nfragment issueishListController_results_1oGSNs on PullRequest {\n number\n title\n url\n author {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n createdAt\n headRefName\n repository {\n id\n name\n owner {\n __typename\n login\n id\n }\n }\n commits(last: 1) {\n nodes {\n commit {\n status {\n contexts {\n id\n state\n }\n id\n }\n ...checkSuitesAccumulator_commit_1oGSNs\n id\n }\n id\n }\n }\n}\n\nfragment checkSuitesAccumulator_commit_1oGSNs on Commit {\n id\n checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkSuiteView_checkSuite\n ...checkRunsAccumulator_checkSuite_Rvfr1\n __typename\n }\n }\n }\n}\n\nfragment checkSuiteView_checkSuite on CheckSuite {\n app {\n name\n id\n }\n status\n conclusion\n}\n\nfragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite {\n id\n checkRuns(first: $checkRunCount, after: $checkRunCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkRunView_checkRun\n __typename\n }\n }\n }\n}\n\nfragment checkRunView_checkRun on CheckRun {\n name\n status\n conclusion\n title\n summary\n permalink\n detailsUrl\n}\n", + "text": "query currentPullRequestContainerQuery(\n $headOwner: String!\n $headName: String!\n $headRef: String!\n $first: Int!\n $checkSuiteCount: Int!\n $checkSuiteCursor: String\n $checkRunCount: Int!\n $checkRunCursor: String\n) {\n repository(owner: $headOwner, name: $headName) {\n ref(qualifiedName: $headRef) {\n associatedPullRequests(first: $first, states: [OPEN]) {\n totalCount\n nodes {\n ...issueishListController_results_1oGSNs\n id\n }\n }\n id\n }\n id\n }\n}\n\nfragment checkRunView_checkRun on CheckRun {\n name\n status\n conclusion\n title\n summary\n permalink\n detailsUrl\n}\n\nfragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite {\n id\n checkRuns(first: $checkRunCount, after: $checkRunCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkRunView_checkRun\n __typename\n }\n }\n }\n}\n\nfragment checkSuiteView_checkSuite on CheckSuite {\n app {\n name\n id\n }\n status\n conclusion\n}\n\nfragment checkSuitesAccumulator_commit_1oGSNs on Commit {\n id\n checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkSuiteView_checkSuite\n ...checkRunsAccumulator_checkSuite_Rvfr1\n __typename\n }\n }\n }\n}\n\nfragment issueishListController_results_1oGSNs on PullRequest {\n number\n title\n url\n author {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n createdAt\n headRefName\n repository {\n id\n name\n owner {\n __typename\n login\n id\n }\n }\n commits(last: 1) {\n nodes {\n commit {\n status {\n contexts {\n id\n state\n }\n id\n }\n ...checkSuitesAccumulator_commit_1oGSNs\n id\n }\n id\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/containers/__generated__/githubTabHeaderContainerQuery.graphql.js b/lib/containers/__generated__/githubTabHeaderContainerQuery.graphql.js new file mode 100644 index 0000000000..0fe81b38b8 --- /dev/null +++ b/lib/containers/__generated__/githubTabHeaderContainerQuery.graphql.js @@ -0,0 +1,135 @@ +/** + * @flow + * @relayHash 180d6bab8f919e61ddfec71b206e25a5 + */ + +/* eslint-disable */ + +'use strict'; + +/*:: +import type { ConcreteRequest } from 'relay-runtime'; +export type githubTabHeaderContainerQueryVariables = {||}; +export type githubTabHeaderContainerQueryResponse = {| + +viewer: {| + +name: ?string, + +email: string, + +avatarUrl: any, + +login: string, + |} +|}; +export type githubTabHeaderContainerQuery = {| + variables: githubTabHeaderContainerQueryVariables, + response: githubTabHeaderContainerQueryResponse, +|}; +*/ + + +/* +query githubTabHeaderContainerQuery { + viewer { + name + email + avatarUrl + login + id + } +} +*/ + +const node/*: ConcreteRequest*/ = (function(){ +var v0 = { + "kind": "ScalarField", + "alias": null, + "name": "name", + "args": null, + "storageKey": null +}, +v1 = { + "kind": "ScalarField", + "alias": null, + "name": "email", + "args": null, + "storageKey": null +}, +v2 = { + "kind": "ScalarField", + "alias": null, + "name": "avatarUrl", + "args": null, + "storageKey": null +}, +v3 = { + "kind": "ScalarField", + "alias": null, + "name": "login", + "args": null, + "storageKey": null +}; +return { + "kind": "Request", + "fragment": { + "kind": "Fragment", + "name": "githubTabHeaderContainerQuery", + "type": "Query", + "metadata": null, + "argumentDefinitions": [], + "selections": [ + { + "kind": "LinkedField", + "alias": null, + "name": "viewer", + "storageKey": null, + "args": null, + "concreteType": "User", + "plural": false, + "selections": [ + (v0/*: any*/), + (v1/*: any*/), + (v2/*: any*/), + (v3/*: any*/) + ] + } + ] + }, + "operation": { + "kind": "Operation", + "name": "githubTabHeaderContainerQuery", + "argumentDefinitions": [], + "selections": [ + { + "kind": "LinkedField", + "alias": null, + "name": "viewer", + "storageKey": null, + "args": null, + "concreteType": "User", + "plural": false, + "selections": [ + (v0/*: any*/), + (v1/*: any*/), + (v2/*: any*/), + (v3/*: any*/), + { + "kind": "ScalarField", + "alias": null, + "name": "id", + "args": null, + "storageKey": null + } + ] + } + ] + }, + "params": { + "operationKind": "query", + "name": "githubTabHeaderContainerQuery", + "id": null, + "text": "query githubTabHeaderContainerQuery {\n viewer {\n name\n email\n avatarUrl\n login\n id\n }\n}\n", + "metadata": {} + } +}; +})(); +// prettier-ignore +(node/*: any*/).hash = '003bcc6b15469f788437eba2b4ce780b'; +module.exports = node; diff --git a/lib/containers/__generated__/issueishDetailContainerQuery.graphql.js b/lib/containers/__generated__/issueishDetailContainerQuery.graphql.js index 498aee0a0a..2d0941dd95 100644 --- a/lib/containers/__generated__/issueishDetailContainerQuery.graphql.js +++ b/lib/containers/__generated__/issueishDetailContainerQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 0e1bad582fd3bff4f3eb3c865c94e153 + * @relayHash 85e978dc2d00ae09ae543bf716b313c9 */ /* eslint-disable */ @@ -91,206 +91,203 @@ fragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest { ...reviewThreadsAccumulator_pullRequest_CKDvj } -fragment issueishDetailController_repository_3iQpNL on Repository { - ...issueDetailView_repository - ...prCheckoutController_repository - ...prDetailView_repository +fragment checkRunView_checkRun on CheckRun { name - owner { - __typename - login - id - } - issue: issueOrPullRequest(number: $issueishNumber) { - __typename - ... on Issue { - title - number - ...issueDetailView_issue_3D8CP9 - } - ... on Node { - id - } - } - pullRequest: issueOrPullRequest(number: $issueishNumber) { - __typename - ... on PullRequest { - title - number - ...prCheckoutController_pullRequest - ...prDetailView_pullRequest_1UVrY8 + status + conclusion + title + summary + permalink + detailsUrl +} + +fragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite { + id + checkRuns(first: $checkRunCount, after: $checkRunCursor) { + pageInfo { + hasNextPage + endCursor } - ... on Node { - id + edges { + cursor + node { + id + status + conclusion + ...checkRunView_checkRun + __typename + } } } } -fragment issueDetailView_repository on Repository { - id - name - owner { - __typename - login +fragment checkSuiteView_checkSuite on CheckSuite { + app { + name id } + status + conclusion } -fragment prCheckoutController_repository on Repository { - name - owner { - __typename - login - id +fragment checkSuitesAccumulator_commit_1oGSNs on Commit { + id + checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) { + pageInfo { + hasNextPage + endCursor + } + edges { + cursor + node { + id + status + conclusion + ...checkSuiteView_checkSuite + ...checkRunsAccumulator_checkSuite_Rvfr1 + __typename + } + } } } -fragment prDetailView_repository on Repository { - id - name - owner { - __typename - login +fragment commitCommentThreadView_item on PullRequestCommitCommentThread { + commit { + oid id } + comments(first: 100) { + edges { + node { + id + ...commitCommentView_item + } + } + } } -fragment issueDetailView_issue_3D8CP9 on Issue { - id - __typename - url - state - number - title - bodyHTML +fragment commitCommentView_item on CommitComment { author { __typename login avatarUrl - url ... on Node { id } } - ...issueTimelineController_issue_3D8CP9 - ...emojiReactionsView_reactable + commit { + oid + id + } + bodyHTML + createdAt + path + position } -fragment prCheckoutController_pullRequest on PullRequest { - number - headRefName - headRepository { +fragment commitView_commit on Commit { + author { name - url - sshUrl - owner { - __typename + avatarUrl + user { login id } - id } -} - -fragment prDetailView_pullRequest_1UVrY8 on PullRequest { - id - __typename - url - isCrossRepository - changedFiles - state - number - title - bodyHTML - baseRefName - headRefName - countedCommits: commits { - totalCount - } - author { - __typename - login + committer { + name avatarUrl - url - ... on Node { + user { + login id } } - ...prCommitsView_pullRequest_38TpXw - ...prStatusesView_pullRequest_1oGSNs - ...prTimelineController_pullRequest_3D8CP9 - ...emojiReactionsController_reactable + authoredByCommitter + sha: oid + message + messageHeadlineHTML + commitUrl } -fragment prCommitsView_pullRequest_38TpXw on PullRequest { - url - commits(first: $commitCount, after: $commitCursor) { - pageInfo { - endCursor - hasNextPage - } - edges { - cursor - node { - commit { - id - ...prCommitView_item - } +fragment commitsView_nodes on PullRequestCommit { + commit { + id + author { + name + user { + login id - __typename } } + ...commitView_commit } } -fragment prStatusesView_pullRequest_1oGSNs on PullRequest { +fragment crossReferencedEventView_item on CrossReferencedEvent { id - recentCommits: commits(last: 1) { - edges { - node { - commit { - status { - state - contexts { - id - state - ...prStatusContextView_context - } - id - } - ...checkSuitesAccumulator_commit_1oGSNs + isCrossRepository + source { + __typename + ... on Issue { + number + title + url + issueState: state + } + ... on PullRequest { + number + title + url + prState: state + } + ... on RepositoryNode { + repository { + name + isPrivate + owner { + __typename + login id } id } } + ... on Node { + id + } } } -fragment prTimelineController_pullRequest_3D8CP9 on PullRequest { - url - ...headRefForcePushedEventView_issueish - timelineItems(first: $timelineCount, after: $timelineCursor) { - pageInfo { - endCursor - hasNextPage +fragment crossReferencedEventsView_nodes on CrossReferencedEvent { + id + referencedAt + isCrossRepository + actor { + __typename + login + avatarUrl + ... on Node { + id } - edges { - cursor - node { - __typename - ...commitsView_nodes - ...issueCommentView_item - ...mergedEventView_item - ...headRefForcePushedEventView_item - ...commitCommentThreadView_item - ...crossReferencedEventsView_nodes - ... on Node { + } + source { + __typename + ... on RepositoryNode { + repository { + name + owner { + __typename + login id } + id } } + ... on Node { + id + } } + ...crossReferencedEventView_item } fragment emojiReactionsController_reactable on Reactable { @@ -327,18 +324,24 @@ fragment headRefForcePushedEventView_issueish on PullRequest { } } -fragment commitsView_nodes on PullRequestCommit { - commit { - id - author { - name - user { - login - id - } +fragment headRefForcePushedEventView_item on HeadRefForcePushedEvent { + actor { + __typename + avatarUrl + login + ... on Node { + id } - ...commitView_commit } + beforeCommit { + oid + id + } + afterCommit { + oid + id + } + createdAt } fragment issueCommentView_item on IssueComment { @@ -355,118 +358,86 @@ fragment issueCommentView_item on IssueComment { url } -fragment mergedEventView_item on MergedEvent { - actor { +fragment issueDetailView_issue_3D8CP9 on Issue { + id + __typename + url + state + number + title + bodyHTML + author { __typename - avatarUrl login + avatarUrl + url ... on Node { id } } - commit { - oid - id - } - mergeRefName - createdAt + ...issueTimelineController_issue_3D8CP9 + ...emojiReactionsView_reactable } -fragment headRefForcePushedEventView_item on HeadRefForcePushedEvent { - actor { +fragment issueDetailView_repository on Repository { + id + name + owner { __typename - avatarUrl login - ... on Node { - id - } - } - beforeCommit { - oid - id - } - afterCommit { - oid id } - createdAt } -fragment commitCommentThreadView_item on PullRequestCommitCommentThread { - commit { - oid - id - } - comments(first: 100) { +fragment issueTimelineController_issue_3D8CP9 on Issue { + url + timelineItems(first: $timelineCount, after: $timelineCursor) { + pageInfo { + endCursor + hasNextPage + } edges { + cursor node { - id - ...commitCommentView_item + __typename + ...issueCommentView_item + ...crossReferencedEventsView_nodes + ... on Node { + id + } } } } } -fragment crossReferencedEventsView_nodes on CrossReferencedEvent { - id - referencedAt - isCrossRepository - actor { +fragment issueishDetailController_repository_3iQpNL on Repository { + ...issueDetailView_repository + ...prCheckoutController_repository + ...prDetailView_repository + name + owner { __typename login - avatarUrl - ... on Node { - id - } + id } - source { + issue: issueOrPullRequest(number: $issueishNumber) { __typename - ... on RepositoryNode { - repository { - name - owner { - __typename - login - id - } - id - } + ... on Issue { + title + number + ...issueDetailView_issue_3D8CP9 } ... on Node { id } } - ...crossReferencedEventView_item -} - -fragment crossReferencedEventView_item on CrossReferencedEvent { - id - isCrossRepository - source { + pullRequest: issueOrPullRequest(number: $issueishNumber) { __typename - ... on Issue { - number - title - url - issueState: state - } ... on PullRequest { - number title - url - prState: state - } - ... on RepositoryNode { - repository { - name - isPrivate - owner { - __typename - login - id - } - id - } + number + ...prCheckoutController_pullRequest + ...prDetailView_pullRequest_1UVrY8 } ... on Node { id @@ -474,11 +445,11 @@ fragment crossReferencedEventView_item on CrossReferencedEvent { } } -fragment commitCommentView_item on CommitComment { - author { +fragment mergedEventView_item on MergedEvent { + actor { __typename - login avatarUrl + login ... on Node { id } @@ -487,118 +458,143 @@ fragment commitCommentView_item on CommitComment { oid id } - bodyHTML + mergeRefName createdAt - path - position } -fragment commitView_commit on Commit { - author { +fragment prCheckoutController_pullRequest on PullRequest { + number + headRefName + headRepository { name - avatarUrl - user { + url + sshUrl + owner { + __typename login id } + id + } +} + +fragment prCheckoutController_repository on Repository { + name + owner { + __typename + login + id } +} + +fragment prCommitView_item on Commit { committer { - name avatarUrl - user { - login - id - } + name + date } - authoredByCommitter + messageHeadline + messageBody + shortSha: abbreviatedOid sha: oid - message - messageHeadlineHTML - commitUrl -} - -fragment prStatusContextView_context on StatusContext { - context - description - state - targetUrl + url } -fragment checkSuitesAccumulator_commit_1oGSNs on Commit { - id - checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) { +fragment prCommitsView_pullRequest_38TpXw on PullRequest { + url + commits(first: $commitCount, after: $commitCursor) { pageInfo { - hasNextPage endCursor + hasNextPage } edges { cursor node { + commit { + id + ...prCommitView_item + } id - status - conclusion - ...checkSuiteView_checkSuite - ...checkRunsAccumulator_checkSuite_Rvfr1 __typename } } } } -fragment checkSuiteView_checkSuite on CheckSuite { - app { - name +fragment prDetailView_pullRequest_1UVrY8 on PullRequest { + id + __typename + url + isCrossRepository + changedFiles + state + number + title + bodyHTML + baseRefName + headRefName + countedCommits: commits { + totalCount + } + author { + __typename + login + avatarUrl + url + ... on Node { + id + } + } + ...prCommitsView_pullRequest_38TpXw + ...prStatusesView_pullRequest_1oGSNs + ...prTimelineController_pullRequest_3D8CP9 + ...emojiReactionsController_reactable +} + +fragment prDetailView_repository on Repository { + id + name + owner { + __typename + login id } - status - conclusion } -fragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite { +fragment prStatusContextView_context on StatusContext { + context + description + state + targetUrl +} + +fragment prStatusesView_pullRequest_1oGSNs on PullRequest { id - checkRuns(first: $checkRunCount, after: $checkRunCursor) { - pageInfo { - hasNextPage - endCursor - } + recentCommits: commits(last: 1) { edges { - cursor node { + commit { + status { + state + contexts { + id + state + ...prStatusContextView_context + } + id + } + ...checkSuitesAccumulator_commit_1oGSNs + id + } id - status - conclusion - ...checkRunView_checkRun - __typename } } } } -fragment checkRunView_checkRun on CheckRun { - name - status - conclusion - title - summary - permalink - detailsUrl -} - -fragment prCommitView_item on Commit { - committer { - avatarUrl - name - date - } - messageHeadline - messageBody - shortSha: abbreviatedOid - sha: oid - url -} - -fragment issueTimelineController_issue_3D8CP9 on Issue { +fragment prTimelineController_pullRequest_3D8CP9 on PullRequest { url + ...headRefForcePushedEventView_issueish timelineItems(first: $timelineCount, after: $timelineCursor) { pageInfo { endCursor @@ -608,7 +604,11 @@ fragment issueTimelineController_issue_3D8CP9 on Issue { cursor node { __typename + ...commitsView_nodes ...issueCommentView_item + ...mergedEventView_item + ...headRefForcePushedEventView_item + ...commitCommentThreadView_item ...crossReferencedEventsView_nodes ... on Node { id @@ -618,6 +618,45 @@ fragment issueTimelineController_issue_3D8CP9 on Issue { } } +fragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread { + id + comments(first: $commentCount, after: $commentCursor) { + pageInfo { + hasNextPage + endCursor + } + edges { + cursor + node { + id + author { + __typename + avatarUrl + login + url + ... on Node { + id + } + } + bodyHTML + body + isMinimized + state + viewerCanReact + viewerCanUpdate + path + position + createdAt + lastEditedAt + url + authorAssociation + ...emojiReactionsController_reactable + __typename + } + } + } +} + fragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest { url reviews(first: $reviewCount, after: $reviewCursor) { @@ -677,45 +716,6 @@ fragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest { } } } - -fragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread { - id - comments(first: $commentCount, after: $commentCursor) { - pageInfo { - hasNextPage - endCursor - } - edges { - cursor - node { - id - author { - __typename - avatarUrl - login - url - ... on Node { - id - } - } - bodyHTML - body - isMinimized - state - viewerCanReact - viewerCanUpdate - path - position - createdAt - lastEditedAt - url - authorAssociation - ...emojiReactionsController_reactable - __typename - } - } - } -} */ const node/*: ConcreteRequest*/ = (function(){ @@ -2500,7 +2500,7 @@ return { "operationKind": "query", "name": "issueishDetailContainerQuery", "id": null, - "text": "query issueishDetailContainerQuery(\n $repoOwner: String!\n $repoName: String!\n $issueishNumber: Int!\n $timelineCount: Int!\n $timelineCursor: String\n $commitCount: Int!\n $commitCursor: String\n $reviewCount: Int!\n $reviewCursor: String\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n $commentCursor: String\n $checkSuiteCount: Int!\n $checkSuiteCursor: String\n $checkRunCount: Int!\n $checkRunCursor: String\n) {\n repository(owner: $repoOwner, name: $repoName) {\n issueish: issueOrPullRequest(number: $issueishNumber) {\n __typename\n ... on PullRequest {\n ...aggregatedReviewsContainer_pullRequest_qdneZ\n }\n ... on Node {\n id\n }\n }\n ...issueishDetailController_repository_3iQpNL\n id\n }\n}\n\nfragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest {\n id\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n ...reviewThreadsAccumulator_pullRequest_CKDvj\n}\n\nfragment issueishDetailController_repository_3iQpNL on Repository {\n ...issueDetailView_repository\n ...prCheckoutController_repository\n ...prDetailView_repository\n name\n owner {\n __typename\n login\n id\n }\n issue: issueOrPullRequest(number: $issueishNumber) {\n __typename\n ... on Issue {\n title\n number\n ...issueDetailView_issue_3D8CP9\n }\n ... on Node {\n id\n }\n }\n pullRequest: issueOrPullRequest(number: $issueishNumber) {\n __typename\n ... on PullRequest {\n title\n number\n ...prCheckoutController_pullRequest\n ...prDetailView_pullRequest_1UVrY8\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment issueDetailView_repository on Repository {\n id\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment prCheckoutController_repository on Repository {\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment prDetailView_repository on Repository {\n id\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment issueDetailView_issue_3D8CP9 on Issue {\n id\n __typename\n url\n state\n number\n title\n bodyHTML\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n ...issueTimelineController_issue_3D8CP9\n ...emojiReactionsView_reactable\n}\n\nfragment prCheckoutController_pullRequest on PullRequest {\n number\n headRefName\n headRepository {\n name\n url\n sshUrl\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment prDetailView_pullRequest_1UVrY8 on PullRequest {\n id\n __typename\n url\n isCrossRepository\n changedFiles\n state\n number\n title\n bodyHTML\n baseRefName\n headRefName\n countedCommits: commits {\n totalCount\n }\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n ...prCommitsView_pullRequest_38TpXw\n ...prStatusesView_pullRequest_1oGSNs\n ...prTimelineController_pullRequest_3D8CP9\n ...emojiReactionsController_reactable\n}\n\nfragment prCommitsView_pullRequest_38TpXw on PullRequest {\n url\n commits(first: $commitCount, after: $commitCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n commit {\n id\n ...prCommitView_item\n }\n id\n __typename\n }\n }\n }\n}\n\nfragment prStatusesView_pullRequest_1oGSNs on PullRequest {\n id\n recentCommits: commits(last: 1) {\n edges {\n node {\n commit {\n status {\n state\n contexts {\n id\n state\n ...prStatusContextView_context\n }\n id\n }\n ...checkSuitesAccumulator_commit_1oGSNs\n id\n }\n id\n }\n }\n }\n}\n\nfragment prTimelineController_pullRequest_3D8CP9 on PullRequest {\n url\n ...headRefForcePushedEventView_issueish\n timelineItems(first: $timelineCount, after: $timelineCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n __typename\n ...commitsView_nodes\n ...issueCommentView_item\n ...mergedEventView_item\n ...headRefForcePushedEventView_item\n ...commitCommentThreadView_item\n ...crossReferencedEventsView_nodes\n ... on Node {\n id\n }\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment headRefForcePushedEventView_issueish on PullRequest {\n headRefName\n headRepositoryOwner {\n __typename\n login\n id\n }\n repository {\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment commitsView_nodes on PullRequestCommit {\n commit {\n id\n author {\n name\n user {\n login\n id\n }\n }\n ...commitView_commit\n }\n}\n\nfragment issueCommentView_item on IssueComment {\n author {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n bodyHTML\n createdAt\n url\n}\n\nfragment mergedEventView_item on MergedEvent {\n actor {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n commit {\n oid\n id\n }\n mergeRefName\n createdAt\n}\n\nfragment headRefForcePushedEventView_item on HeadRefForcePushedEvent {\n actor {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n beforeCommit {\n oid\n id\n }\n afterCommit {\n oid\n id\n }\n createdAt\n}\n\nfragment commitCommentThreadView_item on PullRequestCommitCommentThread {\n commit {\n oid\n id\n }\n comments(first: 100) {\n edges {\n node {\n id\n ...commitCommentView_item\n }\n }\n }\n}\n\nfragment crossReferencedEventsView_nodes on CrossReferencedEvent {\n id\n referencedAt\n isCrossRepository\n actor {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n source {\n __typename\n ... on RepositoryNode {\n repository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n ...crossReferencedEventView_item\n}\n\nfragment crossReferencedEventView_item on CrossReferencedEvent {\n id\n isCrossRepository\n source {\n __typename\n ... on Issue {\n number\n title\n url\n issueState: state\n }\n ... on PullRequest {\n number\n title\n url\n prState: state\n }\n ... on RepositoryNode {\n repository {\n name\n isPrivate\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment commitCommentView_item on CommitComment {\n author {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n commit {\n oid\n id\n }\n bodyHTML\n createdAt\n path\n position\n}\n\nfragment commitView_commit on Commit {\n author {\n name\n avatarUrl\n user {\n login\n id\n }\n }\n committer {\n name\n avatarUrl\n user {\n login\n id\n }\n }\n authoredByCommitter\n sha: oid\n message\n messageHeadlineHTML\n commitUrl\n}\n\nfragment prStatusContextView_context on StatusContext {\n context\n description\n state\n targetUrl\n}\n\nfragment checkSuitesAccumulator_commit_1oGSNs on Commit {\n id\n checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkSuiteView_checkSuite\n ...checkRunsAccumulator_checkSuite_Rvfr1\n __typename\n }\n }\n }\n}\n\nfragment checkSuiteView_checkSuite on CheckSuite {\n app {\n name\n id\n }\n status\n conclusion\n}\n\nfragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite {\n id\n checkRuns(first: $checkRunCount, after: $checkRunCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkRunView_checkRun\n __typename\n }\n }\n }\n}\n\nfragment checkRunView_checkRun on CheckRun {\n name\n status\n conclusion\n title\n summary\n permalink\n detailsUrl\n}\n\nfragment prCommitView_item on Commit {\n committer {\n avatarUrl\n name\n date\n }\n messageHeadline\n messageBody\n shortSha: abbreviatedOid\n sha: oid\n url\n}\n\nfragment issueTimelineController_issue_3D8CP9 on Issue {\n url\n timelineItems(first: $timelineCount, after: $timelineCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n __typename\n ...issueCommentView_item\n ...crossReferencedEventsView_nodes\n ... on Node {\n id\n }\n }\n }\n }\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n body\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n viewerCanUpdate\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n __typename\n }\n }\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n", + "text": "query issueishDetailContainerQuery(\n $repoOwner: String!\n $repoName: String!\n $issueishNumber: Int!\n $timelineCount: Int!\n $timelineCursor: String\n $commitCount: Int!\n $commitCursor: String\n $reviewCount: Int!\n $reviewCursor: String\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n $commentCursor: String\n $checkSuiteCount: Int!\n $checkSuiteCursor: String\n $checkRunCount: Int!\n $checkRunCursor: String\n) {\n repository(owner: $repoOwner, name: $repoName) {\n issueish: issueOrPullRequest(number: $issueishNumber) {\n __typename\n ... on PullRequest {\n ...aggregatedReviewsContainer_pullRequest_qdneZ\n }\n ... on Node {\n id\n }\n }\n ...issueishDetailController_repository_3iQpNL\n id\n }\n}\n\nfragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest {\n id\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n ...reviewThreadsAccumulator_pullRequest_CKDvj\n}\n\nfragment checkRunView_checkRun on CheckRun {\n name\n status\n conclusion\n title\n summary\n permalink\n detailsUrl\n}\n\nfragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite {\n id\n checkRuns(first: $checkRunCount, after: $checkRunCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkRunView_checkRun\n __typename\n }\n }\n }\n}\n\nfragment checkSuiteView_checkSuite on CheckSuite {\n app {\n name\n id\n }\n status\n conclusion\n}\n\nfragment checkSuitesAccumulator_commit_1oGSNs on Commit {\n id\n checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkSuiteView_checkSuite\n ...checkRunsAccumulator_checkSuite_Rvfr1\n __typename\n }\n }\n }\n}\n\nfragment commitCommentThreadView_item on PullRequestCommitCommentThread {\n commit {\n oid\n id\n }\n comments(first: 100) {\n edges {\n node {\n id\n ...commitCommentView_item\n }\n }\n }\n}\n\nfragment commitCommentView_item on CommitComment {\n author {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n commit {\n oid\n id\n }\n bodyHTML\n createdAt\n path\n position\n}\n\nfragment commitView_commit on Commit {\n author {\n name\n avatarUrl\n user {\n login\n id\n }\n }\n committer {\n name\n avatarUrl\n user {\n login\n id\n }\n }\n authoredByCommitter\n sha: oid\n message\n messageHeadlineHTML\n commitUrl\n}\n\nfragment commitsView_nodes on PullRequestCommit {\n commit {\n id\n author {\n name\n user {\n login\n id\n }\n }\n ...commitView_commit\n }\n}\n\nfragment crossReferencedEventView_item on CrossReferencedEvent {\n id\n isCrossRepository\n source {\n __typename\n ... on Issue {\n number\n title\n url\n issueState: state\n }\n ... on PullRequest {\n number\n title\n url\n prState: state\n }\n ... on RepositoryNode {\n repository {\n name\n isPrivate\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment crossReferencedEventsView_nodes on CrossReferencedEvent {\n id\n referencedAt\n isCrossRepository\n actor {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n source {\n __typename\n ... on RepositoryNode {\n repository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n ...crossReferencedEventView_item\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment headRefForcePushedEventView_issueish on PullRequest {\n headRefName\n headRepositoryOwner {\n __typename\n login\n id\n }\n repository {\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment headRefForcePushedEventView_item on HeadRefForcePushedEvent {\n actor {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n beforeCommit {\n oid\n id\n }\n afterCommit {\n oid\n id\n }\n createdAt\n}\n\nfragment issueCommentView_item on IssueComment {\n author {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n bodyHTML\n createdAt\n url\n}\n\nfragment issueDetailView_issue_3D8CP9 on Issue {\n id\n __typename\n url\n state\n number\n title\n bodyHTML\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n ...issueTimelineController_issue_3D8CP9\n ...emojiReactionsView_reactable\n}\n\nfragment issueDetailView_repository on Repository {\n id\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment issueTimelineController_issue_3D8CP9 on Issue {\n url\n timelineItems(first: $timelineCount, after: $timelineCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n __typename\n ...issueCommentView_item\n ...crossReferencedEventsView_nodes\n ... on Node {\n id\n }\n }\n }\n }\n}\n\nfragment issueishDetailController_repository_3iQpNL on Repository {\n ...issueDetailView_repository\n ...prCheckoutController_repository\n ...prDetailView_repository\n name\n owner {\n __typename\n login\n id\n }\n issue: issueOrPullRequest(number: $issueishNumber) {\n __typename\n ... on Issue {\n title\n number\n ...issueDetailView_issue_3D8CP9\n }\n ... on Node {\n id\n }\n }\n pullRequest: issueOrPullRequest(number: $issueishNumber) {\n __typename\n ... on PullRequest {\n title\n number\n ...prCheckoutController_pullRequest\n ...prDetailView_pullRequest_1UVrY8\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment mergedEventView_item on MergedEvent {\n actor {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n commit {\n oid\n id\n }\n mergeRefName\n createdAt\n}\n\nfragment prCheckoutController_pullRequest on PullRequest {\n number\n headRefName\n headRepository {\n name\n url\n sshUrl\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment prCheckoutController_repository on Repository {\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment prCommitView_item on Commit {\n committer {\n avatarUrl\n name\n date\n }\n messageHeadline\n messageBody\n shortSha: abbreviatedOid\n sha: oid\n url\n}\n\nfragment prCommitsView_pullRequest_38TpXw on PullRequest {\n url\n commits(first: $commitCount, after: $commitCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n commit {\n id\n ...prCommitView_item\n }\n id\n __typename\n }\n }\n }\n}\n\nfragment prDetailView_pullRequest_1UVrY8 on PullRequest {\n id\n __typename\n url\n isCrossRepository\n changedFiles\n state\n number\n title\n bodyHTML\n baseRefName\n headRefName\n countedCommits: commits {\n totalCount\n }\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n ...prCommitsView_pullRequest_38TpXw\n ...prStatusesView_pullRequest_1oGSNs\n ...prTimelineController_pullRequest_3D8CP9\n ...emojiReactionsController_reactable\n}\n\nfragment prDetailView_repository on Repository {\n id\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment prStatusContextView_context on StatusContext {\n context\n description\n state\n targetUrl\n}\n\nfragment prStatusesView_pullRequest_1oGSNs on PullRequest {\n id\n recentCommits: commits(last: 1) {\n edges {\n node {\n commit {\n status {\n state\n contexts {\n id\n state\n ...prStatusContextView_context\n }\n id\n }\n ...checkSuitesAccumulator_commit_1oGSNs\n id\n }\n id\n }\n }\n }\n}\n\nfragment prTimelineController_pullRequest_3D8CP9 on PullRequest {\n url\n ...headRefForcePushedEventView_issueish\n timelineItems(first: $timelineCount, after: $timelineCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n __typename\n ...commitsView_nodes\n ...issueCommentView_item\n ...mergedEventView_item\n ...headRefForcePushedEventView_item\n ...commitCommentThreadView_item\n ...crossReferencedEventsView_nodes\n ... on Node {\n id\n }\n }\n }\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n body\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n viewerCanUpdate\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n __typename\n }\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/containers/__generated__/issueishSearchContainerQuery.graphql.js b/lib/containers/__generated__/issueishSearchContainerQuery.graphql.js index eee782d198..db55294f7e 100644 --- a/lib/containers/__generated__/issueishSearchContainerQuery.graphql.js +++ b/lib/containers/__generated__/issueishSearchContainerQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 4ff9b711e1716eb7eb3d3ae3a15eb77e + * @relayHash e417ad69b38ec06ea8e246355192c05a */ /* eslint-disable */ @@ -54,50 +54,19 @@ query issueishSearchContainerQuery( } } -fragment issueishListController_results_1oGSNs on PullRequest { - number +fragment checkRunView_checkRun on CheckRun { + name + status + conclusion title - url - author { - __typename - login - avatarUrl - ... on Node { - id - } - } - createdAt - headRefName - repository { - id - name - owner { - __typename - login - id - } - } - commits(last: 1) { - nodes { - commit { - status { - contexts { - id - state - } - id - } - ...checkSuitesAccumulator_commit_1oGSNs - id - } - id - } - } + summary + permalink + detailsUrl } -fragment checkSuitesAccumulator_commit_1oGSNs on Commit { +fragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite { id - checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) { + checkRuns(first: $checkRunCount, after: $checkRunCursor) { pageInfo { hasNextPage endCursor @@ -108,8 +77,7 @@ fragment checkSuitesAccumulator_commit_1oGSNs on Commit { id status conclusion - ...checkSuiteView_checkSuite - ...checkRunsAccumulator_checkSuite_Rvfr1 + ...checkRunView_checkRun __typename } } @@ -125,9 +93,9 @@ fragment checkSuiteView_checkSuite on CheckSuite { conclusion } -fragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite { +fragment checkSuitesAccumulator_commit_1oGSNs on Commit { id - checkRuns(first: $checkRunCount, after: $checkRunCursor) { + checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) { pageInfo { hasNextPage endCursor @@ -138,21 +106,53 @@ fragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite { id status conclusion - ...checkRunView_checkRun + ...checkSuiteView_checkSuite + ...checkRunsAccumulator_checkSuite_Rvfr1 __typename } } } } -fragment checkRunView_checkRun on CheckRun { - name - status - conclusion +fragment issueishListController_results_1oGSNs on PullRequest { + number title - summary - permalink - detailsUrl + url + author { + __typename + login + avatarUrl + ... on Node { + id + } + } + createdAt + headRefName + repository { + id + name + owner { + __typename + login + id + } + } + commits(last: 1) { + nodes { + commit { + status { + contexts { + id + state + } + id + } + ...checkSuitesAccumulator_commit_1oGSNs + id + } + id + } + } } */ @@ -707,7 +707,7 @@ return { "operationKind": "query", "name": "issueishSearchContainerQuery", "id": null, - "text": "query issueishSearchContainerQuery(\n $query: String!\n $first: Int!\n $checkSuiteCount: Int!\n $checkSuiteCursor: String\n $checkRunCount: Int!\n $checkRunCursor: String\n) {\n search(first: $first, query: $query, type: ISSUE) {\n issueCount\n nodes {\n __typename\n ...issueishListController_results_1oGSNs\n ... on Node {\n id\n }\n }\n }\n}\n\nfragment issueishListController_results_1oGSNs on PullRequest {\n number\n title\n url\n author {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n createdAt\n headRefName\n repository {\n id\n name\n owner {\n __typename\n login\n id\n }\n }\n commits(last: 1) {\n nodes {\n commit {\n status {\n contexts {\n id\n state\n }\n id\n }\n ...checkSuitesAccumulator_commit_1oGSNs\n id\n }\n id\n }\n }\n}\n\nfragment checkSuitesAccumulator_commit_1oGSNs on Commit {\n id\n checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkSuiteView_checkSuite\n ...checkRunsAccumulator_checkSuite_Rvfr1\n __typename\n }\n }\n }\n}\n\nfragment checkSuiteView_checkSuite on CheckSuite {\n app {\n name\n id\n }\n status\n conclusion\n}\n\nfragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite {\n id\n checkRuns(first: $checkRunCount, after: $checkRunCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkRunView_checkRun\n __typename\n }\n }\n }\n}\n\nfragment checkRunView_checkRun on CheckRun {\n name\n status\n conclusion\n title\n summary\n permalink\n detailsUrl\n}\n", + "text": "query issueishSearchContainerQuery(\n $query: String!\n $first: Int!\n $checkSuiteCount: Int!\n $checkSuiteCursor: String\n $checkRunCount: Int!\n $checkRunCursor: String\n) {\n search(first: $first, query: $query, type: ISSUE) {\n issueCount\n nodes {\n __typename\n ...issueishListController_results_1oGSNs\n ... on Node {\n id\n }\n }\n }\n}\n\nfragment checkRunView_checkRun on CheckRun {\n name\n status\n conclusion\n title\n summary\n permalink\n detailsUrl\n}\n\nfragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite {\n id\n checkRuns(first: $checkRunCount, after: $checkRunCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkRunView_checkRun\n __typename\n }\n }\n }\n}\n\nfragment checkSuiteView_checkSuite on CheckSuite {\n app {\n name\n id\n }\n status\n conclusion\n}\n\nfragment checkSuitesAccumulator_commit_1oGSNs on Commit {\n id\n checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkSuiteView_checkSuite\n ...checkRunsAccumulator_checkSuite_Rvfr1\n __typename\n }\n }\n }\n}\n\nfragment issueishListController_results_1oGSNs on PullRequest {\n number\n title\n url\n author {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n createdAt\n headRefName\n repository {\n id\n name\n owner {\n __typename\n login\n id\n }\n }\n commits(last: 1) {\n nodes {\n commit {\n status {\n contexts {\n id\n state\n }\n id\n }\n ...checkSuitesAccumulator_commit_1oGSNs\n id\n }\n id\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/containers/__generated__/reviewsContainerQuery.graphql.js b/lib/containers/__generated__/reviewsContainerQuery.graphql.js index 5d7c973fac..c1cde41d65 100644 --- a/lib/containers/__generated__/reviewsContainerQuery.graphql.js +++ b/lib/containers/__generated__/reviewsContainerQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 77a45108e1d6daa4a300498cebb15219 + * @relayHash 1f2dd1b13010dfeb3407599ff1b7e83a */ /* eslint-disable */ @@ -71,25 +71,27 @@ query reviewsContainerQuery( } } -fragment reviewsController_repository on Repository { - ...prCheckoutController_repository -} - fragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest { id ...reviewSummariesAccumulator_pullRequest_2zzc96 ...reviewThreadsAccumulator_pullRequest_CKDvj } -fragment reviewsController_pullRequest on PullRequest { +fragment emojiReactionsController_reactable on Reactable { id - ...prCheckoutController_pullRequest + ...emojiReactionsView_reactable } -fragment reviewsController_viewer on User { +fragment emojiReactionsView_reactable on Reactable { id - login - avatarUrl + reactionGroups { + content + viewerHasReacted + users { + totalCount + } + } + viewerCanReact } fragment prCheckoutController_pullRequest on PullRequest { @@ -108,6 +110,54 @@ fragment prCheckoutController_pullRequest on PullRequest { } } +fragment prCheckoutController_repository on Repository { + name + owner { + __typename + login + id + } +} + +fragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread { + id + comments(first: $commentCount, after: $commentCursor) { + pageInfo { + hasNextPage + endCursor + } + edges { + cursor + node { + id + author { + __typename + avatarUrl + login + url + ... on Node { + id + } + } + bodyHTML + body + isMinimized + state + viewerCanReact + viewerCanUpdate + path + position + createdAt + lastEditedAt + url + authorAssociation + ...emojiReactionsController_reactable + __typename + } + } + } +} + fragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest { url reviews(first: $reviewCount, after: $reviewCursor) { @@ -168,69 +218,19 @@ fragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest { } } -fragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread { +fragment reviewsController_pullRequest on PullRequest { id - comments(first: $commentCount, after: $commentCursor) { - pageInfo { - hasNextPage - endCursor - } - edges { - cursor - node { - id - author { - __typename - avatarUrl - login - url - ... on Node { - id - } - } - bodyHTML - body - isMinimized - state - viewerCanReact - viewerCanUpdate - path - position - createdAt - lastEditedAt - url - authorAssociation - ...emojiReactionsController_reactable - __typename - } - } - } + ...prCheckoutController_pullRequest } -fragment emojiReactionsController_reactable on Reactable { - id - ...emojiReactionsView_reactable +fragment reviewsController_repository on Repository { + ...prCheckoutController_repository } -fragment emojiReactionsView_reactable on Reactable { +fragment reviewsController_viewer on User { id - reactionGroups { - content - viewerHasReacted - users { - totalCount - } - } - viewerCanReact -} - -fragment prCheckoutController_repository on Repository { - name - owner { - __typename - login - id - } + login + avatarUrl } */ @@ -975,7 +975,7 @@ return { "operationKind": "query", "name": "reviewsContainerQuery", "id": null, - "text": "query reviewsContainerQuery(\n $repoOwner: String!\n $repoName: String!\n $prNumber: Int!\n $reviewCount: Int!\n $reviewCursor: String\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n $commentCursor: String\n) {\n repository(owner: $repoOwner, name: $repoName) {\n ...reviewsController_repository\n pullRequest(number: $prNumber) {\n headRefOid\n ...aggregatedReviewsContainer_pullRequest_qdneZ\n ...reviewsController_pullRequest\n id\n }\n id\n }\n viewer {\n ...reviewsController_viewer\n id\n }\n}\n\nfragment reviewsController_repository on Repository {\n ...prCheckoutController_repository\n}\n\nfragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest {\n id\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n ...reviewThreadsAccumulator_pullRequest_CKDvj\n}\n\nfragment reviewsController_pullRequest on PullRequest {\n id\n ...prCheckoutController_pullRequest\n}\n\nfragment reviewsController_viewer on User {\n id\n login\n avatarUrl\n}\n\nfragment prCheckoutController_pullRequest on PullRequest {\n number\n headRefName\n headRepository {\n name\n url\n sshUrl\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n body\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n viewerCanUpdate\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n __typename\n }\n }\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment prCheckoutController_repository on Repository {\n name\n owner {\n __typename\n login\n id\n }\n}\n", + "text": "query reviewsContainerQuery(\n $repoOwner: String!\n $repoName: String!\n $prNumber: Int!\n $reviewCount: Int!\n $reviewCursor: String\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n $commentCursor: String\n) {\n repository(owner: $repoOwner, name: $repoName) {\n ...reviewsController_repository\n pullRequest(number: $prNumber) {\n headRefOid\n ...aggregatedReviewsContainer_pullRequest_qdneZ\n ...reviewsController_pullRequest\n id\n }\n id\n }\n viewer {\n ...reviewsController_viewer\n id\n }\n}\n\nfragment aggregatedReviewsContainer_pullRequest_qdneZ on PullRequest {\n id\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n ...reviewThreadsAccumulator_pullRequest_CKDvj\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment prCheckoutController_pullRequest on PullRequest {\n number\n headRefName\n headRepository {\n name\n url\n sshUrl\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment prCheckoutController_repository on Repository {\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n body\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n viewerCanUpdate\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_CKDvj on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n __typename\n }\n }\n }\n}\n\nfragment reviewsController_pullRequest on PullRequest {\n id\n ...prCheckoutController_pullRequest\n}\n\nfragment reviewsController_repository on Repository {\n ...prCheckoutController_repository\n}\n\nfragment reviewsController_viewer on User {\n id\n login\n avatarUrl\n}\n", "metadata": {} } }; diff --git a/lib/containers/accumulators/__generated__/checkRunsAccumulatorQuery.graphql.js b/lib/containers/accumulators/__generated__/checkRunsAccumulatorQuery.graphql.js index bee99daff1..008ca0f07b 100644 --- a/lib/containers/accumulators/__generated__/checkRunsAccumulatorQuery.graphql.js +++ b/lib/containers/accumulators/__generated__/checkRunsAccumulatorQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 02aaf9415bc5094d60d46842d42c1206 + * @relayHash 0a5804395d7c847efc0a27cdb35910b1 */ /* eslint-disable */ @@ -42,6 +42,16 @@ query checkRunsAccumulatorQuery( } } +fragment checkRunView_checkRun on CheckRun { + name + status + conclusion + title + summary + permalink + detailsUrl +} + fragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite { id checkRuns(first: $checkRunCount, after: $checkRunCursor) { @@ -61,16 +71,6 @@ fragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite { } } } - -fragment checkRunView_checkRun on CheckRun { - name - status - conclusion - title - summary - permalink - detailsUrl -} */ const node/*: ConcreteRequest*/ = (function(){ @@ -326,7 +326,7 @@ return { "operationKind": "query", "name": "checkRunsAccumulatorQuery", "id": null, - "text": "query checkRunsAccumulatorQuery(\n $id: ID!\n $checkRunCount: Int!\n $checkRunCursor: String\n) {\n node(id: $id) {\n __typename\n ... on CheckSuite {\n ...checkRunsAccumulator_checkSuite_Rvfr1\n }\n id\n }\n}\n\nfragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite {\n id\n checkRuns(first: $checkRunCount, after: $checkRunCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkRunView_checkRun\n __typename\n }\n }\n }\n}\n\nfragment checkRunView_checkRun on CheckRun {\n name\n status\n conclusion\n title\n summary\n permalink\n detailsUrl\n}\n", + "text": "query checkRunsAccumulatorQuery(\n $id: ID!\n $checkRunCount: Int!\n $checkRunCursor: String\n) {\n node(id: $id) {\n __typename\n ... on CheckSuite {\n ...checkRunsAccumulator_checkSuite_Rvfr1\n }\n id\n }\n}\n\nfragment checkRunView_checkRun on CheckRun {\n name\n status\n conclusion\n title\n summary\n permalink\n detailsUrl\n}\n\nfragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite {\n id\n checkRuns(first: $checkRunCount, after: $checkRunCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkRunView_checkRun\n __typename\n }\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/containers/accumulators/__generated__/checkRunsAccumulator_checkSuite.graphql.js b/lib/containers/accumulators/__generated__/checkRunsAccumulator_checkSuite.graphql.js index 6c77766c49..ceec76c168 100644 --- a/lib/containers/accumulators/__generated__/checkRunsAccumulator_checkSuite.graphql.js +++ b/lib/containers/accumulators/__generated__/checkRunsAccumulator_checkSuite.graphql.js @@ -9,7 +9,7 @@ /*:: import type { ReaderFragment } from 'relay-runtime'; type checkRunView_checkRun$ref = any; -export type CheckConclusionState = "ACTION_REQUIRED" | "CANCELLED" | "FAILURE" | "NEUTRAL" | "SUCCESS" | "TIMED_OUT" | "%future added value"; +export type CheckConclusionState = "ACTION_REQUIRED" | "CANCELLED" | "FAILURE" | "NEUTRAL" | "SKIPPED" | "STALE" | "STARTUP_FAILURE" | "SUCCESS" | "TIMED_OUT" | "%future added value"; export type CheckStatusState = "COMPLETED" | "IN_PROGRESS" | "QUEUED" | "REQUESTED" | "%future added value"; import type { FragmentReference } from "relay-runtime"; declare export opaque type checkRunsAccumulator_checkSuite$ref: FragmentReference; diff --git a/lib/containers/accumulators/__generated__/checkSuitesAccumulatorQuery.graphql.js b/lib/containers/accumulators/__generated__/checkSuitesAccumulatorQuery.graphql.js index 50eb1bfe8e..0fbe000d07 100644 --- a/lib/containers/accumulators/__generated__/checkSuitesAccumulatorQuery.graphql.js +++ b/lib/containers/accumulators/__generated__/checkSuitesAccumulatorQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash a7dd5634fc91c829036616f04cc09090 + * @relayHash 82a4dc1cfbeddf93b9ee378148cff9ce */ /* eslint-disable */ @@ -44,9 +44,19 @@ query checkSuitesAccumulatorQuery( } } -fragment checkSuitesAccumulator_commit_4ncEVO on Commit { +fragment checkRunView_checkRun on CheckRun { + name + status + conclusion + title + summary + permalink + detailsUrl +} + +fragment checkRunsAccumulator_checkSuite_2YXw6r on CheckSuite { id - checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) { + checkRuns(first: $checkRunCount) { pageInfo { hasNextPage endCursor @@ -57,8 +67,7 @@ fragment checkSuitesAccumulator_commit_4ncEVO on Commit { id status conclusion - ...checkSuiteView_checkSuite - ...checkRunsAccumulator_checkSuite_2YXw6r + ...checkRunView_checkRun __typename } } @@ -74,9 +83,9 @@ fragment checkSuiteView_checkSuite on CheckSuite { conclusion } -fragment checkRunsAccumulator_checkSuite_2YXw6r on CheckSuite { +fragment checkSuitesAccumulator_commit_4ncEVO on Commit { id - checkRuns(first: $checkRunCount) { + checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) { pageInfo { hasNextPage endCursor @@ -87,22 +96,13 @@ fragment checkRunsAccumulator_checkSuite_2YXw6r on CheckSuite { id status conclusion - ...checkRunView_checkRun + ...checkSuiteView_checkSuite + ...checkRunsAccumulator_checkSuite_2YXw6r __typename } } } } - -fragment checkRunView_checkRun on CheckRun { - name - status - conclusion - title - summary - permalink - detailsUrl -} */ const node/*: ConcreteRequest*/ = (function(){ @@ -442,7 +442,7 @@ return { "operationKind": "query", "name": "checkSuitesAccumulatorQuery", "id": null, - "text": "query checkSuitesAccumulatorQuery(\n $id: ID!\n $checkSuiteCount: Int!\n $checkSuiteCursor: String\n $checkRunCount: Int!\n) {\n node(id: $id) {\n __typename\n ... on Commit {\n ...checkSuitesAccumulator_commit_4ncEVO\n }\n id\n }\n}\n\nfragment checkSuitesAccumulator_commit_4ncEVO on Commit {\n id\n checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkSuiteView_checkSuite\n ...checkRunsAccumulator_checkSuite_2YXw6r\n __typename\n }\n }\n }\n}\n\nfragment checkSuiteView_checkSuite on CheckSuite {\n app {\n name\n id\n }\n status\n conclusion\n}\n\nfragment checkRunsAccumulator_checkSuite_2YXw6r on CheckSuite {\n id\n checkRuns(first: $checkRunCount) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkRunView_checkRun\n __typename\n }\n }\n }\n}\n\nfragment checkRunView_checkRun on CheckRun {\n name\n status\n conclusion\n title\n summary\n permalink\n detailsUrl\n}\n", + "text": "query checkSuitesAccumulatorQuery(\n $id: ID!\n $checkSuiteCount: Int!\n $checkSuiteCursor: String\n $checkRunCount: Int!\n) {\n node(id: $id) {\n __typename\n ... on Commit {\n ...checkSuitesAccumulator_commit_4ncEVO\n }\n id\n }\n}\n\nfragment checkRunView_checkRun on CheckRun {\n name\n status\n conclusion\n title\n summary\n permalink\n detailsUrl\n}\n\nfragment checkRunsAccumulator_checkSuite_2YXw6r on CheckSuite {\n id\n checkRuns(first: $checkRunCount) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkRunView_checkRun\n __typename\n }\n }\n }\n}\n\nfragment checkSuiteView_checkSuite on CheckSuite {\n app {\n name\n id\n }\n status\n conclusion\n}\n\nfragment checkSuitesAccumulator_commit_4ncEVO on Commit {\n id\n checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkSuiteView_checkSuite\n ...checkRunsAccumulator_checkSuite_2YXw6r\n __typename\n }\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/containers/accumulators/__generated__/checkSuitesAccumulator_commit.graphql.js b/lib/containers/accumulators/__generated__/checkSuitesAccumulator_commit.graphql.js index d26c355a22..784202f2ea 100644 --- a/lib/containers/accumulators/__generated__/checkSuitesAccumulator_commit.graphql.js +++ b/lib/containers/accumulators/__generated__/checkSuitesAccumulator_commit.graphql.js @@ -10,7 +10,7 @@ import type { ReaderFragment } from 'relay-runtime'; type checkRunsAccumulator_checkSuite$ref = any; type checkSuiteView_checkSuite$ref = any; -export type CheckConclusionState = "ACTION_REQUIRED" | "CANCELLED" | "FAILURE" | "NEUTRAL" | "SUCCESS" | "TIMED_OUT" | "%future added value"; +export type CheckConclusionState = "ACTION_REQUIRED" | "CANCELLED" | "FAILURE" | "NEUTRAL" | "SKIPPED" | "STALE" | "STARTUP_FAILURE" | "SUCCESS" | "TIMED_OUT" | "%future added value"; export type CheckStatusState = "COMPLETED" | "IN_PROGRESS" | "QUEUED" | "REQUESTED" | "%future added value"; import type { FragmentReference } from "relay-runtime"; declare export opaque type checkSuitesAccumulator_commit$ref: FragmentReference; diff --git a/lib/containers/accumulators/__generated__/reviewCommentsAccumulatorQuery.graphql.js b/lib/containers/accumulators/__generated__/reviewCommentsAccumulatorQuery.graphql.js index 7caf390355..1508dbb498 100644 --- a/lib/containers/accumulators/__generated__/reviewCommentsAccumulatorQuery.graphql.js +++ b/lib/containers/accumulators/__generated__/reviewCommentsAccumulatorQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 86521576ed6d95983534962769a6f6e0 + * @relayHash 3aaba36cb5f7b9befa6832a08ff9c11f */ /* eslint-disable */ @@ -42,6 +42,23 @@ query reviewCommentsAccumulatorQuery( } } +fragment emojiReactionsController_reactable on Reactable { + id + ...emojiReactionsView_reactable +} + +fragment emojiReactionsView_reactable on Reactable { + id + reactionGroups { + content + viewerHasReacted + users { + totalCount + } + } + viewerCanReact +} + fragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread { id comments(first: $commentCount, after: $commentCursor) { @@ -80,23 +97,6 @@ fragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThrea } } } - -fragment emojiReactionsController_reactable on Reactable { - id - ...emojiReactionsView_reactable -} - -fragment emojiReactionsView_reactable on Reactable { - id - reactionGroups { - content - viewerHasReacted - users { - totalCount - } - } - viewerCanReact -} */ const node/*: ConcreteRequest*/ = (function(){ @@ -459,7 +459,7 @@ return { "operationKind": "query", "name": "reviewCommentsAccumulatorQuery", "id": null, - "text": "query reviewCommentsAccumulatorQuery(\n $id: ID!\n $commentCount: Int!\n $commentCursor: String\n) {\n node(id: $id) {\n __typename\n ... on PullRequestReviewThread {\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n }\n id\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", + "text": "query reviewCommentsAccumulatorQuery(\n $id: ID!\n $commentCount: Int!\n $commentCursor: String\n) {\n node(id: $id) {\n __typename\n ... on PullRequestReviewThread {\n ...reviewCommentsAccumulator_reviewThread_1VbUmL\n }\n id\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1VbUmL on PullRequestReviewThread {\n id\n comments(first: $commentCount, after: $commentCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/containers/accumulators/__generated__/reviewCommentsAccumulator_reviewThread.graphql.js b/lib/containers/accumulators/__generated__/reviewCommentsAccumulator_reviewThread.graphql.js index ce9d2f7370..0d12e1b7c6 100644 --- a/lib/containers/accumulators/__generated__/reviewCommentsAccumulator_reviewThread.graphql.js +++ b/lib/containers/accumulators/__generated__/reviewCommentsAccumulator_reviewThread.graphql.js @@ -9,7 +9,7 @@ /*:: import type { ReaderFragment } from 'relay-runtime'; type emojiReactionsController_reactable$ref = any; -export type CommentAuthorAssociation = "COLLABORATOR" | "CONTRIBUTOR" | "FIRST_TIMER" | "FIRST_TIME_CONTRIBUTOR" | "MEMBER" | "NONE" | "OWNER" | "%future added value"; +export type CommentAuthorAssociation = "COLLABORATOR" | "CONTRIBUTOR" | "FIRST_TIMER" | "FIRST_TIME_CONTRIBUTOR" | "MANNEQUIN" | "MEMBER" | "NONE" | "OWNER" | "%future added value"; export type PullRequestReviewCommentState = "PENDING" | "SUBMITTED" | "%future added value"; import type { FragmentReference } from "relay-runtime"; declare export opaque type reviewCommentsAccumulator_reviewThread$ref: FragmentReference; diff --git a/lib/containers/accumulators/__generated__/reviewSummariesAccumulatorQuery.graphql.js b/lib/containers/accumulators/__generated__/reviewSummariesAccumulatorQuery.graphql.js index 5b461726ca..aae2eca316 100644 --- a/lib/containers/accumulators/__generated__/reviewSummariesAccumulatorQuery.graphql.js +++ b/lib/containers/accumulators/__generated__/reviewSummariesAccumulatorQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash d618c3ed33b3c3cf6d3a48d314d3e80e + * @relayHash ca680104e44962e2e537a87c1d3b80cc */ /* eslint-disable */ @@ -44,6 +44,23 @@ query reviewSummariesAccumulatorQuery( } } +fragment emojiReactionsController_reactable on Reactable { + id + ...emojiReactionsView_reactable +} + +fragment emojiReactionsView_reactable on Reactable { + id + reactionGroups { + content + viewerHasReacted + users { + totalCount + } + } + viewerCanReact +} + fragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest { url reviews(first: $reviewCount, after: $reviewCursor) { @@ -78,23 +95,6 @@ fragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest { } } } - -fragment emojiReactionsController_reactable on Reactable { - id - ...emojiReactionsView_reactable -} - -fragment emojiReactionsView_reactable on Reactable { - id - reactionGroups { - content - viewerHasReacted - users { - totalCount - } - } - viewerCanReact -} */ const node/*: ConcreteRequest*/ = (function(){ @@ -437,7 +437,7 @@ return { "operationKind": "query", "name": "reviewSummariesAccumulatorQuery", "id": null, - "text": "query reviewSummariesAccumulatorQuery(\n $url: URI!\n $reviewCount: Int!\n $reviewCursor: String\n) {\n resource(url: $url) {\n __typename\n ... on PullRequest {\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n body\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n viewerCanUpdate\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", + "text": "query reviewSummariesAccumulatorQuery(\n $url: URI!\n $reviewCount: Int!\n $reviewCursor: String\n) {\n resource(url: $url) {\n __typename\n ... on PullRequest {\n ...reviewSummariesAccumulator_pullRequest_2zzc96\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment reviewSummariesAccumulator_pullRequest_2zzc96 on PullRequest {\n url\n reviews(first: $reviewCount, after: $reviewCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n body\n bodyHTML\n state\n submittedAt\n lastEditedAt\n url\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n viewerCanUpdate\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/containers/accumulators/__generated__/reviewSummariesAccumulator_pullRequest.graphql.js b/lib/containers/accumulators/__generated__/reviewSummariesAccumulator_pullRequest.graphql.js index 7f058e4f2d..1e201b739b 100644 --- a/lib/containers/accumulators/__generated__/reviewSummariesAccumulator_pullRequest.graphql.js +++ b/lib/containers/accumulators/__generated__/reviewSummariesAccumulator_pullRequest.graphql.js @@ -9,7 +9,7 @@ /*:: import type { ReaderFragment } from 'relay-runtime'; type emojiReactionsController_reactable$ref = any; -export type CommentAuthorAssociation = "COLLABORATOR" | "CONTRIBUTOR" | "FIRST_TIMER" | "FIRST_TIME_CONTRIBUTOR" | "MEMBER" | "NONE" | "OWNER" | "%future added value"; +export type CommentAuthorAssociation = "COLLABORATOR" | "CONTRIBUTOR" | "FIRST_TIMER" | "FIRST_TIME_CONTRIBUTOR" | "MANNEQUIN" | "MEMBER" | "NONE" | "OWNER" | "%future added value"; export type PullRequestReviewState = "APPROVED" | "CHANGES_REQUESTED" | "COMMENTED" | "DISMISSED" | "PENDING" | "%future added value"; import type { FragmentReference } from "relay-runtime"; declare export opaque type reviewSummariesAccumulator_pullRequest$ref: FragmentReference; diff --git a/lib/containers/accumulators/__generated__/reviewThreadsAccumulatorQuery.graphql.js b/lib/containers/accumulators/__generated__/reviewThreadsAccumulatorQuery.graphql.js index 46beeb0e95..0520a0b819 100644 --- a/lib/containers/accumulators/__generated__/reviewThreadsAccumulatorQuery.graphql.js +++ b/lib/containers/accumulators/__generated__/reviewThreadsAccumulatorQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash c0ec05d1a25c7132b5fff75f82d96cce + * @relayHash be25db19c5f00a90f96d8749bda8f67d */ /* eslint-disable */ @@ -46,29 +46,21 @@ query reviewThreadsAccumulatorQuery( } } -fragment reviewThreadsAccumulator_pullRequest_3dVVow on PullRequest { - url - reviewThreads(first: $threadCount, after: $threadCursor) { - pageInfo { - hasNextPage - endCursor - } - edges { - cursor - node { - id - isResolved - resolvedBy { - login - id - } - viewerCanResolve - viewerCanUnresolve - ...reviewCommentsAccumulator_reviewThread_1UlnwR - __typename - } +fragment emojiReactionsController_reactable on Reactable { + id + ...emojiReactionsView_reactable +} + +fragment emojiReactionsView_reactable on Reactable { + id + reactionGroups { + content + viewerHasReacted + users { + totalCount } } + viewerCanReact } fragment reviewCommentsAccumulator_reviewThread_1UlnwR on PullRequestReviewThread { @@ -110,21 +102,29 @@ fragment reviewCommentsAccumulator_reviewThread_1UlnwR on PullRequestReviewThrea } } -fragment emojiReactionsController_reactable on Reactable { - id - ...emojiReactionsView_reactable -} - -fragment emojiReactionsView_reactable on Reactable { - id - reactionGroups { - content - viewerHasReacted - users { - totalCount +fragment reviewThreadsAccumulator_pullRequest_3dVVow on PullRequest { + url + reviewThreads(first: $threadCount, after: $threadCursor) { + pageInfo { + hasNextPage + endCursor + } + edges { + cursor + node { + id + isResolved + resolvedBy { + login + id + } + viewerCanResolve + viewerCanUnresolve + ...reviewCommentsAccumulator_reviewThread_1UlnwR + __typename + } } } - viewerCanReact } */ @@ -590,7 +590,7 @@ return { "operationKind": "query", "name": "reviewThreadsAccumulatorQuery", "id": null, - "text": "query reviewThreadsAccumulatorQuery(\n $url: URI!\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n) {\n resource(url: $url) {\n __typename\n ... on PullRequest {\n ...reviewThreadsAccumulator_pullRequest_3dVVow\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_3dVVow on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1UlnwR\n __typename\n }\n }\n }\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1UlnwR on PullRequestReviewThread {\n id\n comments(first: $commentCount) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n", + "text": "query reviewThreadsAccumulatorQuery(\n $url: URI!\n $threadCount: Int!\n $threadCursor: String\n $commentCount: Int!\n) {\n resource(url: $url) {\n __typename\n ... on PullRequest {\n ...reviewThreadsAccumulator_pullRequest_3dVVow\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment reviewCommentsAccumulator_reviewThread_1UlnwR on PullRequestReviewThread {\n id\n comments(first: $commentCount) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n author {\n __typename\n avatarUrl\n login\n url\n ... on Node {\n id\n }\n }\n bodyHTML\n body\n isMinimized\n state\n viewerCanReact\n viewerCanUpdate\n path\n position\n createdAt\n lastEditedAt\n url\n authorAssociation\n ...emojiReactionsController_reactable\n __typename\n }\n }\n }\n}\n\nfragment reviewThreadsAccumulator_pullRequest_3dVVow on PullRequest {\n url\n reviewThreads(first: $threadCount, after: $threadCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n isResolved\n resolvedBy {\n login\n id\n }\n viewerCanResolve\n viewerCanUnresolve\n ...reviewCommentsAccumulator_reviewThread_1UlnwR\n __typename\n }\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/containers/git-tab-container.js b/lib/containers/git-tab-container.js index e8ddef3cf7..bdcda090c2 100644 --- a/lib/containers/git-tab-container.js +++ b/lib/containers/git-tab-container.js @@ -2,13 +2,15 @@ import React from 'react'; import PropTypes from 'prop-types'; import yubikiri from 'yubikiri'; -import {autobind} from '../helpers'; import {nullCommit} from '../models/commit'; import {nullBranch} from '../models/branch'; import ObserveModel from '../views/observe-model'; import GitTabController from '../controllers/git-tab-controller'; const DEFAULT_REPO_DATA = { + repository: null, + username: '', + email: '', lastCommit: nullCommit, recentCommits: [], isMerging: false, @@ -28,14 +30,11 @@ export default class GitTabContainer extends React.Component { repository: PropTypes.object.isRequired, } - constructor(props) { - super(props); - - autobind(this, 'fetchData'); - } - - fetchData(repository) { + fetchData = repository => { return yubikiri({ + repository, + username: repository.getConfig('user.name').then(n => n || ''), + email: repository.getConfig('user.email').then(n => n || ''), lastCommit: repository.getLastCommit(), recentCommits: repository.getRecentCommits({max: 10}), isMerging: repository.isMerging(), @@ -57,7 +56,17 @@ export default class GitTabContainer extends React.Component { render() { return ( - {data => } + {data => { + const dataProps = data || DEFAULT_REPO_DATA; + + return ( + + ); + }} ); } diff --git a/lib/containers/github-tab-container.js b/lib/containers/github-tab-container.js index 839314c84c..0477e205d5 100644 --- a/lib/containers/github-tab-container.js +++ b/lib/containers/github-tab-container.js @@ -9,7 +9,10 @@ import Refresher from '../models/refresher'; import GitHubTabController from '../controllers/github-tab-controller'; import ObserveModel from '../views/observe-model'; import RemoteSet from '../models/remote-set'; +import {nullRemote} from '../models/remote'; import BranchSet from '../models/branch-set'; +import {nullBranch} from '../models/branch'; +import {DOTCOM} from '../models/endpoint'; export default class GitHubTabContainer extends React.Component { static propTypes = { @@ -77,6 +80,8 @@ export default class GitHubTabContainer extends React.Component { }); } + fetchToken = (loginModel, endpoint) => loginModel.getToken(endpoint.getLoginAccount()); + render() { return ( @@ -85,18 +90,47 @@ export default class GitHubTabContainer extends React.Component { ); } - renderRepositoryData = data => { - if (!data || this.props.repository.isLoading()) { + renderRepositoryData = repoData => { + let endpoint = DOTCOM; + + if (repoData) { + repoData.githubRemotes = repoData.allRemotes.filter(remote => remote.isGithubRepo()); + repoData.currentBranch = repoData.branches.getHeadBranch(); + + repoData.currentRemote = repoData.githubRemotes.withName(repoData.selectedRemoteName); + repoData.manyRemotesAvailable = false; + if (!repoData.currentRemote.isPresent() && repoData.githubRemotes.size() === 1) { + repoData.currentRemote = Array.from(repoData.githubRemotes)[0]; + } else if (!repoData.currentRemote.isPresent() && repoData.githubRemotes.size() > 1) { + repoData.manyRemotesAvailable = true; + } + repoData.endpoint = endpoint = repoData.currentRemote.getEndpointOrDotcom(); + } + + return ( + + {token => this.renderToken(token, repoData)} + + ); + } + + renderToken(token, repoData) { + if (!repoData || this.props.repository.isLoading()) { return ( ); } @@ -108,20 +142,26 @@ export default class GitHubTabContainer extends React.Component { refresher={this.state.refresher} allRemotes={new RemoteSet()} + githubRemotes={new RemoteSet()} + currentRemote={nullRemote} branches={new BranchSet()} + currentBranch={nullBranch} aheadCount={0} + manyRemotesAvailable={false} pushInProgress={false} isLoading={false} + token={token} /> ); } return ( ); } diff --git a/lib/containers/github-tab-header-container.js b/lib/containers/github-tab-header-container.js new file mode 100644 index 0000000000..17224df13f --- /dev/null +++ b/lib/containers/github-tab-header-container.js @@ -0,0 +1,102 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import {QueryRenderer, graphql} from 'react-relay'; + +import {EndpointPropType, TokenPropType} from '../prop-types'; +import RelayNetworkLayerManager from '../relay-network-layer-manager'; +import {UNAUTHENTICATED, INSUFFICIENT} from '../shared/keytar-strategy'; +import Author, {nullAuthor} from '../models/author'; +import GithubTabHeaderController from '../controllers/github-tab-header-controller'; + +export default class GithubTabHeaderContainer extends React.Component { + static propTypes = { + // Connection + endpoint: EndpointPropType.isRequired, + token: TokenPropType, + + // Workspace + currentWorkDir: PropTypes.string, + contextLocked: PropTypes.bool.isRequired, + changeWorkingDirectory: PropTypes.func.isRequired, + setContextLock: PropTypes.func.isRequired, + getCurrentWorkDirs: PropTypes.func.isRequired, + + // Event Handlers + onDidChangeWorkDirs: PropTypes.func, + } + + render() { + if ( + this.props.token == null + || this.props.token instanceof Error + || this.props.token === UNAUTHENTICATED + || this.props.token === INSUFFICIENT + ) { + return this.renderNoResult(); + } + + const environment = RelayNetworkLayerManager.getEnvironmentForHost(this.props.endpoint, this.props.token); + const query = graphql` + query githubTabHeaderContainerQuery { + viewer { + name, + email, + avatarUrl, + login + } + } + `; + + return ( + + ); + } + + renderWithResult = ({error, props}) => { + if (error || props === null) { + return this.renderNoResult(); + } + + // eslint-disable-next-line react/prop-types + const {email, name, avatarUrl, login} = props.viewer; + + return ( + + ); + } + + renderNoResult() { + return ( + + ); + } +} diff --git a/lib/containers/remote-container.js b/lib/containers/remote-container.js index 94d1fe3321..ad18753b9d 100644 --- a/lib/containers/remote-container.js +++ b/lib/containers/remote-container.js @@ -2,21 +2,20 @@ import React from 'react'; import PropTypes from 'prop-types'; import {QueryRenderer, graphql} from 'react-relay'; -import {incrementCounter} from '../reporter-proxy'; -import {RemotePropType, RemoteSetPropType, BranchSetPropType, RefresherPropType, EndpointPropType} from '../prop-types'; +import { + RemotePropType, RemoteSetPropType, BranchSetPropType, RefresherPropType, + EndpointPropType, TokenPropType, +} from '../prop-types'; import RelayNetworkLayerManager from '../relay-network-layer-manager'; -import {UNAUTHENTICATED, INSUFFICIENT} from '../shared/keytar-strategy'; import RemoteController from '../controllers/remote-controller'; -import ObserveModel from '../views/observe-model'; import LoadingView from '../views/loading-view'; import QueryErrorView from '../views/query-error-view'; -import GithubLoginView from '../views/github-login-view'; export default class RemoteContainer extends React.Component { static propTypes = { // Connection - loginModel: PropTypes.object.isRequired, endpoint: EndpointPropType.isRequired, + token: TokenPropType.isRequired, // Repository attributes refresher: RefresherPropType.isRequired, @@ -29,52 +28,13 @@ export default class RemoteContainer extends React.Component { aheadCount: PropTypes.number, // Action methods + handleLogin: PropTypes.func.isRequired, + handleLogout: PropTypes.func.isRequired, onPushBranch: PropTypes.func.isRequired, } - fetchToken = loginModel => { - return loginModel.getToken(this.props.endpoint.getLoginAccount()); - } - render() { - return ( - - {this.renderWithToken} - - ); - } - - renderWithToken = token => { - if (token === null) { - return ; - } - - if (token instanceof Error) { - return ( - - ); - } - - if (token === UNAUTHENTICATED) { - return ; - } - - if (token === INSUFFICIENT) { - return ( - -

- Your token no longer has sufficient authorizations. Please re-authenticate and generate a new one. -

-
- ); - } - - const environment = RelayNetworkLayerManager.getEnvironmentForHost(this.props.endpoint, token); + const environment = RelayNetworkLayerManager.getEnvironmentForHost(this.props.endpoint, this.props.token); const query = graphql` query remoteContainerQuery($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { @@ -96,21 +56,21 @@ export default class RemoteContainer extends React.Component { environment={environment} variables={variables} query={query} - render={result => this.renderWithResult(result, token)} + render={this.renderWithResult} /> ); } - renderWithResult({error, props, retry}, token) { + renderWithResult = ({error, props, retry}) => { this.props.refresher.setRetryCallback(this, retry); if (error) { return ( ); } @@ -122,7 +82,7 @@ export default class RemoteContainer extends React.Component { return ( ); } - - handleLogin = token => { - incrementCounter('github-login'); - this.props.loginModel.setToken(this.props.endpoint.getLoginAccount(), token); - } - - handleLogout = () => { - incrementCounter('github-logout'); - this.props.loginModel.removeToken(this.props.endpoint.getLoginAccount()); - } - - handleTokenRetry = () => this.props.loginModel.didUpdate(); } diff --git a/lib/controllers/__generated__/commentDecorationsController_pullRequests.graphql.js b/lib/controllers/__generated__/commentDecorationsController_pullRequests.graphql.js index 19b45c7308..e81ad36757 100644 --- a/lib/controllers/__generated__/commentDecorationsController_pullRequests.graphql.js +++ b/lib/controllers/__generated__/commentDecorationsController_pullRequests.graphql.js @@ -30,10 +30,10 @@ export type commentDecorationsController_pullRequests = $ReadOnlyArray<{| +$refType: commentDecorationsController_pullRequests$ref, |}>; export type commentDecorationsController_pullRequests$data = commentDecorationsController_pullRequests; -export type commentDecorationsController_pullRequests$key = { +export type commentDecorationsController_pullRequests$key = $ReadOnlyArray<{ +$data?: commentDecorationsController_pullRequests$data, +$fragmentRefs: commentDecorationsController_pullRequests$ref, -}; +}>; */ diff --git a/lib/controllers/__generated__/issueTimelineControllerQuery.graphql.js b/lib/controllers/__generated__/issueTimelineControllerQuery.graphql.js index 0e6be8c8fd..30b258693d 100644 --- a/lib/controllers/__generated__/issueTimelineControllerQuery.graphql.js +++ b/lib/controllers/__generated__/issueTimelineControllerQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash ded8da4da36beb072b57eb871f0652d9 + * @relayHash 7bd37c78149a65bc2e28051101c02b84 */ /* eslint-disable */ @@ -44,39 +44,39 @@ query issueTimelineControllerQuery( } } -fragment issueTimelineController_issue_3D8CP9 on Issue { - url - timelineItems(first: $timelineCount, after: $timelineCursor) { - pageInfo { - endCursor - hasNextPage +fragment crossReferencedEventView_item on CrossReferencedEvent { + id + isCrossRepository + source { + __typename + ... on Issue { + number + title + url + issueState: state } - edges { - cursor - node { - __typename - ...issueCommentView_item - ...crossReferencedEventsView_nodes - ... on Node { + ... on PullRequest { + number + title + url + prState: state + } + ... on RepositoryNode { + repository { + name + isPrivate + owner { + __typename + login id } + id } } - } -} - -fragment issueCommentView_item on IssueComment { - author { - __typename - avatarUrl - login ... on Node { id } } - bodyHTML - createdAt - url } fragment crossReferencedEventsView_nodes on CrossReferencedEvent { @@ -111,38 +111,38 @@ fragment crossReferencedEventsView_nodes on CrossReferencedEvent { ...crossReferencedEventView_item } -fragment crossReferencedEventView_item on CrossReferencedEvent { - id - isCrossRepository - source { +fragment issueCommentView_item on IssueComment { + author { __typename - ... on Issue { - number - title - url - issueState: state + avatarUrl + login + ... on Node { + id } - ... on PullRequest { - number - title - url - prState: state + } + bodyHTML + createdAt + url +} + +fragment issueTimelineController_issue_3D8CP9 on Issue { + url + timelineItems(first: $timelineCount, after: $timelineCursor) { + pageInfo { + endCursor + hasNextPage } - ... on RepositoryNode { - repository { - name - isPrivate - owner { - __typename - login + edges { + cursor + node { + __typename + ...issueCommentView_item + ...crossReferencedEventsView_nodes + ... on Node { id } - id } } - ... on Node { - id - } } } */ @@ -543,7 +543,7 @@ return { "operationKind": "query", "name": "issueTimelineControllerQuery", "id": null, - "text": "query issueTimelineControllerQuery(\n $timelineCount: Int!\n $timelineCursor: String\n $url: URI!\n) {\n resource(url: $url) {\n __typename\n ... on Issue {\n ...issueTimelineController_issue_3D8CP9\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment issueTimelineController_issue_3D8CP9 on Issue {\n url\n timelineItems(first: $timelineCount, after: $timelineCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n __typename\n ...issueCommentView_item\n ...crossReferencedEventsView_nodes\n ... on Node {\n id\n }\n }\n }\n }\n}\n\nfragment issueCommentView_item on IssueComment {\n author {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n bodyHTML\n createdAt\n url\n}\n\nfragment crossReferencedEventsView_nodes on CrossReferencedEvent {\n id\n referencedAt\n isCrossRepository\n actor {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n source {\n __typename\n ... on RepositoryNode {\n repository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n ...crossReferencedEventView_item\n}\n\nfragment crossReferencedEventView_item on CrossReferencedEvent {\n id\n isCrossRepository\n source {\n __typename\n ... on Issue {\n number\n title\n url\n issueState: state\n }\n ... on PullRequest {\n number\n title\n url\n prState: state\n }\n ... on RepositoryNode {\n repository {\n name\n isPrivate\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n}\n", + "text": "query issueTimelineControllerQuery(\n $timelineCount: Int!\n $timelineCursor: String\n $url: URI!\n) {\n resource(url: $url) {\n __typename\n ... on Issue {\n ...issueTimelineController_issue_3D8CP9\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment crossReferencedEventView_item on CrossReferencedEvent {\n id\n isCrossRepository\n source {\n __typename\n ... on Issue {\n number\n title\n url\n issueState: state\n }\n ... on PullRequest {\n number\n title\n url\n prState: state\n }\n ... on RepositoryNode {\n repository {\n name\n isPrivate\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment crossReferencedEventsView_nodes on CrossReferencedEvent {\n id\n referencedAt\n isCrossRepository\n actor {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n source {\n __typename\n ... on RepositoryNode {\n repository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n ...crossReferencedEventView_item\n}\n\nfragment issueCommentView_item on IssueComment {\n author {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n bodyHTML\n createdAt\n url\n}\n\nfragment issueTimelineController_issue_3D8CP9 on Issue {\n url\n timelineItems(first: $timelineCount, after: $timelineCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n __typename\n ...issueCommentView_item\n ...crossReferencedEventsView_nodes\n ... on Node {\n id\n }\n }\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/controllers/__generated__/issueishListController_results.graphql.js b/lib/controllers/__generated__/issueishListController_results.graphql.js index d28255ef57..a6e31fe82f 100644 --- a/lib/controllers/__generated__/issueishListController_results.graphql.js +++ b/lib/controllers/__generated__/issueishListController_results.graphql.js @@ -46,10 +46,10 @@ export type issueishListController_results = $ReadOnlyArray<{| +$refType: issueishListController_results$ref, |}>; export type issueishListController_results$data = issueishListController_results; -export type issueishListController_results$key = { +export type issueishListController_results$key = $ReadOnlyArray<{ +$data?: issueishListController_results$data, +$fragmentRefs: issueishListController_results$ref, -}; +}>; */ diff --git a/lib/controllers/__generated__/prTimelineControllerQuery.graphql.js b/lib/controllers/__generated__/prTimelineControllerQuery.graphql.js index 1f38866558..60205c8e70 100644 --- a/lib/controllers/__generated__/prTimelineControllerQuery.graphql.js +++ b/lib/controllers/__generated__/prTimelineControllerQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 0156e9abedeb1fcba09834652c8ea6f0 + * @relayHash bf7feaaf29c7833fac1992a954c2d676 */ /* eslint-disable */ @@ -44,82 +44,26 @@ query prTimelineControllerQuery( } } -fragment prTimelineController_pullRequest_3D8CP9 on PullRequest { - url - ...headRefForcePushedEventView_issueish - timelineItems(first: $timelineCount, after: $timelineCursor) { - pageInfo { - endCursor - hasNextPage - } - edges { - cursor - node { - __typename - ...commitsView_nodes - ...issueCommentView_item - ...mergedEventView_item - ...headRefForcePushedEventView_item - ...commitCommentThreadView_item - ...crossReferencedEventsView_nodes - ... on Node { - id - } - } - } - } -} - -fragment headRefForcePushedEventView_issueish on PullRequest { - headRefName - headRepositoryOwner { - __typename - login - id - } - repository { - owner { - __typename - login - id - } - id - } -} - -fragment commitsView_nodes on PullRequestCommit { +fragment commitCommentThreadView_item on PullRequestCommitCommentThread { commit { + oid id - author { - name - user { - login + } + comments(first: 100) { + edges { + node { id + ...commitCommentView_item } } - ...commitView_commit } } -fragment issueCommentView_item on IssueComment { +fragment commitCommentView_item on CommitComment { author { __typename - avatarUrl login - ... on Node { - id - } - } - bodyHTML - createdAt - url -} - -fragment mergedEventView_item on MergedEvent { - actor { - __typename avatarUrl - login ... on Node { id } @@ -128,62 +72,71 @@ fragment mergedEventView_item on MergedEvent { oid id } - mergeRefName + bodyHTML createdAt + path + position } -fragment headRefForcePushedEventView_item on HeadRefForcePushedEvent { - actor { - __typename +fragment commitView_commit on Commit { + author { + name avatarUrl - login - ... on Node { + user { + login id } } - beforeCommit { - oid - id - } - afterCommit { - oid - id + committer { + name + avatarUrl + user { + login + id + } } - createdAt + authoredByCommitter + sha: oid + message + messageHeadlineHTML + commitUrl } -fragment commitCommentThreadView_item on PullRequestCommitCommentThread { +fragment commitsView_nodes on PullRequestCommit { commit { - oid id - } - comments(first: 100) { - edges { - node { + author { + name + user { + login id - ...commitCommentView_item } } + ...commitView_commit } } -fragment crossReferencedEventsView_nodes on CrossReferencedEvent { +fragment crossReferencedEventView_item on CrossReferencedEvent { id - referencedAt isCrossRepository - actor { - __typename - login - avatarUrl - ... on Node { - id - } - } source { __typename + ... on Issue { + number + title + url + issueState: state + } + ... on PullRequest { + number + title + url + prState: state + } ... on RepositoryNode { repository { name + isPrivate owner { __typename login @@ -196,30 +149,25 @@ fragment crossReferencedEventsView_nodes on CrossReferencedEvent { id } } - ...crossReferencedEventView_item } -fragment crossReferencedEventView_item on CrossReferencedEvent { +fragment crossReferencedEventsView_nodes on CrossReferencedEvent { id + referencedAt isCrossRepository - source { + actor { __typename - ... on Issue { - number - title - url - issueState: state - } - ... on PullRequest { - number - title - url - prState: state + login + avatarUrl + ... on Node { + id } + } + source { + __typename ... on RepositoryNode { repository { name - isPrivate owner { __typename login @@ -232,49 +180,101 @@ fragment crossReferencedEventView_item on CrossReferencedEvent { id } } + ...crossReferencedEventView_item } -fragment commitCommentView_item on CommitComment { - author { +fragment headRefForcePushedEventView_issueish on PullRequest { + headRefName + headRepositoryOwner { __typename login + id + } + repository { + owner { + __typename + login + id + } + id + } +} + +fragment headRefForcePushedEventView_item on HeadRefForcePushedEvent { + actor { + __typename avatarUrl + login ... on Node { id } } - commit { + beforeCommit { + oid + id + } + afterCommit { oid id } - bodyHTML createdAt - path - position } -fragment commitView_commit on Commit { +fragment issueCommentView_item on IssueComment { author { - name + __typename avatarUrl - user { - login + login + ... on Node { id } } - committer { - name + bodyHTML + createdAt + url +} + +fragment mergedEventView_item on MergedEvent { + actor { + __typename avatarUrl - user { - login + login + ... on Node { id } } - authoredByCommitter - sha: oid - message - messageHeadlineHTML - commitUrl + commit { + oid + id + } + mergeRefName + createdAt +} + +fragment prTimelineController_pullRequest_3D8CP9 on PullRequest { + url + ...headRefForcePushedEventView_issueish + timelineItems(first: $timelineCount, after: $timelineCursor) { + pageInfo { + endCursor + hasNextPage + } + edges { + cursor + node { + __typename + ...commitsView_nodes + ...issueCommentView_item + ...mergedEventView_item + ...headRefForcePushedEventView_item + ...commitCommentThreadView_item + ...crossReferencedEventsView_nodes + ... on Node { + id + } + } + } + } } */ @@ -953,7 +953,7 @@ return { "operationKind": "query", "name": "prTimelineControllerQuery", "id": null, - "text": "query prTimelineControllerQuery(\n $timelineCount: Int!\n $timelineCursor: String\n $url: URI!\n) {\n resource(url: $url) {\n __typename\n ... on PullRequest {\n ...prTimelineController_pullRequest_3D8CP9\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment prTimelineController_pullRequest_3D8CP9 on PullRequest {\n url\n ...headRefForcePushedEventView_issueish\n timelineItems(first: $timelineCount, after: $timelineCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n __typename\n ...commitsView_nodes\n ...issueCommentView_item\n ...mergedEventView_item\n ...headRefForcePushedEventView_item\n ...commitCommentThreadView_item\n ...crossReferencedEventsView_nodes\n ... on Node {\n id\n }\n }\n }\n }\n}\n\nfragment headRefForcePushedEventView_issueish on PullRequest {\n headRefName\n headRepositoryOwner {\n __typename\n login\n id\n }\n repository {\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment commitsView_nodes on PullRequestCommit {\n commit {\n id\n author {\n name\n user {\n login\n id\n }\n }\n ...commitView_commit\n }\n}\n\nfragment issueCommentView_item on IssueComment {\n author {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n bodyHTML\n createdAt\n url\n}\n\nfragment mergedEventView_item on MergedEvent {\n actor {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n commit {\n oid\n id\n }\n mergeRefName\n createdAt\n}\n\nfragment headRefForcePushedEventView_item on HeadRefForcePushedEvent {\n actor {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n beforeCommit {\n oid\n id\n }\n afterCommit {\n oid\n id\n }\n createdAt\n}\n\nfragment commitCommentThreadView_item on PullRequestCommitCommentThread {\n commit {\n oid\n id\n }\n comments(first: 100) {\n edges {\n node {\n id\n ...commitCommentView_item\n }\n }\n }\n}\n\nfragment crossReferencedEventsView_nodes on CrossReferencedEvent {\n id\n referencedAt\n isCrossRepository\n actor {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n source {\n __typename\n ... on RepositoryNode {\n repository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n ...crossReferencedEventView_item\n}\n\nfragment crossReferencedEventView_item on CrossReferencedEvent {\n id\n isCrossRepository\n source {\n __typename\n ... on Issue {\n number\n title\n url\n issueState: state\n }\n ... on PullRequest {\n number\n title\n url\n prState: state\n }\n ... on RepositoryNode {\n repository {\n name\n isPrivate\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment commitCommentView_item on CommitComment {\n author {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n commit {\n oid\n id\n }\n bodyHTML\n createdAt\n path\n position\n}\n\nfragment commitView_commit on Commit {\n author {\n name\n avatarUrl\n user {\n login\n id\n }\n }\n committer {\n name\n avatarUrl\n user {\n login\n id\n }\n }\n authoredByCommitter\n sha: oid\n message\n messageHeadlineHTML\n commitUrl\n}\n", + "text": "query prTimelineControllerQuery(\n $timelineCount: Int!\n $timelineCursor: String\n $url: URI!\n) {\n resource(url: $url) {\n __typename\n ... on PullRequest {\n ...prTimelineController_pullRequest_3D8CP9\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment commitCommentThreadView_item on PullRequestCommitCommentThread {\n commit {\n oid\n id\n }\n comments(first: 100) {\n edges {\n node {\n id\n ...commitCommentView_item\n }\n }\n }\n}\n\nfragment commitCommentView_item on CommitComment {\n author {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n commit {\n oid\n id\n }\n bodyHTML\n createdAt\n path\n position\n}\n\nfragment commitView_commit on Commit {\n author {\n name\n avatarUrl\n user {\n login\n id\n }\n }\n committer {\n name\n avatarUrl\n user {\n login\n id\n }\n }\n authoredByCommitter\n sha: oid\n message\n messageHeadlineHTML\n commitUrl\n}\n\nfragment commitsView_nodes on PullRequestCommit {\n commit {\n id\n author {\n name\n user {\n login\n id\n }\n }\n ...commitView_commit\n }\n}\n\nfragment crossReferencedEventView_item on CrossReferencedEvent {\n id\n isCrossRepository\n source {\n __typename\n ... on Issue {\n number\n title\n url\n issueState: state\n }\n ... on PullRequest {\n number\n title\n url\n prState: state\n }\n ... on RepositoryNode {\n repository {\n name\n isPrivate\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment crossReferencedEventsView_nodes on CrossReferencedEvent {\n id\n referencedAt\n isCrossRepository\n actor {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n source {\n __typename\n ... on RepositoryNode {\n repository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n ...crossReferencedEventView_item\n}\n\nfragment headRefForcePushedEventView_issueish on PullRequest {\n headRefName\n headRepositoryOwner {\n __typename\n login\n id\n }\n repository {\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment headRefForcePushedEventView_item on HeadRefForcePushedEvent {\n actor {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n beforeCommit {\n oid\n id\n }\n afterCommit {\n oid\n id\n }\n createdAt\n}\n\nfragment issueCommentView_item on IssueComment {\n author {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n bodyHTML\n createdAt\n url\n}\n\nfragment mergedEventView_item on MergedEvent {\n actor {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n commit {\n oid\n id\n }\n mergeRefName\n createdAt\n}\n\nfragment prTimelineController_pullRequest_3D8CP9 on PullRequest {\n url\n ...headRefForcePushedEventView_issueish\n timelineItems(first: $timelineCount, after: $timelineCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n __typename\n ...commitsView_nodes\n ...issueCommentView_item\n ...mergedEventView_item\n ...headRefForcePushedEventView_item\n ...commitCommentThreadView_item\n ...crossReferencedEventsView_nodes\n ... on Node {\n id\n }\n }\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/controllers/editor-conflict-controller.js b/lib/controllers/editor-conflict-controller.js index ad4c3c2848..174f84f724 100644 --- a/lib/controllers/editor-conflict-controller.js +++ b/lib/controllers/editor-conflict-controller.js @@ -48,6 +48,8 @@ export default class EditorConflictController extends React.Component { this.props.editor.onDidDestroy(() => this.props.refreshResolutionProgress(this.props.editor.getPath())), buffer.onDidReload(() => this.reparseConflicts()), ); + + this.scrollToFirstConflict(); } render() { @@ -219,6 +221,19 @@ export default class EditorConflictController extends React.Component { this.updateMarkerCount(); } + scrollToFirstConflict() { + let firstConflict = null; + for (const conflict of this.state.conflicts) { + if (firstConflict == null || firstConflict.getRange().compare(conflict.getRange()) > 0) { + firstConflict = conflict; + } + } + + if (firstConflict) { + this.props.editor.scrollToBufferPosition(firstConflict.getRange().start, {center: true}); + } + } + reparseConflicts() { const newConflicts = new Set(Conflict.allFromEditor(this.props.editor, this.layer, this.props.isRebase)); this.setState({conflicts: newConflicts}); diff --git a/lib/controllers/git-tab-controller.js b/lib/controllers/git-tab-controller.js index 79c153c209..d34d42723f 100644 --- a/lib/controllers/git-tab-controller.js +++ b/lib/controllers/git-tab-controller.js @@ -2,15 +2,14 @@ import path from 'path'; import React from 'react'; import PropTypes from 'prop-types'; +import {TextBuffer} from 'atom'; -import Author from '../models/author'; import GitTabView from '../views/git-tab-view'; import UserStore from '../models/user-store'; import RefHolder from '../models/ref-holder'; import { CommitPropType, BranchPropType, FilePatchItemPropType, MergeConflictItemPropType, RefHolderPropType, } from '../prop-types'; -import {autobind} from '../helpers'; export default class GitTabController extends React.Component { static focus = { @@ -21,6 +20,8 @@ export default class GitTabController extends React.Component { repository: PropTypes.object.isRequired, loginModel: PropTypes.object.isRequired, + username: PropTypes.string.isRequired, + email: PropTypes.string.isRequired, lastCommit: CommitPropType.isRequired, recentCommits: PropTypes.arrayOf(CommitPropType).isRequired, isMerging: PropTypes.bool.isRequired, @@ -34,6 +35,7 @@ export default class GitTabController extends React.Component { mergeMessage: PropTypes.string, fetchInProgress: PropTypes.bool.isRequired, currentWorkDir: PropTypes.string, + repositoryDrift: PropTypes.bool.isRequired, workspace: PropTypes.object.isRequired, commands: PropTypes.object.isRequired, @@ -52,19 +54,15 @@ export default class GitTabController extends React.Component { openFiles: PropTypes.func.isRequired, openInitializeDialog: PropTypes.func.isRequired, controllerRef: RefHolderPropType, + contextLocked: PropTypes.bool.isRequired, changeWorkingDirectory: PropTypes.func.isRequired, + setContextLock: PropTypes.func.isRequired, onDidChangeWorkDirs: PropTypes.func.isRequired, getCurrentWorkDirs: PropTypes.func.isRequired, }; constructor(props, context) { super(props, context); - autobind( - this, - 'attemptStageAllOperation', 'attemptFileStageOperation', 'unstageFiles', 'prepareToCommit', - 'commit', 'updateSelectedCoAuthors', 'undoLastCommit', 'abortMerge', 'resolveAsOurs', 'resolveAsTheirs', - 'checkout', 'rememberLastFocus', 'quietlySelectItem', - ); this.stagingOperationInProgress = false; this.lastFocus = GitTabView.focus.STAGING; @@ -75,8 +73,14 @@ export default class GitTabController extends React.Component { this.state = { selectedCoAuthors: [], + editingIdentity: false, }; + this.usernameBuffer = new TextBuffer({text: props.username}); + this.usernameBuffer.retain(); + this.emailBuffer = new TextBuffer({text: props.email}); + this.emailBuffer.retain(); + this.userStore = new UserStore({ repository: this.props.repository, login: this.props.loginModel, @@ -84,6 +88,14 @@ export default class GitTabController extends React.Component { }); } + static getDerivedStateFromProps(props, state) { + return { + editingIdentity: state.editingIdentity || + (!props.fetchInProgress && props.repository.isPresent() && !props.repositoryDrift) && + (props.username === '' || props.email === ''), + }; + } + render() { return ( { return this.attemptFileStageOperation(['.'], stageStatus); } - attemptFileStageOperation(filePaths, stageStatus) { + attemptFileStageOperation = (filePaths, stageStatus) => { if (this.stagingOperationInProgress) { return { stageOperationPromise: Promise.resolve(), @@ -256,15 +285,15 @@ export default class GitTabController extends React.Component { return this.props.repository.unstageFiles(filePaths); } - async prepareToCommit() { + prepareToCommit = async () => { return !await this.props.ensureGitTab(); } - commit(message, options) { + commit = (message, options) => { return this.props.repository.commit(message, options); } - updateSelectedCoAuthors(selectedCoAuthors, newAuthor) { + updateSelectedCoAuthors = (selectedCoAuthors, newAuthor) => { if (newAuthor) { this.userStore.addUsers([newAuthor]); selectedCoAuthors = selectedCoAuthors.concat([newAuthor]); @@ -272,23 +301,19 @@ export default class GitTabController extends React.Component { this.setState({selectedCoAuthors}); } - async undoLastCommit() { + undoLastCommit = async () => { const repo = this.props.repository; const lastCommit = await repo.getLastCommit(); if (lastCommit.isUnbornRef()) { return null; } await repo.undoLastCommit(); repo.setCommitMessage(lastCommit.getFullMessage()); - - const coAuthors = lastCommit.getCoAuthors().map(author => - new Author(author.email, author.name)); - - this.updateSelectedCoAuthors(coAuthors); + this.updateSelectedCoAuthors(lastCommit.getCoAuthors()); return null; } - async abortMerge() { + abortMerge = async () => { const choice = this.props.confirm({ message: 'Abort merge', detailedMessage: 'Are you sure?', @@ -310,7 +335,7 @@ export default class GitTabController extends React.Component { } } - async resolveAsOurs(paths) { + resolveAsOurs = async paths => { if (this.props.fetchInProgress) { return; } @@ -320,7 +345,7 @@ export default class GitTabController extends React.Component { this.refreshResolutionProgress(false, true); } - async resolveAsTheirs(paths) { + resolveAsTheirs = async paths => { if (this.props.fetchInProgress) { return; } @@ -330,14 +355,40 @@ export default class GitTabController extends React.Component { this.refreshResolutionProgress(false, true); } - checkout(branchName, options) { + checkout = (branchName, options) => { return this.props.repository.checkout(branchName, options); } - rememberLastFocus(event) { + rememberLastFocus = event => { this.lastFocus = this.refView.map(view => view.getFocus(event.target)).getOr(null) || GitTabView.focus.STAGING; } + toggleIdentityEditor = () => this.setState(before => ({editingIdentity: !before.editingIdentity})) + + closeIdentityEditor = () => this.setState({editingIdentity: false}) + + setLocalIdentity = () => this.setIdentity({}); + + setGlobalIdentity = () => this.setIdentity({global: true}); + + async setIdentity(options) { + const newUsername = this.usernameBuffer.getText(); + const newEmail = this.emailBuffer.getText(); + + if (newUsername.length > 0 || options.global) { + await this.props.repository.setConfig('user.name', newUsername, options); + } else { + await this.props.repository.unsetConfig('user.name'); + } + + if (newEmail.length > 0 || options.global) { + await this.props.repository.setConfig('user.email', newEmail, options); + } else { + await this.props.repository.unsetConfig('user.email'); + } + this.closeIdentityEditor(); + } + restoreFocus() { this.refView.map(view => view.setFocus(this.lastFocus)); } diff --git a/lib/controllers/git-tab-header-controller.js b/lib/controllers/git-tab-header-controller.js new file mode 100644 index 0000000000..1e149bb38f --- /dev/null +++ b/lib/controllers/git-tab-header-controller.js @@ -0,0 +1,137 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import {CompositeDisposable} from 'atom'; +import {nullAuthor} from '../models/author'; +import GitTabHeaderView from '../views/git-tab-header-view'; + +export default class GitTabHeaderController extends React.Component { + static propTypes = { + getCommitter: PropTypes.func.isRequired, + + // Workspace + currentWorkDir: PropTypes.string, + getCurrentWorkDirs: PropTypes.func.isRequired, + changeWorkingDirectory: PropTypes.func.isRequired, + contextLocked: PropTypes.bool.isRequired, + setContextLock: PropTypes.func.isRequired, + + // Event Handlers + onDidClickAvatar: PropTypes.func.isRequired, + onDidChangeWorkDirs: PropTypes.func.isRequired, + onDidUpdateRepo: PropTypes.func.isRequired, + } + + constructor(props) { + super(props); + this._isMounted = false; + this.state = { + currentWorkDirs: [], + committer: nullAuthor, + changingLock: null, + changingWorkDir: null, + }; + this.disposable = new CompositeDisposable(); + } + + static getDerivedStateFromProps(props) { + return { + currentWorkDirs: props.getCurrentWorkDirs(), + }; + } + + componentDidMount() { + this._isMounted = true; + this.disposable.add(this.props.onDidChangeWorkDirs(this.resetWorkDirs)); + this.disposable.add(this.props.onDidUpdateRepo(this.updateCommitter)); + this.updateCommitter(); + } + + componentDidUpdate(prevProps) { + if ( + prevProps.onDidChangeWorkDirs !== this.props.onDidChangeWorkDirs + || prevProps.onDidUpdateRepo !== this.props.onDidUpdateRepo + ) { + this.disposable.dispose(); + this.disposable = new CompositeDisposable(); + this.disposable.add(this.props.onDidChangeWorkDirs(this.resetWorkDirs)); + this.disposable.add(this.props.onDidUpdateRepo(this.updateCommitter)); + } + if (prevProps.getCommitter !== this.props.getCommitter) { + this.updateCommitter(); + } + } + + render() { + return ( + + ); + } + + handleLockToggle = async () => { + if (this.state.changingLock !== null) { + return; + } + + const nextLock = !this.props.contextLocked; + try { + this.setState({changingLock: nextLock}); + await this.props.setContextLock(this.getWorkDir(), nextLock); + } finally { + await new Promise(resolve => this.setState({changingLock: null}, resolve)); + } + } + + handleWorkDirSelect = async e => { + if (this.state.changingWorkDir !== null) { + return; + } + + const nextWorkDir = e.target.value; + try { + this.setState({changingWorkDir: nextWorkDir}); + await this.props.changeWorkingDirectory(nextWorkDir); + } finally { + await new Promise(resolve => this.setState({changingWorkDir: null}, resolve)); + } + } + + resetWorkDirs = () => { + this.setState(() => ({ + currentWorkDirs: [], + })); + } + + updateCommitter = async () => { + const committer = await this.props.getCommitter() || nullAuthor; + if (this._isMounted) { + this.setState({committer}); + } + } + + getWorkDir() { + return this.state.changingWorkDir !== null ? this.state.changingWorkDir : this.props.currentWorkDir; + } + + getLocked() { + return this.state.changingLock !== null ? this.state.changingLock : this.props.contextLocked; + } + + componentWillUnmount() { + this._isMounted = false; + this.disposable.dispose(); + } +} diff --git a/lib/controllers/github-tab-controller.js b/lib/controllers/github-tab-controller.js index 6849e52877..5d7a33010e 100644 --- a/lib/controllers/github-tab-controller.js +++ b/lib/controllers/github-tab-controller.js @@ -2,28 +2,37 @@ import React from 'react'; import PropTypes from 'prop-types'; import { - GithubLoginModelPropType, RefHolderPropType, RemoteSetPropType, BranchSetPropType, RefresherPropType, + GithubLoginModelPropType, TokenPropType, RefHolderPropType, + RemoteSetPropType, RemotePropType, BranchSetPropType, BranchPropType, + RefresherPropType, } from '../prop-types'; import GitHubTabView from '../views/github-tab-view'; +import {incrementCounter} from '../reporter-proxy'; export default class GitHubTabController extends React.Component { static propTypes = { workspace: PropTypes.object.isRequired, refresher: RefresherPropType.isRequired, loginModel: GithubLoginModelPropType.isRequired, + token: TokenPropType, rootHolder: RefHolderPropType.isRequired, workingDirectory: PropTypes.string, repository: PropTypes.object.isRequired, allRemotes: RemoteSetPropType.isRequired, + githubRemotes: RemoteSetPropType.isRequired, + currentRemote: RemotePropType.isRequired, branches: BranchSetPropType.isRequired, - selectedRemoteName: PropTypes.string, - aheadCount: PropTypes.number, + currentBranch: BranchPropType.isRequired, + aheadCount: PropTypes.number.isRequired, + manyRemotesAvailable: PropTypes.bool.isRequired, pushInProgress: PropTypes.bool.isRequired, isLoading: PropTypes.bool.isRequired, currentWorkDir: PropTypes.string, changeWorkingDirectory: PropTypes.func.isRequired, + setContextLock: PropTypes.func.isRequired, + contextLocked: PropTypes.bool.isRequired, onDidChangeWorkDirs: PropTypes.func.isRequired, getCurrentWorkDirs: PropTypes.func.isRequired, openCreateDialog: PropTypes.func.isRequired, @@ -33,38 +42,35 @@ export default class GitHubTabController extends React.Component { } render() { - const gitHubRemotes = this.props.allRemotes.filter(remote => remote.isGithubRepo()); - const currentBranch = this.props.branches.getHeadBranch(); - - let currentRemote = gitHubRemotes.withName(this.props.selectedRemoteName); - let manyRemotesAvailable = false; - if (!currentRemote.isPresent() && gitHubRemotes.size() === 1) { - currentRemote = Array.from(gitHubRemotes)[0]; - } else if (!currentRemote.isPresent() && gitHubRemotes.size() > 1) { - manyRemotesAvailable = true; - } - return ( this.props.openPublishDialog(this.props.repository); + + handleLogin = token => { + incrementCounter('github-login'); + this.props.loginModel.setToken(this.currentEndpoint().getLoginAccount(), token); + } + + handleLogout = () => { + incrementCounter('github-logout'); + this.props.loginModel.removeToken(this.currentEndpoint().getLoginAccount()); + } + + handleTokenRetry = () => this.props.loginModel.didUpdate(); + + currentEndpoint() { + return this.props.currentRemote.getEndpointOrDotcom(); + } } diff --git a/lib/controllers/github-tab-header-controller.js b/lib/controllers/github-tab-header-controller.js new file mode 100644 index 0000000000..566a54cf3b --- /dev/null +++ b/lib/controllers/github-tab-header-controller.js @@ -0,0 +1,113 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import {AuthorPropType} from '../prop-types'; +import GithubTabHeaderView from '../views/github-tab-header-view'; + +export default class GithubTabHeaderController extends React.Component { + static propTypes = { + user: AuthorPropType.isRequired, + + // Workspace + currentWorkDir: PropTypes.string, + contextLocked: PropTypes.bool.isRequired, + changeWorkingDirectory: PropTypes.func.isRequired, + setContextLock: PropTypes.func.isRequired, + getCurrentWorkDirs: PropTypes.func.isRequired, + + // Event Handlers + onDidChangeWorkDirs: PropTypes.func.isRequired, + } + + constructor(props) { + super(props); + + this.state = { + currentWorkDirs: [], + changingLock: null, + changingWorkDir: null, + }; + } + + static getDerivedStateFromProps(props) { + return { + currentWorkDirs: props.getCurrentWorkDirs(), + }; + } + + componentDidMount() { + this.disposable = this.props.onDidChangeWorkDirs(this.resetWorkDirs); + } + + componentDidUpdate(prevProps) { + if (prevProps.onDidChangeWorkDirs !== this.props.onDidChangeWorkDirs) { + if (this.disposable) { + this.disposable.dispose(); + } + this.disposable = this.props.onDidChangeWorkDirs(this.resetWorkDirs); + } + } + + render() { + return ( + + ); + } + + resetWorkDirs = () => { + this.setState(() => ({ + currentWorkDirs: [], + })); + } + + handleLockToggle = async () => { + if (this.state.changingLock !== null) { + return; + } + + const nextLock = !this.props.contextLocked; + try { + this.setState({changingLock: nextLock}); + await this.props.setContextLock(this.state.changingWorkDir || this.props.currentWorkDir, nextLock); + } finally { + await new Promise(resolve => this.setState({changingLock: null}, resolve)); + } + } + + handleWorkDirChange = async e => { + if (this.state.changingWorkDir !== null) { + return; + } + + const nextWorkDir = e.target.value; + try { + this.setState({changingWorkDir: nextWorkDir}); + await this.props.changeWorkingDirectory(nextWorkDir); + } finally { + await new Promise(resolve => this.setState({changingWorkDir: null}, resolve)); + } + } + + getWorkDir() { + return this.state.changingWorkDir !== null ? this.state.changingWorkDir : this.props.currentWorkDir; + } + + getContextLocked() { + return this.state.changingLock !== null ? this.state.changingLock : this.props.contextLocked; + } + + componentWillUnmount() { + this.disposable.dispose(); + } +} diff --git a/lib/controllers/issueish-list-controller.js b/lib/controllers/issueish-list-controller.js index 94635a6cc6..93ebfa9b61 100644 --- a/lib/controllers/issueish-list-controller.js +++ b/lib/controllers/issueish-list-controller.js @@ -90,15 +90,9 @@ export class BareIssueishListController extends React.Component { return null; } - openOnGitHub = url => { - return new Promise((resolve, reject) => { - shell.openExternal(url, {}, err => { - if (err) { reject(err); } else { - resolve(); - addEvent('open-issueish-in-browser', {package: 'github', component: this.constructor.name}); - } - }); - }); + openOnGitHub = async url => { + await shell.openExternal(url); + addEvent('open-issueish-in-browser', {package: 'github', component: this.constructor.name}); } showActionsMenu = /* istanbul ignore next */ issueish => { diff --git a/lib/controllers/issueish-searches-controller.js b/lib/controllers/issueish-searches-controller.js index 1a9281db88..4d1d79b069 100644 --- a/lib/controllers/issueish-searches-controller.js +++ b/lib/controllers/issueish-searches-controller.js @@ -113,13 +113,8 @@ export default class IssueishSearchesController extends React.Component { }); } - onOpenSearch = search => { + onOpenSearch = async search => { const searchURL = search.getWebURL(this.props.remote); - - return new Promise((resolve, reject) => { - shell.openExternal(searchURL, {}, err => { - if (err) { reject(err); } else { resolve(); } - }); - }); + await shell.openExternal(searchURL); } } diff --git a/lib/controllers/remote-controller.js b/lib/controllers/remote-controller.js index c7121b9f20..f0a38cc497 100644 --- a/lib/controllers/remote-controller.js +++ b/lib/controllers/remote-controller.js @@ -2,9 +2,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import {shell} from 'electron'; -import {autobind} from '../helpers'; import {incrementCounter} from '../reporter-proxy'; -import {RemotePropType, RemoteSetPropType, BranchSetPropType, EndpointPropType} from '../prop-types'; +import {RemotePropType, RemoteSetPropType, BranchSetPropType, EndpointPropType, TokenPropType} from '../prop-types'; import IssueishSearchesController from './issueish-searches-controller'; export default class RemoteController extends React.Component { @@ -20,7 +19,7 @@ export default class RemoteController extends React.Component { // Connection endpoint: EndpointPropType.isRequired, - token: PropTypes.string.isRequired, + token: TokenPropType.isRequired, // Repository derived attributes workingDirectory: PropTypes.string, @@ -35,11 +34,6 @@ export default class RemoteController extends React.Component { onPushBranch: PropTypes.func.isRequired, } - constructor(props) { - super(props); - autobind(this, 'onCreatePr'); - } - render() { return ( { const currentBranch = this.props.branches.getHeadBranch(); const upstream = currentBranch.getUpstream(); if (!upstream.isPresent() || this.props.aheadCount > 0) { @@ -73,15 +67,7 @@ export default class RemoteController extends React.Component { createPrUrl += '/compare/' + encodeURIComponent(currentBranch.getName()); createPrUrl += '?expand=1'; - return new Promise((resolve, reject) => { - shell.openExternal(createPrUrl, {}, err => { - if (err) { - reject(err); - } else { - incrementCounter('create-pull-request'); - resolve(); - } - }); - }); + await shell.openExternal(createPrUrl); + incrementCounter('create-pull-request'); } } diff --git a/lib/controllers/root-controller.js b/lib/controllers/root-controller.js index 708fdc3561..7ba6779ae3 100644 --- a/lib/controllers/root-controller.js +++ b/lib/controllers/root-controller.js @@ -67,7 +67,9 @@ export default class RootController extends React.Component { clone: PropTypes.func.isRequired, // Control + contextLocked: PropTypes.bool.isRequired, changeWorkingDirectory: PropTypes.func.isRequired, + setContextLock: PropTypes.func.isRequired, startOpen: PropTypes.bool, startRevealed: PropTypes.bool, } @@ -294,7 +296,9 @@ export default class RootController extends React.Component { currentWorkDir={this.props.currentWorkDir} getCurrentWorkDirs={getCurrentWorkDirs} onDidChangeWorkDirs={onDidChangeWorkDirs} + contextLocked={this.props.contextLocked} changeWorkingDirectory={this.props.changeWorkingDirectory} + setContextLock={this.props.setContextLock} /> )} @@ -311,7 +315,9 @@ export default class RootController extends React.Component { currentWorkDir={this.props.currentWorkDir} getCurrentWorkDirs={getCurrentWorkDirs} onDidChangeWorkDirs={onDidChangeWorkDirs} + contextLocked={this.props.contextLocked} changeWorkingDirectory={this.props.changeWorkingDirectory} + setContextLock={this.props.setContextLock} openCreateDialog={this.openCreateDialog} openPublishDialog={this.openPublishDialog} openCloneDialog={this.openCloneDialog} diff --git a/lib/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 0117950c11..b56cdcd641 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -22,6 +22,7 @@ import { import GitTimingsView from './views/git-timings-view'; import File from './models/patch/file'; import WorkerManager from './worker-manager'; +import Author from './models/author'; const MAX_STATUS_OUTPUT_LENGTH = 1024 * 1024 * 10; @@ -773,8 +774,7 @@ export default class GitShellOutStrategy { commits.push({ sha: fields[i] && fields[i].trim(), - authorEmail: fields[i + 1] && fields[i + 1].trim(), - authorName: fields[i + 2] && fields[i + 2].trim(), + author: new Author(fields[i + 1] && fields[i + 1].trim(), fields[i + 2] && fields[i + 2].trim()), authorDate: parseInt(fields[i + 3], 10), messageSubject: fields[i + 4], messageBody, @@ -1007,12 +1007,12 @@ export default class GitShellOutStrategy { let output; try { let args = ['config']; - if (local || atom.inSpecMode()) { args.push('--local'); } + if (local) { args.push('--local'); } args = args.concat(option); output = await this.exec(args); } catch (err) { - if (err.code === 1) { - // No matching config found + if (err.code === 1 || err.code === 128) { + // No matching config found OR --local can only be used inside a git repository return null; } else { throw err; @@ -1022,9 +1022,10 @@ export default class GitShellOutStrategy { return output.trim(); } - setConfig(option, value, {replaceAll} = {}) { + setConfig(option, value, {replaceAll, global} = {}) { let args = ['config']; if (replaceAll) { args.push('--replace-all'); } + if (global) { args.push('--global'); } args = args.concat(option, value); return this.exec(args, {writeOperation: true}); } diff --git a/lib/github-package.js b/lib/github-package.js index f2fb23f72d..99aa8fb59c 100644 --- a/lib/github-package.js +++ b/lib/github-package.js @@ -26,6 +26,8 @@ import {reporterProxy} from './reporter-proxy'; const defaultState = { newProject: true, + activeRepositoryPath: null, + contextLocked: false, }; export default class GithubPackage { @@ -71,6 +73,7 @@ export default class GithubPackage { this.activeContextQueue = new AsyncQueue(); this.guessedContext = WorkdirContext.guess(criteria, this.pipelineManager); this.activeContext = this.guessedContext; + this.lockedContext = null; this.workdirCache = new WorkdirCache(); this.contextPool = new WorkdirContextPool({ window, @@ -159,10 +162,10 @@ export default class GithubPackage { } async activate(state = {}) { - this.savedState = {...defaultState, ...state}; + const savedState = {...defaultState, ...state}; const firstRun = !await fileExists(this.configPath); - const newProject = this.savedState.firstRun !== undefined ? this.savedState.firstRun : this.savedState.newProject; + const newProject = savedState.firstRun !== undefined ? savedState.firstRun : savedState.newProject; this.startOpen = firstRun || newProject; this.startRevealed = firstRun && !this.config.get('welcome.showOnStartup'); @@ -175,14 +178,9 @@ export default class GithubPackage { return !!event.target.closest('.github-FilePatchListView').querySelector('.is-selected'); }; - const handleProjectPathsChange = () => { - const activeRepository = this.getActiveRepository(); - const activeRepositoryPath = activeRepository ? activeRepository.getWorkingDirectoryPath() : null; - this.scheduleActiveContextUpdate({activeRepositoryPath}); - }; - this.subscriptions.add( - this.project.onDidChangePaths(handleProjectPathsChange), + this.workspace.getCenter().onDidChangeActivePaneItem(this.handleActivePaneItemChange), + this.project.onDidChangePaths(this.handleProjectPathsChange), this.styleCalculator.startWatching( 'github-package-styles', ['editor.fontSize', 'editor.fontFamily', 'editor.lineHeight', 'editor.tabLength'], @@ -243,16 +241,33 @@ export default class GithubPackage { ); this.activated = true; - this.scheduleActiveContextUpdate(this.savedState); + this.scheduleActiveContextUpdate({ + usePath: savedState.activeRepositoryPath, + lock: savedState.contextLocked, + }); this.rerender(); } - serialize() { - const activeRepository = this.getActiveRepository(); - const activeRepositoryPath = activeRepository ? activeRepository.getWorkingDirectoryPath() : null; + handleActivePaneItemChange = () => { + if (this.lockedContext) { + return; + } + + const itemPath = pathForPaneItem(this.workspace.getCenter().getActivePaneItem()); + this.scheduleActiveContextUpdate({ + usePath: itemPath, + lock: false, + }); + } + + handleProjectPathsChange = () => { + this.scheduleActiveContextUpdate(); + } + serialize() { return { - activeRepositoryPath, + activeRepositoryPath: this.getActiveWorkdir(), + contextLocked: Boolean(this.lockedContext), newProject: false, }; } @@ -275,7 +290,11 @@ export default class GithubPackage { } const changeWorkingDirectory = workingDirectory => { - this.scheduleActiveContextUpdate({activeRepositoryPath: workingDirectory}); + return this.scheduleActiveContextUpdate({usePath: workingDirectory}); + }; + + const setContextLock = (workingDirectory, lock) => { + return this.scheduleActiveContextUpdate({usePath: workingDirectory, lock}); }; this.renderFn( @@ -304,7 +323,9 @@ export default class GithubPackage { startRevealed={this.startRevealed} removeFilePatchItem={this.removeFilePatchItem} currentWorkDir={this.getActiveWorkdir()} + contextLocked={this.lockedContext !== null} changeWorkingDirectory={changeWorkingDirectory} + setContextLock={setContextLock} />, this.element, callback, ); } @@ -497,71 +518,181 @@ export default class GithubPackage { return this.switchboard; } - async scheduleActiveContextUpdate(savedState = {}) { + /** + * Enqueue a request to modify the active context. + * + * options: + * usePath - Path of the context to use as the next context, if it is present in the pool. + * lock - True or false to lock the ultimately chosen context. Omit to preserve the current lock state. + * + * This method returns a Promise that resolves when the requested context update has completed. Note that it's + * *possible* for the active context after resolution to differ from a requested `usePath`, if the workdir + * containing `usePath` is no longer a viable option, such as if it belongs to a project that is no longer present. + */ + async scheduleActiveContextUpdate(options = {}) { this.switchboard.didScheduleActiveContextUpdate(); - await this.activeContextQueue.push(this.updateActiveContext.bind(this, savedState), {parallel: false}); + await this.activeContextQueue.push(this.updateActiveContext.bind(this, options), {parallel: false}); } /** * Derive the git working directory context that should be used for the package's git operations based on the current * state of the Atom workspace. In priority, this prefers: * - * - The preferred git working directory set by the user (This is also the working directory that was active when the - * package was last serialized). - * - A git working directory corresponding to "first" Project, whether or not there is a single project or multiple. + * - When activating: the working directory that was active when the package was last serialized, if it still a viable + * option. (usePath) + * - The working directory chosen by the user from the context tile on the git or GitHub tabs. (usePath) + * - The working directory containing the path of the active pane item. + * - A git working directory corresponding to "first" project, if any projects are open. * - The current context, unchanged, which may be a `NullWorkdirContext`. * * First updates the pool of resident contexts to match all git working directories that correspond to open - * projects. + * projects and pane items. */ - async getNextContext(savedState) { + async getNextContext(usePath = null) { + // Internal utility function to normalize paths not contained within a git + // working tree. + const workdirForNonGitPath = async sourcePath => { + const containingRoot = this.project.getDirectories().find(root => root.contains(sourcePath)); + if (containingRoot) { + return containingRoot.getPath(); + /* istanbul ignore else */ + } else if (!(await fs.stat(sourcePath)).isDirectory()) { + return path.dirname(sourcePath); + } else { + return sourcePath; + } + }; + + // Internal utility function to identify the working directory to use for + // an arbitrary (file or directory) path. + const workdirForPath = async sourcePath => { + return (await Promise.all([ + this.workdirCache.find(sourcePath), + workdirForNonGitPath(sourcePath), + ])).find(Boolean); + }; + + // Identify paths that *could* contribute a git working directory to the pool. This is drawn from + // the roots of open projects, the currently locked context if one is present, and the path of the + // open workspace item. + const candidatePaths = new Set(this.project.getPaths()); + if (this.lockedContext) { + const lockedRepo = this.lockedContext.getRepository(); + /* istanbul ignore else */ + if (lockedRepo) { + candidatePaths.add(lockedRepo.getWorkingDirectoryPath()); + } + } + const activeItemPath = pathForPaneItem(this.workspace.getCenter().getActivePaneItem()); + if (activeItemPath) { + candidatePaths.add(activeItemPath); + } + + let activeItemWorkdir = null; + let firstProjectWorkdir = null; + + // Convert the candidate paths into the set of viable git working directories, by means of a cached + // `git rev-parse` call. Candidate paths that are not contained within a git working directory will + // be preserved as-is within the pool, to allow users to initialize them. const workdirs = new Set( await Promise.all( - this.project.getPaths().map(async projectPath => { - const workdir = await this.workdirCache.find(projectPath); - return workdir || projectPath; + Array.from(candidatePaths, async candidatePath => { + const workdir = await workdirForPath(candidatePath); + + // Note the workdirs associated with the active pane item and the first open project so we can + // prefer them later. + if (candidatePath === activeItemPath) { + activeItemWorkdir = workdir; + } else if (candidatePath === this.project.getPaths()[0]) { + firstProjectWorkdir = workdir; + } + + return workdir; }), ), ); - // Update pool with the open projects - this.contextPool.set(workdirs, savedState); + // Update pool with the identified projects. + this.contextPool.set(workdirs); + + // 1 - Explicitly requested workdir. This is either selected by the user from a context tile or + // deserialized from package state. Choose this context only if it still exists in the pool. + if (usePath) { + // Normalize usePath in a similar fashion to the way we do activeItemPath. + let useWorkdir = usePath; + if (usePath === activeItemPath) { + useWorkdir = activeItemWorkdir; + } else if (usePath === this.project.getPaths()[0]) { + useWorkdir = firstProjectWorkdir; + } else { + useWorkdir = await workdirForPath(usePath); + } - if (savedState.activeRepositoryPath) { - // Preferred git directory (the preferred directory or the last serialized directory). - const stateContext = this.contextPool.getContext(savedState.activeRepositoryPath); - // If the context exists chose it, else continue. + const stateContext = this.contextPool.getContext(useWorkdir); if (stateContext.isPresent()) { return stateContext; } } - const projectPaths = this.project.getPaths(); + // 2 - Use the currently locked context, if one is present. + if (this.lockedContext) { + return this.lockedContext; + } - if (projectPaths.length >= 1) { - // Single or multiple projects (just choose the first, the user can select after) - const projectPath = projectPaths[0]; - const activeWorkingDir = await this.workdirCache.find(projectPath); - return this.contextPool.getContext(activeWorkingDir || projectPath); + // 3 - Follow the active workspace pane item. + if (activeItemWorkdir) { + return this.contextPool.getContext(activeItemWorkdir); } - if (projectPaths.length === 0 && !this.activeContext.getRepository().isUndetermined()) { - // No projects. Revert to the absent context unless we've guessed that more projects are on the way. + // 4 - The first open project. + if (firstProjectWorkdir) { + return this.contextPool.getContext(firstProjectWorkdir); + } + + // No projects. Revert to the absent context unless we've guessed that more projects are on the way. + if (this.project.getPaths().length === 0 && !this.activeContext.getRepository().isUndetermined()) { return WorkdirContext.absent({pipelineManager: this.pipelineManager}); } - // It is only possible to reach here if there there was no preferred directory, there are no project paths and the - // the active context's repository is not undetermined. + // It is only possible to reach here if there there was no preferred directory, there are no project paths, and the + // the active context's repository is not undetermined. Preserve the existing active context. return this.activeContext; } - setActiveContext(nextActiveContext) { + /** + * Modify the active context and re-render the React tree. This should only be done as part of the + * context update queue; use scheduleActiveContextUpdate() to do this. + * + * nextActiveContext - The WorkdirContext to make active next, as derived from the current workspace + * state by getNextContext(). This may be absent or undetermined. + * lock - If true, also set this context as the "locked" one and engage the context lock if it isn't + * already. If false, clear any existing context lock. If null or undefined, leave the lock in its + * existing state. + */ + setActiveContext(nextActiveContext, lock) { if (nextActiveContext !== this.activeContext) { if (this.activeContext === this.guessedContext) { this.guessedContext.destroy(); this.guessedContext = null; } this.activeContext = nextActiveContext; + if (lock === true) { + this.lockedContext = this.activeContext; + } else if (lock === false) { + this.lockedContext = null; + } + + this.rerender(() => { + this.switchboard.didFinishContextChangeRender(); + this.switchboard.didFinishActiveContextUpdate(); + }); + } else if ((lock === true || lock === false) && lock !== (this.lockedContext !== null)) { + if (lock) { + this.lockedContext = this.activeContext; + } else { + this.lockedContext = null; + } + this.rerender(() => { this.switchboard.didFinishContextChangeRender(); this.switchboard.didFinishActiveContextUpdate(); @@ -571,15 +702,22 @@ export default class GithubPackage { } } - async updateActiveContext(savedState = {}) { + /** + * Derive the next active context with getNextContext(), then enact the context change with setActiveContext(). + * + * options: + * usePath - Path of the context to use as the next context, if it is present in the pool. + * lock - True or false to lock the ultimately chosen context. Omit to preserve the current lock state. + */ + async updateActiveContext(options) { if (this.workspace.isDestroyed()) { return; } this.switchboard.didBeginActiveContextUpdate(); - const nextActiveContext = await this.getNextContext(savedState); - this.setActiveContext(nextActiveContext); + const nextActiveContext = await this.getNextContext(options.usePath); + this.setActiveContext(nextActiveContext, options.lock); } async refreshAtomGitRepository(workdir) { @@ -594,3 +732,22 @@ export default class GithubPackage { } } } + +function pathForPaneItem(paneItem) { + if (!paneItem) { + return null; + } + + // Likely GitHub package provided pane item + if (typeof paneItem.getWorkingDirectory === 'function') { + return paneItem.getWorkingDirectory(); + } + + // TextEditor-like + if (typeof paneItem.getPath === 'function') { + return paneItem.getPath(); + } + + // Oh well + return null; +} diff --git a/lib/helpers.js b/lib/helpers.js index 9b4c0738ea..30e694bc98 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -4,6 +4,7 @@ import os from 'os'; import temp from 'temp'; import RefHolder from './models/ref-holder'; +import Author from './models/author'; export const LINE_ENDING_REGEX = /\r?\n/; export const CO_AUTHOR_REGEX = /^co-authored-by. (.+?) <(.+?)>$/i; @@ -415,7 +416,7 @@ export function extractCoAuthorsAndRawCommitMessage(commitMessage) { if (match) { // eslint-disable-next-line no-unused-vars const [_, name, email] = match; - coAuthors.push({name, email}); + coAuthors.push(new Author(email, name)); } else { messageLines.push(line); } diff --git a/lib/models/author.js b/lib/models/author.js index 4a699ecd82..2e1e7e9f10 100644 --- a/lib/models/author.js +++ b/lib/models/author.js @@ -3,11 +3,24 @@ const NEW = Symbol('new'); export const NO_REPLY_GITHUB_EMAIL = 'noreply@github.com'; export default class Author { - constructor(email, fullName, login = null, isNew = null) { + constructor(email, fullName, login = null, isNew = null, avatarUrl = null) { + if (avatarUrl == null) { + const match = (email || '').match(/^(\d+)\+[^@]+@users.noreply.github.com$/); + + if (match) { + avatarUrl = 'https://avatars.githubusercontent.com/u/' + match[1] + '?s=32'; + } else if (email && email !== '') { + avatarUrl = 'https://avatars.githubusercontent.com/u/e?email=' + encodeURIComponent(email) + '&s=32'; + } else { + avatarUrl = ''; + } + } + this.email = email; this.fullName = fullName; this.login = login; this.new = isNew === NEW; + this.avatarUrl = avatarUrl; } static createNew(email, fullName) { @@ -18,6 +31,10 @@ export default class Author { return this.email; } + getAvatarUrl() { + return this.avatarUrl; + } + getFullName() { return this.fullName; } @@ -66,6 +83,10 @@ export const nullAuthor = { return ''; }, + getAvatarUrl() { + return ''; + }, + getFullName() { return ''; }, diff --git a/lib/models/commit.js b/lib/models/commit.js index 81d681d14b..c264975bdc 100644 --- a/lib/models/commit.js +++ b/lib/models/commit.js @@ -16,10 +16,9 @@ export default class Commit { return new Commit({unbornRef: UNBORN}); } - constructor({sha, authorEmail, authorName, coAuthors, authorDate, messageSubject, messageBody, unbornRef, patch}) { + constructor({sha, author, coAuthors, authorDate, messageSubject, messageBody, unbornRef, patch}) { this.sha = sha; - this.authorEmail = authorEmail; - this.authorName = authorName; + this.author = author; this.coAuthors = coAuthors || []; this.authorDate = authorDate; this.messageSubject = messageSubject; @@ -33,12 +32,20 @@ export default class Commit { return this.sha; } + getAuthor() { + return this.author; + } + getAuthorEmail() { - return this.authorEmail; + return this.author.getEmail(); + } + + getAuthorAvatarUrl() { + return this.author.getAvatarUrl(); } getAuthorName() { - return this.authorName; + return this.author.getFullName(); } getAuthorDate() { @@ -149,13 +156,18 @@ export default class Commit { isEqual(other) { // Directly comparable properties - const properties = ['sha', 'authorEmail', 'authorDate', 'messageSubject', 'messageBody', 'unbornRef', 'authorName']; + const properties = ['sha', 'authorDate', 'messageSubject', 'messageBody', 'unbornRef']; for (const property of properties) { if (this[property] !== other[property]) { return false; } } + // Author + if (this.author.getEmail() !== other.getAuthorEmail() || this.author.getFullName() !== other.getAuthorName()) { + return false; + } + // Co-author array if (this.coAuthors.length !== other.coAuthors.length) { return false; @@ -164,7 +176,10 @@ export default class Commit { const thisCoAuthor = this.coAuthors[i]; const otherCoAuthor = other.coAuthors[i]; - if (thisCoAuthor.name !== otherCoAuthor.name || thisCoAuthor.email !== otherCoAuthor.email) { + if ( + thisCoAuthor.getFullName() !== otherCoAuthor.getFullName() + || thisCoAuthor.getEmail() !== otherCoAuthor.getEmail() + ) { return false; } } diff --git a/lib/models/discard-history.js b/lib/models/discard-history.js index 3521ae3b81..01a211212e 100644 --- a/lib/models/discard-history.js +++ b/lib/models/discard-history.js @@ -127,7 +127,7 @@ export default class DiscardHistory { await this.expandBlobToFile(path.join(tempFolderPath, `${filePath}-before-discard`), beforeSha); const commonBasePath = !afterSha ? null : await this.expandBlobToFile(path.join(tempFolderPath, `${filePath}-after-discard`), afterSha); - const resultPath = path.join(tempFolderPath, `~${path.basename(filePath)}-merge-result`); + const resultPath = path.join(dir, `~${path.basename(filePath)}-merge-result`); return {filePath, commonBasePath, theirsPath, resultPath, theirsSha: beforeSha, commonBaseSha: afterSha}; }); return await Promise.all(pathPromises); diff --git a/lib/models/endpoint.js b/lib/models/endpoint.js index 3fc5fd2fef..6dbe54b4bc 100644 --- a/lib/models/endpoint.js +++ b/lib/models/endpoint.js @@ -30,11 +30,11 @@ class Endpoint { } // API endpoint for GitHub.com -const dotcomEndpoint = new Endpoint('github.com', 'api.github.com', []); +export const DOTCOM = new Endpoint('github.com', 'api.github.com', []); export function getEndpoint(host) { if (host === 'github.com') { - return dotcomEndpoint; + return DOTCOM; } else { return new Endpoint(host, host, ['api', 'v3']); } diff --git a/lib/models/remote.js b/lib/models/remote.js index f9c5dd06ee..895d27f5b1 100644 --- a/lib/models/remote.js +++ b/lib/models/remote.js @@ -1,4 +1,4 @@ -import {getEndpoint} from './endpoint'; +import {getEndpoint, DOTCOM} from './endpoint'; export default class Remote { constructor(name, url) { @@ -57,6 +57,10 @@ export default class Remote { return this.domain === null ? null : getEndpoint(this.domain); } + getEndpointOrDotcom() { + return this.getEndpoint() || DOTCOM; + } + isPresent() { return true; } @@ -135,6 +139,10 @@ export const nullRemote = { return null; }, + getEndpointOrDotcom() { + return DOTCOM; + }, + isPresent() { return false; }, diff --git a/lib/models/repository-states/cache/keys.js b/lib/models/repository-states/cache/keys.js new file mode 100644 index 0000000000..1a58bfbdd0 --- /dev/null +++ b/lib/models/repository-states/cache/keys.js @@ -0,0 +1,164 @@ +class CacheKey { + constructor(primary, groups = []) { + this.primary = primary; + this.groups = groups; + } + + getPrimary() { + return this.primary; + } + + getGroups() { + return this.groups; + } + + removeFromCache(cache, withoutGroup = null) { + cache.removePrimary(this.getPrimary()); + + const groups = this.getGroups(); + for (let i = 0; i < groups.length; i++) { + const group = groups[i]; + if (group === withoutGroup) { + continue; + } + + cache.removeFromGroup(group, this); + } + } + + /* istanbul ignore next */ + toString() { + return `CacheKey(${this.primary})`; + } +} + +class GroupKey { + constructor(group) { + this.group = group; + } + + removeFromCache(cache) { + for (const matchingKey of cache.keysInGroup(this.group)) { + matchingKey.removeFromCache(cache, this.group); + } + } + + /* istanbul ignore next */ + toString() { + return `GroupKey(${this.group})`; + } +} + +export const Keys = { + statusBundle: new CacheKey('status-bundle'), + + stagedChanges: new CacheKey('staged-changes'), + + filePatch: { + _optKey: ({staged}) => (staged ? 's' : 'u'), + + oneWith: (fileName, options) => { // <-- Keys.filePatch + const optKey = Keys.filePatch._optKey(options); + const baseCommit = options.baseCommit || 'head'; + + const extraGroups = []; + if (options.baseCommit) { + extraGroups.push(`file-patch:base-nonhead:path-${fileName}`); + extraGroups.push('file-patch:base-nonhead'); + } else { + extraGroups.push('file-patch:base-head'); + } + + return new CacheKey(`file-patch:${optKey}:${baseCommit}:${fileName}`, [ + 'file-patch', + `file-patch:opt-${optKey}`, + `file-patch:opt-${optKey}:path-${fileName}`, + ...extraGroups, + ]); + }, + + eachWithFileOpts: (fileNames, opts) => { + const keys = []; + for (let i = 0; i < fileNames.length; i++) { + for (let j = 0; j < opts.length; j++) { + keys.push(new GroupKey(`file-patch:opt-${Keys.filePatch._optKey(opts[j])}:path-${fileNames[i]}`)); + } + } + return keys; + }, + + eachNonHeadWithFiles: fileNames => { + return fileNames.map(fileName => new GroupKey(`file-patch:base-nonhead:path-${fileName}`)); + }, + + allAgainstNonHead: new GroupKey('file-patch:base-nonhead'), + + eachWithOpts: (...opts) => opts.map(opt => new GroupKey(`file-patch:opt-${Keys.filePatch._optKey(opt)}`)), + + all: new GroupKey('file-patch'), + }, + + index: { + oneWith: fileName => new CacheKey(`index:${fileName}`, ['index']), + + all: new GroupKey('index'), + }, + + lastCommit: new CacheKey('last-commit'), + + recentCommits: new CacheKey('recent-commits'), + + authors: new CacheKey('authors'), + + branches: new CacheKey('branches'), + + headDescription: new CacheKey('head-description'), + + remotes: new CacheKey('remotes'), + + config: { + _optKey: options => (options.local ? 'l' : ''), + + oneWith: (setting, options) => { + const optKey = Keys.config._optKey(options); + return new CacheKey(`config:${optKey}:${setting}`, ['config', `config:${optKey}`]); + }, + + eachWithSetting: setting => [ + Keys.config.oneWith(setting, {local: true}), + Keys.config.oneWith(setting, {local: false}), + ], + + all: new GroupKey('config'), + }, + + blob: { + oneWith: sha => new CacheKey(`blob:${sha}`, ['blob']), + }, + + // Common collections of keys and patterns for use with invalidate(). + + workdirOperationKeys: fileNames => [ + Keys.statusBundle, + ...Keys.filePatch.eachWithFileOpts(fileNames, [{staged: false}]), + ], + + cacheOperationKeys: fileNames => [ + ...Keys.workdirOperationKeys(fileNames), + ...Keys.filePatch.eachWithFileOpts(fileNames, [{staged: true}]), + ...fileNames.map(Keys.index.oneWith), + Keys.stagedChanges, + ], + + headOperationKeys: () => [ + Keys.headDescription, + Keys.branches, + ...Keys.filePatch.eachWithOpts({staged: true}), + Keys.filePatch.allAgainstNonHead, + Keys.stagedChanges, + Keys.lastCommit, + Keys.recentCommits, + Keys.authors, + Keys.statusBundle, + ], +}; diff --git a/lib/models/repository-states/present.js b/lib/models/repository-states/present.js index 4f8414ee6c..0c0a9d7a09 100644 --- a/lib/models/repository-states/present.js +++ b/lib/models/repository-states/present.js @@ -3,6 +3,7 @@ import {Emitter} from 'event-kit'; import fs from 'fs-extra'; import State from './state'; +import {Keys} from './cache/keys'; import {LargeRepoError} from '../../git-shell-out-strategy'; import {FOCUS} from '../workspace-change-observer'; @@ -102,9 +103,12 @@ export default class Present extends State { return true; } - acceptInvalidation(spec) { + acceptInvalidation(spec, {globally} = {}) { this.cache.invalidate(spec()); this.didUpdate(); + if (globally) { + this.didGloballyInvalidate(spec); + } } invalidateCacheAfterFilesystemChange(events) { @@ -519,10 +523,11 @@ export default class Present extends State { // Configuration - setConfig(setting, value, options) { + setConfig(setting, value, options = {}) { return this.invalidate( () => Keys.config.eachWithSetting(setting), () => this.git().setConfig(setting, value, options), + {globally: options.global}, ); } @@ -930,14 +935,14 @@ export default class Present extends State { return this.cache; } - invalidate(spec, body) { + invalidate(spec, body, options = {}) { return body().then( result => { - this.acceptInvalidation(spec); + this.acceptInvalidation(spec, options); return result; }, err => { - this.acceptInvalidation(spec); + this.acceptInvalidation(spec, options); return Promise.reject(err); }, ); @@ -1048,168 +1053,3 @@ class Cache { this.emitter.dispose(); } } - -class CacheKey { - constructor(primary, groups = []) { - this.primary = primary; - this.groups = groups; - } - - getPrimary() { - return this.primary; - } - - getGroups() { - return this.groups; - } - - removeFromCache(cache, withoutGroup = null) { - cache.removePrimary(this.getPrimary()); - - const groups = this.getGroups(); - for (let i = 0; i < groups.length; i++) { - const group = groups[i]; - if (group === withoutGroup) { - continue; - } - - cache.removeFromGroup(group, this); - } - } - - /* istanbul ignore next */ - toString() { - return `CacheKey(${this.primary})`; - } -} - -class GroupKey { - constructor(group) { - this.group = group; - } - - removeFromCache(cache) { - for (const matchingKey of cache.keysInGroup(this.group)) { - matchingKey.removeFromCache(cache, this.group); - } - } - - /* istanbul ignore next */ - toString() { - return `GroupKey(${this.group})`; - } -} - -const Keys = { - statusBundle: new CacheKey('status-bundle'), - - stagedChanges: new CacheKey('staged-changes'), - - filePatch: { - _optKey: ({staged}) => (staged ? 's' : 'u'), - - oneWith: (fileName, options) => { // <-- Keys.filePatch - const optKey = Keys.filePatch._optKey(options); - const baseCommit = options.baseCommit || 'head'; - - const extraGroups = []; - if (options.baseCommit) { - extraGroups.push(`file-patch:base-nonhead:path-${fileName}`); - extraGroups.push('file-patch:base-nonhead'); - } else { - extraGroups.push('file-patch:base-head'); - } - - return new CacheKey(`file-patch:${optKey}:${baseCommit}:${fileName}`, [ - 'file-patch', - `file-patch:opt-${optKey}`, - `file-patch:opt-${optKey}:path-${fileName}`, - ...extraGroups, - ]); - }, - - eachWithFileOpts: (fileNames, opts) => { - const keys = []; - for (let i = 0; i < fileNames.length; i++) { - for (let j = 0; j < opts.length; j++) { - keys.push(new GroupKey(`file-patch:opt-${Keys.filePatch._optKey(opts[j])}:path-${fileNames[i]}`)); - } - } - return keys; - }, - - eachNonHeadWithFiles: fileNames => { - return fileNames.map(fileName => new GroupKey(`file-patch:base-nonhead:path-${fileName}`)); - }, - - allAgainstNonHead: new GroupKey('file-patch:base-nonhead'), - - eachWithOpts: (...opts) => opts.map(opt => new GroupKey(`file-patch:opt-${Keys.filePatch._optKey(opt)}`)), - - all: new GroupKey('file-patch'), - }, - - index: { - oneWith: fileName => new CacheKey(`index:${fileName}`, ['index']), - - all: new GroupKey('index'), - }, - - lastCommit: new CacheKey('last-commit'), - - recentCommits: new CacheKey('recent-commits'), - - authors: new CacheKey('authors'), - - branches: new CacheKey('branches'), - - headDescription: new CacheKey('head-description'), - - remotes: new CacheKey('remotes'), - - config: { - _optKey: options => (options.local ? 'l' : ''), - - oneWith: (setting, options) => { - const optKey = Keys.config._optKey(options); - return new CacheKey(`config:${optKey}:${setting}`, ['config', `config:${optKey}`]); - }, - - eachWithSetting: setting => [ - Keys.config.oneWith(setting, {local: true}), - Keys.config.oneWith(setting, {local: false}), - ], - - all: new GroupKey('config'), - }, - - blob: { - oneWith: sha => new CacheKey(`blob:${sha}`, ['blob']), - }, - - // Common collections of keys and patterns for use with invalidate(). - - workdirOperationKeys: fileNames => [ - Keys.statusBundle, - ...Keys.filePatch.eachWithFileOpts(fileNames, [{staged: false}]), - ], - - cacheOperationKeys: fileNames => [ - ...Keys.workdirOperationKeys(fileNames), - ...Keys.filePatch.eachWithFileOpts(fileNames, [{staged: true}]), - ...fileNames.map(Keys.index.oneWith), - Keys.stagedChanges, - ], - - headOperationKeys: () => [ - Keys.headDescription, - Keys.branches, - ...Keys.filePatch.eachWithOpts({staged: true}), - Keys.filePatch.allAgainstNonHead, - Keys.stagedChanges, - Keys.lastCommit, - Keys.recentCommits, - Keys.authors, - Keys.statusBundle, - ], -}; diff --git a/lib/models/repository-states/state.js b/lib/models/repository-states/state.js index 9152b98e55..38346acb42 100644 --- a/lib/models/repository-states/state.js +++ b/lib/models/repository-states/state.js @@ -1,8 +1,11 @@ +import path from 'path'; import {nullCommit} from '../commit'; import BranchSet from '../branch-set'; import RemoteSet from '../remote-set'; import {nullOperationStates} from '../operation-states'; import MultiFilePatch from '../patch/multi-file-patch'; +import CompositeGitStrategy from '../../composite-git-strategy'; +import {Keys} from './cache/keys'; /** * Map of registered subclasses to allow states to transition to one another without circular dependencies. @@ -210,8 +213,12 @@ export default class State { // Configuration - setConfig(option, value, {replaceAll} = {}) { - return unsupportedOperationPromise(this, 'setConfig'); + async setConfig(optionName, value, options = {}) { + await this.workdirlessGit().setConfig(optionName, value, options); + this.didUpdate(); + if (options.global) { + this.didGloballyInvalidate(() => Keys.config.eachWithSetting(optionName)); + } } unsetConfig(option) { @@ -357,15 +364,15 @@ export default class State { } getAheadCount(branchName) { - return Promise.resolve(null); + return Promise.resolve(0); } getBehindCount(branchName) { - return Promise.resolve(null); + return Promise.resolve(0); } - getConfig(option, {local} = {}) { - return Promise.resolve(null); + getConfig(optionName, options) { + return this.workdirlessGit().getConfig(optionName, options); } // Direct blob access @@ -412,6 +419,10 @@ export default class State { return null; } + acceptInvalidation() { + return null; + } + // Internal ////////////////////////////////////////////////////////////////////////////////////////////////////////// // Non-delegated methods that provide subclasses with convenient access to Repository properties. @@ -467,9 +478,21 @@ export default class State { return this.repository.emitter.emit('did-update'); } + didGloballyInvalidate(spec) { + return this.repository.emitter.emit('did-globally-invalidate', spec); + } + // Direct git access // Non-delegated git operations for internal use within states. + workdirlessGit() { + // We want to report config values from the global or system level, but never local ones (unless we're in the + // present state, which overrides this). + // The filesystem root is the most likely and convenient place for this to be true. + const {root} = path.parse(process.cwd()); + return CompositeGitStrategy.create(root); + } + /* istanbul ignore next */ directResolveDotGitDir() { return Promise.resolve(null); diff --git a/lib/models/repository.js b/lib/models/repository.js index 79bfaabc8a..a34ab6a7c3 100644 --- a/lib/models/repository.js +++ b/lib/models/repository.js @@ -2,6 +2,7 @@ import path from 'path'; import {Emitter} from 'event-kit'; import fs from 'fs-extra'; +import yubikiri from 'yubikiri'; import {getNullActionPipelineManager} from '../action-pipeline'; import CompositeGitStrategy from '../composite-git-strategy'; @@ -107,6 +108,10 @@ export default class Repository { return this.emitter.on('did-update', callback); } + onDidGloballyInvalidate(callback) { + return this.emitter.on('did-globally-invalidate', callback); + } + onPullError(callback) { return this.emitter.on('pull-error', callback); } @@ -229,18 +234,10 @@ export default class Repository { } async getCommitter(options = {}) { - const output = await this.getConfig(['--get-regexp', '^user.*'], options); - const committer = {name: null, email: null}; - // todo (tt, 4/2018): do we need null byte terminated output here for Windows? - if (output) { - output.trim().split('\n').forEach(line => { - if (line.includes('user.email')) { - committer.email = line.slice(11); - } else if (line.includes('user.name')) { - committer.name = line.slice(10); - } - }); - } + const committer = await yubikiri({ + email: this.getConfig('user.email', options), + name: this.getConfig('user.name', options), + }); return committer.name !== null && committer.email !== null ? new Author(committer.email, committer.name) @@ -379,6 +376,7 @@ const delegates = [ 'getCommitMessage', 'fetchCommitMessageTemplate', 'getCache', + 'acceptInvalidation', ]; for (let i = 0; i < delegates.length; i++) { diff --git a/lib/models/workdir-cache.js b/lib/models/workdir-cache.js index 8a1f229040..a6fbc41c3a 100644 --- a/lib/models/workdir-cache.js +++ b/lib/models/workdir-cache.js @@ -38,10 +38,15 @@ export default class WorkdirCache { const startDir = (await fs.stat(startPath)).isDirectory() ? startPath : path.dirname(startPath); // Within a git worktree, return a non-empty string containing the path to the worktree root. - // Within a gitdir or outside of a worktree, return an empty string. - // Throw if startDir does not exist. - const topLevel = await CompositeGitStrategy.create(startDir).exec(['rev-parse', '--show-toplevel']); - if (/\S/.test(topLevel)) { + // Throw if a gitdir, outside of a worktree, or startDir does not exist. + const topLevel = await CompositeGitStrategy.create(startDir).exec(['rev-parse', '--show-toplevel']) + .catch(e => { + if (/this operation must be run in a work tree/.test(e.stdErr)) { + return null; + } + throw e; + }); + if (topLevel !== null) { return toNativePathSep(topLevel.trim()); } diff --git a/lib/models/workdir-context-pool.js b/lib/models/workdir-context-pool.js index 9bb2f1d891..0ee6e88e4e 100644 --- a/lib/models/workdir-context-pool.js +++ b/lib/models/workdir-context-pool.js @@ -67,6 +67,15 @@ export default class WorkdirContextPool { forwardEvent('onDidUpdateRepository', 'did-update-repository'); forwardEvent('onDidDestroyRepository', 'did-destroy-repository'); + // Propagate global cache invalidations across all resident contexts + disposable.add(context.getRepository().onDidGloballyInvalidate(spec => { + this.withResidentContexts((_workdir, eachContext) => { + if (eachContext !== context) { + eachContext.getRepository().acceptInvalidation(spec); + } + }); + })); + if (!silenceEmitter) { this.emitter.emit('did-change-contexts', {added: new Set([directory])}); } diff --git a/lib/mutations/__generated__/addPrReviewCommentMutation.graphql.js b/lib/mutations/__generated__/addPrReviewCommentMutation.graphql.js index 70b6fdd8e3..ff1010e51a 100644 --- a/lib/mutations/__generated__/addPrReviewCommentMutation.graphql.js +++ b/lib/mutations/__generated__/addPrReviewCommentMutation.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 260cc8d4bf18b2689dae75db2532413a + * @relayHash 538bae86191b750e560b6ad8e2979c29 */ /* eslint-disable */ @@ -10,9 +10,10 @@ /*:: import type { ConcreteRequest } from 'relay-runtime'; type emojiReactionsController_reactable$ref = any; -export type CommentAuthorAssociation = "COLLABORATOR" | "CONTRIBUTOR" | "FIRST_TIMER" | "FIRST_TIME_CONTRIBUTOR" | "MEMBER" | "NONE" | "OWNER" | "%future added value"; +export type CommentAuthorAssociation = "COLLABORATOR" | "CONTRIBUTOR" | "FIRST_TIMER" | "FIRST_TIME_CONTRIBUTOR" | "MANNEQUIN" | "MEMBER" | "NONE" | "OWNER" | "%future added value"; export type AddPullRequestReviewCommentInput = {| - pullRequestReviewId: string, + pullRequestId?: ?string, + pullRequestReviewId?: ?string, commitOID?: ?any, body: string, path?: ?string, diff --git a/lib/mutations/__generated__/addPrReviewMutation.graphql.js b/lib/mutations/__generated__/addPrReviewMutation.graphql.js index 5561cafc4e..bd5c3382c3 100644 --- a/lib/mutations/__generated__/addPrReviewMutation.graphql.js +++ b/lib/mutations/__generated__/addPrReviewMutation.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 51cb9813ae4e3db78b74eccbcb0c1bad + * @relayHash 3e6e96a7019beb78d44c78c7a23ad85d */ /* eslint-disable */ @@ -10,6 +10,7 @@ /*:: import type { ConcreteRequest } from 'relay-runtime'; type emojiReactionsController_reactable$ref = any; +export type DiffSide = "LEFT" | "RIGHT" | "%future added value"; export type PullRequestReviewEvent = "APPROVE" | "COMMENT" | "DISMISS" | "REQUEST_CHANGES" | "%future added value"; export type PullRequestReviewState = "APPROVED" | "CHANGES_REQUESTED" | "COMMENTED" | "DISMISSED" | "PENDING" | "%future added value"; export type AddPullRequestReviewInput = {| @@ -18,6 +19,7 @@ export type AddPullRequestReviewInput = {| body?: ?string, event?: ?PullRequestReviewEvent, comments?: ?$ReadOnlyArray, + threads?: ?$ReadOnlyArray, clientMutationId?: ?string, |}; export type DraftPullRequestReviewComment = {| @@ -25,6 +27,14 @@ export type DraftPullRequestReviewComment = {| position: number, body: string, |}; +export type DraftPullRequestReviewThread = {| + path: string, + line: number, + side?: ?DiffSide, + startLine?: ?number, + startSide?: ?DiffSide, + body: string, +|}; export type addPrReviewMutationVariables = {| input: AddPullRequestReviewInput |}; diff --git a/lib/mutations/__generated__/submitPrReviewMutation.graphql.js b/lib/mutations/__generated__/submitPrReviewMutation.graphql.js index df58712228..129d4091ba 100644 --- a/lib/mutations/__generated__/submitPrReviewMutation.graphql.js +++ b/lib/mutations/__generated__/submitPrReviewMutation.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 1e5a909372f6ceeb9cfa8fa991399495 + * @relayHash 80f1ab174b7e397d863eaebebf19d297 */ /* eslint-disable */ @@ -11,7 +11,8 @@ import type { ConcreteRequest } from 'relay-runtime'; export type PullRequestReviewEvent = "APPROVE" | "COMMENT" | "DISMISS" | "REQUEST_CHANGES" | "%future added value"; export type SubmitPullRequestReviewInput = {| - pullRequestReviewId: string, + pullRequestId?: ?string, + pullRequestReviewId?: ?string, event: PullRequestReviewEvent, body?: ?string, clientMutationId?: ?string, diff --git a/lib/prop-types.js b/lib/prop-types.js index aebfe77dd9..243d1ad22b 100644 --- a/lib/prop-types.js +++ b/lib/prop-types.js @@ -1,5 +1,7 @@ import PropTypes from 'prop-types'; +export const TokenPropType = PropTypes.oneOfType([PropTypes.string, PropTypes.symbol, PropTypes.instanceOf(Error)]); + export const DOMNodePropType = (props, propName, componentName) => { if (props[propName] instanceof HTMLElement) { return null; @@ -71,6 +73,7 @@ export const CommitPropType = PropTypes.shape({ export const AuthorPropType = PropTypes.shape({ getEmail: PropTypes.func.isRequired, getFullName: PropTypes.func.isRequired, + getAvatarUrl: PropTypes.func.isRequired, }); export const RelayConnectionPropType = nodePropType => PropTypes.shape({ diff --git a/lib/relay-network-layer-manager.js b/lib/relay-network-layer-manager.js index 0d359936b1..db77e0a56d 100644 --- a/lib/relay-network-layer-manager.js +++ b/lib/relay-network-layer-manager.js @@ -18,7 +18,7 @@ function logRatelimitApi(headers) { const resetsIn = moment.unix(parseInt(resets, 10)).from(); // eslint-disable-next-line no-console - console.debug(`GitHub API Rate Limit: ${remaining}/${total} — resets ${resetsIn}`); + console.debug(`GitHub API Rate Limiting Info: ${remaining}/${total} requests left — resets ${resetsIn}`); } export function expectRelayQuery(operationPattern, response) { diff --git a/lib/views/__generated__/checkRunView_checkRun.graphql.js b/lib/views/__generated__/checkRunView_checkRun.graphql.js index ea633ed461..0f2b649dfd 100644 --- a/lib/views/__generated__/checkRunView_checkRun.graphql.js +++ b/lib/views/__generated__/checkRunView_checkRun.graphql.js @@ -8,7 +8,7 @@ /*:: import type { ReaderFragment } from 'relay-runtime'; -export type CheckConclusionState = "ACTION_REQUIRED" | "CANCELLED" | "FAILURE" | "NEUTRAL" | "SUCCESS" | "TIMED_OUT" | "%future added value"; +export type CheckConclusionState = "ACTION_REQUIRED" | "CANCELLED" | "FAILURE" | "NEUTRAL" | "SKIPPED" | "STALE" | "STARTUP_FAILURE" | "SUCCESS" | "TIMED_OUT" | "%future added value"; export type CheckStatusState = "COMPLETED" | "IN_PROGRESS" | "QUEUED" | "REQUESTED" | "%future added value"; import type { FragmentReference } from "relay-runtime"; declare export opaque type checkRunView_checkRun$ref: FragmentReference; diff --git a/lib/views/__generated__/checkSuiteView_checkSuite.graphql.js b/lib/views/__generated__/checkSuiteView_checkSuite.graphql.js index 7599ab102a..b93e032a3b 100644 --- a/lib/views/__generated__/checkSuiteView_checkSuite.graphql.js +++ b/lib/views/__generated__/checkSuiteView_checkSuite.graphql.js @@ -8,7 +8,7 @@ /*:: import type { ReaderFragment } from 'relay-runtime'; -export type CheckConclusionState = "ACTION_REQUIRED" | "CANCELLED" | "FAILURE" | "NEUTRAL" | "SUCCESS" | "TIMED_OUT" | "%future added value"; +export type CheckConclusionState = "ACTION_REQUIRED" | "CANCELLED" | "FAILURE" | "NEUTRAL" | "SKIPPED" | "STALE" | "STARTUP_FAILURE" | "SUCCESS" | "TIMED_OUT" | "%future added value"; export type CheckStatusState = "COMPLETED" | "IN_PROGRESS" | "QUEUED" | "REQUESTED" | "%future added value"; import type { FragmentReference } from "relay-runtime"; declare export opaque type checkSuiteView_checkSuite$ref: FragmentReference; diff --git a/lib/views/__generated__/issueDetailViewRefetchQuery.graphql.js b/lib/views/__generated__/issueDetailViewRefetchQuery.graphql.js index c5e28fc6da..72786fa7e4 100644 --- a/lib/views/__generated__/issueDetailViewRefetchQuery.graphql.js +++ b/lib/views/__generated__/issueDetailViewRefetchQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash bb32b7707f142861ca4a1c09cab001da + * @relayHash 30fb0866995510475e94c3079069bf0e */ /* eslint-disable */ @@ -51,56 +51,71 @@ query issueDetailViewRefetchQuery( } } -fragment issueDetailView_repository on Repository { +fragment crossReferencedEventView_item on CrossReferencedEvent { id - name - owner { + isCrossRepository + source { __typename - login - id + ... on Issue { + number + title + url + issueState: state + } + ... on PullRequest { + number + title + url + prState: state + } + ... on RepositoryNode { + repository { + name + isPrivate + owner { + __typename + login + id + } + id + } + } + ... on Node { + id + } } } -fragment issueDetailView_issue_3D8CP9 on Issue { +fragment crossReferencedEventsView_nodes on CrossReferencedEvent { id - __typename - url - state - number - title - bodyHTML - author { + referencedAt + isCrossRepository + actor { __typename login avatarUrl - url ... on Node { id } } - ...issueTimelineController_issue_3D8CP9 - ...emojiReactionsView_reactable -} - -fragment issueTimelineController_issue_3D8CP9 on Issue { - url - timelineItems(first: $timelineCount, after: $timelineCursor) { - pageInfo { - endCursor - hasNextPage - } - edges { - cursor - node { - __typename - ...issueCommentView_item - ...crossReferencedEventsView_nodes - ... on Node { + source { + __typename + ... on RepositoryNode { + repository { + name + owner { + __typename + login id } + id } } + ... on Node { + id + } } + ...crossReferencedEventView_item } fragment emojiReactionsView_reactable on Reactable { @@ -129,70 +144,55 @@ fragment issueCommentView_item on IssueComment { url } -fragment crossReferencedEventsView_nodes on CrossReferencedEvent { +fragment issueDetailView_issue_3D8CP9 on Issue { id - referencedAt - isCrossRepository - actor { + __typename + url + state + number + title + bodyHTML + author { __typename login avatarUrl + url ... on Node { id } } - source { - __typename - ... on RepositoryNode { - repository { - name - owner { - __typename - login - id - } - id - } - } - ... on Node { - id - } - } - ...crossReferencedEventView_item + ...issueTimelineController_issue_3D8CP9 + ...emojiReactionsView_reactable } -fragment crossReferencedEventView_item on CrossReferencedEvent { +fragment issueDetailView_repository on Repository { id - isCrossRepository - source { + name + owner { __typename - ... on Issue { - number - title - url - issueState: state - } - ... on PullRequest { - number - title - url - prState: state + login + id + } +} + +fragment issueTimelineController_issue_3D8CP9 on Issue { + url + timelineItems(first: $timelineCount, after: $timelineCursor) { + pageInfo { + endCursor + hasNextPage } - ... on RepositoryNode { - repository { - name - isPrivate - owner { - __typename - login + edges { + cursor + node { + __typename + ...issueCommentView_item + ...crossReferencedEventsView_nodes + ... on Node { id } - id } } - ... on Node { - id - } } } */ @@ -717,7 +717,7 @@ return { "operationKind": "query", "name": "issueDetailViewRefetchQuery", "id": null, - "text": "query issueDetailViewRefetchQuery(\n $repoId: ID!\n $issueishId: ID!\n $timelineCount: Int!\n $timelineCursor: String\n) {\n repository: node(id: $repoId) {\n __typename\n ...issueDetailView_repository\n id\n }\n issue: node(id: $issueishId) {\n __typename\n ...issueDetailView_issue_3D8CP9\n id\n }\n}\n\nfragment issueDetailView_repository on Repository {\n id\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment issueDetailView_issue_3D8CP9 on Issue {\n id\n __typename\n url\n state\n number\n title\n bodyHTML\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n ...issueTimelineController_issue_3D8CP9\n ...emojiReactionsView_reactable\n}\n\nfragment issueTimelineController_issue_3D8CP9 on Issue {\n url\n timelineItems(first: $timelineCount, after: $timelineCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n __typename\n ...issueCommentView_item\n ...crossReferencedEventsView_nodes\n ... on Node {\n id\n }\n }\n }\n }\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment issueCommentView_item on IssueComment {\n author {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n bodyHTML\n createdAt\n url\n}\n\nfragment crossReferencedEventsView_nodes on CrossReferencedEvent {\n id\n referencedAt\n isCrossRepository\n actor {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n source {\n __typename\n ... on RepositoryNode {\n repository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n ...crossReferencedEventView_item\n}\n\nfragment crossReferencedEventView_item on CrossReferencedEvent {\n id\n isCrossRepository\n source {\n __typename\n ... on Issue {\n number\n title\n url\n issueState: state\n }\n ... on PullRequest {\n number\n title\n url\n prState: state\n }\n ... on RepositoryNode {\n repository {\n name\n isPrivate\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n}\n", + "text": "query issueDetailViewRefetchQuery(\n $repoId: ID!\n $issueishId: ID!\n $timelineCount: Int!\n $timelineCursor: String\n) {\n repository: node(id: $repoId) {\n __typename\n ...issueDetailView_repository\n id\n }\n issue: node(id: $issueishId) {\n __typename\n ...issueDetailView_issue_3D8CP9\n id\n }\n}\n\nfragment crossReferencedEventView_item on CrossReferencedEvent {\n id\n isCrossRepository\n source {\n __typename\n ... on Issue {\n number\n title\n url\n issueState: state\n }\n ... on PullRequest {\n number\n title\n url\n prState: state\n }\n ... on RepositoryNode {\n repository {\n name\n isPrivate\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment crossReferencedEventsView_nodes on CrossReferencedEvent {\n id\n referencedAt\n isCrossRepository\n actor {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n source {\n __typename\n ... on RepositoryNode {\n repository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n ...crossReferencedEventView_item\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment issueCommentView_item on IssueComment {\n author {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n bodyHTML\n createdAt\n url\n}\n\nfragment issueDetailView_issue_3D8CP9 on Issue {\n id\n __typename\n url\n state\n number\n title\n bodyHTML\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n ...issueTimelineController_issue_3D8CP9\n ...emojiReactionsView_reactable\n}\n\nfragment issueDetailView_repository on Repository {\n id\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment issueTimelineController_issue_3D8CP9 on Issue {\n url\n timelineItems(first: $timelineCount, after: $timelineCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n __typename\n ...issueCommentView_item\n ...crossReferencedEventsView_nodes\n ... on Node {\n id\n }\n }\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/views/__generated__/prCommitsViewQuery.graphql.js b/lib/views/__generated__/prCommitsViewQuery.graphql.js index 2131410369..e44bd46400 100644 --- a/lib/views/__generated__/prCommitsViewQuery.graphql.js +++ b/lib/views/__generated__/prCommitsViewQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash af5f2734f6b59faac9036d3e7419ff5f + * @relayHash 3aff007f0b1660376e5f387923e3ac72 */ /* eslint-disable */ @@ -44,6 +44,19 @@ query prCommitsViewQuery( } } +fragment prCommitView_item on Commit { + committer { + avatarUrl + name + date + } + messageHeadline + messageBody + shortSha: abbreviatedOid + sha: oid + url +} + fragment prCommitsView_pullRequest_38TpXw on PullRequest { url commits(first: $commitCount, after: $commitCursor) { @@ -64,19 +77,6 @@ fragment prCommitsView_pullRequest_38TpXw on PullRequest { } } } - -fragment prCommitView_item on Commit { - committer { - avatarUrl - name - date - } - messageHeadline - messageBody - shortSha: abbreviatedOid - sha: oid - url -} */ const node/*: ConcreteRequest*/ = (function(){ @@ -364,7 +364,7 @@ return { "operationKind": "query", "name": "prCommitsViewQuery", "id": null, - "text": "query prCommitsViewQuery(\n $commitCount: Int!\n $commitCursor: String\n $url: URI!\n) {\n resource(url: $url) {\n __typename\n ... on PullRequest {\n ...prCommitsView_pullRequest_38TpXw\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment prCommitsView_pullRequest_38TpXw on PullRequest {\n url\n commits(first: $commitCount, after: $commitCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n commit {\n id\n ...prCommitView_item\n }\n id\n __typename\n }\n }\n }\n}\n\nfragment prCommitView_item on Commit {\n committer {\n avatarUrl\n name\n date\n }\n messageHeadline\n messageBody\n shortSha: abbreviatedOid\n sha: oid\n url\n}\n", + "text": "query prCommitsViewQuery(\n $commitCount: Int!\n $commitCursor: String\n $url: URI!\n) {\n resource(url: $url) {\n __typename\n ... on PullRequest {\n ...prCommitsView_pullRequest_38TpXw\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment prCommitView_item on Commit {\n committer {\n avatarUrl\n name\n date\n }\n messageHeadline\n messageBody\n shortSha: abbreviatedOid\n sha: oid\n url\n}\n\nfragment prCommitsView_pullRequest_38TpXw on PullRequest {\n url\n commits(first: $commitCount, after: $commitCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n commit {\n id\n ...prCommitView_item\n }\n id\n __typename\n }\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/views/__generated__/prDetailViewRefetchQuery.graphql.js b/lib/views/__generated__/prDetailViewRefetchQuery.graphql.js index 61e45def83..2b64409acc 100644 --- a/lib/views/__generated__/prDetailViewRefetchQuery.graphql.js +++ b/lib/views/__generated__/prDetailViewRefetchQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 01b82ca495f438a77e18cc0fa4a762d8 + * @relayHash a78ba6dc675389ea6933d328c4cca744 */ /* eslint-disable */ @@ -63,184 +63,86 @@ query prDetailViewRefetchQuery( } } -fragment prDetailView_repository on Repository { - id +fragment checkRunView_checkRun on CheckRun { name - owner { - __typename - login - id - } -} - -fragment prDetailView_pullRequest_1UVrY8 on PullRequest { - id - __typename - url - isCrossRepository - changedFiles - state - number + status + conclusion title - bodyHTML - baseRefName - headRefName - countedCommits: commits { - totalCount - } - author { - __typename - login - avatarUrl - url - ... on Node { - id - } - } - ...prCommitsView_pullRequest_38TpXw - ...prStatusesView_pullRequest_1oGSNs - ...prTimelineController_pullRequest_3D8CP9 - ...emojiReactionsController_reactable + summary + permalink + detailsUrl } -fragment prCommitsView_pullRequest_38TpXw on PullRequest { - url - commits(first: $commitCount, after: $commitCursor) { +fragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite { + id + checkRuns(first: $checkRunCount, after: $checkRunCursor) { pageInfo { - endCursor hasNextPage + endCursor } edges { cursor node { - commit { - id - ...prCommitView_item - } id + status + conclusion + ...checkRunView_checkRun __typename } } } } -fragment prStatusesView_pullRequest_1oGSNs on PullRequest { - id - recentCommits: commits(last: 1) { - edges { - node { - commit { - status { - state - contexts { - id - state - ...prStatusContextView_context - } - id - } - ...checkSuitesAccumulator_commit_1oGSNs - id - } - id - } - } +fragment checkSuiteView_checkSuite on CheckSuite { + app { + name + id } + status + conclusion } -fragment prTimelineController_pullRequest_3D8CP9 on PullRequest { - url - ...headRefForcePushedEventView_issueish - timelineItems(first: $timelineCount, after: $timelineCursor) { +fragment checkSuitesAccumulator_commit_1oGSNs on Commit { + id + checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) { pageInfo { - endCursor hasNextPage + endCursor } edges { cursor node { + id + status + conclusion + ...checkSuiteView_checkSuite + ...checkRunsAccumulator_checkSuite_Rvfr1 __typename - ...commitsView_nodes - ...issueCommentView_item - ...mergedEventView_item - ...headRefForcePushedEventView_item - ...commitCommentThreadView_item - ...crossReferencedEventsView_nodes - ... on Node { - id - } } } } } -fragment emojiReactionsController_reactable on Reactable { - id - ...emojiReactionsView_reactable -} - -fragment emojiReactionsView_reactable on Reactable { - id - reactionGroups { - content - viewerHasReacted - users { - totalCount - } - } - viewerCanReact -} - -fragment headRefForcePushedEventView_issueish on PullRequest { - headRefName - headRepositoryOwner { - __typename - login - id - } - repository { - owner { - __typename - login - id - } - id - } -} - -fragment commitsView_nodes on PullRequestCommit { +fragment commitCommentThreadView_item on PullRequestCommitCommentThread { commit { + oid id - author { - name - user { - login + } + comments(first: 100) { + edges { + node { id + ...commitCommentView_item } } - ...commitView_commit } } -fragment issueCommentView_item on IssueComment { +fragment commitCommentView_item on CommitComment { author { __typename - avatarUrl login - ... on Node { - id - } - } - bodyHTML - createdAt - url -} - -fragment mergedEventView_item on MergedEvent { - actor { - __typename avatarUrl - login ... on Node { id } @@ -249,62 +151,71 @@ fragment mergedEventView_item on MergedEvent { oid id } - mergeRefName + bodyHTML createdAt + path + position } -fragment headRefForcePushedEventView_item on HeadRefForcePushedEvent { - actor { - __typename +fragment commitView_commit on Commit { + author { + name avatarUrl - login - ... on Node { + user { + login id } } - beforeCommit { - oid - id - } - afterCommit { - oid - id + committer { + name + avatarUrl + user { + login + id + } } - createdAt + authoredByCommitter + sha: oid + message + messageHeadlineHTML + commitUrl } -fragment commitCommentThreadView_item on PullRequestCommitCommentThread { +fragment commitsView_nodes on PullRequestCommit { commit { - oid id - } - comments(first: 100) { - edges { - node { + author { + name + user { + login id - ...commitCommentView_item } } + ...commitView_commit } } -fragment crossReferencedEventsView_nodes on CrossReferencedEvent { +fragment crossReferencedEventView_item on CrossReferencedEvent { id - referencedAt isCrossRepository - actor { - __typename - login - avatarUrl - ... on Node { - id - } - } source { __typename + ... on Issue { + number + title + url + issueState: state + } + ... on PullRequest { + number + title + url + prState: state + } ... on RepositoryNode { repository { name + isPrivate owner { __typename login @@ -317,30 +228,25 @@ fragment crossReferencedEventsView_nodes on CrossReferencedEvent { id } } - ...crossReferencedEventView_item } -fragment crossReferencedEventView_item on CrossReferencedEvent { +fragment crossReferencedEventsView_nodes on CrossReferencedEvent { id + referencedAt isCrossRepository - source { + actor { __typename - ... on Issue { - number - title - url - issueState: state - } - ... on PullRequest { - number - title - url - prState: state + login + avatarUrl + ... on Node { + id } + } + source { + __typename ... on RepositoryNode { repository { name - isPrivate owner { __typename login @@ -353,130 +259,224 @@ fragment crossReferencedEventView_item on CrossReferencedEvent { id } } + ...crossReferencedEventView_item } -fragment commitCommentView_item on CommitComment { - author { +fragment emojiReactionsController_reactable on Reactable { + id + ...emojiReactionsView_reactable +} + +fragment emojiReactionsView_reactable on Reactable { + id + reactionGroups { + content + viewerHasReacted + users { + totalCount + } + } + viewerCanReact +} + +fragment headRefForcePushedEventView_issueish on PullRequest { + headRefName + headRepositoryOwner { __typename login + id + } + repository { + owner { + __typename + login + id + } + id + } +} + +fragment headRefForcePushedEventView_item on HeadRefForcePushedEvent { + actor { + __typename avatarUrl + login ... on Node { id } } - commit { + beforeCommit { + oid + id + } + afterCommit { oid id } - bodyHTML createdAt - path - position } -fragment commitView_commit on Commit { +fragment issueCommentView_item on IssueComment { author { - name + __typename avatarUrl - user { - login + login + ... on Node { id } } - committer { - name + bodyHTML + createdAt + url +} + +fragment mergedEventView_item on MergedEvent { + actor { + __typename avatarUrl - user { - login + login + ... on Node { id } } - authoredByCommitter - sha: oid - message - messageHeadlineHTML - commitUrl + commit { + oid + id + } + mergeRefName + createdAt } -fragment prStatusContextView_context on StatusContext { - context - description - state - targetUrl +fragment prCommitView_item on Commit { + committer { + avatarUrl + name + date + } + messageHeadline + messageBody + shortSha: abbreviatedOid + sha: oid + url } -fragment checkSuitesAccumulator_commit_1oGSNs on Commit { - id - checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) { +fragment prCommitsView_pullRequest_38TpXw on PullRequest { + url + commits(first: $commitCount, after: $commitCursor) { pageInfo { - hasNextPage endCursor + hasNextPage } edges { cursor node { + commit { + id + ...prCommitView_item + } id - status - conclusion - ...checkSuiteView_checkSuite - ...checkRunsAccumulator_checkSuite_Rvfr1 __typename } } } } -fragment checkSuiteView_checkSuite on CheckSuite { - app { - name +fragment prDetailView_pullRequest_1UVrY8 on PullRequest { + id + __typename + url + isCrossRepository + changedFiles + state + number + title + bodyHTML + baseRefName + headRefName + countedCommits: commits { + totalCount + } + author { + __typename + login + avatarUrl + url + ... on Node { + id + } + } + ...prCommitsView_pullRequest_38TpXw + ...prStatusesView_pullRequest_1oGSNs + ...prTimelineController_pullRequest_3D8CP9 + ...emojiReactionsController_reactable +} + +fragment prDetailView_repository on Repository { + id + name + owner { + __typename + login id } - status - conclusion } -fragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite { +fragment prStatusContextView_context on StatusContext { + context + description + state + targetUrl +} + +fragment prStatusesView_pullRequest_1oGSNs on PullRequest { id - checkRuns(first: $checkRunCount, after: $checkRunCursor) { + recentCommits: commits(last: 1) { + edges { + node { + commit { + status { + state + contexts { + id + state + ...prStatusContextView_context + } + id + } + ...checkSuitesAccumulator_commit_1oGSNs + id + } + id + } + } + } +} + +fragment prTimelineController_pullRequest_3D8CP9 on PullRequest { + url + ...headRefForcePushedEventView_issueish + timelineItems(first: $timelineCount, after: $timelineCursor) { pageInfo { - hasNextPage endCursor + hasNextPage } edges { cursor node { - id - status - conclusion - ...checkRunView_checkRun __typename + ...commitsView_nodes + ...issueCommentView_item + ...mergedEventView_item + ...headRefForcePushedEventView_item + ...commitCommentThreadView_item + ...crossReferencedEventsView_nodes + ... on Node { + id + } } } } } - -fragment checkRunView_checkRun on CheckRun { - name - status - conclusion - title - summary - permalink - detailsUrl -} - -fragment prCommitView_item on Commit { - committer { - avatarUrl - name - date - } - messageHeadline - messageBody - shortSha: abbreviatedOid - sha: oid - url -} */ const node/*: ConcreteRequest*/ = (function(){ @@ -1769,7 +1769,7 @@ return { "operationKind": "query", "name": "prDetailViewRefetchQuery", "id": null, - "text": "query prDetailViewRefetchQuery(\n $repoId: ID!\n $issueishId: ID!\n $timelineCount: Int!\n $timelineCursor: String\n $commitCount: Int!\n $commitCursor: String\n $checkSuiteCount: Int!\n $checkSuiteCursor: String\n $checkRunCount: Int!\n $checkRunCursor: String\n) {\n repository: node(id: $repoId) {\n __typename\n ...prDetailView_repository\n id\n }\n pullRequest: node(id: $issueishId) {\n __typename\n ...prDetailView_pullRequest_1UVrY8\n id\n }\n}\n\nfragment prDetailView_repository on Repository {\n id\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment prDetailView_pullRequest_1UVrY8 on PullRequest {\n id\n __typename\n url\n isCrossRepository\n changedFiles\n state\n number\n title\n bodyHTML\n baseRefName\n headRefName\n countedCommits: commits {\n totalCount\n }\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n ...prCommitsView_pullRequest_38TpXw\n ...prStatusesView_pullRequest_1oGSNs\n ...prTimelineController_pullRequest_3D8CP9\n ...emojiReactionsController_reactable\n}\n\nfragment prCommitsView_pullRequest_38TpXw on PullRequest {\n url\n commits(first: $commitCount, after: $commitCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n commit {\n id\n ...prCommitView_item\n }\n id\n __typename\n }\n }\n }\n}\n\nfragment prStatusesView_pullRequest_1oGSNs on PullRequest {\n id\n recentCommits: commits(last: 1) {\n edges {\n node {\n commit {\n status {\n state\n contexts {\n id\n state\n ...prStatusContextView_context\n }\n id\n }\n ...checkSuitesAccumulator_commit_1oGSNs\n id\n }\n id\n }\n }\n }\n}\n\nfragment prTimelineController_pullRequest_3D8CP9 on PullRequest {\n url\n ...headRefForcePushedEventView_issueish\n timelineItems(first: $timelineCount, after: $timelineCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n __typename\n ...commitsView_nodes\n ...issueCommentView_item\n ...mergedEventView_item\n ...headRefForcePushedEventView_item\n ...commitCommentThreadView_item\n ...crossReferencedEventsView_nodes\n ... on Node {\n id\n }\n }\n }\n }\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment headRefForcePushedEventView_issueish on PullRequest {\n headRefName\n headRepositoryOwner {\n __typename\n login\n id\n }\n repository {\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment commitsView_nodes on PullRequestCommit {\n commit {\n id\n author {\n name\n user {\n login\n id\n }\n }\n ...commitView_commit\n }\n}\n\nfragment issueCommentView_item on IssueComment {\n author {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n bodyHTML\n createdAt\n url\n}\n\nfragment mergedEventView_item on MergedEvent {\n actor {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n commit {\n oid\n id\n }\n mergeRefName\n createdAt\n}\n\nfragment headRefForcePushedEventView_item on HeadRefForcePushedEvent {\n actor {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n beforeCommit {\n oid\n id\n }\n afterCommit {\n oid\n id\n }\n createdAt\n}\n\nfragment commitCommentThreadView_item on PullRequestCommitCommentThread {\n commit {\n oid\n id\n }\n comments(first: 100) {\n edges {\n node {\n id\n ...commitCommentView_item\n }\n }\n }\n}\n\nfragment crossReferencedEventsView_nodes on CrossReferencedEvent {\n id\n referencedAt\n isCrossRepository\n actor {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n source {\n __typename\n ... on RepositoryNode {\n repository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n ...crossReferencedEventView_item\n}\n\nfragment crossReferencedEventView_item on CrossReferencedEvent {\n id\n isCrossRepository\n source {\n __typename\n ... on Issue {\n number\n title\n url\n issueState: state\n }\n ... on PullRequest {\n number\n title\n url\n prState: state\n }\n ... on RepositoryNode {\n repository {\n name\n isPrivate\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment commitCommentView_item on CommitComment {\n author {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n commit {\n oid\n id\n }\n bodyHTML\n createdAt\n path\n position\n}\n\nfragment commitView_commit on Commit {\n author {\n name\n avatarUrl\n user {\n login\n id\n }\n }\n committer {\n name\n avatarUrl\n user {\n login\n id\n }\n }\n authoredByCommitter\n sha: oid\n message\n messageHeadlineHTML\n commitUrl\n}\n\nfragment prStatusContextView_context on StatusContext {\n context\n description\n state\n targetUrl\n}\n\nfragment checkSuitesAccumulator_commit_1oGSNs on Commit {\n id\n checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkSuiteView_checkSuite\n ...checkRunsAccumulator_checkSuite_Rvfr1\n __typename\n }\n }\n }\n}\n\nfragment checkSuiteView_checkSuite on CheckSuite {\n app {\n name\n id\n }\n status\n conclusion\n}\n\nfragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite {\n id\n checkRuns(first: $checkRunCount, after: $checkRunCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkRunView_checkRun\n __typename\n }\n }\n }\n}\n\nfragment checkRunView_checkRun on CheckRun {\n name\n status\n conclusion\n title\n summary\n permalink\n detailsUrl\n}\n\nfragment prCommitView_item on Commit {\n committer {\n avatarUrl\n name\n date\n }\n messageHeadline\n messageBody\n shortSha: abbreviatedOid\n sha: oid\n url\n}\n", + "text": "query prDetailViewRefetchQuery(\n $repoId: ID!\n $issueishId: ID!\n $timelineCount: Int!\n $timelineCursor: String\n $commitCount: Int!\n $commitCursor: String\n $checkSuiteCount: Int!\n $checkSuiteCursor: String\n $checkRunCount: Int!\n $checkRunCursor: String\n) {\n repository: node(id: $repoId) {\n __typename\n ...prDetailView_repository\n id\n }\n pullRequest: node(id: $issueishId) {\n __typename\n ...prDetailView_pullRequest_1UVrY8\n id\n }\n}\n\nfragment checkRunView_checkRun on CheckRun {\n name\n status\n conclusion\n title\n summary\n permalink\n detailsUrl\n}\n\nfragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite {\n id\n checkRuns(first: $checkRunCount, after: $checkRunCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkRunView_checkRun\n __typename\n }\n }\n }\n}\n\nfragment checkSuiteView_checkSuite on CheckSuite {\n app {\n name\n id\n }\n status\n conclusion\n}\n\nfragment checkSuitesAccumulator_commit_1oGSNs on Commit {\n id\n checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkSuiteView_checkSuite\n ...checkRunsAccumulator_checkSuite_Rvfr1\n __typename\n }\n }\n }\n}\n\nfragment commitCommentThreadView_item on PullRequestCommitCommentThread {\n commit {\n oid\n id\n }\n comments(first: 100) {\n edges {\n node {\n id\n ...commitCommentView_item\n }\n }\n }\n}\n\nfragment commitCommentView_item on CommitComment {\n author {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n commit {\n oid\n id\n }\n bodyHTML\n createdAt\n path\n position\n}\n\nfragment commitView_commit on Commit {\n author {\n name\n avatarUrl\n user {\n login\n id\n }\n }\n committer {\n name\n avatarUrl\n user {\n login\n id\n }\n }\n authoredByCommitter\n sha: oid\n message\n messageHeadlineHTML\n commitUrl\n}\n\nfragment commitsView_nodes on PullRequestCommit {\n commit {\n id\n author {\n name\n user {\n login\n id\n }\n }\n ...commitView_commit\n }\n}\n\nfragment crossReferencedEventView_item on CrossReferencedEvent {\n id\n isCrossRepository\n source {\n __typename\n ... on Issue {\n number\n title\n url\n issueState: state\n }\n ... on PullRequest {\n number\n title\n url\n prState: state\n }\n ... on RepositoryNode {\n repository {\n name\n isPrivate\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n}\n\nfragment crossReferencedEventsView_nodes on CrossReferencedEvent {\n id\n referencedAt\n isCrossRepository\n actor {\n __typename\n login\n avatarUrl\n ... on Node {\n id\n }\n }\n source {\n __typename\n ... on RepositoryNode {\n repository {\n name\n owner {\n __typename\n login\n id\n }\n id\n }\n }\n ... on Node {\n id\n }\n }\n ...crossReferencedEventView_item\n}\n\nfragment emojiReactionsController_reactable on Reactable {\n id\n ...emojiReactionsView_reactable\n}\n\nfragment emojiReactionsView_reactable on Reactable {\n id\n reactionGroups {\n content\n viewerHasReacted\n users {\n totalCount\n }\n }\n viewerCanReact\n}\n\nfragment headRefForcePushedEventView_issueish on PullRequest {\n headRefName\n headRepositoryOwner {\n __typename\n login\n id\n }\n repository {\n owner {\n __typename\n login\n id\n }\n id\n }\n}\n\nfragment headRefForcePushedEventView_item on HeadRefForcePushedEvent {\n actor {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n beforeCommit {\n oid\n id\n }\n afterCommit {\n oid\n id\n }\n createdAt\n}\n\nfragment issueCommentView_item on IssueComment {\n author {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n bodyHTML\n createdAt\n url\n}\n\nfragment mergedEventView_item on MergedEvent {\n actor {\n __typename\n avatarUrl\n login\n ... on Node {\n id\n }\n }\n commit {\n oid\n id\n }\n mergeRefName\n createdAt\n}\n\nfragment prCommitView_item on Commit {\n committer {\n avatarUrl\n name\n date\n }\n messageHeadline\n messageBody\n shortSha: abbreviatedOid\n sha: oid\n url\n}\n\nfragment prCommitsView_pullRequest_38TpXw on PullRequest {\n url\n commits(first: $commitCount, after: $commitCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n commit {\n id\n ...prCommitView_item\n }\n id\n __typename\n }\n }\n }\n}\n\nfragment prDetailView_pullRequest_1UVrY8 on PullRequest {\n id\n __typename\n url\n isCrossRepository\n changedFiles\n state\n number\n title\n bodyHTML\n baseRefName\n headRefName\n countedCommits: commits {\n totalCount\n }\n author {\n __typename\n login\n avatarUrl\n url\n ... on Node {\n id\n }\n }\n ...prCommitsView_pullRequest_38TpXw\n ...prStatusesView_pullRequest_1oGSNs\n ...prTimelineController_pullRequest_3D8CP9\n ...emojiReactionsController_reactable\n}\n\nfragment prDetailView_repository on Repository {\n id\n name\n owner {\n __typename\n login\n id\n }\n}\n\nfragment prStatusContextView_context on StatusContext {\n context\n description\n state\n targetUrl\n}\n\nfragment prStatusesView_pullRequest_1oGSNs on PullRequest {\n id\n recentCommits: commits(last: 1) {\n edges {\n node {\n commit {\n status {\n state\n contexts {\n id\n state\n ...prStatusContextView_context\n }\n id\n }\n ...checkSuitesAccumulator_commit_1oGSNs\n id\n }\n id\n }\n }\n }\n}\n\nfragment prTimelineController_pullRequest_3D8CP9 on PullRequest {\n url\n ...headRefForcePushedEventView_issueish\n timelineItems(first: $timelineCount, after: $timelineCursor) {\n pageInfo {\n endCursor\n hasNextPage\n }\n edges {\n cursor\n node {\n __typename\n ...commitsView_nodes\n ...issueCommentView_item\n ...mergedEventView_item\n ...headRefForcePushedEventView_item\n ...commitCommentThreadView_item\n ...crossReferencedEventsView_nodes\n ... on Node {\n id\n }\n }\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/views/__generated__/prStatusesViewRefetchQuery.graphql.js b/lib/views/__generated__/prStatusesViewRefetchQuery.graphql.js index 57288b33d3..5202a569f5 100644 --- a/lib/views/__generated__/prStatusesViewRefetchQuery.graphql.js +++ b/lib/views/__generated__/prStatusesViewRefetchQuery.graphql.js @@ -1,6 +1,6 @@ /** * @flow - * @relayHash 2d55b338b2e14576585d7adfdc6bcfd3 + * @relayHash 0464a2c670f74f89527619b5422aff65 */ /* eslint-disable */ @@ -46,40 +46,19 @@ query prStatusesViewRefetchQuery( } } -fragment prStatusesView_pullRequest_1oGSNs on PullRequest { - id - recentCommits: commits(last: 1) { - edges { - node { - commit { - status { - state - contexts { - id - state - ...prStatusContextView_context - } - id - } - ...checkSuitesAccumulator_commit_1oGSNs - id - } - id - } - } - } -} - -fragment prStatusContextView_context on StatusContext { - context - description - state - targetUrl +fragment checkRunView_checkRun on CheckRun { + name + status + conclusion + title + summary + permalink + detailsUrl } -fragment checkSuitesAccumulator_commit_1oGSNs on Commit { +fragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite { id - checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) { + checkRuns(first: $checkRunCount, after: $checkRunCursor) { pageInfo { hasNextPage endCursor @@ -90,8 +69,7 @@ fragment checkSuitesAccumulator_commit_1oGSNs on Commit { id status conclusion - ...checkSuiteView_checkSuite - ...checkRunsAccumulator_checkSuite_Rvfr1 + ...checkRunView_checkRun __typename } } @@ -107,9 +85,9 @@ fragment checkSuiteView_checkSuite on CheckSuite { conclusion } -fragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite { +fragment checkSuitesAccumulator_commit_1oGSNs on Commit { id - checkRuns(first: $checkRunCount, after: $checkRunCursor) { + checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) { pageInfo { hasNextPage endCursor @@ -120,21 +98,43 @@ fragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite { id status conclusion - ...checkRunView_checkRun + ...checkSuiteView_checkSuite + ...checkRunsAccumulator_checkSuite_Rvfr1 __typename } } } } -fragment checkRunView_checkRun on CheckRun { - name - status - conclusion - title - summary - permalink - detailsUrl +fragment prStatusContextView_context on StatusContext { + context + description + state + targetUrl +} + +fragment prStatusesView_pullRequest_1oGSNs on PullRequest { + id + recentCommits: commits(last: 1) { + edges { + node { + commit { + status { + state + contexts { + id + state + ...prStatusContextView_context + } + id + } + ...checkSuitesAccumulator_commit_1oGSNs + id + } + id + } + } + } } */ @@ -597,7 +597,7 @@ return { "operationKind": "query", "name": "prStatusesViewRefetchQuery", "id": null, - "text": "query prStatusesViewRefetchQuery(\n $id: ID!\n $checkSuiteCount: Int!\n $checkSuiteCursor: String\n $checkRunCount: Int!\n $checkRunCursor: String\n) {\n node(id: $id) {\n __typename\n ... on PullRequest {\n ...prStatusesView_pullRequest_1oGSNs\n }\n id\n }\n}\n\nfragment prStatusesView_pullRequest_1oGSNs on PullRequest {\n id\n recentCommits: commits(last: 1) {\n edges {\n node {\n commit {\n status {\n state\n contexts {\n id\n state\n ...prStatusContextView_context\n }\n id\n }\n ...checkSuitesAccumulator_commit_1oGSNs\n id\n }\n id\n }\n }\n }\n}\n\nfragment prStatusContextView_context on StatusContext {\n context\n description\n state\n targetUrl\n}\n\nfragment checkSuitesAccumulator_commit_1oGSNs on Commit {\n id\n checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkSuiteView_checkSuite\n ...checkRunsAccumulator_checkSuite_Rvfr1\n __typename\n }\n }\n }\n}\n\nfragment checkSuiteView_checkSuite on CheckSuite {\n app {\n name\n id\n }\n status\n conclusion\n}\n\nfragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite {\n id\n checkRuns(first: $checkRunCount, after: $checkRunCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkRunView_checkRun\n __typename\n }\n }\n }\n}\n\nfragment checkRunView_checkRun on CheckRun {\n name\n status\n conclusion\n title\n summary\n permalink\n detailsUrl\n}\n", + "text": "query prStatusesViewRefetchQuery(\n $id: ID!\n $checkSuiteCount: Int!\n $checkSuiteCursor: String\n $checkRunCount: Int!\n $checkRunCursor: String\n) {\n node(id: $id) {\n __typename\n ... on PullRequest {\n ...prStatusesView_pullRequest_1oGSNs\n }\n id\n }\n}\n\nfragment checkRunView_checkRun on CheckRun {\n name\n status\n conclusion\n title\n summary\n permalink\n detailsUrl\n}\n\nfragment checkRunsAccumulator_checkSuite_Rvfr1 on CheckSuite {\n id\n checkRuns(first: $checkRunCount, after: $checkRunCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkRunView_checkRun\n __typename\n }\n }\n }\n}\n\nfragment checkSuiteView_checkSuite on CheckSuite {\n app {\n name\n id\n }\n status\n conclusion\n}\n\nfragment checkSuitesAccumulator_commit_1oGSNs on Commit {\n id\n checkSuites(first: $checkSuiteCount, after: $checkSuiteCursor) {\n pageInfo {\n hasNextPage\n endCursor\n }\n edges {\n cursor\n node {\n id\n status\n conclusion\n ...checkSuiteView_checkSuite\n ...checkRunsAccumulator_checkSuite_Rvfr1\n __typename\n }\n }\n }\n}\n\nfragment prStatusContextView_context on StatusContext {\n context\n description\n state\n targetUrl\n}\n\nfragment prStatusesView_pullRequest_1oGSNs on PullRequest {\n id\n recentCommits: commits(last: 1) {\n edges {\n node {\n commit {\n status {\n state\n contexts {\n id\n state\n ...prStatusContextView_context\n }\n id\n }\n ...checkSuitesAccumulator_commit_1oGSNs\n id\n }\n id\n }\n }\n }\n}\n", "metadata": {} } }; diff --git a/lib/views/actionable-review-view.js b/lib/views/actionable-review-view.js index aa92696ed1..888837db67 100644 --- a/lib/views/actionable-review-view.js +++ b/lib/views/actionable-review-view.js @@ -124,28 +124,17 @@ export default class ActionableReviewView extends React.Component { } } - reportAbuse = (commentUrl, author) => { - return new Promise((resolve, reject) => { - const url = 'https://github.com/contact/report-content?report=' + - `${encodeURIComponent(author)}&content_url=${encodeURIComponent(commentUrl)}`; - shell.openExternal(url, {}, err => { - if (err) { reject(err); } else { - resolve(); - addEvent('report-abuse', {package: 'github', component: this.constructor.name}); - } - }); - }); + reportAbuse = async (commentUrl, author) => { + const url = 'https://github.com/contact/report-content?report=' + + `${encodeURIComponent(author)}&content_url=${encodeURIComponent(commentUrl)}`; + + await shell.openExternal(url); + addEvent('report-abuse', {package: 'github', component: this.constructor.name}); } - openOnGitHub = url => { - return new Promise((resolve, reject) => { - shell.openExternal(url, {}, err => { - if (err) { reject(err); } else { - resolve(); - addEvent('open-comment-in-browser', {package: 'github', component: this.constructor.name}); - } - }); - }); + openOnGitHub = async url => { + await shell.openExternal(url); + addEvent('open-comment-in-browser', {package: 'github', component: this.constructor.name}); } showActionsMenu = (event, content, author) => { diff --git a/lib/views/commit-detail-view.js b/lib/views/commit-detail-view.js index eada68313f..747807c767 100644 --- a/lib/views/commit-detail-view.js +++ b/lib/views/commit-detail-view.js @@ -133,21 +133,15 @@ export default class CommitDetailView extends React.Component { if (coAuthorCount === 0) { return commit.getAuthorName(); } else if (coAuthorCount === 1) { - return `${commit.getAuthorName()} and ${commit.getCoAuthors()[0].name}`; + return `${commit.getAuthorName()} and ${commit.getCoAuthors()[0].getFullName()}`; } else { return `${commit.getAuthorName()} and ${coAuthorCount} others`; } } - renderAuthor(email) { - const match = email.match(/^(\d+)\+[^@]+@users.noreply.github.com$/); - - let avatarUrl; - if (match) { - avatarUrl = 'https://avatars.githubusercontent.com/u/' + match[1] + '?s=32'; - } else { - avatarUrl = 'https://avatars.githubusercontent.com/u/e?email=' + encodeURIComponent(email) + '&s=32'; - } + renderAuthor(author) { + const email = author.getEmail(); + const avatarUrl = author.getAvatarUrl(); return ( author.email); - const authorEmails = [this.props.commit.getAuthorEmail(), ...coAuthorEmails]; + const coAuthors = this.props.commit.getCoAuthors(); + const authors = [this.props.commit.getAuthor(), ...coAuthors]; return ( - {authorEmails.map(this.renderAuthor)} + {authors.map(this.renderAuthor)} ); } diff --git a/lib/views/directory-select.js b/lib/views/directory-select.js index e22137771f..0f62c24a67 100644 --- a/lib/views/directory-select.js +++ b/lib/views/directory-select.js @@ -45,15 +45,13 @@ export default class DirectorySelect extends React.Component { ); } - chooseDirectory = () => new Promise(resolve => { - this.props.showOpenDialog(this.props.currentWindow, { + chooseDirectory = async () => { + const {filePaths} = await this.props.showOpenDialog(this.props.currentWindow, { defaultPath: this.props.buffer.getText(), properties: ['openDirectory', 'createDirectory', 'promptToCreate'], - }, filePaths => { - if (filePaths !== undefined) { - this.props.buffer.setText(filePaths[0]); - } - resolve(); }); - }); + if (filePaths.length) { + this.props.buffer.setText(filePaths[0]); + } + } } diff --git a/lib/views/git-identity-view.js b/lib/views/git-identity-view.js new file mode 100644 index 0000000000..0d8cfd46d5 --- /dev/null +++ b/lib/views/git-identity-view.js @@ -0,0 +1,53 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import AtomTextEditor from '../atom/atom-text-editor'; + +export default class GitIdentityView extends React.Component { + static propTypes = { + // Model + usernameBuffer: PropTypes.object.isRequired, + emailBuffer: PropTypes.object.isRequired, + canWriteLocal: PropTypes.bool.isRequired, + + // Action methods + setLocal: PropTypes.func.isRequired, + setGlobal: PropTypes.func.isRequired, + close: PropTypes.func.isRequired, + }; + + render() { + return ( +
+

+ Git Identity +

+

+ Please set the username and email address that you wish to use to author git commits. This will write to the + user.name and user.email values in your git configuration at the chosen scope. +

+
+ + +
+
+ + + +
+
+ ); + } +} diff --git a/lib/views/git-tab-header-view.js b/lib/views/git-tab-header-view.js new file mode 100644 index 0000000000..b6b0f960be --- /dev/null +++ b/lib/views/git-tab-header-view.js @@ -0,0 +1,73 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import path from 'path'; + +import {AuthorPropType} from '../prop-types'; +import Octicon from '../atom/octicon'; + +export default class GitTabHeaderView extends React.Component { + static propTypes = { + committer: AuthorPropType.isRequired, + + // Workspace + workdir: PropTypes.string, + workdirs: PropTypes.shape({[Symbol.iterator]: PropTypes.func.isRequired}).isRequired, + contextLocked: PropTypes.bool.isRequired, + changingWorkDir: PropTypes.bool.isRequired, + changingLock: PropTypes.bool.isRequired, + + // Event Handlers + handleAvatarClick: PropTypes.func, + handleWorkDirSelect: PropTypes.func, + handleLockToggle: PropTypes.func, + } + + render() { + const lockIcon = this.props.contextLocked ? 'lock' : 'unlock'; + const lockToggleTitle = this.props.contextLocked ? + 'Change repository with the dropdown' : + 'Follow the active pane item'; + + return ( +
+ {this.renderCommitter()} + + +
+ ); + } + + renderWorkDirs() { + const workdirs = []; + for (const workdir of this.props.workdirs) { + workdirs.push(); + } + return workdirs; + } + + renderCommitter() { + const email = this.props.committer.getEmail(); + const avatarUrl = this.props.committer.getAvatarUrl(); + const name = this.props.committer.getFullName(); + + return ( + + ); + } +} diff --git a/lib/views/git-tab-view.js b/lib/views/git-tab-view.js index f2f4e5c8dc..e149010a1f 100644 --- a/lib/views/git-tab-view.js +++ b/lib/views/git-tab-view.js @@ -4,7 +4,8 @@ import cx from 'classnames'; import {CompositeDisposable} from 'atom'; import StagingView from './staging-view'; -import TabHeaderView from './tab-header-view'; +import GitIdentityView from './git-identity-view'; +import GitTabHeaderController from '../controllers/git-tab-header-controller'; import CommitController from '../controllers/commit-controller'; import RecentCommitsController from '../controllers/recent-commits-controller'; import RefHolder from '../models/ref-holder'; @@ -24,7 +25,10 @@ export default class GitTabView extends React.Component { repository: PropTypes.object.isRequired, isLoading: PropTypes.bool.isRequired, + editingIdentity: PropTypes.bool.isRequired, + usernameBuffer: PropTypes.object.isRequired, + emailBuffer: PropTypes.object.isRequired, lastCommit: PropTypes.object.isRequired, currentBranch: PropTypes.object, recentCommits: PropTypes.arrayOf(PropTypes.object).isRequired, @@ -49,6 +53,10 @@ export default class GitTabView extends React.Component { project: PropTypes.object.isRequired, tooltips: PropTypes.object.isRequired, + toggleIdentityEditor: PropTypes.func.isRequired, + setLocalIdentity: PropTypes.func.isRequired, + setGlobalIdentity: PropTypes.func.isRequired, + closeIdentityEditor: PropTypes.func.isRequired, openInitializeDialog: PropTypes.func.isRequired, abortMerge: PropTypes.func.isRequired, commit: PropTypes.func.isRequired, @@ -61,7 +69,9 @@ export default class GitTabView extends React.Component { attemptFileStageOperation: PropTypes.func.isRequired, discardWorkDirChangesForPaths: PropTypes.func.isRequired, openFiles: PropTypes.func.isRequired, + contextLocked: PropTypes.bool.isRequired, changeWorkingDirectory: PropTypes.func.isRequired, + setContextLock: PropTypes.func.isRequired, onDidChangeWorkDirs: PropTypes.func.isRequired, getCurrentWorkDirs: PropTypes.func.isRequired, }; @@ -92,7 +102,9 @@ export default class GitTabView extends React.Component { let renderMethod = 'renderNormal'; let isEmpty = false; let isLoading = false; - if (this.props.repository.isTooLarge()) { + if (this.props.editingIdentity) { + renderMethod = 'renderIdentityView'; + } else if (this.props.repository.isTooLarge()) { renderMethod = 'renderTooLarge'; isEmpty = true; } else if (this.props.repository.hasDirectory() && @@ -118,12 +130,22 @@ export default class GitTabView extends React.Component { } renderHeader() { + const {repository} = this.props; return ( - this.props.changeWorkingDirectory(e.target.value)} + ); } @@ -242,6 +264,19 @@ export default class GitTabView extends React.Component { ); } + renderIdentityView() { + return ( + + ); + } + componentWillUnmount() { this.subscriptions.dispose(); } diff --git a/lib/views/git-timings-view.js b/lib/views/git-timings-view.js index 6f1b6b88ce..f689917673 100644 --- a/lib/views/git-timings-view.js +++ b/lib/views/git-timings-view.js @@ -322,16 +322,17 @@ class WaterfallWidget extends React.Component { this.setState(s => ({collapsed: !s.collapsed})); } - handleExportClick(e) { + async handleExportClick(e) { e.preventDefault(); const json = JSON.stringify(this.props.markers.map(m => m.serialize()), null, ' '); const buffer = new TextBuffer({text: json}); - dialog.showSaveDialog({ + const {filePath} = await dialog.showSaveDialog({ defaultPath: 'git-timings.json', - }, filename => { - if (!filename) { return; } - buffer.saveAs(filename); }); + if (!filePath) { + return; + } + buffer.saveAs(filePath); } } @@ -419,22 +420,23 @@ export default class GitTimingsView extends React.Component { ); } - handleImportClick(e) { + async handleImportClick(e) { e.preventDefault(); - dialog.showOpenDialog({ + const {filePaths} = await dialog.showOpenDialog({ properties: ['openFile'], - }, async filenames => { - if (!filenames) { return; } - const filename = filenames[0]; - try { - const contents = await fs.readFile(filename, {encoding: 'utf8'}); - const data = JSON.parse(contents); - const restoredMarkers = data.map(item => Marker.deserialize(item)); - GitTimingsView.restoreGroup(restoredMarkers); - } catch (_err) { - atom.notifications.addError(`Could not import timings from ${filename}`); - } }); + if (!filePaths.length) { + return; + } + const filename = filePaths[0]; + try { + const contents = await fs.readFile(filename, {encoding: 'utf8'}); + const data = JSON.parse(contents); + const restoredMarkers = data.map(item => Marker.deserialize(item)); + GitTimingsView.restoreGroup(restoredMarkers); + } catch (_err) { + atom.notifications.addError(`Could not import timings from ${filename}`); + } } serialize() { diff --git a/lib/views/github-tab-header-view.js b/lib/views/github-tab-header-view.js new file mode 100644 index 0000000000..bd3c6c1895 --- /dev/null +++ b/lib/views/github-tab-header-view.js @@ -0,0 +1,67 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import path from 'path'; + +import {AuthorPropType} from '../prop-types'; +import Octicon from '../atom/octicon'; + +export default class GithubTabHeaderView extends React.Component { + static propTypes = { + user: AuthorPropType.isRequired, + + // Workspace + workdir: PropTypes.string, + workdirs: PropTypes.shape({[Symbol.iterator]: PropTypes.func.isRequired}).isRequired, + contextLocked: PropTypes.bool.isRequired, + changingWorkDir: PropTypes.bool.isRequired, + changingLock: PropTypes.bool.isRequired, + handleWorkDirChange: PropTypes.func.isRequired, + handleLockToggle: PropTypes.func.isRequired, + } + + render() { + const lockIcon = this.props.contextLocked ? 'lock' : 'unlock'; + const lockToggleTitle = this.props.contextLocked ? + 'Change repository with the dropdown' : + 'Follow the active pane item'; + + return ( +
+ {this.renderUser()} + + +
+ ); + } + + renderWorkDirs() { + const workdirs = []; + for (const workdir of this.props.workdirs) { + workdirs.push(); + } + return workdirs; + } + + renderUser() { + const login = this.props.user.getLogin(); + const avatarUrl = this.props.user.getAvatarUrl(); + + return ( + {`@${login}'s + ); + } +} diff --git a/lib/views/github-tab-view.js b/lib/views/github-tab-view.js index d80539e534..904defddb9 100644 --- a/lib/views/github-tab-view.js +++ b/lib/views/github-tab-view.js @@ -2,40 +2,57 @@ import React from 'react'; import PropTypes from 'prop-types'; import { - GithubLoginModelPropType, RefHolderPropType, RemoteSetPropType, RemotePropType, BranchSetPropType, BranchPropType, + TokenPropType, EndpointPropType, RefHolderPropType, + RemoteSetPropType, RemotePropType, BranchSetPropType, BranchPropType, RefresherPropType, } from '../prop-types'; import LoadingView from './loading-view'; +import QueryErrorView from '../views/query-error-view'; +import GithubLoginView from '../views/github-login-view'; import RemoteSelectorView from './remote-selector-view'; -import TabHeaderView from './tab-header-view'; +import GithubTabHeaderContainer from '../containers/github-tab-header-container'; import GitHubBlankNoLocal from './github-blank-nolocal'; import GitHubBlankUninitialized from './github-blank-uninitialized'; import GitHubBlankNoRemote from './github-blank-noremote'; import RemoteContainer from '../containers/remote-container'; +import {UNAUTHENTICATED, INSUFFICIENT} from '../shared/keytar-strategy'; export default class GitHubTabView extends React.Component { static propTypes = { - workspace: PropTypes.object.isRequired, refresher: RefresherPropType.isRequired, - loginModel: GithubLoginModelPropType.isRequired, rootHolder: RefHolderPropType.isRequired, + // Connection + endpoint: EndpointPropType.isRequired, + token: TokenPropType, + + // Workspace + workspace: PropTypes.object.isRequired, workingDirectory: PropTypes.string, + getCurrentWorkDirs: PropTypes.func.isRequired, + changeWorkingDirectory: PropTypes.func.isRequired, + contextLocked: PropTypes.bool.isRequired, + setContextLock: PropTypes.func.isRequired, repository: PropTypes.object.isRequired, - branches: BranchSetPropType.isRequired, - currentBranch: BranchPropType.isRequired, + + // Remotes remotes: RemoteSetPropType.isRequired, currentRemote: RemotePropType.isRequired, manyRemotesAvailable: PropTypes.bool.isRequired, + isLoading: PropTypes.bool.isRequired, + branches: BranchSetPropType.isRequired, + currentBranch: BranchPropType.isRequired, aheadCount: PropTypes.number, pushInProgress: PropTypes.bool.isRequired, - isLoading: PropTypes.bool.isRequired, + // Event Handlers + handleLogin: PropTypes.func.isRequired, + handleLogout: PropTypes.func.isRequired, + handleTokenRetry: PropTypes.func.isRequired, + handleWorkDirSelect: PropTypes.func, handlePushBranch: PropTypes.func.isRequired, handleRemoteSelect: PropTypes.func.isRequired, - changeWorkingDirectory: PropTypes.func.isRequired, onDidChangeWorkDirs: PropTypes.func.isRequired, - getCurrentWorkDirs: PropTypes.func.isRequired, openCreateDialog: PropTypes.func.isRequired, openBoundPublishDialog: PropTypes.func.isRequired, openCloneDialog: PropTypes.func.isRequired, @@ -54,6 +71,35 @@ export default class GitHubTabView extends React.Component { } renderRemote() { + if (this.props.token === null) { + return ; + } + + if (this.props.token === UNAUTHENTICATED) { + return ; + } + + if (this.props.token === INSUFFICIENT) { + return ( + +

+ Your token no longer has sufficient authorizations. Please re-authenticate and generate a new one. +

+
+ ); + } + + if (this.props.token instanceof Error) { + return ( + + ); + } + if (this.props.isLoading) { return ; } @@ -80,9 +126,11 @@ export default class GitHubTabView extends React.Component { // Single, chosen or unambiguous remote return ( this.props.handlePushBranch(this.props.currentBranch, this.props.currentRemote)} /> ); @@ -115,10 +166,19 @@ export default class GitHubTabView extends React.Component { renderHeader() { return ( - this.props.changeWorkingDirectory(e.target.value)} + ); diff --git a/lib/views/issueish-link.js b/lib/views/issueish-link.js index 798ce814ea..80571c1bae 100644 --- a/lib/views/issueish-link.js +++ b/lib/views/issueish-link.js @@ -44,17 +44,9 @@ export function openIssueishLinkInNewTab(url, options = {}) { } } -export function openLinkInBrowser(uri) { - return new Promise((resolve, reject) => { - shell.openExternal(uri, {}, err => { - if (err) { - reject(err); - } else { - addEvent('open-issueish-in-browser', {package: 'github', from: 'issueish-link'}); - resolve(); - } - }); - }); +export async function openLinkInBrowser(uri) { + await shell.openExternal(uri); + addEvent('open-issueish-in-browser', {package: 'github', from: 'issueish-link'}); } function getAtomUriForGithubUrl(githubUrl) { diff --git a/lib/views/recent-commits-view.js b/lib/views/recent-commits-view.js index 503364fe1d..e7eb472aa7 100644 --- a/lib/views/recent-commits-view.js +++ b/lib/views/recent-commits-view.js @@ -79,15 +79,9 @@ class RecentCommitView extends React.Component { ); } - renderAuthor(email) { - const match = email.match(/^(\d+)\+[^@]+@users.noreply.github.com$/); - - let avatarUrl; - if (match) { - avatarUrl = 'https://avatars.githubusercontent.com/u/' + match[1] + '?s=32'; - } else { - avatarUrl = 'https://avatars.githubusercontent.com/u/e?email=' + encodeURIComponent(email) + '&s=32'; - } + renderAuthor(author) { + const email = author.getEmail(); + const avatarUrl = author.getAvatarUrl(); return ( author.email); - const authorEmails = [this.props.commit.getAuthorEmail(), ...coAuthorEmails]; + const coAuthors = this.props.commit.getCoAuthors(); + const authors = [this.props.commit.getAuthor(), ...coAuthors]; return ( - {authorEmails.map(this.renderAuthor)} + {authors.map(this.renderAuthor)} ); } diff --git a/lib/views/tab-header-view.js b/lib/views/tab-header-view.js deleted file mode 100644 index c33842b552..0000000000 --- a/lib/views/tab-header-view.js +++ /dev/null @@ -1,62 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import path from 'path'; - -export default class TabHeaderView extends React.Component { - static propTypes = { - currentWorkDir: PropTypes.string, - - handleWorkDirSelect: PropTypes.func, - onDidChangeWorkDirs: PropTypes.func, - getCurrentWorkDirs: PropTypes.func.isRequired, - } - - constructor(props) { - super(props); - this.state = {currentWorkDirs: []}; - } - - static getDerivedStateFromProps(props, state) { - return { - currentWorkDirs: props.getCurrentWorkDirs(), - }; - } - - componentDidMount() { - if (this.props.onDidChangeWorkDirs) { - this.disposable = this.props.onDidChangeWorkDirs(this.updateWorkDirs); - } - } - - render() { - return ( -
- -
- ); - } - - renderWorkDirs() { - const workdirs = []; - for (const workdir of this.state.currentWorkDirs) { - workdirs.push(); - } - return workdirs; - } - - updateWorkDirs = () => { - this.setState((state, props) => ({ - currentWorkDirs: props.getCurrentWorkDirs(), - })); - } - - componentWillUnmount() { - if (this.disposable && this.disposable.dispose) { - this.disposable.dispose(); - } - } -} diff --git a/lib/views/timeline-items/__generated__/commitsView_nodes.graphql.js b/lib/views/timeline-items/__generated__/commitsView_nodes.graphql.js index 0b3ce08432..86db7abfc3 100644 --- a/lib/views/timeline-items/__generated__/commitsView_nodes.graphql.js +++ b/lib/views/timeline-items/__generated__/commitsView_nodes.graphql.js @@ -26,10 +26,10 @@ export type commitsView_nodes = $ReadOnlyArray<{| +$refType: commitsView_nodes$ref, |}>; export type commitsView_nodes$data = commitsView_nodes; -export type commitsView_nodes$key = { +export type commitsView_nodes$key = $ReadOnlyArray<{ +$data?: commitsView_nodes$data, +$fragmentRefs: commitsView_nodes$ref, -}; +}>; */ diff --git a/lib/views/timeline-items/__generated__/crossReferencedEventsView_nodes.graphql.js b/lib/views/timeline-items/__generated__/crossReferencedEventsView_nodes.graphql.js index cf315df37e..88a8b6813d 100644 --- a/lib/views/timeline-items/__generated__/crossReferencedEventsView_nodes.graphql.js +++ b/lib/views/timeline-items/__generated__/crossReferencedEventsView_nodes.graphql.js @@ -33,10 +33,10 @@ export type crossReferencedEventsView_nodes = $ReadOnlyArray<{| +$refType: crossReferencedEventsView_nodes$ref, |}>; export type crossReferencedEventsView_nodes$data = crossReferencedEventsView_nodes; -export type crossReferencedEventsView_nodes$key = { +export type crossReferencedEventsView_nodes$key = $ReadOnlyArray<{ +$data?: crossReferencedEventsView_nodes$data, +$fragmentRefs: crossReferencedEventsView_nodes$ref, -}; +}>; */ diff --git a/lib/worker-manager.js b/lib/worker-manager.js index e6811314c4..17b9588191 100644 --- a/lib/worker-manager.js +++ b/lib/worker-manager.js @@ -267,7 +267,8 @@ export class RendererProcess { this.onStdinError = onStdinError; this.onExecStarted = onExecStarted; - this.win = new BrowserWindow({show: !!process.env.ATOM_GITHUB_SHOW_RENDERER_WINDOW}); + this.win = new BrowserWindow({show: !!process.env.ATOM_GITHUB_SHOW_RENDERER_WINDOW, + webPreferences: {nodeIntegration: true, enableRemoteModule: true}}); this.webContents = this.win.webContents; // this.webContents.openDevTools(); diff --git a/package-lock.json b/package-lock.json index 1e4016a283..cafe6d2056 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,9 @@ { "name": "github", - "version": "0.31.1", + "version": "0.36.10", "lockfileVersion": 1, "requires": true, "dependencies": { - "7zip": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/7zip/-/7zip-0.0.6.tgz", - "integrity": "sha1-nK+xca+CMpSQNTtIFvAzR6oVCjA=", - "dev": true - }, "@atom/babel-plugin-chai-assert-async": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@atom/babel-plugin-chai-assert-async/-/babel-plugin-chai-assert-async-1.0.0.tgz", @@ -127,6 +121,11 @@ "@babel/highlight": "^7.0.0" } }, + "@babel/compat-data": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.5.tgz", + "integrity": "sha512-DTsS7cxrsH3by8nqQSpFSyjSfSYl57D6Cf4q8dW3LK83tBKBDCkfcay1nYkXq1nIHXnpX8WMMb/O25HOy3h1zg==" + }, "@babel/core": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.3.4.tgz", @@ -156,20 +155,20 @@ } }, "@babel/generator": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", - "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", "requires": { - "@babel/types": "^7.7.2", + "@babel/types": "^7.8.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" }, "dependencies": { "@babel/types": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", - "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -179,107 +178,171 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz", + "integrity": "sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og==", + "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.0.tgz", - "integrity": "sha512-Cd8r8zs4RKDwMG/92lpZcnn5WPQ3LAMQbCw42oqUh4s7vsSN5ANUZjMel0OOnxDLq57hoDDbai+ryygYfCTOsw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/types": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", - "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-builder-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz", - "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.4.tgz", + "integrity": "sha512-kvbfHJNN9dg4rkEM4xn1s8d1/h6TYNvajy9L1wx4qLn9HFg0IkTsQi4rfBe92nxrPUFcMsHoMV+8rU7MJb3fCA==", "dev": true, "requires": { - "@babel/types": "^7.3.0", + "@babel/types": "^7.7.4", "esutils": "^2.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-call-delegate": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", - "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz", + "integrity": "sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA==", + "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/helper-hoist-variables": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" }, "dependencies": { "@babel/code-frame": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, "@babel/generator": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", - "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", + "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", + "dev": true, "requires": { - "@babel/types": "^7.5.5", + "@babel/types": "^7.7.4", "jsesc": "^2.5.1", "lodash": "^4.17.13", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.4" } }, "@babel/parser": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", - "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==" + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.5.tgz", + "integrity": "sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig==", + "dev": true + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } }, "@babel/traverse": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", - "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "dev": true, "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.5.5", - "@babel/types": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", - "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -288,117 +351,148 @@ } } }, - "@babel/helper-create-class-features-plugin": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.0.tgz", - "integrity": "sha512-MZiB5qvTWoyiFOgootmRSDV1udjIqJW/8lmxgzKq6oDqxdmHUjeP2ZUOmgHdYjmUVNABqRrHjYAYRvj8Eox/UA==", + "@babel/helper-compilation-targets": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", + "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", "requires": { - "@babel/helper-function-name": "^7.7.0", - "@babel/helper-member-expression-to-functions": "^7.7.0", - "@babel/helper-optimise-call-expression": "^7.7.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.7.0", - "@babel/helper-split-export-declaration": "^7.7.0" + "@babel/compat-data": "^7.12.5", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.14.5", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.0.tgz", + "integrity": "sha512-ctCvqYBTlwEl2uF4hCxE0cd/sSw71Zfag0jKa39y4HDLh0BQ4PVBX1384Ye8GqrEZ69xgLp9fwPbv3GgIDDF2Q==", + "requires": { + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-member-expression-to-functions": "^7.8.0", + "@babel/helper-optimise-call-expression": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-replace-supers": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "requires": { + "@babel/highlight": "^7.8.0" + } + }, "@babel/helper-function-name": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", - "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", "requires": { - "@babel/helper-get-function-arity": "^7.7.0", - "@babel/template": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-get-function-arity": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", - "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.8.0" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz", - "integrity": "sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.0.tgz", + "integrity": "sha512-0m1QabGrdXuoxX/g+KOAGndoHwskC70WweqHRQyCsaO67KOEELYh4ECcGw6ZGKjDKa5Y7SW4Qbhw6ly4Fah/jQ==", "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.8.0" } }, "@babel/helper-optimise-call-expression": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz", - "integrity": "sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.0.tgz", + "integrity": "sha512-aiJt1m+K57y0n10fTw+QXcCXzmpkG+o+NoQmAZqlZPstkTE0PZT+Z27QSd/6Gf00nuXJQO4NiJ0/YagSW5kC2A==", "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.8.0" } }, + "@babel/helper-plugin-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", + "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==" + }, "@babel/helper-replace-supers": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz", - "integrity": "sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.0.tgz", + "integrity": "sha512-R2CyorW4tcO3YzdkClLpt6MS84G+tPkOi0MmiCn1bvYVnmDpdl9R15XOi3NQW2mhOAEeBnuQ4g1Bh7pT2sX8fg==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.7.0", - "@babel/helper-optimise-call-expression": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-member-expression-to-functions": "^7.8.0", + "@babel/helper-optimise-call-expression": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", - "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", "requires": { - "@babel/types": "^7.7.0" + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz", - "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==" + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==" }, "@babel/template": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", - "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" } }, "@babel/traverse": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", - "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.2", - "@babel/helper-function-name": "^7.7.0", - "@babel/helper-split-export-declaration": "^7.7.0", - "@babel/parser": "^7.7.2", - "@babel/types": "^7.7.2", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "requires": { - "@babel/highlight": "^7.0.0" - } - } } }, "@babel/types": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", - "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -408,116 +502,88 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.2.tgz", - "integrity": "sha512-pAil/ZixjTlrzNpjx+l/C/wJk002Wo7XbbZ8oujH/AoJ3Juv0iN/UTcPUHXKMFLqsfS0Hy6Aow8M31brUYBlQQ==", - "requires": { - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" - } - }, - "@babel/helper-define-map": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", - "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", - "dev": true, + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", + "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.5.5", - "lodash": "^4.17.13" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.1" }, "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "requires": { + "@babel/types": "^7.10.4" + } + }, "@babel/types": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", - "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", - "dev": true, + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } } } }, - "@babel/helper-explode-assignable-expression": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.0.tgz", - "integrity": "sha512-CDs26w2shdD1urNUAji2RJXyBFCaR+iBEGnFz3l7maizMkQe3saVw9WtjG1tz8CwbjvlFnaSLVhgnu1SWaherg==", + "@babel/helper-define-map": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz", + "integrity": "sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg==", + "dev": true, "requires": { - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-function-name": "^7.7.4", + "@babel/types": "^7.7.4", + "lodash": "^4.17.13" }, "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "requires": { - "@babel/highlight": "^7.0.0" - } - }, "@babel/helper-function-name": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", - "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.7.0", - "@babel/template": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-get-function-arity": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", - "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", - "requires": { - "@babel/types": "^7.7.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", - "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" } }, "@babel/parser": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz", - "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==" + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.5.tgz", + "integrity": "sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig==", + "dev": true }, "@babel/template": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", - "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/types": "^7.7.0" - } - }, - "@babel/traverse": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", - "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.2", - "@babel/helper-function-name": "^7.7.0", - "@babel/helper-split-export-declaration": "^7.7.0", - "@babel/parser": "^7.7.2", - "@babel/types": "^7.7.2", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/types": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", - "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -526,6 +592,26 @@ } } }, + "@babel/helper-explode-assignable-expression": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "requires": { + "@babel/types": "^7.12.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/helper-function-name": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", @@ -545,17 +631,19 @@ } }, "@babel/helper-hoist-variables": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", - "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz", + "integrity": "sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ==", + "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.4" }, "dependencies": { "@babel/types": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", - "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -565,12 +653,25 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", - "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz", + "integrity": "sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-imports": { @@ -582,62 +683,59 @@ } }, "@babel/helper-module-transforms": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz", - "integrity": "sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ==", - "requires": { - "@babel/helper-module-imports": "^7.7.0", - "@babel/helper-simple-access": "^7.7.0", - "@babel/helper-split-export-declaration": "^7.7.0", - "@babel/template": "^7.7.0", - "@babel/types": "^7.7.0", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz", + "integrity": "sha512-A7pSxyJf1gN5qXVcidwLWydjftUN878VkalhXX5iQDuGyiGK3sOrrKKHF4/A4fwHtnsotv/NipwAeLzY4KQPvw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.7.4", + "@babel/helper-simple-access": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4", "lodash": "^4.17.13" }, "dependencies": { "@babel/helper-module-imports": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz", - "integrity": "sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==", - "requires": { - "@babel/types": "^7.7.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz", - "integrity": "sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz", + "integrity": "sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==", + "dev": true, "requires": { - "@babel/template": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", - "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" } }, "@babel/parser": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz", - "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==" + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.5.tgz", + "integrity": "sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig==", + "dev": true }, "@babel/template": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", - "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/types": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", - "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -647,12 +745,25 @@ } }, "@babel/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz", + "integrity": "sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-plugin-utils": { @@ -661,104 +772,144 @@ "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" }, "@babel/helper-regex": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", - "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", "requires": { - "lodash": "^4.17.13" + "lodash": "^4.17.19" } }, "@babel/helper-remap-async-to-generator": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.0.tgz", - "integrity": "sha512-pHx7RN8X0UNHPB/fnuDnRXVZ316ZigkO8y8D835JlZ2SSdFKb6yH9MIYRU4fy/KPe5sPHDFOPvf8QLdbAGGiyw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", "requires": { - "@babel/helper-annotate-as-pure": "^7.7.0", - "@babel/helper-wrap-function": "^7.7.0", - "@babel/template": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" }, "dependencies": { "@babel/helper-annotate-as-pure": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz", - "integrity": "sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz", + "integrity": "sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.7.4", + "@babel/helper-optimise-call-expression": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", + "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", + "dev": true, "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", - "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.7.0", - "@babel/template": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/helper-get-function-arity": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", - "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", - "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.7.4" } }, "@babel/parser": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz", - "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==" + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.5.tgz", + "integrity": "sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig==", + "dev": true }, "@babel/template": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", - "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/traverse": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", - "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "dev": true, "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.2", - "@babel/helper-function-name": "^7.7.0", - "@babel/helper-split-export-declaration": "^7.7.0", - "@babel/parser": "^7.7.2", - "@babel/types": "^7.7.2", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "requires": { - "@babel/highlight": "^7.0.0" - } - } } }, "@babel/types": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", - "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -767,26 +918,64 @@ } } }, - "@babel/helper-replace-supers": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.3.4.tgz", - "integrity": "sha512-pvObL9WVf2ADs+ePg0jrqlhHoxRXlOa+SHRHzAXIz2xkYuOHfGl+fKxPMaS4Fq+uje8JQPobnertBBvyrWnQ1A==", + "@babel/helper-simple-access": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz", + "integrity": "sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.0.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.3.4", - "@babel/types": "^7.3.4" + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + }, + "dependencies": { + "@babel/parser": { + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.5.tgz", + "integrity": "sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig==", + "dev": true + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, - "@babel/helper-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", - "dev": true, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "requires": { - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/types": "^7.12.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-split-export-declaration": { @@ -797,91 +986,119 @@ "@babel/types": "^7.0.0" } }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/helper-validator-option": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", + "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==" + }, "@babel/helper-wrap-function": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz", - "integrity": "sha512-sd4QjeMgQqzshSjecZjOp8uKfUtnpmCyQhKQrVJBBgeHAB/0FPi33h3AbVlVp07qQtMD4QgYSzaMI7VwncNK/w==", - "requires": { - "@babel/helper-function-name": "^7.7.0", - "@babel/template": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "requires": { + "@babel/types": "^7.12.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, "@babel/helper-function-name": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", - "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "requires": { - "@babel/helper-get-function-arity": "^7.7.0", - "@babel/template": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", - "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.10.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", - "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "requires": { - "@babel/types": "^7.7.0" + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz", - "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==" + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==" }, "@babel/template": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", - "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", - "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.2", - "@babel/helper-function-name": "^7.7.0", - "@babel/helper-split-export-declaration": "^7.7.0", - "@babel/parser": "^7.7.2", - "@babel/types": "^7.7.2", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "requires": { - "@babel/highlight": "^7.0.0" - } - } + "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", - "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } } @@ -913,193 +1130,600 @@ "integrity": "sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==" }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.0.tgz", - "integrity": "sha512-ot/EZVvf3mXtZq0Pd0+tSOfGWMizqmOohXmNZg6LNFjHOV+wOPv7BvVYh8oPR8LhpIP3ye8nNooKL50YRWxpYA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.7.0", - "@babel/plugin-syntax-async-generators": "^7.2.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-proposal-class-properties": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.0.tgz", - "integrity": "sha512-tufDcFA1Vj+eWvwHN+jvMN6QsV5o+vUlytNKrbMiCeDL0F2j92RURzUsUMWE5EJkLyWxjdUslCsMQa9FWth16A==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.0.tgz", + "integrity": "sha512-eVGj5NauhKCwABQjKIYncMQh9HtFsBrIcdsxImbTdUIaGnjymsVsBGmDQaDuPL/WCjYn6vPL4d+yvI6zy+VkrQ==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.7.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-class-features-plugin": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", + "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==" + } } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.0.tgz", - "integrity": "sha512-7poL3Xi+QFPC7sGAzEIbXUyYzGJwbc2+gSD0AkiC5k52kH2cqHdqxm5hNFfLW3cRSTcx9bN0Fl7/6zWcLLnKAQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-proposal-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", - "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.2.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.5.tgz", + "integrity": "sha512-UiAnkKuOrCyjZ3sYNHlRlfuZJbBHknMQ9VMwVeX97Ofwx7RpD6gS2HfqTCh8KNUQgcOm8IKt103oR4KIjh7Q8g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", - "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.0.tgz", + "integrity": "sha512-SjJ2ZXCylpWC+5DTES0/pbpNmw/FnjU/3dF068xF0DU9aN+oOKah+3MCSFcb4pnZ9IwmxfOy4KnbGJSQR+hAZA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", + "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==" + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.0.tgz", + "integrity": "sha512-dt89fDlkfkTrQcy5KavMQPyF2A6tR0kYp8HAnIoQv5hO34iAUffHghP/hMGd7Gf/+uYTmLQO0ar7peX1SUWyIA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + } } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", + "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "requires": { + "@babel/types": "^7.12.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.0.tgz", - "integrity": "sha512-mk34H+hp7kRBWJOOAR0ZMGCydgKMD4iN9TpDRp3IIcbunltxEY89XSimc6WbtSLCDrwcdy/EEw7h5CFCzxTchw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-syntax-async-generators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", - "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-syntax-class-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.2.0.tgz", - "integrity": "sha512-UxYaGXYQ7rrKJS/PxIKRkv3exi05oH7rokBAsmCSsCxz1sVPZ7Fu6FzKoGgUvmY+0YgSkYHgUoCh5R5bCNBQlw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.7.4.tgz", + "integrity": "sha512-JH3v5ZOeKT0qqdJ9BeBcZTFQiJOMax8RopSr1bH6ASkZKo2qWsvBML7W1mp89sszBRDBBRO8snqcByGdrMTdMg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-dynamic-import": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", - "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-syntax-flow": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz", - "integrity": "sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.7.4.tgz", + "integrity": "sha512-2AMAWl5PsmM5KPkB22cvOkUyWk6MjUaqhHNU5nSPUl/ns3j5qLfw2SuYP5RbVZ0tfLvePr4zUScbICtDP2CUNw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", - "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-syntax-jsx": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.0.tgz", - "integrity": "sha512-hi8FUNiFIY1fnUI2n1ViB1DR0R4QeK4iHcTlW6aJkrPoTdb8Rf1EMQ6GT3f67DDkYyWgew9DFoOZ6gOoEsdzTA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", - "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz", + "integrity": "sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.0.tgz", - "integrity": "sha512-vLI2EFLVvRBL3d8roAMqtVY0Bm9C1QzLkdS57hiKrjUBSqsQYrBsMCeOg/0KK7B0eK9V71J5mWcha9yyoI2tZw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", "requires": { - "@babel/helper-module-imports": "^7.7.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.7.0" + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" }, "dependencies": { "@babel/helper-module-imports": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz", - "integrity": "sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.12.5" } }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, "@babel/types": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", - "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } } } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", - "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz", + "integrity": "sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz", - "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz", + "integrity": "sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -1107,100 +1731,71 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", - "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz", + "integrity": "sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-annotate-as-pure": "^7.7.4", + "@babel/helper-define-map": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-optimise-call-expression": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/helper-replace-supers": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", "globals": "^11.1.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/generator": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", - "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", - "dev": true, - "requires": { - "@babel/types": "^7.5.5", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", - "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", "dev": true, "requires": { - "@babel/types": "^7.5.5" + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" } }, - "@babel/helper-replace-supers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", - "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" + "@babel/types": "^7.7.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.4" } }, "@babel/parser": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", - "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.5.tgz", + "integrity": "sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig==", "dev": true }, - "@babel/traverse": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", - "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.5.5", - "@babel/types": "^7.5.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" } }, "@babel/types": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", - "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1211,246 +1806,788 @@ } }, "@babel/plugin-transform-computed-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", - "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz", + "integrity": "sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-destructuring": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz", - "integrity": "sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz", + "integrity": "sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.0.tgz", - "integrity": "sha512-3QQlF7hSBnSuM1hQ0pS3pmAbWLax/uGNCbPBND9y+oJ4Y776jsyujG2k0Sn2Aj2a0QwVOiOFL5QVPA7spjvzSA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", - "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", - "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz", - "integrity": "sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.7.4.tgz", + "integrity": "sha512-w9dRNlHY5ElNimyMYy0oQowvQpwt/PRHI0QS98ZJCTZU2bvSnKXo5zEiD5u76FBPigTm8TkqzmnUTg16T7qbkA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0" + "@babel/plugin-syntax-flow": "^7.7.4" } }, "@babel/plugin-transform-for-of": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", - "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz", + "integrity": "sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-function-name": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", - "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz", + "integrity": "sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", + "@babel/helper-function-name": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" + }, + "dependencies": { + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/parser": { + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.5.tgz", + "integrity": "sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig==", + "dev": true + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", - "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz", + "integrity": "sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", - "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz", + "integrity": "sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", - "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "requires": { + "@babel/types": "^7.12.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + } } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz", - "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==", + "version": "7.7.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz", + "integrity": "sha512-9Cq4zTFExwFhQI6MT1aFxgqhIsMWQWDVwOgLzl7PTWJHsNaqFvklAU+Oz6AQLAS0dJKTwZSOCo20INwktxpi3Q==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-module-transforms": "^7.7.5", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-simple-access": "^7.7.4", "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" }, "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "requires": { + "@babel/types": "^7.12.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "requires": { + "@babel/types": "^7.12.5" + } + }, "@babel/helper-module-transforms": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", - "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", - "dev": true, + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/template": "^7.4.4", - "@babel/types": "^7.5.5", - "lodash": "^4.17.13" + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "requires": { + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", - "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", - "dev": true + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==" }, "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", - "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", - "dev": true, + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } } } }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.0.tgz", - "integrity": "sha512-ZAuFgYjJzDNv77AjXRqzQGlQl4HdUM6j296ee4fwKVZfhDR9LAGxfvXjBkb06gNETPnN0sLqRm9Gxg4wZH6dXg==", + "@babel/plugin-transform-modules-umd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", "requires": { - "@babel/helper-hoist-variables": "^7.7.0", - "@babel/helper-plugin-utils": "^7.0.0", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" }, "dependencies": { - "@babel/helper-hoist-variables": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz", - "integrity": "sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ==", + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "requires": { + "@babel/types": "^7.12.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", - "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } } } }, - "@babel/plugin-transform-modules-umd": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.0.tgz", - "integrity": "sha512-u7eBA03zmUswQ9LQ7Qw0/ieC1pcAkbp5OQatbWUzY1PaBccvuJXUkYzoN1g7cqp7dbTu6Dp9bXyalBvD04AANA==", - "requires": { - "@babel/helper-module-transforms": "^7.7.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.0.tgz", - "integrity": "sha512-+SicSJoKouPctL+j1pqktRVCgy+xAch1hWWTMy13j0IflnyNjaoskj+DwRQFimHbLqO3sq2oN2CXMvXq3Bgapg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.0" + "@babel/helper-create-regexp-features-plugin": "^7.12.1" } }, "@babel/plugin-transform-new-target": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", - "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-transform-object-super": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", - "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz", + "integrity": "sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0" + "@babel/helper-replace-supers": "^7.7.4" } }, "@babel/plugin-transform-parameters": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", - "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz", + "integrity": "sha512-VJwhVePWPa0DqE9vcfptaJSzNDKrWU/4FbYCjZERtmqEs05g3UMXnYMZoXja7JAJ7Y7sPZipwm/pGApZt7wHlw==", + "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.4.4", - "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-call-delegate": "^7.7.4", + "@babel/helper-get-function-arity": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" + }, + "dependencies": { + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-property-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", - "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz", + "integrity": "sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -1459,111 +2596,198 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz", - "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.4.tgz", + "integrity": "sha512-LixU4BS95ZTEAZdPaIuyg/k8FiiqN9laQ0dMHB4MlpydHY53uQdWCUrwjLr5o6ilS6fAgZey4Q14XBjl5tL6xw==", "dev": true, "requires": { - "@babel/helper-builder-react-jsx": "^7.3.0", + "@babel/helper-builder-react-jsx": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" + "@babel/plugin-syntax-jsx": "^7.7.4" + }, + "dependencies": { + "@babel/plugin-syntax-jsx": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.7.4.tgz", + "integrity": "sha512-wuy6fiMe9y7HeZBWXYCGt2RGxZOj0BImZ9EyXJVnVGBKO/Br592rbR3rtIQn0eQhAk9vqaKP5n8tVqEFBQMfLg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + } } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz", - "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.0.tgz", + "integrity": "sha512-hJXfJdLDDlJoxW/rAjkuIpGUUTizQ6fN9tIciW1M8KIqFsmpEf9psBPNTXYRCOLYLEsra+/WgVq+sc+1z05nQw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-jsx": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", + "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==" + }, + "@babel/plugin-syntax-jsx": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.0.tgz", + "integrity": "sha512-zLDUckAuKeOtxJhfNE0TlR7iEApb2u7EYRlh5cxKzq6A5VzUbYEdyJGJlug41jDbjRbHTtsLKZUnUcy/8V3xZw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + } } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz", - "integrity": "sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.0.tgz", + "integrity": "sha512-W+0VXOhMRdUTL7brjKXND+BiXbsxczfMdZongQ/Jtti0JVMtcTxWo66NMxNNtbPYvbc4aUXmgjl3eMms41sYtg==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-jsx": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", + "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==" + }, + "@babel/plugin-syntax-jsx": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.0.tgz", + "integrity": "sha512-zLDUckAuKeOtxJhfNE0TlR7iEApb2u7EYRlh5cxKzq6A5VzUbYEdyJGJlug41jDbjRbHTtsLKZUnUcy/8V3xZw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + } } }, "@babel/plugin-transform-regenerator": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.0.tgz", - "integrity": "sha512-AXmvnC+0wuj/cFkkS/HFHIojxH3ffSXE+ttulrqWjZZRaUOonfJc60e1wSNT4rV8tIunvu/R3wCp71/tLAa9xg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", "requires": { - "regenerator-transform": "^0.14.0" + "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", - "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", - "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz", + "integrity": "sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-spread": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", - "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz", + "integrity": "sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", - "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz", + "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-transform-template-literals": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", - "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz", + "integrity": "sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ==", + "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-annotate-as-pure": "^7.7.4", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", - "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", + "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.0.tgz", - "integrity": "sha512-RrThb0gdrNwFAqEAAx9OWgtx6ICK69x7i9tCnMdVrxQwSDp/Abu9DXFU5Hh16VP33Rmxh04+NGW28NsIkFvFKA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/polyfill": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.4.4.tgz", - "integrity": "sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.7.0.tgz", + "integrity": "sha512-/TS23MVvo34dFmf8mwCisCbWGrfhbiWZSwBo6HkADTBhUa2Q/jWltyY/tpofz/b6/RIhqaqQcquptCirqIhOaQ==", "dev": true, "requires": { "core-js": "^2.6.5", @@ -1571,271 +2795,459 @@ } }, "@babel/preset-env": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.1.tgz", - "integrity": "sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA==", - "requires": { - "@babel/helper-module-imports": "^7.7.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.7.0", - "@babel/plugin-proposal-dynamic-import": "^7.7.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.6.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.7.0", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-syntax-top-level-await": "^7.7.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.7.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.6.3", - "@babel/plugin-transform-classes": "^7.7.0", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.6.0", - "@babel/plugin-transform-dotall-regex": "^7.7.0", - "@babel/plugin-transform-duplicate-keys": "^7.5.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.4", - "@babel/plugin-transform-function-name": "^7.7.0", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.5.0", - "@babel/plugin-transform-modules-commonjs": "^7.7.0", - "@babel/plugin-transform-modules-systemjs": "^7.7.0", - "@babel/plugin-transform-modules-umd": "^7.7.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.0", - "@babel/plugin-transform-new-target": "^7.4.4", - "@babel/plugin-transform-object-super": "^7.5.5", - "@babel/plugin-transform-parameters": "^7.4.4", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.7.0", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.6.2", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.4.4", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.7.0", - "@babel/types": "^7.7.1", - "browserslist": "^4.6.0", - "core-js-compat": "^3.1.1", - "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", + "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "requires": { + "@babel/compat-data": "^7.12.1", + "@babel/helper-compilation-targets": "^7.12.1", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.1", + "core-js-compat": "^3.6.2", "semver": "^5.5.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "requires": { + "@babel/types": "^7.12.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, "@babel/helper-annotate-as-pure": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz", - "integrity": "sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", "requires": { - "@babel/types": "^7.7.0" + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4" } }, "@babel/helper-define-map": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz", - "integrity": "sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", "requires": { - "@babel/helper-function-name": "^7.7.0", - "@babel/types": "^7.7.0", - "lodash": "^4.17.13" + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" } }, "@babel/helper-function-name": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", - "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "requires": { - "@babel/helper-get-function-arity": "^7.7.0", - "@babel/template": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", - "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.10.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz", - "integrity": "sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-imports": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz", - "integrity": "sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", "requires": { - "@babel/types": "^7.7.0" + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" } }, "@babel/helper-optimise-call-expression": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz", - "integrity": "sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", "requires": { - "@babel/types": "^7.7.0" + "@babel/types": "^7.10.4" } }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, "@babel/helper-replace-supers": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz", - "integrity": "sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.7.0", - "@babel/helper-optimise-call-expression": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" } }, "@babel/helper-simple-access": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz", - "integrity": "sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", "requires": { - "@babel/template": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", - "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "requires": { - "@babel/types": "^7.7.0" + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz", - "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==" + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==" + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, "@babel/plugin-transform-block-scoping": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz", - "integrity": "sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", + "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "lodash": "^4.17.13" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-classes": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz", - "integrity": "sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.7.0", - "@babel/helper-define-map": "^7.7.0", - "@babel/helper-function-name": "^7.7.0", - "@babel/helper-optimise-call-expression": "^7.7.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.7.0", - "@babel/helper-split-export-declaration": "^7.7.0", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4", "globals": "^11.1.0" } }, + "@babel/plugin-transform-computed-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "@babel/plugin-transform-destructuring": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", - "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-function-name": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.0.tgz", - "integrity": "sha512-P5HKu0d9+CzZxP5jcrWdpe7ZlFDe24bmqP6a6X8BHEBl/eizAsY8K6LX8LASZL0Jxdjm5eEfzp+FIrxCm/p8bA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", "requires": { - "@babel/helper-function-name": "^7.7.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz", - "integrity": "sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", "requires": { - "@babel/helper-module-transforms": "^7.7.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.7.0", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-object-super": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", - "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", - "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/template": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", - "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/types": "^7.7.0" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", - "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.2", - "@babel/helper-function-name": "^7.7.0", - "@babel/helper-split-export-declaration": "^7.7.0", - "@babel/parser": "^7.7.2", - "@babel/types": "^7.7.2", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "requires": { - "@babel/highlight": "^7.0.0" - } - } + "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", - "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -1843,41 +3255,86 @@ } } }, - "@babel/preset-react": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.7.0.tgz", - "integrity": "sha512-IXXgSUYBPHUGhUkH+89TR6faMcBtuMW0h5OHbMuVbL3/5wK2g6a2M2BBpkLa+Kw0sAHiZ9dNVgqJMDP/O4GRBA==", + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.7.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/preset-react": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.0.tgz", + "integrity": "sha512-GP9t18RjtH67ea3DA2k71VqtMnTOupYJx34Z+KUEBRoRxvdETaucmtMWH5uoGHWzAD4qxbuV5ckxpewm39NXkA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-transform-react-display-name": "^7.8.0", + "@babel/plugin-transform-react-jsx": "^7.8.0", + "@babel/plugin-transform-react-jsx-self": "^7.8.0", + "@babel/plugin-transform-react-jsx-source": "^7.8.0" }, "dependencies": { "@babel/helper-builder-react-jsx": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.0.tgz", - "integrity": "sha512-LSln3cexwInTMYYoFeVLKnYPPMfWNJ8PubTBs3hkh7wCu9iBaqq1OOyW+xGmEdLxT1nhsl+9SJ+h2oUDYz0l2A==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.0.tgz", + "integrity": "sha512-Zg7VLtZzcAHoQ13S0pEIGKo8OAG3s5kjsk/4keGmUeNuc810T9fVp6izIaL8ZVeAErRFWJdvqFItY3QMTHMsSg==", "requires": { - "@babel/types": "^7.7.0", + "@babel/types": "^7.8.0", "esutils": "^2.0.0" } }, + "@babel/helper-plugin-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", + "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==" + }, + "@babel/plugin-syntax-jsx": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.0.tgz", + "integrity": "sha512-zLDUckAuKeOtxJhfNE0TlR7iEApb2u7EYRlh5cxKzq6A5VzUbYEdyJGJlug41jDbjRbHTtsLKZUnUcy/8V3xZw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.0.tgz", + "integrity": "sha512-oozdOhU2hZ6Tb9LS9BceGqDSmiUrlZX8lmRqnxQuiGzqWlhflIRQ1oFBHdV+hv+Zi9e5BhRkfSYtMLRLEkuOVA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, "@babel/plugin-transform-react-jsx": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.0.tgz", - "integrity": "sha512-mXhBtyVB1Ujfy+0L6934jeJcSXj/VCg6whZzEcgiiZHNS0PGC7vUCsZDQCxxztkpIdF+dY1fUMcjAgEOC3ZOMQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.0.tgz", + "integrity": "sha512-r5DgP2ZblaGmW/azRS9rlaf3oY4r/ByXRDA5Lcr3iHUkx3cCfL9RM10gU7AQmzwKymoq8LZ55sHyq9VeQFHwyQ==", "requires": { - "@babel/helper-builder-react-jsx": "^7.7.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" + "@babel/helper-builder-react-jsx": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-jsx": "^7.8.0" } }, "@babel/types": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", - "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -1930,6 +3387,42 @@ "to-fast-properties": "^2.0.0" } }, + "@electron/get": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.12.2.tgz", + "integrity": "sha512-vAuHUbfvBQpYTJ5wB7uVIDq5c/Ry0fiTBMs7lnEYAo/qXXppIVcWdfBr57u6eRnKdVso7KSiH6p/LbQAG6Izrg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "global-agent": "^2.0.2", + "global-tunnel-ng": "^2.7.1", + "got": "^9.6.0", + "progress": "^2.0.3", + "sanitize-filename": "^1.6.2", + "sumchecker": "^3.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } + } + }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -1974,42 +3467,48 @@ "fastq": "^1.6.0" } }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, "@sinonjs/commons": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.6.0.tgz", - "integrity": "sha512-w4/WHG7C4WWFyE5geCieFJF6MZkbW4VAriol5KlmQXpAQdxvV0p26sqNZOW6Qyw6Y0l9K4g+cHvvczR2sEEpqg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", "dev": true, "requires": { "type-detect": "4.0.8" } }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, "@sinonjs/formatio": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.1.tgz", - "integrity": "sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz", + "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", "dev": true, "requires": { "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" + "@sinonjs/samsam": "^5.0.2" } }, "@sinonjs/samsam": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", - "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.1.0.tgz", + "integrity": "sha512-42nyaQOVunX5Pm6GRJobmzbS7iLI+fhERITnETXzzwDZh+TtDr/Au3yAvXVjFmZ4wEUaE4Y3NFZfKv0bV0cbtg==", "dev": true, "requires": { - "@sinonjs/commons": "^1.3.0", - "array-from": "^2.1.1", - "lodash": "^4.17.15" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - } + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, "@sinonjs/text-encoding": { @@ -2018,6 +3517,20 @@ "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -2047,31 +3560,52 @@ "integrity": "sha512-vVjM0SVzgaOUpflq4GYBvCpozes8OgIIS5gVXVka+OfK3hvnkC1i93U8WiY2OtNE4XUWyyy/86Kf6e0IHTQw1Q==", "dev": true }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, "abstract-leveldown": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", - "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", + "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", "dev": true, "requires": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", "xtend": "~4.0.0" } }, "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", "dev": true }, "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true }, "ajv": { "version": "6.9.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.2.tgz", "integrity": "sha512-4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg==", + "dev": true, + "optional": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -2086,12 +3620,20 @@ "dev": true }, "ansi-escapes": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", - "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "dev": true, "requires": { - "type-fest": "^0.5.2" + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } } }, "ansi-regex": { @@ -2140,6 +3682,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -2163,7 +3706,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, "arr-union": { @@ -2178,18 +3721,6 @@ "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", "dev": true }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", - "dev": true - }, "array-includes": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", @@ -2242,6 +3773,8 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "optional": true, "requires": { "safer-buffer": "~2.1.0" } @@ -2249,7 +3782,9 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true }, "assertion-error": { "version": "1.1.0", @@ -2264,9 +3799,9 @@ "dev": true }, "ast-types": { - "version": "0.6.16", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.6.16.tgz", - "integrity": "sha1-BCBbcu3dGVqP6qCB8R0ClKJN7ZM=", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.3.tgz", + "integrity": "sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA==", "dev": true }, "ast-types-flow": { @@ -2275,14 +3810,14 @@ "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", "dev": true }, - "ast-util": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/ast-util/-/ast-util-0.6.0.tgz", - "integrity": "sha1-DZE9BPDpgx5T+ZkdyZAJ4tp3SBA=", + "ast-util-plus": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ast-util-plus/-/ast-util-plus-0.6.2.tgz", + "integrity": "sha512-k7sWJ1B1PT/Mm5xTszBK9kxQYD15H1iSMqIkM/88qeGjNLgCEiZT5Has7L+dNtcMi3ed2iYiKy05jzQ/ZkB9DQ==", "dev": true, "requires": { - "ast-types": "~0.6.7", - "private": "~0.1.6" + "ast-types": "0.13.3", + "private": "0.1.8" } }, "astral-regex": { @@ -2294,7 +3829,9 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, + "optional": true }, "atob": { "version": "2.1.2", @@ -2305,12 +3842,16 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "optional": true }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true, + "optional": true }, "axobject-query": { "version": "2.0.2", @@ -2390,6 +3931,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, "requires": { "object.assign": "^4.1.0" } @@ -2407,13 +3949,31 @@ } }, "babel-plugin-macros": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz", - "integrity": "sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", "requires": { - "@babel/runtime": "^7.4.2", - "cosmiconfig": "^5.2.0", - "resolve": "^1.10.0" + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.6.tgz", + "integrity": "sha512-BWAJxpNVa0QlE5gZdWjSxXtemZyZ9RmrmVozxt3NUXeZhVIJ5ANyqmMc0JDrivBZyxUuQvFxlvH4OWWOogGfUw==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "resolve": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", + "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", + "requires": { + "path-parse": "^1.0.6" + } + } } }, "babel-plugin-relay": { @@ -2431,9 +3991,9 @@ "dev": true }, "babel-preset-fbjs": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.2.0.tgz", - "integrity": "sha512-5Jo+JeWiVz2wHUUyAlvb/sSYnXNig9r+HqGAOSfh5Fzxp7SnAaR/tEGRJ1ZX7C77kfk82658w6R5Z+uPATTD9g==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz", + "integrity": "sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw==", "dev": true, "requires": { "@babel/plugin-proposal-class-properties": "^7.0.0", @@ -2609,29 +4169,31 @@ } } }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "optional": true, "requires": { "tweetnacl": "^0.14.3" } }, - "bindings": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.1.tgz", - "integrity": "sha512-i47mqjF9UbjxJhxGf+pZ6kSxrnI3wBLlnGI2ArWJ4r0VrvDS7ZYXkprq/pLaBWYq4GM0r4zdHY+NNRqEMU7uew==", - "dev": true - }, "bintrees": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", "integrity": "sha1-SfiW1uhYpKSZ34XDj7OZua/4QPg=" }, "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", "requires": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" @@ -2643,6 +4205,13 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, + "boolean": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.1.tgz", + "integrity": "sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA==", + "dev": true, + "optional": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2688,24 +4257,35 @@ "dev": true }, "browserslist": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", - "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", + "version": "4.14.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.6.tgz", + "integrity": "sha512-zeFYcUo85ENhc/zxHbiIp0LGzzTrE2Pv2JhxvS7kpUb9Q9D38kUX6Bie7pGutJ/5iF5rOxE7CepAuWD56xJ33A==", "requires": { - "caniuse-lite": "^1.0.30001004", - "electron-to-chromium": "^1.3.295", - "node-releases": "^1.1.38" + "caniuse-lite": "^1.0.30001154", + "electron-to-chromium": "^1.3.585", + "escalade": "^3.1.1", + "node-releases": "^1.1.65" } }, "bser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", - "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "requires": { "node-int64": "^0.4.0" } }, + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, "buffer-alloc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", @@ -2720,17 +4300,17 @@ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -2753,6 +4333,44 @@ "unset-value": "^1.0.0" } }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, "caching-transform": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", @@ -2771,60 +4389,23 @@ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", "dev": true }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, "caniuse-lite": { - "version": "1.0.30001008", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz", - "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==" + "version": "1.0.30001156", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001156.tgz", + "integrity": "sha512-z7qztybA2eFZTB6Z3yvaQBIoJpQtsewRD74adw2UbRWwsRq3jIPvgrQGawBMbfafekQaD21FWuXNcywtTDGGCw==" }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "optional": true }, "chai": { "version": "4.2.0", @@ -2942,9 +4523,9 @@ } }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true }, "cliui": { @@ -2997,6 +4578,14 @@ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -3029,6 +4618,8 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, + "optional": true, "requires": { "delayed-stream": "~1.0.0" } @@ -3051,9 +4642,9 @@ "integrity": "sha1-me1EydezCN54Uv8RFJcr1Poj5yc=" }, "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, "concat-map": { @@ -3061,16 +4652,15 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", "dev": true, + "optional": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, "console-control-strings": { @@ -3098,12 +4688,19 @@ "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==" }, "core-js-compat": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.4.0.tgz", - "integrity": "sha512-pgQUcgT2+v9/yxHgMynYjNj7nmxLRXv3UC39rjCjDwpe63ev2rioQTju1PKLYUBbPCQQvZNWvQC8tBJd65q11g==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", "requires": { - "browserslist": "^4.7.2", - "semver": "^6.3.0" + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } } }, "core-util-is": { @@ -3112,14 +4709,33 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "dependencies": { + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + } } }, "cp-file": { @@ -3194,15 +4810,6 @@ "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", "dev": true }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, "damerau-levenshtein": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", @@ -3213,6 +4820,8 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "optional": true, "requires": { "assert-plus": "^1.0.0" } @@ -3286,14 +4895,34 @@ "strip-bom": "^3.0.0" } }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, "deferred-leveldown": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz", - "integrity": "sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", + "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", "dev": true, "requires": { - "abstract-leveldown": "~5.0.0", + "abstract-leveldown": "~6.2.1", "inherits": "^2.0.3" + }, + "dependencies": { + "abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + } + } } }, "define-properties": { @@ -3348,7 +4977,9 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "optional": true }, "delegates": { "version": "1.0.0", @@ -3360,6 +4991,13 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true, + "optional": true + }, "diff": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", @@ -3424,9 +5062,9 @@ } }, "dompurify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.0.7.tgz", - "integrity": "sha512-S3O0lk6rFJtO01ZTzMollCOGg+WAtCwS3U5E2WSDY/x/sy7q70RjEC4Dmrih5/UqzLLB9XoKJ8KqwBxaNvBu4A==" + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.0.17.tgz", + "integrity": "sha512-nNwwJfW55r8akD8MSFz6k75bzyT2y6JEa1O3JrZFBf+Y5R9JXXU4OsRl0B9hKoPgHTw2b7ER5yJ5Md97MMUJPg==" }, "domutils": { "version": "1.5.1", @@ -3439,117 +5077,134 @@ } }, "dugite": { - "version": "1.87.3", - "resolved": "https://registry.npmjs.org/dugite/-/dugite-1.87.3.tgz", - "integrity": "sha512-cmFWgGhJdhEc+1Nsi/h5gTCyADbKHk47VnumRrVnkLwQtX5Z9A2nIdnTv4bjysFWaf4mTcVqDVDwEUCrfII9zA==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/dugite/-/dugite-1.92.0.tgz", + "integrity": "sha512-Xra5E2ISwy+sCUrlcBkBsOpP85u5lsbaMnRpnvMJpO+KSoCGccMUimekGS+Ry8ZRni80gHw83MKSrdycaH2bZg==", "requires": { "checksum": "^0.1.1", + "got": "^9.6.0", "mkdirp": "^0.5.1", "progress": "^2.0.3", - "request": "^2.88.0", "rimraf": "^2.5.4", "tar": "^4.4.7" } }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "optional": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "electron-devtools-installer": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-2.2.4.tgz", - "integrity": "sha512-b5kcM3hmUqn64+RUcHjjr8ZMpHS2WJ5YO0pnG9+P/RTdx46of/JrEjuciHWux6pE+On6ynWhHJF53j/EDJN0PA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-3.1.1.tgz", + "integrity": "sha512-g2D4J6APbpsiIcnLkFMyKZ6bOpEJ0Ltcc2m66F7oKUymyGAt628OWeU9nRZoh1cNmUs/a6Cls2UfOmsZtE496Q==", "dev": true, "requires": { - "7zip": "0.0.6", - "cross-unzip": "0.0.2", - "rimraf": "^2.5.2", - "semver": "^5.3.0" + "rimraf": "^3.0.2", + "semver": "^7.2.1", + "unzip-crx-3": "^0.2.0" }, "dependencies": { - "cross-unzip": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/cross-unzip/-/cross-unzip-0.0.2.tgz", - "integrity": "sha1-UYO8R6CVWb78+YzEZXlkmZNZNy8=", - "dev": true + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true } } }, - "electron-download": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz", - "integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==", - "dev": true, - "requires": { - "debug": "^3.0.0", - "env-paths": "^1.0.0", - "fs-extra": "^4.0.1", - "minimist": "^1.2.0", - "nugget": "^2.0.1", - "path-exists": "^3.0.0", - "rc": "^1.2.1", - "semver": "^5.4.1", - "sumchecker": "^2.0.2" + "electron-link": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/electron-link/-/electron-link-0.4.3.tgz", + "integrity": "sha512-rfJSTwJOZkU15mtNvAOaDNafS7I1Jse31rgbGQJ/mJ7ZGtxZJy7FdxiDkMfT/NmbS3qluK3tO5DIU6VrZnfQLw==", + "dev": true, + "requires": { + "acorn": "^7.3.1", + "ast-util-plus": "^0.6.2", + "encoding-down": "^6.3.0", + "indent-string": "^4.0.0", + "leveldown": "^5.6.0", + "levelup": "^4.4.0", + "recast": "^0.19.1", + "resolve": "^1.17.0", + "source-map": "^0.7.3" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { - "ms": "^2.1.1" + "path-parse": "^1.0.6" } }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true } } }, - "electron-link": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/electron-link/-/electron-link-0.3.2.tgz", - "integrity": "sha512-V7QmtujzWgvrW5BI2CKmIRF+q+pkrFO5Lecd8TpibbBz+FfW5WQ4kCN0sZjNaUOMtGGroCib721OqIDEynjwgA==", - "dev": true, - "requires": { - "ast-util": "^0.6.0", - "encoding-down": "~5.0.0", - "indent-string": "^3.2.0", - "leveldown": "~4.0.0", - "levelup": "~3.0.0", - "recast": "^0.12.6", - "resolve": "^1.5.0", - "source-map": "^0.5.6" - } - }, "electron-mksnapshot": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/electron-mksnapshot/-/electron-mksnapshot-2.0.0.tgz", - "integrity": "sha512-OoZwZJNKgHP+DwhCGVTJEuDSeb478hOzAbHeg7dKGCHDbKKmUWmjGc+pEjxGutpqQ3Mn8hCdLzdx2c/lAJcTLA==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/electron-mksnapshot/-/electron-mksnapshot-9.0.2.tgz", + "integrity": "sha512-885PfbJuNlvfmOPNoOj8SG1/i2WlqdcogN86o2/uPGOvPWTTRyYNfutzbWUjRDUB+Wl7TC9rT8f40tNp+N/xDw==", "dev": true, "requires": { - "electron-download": "^4.1.0", - "extract-zip": "^1.6.5" + "@electron/get": "^1.12.2", + "extract-zip": "^2.0.0", + "fs-extra": "^7.0.1", + "temp": "^0.8.3" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "temp": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", + "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", + "dev": true, + "requires": { + "rimraf": "~2.6.2" + } + } } }, "electron-to-chromium": { - "version": "1.3.306", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", - "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==" + "version": "1.3.589", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.589.tgz", + "integrity": "sha512-rQItBTFnol20HaaLm26UgSUduX7iGerwW7pEYX17MB1tI6LzFajiLV7iZ7LVcUcsN/7HrZUoCLrBauChy/IqEg==" }, "emoji-regex": { "version": "7.0.3", @@ -3557,6 +5212,13 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "optional": true + }, "encoding": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", @@ -3566,16 +5228,15 @@ } }, "encoding-down": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-5.0.4.tgz", - "integrity": "sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", + "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", "dev": true, "requires": { - "abstract-leveldown": "^5.0.0", + "abstract-leveldown": "^6.2.1", "inherits": "^2.0.3", "level-codec": "^9.0.0", - "level-errors": "^2.0.0", - "xtend": "^4.0.1" + "level-errors": "^2.0.0" } }, "end-of-stream": { @@ -3593,9 +5254,9 @@ "dev": true }, "env-paths": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", - "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", "dev": true }, "enzyme": { @@ -3711,15 +5372,20 @@ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.6.0.tgz", - "integrity": "sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -3737,7 +5403,7 @@ "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", - "globals": "^11.7.0", + "globals": "^12.1.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -3750,7 +5416,7 @@ "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", + "optionator": "^0.8.3", "progress": "^2.0.0", "regexpp": "^2.0.1", "semver": "^6.1.2", @@ -3762,12 +5428,12 @@ }, "dependencies": { "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" @@ -3779,40 +5445,30 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, - "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "type-fest": "^0.8.1" } }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -3823,9 +5479,9 @@ } }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true } } @@ -3927,12 +5583,12 @@ } }, "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -3946,43 +5602,60 @@ } }, "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "dev": true, "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.1.0" } }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "estraverse": { @@ -4080,7 +5753,9 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "optional": true }, "extend-shallow": { "version": "3.0.2", @@ -4180,54 +5855,56 @@ } }, "extract-zip": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", - "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, "requires": { - "concat-stream": "1.6.2", - "debug": "2.6.9", - "mkdirp": "0.5.1", - "yauzl": "2.4.1" + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { - "ms": "2.0.0" + "pump": "^3.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } } } }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "optional": true }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "fast-future": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fast-future/-/fast-future-1.0.2.tgz", - "integrity": "sha1-hDWpqqAteSSNF9cE52JZMB2ZKAo=", - "dev": true + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true, + "optional": true }, "fast-glob": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", - "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", "dev": true, "requires": { "@mrmlnc/readdir-enhanced": "^2.2.1", @@ -4236,23 +5913,13 @@ "is-glob": "^4.0.0", "merge2": "^1.2.3", "micromatch": "^3.1.10" - }, - "dependencies": { - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - } } }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", @@ -4270,12 +5937,12 @@ } }, "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", "dev": true, "requires": { - "bser": "^2.0.0" + "bser": "2.1.1" } }, "fbjs": { @@ -4305,18 +5972,18 @@ "dev": true }, "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "dev": true, "requires": { "pend": "~1.2.0" } }, "figures": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", - "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" @@ -4403,9 +6070,9 @@ } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "for-in": { @@ -4439,12 +6106,16 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "optional": true }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "optional": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -4537,17 +6208,10 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, "requires": { "pump": "^3.0.0" }, @@ -4556,7 +6220,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -4574,6 +6237,8 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "optional": true, "requires": { "assert-plus": "^1.0.0" } @@ -4604,6 +6269,17 @@ "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } } }, "glob-to-regexp": { @@ -4612,11 +6288,66 @@ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", "dev": true }, + "global-agent": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.12.tgz", + "integrity": "sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg==", + "dev": true, + "optional": true, + "requires": { + "boolean": "^3.0.1", + "core-js": "^3.6.5", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "dependencies": { + "core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "dev": true, + "optional": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "optional": true + } + } + }, + "global-tunnel-ng": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", + "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", + "dev": true, + "optional": true, + "requires": { + "encodeurl": "^1.0.2", + "lodash": "^4.17.10", + "npm-conf": "^1.1.3", + "tunnel": "^0.0.6" + } + }, "globals": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==" }, + "globalthis": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.1.tgz", + "integrity": "sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw==", + "dev": true, + "optional": true, + "requires": { + "define-properties": "^1.1.3" + } + }, "globby": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", @@ -4722,6 +6453,24 @@ } } }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", @@ -4751,9 +6500,9 @@ "dev": true }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.6.0.tgz", + "integrity": "sha512-i1ZUP7Qp2JdkMaFon2a+b0m5geE8Z4ZTLaGkgrObkEd+OkUKyRbRWw4KxuFCoHfdETSY1yf9/574eVoNSiK7pw==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -4789,12 +6538,16 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "optional": true }, "har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "optional": true, "requires": { "ajv": "^6.5.5", "har-schema": "^2.0.0" @@ -4881,9 +6634,9 @@ "dev": true }, "hock": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/hock/-/hock-1.3.3.tgz", - "integrity": "sha512-bEX7KH/KSv2Q5zA+o1EdyeH52+gD2cfpYyAsHMEwjb9txXWttityKVf7cG0y3UVA4D8bxKDzH8LVXCQIr9rClg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/hock/-/hock-1.4.1.tgz", + "integrity": "sha512-RTJ9m62KGU4WbBN3zjBewxLsNwzWfJlcKkoWoY9RoYJkoSZ1zwKUe6VMpLgSMxPBqkOohB1c45weLBe5SJzqTA==", "dev": true, "requires": { "deep-equal": "0.2.1", @@ -4932,10 +6685,17 @@ } } }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "optional": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -4950,6 +6710,12 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -4963,6 +6729,12 @@ "dev": true, "optional": true }, + "immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "dev": true + }, "immutable": { "version": "3.7.6", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", @@ -4970,12 +6742,12 @@ "dev": true }, "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, "imurmurhash": { @@ -4985,9 +6757,9 @@ "dev": true }, "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, "inflight": { @@ -5005,35 +6777,70 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" }, "inquirer": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", - "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", + "chalk": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", + "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" }, "dependencies": { "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "emoji-regex": { @@ -5042,36 +6849,45 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, "string-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", - "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^5.2.0" + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } @@ -5080,6 +6896,7 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, "requires": { "loose-envify": "^1.0.0" } @@ -5178,11 +6995,6 @@ } } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -5195,15 +7007,6 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", @@ -5213,12 +7016,12 @@ } }, "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -5250,18 +7053,12 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "^3.0.1" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -5300,13 +7097,9 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true, + "optional": true }, "is-windows": { "version": "1.0.2", @@ -5354,7 +7147,9 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true, + "optional": true }, "istanbul-lib-coverage": { "version": "2.0.5", @@ -5535,11 +7330,6 @@ "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" }, - "js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -5549,6 +7339,7 @@ "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -5557,13 +7348,20 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -5572,12 +7370,15 @@ "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true, + "optional": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -5588,7 +7389,9 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true, + "optional": true }, "json5": { "version": "2.1.0", @@ -5610,6 +7413,8 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "optional": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -5623,10 +7428,22 @@ "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", "dev": true }, + "jszip": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", + "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, "just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", + "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", "dev": true }, "keytar": { @@ -5645,6 +7462,14 @@ } } }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -5696,90 +7521,118 @@ } }, "level-codec": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.0.tgz", - "integrity": "sha512-OIpVvjCcZNP5SdhcNupnsI1zo5Y9Vpm+k/F1gfG5kXrtctlrwanisakweJtE0uA0OpLukRfOQae+Fg0M5Debhg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", + "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", + "dev": true, + "requires": { + "buffer": "^5.6.0" + } + }, + "level-concat-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", + "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", "dev": true }, "level-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.0.tgz", - "integrity": "sha512-AmY4HCp9h3OiU19uG+3YWkdELgy05OTP/r23aNHaQKWv8DO787yZgsEuGVkoph40uwN+YdUKnANlrxSsoOaaxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", + "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", "dev": true, "requires": { "errno": "~0.1.1" } }, "level-iterator-stream": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz", - "integrity": "sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", + "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.5", - "xtend": "^4.0.0" + "inherits": "^2.0.4", + "readable-stream": "^3.4.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } } }, - "leveldown": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-4.0.1.tgz", - "integrity": "sha512-ZlBKVSsglPIPJnz4ggB8o2R0bxDxbsMzuQohbfgoFMVApyTE118DK5LNRG0cRju6rt3OkGxe0V6UYACGlq/byg==", + "level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", "dev": true, "requires": { - "abstract-leveldown": "~5.0.0", - "bindings": "~1.3.0", - "fast-future": "~1.0.2", - "nan": "~2.10.0", - "prebuild-install": "^4.0.0" + "xtend": "^4.0.2" }, "dependencies": { - "expand-template": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz", - "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==", - "dev": true - }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true - }, - "prebuild-install": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-4.0.0.tgz", - "integrity": "sha512-7tayxeYboJX0RbVzdnKyGl2vhQRWr6qfClEXDhOkXjuaOKCw2q8aiuFhONRYVsG/czia7KhpykIlI2S2VaPunA==", + } + } + }, + "leveldown": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz", + "integrity": "sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==", + "dev": true, + "requires": { + "abstract-leveldown": "~6.2.1", + "napi-macros": "~2.0.0", + "node-gyp-build": "~4.1.0" + }, + "dependencies": { + "abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", "dev": true, "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^1.0.2", - "github-from-package": "0.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "node-abi": "^2.2.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "os-homedir": "^1.0.1", - "pump": "^2.0.1", - "rc": "^1.1.6", - "simple-get": "^2.7.0", - "tar-fs": "^1.13.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" } } } }, "levelup": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-3.0.1.tgz", - "integrity": "sha512-TrrLDPC/BfP35ei2uK+L6Cc7kpI1NxIChwp+BUB6jrHG3A8gtrr9jx1UZ9bi2w1O6VN7jYO4LUoq1iKRP5AREg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", + "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", "dev": true, "requires": { - "deferred-leveldown": "~4.0.0", + "deferred-leveldown": "~5.3.0", "level-errors": "~2.0.0", - "level-iterator-stream": "~2.0.0", + "level-iterator-stream": "~4.0.0", + "level-supports": "~1.0.0", "xtend": "~4.0.0" } }, @@ -5793,6 +7646,28 @@ "type-check": "~0.3.2" } }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + }, + "dependencies": { + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + } + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -5816,9 +7691,9 @@ } }, "lodash": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", - "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "lodash.escape": { "version": "4.0.1", @@ -5832,6 +7707,12 @@ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -5863,12 +7744,6 @@ "chalk": "^2.0.1" } }, - "lolex": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", - "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", - "dev": true - }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -5877,15 +7752,10 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lru-cache": { "version": "4.1.5", @@ -5944,12 +7814,6 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -5960,9 +7824,28 @@ } }, "marked": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", - "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==" + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.0.tgz", + "integrity": "sha512-MyUe+T/Pw4TZufHkzAfDj6HarCBWia2y27/bhuYkTaiUnfDYFnCP3KUN+9oM7Wi6JA2rymtVYbQu3spE0GCmxQ==" + }, + "matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "optional": true, + "requires": { + "escape-string-regexp": "^4.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "optional": true + } + } }, "md5": { "version": "2.2.1", @@ -5994,114 +7877,6 @@ } } }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, "merge-source-map": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", @@ -6156,12 +7931,16 @@ "mime-db": { "version": "1.38.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", + "dev": true, + "optional": true }, "mime-types": { "version": "2.1.22", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "dev": true, + "optional": true, "requires": { "mime-db": "~1.38.0" } @@ -6318,12 +8097,6 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -6484,9 +8257,9 @@ "dev": true }, "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.28.0.tgz", + "integrity": "sha512-Z5KOjYmnHyd/ukynmFd/WwyXHd7L4J9vTI/nn5Ap9AVUgaAE15VvQ9MOGmJJygEUklupqIrFnor/tjTwRU+tQw==" }, "moo": { "version": "0.4.3", @@ -6506,9 +8279,9 @@ "dev": true }, "nan": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", - "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==" + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" }, "nanomatch": { "version": "1.2.13", @@ -6534,6 +8307,12 @@ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz", "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==" }, + "napi-macros": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", + "dev": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6580,15 +8359,15 @@ "dev": true }, "nise": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.2.tgz", - "integrity": "sha512-/6RhOUlicRCbE9s+94qCUsyE+pKlVJ5AhIv+jEE7ESKwnbXqulKZ1FYU+XAtHHWE9TinYvAxDUJAb912PwPoWA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.4.tgz", + "integrity": "sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A==", "dev": true, "requires": { - "@sinonjs/formatio": "^3.2.1", + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", - "lolex": "^4.1.0", "path-to-regexp": "^1.7.0" } }, @@ -6634,9 +8413,15 @@ } }, "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "dev": true + }, + "node-gyp-build": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz", + "integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==", "dev": true }, "node-int64": { @@ -6646,12 +8431,9 @@ "dev": true }, "node-releases": { - "version": "1.1.39", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz", - "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==", - "requires": { - "semver": "^6.3.0" - } + "version": "1.1.65", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.65.tgz", + "integrity": "sha512-YpzJOe2WFIW0V4ZkJQd/DGR/zdVwc/pI4Nl1CZrBO19FdRcSTmsuhdttw9rsTzzJLrNcSloLiBbEYx1C4f6gpA==" }, "noop-logger": { "version": "0.1.1", @@ -6678,6 +8460,22 @@ } } }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + }, + "npm-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "dev": true, + "optional": true, + "requires": { + "config-chain": "^1.1.11", + "pify": "^3.0.0" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -6707,38 +8505,6 @@ "boolbase": "~1.0.0" } }, - "nugget": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", - "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", - "dev": true, - "requires": { - "debug": "^2.1.3", - "minimist": "^1.1.0", - "pretty-bytes": "^1.0.2", - "progress-stream": "^1.1.0", - "request": "^2.45.0", - "single-line-log": "^1.1.2", - "throttleit": "0.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", @@ -6975,7 +8741,9 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -7114,9 +8882,9 @@ } }, "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { "mimic-fn": "^2.1.0" @@ -7174,6 +8942,11 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -7228,11 +9001,16 @@ "release-zalgo": "^1.0.0" } }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "requires": { "callsites": "^3.0.0" }, @@ -7240,8 +9018,7 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" } } }, @@ -7249,6 +9026,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -7298,9 +9076,9 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, "requires": { "isarray": "0.0.1" @@ -7338,7 +9116,8 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true }, "picomatch": { "version": "2.0.7", @@ -7352,21 +9131,6 @@ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -7411,20 +9175,16 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, - "pretty-bytes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", - "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.1.0" - } + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=" + "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=", + "dev": true }, "process-nextick-args": { "version": "2.0.0", @@ -7436,16 +9196,6 @@ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, - "progress-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", - "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", - "dev": true, - "requires": { - "speedometer": "~0.1.2", - "through2": "~0.2.3" - } - }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -7464,6 +9214,13 @@ "react-is": "^16.8.1" } }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true, + "optional": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -7479,7 +9236,9 @@ "psl": { "version": "1.1.31", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "dev": true, + "optional": true }, "pump": { "version": "2.0.1", @@ -7493,12 +9252,15 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "optional": true }, "raf": { "version": "3.4.1", @@ -7537,9 +9299,9 @@ } }, "react": { - "version": "16.11.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.11.0.tgz", - "integrity": "sha512-M5Y8yITaLmU0ynd0r1Yvfq98Rmll6q8AxaEe88c8e7LxO8fZ2cNgmFt0aGAS9wzf1Ao32NKXtCl+/tVVtkxq6g==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", + "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -7547,20 +9309,20 @@ } }, "react-dom": { - "version": "16.11.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.11.0.tgz", - "integrity": "sha512-nrRyIUE1e7j8PaXSPtyRKtz+2y9ubW/ghNgqKFHHAHaeP0fpF5uXR+sq8IMRHC+ZUxw7W9NyCDTBtwWxvkb0iA==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", + "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.17.0" + "scheduler": "^0.18.0" }, "dependencies": { "scheduler": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.17.0.tgz", - "integrity": "sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", + "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -7659,24 +9421,17 @@ } }, "recast": { - "version": "0.12.9", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.12.9.tgz", - "integrity": "sha512-y7ANxCWmMW8xLOaiopiRDlyjQ9ajKRENBH+2wjntIbk3A6ZR1+BLQttkmSHMY7Arl+AAZFwJ10grg2T6f1WI8A==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.19.1.tgz", + "integrity": "sha512-8FCjrBxjeEU2O6I+2hyHyBFH1siJbMBLwIRvVr1T3FD2cL754sOaJDsJ/8h3xYltasbJ8jqWRIhMuDGBSiSbjw==", "dev": true, "requires": { - "ast-types": "0.10.1", - "core-js": "^2.4.1", + "ast-types": "0.13.3", "esprima": "~4.0.0", - "private": "~0.1.5", + "private": "^0.1.8", "source-map": "~0.6.1" }, "dependencies": { - "ast-types": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz", - "integrity": "sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7685,36 +9440,15 @@ } } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - } - } - }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "requires": { "regenerate": "^1.4.0" } @@ -7725,11 +9459,26 @@ "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" }, "regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "requires": { - "private": "^0.1.6" + "@babel/runtime": "^7.8.4" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } } }, "regex-not": { @@ -7749,27 +9498,27 @@ "dev": true }, "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "requires": { "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" + "unicode-match-property-value-ecmascript": "^1.2.0" } }, "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" }, "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", "requires": { "jsesc": "~0.5.0" }, @@ -8104,19 +9853,12 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "optional": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -8161,9 +9903,9 @@ } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, "resolve-url": { "version": "0.2.1", @@ -8171,6 +9913,14 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -8201,6 +9951,30 @@ "glob": "^7.1.3" } }, + "roarr": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.3.tgz", + "integrity": "sha512-AEjYvmAhlyxOeB9OqPUzQCo3kuAkNfuDk/HqWbZdFsqDFpapkTjiw+p4svNEoRLvuqNTxqfL+s+gtD4eDgZ+CA==", + "dev": true, + "optional": true, + "requires": { + "boolean": "^3.0.0", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true, + "optional": true + } + } + }, "rst-selector-parser": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", @@ -8212,13 +9986,10 @@ } }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true }, "run-parallel": { "version": "1.1.9", @@ -8227,9 +9998,9 @@ "dev": true }, "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -8254,6 +10025,15 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, "scheduler": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.3.tgz", @@ -8267,13 +10047,46 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true, + "optional": true + }, + "serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "optional": true, + "requires": { + "type-fest": "^0.13.1" + }, + "dependencies": { + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "optional": true + } + } }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -8343,35 +10156,41 @@ "simple-concat": "^1.0.0" } }, - "single-line-log": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", - "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", - "dev": true, - "requires": { - "string-width": "^1.0.1" - } - }, "sinon": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", - "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.4.0", - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.3.3", - "diff": "^3.5.0", - "lolex": "^4.2.0", - "nise": "^1.5.2", - "supports-color": "^5.5.0" + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.3.tgz", + "integrity": "sha512-IKo9MIM111+smz9JGwLmw5U1075n1YXeAq8YeSFlndCLhAL5KGn6bLgu7b/4AYHTV/LcEMcRm2wU2YiL55/6Pg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.2", + "@sinonjs/fake-timers": "^6.0.1", + "@sinonjs/formatio": "^5.0.1", + "@sinonjs/samsam": "^5.1.0", + "diff": "^4.0.2", + "nise": "^4.0.4", + "supports-color": "^7.1.0" }, "dependencies": { "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -8454,7 +10273,7 @@ "snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { "define-property": "^1.0.0", @@ -8505,7 +10324,7 @@ "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { "kind-of": "^3.2.0" @@ -8592,12 +10411,6 @@ "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "dev": true }, - "speedometer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", - "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", - "dev": true - }, "split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", @@ -8618,12 +10431,15 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "optional": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -8659,7 +10475,7 @@ }, "string-width": { "version": "1.0.2", - "resolved": "", + "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", @@ -8706,52 +10522,26 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "sumchecker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", - "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", "dev": true, "requires": { - "debug": "^2.2.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "debug": "^4.1.0" } }, "superstring": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/superstring/-/superstring-2.3.6.tgz", - "integrity": "sha512-kDTXCXArhHL1lRk2zBW7ByRJByqVwoLK3E3jlf8+LcwQLZgSMs9dwrDHDpBdoOm89kstSBSrGcW8OJqNkxjWrQ==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/superstring/-/superstring-2.4.4.tgz", + "integrity": "sha512-41LWIGzy6tkUM6jUwbXTeGOLui3gGBxgV6m8gIWRzv1WdW0HV6oANHdGanRrM04mwFXXExII9OQ/XxaqU+Ft9w==", "requires": { - "nan": "^2.10.0" + "nan": "^2.14.2" } }, "supports-color": { @@ -8775,12 +10565,12 @@ }, "dependencies": { "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" @@ -8792,6 +10582,12 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -8910,68 +10706,11 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "throttleit": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", - "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", - "dev": true - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, - "through2": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", - "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9", - "xtend": "~2.1.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, "tinycolor2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", @@ -9016,6 +10755,11 @@ } } }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -9042,6 +10786,8 @@ "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "optional": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" @@ -9050,32 +10796,45 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true, + "optional": true } } }, "tree-kill": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", - "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==" - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "dev": true, + "requires": { + "utf8-byte-length": "^1.0.1" + } }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", "dev": true }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "optional": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -9087,7 +10846,9 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true }, "type-check": { "version": "0.3.2", @@ -9105,15 +10866,9 @@ "dev": true }, "type-fest": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", - "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, "ua-parser-js": { @@ -9176,14 +10931,14 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" }, "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" }, "union-value": { "version": "1.0.1", @@ -9242,10 +10997,22 @@ } } }, + "unzip-crx-3": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz", + "integrity": "sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ==", + "dev": true, + "requires": { + "jszip": "^3.1.0", + "mkdirp": "^0.5.1", + "yaku": "^0.16.6" + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -9273,12 +11040,26 @@ } } }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "dev": true + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -9287,12 +11068,13 @@ "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true }, "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, "validate-npm-package-license": { @@ -9309,6 +11091,8 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "optional": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -9329,12 +11113,12 @@ } }, "whats-my-line": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/whats-my-line/-/whats-my-line-0.1.1.tgz", - "integrity": "sha512-ldFEAzvGmd3uTq3STfdwTU43h85NmgIwZG1t9GkM5669iO+hhgD/9UAqhdmEmJPqeLNRsOKx3I7L58trcffrpA==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/whats-my-line/-/whats-my-line-0.1.4.tgz", + "integrity": "sha512-CBuAlH2jZDxLDbjb05jgDLJHO6/5TOJw/n0wb11MP5HPpBZmL/mOXOcYfqcf7QLTh8OChCZeoSkz0uevEjEKfg==", "requires": { "dugite": "^1.86.0", - "superstring": "^2.3.6", + "superstring": "^2.4.4", "what-the-diff": "^0.6.0" } }, @@ -9434,11 +11218,35 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, + "yaku": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/yaku/-/yaku-0.16.7.tgz", + "integrity": "sha1-HRlceKqbW/hHnIlblQT9TwhHmE4=", + "dev": true + }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, + "yaml": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", + "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", + "requires": { + "@babel/runtime": "^7.6.3" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.6.tgz", + "integrity": "sha512-BWAJxpNVa0QlE5gZdWjSxXtemZyZ9RmrmVozxt3NUXeZhVIJ5ANyqmMc0JDrivBZyxUuQvFxlvH4OWWOogGfUw==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + } + } + }, "yargs": { "version": "13.2.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", @@ -9589,12 +11397,13 @@ } }, "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", "dev": true, "requires": { - "fd-slicer": "~1.0.1" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } }, "yubikiri": { diff --git a/package.json b/package.json index 82063024cb..c008cf5d55 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "github", "main": "./lib/index", - "version": "0.31.1", + "version": "0.36.10", "description": "GitHub integration", "repository": "https://github.com/atom/github", "license": "MIT", @@ -15,7 +15,8 @@ "report:coverage": "nyc report --reporter=cobertura --reporter=html --reporter=lcovonly", "lint": "eslint --max-warnings 0 test lib", "fetch-schema": "node script/fetch-schema", - "relay": "relay-compiler --src ./lib --schema graphql/schema.graphql" + "relay": "relay-compiler --src ./lib --schema graphql/schema.graphql", + "postinstall": "node script/redownload-electron-bins.js" }, "engines": { "atom": ">=1.37.0" @@ -40,40 +41,41 @@ "dependencies": { "@atom/babel-plugin-chai-assert-async": "1.0.0", "@atom/babel7-transpiler": "1.0.0-1", - "@babel/generator": "7.7.2", - "@babel/plugin-proposal-class-properties": "7.7.0", - "@babel/plugin-proposal-object-rest-spread": "7.6.2", - "@babel/preset-env": "7.7.1", - "@babel/preset-react": "7.7.0", + "@babel/core": "7.x <7.12.10", + "@babel/generator": "7.8.0", + "@babel/plugin-proposal-class-properties": "7.8.0", + "@babel/plugin-proposal-object-rest-spread": "7.8.0", + "@babel/preset-env": "7.12.1", + "@babel/preset-react": "7.8.0", "babel-plugin-relay": "5.0.0", "bintrees": "1.0.2", "bytes": "3.1.0", "classnames": "2.2.6", "compare-sets": "1.0.1", - "dompurify": "2.0.7", - "dugite": "1.87.3", + "dompurify": "2.0.17", + "dugite": "1.92.0", "event-kit": "2.5.3", "fs-extra": "4.0.3", "graphql": "14.5.8", "keytar": "4.13.0", "lodash.memoize": "4.1.2", - "marked": "0.7.0", - "moment": "2.24.0", + "marked": "0.8.0", + "moment": "2.28.0", "node-emoji": "1.10.0", "prop-types": "15.7.2", - "react": "16.11.0", - "react-dom": "16.11.0", + "react": "16.12.0", + "react-dom": "16.12.0", "react-relay": "5.0.0", "react-select": "1.2.1", "react-tabs": "^3.0.0", "relay-runtime": "5.0.0", "temp": "0.9.1", "tinycolor2": "1.4.1", - "tree-kill": "1.2.1", + "tree-kill": "1.2.2", "underscore-plus": "1.7.0", "what-the-diff": "0.6.0", "what-the-status": "1.0.3", - "whats-my-line": "0.1.1", + "whats-my-line": "^0.1.4", "yubikiri": "2.0.0" }, "devDependencies": { @@ -83,16 +85,16 @@ "chai-as-promised": "7.1.1", "cross-unzip": "0.2.1", "dedent-js": "1.0.1", - "electron-devtools-installer": "2.2.4", - "electron-link": "0.3.2", - "electron-mksnapshot": "~2.0", + "electron-devtools-installer": "3.1.1", + "electron-link": "0.4.3", + "electron-mksnapshot": "^9.0.2", "enzyme": "3.10.0", "enzyme-adapter-react-16": "1.7.1", - "eslint": "6.6.0", + "eslint": "6.8.0", "eslint-config-fbjs-opensource": "1.0.0", "eslint-plugin-jsx-a11y": "6.2.3", "globby": "10.0.1", - "hock": "1.3.3", + "hock": "1.4.1", "lodash.isequal": "4.5.0", "lodash.isequalwith": "4.4.0", "mkdirp": "0.5.1", @@ -100,11 +102,11 @@ "mocha-junit-reporter": "1.23.1", "mocha-multi-reporters": "1.1.7", "mocha-stress": "1.0.0", - "node-fetch": "2.6.0", + "node-fetch": "2.6.1", "nyc": "14.1.1", "relay-compiler": "5.0.0", "semver": "6.3.0", - "sinon": "7.5.0", + "sinon": "9.0.3", "test-until": "1.1.1" }, "consumedServices": { diff --git a/script/azure-pipelines/linux-install.yml b/script/azure-pipelines/linux-install.yml deleted file mode 100644 index cb3a93d7d0..0000000000 --- a/script/azure-pipelines/linux-install.yml +++ /dev/null @@ -1,20 +0,0 @@ -parameters: - atom_channel: dev - atom_name: atom-dev - -steps: -- bash: | - curl -s -L "https://atom.io/download/deb?channel=${ATOM_CHANNEL}" \ - -H 'Accept: application/octet-stream' \ - -o 'atom-amd64.deb' - /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1280x1024x16 - sudo apt-get update && sudo apt-get install -yyq libgconf-2-4 build-essential git libsecret-1-dev - dpkg-deb -x atom-amd64.deb /tmp/atom - displayName: install Atom - env: - ATOM_CHANNEL: ${{ parameters.atom_channel }} -- bash: | - "/tmp/atom/usr/share/${ATOM_NAME}/resources/app/apm/bin/apm" ci - displayName: install dependencies - env: - ATOM_NAME: ${{ parameters.atom_name }} diff --git a/script/azure-pipelines/macos-install.yml b/script/azure-pipelines/macos-install.yml deleted file mode 100644 index afbbf2e4f2..0000000000 --- a/script/azure-pipelines/macos-install.yml +++ /dev/null @@ -1,19 +0,0 @@ -parameters: - atom_channel: dev - atom_app: Atom Dev.app - -steps: -- bash: | - curl -s -L "https://atom.io/download/mac?channel=${ATOM_CHANNEL}" \ - -H 'Accept: application/octet-stream' \ - -o "atom.zip" - mkdir -p /tmp/atom - unzip -q atom.zip -d /tmp/atom - displayName: install Atom - env: - ATOM_CHANNEL: ${{ parameters.atom_channel }} -- bash: | - "/tmp/atom/${ATOM_APP}/Contents/Resources/app/apm/bin/apm" ci - displayName: install dependencies - env: - ATOM_APP: ${{ parameters.atom_app }} diff --git a/script/azure-pipelines/windows-install.yml b/script/azure-pipelines/windows-install.yml deleted file mode 100644 index bf8a68392a..0000000000 --- a/script/azure-pipelines/windows-install.yml +++ /dev/null @@ -1,32 +0,0 @@ -parameters: - atom_channel: dev - atom_directory: Atom Dev - -steps: -- powershell: | - Set-StrictMode -Version Latest - $script:ATOMROOT = "$env:AGENT_HOMEDIRECTORY/atom" - - Write-Host "Downloading latest Atom release" - $source = "https://atom.io/download/windows_zip?channel=$env:ATOM_CHANNEL" - $destination = "atom.zip" - - (New-Object System.Net.WebClient).DownloadFile($source, $destination) - Expand-Archive -Path "atom.zip" -DestinationPath $script:ATOMROOT - displayName: install Atom - env: - ATOM_CHANNEL: ${{ parameters.atom_channel }} -- powershell: | - Set-StrictMode -Version Latest - $script:ATOMROOT = "$env:AGENT_HOMEDIRECTORY/atom" - $script:APM_SCRIPT_PATH = "$script:ATOMROOT\${env:ATOM_DIRECTORY}\resources\app\apm\bin\apm.cmd" - - & "$script:APM_SCRIPT_PATH" ci - if ($LASTEXITCODE -ne 0) { - Write-Host "Dependency installation failed" - $host.SetShouldExit($LASTEXITCODE) - exit - } - displayName: install dependencies - env: - ATOM_DIRECTORY: ${{ parameters.atom_directory }} diff --git a/script/redownload-electron-bins.js b/script/redownload-electron-bins.js new file mode 100644 index 0000000000..68418883ae --- /dev/null +++ b/script/redownload-electron-bins.js @@ -0,0 +1,48 @@ +// Based on: https://github.com/atom/atom/blob/v1.51.0/script/redownload-electron-bins.js + +let downloadMksnapshotPath + +try { + downloadMksnapshotPath = require.resolve('electron-mksnapshot/download-mksnapshot.js'); +} catch { } + +if (typeof(downloadMksnapshotPath) !== 'undefined') { + + const { spawn } = require('child_process'); + const path = require('path'); + const fs = require('fs'); + + const atomRepoPath = path.join(__dirname, '..', '..', '..', '..', 'atom', 'package.json'); + const electronVersion = fs.existsSync(atomRepoPath) ? require(atomRepoPath).electronVersion : '6.1.12' + // TODO: Keep the above "electronVersion" in sync with "electronVersion" from Atom's package.json + + if (process.env.ELECTRON_CUSTOM_VERSION !== electronVersion) { + const electronEnv = process.env.ELECTRON_CUSTOM_VERSION; + console.info( + `env var ELECTRON_CUSTOM_VERSION is not set,\n` + + `or doesn't match electronVersion in atom/package.json.\n` + + `(is: "${electronEnv}", wanted: "${electronVersion}").\n` + + `Setting, and re-downloading mksnapshot.\n` + ); + + process.env.ELECTRON_CUSTOM_VERSION = electronVersion; + const downloadMksnapshot = spawn('node', [downloadMksnapshotPath]); + var exitStatus; + + downloadMksnapshot.on('close', code => { + if (code === 0) { + exitStatus = 'success'; + } else { + exitStatus = 'error'; + } + + console.info(`info: Done re-downloading mksnapshot. Status: ${exitStatus}`); + }); + } else { + console.info( + 'info: env var "ELECTRON_CUSTOM_VERSION" is already set correctly.\n(No need to re-download mksnapshot). Skipping.\n' + ); + } +} else { + console.log('devDependency "electron-mksnapshot/download-mksnapshot.js" not found.\nSkipping "redownload electron bins" script.\n') +} diff --git a/styles/commit-detail.less b/styles/commit-detail.less index dc1b9b84f3..f773987953 100644 --- a/styles/commit-detail.less +++ b/styles/commit-detail.less @@ -10,8 +10,8 @@ &-header { flex: 0; - border-bottom: 1px solid @base-border-color; - background-color: @syntax-background-color; + border-bottom: 1px solid @pane-item-border-color; + background-color: @pane-item-background-color; } &-commit { @@ -53,7 +53,7 @@ padding: 0em .4em; color: @text-color-subtle; font-style: italic; - border: 1px solid @base-border-color; + border: 1px solid @button-border-color; border-radius: @component-border-radius; background-color: @button-background-color; @@ -69,7 +69,7 @@ word-wrap: initial; word-break: break-word; white-space: pre-wrap; - border-top: 1px solid @base-border-color; + border-top: 1px solid @pane-item-border-color; background-color: transparent; // in the case of loonnng commit message bodies, we want to cap the height so that // the content beneath will remain visible / scrollable. diff --git a/styles/dialog.less b/styles/dialog.less index 4d762e8794..b5701c15e2 100644 --- a/styles/dialog.less +++ b/styles/dialog.less @@ -147,6 +147,7 @@ flex-direction: row; justify-content: flex-start; align-items: center; + width: 100%; &-owner { flex: 1; @@ -253,6 +254,7 @@ label { display: flex; align-items: center; + width: 100%; .github-AtomTextEditor-container { flex: 1; diff --git a/styles/git-identity.less b/styles/git-identity.less new file mode 100644 index 0000000000..2371343ec3 --- /dev/null +++ b/styles/git-identity.less @@ -0,0 +1,33 @@ +// Styles for the Git Identity view. + +.github-GitIdentity { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: @component-padding; + + &-title { + margin-bottom: @component-padding; + } + + &-explanation { + margin-bottom: @component-padding * 3; + } + + &-text { + width: 90%; + margin-bottom: @component-padding * 2; + + .github-AtomTextEditor-container { + margin: @component-padding 0; + height: inherit; + } + } + + &-buttons { + .btn { + margin: @component-padding/2; + } + } +} diff --git a/styles/project.less b/styles/project.less index 6dde98f812..22701ed318 100644 --- a/styles/project.less +++ b/styles/project.less @@ -8,6 +8,59 @@ &-path { flex: 1; + margin-left: @component-padding; } + &-avatarBtn { + height: 23px; + width: 23px; + padding: 0; + border-radius: @component-border-radius; + background-color: @pane-item-background-color; + border: none; + } + + &-avatar { + width: 23px; + height: 23px; + border-radius: @component-border-radius; + color: transparent; + overflow: hidden; + } + + &-lock.btn { + width: 40px; + height: 20px; + padding: 0; + display: flex; + flex-direction: row; + justify-content: center; + align-items: baseline; + + border: none; + background-color: transparent; + background-image: none; + + &:active, &:hover { + background-color: transparent; + background-image: none; + } + } + + .icon { + padding: 0; + margin: 0; + line-height: 1em; + fill: @text-color; + + &:hover { + fill: @text-color-highlight; + } + + &.icon-unlock { + width: 21px; + height: 17px; + padding-left: 1px; + } + } } diff --git a/test/atom/octicon.test.js b/test/atom/octicon.test.js new file mode 100644 index 0000000000..f7f373cc8a --- /dev/null +++ b/test/atom/octicon.test.js @@ -0,0 +1,17 @@ +import React from 'react'; +import {shallow} from 'enzyme'; + +import Octicon from '../../lib/atom/octicon'; + +describe('Octicon', function() { + it('defaults to rendering an octicon span', function() { + const wrapper = shallow(); + assert.isTrue(wrapper.exists('span.icon.icon-octoface')); + }); + + it('renders SVG overrides', function() { + const wrapper = shallow(); + + assert.strictEqual(wrapper.find('svg').prop('viewBox'), '0 0 24 16'); + }); +}); diff --git a/test/atom/pane-item.test.js b/test/atom/pane-item.test.js index cbdddd1364..5e4479eef4 100644 --- a/test/atom/pane-item.test.js +++ b/test/atom/pane-item.test.js @@ -309,5 +309,19 @@ describe('PaneItem', function() { assert.isTrue(stub.getElement().classList.contains('added')); }); + + it('adopts StubItems that are deserialized after the package has been initialized', function() { + const wrapper = mount( + + {({params, itemHolder}) => } + , + ); + + const stub = StubItem.create('some-component', {title: 'Component'}, 'atom-github://pattern/root/45'); + workspace.getActivePane().addItem(stub); + wrapper.update(); + + assert.isTrue(wrapper.exists('Component[text="45"]')); + }); }); }); diff --git a/test/builder/commit.js b/test/builder/commit.js index 43898bf6fc..cc66784660 100644 --- a/test/builder/commit.js +++ b/test/builder/commit.js @@ -1,13 +1,13 @@ import moment from 'moment'; import Commit from '../../lib/models/commit'; +import Author from '../../lib/models/author'; import {multiFilePatchBuilder} from './patch'; class CommitBuilder { constructor() { this._sha = '0123456789abcdefghij0123456789abcdefghij'; - this._authorEmail = 'default@email.com'; - this._authorName = 'Tilde Ann Thurium'; + this._author = new Author('default@email.com', 'Tilde Ann Thurium'); this._authorDate = moment('2018-11-28T12:00:00', moment.ISO_8601).unix(); this._coAuthors = []; this._messageSubject = 'subject'; @@ -21,13 +21,8 @@ class CommitBuilder { return this; } - authorEmail(newEmail) { - this._authorEmail = newEmail; - return this; - } - - authorName(newName) { - this._authorName = newName; + addAuthor(newEmail, newName) { + this._author = new Author(newEmail, newName); return this; } @@ -53,16 +48,15 @@ class CommitBuilder { return this; } - addCoAuthor(name, email) { - this._coAuthors.push({name, email}); + addCoAuthor(email, name) { + this._coAuthors.push(new Author(email, name)); return this; } build() { const commit = new Commit({ sha: this._sha, - authorEmail: this._authorEmail, - authorName: this._authorName, + author: this._author, authorDate: this._authorDate, coAuthors: this._coAuthors, messageSubject: this._messageSubject, diff --git a/test/builder/graphql/user.js b/test/builder/graphql/user.js index 347c336e9c..44c5c7615c 100644 --- a/test/builder/graphql/user.js +++ b/test/builder/graphql/user.js @@ -18,6 +18,8 @@ export const UserBuilder = createSpecBuilderClass('User', { const login = f.login || 'login'; return `https://github.com/${login}`; }}, + name: {default: 'Someone Somewhere'}, + email: {default: 'someone@somewhereovertherain.bow'}, company: {default: 'GitHub'}, repositories: {linked: RepositoryConnectionBuilder}, organizations: {linked: OrganizationConnectionBuilder}, diff --git a/test/containers/github-tab-container.test.js b/test/containers/github-tab-container.test.js index 4ccd4c11b2..1b7ac14d30 100644 --- a/test/containers/github-tab-container.test.js +++ b/test/containers/github-tab-container.test.js @@ -1,5 +1,5 @@ import React from 'react'; -import {mount, shallow} from 'enzyme'; +import {shallow} from 'enzyme'; import {buildRepository, cloneRepository} from '../helpers'; import GitHubTabContainer from '../../lib/containers/github-tab-container'; @@ -7,6 +7,10 @@ import GitHubTabController from '../../lib/controllers/github-tab-controller'; import Repository from '../../lib/models/repository'; import {InMemoryStrategy} from '../../lib/shared/keytar-strategy'; import GithubLoginModel from '../../lib/models/github-login-model'; +import Remote from '../../lib/models/remote'; +import RemoteSet from '../../lib/models/remote-set'; +import Branch, {nullBranch} from '../../lib/models/branch'; +import BranchSet from '../../lib/models/branch-set'; import RefHolder from '../../lib/models/ref-holder'; describe('GitHubTabContainer', function() { @@ -37,6 +41,7 @@ describe('GitHubTabContainer', function() { repository={repository} loginModel={new GithubLoginModel(InMemoryStrategy)} rootHolder={new RefHolder()} + contextLocked={false} changeWorkingDirectory={() => {}} onDidChangeWorkDirs={() => {}} @@ -45,6 +50,7 @@ describe('GitHubTabContainer', function() { openPublishDialog={() => {}} openCloneDialog={() => {}} openGitTab={() => {}} + setContextLock={() => {}} {...props} /> @@ -72,10 +78,11 @@ describe('GitHubTabContainer', function() { beforeEach(function() { wrapper = shallow(buildApp()); - const childWrapper = wrapper.find('ObserveModel').renderProp('children')(defaultRepositoryData); + const repoWrapper = wrapper.find('ObserveModel').renderProp('children')(defaultRepositoryData); + const tokenWrapper = repoWrapper.find('ObserveModel').renderProp('children')('1234'); retry = sinon.spy(); - const refresher = childWrapper.find(GitHubTabController).prop('refresher'); + const refresher = tokenWrapper.find(GitHubTabController).prop('refresher'); refresher.setRetryCallback(Symbol('key'), retry); stubRepository(repository); @@ -106,6 +113,13 @@ describe('GitHubTabContainer', function() { assert.isTrue(retry.called); }); + it('preserves the observer when the repository is unchanged', function() { + wrapper.setProps({}); + + simulateOperation(repository, 'fetch'); + assert.isTrue(retry.called); + }); + it('un-observes the repository when unmounting', function() { wrapper.unmount(); @@ -114,25 +128,153 @@ describe('GitHubTabContainer', function() { }); }); + describe('before loading', function() { + it('passes isLoading to the controller', async function() { + const loadingRepo = new Repository(await cloneRepository()); + const wrapper = shallow(buildApp({repository: loadingRepo})); + const repoWrapper = wrapper.find('ObserveModel').renderProp('children')(null); + const tokenWrapper = repoWrapper.find('ObserveModel').renderProp('children')('1234'); + + assert.isTrue(tokenWrapper.find('GitHubTabController').prop('isLoading')); + }); + }); + describe('while loading', function() { - it('passes isLoading to its view', async function() { + it('passes isLoading to the controller', async function() { const loadingRepo = new Repository(await cloneRepository()); assert.isTrue(loadingRepo.isLoading()); - const wrapper = mount(buildApp({repository: loadingRepo})); + const wrapper = shallow(buildApp({repository: loadingRepo})); + const repoData = await wrapper.find('ObserveModel').prop('fetchData')(loadingRepo); + const repoWrapper = wrapper.find('ObserveModel').renderProp('children')(repoData); + const tokenWrapper = repoWrapper.find('ObserveModel').renderProp('children')('1234'); - assert.isTrue(wrapper.find('GitHubTabController').prop('isLoading')); + assert.isTrue(tokenWrapper.find('GitHubTabController').prop('isLoading')); + }); + }); + + describe('when absent', function() { + it('passes placeholder data to the controller', async function() { + const absent = Repository.absent(); + const wrapper = shallow(buildApp({repository: absent})); + const repoData = await wrapper.find('ObserveModel').prop('fetchData')(absent); + const repoWrapper = wrapper.find('ObserveModel').renderProp('children')(repoData); + const tokenWrapper = repoWrapper.find('ObserveModel').renderProp('children')('1234'); + const controller = tokenWrapper.find('GitHubTabController'); + + assert.strictEqual(controller.prop('allRemotes').size(), 0); + assert.strictEqual(controller.prop('githubRemotes').size(), 0); + assert.isFalse(controller.prop('currentRemote').isPresent()); + assert.strictEqual(controller.prop('branches').getNames().length, 0); + assert.isFalse(controller.prop('currentBranch').isPresent()); + assert.strictEqual(controller.prop('aheadCount'), 0); + assert.isFalse(controller.prop('manyRemotesAvailable')); + assert.isFalse(controller.prop('pushInProgress')); + assert.isFalse(controller.prop('isLoading')); }); }); describe('once loaded', function() { + let nonGitHub, github0, github1; + let loadedRepo, singleGitHubRemoteSet, multiGitHubRemoteSet; + let otherBranch, mainBranch; + let branches; + + beforeEach(async function() { + loadedRepo = new Repository(await cloneRepository()); + await loadedRepo.getLoadPromise(); + + nonGitHub = new Remote('no', 'git@elsewhere.com:abc/def.git'); + github0 = new Remote('yes0', 'git@github.com:user/repo0.git'); + github1 = new Remote('yes1', 'git@github.com:user/repo1.git'); + + singleGitHubRemoteSet = new RemoteSet([nonGitHub, github0]); + multiGitHubRemoteSet = new RemoteSet([nonGitHub, github0, github1]); + + otherBranch = new Branch('other'); + mainBranch = new Branch('main', nullBranch, nullBranch, true); + branches = new BranchSet([otherBranch, mainBranch]); + }); + + async function installRemoteSet(remoteSet) { + for (const remote of remoteSet) { + // In your face, no-await-in-loop rule + await loadedRepo.addRemote(remote.getName(), remote.getUrl()); + } + } + + it('derives the subset of GitHub remotes', async function() { + await installRemoteSet(multiGitHubRemoteSet); + + const wrapper = shallow(buildApp({repository: loadedRepo})); + const repoData = await wrapper.find('ObserveModel').prop('fetchData')(loadedRepo); + const repoWrapper = wrapper.find('ObserveModel').renderProp('children')(repoData); + const tokenWrapper = repoWrapper.find('ObserveModel').renderProp('children')('1234'); + const githubRemotes = tokenWrapper.find('GitHubTabController').prop('githubRemotes'); + + assert.sameMembers(Array.from(githubRemotes, remote => remote.getName()), ['yes0', 'yes1']); + }); + + it('derives the current branch', async function() { + const wrapper = shallow(buildApp({repository: loadedRepo})); + const repoData = await wrapper.find('ObserveModel').prop('fetchData')(loadedRepo); + repoData.branches = branches; + const repoWrapper = wrapper.find('ObserveModel').renderProp('children')(repoData); + const tokenWrapper = repoWrapper.find('ObserveModel').renderProp('children')('1234'); + const currentBranch = tokenWrapper.find('GitHubTabController').prop('currentBranch'); + + assert.strictEqual(mainBranch, currentBranch); + }); + + it('identifies the current remote from the config key', async function() { + await loadedRepo.setConfig('atomGithub.currentRemote', 'yes1'); + await installRemoteSet(multiGitHubRemoteSet); + + const wrapper = shallow(buildApp({repository: loadedRepo})); + const repoData = await wrapper.find('ObserveModel').prop('fetchData')(loadedRepo); + const repoWrapper = wrapper.find('ObserveModel').renderProp('children')(repoData); + const tokenWrapper = repoWrapper.find('ObserveModel').renderProp('children')('1234'); + const currentRemote = tokenWrapper.find('GitHubTabController').prop('currentRemote'); + + assert.strictEqual(currentRemote.getUrl(), github1.getUrl()); + }); + + it('identifies the current remote as the only GitHub remote', async function() { + await installRemoteSet(singleGitHubRemoteSet); + + const wrapper = shallow(buildApp({repository: loadedRepo})); + const repoData = await wrapper.find('ObserveModel').prop('fetchData')(loadedRepo); + const repoWrapper = wrapper.find('ObserveModel').renderProp('children')(repoData); + const tokenWrapper = repoWrapper.find('ObserveModel').renderProp('children')('1234'); + const currentRemote = tokenWrapper.find('GitHubTabController').prop('currentRemote'); + + assert.strictEqual(currentRemote.getUrl(), github0.getUrl()); + }); + + it('identifies when there are multiple GitHub remotes available', async function() { + await installRemoteSet(multiGitHubRemoteSet); + + const wrapper = shallow(buildApp({repository: loadedRepo})); + const repoData = await wrapper.find('ObserveModel').prop('fetchData')(loadedRepo); + const repoWrapper = wrapper.find('ObserveModel').renderProp('children')(repoData); + const tokenWrapper = repoWrapper.find('ObserveModel').renderProp('children')('1234'); + const controller = tokenWrapper.find('GitHubTabController'); + + assert.isFalse(controller.prop('currentRemote').isPresent()); + assert.isTrue(controller.prop('manyRemotesAvailable')); + }); + it('renders the controller', async function() { - const workdir = await cloneRepository(); - const presentRepo = new Repository(workdir); - await presentRepo.getLoadPromise(); - const wrapper = mount(buildApp({repository: presentRepo})); + await installRemoteSet(singleGitHubRemoteSet); + + const wrapper = shallow(buildApp({repository: loadedRepo})); + const repoData = await wrapper.find('ObserveModel').prop('fetchData')(loadedRepo); + const repoWrapper = wrapper.find('ObserveModel').renderProp('children')(repoData); + const tokenWrapper = repoWrapper.find('ObserveModel').renderProp('children')('1234'); + const controller = tokenWrapper.find('GitHubTabController'); - await assert.async.isFalse(wrapper.update().find('GitHubTabController').prop('isLoading')); - assert.strictEqual(wrapper.find('GitHubTabController').prop('workingDirectory'), workdir); + assert.isFalse(controller.prop('isLoading')); + assert.isFalse(controller.prop('manyRemotesAvailable')); + assert.strictEqual(controller.prop('token'), '1234'); }); }); }); diff --git a/test/containers/github-tab-header-container.test.js b/test/containers/github-tab-header-container.test.js new file mode 100644 index 0000000000..296aecd885 --- /dev/null +++ b/test/containers/github-tab-header-container.test.js @@ -0,0 +1,90 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import {QueryRenderer} from 'react-relay'; + +import GithubTabHeaderContainer from '../../lib/containers/github-tab-header-container'; +import {queryBuilder} from '../builder/graphql/query'; +import {DOTCOM} from '../../lib/models/endpoint'; +import {UNAUTHENTICATED, INSUFFICIENT} from '../../lib/shared/keytar-strategy'; + +import tabHeaderQuery from '../../lib/containers/__generated__/githubTabHeaderContainerQuery.graphql'; + +describe('GithubTabHeaderContainer', function() { + let atomEnv; + + beforeEach(function() { + atomEnv = global.buildAtomEnvironment(); + }); + + afterEach(function() { + atomEnv.destroy(); + }); + + function buildApp(overrideProps = {}) { + return ( + {}} + setContextLock={() => {}} + getCurrentWorkDirs={() => new Set()} + + onDidChangeWorkDirs={() => {}} + {...overrideProps} + /> + ); + } + + it('renders a null user if the token is still loading', function() { + const wrapper = shallow(buildApp({token: null})); + assert.isFalse(wrapper.find('GithubTabHeaderController').prop('user').isPresent()); + }); + + it('renders a null user if no token is found', function() { + const wrapper = shallow(buildApp({token: UNAUTHENTICATED})); + assert.isFalse(wrapper.find('GithubTabHeaderController').prop('user').isPresent()); + }); + + it('renders a null user if the token has insufficient OAuth scopes', function() { + const wrapper = shallow(buildApp({token: INSUFFICIENT})); + assert.isFalse(wrapper.find('GithubTabHeaderController').prop('user').isPresent()); + }); + + it('renders a null user if there was an error acquiring the token', function() { + const e = new Error('oops'); + e.rawStack = e.stack; + const wrapper = shallow(buildApp({token: e})); + assert.isFalse(wrapper.find('GithubTabHeaderController').prop('user').isPresent()); + }); + + it('renders a null user while the GraphQL query is being performed', function() { + const wrapper = shallow(buildApp()); + const resultWrapper = wrapper.find(QueryRenderer).renderProp('render')({ + error: null, + props: null, + retry: () => {}, + }); + + assert.isFalse(resultWrapper.find('GithubTabHeaderController').prop('user').isPresent()); + }); + + it('renders the controller once results have arrived', function() { + const wrapper = shallow(buildApp()); + const props = queryBuilder(tabHeaderQuery) + .viewer(v => { + v.name('user'); + v.email('us3r@email.com'); + v.avatarUrl('https://imageurl.com/test.jpg'); + v.login('us3rh4nd13'); + }) + .build(); + const resultWrapper = wrapper.find(QueryRenderer).renderProp('render')({error: null, props, retry: () => {}}); + + const controller = resultWrapper.find('GithubTabHeaderController'); + assert.isTrue(controller.prop('user').isPresent()); + assert.strictEqual(controller.prop('user').getEmail(), 'us3r@email.com'); + }); +}); diff --git a/test/containers/issueish-search-container.test.js b/test/containers/issueish-search-container.test.js index c08d771643..f5b69b443f 100644 --- a/test/containers/issueish-search-container.test.js +++ b/test/containers/issueish-search-container.test.js @@ -158,6 +158,7 @@ describe('IssueishSearchContainer', function() { resolve(); await promise; + await wrapper.instance().forceUpdate(); const controller = wrapper.update().find('BareIssueishListController'); assert.isFalse(controller.prop('isLoading')); diff --git a/test/containers/remote-container.test.js b/test/containers/remote-container.test.js index b6a1cb09eb..deefe382d6 100644 --- a/test/containers/remote-container.test.js +++ b/test/containers/remote-container.test.js @@ -3,25 +3,21 @@ import {shallow} from 'enzyme'; import {QueryRenderer} from 'react-relay'; import RemoteContainer from '../../lib/containers/remote-container'; -import * as reporterProxy from '../../lib/reporter-proxy'; import {queryBuilder} from '../builder/graphql/query'; import Remote from '../../lib/models/remote'; import RemoteSet from '../../lib/models/remote-set'; import Branch, {nullBranch} from '../../lib/models/branch'; import BranchSet from '../../lib/models/branch-set'; -import GithubLoginModel from '../../lib/models/github-login-model'; -import {getEndpoint} from '../../lib/models/endpoint'; +import {DOTCOM} from '../../lib/models/endpoint'; import Refresher from '../../lib/models/refresher'; -import {InMemoryStrategy, INSUFFICIENT, UNAUTHENTICATED} from '../../lib/shared/keytar-strategy'; import remoteQuery from '../../lib/containers/__generated__/remoteContainerQuery.graphql'; describe('RemoteContainer', function() { - let atomEnv, model; + let atomEnv; beforeEach(function() { atomEnv = global.buildAtomEnvironment(); - model = new GithubLoginModel(InMemoryStrategy); }); afterEach(function() { @@ -36,20 +32,20 @@ describe('RemoteContainer', function() { return ( {}} + handleLogout={() => {}} onPushBranch={() => {}} {...overrideProps} @@ -57,24 +53,9 @@ describe('RemoteContainer', function() { ); } - it('renders a loading spinner while the token is being fetched', function() { + it('renders a loading spinner while the GraphQL query is being performed', function() { const wrapper = shallow(buildApp()); - const tokenWrapper = wrapper.find('ObserveModel').renderProp('children')(null); - assert.isTrue(tokenWrapper.exists('LoadingView')); - }); - - it('renders a loading spinner while the GraphQL query is being performed', async function() { - model.setToken('https://api.github.com', '1234'); - - sinon.spy(model, 'getToken'); - sinon.stub(model, 'getScopes').resolves(GithubLoginModel.REQUIRED_SCOPES); - - const wrapper = shallow(buildApp()); - - assert.strictEqual(await wrapper.find('ObserveModel').prop('fetchData')(model), '1234'); - const tokenWrapper = wrapper.find('ObserveModel').renderProp('children')('1234'); - - const resultWrapper = tokenWrapper.find(QueryRenderer).renderProp('render')({ + const resultWrapper = wrapper.find(QueryRenderer).renderProp('render')({ error: null, props: null, retry: () => {}, @@ -83,68 +64,18 @@ describe('RemoteContainer', function() { assert.isTrue(resultWrapper.exists('LoadingView')); }); - it('renders a login prompt if no token is found', function() { - const wrapper = shallow(buildApp()); - const tokenWrapper = wrapper.find('ObserveModel').renderProp('children')(UNAUTHENTICATED); - assert.isTrue(tokenWrapper.exists('GithubLoginView')); - }); - - it('renders a login prompt if the token has insufficient OAuth scopes', function() { - const wrapper = shallow(buildApp()); - const tokenWrapper = wrapper.find('ObserveModel').renderProp('children')(INSUFFICIENT); - - assert.match(tokenWrapper.find('GithubLoginView').find('p').text(), /sufficient/); - }); - - it('renders an offline view if the user is offline', function() { - sinon.spy(model, 'didUpdate'); - - const wrapper = shallow(buildApp()); - const e = new Error('oh no'); - const tokenWrapper = wrapper.find('ObserveModel').renderProp('children')(e); - assert.isTrue(tokenWrapper.exists('QueryErrorView')); - - tokenWrapper.find('QueryErrorView').prop('retry')(); - assert.isTrue(model.didUpdate.called); - }); - it('renders an error message if the GraphQL query fails', function() { const wrapper = shallow(buildApp()); - const tokenWrapper = wrapper.find('ObserveModel').renderProp('children')('1234'); const error = new Error('oh shit!'); error.rawStack = error.stack; - const resultWrapper = tokenWrapper.find(QueryRenderer).renderProp('render')({error, props: null, retry: () => {}}); + const resultWrapper = wrapper.find(QueryRenderer).renderProp('render')({error, props: null, retry: () => {}}); assert.strictEqual(resultWrapper.find('QueryErrorView').prop('error'), error); }); - it('increments a counter on login', function() { - const incrementCounterStub = sinon.stub(reporterProxy, 'incrementCounter'); - - const wrapper = shallow(buildApp()); - const tokenWrapper = wrapper.find('ObserveModel').renderProp('children')(UNAUTHENTICATED); - - tokenWrapper.find('GithubLoginView').prop('onLogin')(); - assert.isTrue(incrementCounterStub.calledOnceWith('github-login')); - }); - - it('increments a counter on logout', function() { - const wrapper = shallow(buildApp()); - const tokenWrapper = wrapper.find('ObserveModel').renderProp('children')('1234'); - - const error = new Error('just show the logout button'); - error.rawStack = error.stack; - const resultWrapper = tokenWrapper.find(QueryRenderer).renderProp('render')({error, props: null, retry: () => {}}); - - const incrementCounterStub = sinon.stub(reporterProxy, 'incrementCounter'); - resultWrapper.find('QueryErrorView').prop('logout')(); - assert.isTrue(incrementCounterStub.calledOnceWith('github-logout')); - }); - it('renders the controller once results have arrived', function() { const wrapper = shallow(buildApp()); - const tokenWrapper = wrapper.find('ObserveModel').renderProp('children')('1234'); const props = queryBuilder(remoteQuery) .repository(r => { @@ -155,10 +86,9 @@ describe('RemoteContainer', function() { }); }) .build(); - const resultWrapper = tokenWrapper.find(QueryRenderer).renderProp('render')({error: null, props, retry: () => {}}); + const resultWrapper = wrapper.find(QueryRenderer).renderProp('render')({error: null, props, retry: () => {}}); const controller = resultWrapper.find('RemoteController'); - assert.strictEqual(controller.prop('token'), '1234'); assert.deepEqual(controller.prop('repository'), { id: 'the-repo', defaultBranchRef: { diff --git a/test/controllers/editor-conflict-controller.test.js b/test/controllers/editor-conflict-controller.test.js index 4de8ac326e..0d0e91a9eb 100644 --- a/test/controllers/editor-conflict-controller.test.js +++ b/test/controllers/editor-conflict-controller.test.js @@ -3,6 +3,7 @@ import temp from 'temp'; import path from 'path'; import React from 'react'; import {mount} from 'enzyme'; +import {Point} from 'atom'; import ResolutionProgress from '../../lib/models/conflicts/resolution-progress'; import {OURS, BASE, THEIRS} from '../../lib/models/conflicts/source'; @@ -48,7 +49,7 @@ describe('EditorConflictController', function() { atomEnv.destroy(); }); - const useFixture = async function(fixtureName, {isRebase} = {isRebase: false}) { + const useFixture = async function(fixtureName, {isRebase, withEditor} = {isRebase: false}) { const fixturePath = path.join( path.dirname(__filename), '..', 'fixtures', 'conflict-marker-examples', fixtureName); const tempDir = temp.mkdirSync('conflict-fixture-'); @@ -56,6 +57,9 @@ describe('EditorConflictController', function() { fs.copySync(fixturePath, fixtureFile); editor = await workspace.open(fixtureFile); + if (withEditor) { + withEditor(editor); + } editorView = atomEnv.views.getView(editor); app = ( @@ -75,6 +79,14 @@ describe('EditorConflictController', function() { return editor.getTextInBufferRange(side.marker.getBufferRange()); }; + it('scrolls the first conflict into view', async function() { + await useFixture('triple-2way-diff.txt', { + withEditor(e) { sinon.stub(e, 'scrollToBufferPosition'); }, + }); + + assert.isTrue(editor.scrollToBufferPosition.calledWith(new Point(4, 0), {center: true})); + }); + describe('on a file with 2-way diff markers', function() { let conflicts; diff --git a/test/controllers/git-tab-controller.test.js b/test/controllers/git-tab-controller.test.js index 7726a0a5c2..45bad35417 100644 --- a/test/controllers/git-tab-controller.test.js +++ b/test/controllers/git-tab-controller.test.js @@ -3,6 +3,7 @@ import path from 'path'; import React from 'react'; import {mount} from 'enzyme'; import dedent from 'dedent-js'; +import temp from 'temp'; import GitTabController from '../../lib/controllers/git-tab-controller'; import {gitTabControllerProps} from '../fixtures/props/git-tab-props'; @@ -95,6 +96,187 @@ describe('GitTabController', function() { assert.isFalse(refreshResolutionProgress.calledWith(path.join(workdirPath, 'added-to-both.txt'))); }); + describe('identity editor', function() { + it('is not shown while loading data', async function() { + const repository = await buildRepository(await cloneRepository('three-files')); + const wrapper = mount(await buildApp(repository, { + fetchInProgress: true, + username: '', + email: '', + })); + + assert.isFalse(wrapper.find('GitTabView').prop('editingIdentity')); + }); + + it('is not shown when the repository is out of sync', async function() { + const repository = await buildRepository(await cloneRepository('three-files')); + const wrapper = mount(await buildApp(repository, { + fetchInProgress: false, + username: '', + email: '', + repositoryDrift: true, + })); + + assert.isFalse(wrapper.find('GitTabView').prop('editingIdentity')); + }); + + it('is not shown for an absent repository', async function() { + const wrapper = mount(await buildApp(Repository.absent(), { + fetchInProgress: false, + username: '', + email: '', + })); + + assert.isFalse(wrapper.find('GitTabView').prop('editingIdentity')); + }); + + it('is not shown for an empty repository', async function() { + const nongit = temp.mkdirSync(); + const repository = await buildRepository(nongit); + const wrapper = mount(await buildApp(repository, { + fetchInProgress: false, + username: '', + email: '', + })); + + assert.isFalse(wrapper.find('GitTabView').prop('editingIdentity')); + }); + + it('is shown by default when username or email are empty', async function() { + const repository = await buildRepository(await cloneRepository('three-files')); + const wrapper = mount(await buildApp(repository, { + username: '', + email: 'not@empty.com', + })); + + assert.isTrue(wrapper.find('GitTabView').prop('editingIdentity')); + }); + + it('is toggled on and off with toggleIdentityEditor', async function() { + const repository = await buildRepository(await cloneRepository('three-files')); + const wrapper = mount(await buildApp(repository)); + + assert.isFalse(wrapper.find('GitTabView').prop('editingIdentity')); + + wrapper.find('GitTabView').prop('toggleIdentityEditor')(); + wrapper.update(); + + assert.isTrue(wrapper.find('GitTabView').prop('editingIdentity')); + + wrapper.find('GitTabView').prop('toggleIdentityEditor')(); + wrapper.update(); + + assert.isFalse(wrapper.find('GitTabView').prop('editingIdentity')); + }); + + it('is toggled off with closeIdentityEditor', async function() { + const repository = await buildRepository(await cloneRepository('three-files')); + const wrapper = mount(await buildApp(repository)); + + assert.isFalse(wrapper.find('GitTabView').prop('editingIdentity')); + + wrapper.find('GitTabView').prop('toggleIdentityEditor')(); + wrapper.update(); + + assert.isTrue(wrapper.find('GitTabView').prop('editingIdentity')); + + wrapper.find('GitTabView').prop('closeIdentityEditor')(); + wrapper.update(); + + assert.isFalse(wrapper.find('GitTabView').prop('editingIdentity')); + + wrapper.find('GitTabView').prop('closeIdentityEditor')(); + wrapper.update(); + + assert.isFalse(wrapper.find('GitTabView').prop('editingIdentity')); + }); + + it('synchronizes buffer contents with fetched properties', async function() { + const repository = await buildRepository(await cloneRepository('three-files')); + const wrapper = mount(await buildApp(repository, { + username: 'initial', + email: 'initial@email.com', + })); + + const usernameBuffer = wrapper.find('GitTabView').prop('usernameBuffer'); + const emailBuffer = wrapper.find('GitTabView').prop('emailBuffer'); + + assert.strictEqual(usernameBuffer.getText(), 'initial'); + assert.strictEqual(emailBuffer.getText(), 'initial@email.com'); + + usernameBuffer.setText('initial+'); + emailBuffer.setText('initial+@email.com'); + + wrapper.setProps({ + username: 'changed', + email: 'changed@email.com', + }); + + assert.strictEqual(wrapper.find('GitTabView').prop('usernameBuffer'), usernameBuffer); + assert.strictEqual(usernameBuffer.getText(), 'changed'); + assert.strictEqual(wrapper.find('GitTabView').prop('emailBuffer'), emailBuffer); + assert.strictEqual(emailBuffer.getText(), 'changed@email.com'); + + usernameBuffer.setText('changed+'); + emailBuffer.setText('changed+@email.com'); + + wrapper.setProps({ + username: 'changed', + email: 'changed@email.com', + }); + + assert.strictEqual(wrapper.find('GitTabView').prop('usernameBuffer'), usernameBuffer); + assert.strictEqual(usernameBuffer.getText(), 'changed+'); + assert.strictEqual(wrapper.find('GitTabView').prop('emailBuffer'), emailBuffer); + assert.strictEqual(emailBuffer.getText(), 'changed+@email.com'); + }); + + it('sets repository-local identity', async function() { + const repository = await buildRepository(await cloneRepository('three-files')); + const setConfig = sinon.stub(repository, 'setConfig'); + + const wrapper = mount(await buildApp(repository)); + + wrapper.find('GitTabView').prop('usernameBuffer').setText('changed'); + wrapper.find('GitTabView').prop('emailBuffer').setText('changed@email.com'); + + await wrapper.find('GitTabView').prop('setLocalIdentity')(); + + assert.isTrue(setConfig.calledWith('user.name', 'changed', {})); + assert.isTrue(setConfig.calledWith('user.email', 'changed@email.com', {})); + }); + + it('sets account-global identity', async function() { + const repository = await buildRepository(await cloneRepository('three-files')); + const setConfig = sinon.stub(repository, 'setConfig'); + + const wrapper = mount(await buildApp(repository)); + + wrapper.find('GitTabView').prop('usernameBuffer').setText('changed'); + wrapper.find('GitTabView').prop('emailBuffer').setText('changed@email.com'); + + await wrapper.find('GitTabView').prop('setGlobalIdentity')(); + + assert.isTrue(setConfig.calledWith('user.name', 'changed', {global: true})); + assert.isTrue(setConfig.calledWith('user.email', 'changed@email.com', {global: true})); + }); + + it('unsets config values when empty', async function() { + const repository = await buildRepository(await cloneRepository('three-files')); + const unsetConfig = sinon.stub(repository, 'unsetConfig'); + + const wrapper = mount(await buildApp(repository)); + + wrapper.find('GitTabView').prop('usernameBuffer').setText(''); + wrapper.find('GitTabView').prop('emailBuffer').setText(''); + + await wrapper.find('GitTabView').prop('setLocalIdentity')(); + + assert.isTrue(unsetConfig.calledWith('user.name')); + assert.isTrue(unsetConfig.calledWith('user.email')); + }); + }); + describe('abortMerge()', function() { it('resets merge related state', async function() { const workdirPath = await cloneRepository('merge-conflict'); @@ -547,7 +729,7 @@ describe('GitTabController', function() { await repository.commit.returnValues[0]; await updateWrapper(repository, wrapper); - assert.deepEqual(getLastCommit().coAuthors, [{email: author.getEmail(), name: author.getFullName()}]); + assert.deepEqual(getLastCommit().coAuthors, [author]); assert.strictEqual(getLastCommit().getMessageSubject(), commitBeforeAmend.getMessageSubject()); }); @@ -574,17 +756,17 @@ describe('GitTabController', function() { await updateWrapper(repository, wrapper); // verify that commit message has coauthor - assert.deepEqual(getLastCommit().coAuthors, [{email: author.getEmail(), name: author.getFullName()}]); + assert.deepEqual(getLastCommit().coAuthors, [author]); assert.strictEqual(getLastCommit().getMessageSubject(), newMessage); }); it('successfully removes a co-author', async function() { const message = 'We did this together!'; - const author = {email: 'mona@lisa.com', name: 'Mona Lisa'}; + const author = new Author('mona@lisa.com', 'Mona Lisa'); const commitMessageWithCoAuthors = dedent` ${message} - Co-authored-by: ${author.name} <${author.email}> + Co-authored-by: ${author.getFullName()} <${author.getEmail()}> `; await repository.git.exec(['commit', '--amend', '-m', commitMessageWithCoAuthors]); diff --git a/test/controllers/git-tab-header-controller.test.js b/test/controllers/git-tab-header-controller.test.js new file mode 100644 index 0000000000..cda8e99706 --- /dev/null +++ b/test/controllers/git-tab-header-controller.test.js @@ -0,0 +1,176 @@ +import React from 'react'; +import {shallow} from 'enzyme'; + +import GitTabHeaderController from '../../lib/controllers/git-tab-header-controller'; +import Author, {nullAuthor} from '../../lib/models/author'; +import {Disposable} from 'atom'; + +describe('GitTabHeaderController', function() { + function *createWorkdirs(workdirs) { + for (const workdir of workdirs) { + yield workdir; + } + } + + function buildApp(overrides) { + const props = { + getCommitter: () => nullAuthor, + currentWorkDir: null, + getCurrentWorkDirs: () => createWorkdirs([]), + changeWorkingDirectory: () => {}, + contextLocked: false, + setContextLock: () => {}, + onDidClickAvatar: () => {}, + onDidChangeWorkDirs: () => new Disposable(), + onDidUpdateRepo: () => new Disposable(), + ...overrides, + }; + return ; + } + + it('get currentWorkDirs initializes workdirs state', function() { + const paths = ['should be equal']; + const wrapper = shallow(buildApp({getCurrentWorkDirs: () => createWorkdirs(paths)})); + assert.strictEqual(wrapper.state(['currentWorkDirs']).next().value, paths[0]); + }); + + it('calls onDidChangeWorkDirs after mount', function() { + const onDidChangeWorkDirs = sinon.spy(() => ({dispose: () => null})); + shallow(buildApp({onDidChangeWorkDirs})); + assert.isTrue(onDidChangeWorkDirs.calledOnce); + }); + + it('calls onDidUpdateRepo after mount', function() { + const onDidUpdateRepo = sinon.spy(() => ({dispose: () => null})); + shallow(buildApp({onDidUpdateRepo})); + assert.isTrue(onDidUpdateRepo.calledOnce); + }); + + it('does not call onDidChangeWorkDirs on update', function() { + const onDidChangeWorkDirs = sinon.spy(() => ({dispose: () => null})); + const wrapper = shallow(buildApp({onDidChangeWorkDirs})); + wrapper.setProps({onDidChangeWorkDirs}); + assert.isTrue(onDidChangeWorkDirs.calledOnce); + }); + + it('calls onDidChangeWorkDirs on update to setup new listener', function() { + let onDidChangeWorkDirs = sinon.spy(() => ({dispose: () => null})); + const wrapper = shallow(buildApp({onDidChangeWorkDirs})); + onDidChangeWorkDirs = sinon.spy(() => ({dispose: () => null})); + wrapper.setProps({onDidChangeWorkDirs}); + assert.isTrue(onDidChangeWorkDirs.calledOnce); + }); + + it('calls onDidUpdateRepo on update to setup new listener', function() { + let onDidUpdateRepo = sinon.spy(() => ({dispose: () => null})); + const wrapper = shallow(buildApp({onDidUpdateRepo, isRepoDestroyed: () => false})); + onDidUpdateRepo = sinon.spy(() => ({dispose: () => null})); + wrapper.setProps({onDidUpdateRepo}); + assert.isTrue(onDidUpdateRepo.calledOnce); + }); + + it('calls onDidChangeWorkDirs on update and disposes old listener', function() { + const disposeSpy = sinon.spy(); + let onDidChangeWorkDirs = () => ({dispose: disposeSpy}); + const wrapper = shallow(buildApp({onDidChangeWorkDirs})); + onDidChangeWorkDirs = sinon.spy(() => ({dispose: () => null})); + wrapper.setProps({onDidChangeWorkDirs}); + assert.isTrue(onDidChangeWorkDirs.calledOnce); + assert.isTrue(disposeSpy.calledOnce); + }); + + it('calls onDidUpdateRepo on update and disposes old listener', function() { + const disposeSpy = sinon.spy(); + let onDidUpdateRepo = () => ({dispose: disposeSpy}); + const wrapper = shallow(buildApp({onDidUpdateRepo, isRepoDestroyed: () => false})); + onDidUpdateRepo = sinon.spy(() => ({dispose: () => null})); + wrapper.setProps({onDidUpdateRepo}); + assert.isTrue(onDidUpdateRepo.calledOnce); + assert.isTrue(disposeSpy.calledOnce); + }); + + it('updates workdirs', function() { + let getCurrentWorkDirs = () => createWorkdirs([]); + getCurrentWorkDirs = sinon.spy(getCurrentWorkDirs); + const wrapper = shallow(buildApp({getCurrentWorkDirs})); + wrapper.instance().resetWorkDirs(); + assert.isTrue(getCurrentWorkDirs.calledTwice); + }); + + it('updates the committer if the method changes', async function() { + const getCommitter = sinon.spy(() => new Author('upd@te.d', 'updated')); + const wrapper = shallow(buildApp()); + wrapper.setProps({getCommitter}); + assert.isTrue(getCommitter.calledOnce); + await assert.async.strictEqual(wrapper.state('committer').getEmail(), 'upd@te.d'); + }); + + it('does not update the committer when not mounted', function() { + const getCommitter = sinon.spy(); + const wrapper = shallow(buildApp({getCommitter})); + wrapper.unmount(); + assert.isTrue(getCommitter.calledOnce); + }); + + it('handles a lock toggle', async function() { + let resolveLockChange; + const setContextLock = sinon.stub().returns(new Promise(resolve => { + resolveLockChange = resolve; + })); + const wrapper = shallow(buildApp({currentWorkDir: 'the/workdir', contextLocked: false, setContextLock})); + + assert.isFalse(wrapper.find('GitTabHeaderView').prop('contextLocked')); + assert.isFalse(wrapper.find('GitTabHeaderView').prop('changingLock')); + + const handlerPromise = wrapper.find('GitTabHeaderView').prop('handleLockToggle')(); + wrapper.update(); + + assert.isTrue(wrapper.find('GitTabHeaderView').prop('contextLocked')); + assert.isTrue(wrapper.find('GitTabHeaderView').prop('changingLock')); + assert.isTrue(setContextLock.calledWith('the/workdir', true)); + + // Ignored while in-progress + wrapper.find('GitTabHeaderView').prop('handleLockToggle')(); + + resolveLockChange(); + await handlerPromise; + + assert.isFalse(wrapper.find('GitTabHeaderView').prop('changingLock')); + }); + + it('handles a workdir selection', async function() { + let resolveWorkdirChange; + const changeWorkingDirectory = sinon.stub().returns(new Promise(resolve => { + resolveWorkdirChange = resolve; + })); + const wrapper = shallow(buildApp({currentWorkDir: 'original', changeWorkingDirectory})); + + assert.strictEqual(wrapper.find('GitTabHeaderView').prop('workdir'), 'original'); + assert.isFalse(wrapper.find('GitTabHeaderView').prop('changingWorkDir')); + + const handlerPromise = wrapper.find('GitTabHeaderView').prop('handleWorkDirSelect')({ + target: {value: 'work/dir'}, + }); + wrapper.update(); + + assert.strictEqual(wrapper.find('GitTabHeaderView').prop('workdir'), 'work/dir'); + assert.isTrue(wrapper.find('GitTabHeaderView').prop('changingWorkDir')); + assert.isTrue(changeWorkingDirectory.calledWith('work/dir')); + + // Ignored while in-progress + wrapper.find('GitTabHeaderView').prop('handleWorkDirSelect')({ + target: {value: 'ig/nored'}, + }); + + resolveWorkdirChange(); + await handlerPromise; + + assert.isFalse(wrapper.find('GitTabHeaderView').prop('changingWorkDir')); + }); + + it('unmounts without error', function() { + const wrapper = shallow(buildApp()); + wrapper.unmount(); + assert.strictEqual(wrapper.children().length, 0); + }); +}); diff --git a/test/controllers/github-tab-controller.test.js b/test/controllers/github-tab-controller.test.js index ad5e3c2fd2..c29a5b5b25 100644 --- a/test/controllers/github-tab-controller.test.js +++ b/test/controllers/github-tab-controller.test.js @@ -6,11 +6,13 @@ import Repository from '../../lib/models/repository'; import BranchSet from '../../lib/models/branch-set'; import Branch, {nullBranch} from '../../lib/models/branch'; import RemoteSet from '../../lib/models/remote-set'; -import Remote from '../../lib/models/remote'; -import {InMemoryStrategy} from '../../lib/shared/keytar-strategy'; +import Remote, {nullRemote} from '../../lib/models/remote'; +import {DOTCOM} from '../../lib/models/endpoint'; +import {InMemoryStrategy, UNAUTHENTICATED} from '../../lib/shared/keytar-strategy'; import GithubLoginModel from '../../lib/models/github-login-model'; import RefHolder from '../../lib/models/ref-holder'; import Refresher from '../../lib/models/refresher'; +import * as reporterProxy from '../../lib/reporter-proxy'; import {buildRepository, cloneRepository} from '../helpers'; @@ -34,17 +36,25 @@ describe('GitHubTabController', function() { workspace={atomEnv.workspace} refresher={new Refresher()} loginModel={new GithubLoginModel(InMemoryStrategy)} + token="1234" rootHolder={new RefHolder()} workingDirectory={repo.getWorkingDirectoryPath()} repository={repo} allRemotes={new RemoteSet()} + githubRemotes={new RemoteSet()} + currentRemote={nullRemote} branches={new BranchSet()} + currentBranch={nullBranch} + aheadCount={0} + manyRemotesAvailable={false} pushInProgress={false} isLoading={false} currentWorkDir={repo.getWorkingDirectoryPath()} changeWorkingDirectory={() => {}} + setContextLock={() => {}} + contextLocked={false} onDidChangeWorkDirs={() => {}} getCurrentWorkDirs={() => []} openCreateDialog={() => {}} @@ -58,48 +68,15 @@ describe('GitHubTabController', function() { } describe('derived view props', function() { - const dotcom0 = new Remote('yes0', 'git@github.com:aaa/bbb.git'); - const dotcom1 = new Remote('yes1', 'https://github.com/ccc/ddd.git'); - const nonDotcom = new Remote('no0', 'git@sourceforge.net:eee/fff.git'); - - it('passes the current branch', function() { - const currentBranch = new Branch('aaa', nullBranch, nullBranch, true); - const otherBranch = new Branch('bbb'); - const branches = new BranchSet([currentBranch, otherBranch]); - const wrapper = shallow(buildApp({branches})); - - assert.strictEqual(wrapper.find('GitHubTabView').prop('currentBranch'), currentBranch); - }); - - it('passes remotes hosted on GitHub', function() { - const allRemotes = new RemoteSet([dotcom0, dotcom1, nonDotcom]); - const wrapper = shallow(buildApp({allRemotes})); - - const passed = wrapper.find('GitHubTabView').prop('remotes'); - assert.isTrue(passed.withName('yes0').isPresent()); - assert.isTrue(passed.withName('yes1').isPresent()); - assert.isFalse(passed.withName('no0').isPresent()); - }); - - it('detects an explicitly specified current remote', function() { - const allRemotes = new RemoteSet([dotcom0, dotcom1, nonDotcom]); - const wrapper = shallow(buildApp({allRemotes, selectedRemoteName: 'yes1'})); - assert.strictEqual(wrapper.find('GitHubTabView').prop('currentRemote'), dotcom1); - assert.isFalse(wrapper.find('GitHubTabView').prop('manyRemotesAvailable')); + it('passes the endpoint from the current GitHub remote when one exists', function() { + const remote = new Remote('hub', 'git@github.com:some/repo.git'); + const wrapper = shallow(buildApp({currentRemote: remote})); + assert.strictEqual(wrapper.find('GitHubTabView').prop('endpoint'), remote.getEndpoint()); }); - it('uses a single GitHub-hosted remote', function() { - const allRemotes = new RemoteSet([dotcom0, nonDotcom]); - const wrapper = shallow(buildApp({allRemotes})); - assert.strictEqual(wrapper.find('GitHubTabView').prop('currentRemote'), dotcom0); - assert.isFalse(wrapper.find('GitHubTabView').prop('manyRemotesAvailable')); - }); - - it('indicates when multiple remotes are available', function() { - const allRemotes = new RemoteSet([dotcom0, dotcom1]); - const wrapper = shallow(buildApp({allRemotes})); - assert.isFalse(wrapper.find('GitHubTabView').prop('currentRemote').isPresent()); - assert.isTrue(wrapper.find('GitHubTabView').prop('manyRemotesAvailable')); + it('defaults the endpoint to dotcom', function() { + const wrapper = shallow(buildApp({currentRemote: nullRemote})); + assert.strictEqual(wrapper.find('GitHubTabView').prop('endpoint'), DOTCOM); }); }); @@ -137,5 +114,26 @@ describe('GitHubTabController', function() { wrapper.find('GitHubTabView').prop('openBoundPublishDialog')(); assert.isTrue(openPublishDialog.calledWith(someRepo)); }); + + it('handles and instruments a login', async function() { + sinon.stub(reporterProxy, 'incrementCounter'); + const loginModel = new GithubLoginModel(InMemoryStrategy); + + const wrapper = shallow(buildApp({loginModel})); + await wrapper.find('GitHubTabView').prop('handleLogin')('good-token'); + assert.strictEqual(await loginModel.getToken(DOTCOM.getLoginAccount()), 'good-token'); + assert.isTrue(reporterProxy.incrementCounter.calledWith('github-login')); + }); + + it('handles and instruments a logout', async function() { + sinon.stub(reporterProxy, 'incrementCounter'); + const loginModel = new GithubLoginModel(InMemoryStrategy); + await loginModel.setToken(DOTCOM.getLoginAccount(), 'good-token'); + + const wrapper = shallow(buildApp({loginModel})); + await wrapper.find('GitHubTabView').prop('handleLogout')(); + assert.strictEqual(await loginModel.getToken(DOTCOM.getLoginAccount()), UNAUTHENTICATED); + assert.isTrue(reporterProxy.incrementCounter.calledWith('github-logout')); + }); }); }); diff --git a/test/controllers/github-tab-header-controller.test.js b/test/controllers/github-tab-header-controller.test.js new file mode 100644 index 0000000000..994f1b8752 --- /dev/null +++ b/test/controllers/github-tab-header-controller.test.js @@ -0,0 +1,147 @@ +import React from 'react'; +import {shallow} from 'enzyme'; + +import GithubTabHeaderController from '../../lib/controllers/github-tab-header-controller'; +import {nullAuthor} from '../../lib/models/author'; +import {Disposable} from 'atom'; + +describe('GithubTabHeaderController', function() { + function *createWorkdirs(workdirs) { + for (const workdir of workdirs) { + yield workdir; + } + } + + function buildApp(overrides) { + const props = { + user: nullAuthor, + currentWorkDir: null, + contextLocked: false, + changeWorkingDirectory: () => {}, + setContextLock: () => {}, + getCurrentWorkDirs: () => createWorkdirs([]), + onDidChangeWorkDirs: () => new Disposable(), + ...overrides, + }; + return ( + + ); + } + + it('get currentWorkDirs initializes workdirs state', function() { + const paths = ['should be equal']; + const wrapper = shallow(buildApp({getCurrentWorkDirs: () => createWorkdirs(paths)})); + assert.strictEqual(wrapper.state(['currentWorkDirs']).next().value, paths[0]); + }); + + it('calls onDidChangeWorkDirs after mount', function() { + const onDidChangeWorkDirs = sinon.spy(); + shallow(buildApp({onDidChangeWorkDirs})); + assert.isTrue(onDidChangeWorkDirs.calledOnce); + }); + + it('does not call onDidChangeWorkDirs on update', function() { + const onDidChangeWorkDirs = sinon.spy(); + const wrapper = shallow(buildApp({onDidChangeWorkDirs})); + wrapper.setProps({onDidChangeWorkDirs}); + assert.isTrue(onDidChangeWorkDirs.calledOnce); + }); + + it('calls onDidChangeWorkDirs on update to setup new listener', function() { + let onDidChangeWorkDirs = () => null; + const wrapper = shallow(buildApp({onDidChangeWorkDirs})); + onDidChangeWorkDirs = sinon.spy(); + wrapper.setProps({onDidChangeWorkDirs}); + assert.isTrue(onDidChangeWorkDirs.calledOnce); + }); + + it('calls onDidChangeWorkDirs on update and disposes old listener', function() { + const disposeSpy = sinon.spy(); + let onDidChangeWorkDirs = () => ({dispose: disposeSpy}); + const wrapper = shallow(buildApp({onDidChangeWorkDirs})); + onDidChangeWorkDirs = sinon.spy(); + wrapper.setProps({onDidChangeWorkDirs}); + assert.isTrue(onDidChangeWorkDirs.calledOnce); + assert.isTrue(disposeSpy.calledOnce); + }); + + it('updates workdirs', function() { + let getCurrentWorkDirs = () => createWorkdirs([]); + getCurrentWorkDirs = sinon.spy(getCurrentWorkDirs); + const wrapper = shallow(buildApp({getCurrentWorkDirs})); + wrapper.instance().resetWorkDirs(); + assert.isTrue(getCurrentWorkDirs.calledTwice); + }); + + it('handles a lock toggle', async function() { + let resolveLockChange; + const setContextLock = sinon.stub().returns(new Promise(resolve => { + resolveLockChange = resolve; + })); + const wrapper = shallow(buildApp({currentWorkDir: 'the/workdir', contextLocked: false, setContextLock})); + + assert.isFalse(wrapper.find('GithubTabHeaderView').prop('contextLocked')); + assert.isFalse(wrapper.find('GithubTabHeaderView').prop('changingLock')); + + const handlerPromise = wrapper.find('GithubTabHeaderView').prop('handleLockToggle')(); + wrapper.update(); + + assert.isTrue(wrapper.find('GithubTabHeaderView').prop('contextLocked')); + assert.isTrue(wrapper.find('GithubTabHeaderView').prop('changingLock')); + assert.isTrue(setContextLock.calledWith('the/workdir', true)); + + // Ignored while in-progress + wrapper.find('GithubTabHeaderView').prop('handleLockToggle')(); + + resolveLockChange(); + await handlerPromise; + + assert.isFalse(wrapper.find('GithubTabHeaderView').prop('changingLock')); + }); + + it('handles a workdir selection', async function() { + let resolveWorkdirChange; + const changeWorkingDirectory = sinon.stub().returns(new Promise(resolve => { + resolveWorkdirChange = resolve; + })); + const wrapper = shallow(buildApp({currentWorkDir: 'original', changeWorkingDirectory})); + + assert.strictEqual(wrapper.find('GithubTabHeaderView').prop('workdir'), 'original'); + assert.isFalse(wrapper.find('GithubTabHeaderView').prop('changingWorkDir')); + + const handlerPromise = wrapper.find('GithubTabHeaderView').prop('handleWorkDirChange')({ + target: {value: 'work/dir'}, + }); + wrapper.update(); + + assert.strictEqual(wrapper.find('GithubTabHeaderView').prop('workdir'), 'work/dir'); + assert.isTrue(wrapper.find('GithubTabHeaderView').prop('changingWorkDir')); + assert.isTrue(changeWorkingDirectory.calledWith('work/dir')); + + // Ignored while in-progress + wrapper.find('GithubTabHeaderView').prop('handleWorkDirChange')({ + target: {value: 'ig/nored'}, + }); + + resolveWorkdirChange(); + await handlerPromise; + + assert.isFalse(wrapper.find('GithubTabHeaderView').prop('changingWorkDir')); + }); + + it('disposes on unmount', function() { + const disposeSpy = sinon.spy(); + const onDidChangeWorkDirs = () => ({dispose: disposeSpy}); + const wrapper = shallow(buildApp({onDidChangeWorkDirs})); + wrapper.unmount(); + assert.isTrue(disposeSpy.calledOnce); + }); + + it('unmounts without error', function() { + const wrapper = shallow(buildApp()); + wrapper.unmount(); + assert.strictEqual(wrapper.children().length, 0); + }); +}); diff --git a/test/controllers/issueish-list-controller.test.js b/test/controllers/issueish-list-controller.test.js index c5b7ab4e3d..13f4ffa07c 100644 --- a/test/controllers/issueish-list-controller.test.js +++ b/test/controllers/issueish-list-controller.test.js @@ -90,7 +90,7 @@ describe('IssueishListController', function() { it('calls shell.openExternal with specified url', async function() { const wrapper = shallow(buildApp()); - sinon.stub(shell, 'openExternal').callsArg(2); + sinon.stub(shell, 'openExternal').callsFake(() => { }); await wrapper.instance().openOnGitHub(url); assert.isTrue(shell.openExternal.calledWith(url)); @@ -98,7 +98,7 @@ describe('IssueishListController', function() { it('fires `open-issueish-in-browser` event upon success', async function() { const wrapper = shallow(buildApp()); - sinon.stub(shell, 'openExternal').callsArg(2); + sinon.stub(shell, 'openExternal').callsFake(() => {}); sinon.stub(reporterProxy, 'addEvent'); await wrapper.instance().openOnGitHub(url); @@ -109,7 +109,7 @@ describe('IssueishListController', function() { it('handles error when openOnGitHub fails', async function() { const wrapper = shallow(buildApp()); - sinon.stub(shell, 'openExternal').callsArgWith(2, new Error('oh noes')); + sinon.stub(shell, 'openExternal').throws(new Error('oh noes')); sinon.stub(reporterProxy, 'addEvent'); try { diff --git a/test/controllers/multi-file-patch-controller.test.js b/test/controllers/multi-file-patch-controller.test.js index 1b3a2cd74b..74e51db700 100644 --- a/test/controllers/multi-file-patch-controller.test.js +++ b/test/controllers/multi-file-patch-controller.test.js @@ -162,7 +162,7 @@ describe('MultiFilePatchController', function() { const promise = wrapper.instance().patchChangePromise; wrapper.setProps({multiFilePatch: MultiFilePatch.createNull()}); await promise; - + await wrapper.instance().forceUpdate(); // Performs an operation again assert.strictEqual(await wrapper.find('MultiFilePatchView').prop('toggleFile')(filePatch), 'staged'); }); diff --git a/test/controllers/remote-controller.test.js b/test/controllers/remote-controller.test.js index 36e34cccf1..3028264145 100644 --- a/test/controllers/remote-controller.test.js +++ b/test/controllers/remote-controller.test.js @@ -52,7 +52,7 @@ describe('RemoteController', function() { it('increments a counter when onCreatePr is called', async function() { const wrapper = shallow(createApp()); - sinon.stub(shell, 'openExternal').callsArg(2); + sinon.stub(shell, 'openExternal').callsFake(() => {}); sinon.stub(reporterProxy, 'incrementCounter'); await wrapper.instance().onCreatePr(); @@ -62,7 +62,7 @@ describe('RemoteController', function() { it('handles error when onCreatePr fails', async function() { const wrapper = shallow(createApp()); - sinon.stub(shell, 'openExternal').callsArgWith(2, new Error('oh noes')); + sinon.stub(shell, 'openExternal').throws(new Error('oh noes')); sinon.stub(reporterProxy, 'incrementCounter'); try { diff --git a/test/controllers/root-controller.test.js b/test/controllers/root-controller.test.js index c2eb72e890..9d61f815ca 100644 --- a/test/controllers/root-controller.test.js +++ b/test/controllers/root-controller.test.js @@ -58,13 +58,13 @@ describe('RootController', function() { workspace={workspace} commands={commands} deserializers={deserializers} - grammars={grammars} notificationManager={notificationManager} tooltips={tooltips} + keymaps={atomEnv.keymaps} + grammars={grammars} config={config} - confirm={confirm} project={project} - keymaps={atomEnv.keymaps} + confirm={confirm} currentWindow={atomEnv.getCurrentWindow()} loginModel={loginModel} @@ -72,9 +72,14 @@ describe('RootController', function() { repository={absentRepository} resolutionProgress={emptyResolutionProgress} + currentWorkDir={null} + initialize={() => {}} clone={() => {}} + contextLocked={false} + changeWorkingDirectory={() => {}} + setContextLock={() => {}} startOpen={false} startRevealed={false} /> diff --git a/test/fixtures/props/git-tab-props.js b/test/fixtures/props/git-tab-props.js index 42f2d54eb4..726f659f85 100644 --- a/test/fixtures/props/git-tab-props.js +++ b/test/fixtures/props/git-tab-props.js @@ -1,8 +1,11 @@ +import {TextBuffer} from 'atom'; + import ResolutionProgress from '../../../lib/models/conflicts/resolution-progress'; import {InMemoryStrategy} from '../../../lib/shared/keytar-strategy'; import GithubLoginModel from '../../../lib/models/github-login-model'; import RefHolder from '../../../lib/models/ref-holder'; import UserStore from '../../../lib/models/user-store'; +import {nullAuthor} from '../../../lib/models/author'; function noop() {} @@ -10,6 +13,8 @@ export function gitTabItemProps(atomEnv, repository, overrides = {}) { return { repository, loginModel: new GithubLoginModel(InMemoryStrategy), + username: 'Me', + email: 'me@email.com', workspace: atomEnv.workspace, commands: atomEnv.commands, grammars: atomEnv.grammars, @@ -26,8 +31,10 @@ export function gitTabItemProps(atomEnv, repository, overrides = {}) { openFiles: noop, openInitializeDialog: noop, changeWorkingDirectory: noop, - onDidChangeWorkDirs: noop, - getCurrentWorkDirs: () => [], + contextLocked: false, + setContextLock: () => {}, + onDidChangeWorkDirs: () => ({dispose: () => {}}), + getCurrentWorkDirs: () => new Set(), ...overrides }; } @@ -49,6 +56,7 @@ export async function gitTabControllerProps(atomEnv, repository, overrides = {}) mergeConflicts: await repository.getMergeConflicts(), workingDirectoryPath: repository.getWorkingDirectoryPath(), fetchInProgress: false, + repositoryDrift: false, ...overrides, }; @@ -64,7 +72,10 @@ export async function gitTabViewProps(atomEnv, repository, overrides = {}) { repository, isLoading: false, + editingIdentity: false, + usernameBuffer: new TextBuffer(), + emailBuffer: new TextBuffer(), lastCommit: await repository.getLastCommit(), currentBranch: await repository.getCurrentBranch(), recentCommits: await repository.getRecentCommits({max: 10}), @@ -88,6 +99,10 @@ export async function gitTabViewProps(atomEnv, repository, overrides = {}) { project: atomEnv.project, tooltips: atomEnv.tooltips, + toggleIdentityEditor: () => {}, + closeIdentityEditor: () => {}, + setLocalIdentity: () => {}, + setGlobalIdentity: () => {}, openInitializeDialog: () => {}, abortMerge: () => {}, commit: () => {}, @@ -101,9 +116,13 @@ export async function gitTabViewProps(atomEnv, repository, overrides = {}) { discardWorkDirChangesForPaths: () => {}, openFiles: () => {}, + contextLocked: false, changeWorkingDirectory: () => {}, - onDidChangeWorkDirs: () => {}, - getCurrentWorkDirs: () => [], + setContextLock: () => {}, + onDidChangeWorkDirs: () => ({dispose: () => {}}), + getCurrentWorkDirs: () => new Set(), + onDidUpdateRepo: () => ({dispose: () => {}}), + getCommitter: () => nullAuthor, ...overrides, }; diff --git a/test/fixtures/props/github-tab-props.js b/test/fixtures/props/github-tab-props.js new file mode 100644 index 0000000000..befb969c8a --- /dev/null +++ b/test/fixtures/props/github-tab-props.js @@ -0,0 +1,69 @@ +import {InMemoryStrategy} from '../../../lib/shared/keytar-strategy'; +import GithubLoginModel from '../../../lib/models/github-login-model'; +import RefHolder from '../../../lib/models/ref-holder'; +import OperationStateObserver, {PUSH, PULL, FETCH} from '../../../lib/models/operation-state-observer'; +import RemoteSet from '../../../lib/models/remote-set'; +import {nullRemote} from '../../../lib/models/remote'; +import BranchSet from '../../../lib/models/branch-set'; +import {nullBranch} from '../../../lib/models/branch'; +import {nullAuthor} from '../../../lib/models/author'; + +export function gitHubTabItemProps(atomEnv, repository, overrides = {}) { + return { + workspace: atomEnv.workspace, + repository, + loginModel: new GithubLoginModel(InMemoryStrategy), + changeWorkingDirectory: () => {}, + onDidChangeWorkDirs: () => ({dispose: () => {}}), + getCurrentWorkDirs: () => [], + ...overrides, + }; +} + +export function gitHubTabContainerProps(atomEnv, repository, overrides = {}) { + return { + ...gitHubTabItemProps(atomEnv, repository), + rootHolder: new RefHolder(), + ...overrides, + }; +} + +export function gitHubTabControllerProps(atomEnv, repository, overrides = {}) { + return { + ...gitHubTabContainerProps(atomEnv, repository), + remoteOperationObserver: new OperationStateObserver(repository, PUSH, PULL, FETCH), + workingDirectory: repository.getWorkingDirectoryPath(), + allRemotes: new RemoteSet(), + branches: new BranchSet(), + aheadCount: 0, + pushInProgress: false, + ...overrides, + }; +} + +export function gitHubTabViewProps(atomEnv, repository, overrides = {}) { + return { + workspace: atomEnv.workspace, + remoteOperationObserver: new OperationStateObserver(repository, PUSH, PULL, FETCH), + loginModel: new GithubLoginModel(InMemoryStrategy), + rootHolder: new RefHolder(), + + workingDirectory: repository.getWorkingDirectoryPath(), + branches: new BranchSet(), + currentBranch: nullBranch, + remotes: new RemoteSet(), + currentRemote: nullRemote, + manyRemotesAvailable: false, + aheadCount: 0, + pushInProgress: false, + + handlePushBranch: () => {}, + handleRemoteSelect: () => {}, + changeWorkingDirectory: () => {}, + onDidChangeWorkDirs: () => ({dispose: () => {}}), + getCurrentWorkDirs: () => [], + repository, + + ...overrides, + }; +} diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index 581b617f5a..3d7ad41b85 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -11,6 +11,7 @@ import {GitProcess} from 'dugite'; import CompositeGitStrategy from '../lib/composite-git-strategy'; import GitShellOutStrategy, {LargeRepoError} from '../lib/git-shell-out-strategy'; import WorkerManager from '../lib/worker-manager'; +import Author from '../lib/models/author'; import {cloneRepository, initRepository, assertDeepPropertyVals, setUpLocalAndRemoteRepositories} from './helpers'; import {normalizeGitHelperPath, getTempDir} from '../lib/helpers'; @@ -49,6 +50,7 @@ import * as reporterProxy from '../lib/reporter-proxy'; git.setPromptCallback(promptStub); const stdin = dedent` + protocol=https host=noway.com username=me @@ -270,8 +272,7 @@ import * as reporterProxy from '../lib/reporter-proxy'; assert.deepEqual(commits[0], { sha: '90b17a8e3fa0218f42afc1dd24c9003e285f4a82', - authorEmail: 'kuychaco@github.com', - authorName: 'Katrina Uychaco', + author: new Author('kuychaco@github.com', 'Katrina Uychaco'), authorDate: 1471113656, messageSubject: 'third commit', messageBody: '', @@ -281,8 +282,7 @@ import * as reporterProxy from '../lib/reporter-proxy'; }); assert.deepEqual(commits[1], { sha: '18920c900bfa6e4844853e7e246607a31c3e2e8c', - authorEmail: 'kuychaco@github.com', - authorName: 'Katrina Uychaco', + author: new Author('kuychaco@github.com', 'Katrina Uychaco'), authorDate: 1471113642, messageSubject: 'second commit', messageBody: '', @@ -292,8 +292,7 @@ import * as reporterProxy from '../lib/reporter-proxy'; }); assert.deepEqual(commits[2], { sha: '46c0d7179fc4e348c3340ff5e7957b9c7d89c07f', - authorEmail: 'kuychaco@github.com', - authorName: 'Katrina Uychaco', + author: new Author('kuychaco@github.com', 'Katrina Uychaco'), authorDate: 1471113625, messageSubject: 'first commit', messageBody: '', @@ -334,18 +333,9 @@ import * as reporterProxy from '../lib/reporter-proxy'; const commits = await git.getCommits({max: 1}); assert.lengthOf(commits, 1); assert.deepEqual(commits[0].coAuthors, [ - { - name: 'name', - email: 'name@example.com', - }, - { - name: 'another-name', - email: 'another-name@example.com', - }, - { - name: 'yet-another', - email: 'yet-another@example.com', - }, + new Author('name@example.com', 'name'), + new Author('another-name@example.com', 'another-name'), + new Author('yet-another@example.com', 'yet-another'), ]); }); @@ -847,7 +837,7 @@ import * as reporterProxy from '../lib/reporter-proxy'; it('returns an empty diff', async function() { const workingDirPath = await cloneRepository('three-files'); const git = createTestStrategy(workingDirPath); - const data = new Buffer(10); + const data = Buffer.alloc(10); for (let i = 0; i < 10; i++) { data.writeUInt8(i + 200, i); } diff --git a/test/github-package.test.js b/test/github-package.test.js index dfb0308011..dc1e07b410 100644 --- a/test/github-package.test.js +++ b/test/github-package.test.js @@ -412,12 +412,23 @@ describe('GithubPackage', function() { }); describe('when removing a project', function() { - beforeEach(async function() { + it('removes the project\'s context', async function() { await contextUpdateAfter(githubPackage, () => project.setPaths([workdirPath1])); - }); - it('removes the project\'s context', function() { assert.isFalse(contextPool.getContext(workdirPath2).isPresent()); + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath1); + }); + + it('does nothing if the context is locked', async function() { + await githubPackage.scheduleActiveContextUpdate({ + usePath: workdirPath2, + lock: true, + }); + + await contextUpdateAfter(githubPackage, () => project.setPaths([workdirPath1])); + + assert.isTrue(contextPool.getContext(workdirPath2).isPresent()); + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath2); }); }); @@ -434,6 +445,123 @@ describe('GithubPackage', function() { assert.isTrue(githubPackage.getActiveRepository().isAbsent()); }); }); + + describe('when changing the active pane item', function() { + it('follows the active pane item', async function() { + const itemPath2 = path.join(workdirPath2, 'b.txt'); + + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath1); + await contextUpdateAfter(githubPackage, () => atomEnv.workspace.open(itemPath2)); + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath2); + }); + + it('uses a context associated with a project root for paths within that root', async function() { + const workdirPath4 = await getTempDir(); + await fs.mkdir(path.join(workdirPath4, 'subdir')); + const itemPath4 = path.join(workdirPath4, 'subdir/file.txt'); + await fs.writeFile(itemPath4, 'content\n'); + + await contextUpdateAfter(githubPackage, () => project.setPaths([workdirPath1, workdirPath4])); + + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath1); + await contextUpdateAfter(githubPackage, () => atomEnv.workspace.open(itemPath4)); + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath4); + }); + + it('uses a context of the containing directory for file item paths not in any root', async function() { + const workdirPath4 = await getTempDir(); + const itemPath4 = path.join(workdirPath4, 'file.txt'); + await fs.writeFile(itemPath4, 'content\n'); + + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath1); + await contextUpdateAfter(githubPackage, () => atomEnv.workspace.open(itemPath4)); + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath4); + }); + + it('does nothing if the context is locked', async function() { + const itemPath2 = path.join(workdirPath2, 'c.txt'); + + await githubPackage.scheduleActiveContextUpdate({ + usePath: workdirPath1, + lock: true, + }); + + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath1); + await contextUpdateAfter(githubPackage, () => atomEnv.workspace.open(itemPath2)); + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath1); + }); + }); + + describe('with a locked context', function() { + it('preserves the locked context in the pool', async function() { + await githubPackage.scheduleActiveContextUpdate({ + usePath: workdirPath1, + lock: true, + }); + + await contextUpdateAfter(githubPackage, () => project.setPaths([workdirPath2])); + + assert.isTrue(contextPool.getContext(workdirPath1).isPresent()); + assert.isTrue(contextPool.getContext(workdirPath2).isPresent()); + + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath1); + }); + + it('may be unlocked', async function() { + const itemPath1a = path.join(workdirPath1, 'a.txt'); + const itemPath1b = path.join(workdirPath2, 'b.txt'); + + await githubPackage.scheduleActiveContextUpdate({ + usePath: workdirPath2, + lock: true, + }); + + await contextUpdateAfter(githubPackage, () => atomEnv.workspace.open(itemPath1a)); + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath2); + + await githubPackage.scheduleActiveContextUpdate({ + usePath: workdirPath1, + lock: false, + }); + + await contextUpdateAfter(githubPackage, () => atomEnv.workspace.open(itemPath1b)); + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath1); + }); + + it('triggers a re-render when the context is unchanged', async function() { + sinon.stub(githubPackage, 'rerender'); + + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath1); + await githubPackage.scheduleActiveContextUpdate({ + usePath: workdirPath1, + lock: true, + }); + + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath1); + assert.isTrue(githubPackage.rerender.called); + githubPackage.rerender.resetHistory(); + + await githubPackage.scheduleActiveContextUpdate({ + usePath: workdirPath1, + lock: false, + }); + + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath1); + assert.isTrue(githubPackage.rerender.called); + }); + }); + + it('does nothing when the workspace is destroyed', async function() { + sinon.stub(githubPackage, 'rerender'); + atomEnv.destroy(); + + await githubPackage.scheduleActiveContextUpdate({ + usePath: workdirPath2, + }); + + assert.isFalse(githubPackage.rerender.called); + assert.strictEqual(githubPackage.getActiveWorkdir(), workdirPath1); + }); }); describe('with non-repository, no-conflict, and in-progress merge-conflict projects', function() { @@ -455,7 +583,7 @@ describe('GithubPackage', function() { let resolutionMergeConflict; beforeEach(async function() { await githubPackage.scheduleActiveContextUpdate({ - activeRepositoryPath: workdirMergeConflict, + usePath: workdirMergeConflict, }); resolutionMergeConflict = contextPool.getContext(workdirMergeConflict).getResolutionProgress(); }); @@ -477,7 +605,7 @@ describe('GithubPackage', function() { let resolutionNoConflict; beforeEach(async function() { await githubPackage.scheduleActiveContextUpdate({ - activeRepositoryPath: workdirNoConflict, + usePath: workdirNoConflict, }); resolutionNoConflict = contextPool.getContext(workdirNoConflict).getResolutionProgress(); }); @@ -494,7 +622,7 @@ describe('GithubPackage', function() { describe('when opening a non-repository project', function() { beforeEach(async function() { await githubPackage.scheduleActiveContextUpdate({ - activeRepositoryPath: nonRepositoryPath, + usePath: nonRepositoryPath, }); }); @@ -515,7 +643,7 @@ describe('GithubPackage', function() { project.setPaths([workdirPath1, workdirPath2]); await githubPackage.scheduleActiveContextUpdate({ - activeRepositoryPath: workdirPath3, + usePath: workdirPath3, }); context1 = contextPool.getContext(workdirPath1); }); @@ -538,7 +666,7 @@ describe('GithubPackage', function() { project.setPaths([workdirPath1]); await githubPackage.scheduleActiveContextUpdate({ - activeRepositoryPath: workdirPath2, + usePath: workdirPath2, }); context1 = contextPool.getContext(workdirPath1); }); @@ -561,7 +689,7 @@ describe('GithubPackage', function() { project.setPaths([workdirPath1, workdirPath2]); await githubPackage.scheduleActiveContextUpdate({ - activeRepositoryPath: workdirPath2, + usePath: workdirPath2, }); }); diff --git a/test/integration/file-patch.test.js b/test/integration/file-patch.test.js index d2d3a0d9e1..f608b1ef51 100644 --- a/test/integration/file-patch.test.js +++ b/test/integration/file-patch.test.js @@ -7,6 +7,10 @@ import {setup, teardown} from './helpers'; import GitShellOutStrategy from '../../lib/git-shell-out-strategy'; describe('integration: file patches', function() { + // NOTE: This test does not pass on VSTS macOS builds. It will be re-enabled + // once the underlying problem is solved. See atom/github#2617 for details. + if (process.env.CI_PROVIDER === 'VSTS') { return; } + let context, wrapper, atomEnv; let workspace; let commands, workspaceElement; diff --git a/test/models/author.test.js b/test/models/author.test.js index 6f5952ec2c..d6ad187db1 100644 --- a/test/models/author.test.js +++ b/test/models/author.test.js @@ -28,4 +28,64 @@ describe('Author', function() { assert.isFalse(a0.matches(a3)); assert.isFalse(a0.matches(nullAuthor)); }); + + it('creates the correct avatar urls', function() { + const a0 = new Author('same@same.com', 'Zero'); + const a1 = new Author('0000000+testing@users.noreply.github.com', 'One'); + const a2 = new Author('', 'Blank Email'); + const a3 = new Author(null, 'Null Email'); + + assert.strictEqual('https://avatars.githubusercontent.com/u/e?email=same%40same.com&s=32', a0.getAvatarUrl()); + assert.strictEqual('https://avatars.githubusercontent.com/u/0000000?s=32', a1.getAvatarUrl()); + assert.strictEqual('', a2.getAvatarUrl()); + assert.strictEqual('', a3.getAvatarUrl()); + assert.strictEqual('', nullAuthor.getAvatarUrl()); + }); + + it('returns name and email as a string', function() { + const a0 = new Author('same@same.com', 'Zero'); + assert.strictEqual('Zero ', a0.toString()); + }); + + it('returns name, email, and login as a string', function() { + const a0 = new Author('same@same.com', 'Zero', 'handle'); + assert.strictEqual('Zero @handle', a0.toString()); + }); + + it('compares names by alphabetical order', function() { + const a0 = new Author('same@same.com', 'Zero'); + const a1 = new Author('same@same.com', 'One'); + const a2 = new Author('same@same.com', 'Two', 'two'); + + assert.strictEqual(Author.compare(a0, a0), 0); + assert.strictEqual(Author.compare(a0, a1), 1); + assert.strictEqual(Author.compare(a1, a2), -1); + assert.strictEqual(Author.compare(a0, nullAuthor), 1); + }); + + it('returns null author as a string', function() { + assert.strictEqual(nullAuthor.toString(), 'null author'); + }); + + it('assumes 2 null authors are equal', function() { + const nullAuthor2 = require('../../lib/models/author').nullAuthor; + assert.isTrue(nullAuthor.matches(nullAuthor2)); + }); + + it('assumes nullAuthors are never present', function() { + assert.isFalse(nullAuthor.isPresent()); + }); + + it('assumes nullAuthors are never new', function() { + assert.isFalse(nullAuthor.isNew()); + }); + + it('assumes nullAuthors don\'t have logins', function() { + assert.isFalse(nullAuthor.hasLogin()); + assert.strictEqual(nullAuthor.getLogin(), null); + }); + + it('assumes nullAuthors don\'t use a no reply email', function() { + assert.isFalse(nullAuthor.isNoReply()); + }); }); diff --git a/test/models/branch.test.js b/test/models/branch.test.js index d53cbfc114..0757a4d212 100644 --- a/test/models/branch.test.js +++ b/test/models/branch.test.js @@ -1,5 +1,5 @@ import Branch, {nullBranch} from '../../lib/models/branch'; -import util from 'util'; +// import util from 'util'; describe('Branch', function() { it('creates a branch with no upstream', function() { @@ -95,20 +95,20 @@ describe('Branch', function() { ); }); - it('has a null object', function() { - for (const method of [ - 'getName', 'getFullRef', 'getShortRef', 'getSha', 'getRemoteName', 'getRemoteRef', 'getShortRemoteRef', - ]) { - assert.strictEqual(nullBranch[method](), ''); - } - - assert.strictEqual(nullBranch.getUpstream(), nullBranch); - assert.strictEqual(nullBranch.getPush(), nullBranch); - - for (const method of ['isHead', 'isDetached', 'isRemoteTracking', 'isPresent']) { - assert.isFalse(nullBranch[method]()); - } - - assert.strictEqual(util.inspect(nullBranch), '{nullBranch}'); - }); + // it('has a null object', function() { + // for (const method of [ + // 'getName', 'getFullRef', 'getShortRef', 'getSha', 'getRemoteName', 'getRemoteRef', 'getShortRemoteRef', + // ]) { + // assert.strictEqual(nullBranch[method](), ''); + // } + // + // assert.strictEqual(nullBranch.getUpstream(), nullBranch); + // assert.strictEqual(nullBranch.getPush(), nullBranch); + // + // for (const method of ['isHead', 'isDetached', 'isRemoteTracking', 'isPresent']) { + // assert.isFalse(nullBranch[method]()); + // } + // + // assert.strictEqual(util.inspect(nullBranch), '{nullBranch}'); + // }); }); diff --git a/test/models/commit.test.js b/test/models/commit.test.js index d4c540b1e5..70fa06b8e8 100644 --- a/test/models/commit.test.js +++ b/test/models/commit.test.js @@ -148,7 +148,7 @@ describe('Commit', function() { it('returns the author name', function() { const authorName = 'Tilde Ann Thurium'; - const commit = commitBuilder().authorName(authorName).build(); + const commit = commitBuilder().addAuthor('email', authorName).build(); assert.strictEqual(commit.getAuthorName(), authorName); }); @@ -156,21 +156,21 @@ describe('Commit', function() { it('returns true when commits are identical', function() { const a = commitBuilder() .sha('01234') - .authorEmail('me@email.com') + .addAuthor('me@email.com', 'me') .authorDate(0) .messageSubject('subject') .messageBody('body') - .addCoAuthor('name', 'me@email.com') + .addCoAuthor('me@email.com', 'name') .setMultiFileDiff() .build(); const b = commitBuilder() .sha('01234') - .authorEmail('me@email.com') + .addAuthor('me@email.com', 'me') .authorDate(0) .messageSubject('subject') .messageBody('body') - .addCoAuthor('name', 'me@email.com') + .addCoAuthor('me@email.com', 'name') .setMultiFileDiff() .build(); @@ -185,19 +185,19 @@ describe('Commit', function() { }); it('returns false if author differs', function() { - const a = commitBuilder().authorName('Tilde Ann Thurium').build(); + const a = commitBuilder().addAuthor('Tilde Ann Thurium', 'tthurium@gmail.com').build(); - const b = commitBuilder().authorName('Vanessa Yuen').build(); + const b = commitBuilder().addAuthor('Vanessa Yuen', 'vyuen@gmail.com').build(); assert.isFalse(a.isEqual(b)); }); it('returns false if a co-author differs', function() { - const a = commitBuilder().addCoAuthor('me', 'me@email.com').build(); + const a = commitBuilder().addCoAuthor('me@email.com', 'me').build(); - const b0 = commitBuilder().addCoAuthor('me', 'me@email.com').addCoAuthor('extra', 'extra@email.com').build(); + const b0 = commitBuilder().addCoAuthor('me@email.com', 'me').addCoAuthor('extra@email.com', 'extra').build(); assert.isFalse(a.isEqual(b0)); - const b1 = commitBuilder().addCoAuthor('different', 'me@email.com').build(); + const b1 = commitBuilder().addCoAuthor('me@email.com', 'different').build(); assert.isFalse(a.isEqual(b1)); }); diff --git a/test/models/remote.test.js b/test/models/remote.test.js index 410c660e18..68d55636e7 100644 --- a/test/models/remote.test.js +++ b/test/models/remote.test.js @@ -76,6 +76,7 @@ describe('Remote', function() { assert.isNull(nullRemote.getSlug()); assert.strictEqual(nullRemote.getNameOr('else'), 'else'); assert.isNull(nullRemote.getEndpoint()); + assert.strictEqual(nullRemote.getEndpointOrDotcom().getGraphQLRoot(), 'https://api.github.com/graphql'); }); describe('getEndpoint', function() { @@ -89,4 +90,16 @@ describe('Remote', function() { assert.isNull(elsewhere.getEndpoint()); }); }); + + describe('getEndpointOrDotcom', function() { + it('accesses the same Endpoint for the corresponding GitHub host', function() { + const remote = new Remote('origin', 'git@github.com:atom/github.git'); + assert.strictEqual(remote.getEndpointOrDotcom().getGraphQLRoot(), 'https://api.github.com/graphql'); + }); + + it('returns dotcom for non-GitHub URLs', function() { + const elsewhere = new Remote('mirror', 'https://me@bitbucket.org/team/repo.git'); + assert.strictEqual(elsewhere.getEndpointOrDotcom().getGraphQLRoot(), 'https://api.github.com/graphql'); + }); + }); }); diff --git a/test/models/repository.test.js b/test/models/repository.test.js index 3aede68ea6..35ef739a32 100644 --- a/test/models/repository.test.js +++ b/test/models/repository.test.js @@ -73,12 +73,15 @@ describe('Repository', function() { } // Methods that resolve to null - for (const method of [ - 'getAheadCount', 'getBehindCount', 'getConfig', 'getLastHistorySnapshots', 'getCache', - ]) { + for (const method of ['getLastHistorySnapshots', 'getCache']) { assert.isNull(await repository[method]()); } + // Methods that resolve to 0 + for (const method of ['getAheadCount', 'getBehindCount']) { + assert.strictEqual(await repository[method](), 0); + } + // Methods that resolve to an empty array for (const method of [ 'getRecentCommits', 'getAuthors', 'getDiscardHistory', @@ -121,7 +124,7 @@ describe('Repository', function() { 'init', 'clone', 'stageFiles', 'unstageFiles', 'stageFilesFromParentCommit', 'applyPatchToIndex', 'applyPatchToWorkdir', 'commit', 'merge', 'abortMerge', 'checkoutSide', 'mergeFile', 'writeMergeConflictToIndex', 'checkout', 'checkoutPathsAtRevision', 'undoLastCommit', 'fetch', 'pull', - 'push', 'setConfig', 'unsetConfig', 'createBlob', 'expandBlobToFile', 'createDiscardHistoryBlob', + 'push', 'unsetConfig', 'createBlob', 'expandBlobToFile', 'createDiscardHistoryBlob', 'updateDiscardHistory', 'storeBeforeAndAfterBlobs', 'restoreLastDiscardInTempFiles', 'popDiscardHistory', 'clearDiscardHistory', 'discardWorkDirChangesForPaths', 'addRemote', 'setCommitMessage', 'fetchCommitMessageTemplate', @@ -138,6 +141,11 @@ describe('Repository', function() { /fatal: Not a valid object name abcd/, ); }); + + it('works anyway', async function() { + await repository.setConfig('atomGithub.test', 'yes', {global: true}); + assert.strictEqual(await repository.getConfig('atomGithub.test'), 'yes'); + }); }); it('accesses an OperationStates model', async function() { @@ -1321,14 +1329,17 @@ describe('Repository', function() { }); it('does nothing on a destroyed repository', async function() { + sinon.spy(repository, 'setConfig'); repository.destroy(); await repository.saveDiscardHistory(); - assert.isNull(await repository.getConfig('atomGithub.historySha')); + assert.isFalse(repository.setConfig.called); }); it('does nothing if the repository is destroyed after the blob is created', async function() { + sinon.spy(repository, 'setConfig'); + let resolveCreateHistoryBlob = () => {}; sinon.stub(repository, 'createDiscardHistoryBlob').callsFake(() => new Promise(resolve => { resolveCreateHistoryBlob = resolve; @@ -1339,7 +1350,7 @@ describe('Repository', function() { resolveCreateHistoryBlob('nope'); await promise; - assert.isNull(await repository.getConfig('atomGithub.historySha')); + assert.isFalse(repository.setConfig.called); }); it('creates a blob and saves it in the git config', async function() { diff --git a/test/models/user-store.test.js b/test/models/user-store.test.js index 3f35804de8..9aaa62e88d 100644 --- a/test/models/user-store.test.js +++ b/test/models/user-store.test.js @@ -25,12 +25,13 @@ describe('UserStore', function() { atomEnv.destroy(); }); - function nextUpdatePromise() { + function nextUpdatePromise(during = () => {}) { return new Promise(resolve => { const sub = store.onDidUpdate(() => { sub.dispose(); resolve(); }); + during(); }); } @@ -290,10 +291,8 @@ describe('UserStore', function() { const newEmail = 'foo@bar.com'; const newName = 'Foo Bar'; - await repository.setConfig('user.email', newEmail); await repository.setConfig('user.name', newName); - repository.refresh(); - await nextUpdatePromise(); + await nextUpdatePromise(() => repository.setConfig('user.email', newEmail)); assert.deepEqual(store.committer, new Author(newEmail, newName)); }); diff --git a/test/models/workdir-context-pool.test.js b/test/models/workdir-context-pool.test.js index b5b12a22e5..d29c824af4 100644 --- a/test/models/workdir-context-pool.test.js +++ b/test/models/workdir-context-pool.test.js @@ -368,4 +368,44 @@ describe('WorkdirContextPool', function() { }); }); }); + + describe('cross-instance cache invalidation', function() { + it('invalidates a config cache key in different instances when a global setting is changed', async function() { + const base = String(Date.now()); + const value0 = `${base}-0`; + const value1 = `${base}-1`; + + const repo0 = pool.add(await cloneRepository('three-files')).getRepository(); + const repo1 = pool.add(await cloneRepository('three-files')).getRepository(); + const repo2 = pool.add(temp.mkdirSync()).getRepository(); + + await Promise.all([repo0, repo1, repo2].map(repo => repo.getLoadPromise())); + + const [before0, before1, before2] = await Promise.all( + [repo0, repo1, repo2].map(repo => repo.getConfig('atomGithub.test')), + ); + + assert.notInclude([before0, before1, before2], value0); + + await repo2.setConfig('atomGithub.test', value0, {global: true}); + + const [after0, after1, after2] = await Promise.all( + [repo0, repo1, repo2].map(repo => repo.getConfig('atomGithub.test')), + ); + + assert.strictEqual(after0, value0); + assert.strictEqual(after1, value0); + assert.strictEqual(after2, value0); + + await repo0.setConfig('atomGithub.test', value1, {global: true}); + + const [final0, final1, final2] = await Promise.all( + [repo0, repo1, repo2].map(repo => repo.getConfig('atomGithub.test')), + ); + + assert.strictEqual(final0, value1); + assert.strictEqual(final1, value1); + assert.strictEqual(final2, value1); + }); + }); }); diff --git a/test/views/actionable-review-view.test.js b/test/views/actionable-review-view.test.js index 0c5474cec0..598ad362e0 100644 --- a/test/views/actionable-review-view.test.js +++ b/test/views/actionable-review-view.test.js @@ -69,17 +69,17 @@ describe('ActionableReviewView', function() { } it("opens the content object's URL with 'Open on GitHub'", async function() { - sinon.stub(shell, 'openExternal').callsArg(2); + sinon.stub(shell, 'openExternal').callsFake(() => {}); const item = triggerMenu({url: 'https://github.com'}, {}).items.find(i => i.label === 'Open on GitHub'); await item.click(); - assert.isTrue(shell.openExternal.calledWith('https://github.com', {})); + assert.isTrue(shell.openExternal.calledWith('https://github.com')); assert.isTrue(reporterProxy.addEvent.calledWith('open-comment-in-browser')); }); it("rejects the promise when 'Open on GitHub' fails", async function() { - sinon.stub(shell, 'openExternal').callsArgWith(2, new Error("I don't feel like it")); + sinon.stub(shell, 'openExternal').throws(new Error("I don't feel like it")); const item = triggerMenu({url: 'https://github.com'}, {}).items.find(i => i.label === 'Open on GitHub'); await assert.isRejected(item.click()); @@ -87,7 +87,7 @@ describe('ActionableReviewView', function() { }); it('opens a prepopulated abuse-reporting link with "Report abuse"', async function() { - sinon.stub(shell, 'openExternal').callsArg(2); + sinon.stub(shell, 'openExternal').callsFake(() => {}); const item = triggerMenu({url: 'https://github.com/a/b'}, {login: 'tyrion'}) .items.find(i => i.label === 'Report abuse'); @@ -95,13 +95,12 @@ describe('ActionableReviewView', function() { assert.isTrue(shell.openExternal.calledWith( 'https://github.com/contact/report-content?report=tyrion&content_url=https%3A%2F%2Fgithub.com%2Fa%2Fb', - {}, )); assert.isTrue(reporterProxy.addEvent.calledWith('report-abuse')); }); it("rejects the promise when 'Report abuse' fails", async function() { - sinon.stub(shell, 'openExternal').callsArgWith(2, new Error('nah')); + sinon.stub(shell, 'openExternal').throws(new Error('nah')); const item = triggerMenu({url: 'https://github.com/a/b'}, {login: 'tyrion'}) .items.find(i => i.label === 'Report abuse'); diff --git a/test/views/commit-detail-view.test.js b/test/views/commit-detail-view.test.js index ca5166333b..f94b91c16e 100644 --- a/test/views/commit-detail-view.test.js +++ b/test/views/commit-detail-view.test.js @@ -61,8 +61,7 @@ describe('CommitDetailView', function() { it('renders commit details properly', function() { const commit = commitBuilder() .sha('420') - .authorEmail('very@nice.com') - .authorName('Forthe Win') + .addAuthor('very@nice.com', 'Forthe Win') .authorDate(moment().subtract(2, 'days').unix()) .messageSubject('subject') .messageBody('body') @@ -83,9 +82,9 @@ describe('CommitDetailView', function() { it('renders multiple avatars for co-authored commit', function() { const commit = commitBuilder() - .authorEmail('blaze@it.com') - .addCoAuthor('two', 'two@coauthor.com') - .addCoAuthor('three', 'three@coauthor.com') + .addAuthor('blaze@it.com', 'blaze') + .addCoAuthor('two@coauthor.com', 'two') + .addCoAuthor('three@coauthor.com', 'three') .build(); const wrapper = shallow(buildApp({commit})); assert.deepEqual( @@ -100,7 +99,7 @@ describe('CommitDetailView', function() { it('handles noreply email addresses', function() { const commit = commitBuilder() - .authorEmail('1234+username@users.noreply.github.com') + .addAuthor('1234+username@users.noreply.github.com', 'noreply') .build(); const wrapper = shallow(buildApp({commit})); @@ -161,8 +160,7 @@ describe('CommitDetailView', function() { describe('when there are no co-authors', function() { it('returns only the author', function() { const commit = commitBuilder() - .authorName('Steven Universe') - .authorEmail('steven@universe.com') + .addAuthor('steven@universe.com', 'Steven Universe') .build(); const wrapper = shallow(buildApp({commit})); assert.strictEqual(wrapper.instance().getAuthorInfo(), 'Steven Universe'); @@ -172,8 +170,8 @@ describe('CommitDetailView', function() { describe('when there is one co-author', function() { it('returns author and the co-author', function() { const commit = commitBuilder() - .authorName('Ruby') - .addCoAuthor('Sapphire', 'sapphire@thecrystalgems.party') + .addAuthor('ruby@universe.com', 'Ruby') + .addCoAuthor('sapphire@thecrystalgems.party', 'Sapphire') .build(); const wrapper = shallow(buildApp({commit})); assert.strictEqual(wrapper.instance().getAuthorInfo(), 'Ruby and Sapphire'); @@ -183,9 +181,9 @@ describe('CommitDetailView', function() { describe('when there is more than one co-author', function() { it('returns the author and number of co-authors', function() { const commit = commitBuilder() - .authorName('Amethyst') - .addCoAuthor('Peridot', 'peri@youclods.horse') - .addCoAuthor('Pearl', 'p@pinkhair.club') + .addAuthor('amethyst@universe.com', 'Amethyst') + .addCoAuthor('peri@youclods.horse', 'Peridot') + .addCoAuthor('p@pinkhair.club', 'Pearl') .build(); const wrapper = shallow(buildApp({commit})); assert.strictEqual(wrapper.instance().getAuthorInfo(), 'Amethyst and 2 others'); diff --git a/test/views/directory-select.test.js b/test/views/directory-select.test.js index 8e27125111..b371ccd426 100644 --- a/test/views/directory-select.test.js +++ b/test/views/directory-select.test.js @@ -24,7 +24,7 @@ describe('DirectorySelect', function() { {}} + showOpenDialog={() => Promise.resolve()} tabGroup={new TabGroup()} {...override} /> @@ -47,7 +47,7 @@ describe('DirectorySelect', function() { describe('clicking the directory button', function() { it('populates the destination path buffer on accept', async function() { - const showOpenDialog = sinon.stub().callsArgWith(2, ['/some/directory/path']); + const showOpenDialog = sinon.stub().returns(Promise.resolve({filePaths: ['/some/directory/path']})); const buffer = new TextBuffer({text: '/original'}); const wrapper = shallow(buildApp({showOpenDialog, buffer})); @@ -58,7 +58,7 @@ describe('DirectorySelect', function() { }); it('leaves the destination path buffer unmodified on cancel', async function() { - const showOpenDialog = sinon.stub().callsArgWith(2, undefined); + const showOpenDialog = sinon.stub().returns(Promise.resolve({filePaths: []})); const buffer = new TextBuffer({text: '/original'}); const wrapper = shallow(buildApp({showOpenDialog, buffer})); diff --git a/test/views/git-identity-view.test.js b/test/views/git-identity-view.test.js new file mode 100644 index 0000000000..153953f327 --- /dev/null +++ b/test/views/git-identity-view.test.js @@ -0,0 +1,70 @@ +import React from 'react'; +import {mount} from 'enzyme'; +import {TextBuffer} from 'atom'; + +import GitIdentityView from '../../lib/views/git-identity-view'; + +describe('GitIdentityView', function() { + function buildApp(override = {}) { + return ( + {}} + setGlobal={() => {}} + close={() => {}} + {...override} + /> + ); + } + + it('displays buffers for username and email entry', function() { + const usernameBuffer = new TextBuffer(); + const emailBuffer = new TextBuffer(); + + const wrapper = mount(buildApp({usernameBuffer, emailBuffer})); + + function getEditor(placeholderText) { + return wrapper.find(`AtomTextEditor[placeholderText="${placeholderText}"]`); + } + + assert.strictEqual(getEditor('name').prop('buffer'), usernameBuffer); + assert.strictEqual(getEditor('email address').prop('buffer'), emailBuffer); + }); + + it('disables the local repo button when canWriteLocal is false', function() { + const wrapper = mount(buildApp({canWriteLocal: false})); + + assert.isTrue(wrapper.find('.btn').filterWhere(each => /this repository/.test(each.text())).prop('disabled')); + }); + + it('triggers a callback when "Use for this repository" is clicked', function() { + const setLocal = sinon.spy(); + const wrapper = mount(buildApp({setLocal})); + + wrapper.find('.btn').filterWhere(each => /this repository/.test(each.text())).simulate('click'); + + assert.isTrue(setLocal.called); + }); + + it('triggers a callback when "Use for all repositories" is clicked', function() { + const setGlobal = sinon.spy(); + const wrapper = mount(buildApp({setGlobal})); + + wrapper.find('.btn').filterWhere(each => /all repositories/.test(each.text())).simulate('click'); + + assert.isTrue(setGlobal.called); + }); + + it('triggers a callback when "Cancel" is clicked', function() { + const usernameBuffer = new TextBuffer({text: 'Me'}); + const emailBuffer = new TextBuffer({text: 'me@email.com'}); + const close = sinon.spy(); + const wrapper = mount(buildApp({usernameBuffer, emailBuffer, close})); + + wrapper.find('.btn').filterWhere(each => /Cancel/.test(each.text())).simulate('click'); + + assert.isTrue(close.called); + }); +}); diff --git a/test/views/git-tab-header-view.test.js b/test/views/git-tab-header-view.test.js new file mode 100644 index 0000000000..464306fda2 --- /dev/null +++ b/test/views/git-tab-header-view.test.js @@ -0,0 +1,122 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import path from 'path'; +import {nullAuthor} from '../../lib/models/author'; + +import GitTabHeaderView from '../../lib/views/git-tab-header-view'; + +describe('GitTabHeaderView', function() { + function *createWorkdirs(workdirs) { + for (const workdir of workdirs) { + yield workdir; + } + } + + function build(options = {}) { + const props = { + committer: nullAuthor, + workdir: null, + workdirs: createWorkdirs([]), + contextLocked: false, + changingWorkDir: false, + changingLock: false, + handleAvatarClick: () => {}, + handleWorkDirSelect: () => {}, + handleLockToggle: () => {}, + ...options, + }; + return shallow(); + } + + describe('with a select listener and paths', function() { + let wrapper, select; + const path1 = path.normalize('test/path/project1'); + const path2 = path.normalize('2nd-test/path/project2'); + const paths = [path1, path2]; + + beforeEach(function() { + select = sinon.spy(); + wrapper = build({ + handleWorkDirSelect: select, + workdirs: createWorkdirs(paths), + workdir: path2, + }); + }); + + it('renders an option for all given working directories', function() { + wrapper.find('option').forEach(function(node, index) { + assert.strictEqual(node.props().value, paths[index]); + assert.strictEqual(node.children().text(), path.basename(paths[index])); + }); + }); + + it('selects the current working directory\'s path', function() { + assert.strictEqual(wrapper.find('select').props().value, path2); + }); + + it('calls handleWorkDirSelect on select', function() { + wrapper.find('select').simulate('change', {target: {value: path1}}); + assert.isTrue(select.calledWith({target: {value: path1}})); + }); + }); + + it('triggers the handler callback on avatar button click', function() { + const handleAvatarClick = sinon.spy(); + const wrapper = build({handleAvatarClick}); + + wrapper.find('.github-Project-avatarBtn').simulate('click'); + assert.isTrue(handleAvatarClick.called); + }); + + describe('context lock control', function() { + it('renders locked when the lock is engaged', function() { + const wrapper = build({contextLocked: true}); + + assert.isTrue(wrapper.exists('Octicon[icon="lock"]')); + }); + + it('renders unlocked when the lock is disengaged', function() { + const wrapper = build({contextLocked: false}); + + assert.isTrue(wrapper.exists('Octicon[icon="unlock"]')); + }); + + it('calls handleLockToggle when the lock is clicked', function() { + const handleLockToggle = sinon.spy(); + const wrapper = build({handleLockToggle}); + + wrapper.find('.github-Project-lock').simulate('click'); + assert.isTrue(handleLockToggle.called); + }); + }); + + describe('when changes are in progress', function() { + it('disables the workdir select while the workdir is changing', function() { + const wrapper = build({changingWorkDir: true}); + + assert.isTrue(wrapper.find('select').prop('disabled')); + }); + + it('disables the context lock toggle while the context lock is changing', function() { + const wrapper = build({changingLock: true}); + + assert.isTrue(wrapper.find('.github-Project-lock').prop('disabled')); + }); + }); + + describe('with falsish props', function() { + let wrapper; + + beforeEach(function() { + wrapper = build(); + }); + + it('renders no options', function() { + assert.isFalse(wrapper.find('select').children().exists()); + }); + + it('renders an avatar placeholder', function() { + assert.strictEqual(wrapper.find('img.github-Project-avatar').prop('src'), 'atom://github/img/avatar.svg'); + }); + }); +}); diff --git a/test/views/git-tab-view.test.js b/test/views/git-tab-view.test.js index 7498b38045..ec3f99fc30 100644 --- a/test/views/git-tab-view.test.js +++ b/test/views/git-tab-view.test.js @@ -1,5 +1,6 @@ import React from 'react'; import {shallow, mount} from 'enzyme'; +import {TextBuffer} from 'atom'; import {cloneRepository, buildRepository} from '../helpers'; import GitTabView from '../../lib/views/git-tab-view'; @@ -221,6 +222,20 @@ describe('GitTabView', function() { }); }); + it('renders the identity panel when requested', async function() { + const usernameBuffer = new TextBuffer(); + const emailBuffer = new TextBuffer(); + const wrapper = shallow(await buildApp({ + editingIdentity: true, + usernameBuffer, + emailBuffer, + })); + + assert.isTrue(wrapper.exists('GitIdentityView')); + assert.strictEqual(wrapper.find('GitIdentityView').prop('usernameBuffer'), usernameBuffer); + assert.strictEqual(wrapper.find('GitIdentityView').prop('emailBuffer'), emailBuffer); + }); + it('selects a staging item', async function() { const wrapper = mount(await buildApp({ unstagedChanges: [{filePath: 'aaa.txt', status: 'modified'}], @@ -286,7 +301,7 @@ describe('GitTabView', function() { it('calls changeWorkingDirectory when a project is selected', async function() { const changeWorkingDirectory = sinon.spy(); const wrapper = shallow(await buildApp({changeWorkingDirectory})); - wrapper.find('TabHeaderView').prop('handleWorkDirSelect')({target: {value: 'some-path'}}); + wrapper.find('GitTabHeaderController').prop('changeWorkingDirectory')('some-path'); assert.isTrue(changeWorkingDirectory.calledWith('some-path')); }); }); diff --git a/test/views/github-dotcom-markdown.test.js b/test/views/github-dotcom-markdown.test.js index d8aa347f7e..a34ad96296 100644 --- a/test/views/github-dotcom-markdown.test.js +++ b/test/views/github-dotcom-markdown.test.js @@ -140,6 +140,7 @@ describe('GithubDotcomMarkdown', function() { }); it('opens item in pane and activates accordingly', async function() { + atom.workspace = {open: () => {}}; sinon.stub(atom.workspace, 'open').returns(Promise.resolve()); const issueishLink = wrapper.getDOMNode().querySelector('a.issue-link'); @@ -213,7 +214,7 @@ describe('GithubDotcomMarkdown', function() { }); it('records event for opening issueish in browser', async function() { - sinon.stub(shell, 'openExternal').callsArg(2); + sinon.stub(shell, 'openExternal').callsFake(() => {}); sinon.stub(reporterProxy, 'addEvent'); const issueishLink = wrapper.getDOMNode().querySelector('a.issue-link'); @@ -228,7 +229,7 @@ describe('GithubDotcomMarkdown', function() { }); it('does not record event if opening issueish in browser fails', function() { - sinon.stub(shell, 'openExternal').callsArgWith(2, new Error('oh noes')); + sinon.stub(shell, 'openExternal').throws(new Error('oh noes')); sinon.stub(reporterProxy, 'addEvent'); // calling `handleClick` directly rather than dispatching event so that we can catch the error thrown and prevent errors in the console diff --git a/test/views/github-tab-header-view.test.js b/test/views/github-tab-header-view.test.js new file mode 100644 index 0000000000..882d92f43e --- /dev/null +++ b/test/views/github-tab-header-view.test.js @@ -0,0 +1,109 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import path from 'path'; +import {nullAuthor} from '../../lib/models/author'; + +import GithubTabHeaderView from '../../lib/views/github-tab-header-view'; + +describe('GithubTabHeaderView', function() { + function *createWorkdirs(workdirs) { + for (const workdir of workdirs) { + yield workdir; + } + } + + function build(options = {}) { + const props = { + user: nullAuthor, + workdir: null, + workdirs: createWorkdirs([]), + contextLocked: false, + changingWorkDir: false, + changingLock: false, + handleWorkDirChange: () => {}, + handleLockToggle: () => {}, + ...options, + }; + return shallow(); + } + + describe('with a select listener and paths', function() { + let wrapper, select; + const path1 = path.normalize('test/path/project1'); + const path2 = path.normalize('2nd-test/path/project2'); + const paths = [path1, path2]; + + beforeEach(function() { + select = sinon.spy(); + wrapper = build({handleWorkDirChange: select, workdirs: createWorkdirs(paths), workdir: path2}); + }); + + it('renders an option for all given working directories', function() { + wrapper.find('option').forEach(function(node, index) { + assert.strictEqual(node.props().value, paths[index]); + assert.strictEqual(node.children().text(), path.basename(paths[index])); + }); + }); + + it('selects the current working directory\'s path', function() { + assert.strictEqual(wrapper.find('select').props().value, path2); + }); + + it('calls handleWorkDirSelect on select', function() { + wrapper.find('select').simulate('change', {target: {value: path1}}); + assert.isTrue(select.calledWith({target: {value: path1}})); + }); + }); + + describe('context lock control', function() { + it('renders locked when the lock is engaged', function() { + const wrapper = build({contextLocked: true}); + + assert.isTrue(wrapper.exists('Octicon[icon="lock"]')); + }); + + it('renders unlocked when the lock is disengaged', function() { + const wrapper = build({contextLocked: false}); + + assert.isTrue(wrapper.exists('Octicon[icon="unlock"]')); + }); + + it('calls handleLockToggle when the lock is clicked', function() { + const handleLockToggle = sinon.spy(); + const wrapper = build({handleLockToggle}); + + wrapper.find('button').simulate('click'); + assert.isTrue(handleLockToggle.called); + }); + }); + + describe('when changes are in progress', function() { + it('disables the workdir select while the workdir is changing', function() { + const wrapper = build({changingWorkDir: true}); + + assert.isTrue(wrapper.find('select').prop('disabled')); + }); + + it('disables the context lock toggle while the context lock is changing', function() { + const wrapper = build({changingLock: true}); + + assert.isTrue(wrapper.find('button').prop('disabled')); + }); + }); + + describe('with falsish props', function() { + let wrapper; + + beforeEach(function() { + wrapper = build(); + }); + + it('renders no options', function() { + assert.isFalse(wrapper.find('select').children().exists()); + }); + + it('renders an avatar placeholder', function() { + assert.strictEqual(wrapper.find('img.github-Project-avatar').prop('src'), 'atom://github/img/avatar.svg'); + }); + }); +}); diff --git a/test/views/github-tab-view.test.js b/test/views/github-tab-view.test.js index 928cd4134d..b29bc50acb 100644 --- a/test/views/github-tab-view.test.js +++ b/test/views/github-tab-view.test.js @@ -8,10 +8,10 @@ import RemoteSet from '../../lib/models/remote-set'; import Branch, {nullBranch} from '../../lib/models/branch'; import BranchSet from '../../lib/models/branch-set'; import GitHubTabView from '../../lib/views/github-tab-view'; -import {InMemoryStrategy} from '../../lib/shared/keytar-strategy'; -import GithubLoginModel from '../../lib/models/github-login-model'; +import {DOTCOM} from '../../lib/models/endpoint'; import RefHolder from '../../lib/models/ref-holder'; import Refresher from '../../lib/models/refresher'; +import {UNAUTHENTICATED, INSUFFICIENT} from '../../lib/shared/keytar-strategy'; import {buildRepository, cloneRepository} from '../helpers'; @@ -31,26 +31,35 @@ describe('GitHubTabView', function() { return ( []} + changeWorkingDirectory={() => {}} + contextLocked={false} + setContextLock={() => {}} repository={repo} - branches={new BranchSet()} - currentBranch={nullBranch} + remotes={new RemoteSet()} currentRemote={nullRemote} manyRemotesAvailable={false} - pushInProgress={false} isLoading={false} + branches={new BranchSet()} + currentBranch={nullBranch} + pushInProgress={false} + handleLogin={() => {}} + handleLogout={() => {}} + handleTokenRetry={() => {}} + handleWorkDirSelect={() => {}} handlePushBranch={() => {}} handleRemoteSelect={() => {}} - changeWorkingDirectory={() => {}} onDidChangeWorkDirs={() => {}} - getCurrentWorkDirs={() => []} openCreateDialog={() => {}} openBoundPublishDialog={() => {}} openCloneDialog={() => {}} @@ -61,6 +70,30 @@ describe('GitHubTabView', function() { ); } + it('renders a LoadingView if the token is still loading', function() { + const wrapper = shallow(buildApp({token: null})); + assert.isTrue(wrapper.exists('LoadingView')); + }); + + it('renders a login view if the token is missing or incorrect', function() { + const wrapper = shallow(buildApp({token: UNAUTHENTICATED})); + assert.isTrue(wrapper.exists('GithubLoginView')); + }); + + it('renders a login view with a custom message if the token has insufficient scopes', function() { + const wrapper = shallow(buildApp({token: INSUFFICIENT})); + assert.isTrue(wrapper.exists('GithubLoginView')); + assert.isTrue(wrapper.find('GithubLoginView').exists('p')); + }); + + it('renders an error view if there was an error acquiring the token', function() { + const e = new Error('oh no'); + e.rawStack = e.stack; + const wrapper = shallow(buildApp({token: e})); + assert.isTrue(wrapper.exists('QueryErrorView')); + assert.strictEqual(wrapper.find('QueryErrorView').prop('error'), e); + }); + it('renders a LoadingView if data is still loading', function() { const wrapper = shallow(buildApp({isLoading: true})); assert.isTrue(wrapper.find('LoadingView').exists()); @@ -122,9 +155,10 @@ describe('GitHubTabView', function() { }); it('calls changeWorkingDirectory when a project is selected', function() { + const currentRemote = new Remote('aaa', 'git@github.com:aaa/bbb.git'); const changeWorkingDirectory = sinon.spy(); - const wrapper = shallow(buildApp({changeWorkingDirectory})); - wrapper.find('TabHeaderView').prop('handleWorkDirSelect')({target: {value: 'some-path'}}); + const wrapper = shallow(buildApp({currentRemote, changeWorkingDirectory})); + wrapper.find('GithubTabHeaderContainer').prop('changeWorkingDirectory')('some-path'); assert.isTrue(changeWorkingDirectory.calledWith('some-path')); }); }); diff --git a/test/views/issue-detail-view.test.js b/test/views/issue-detail-view.test.js index f211660cf2..6b6d54dfed 100644 --- a/test/views/issue-detail-view.test.js +++ b/test/views/issue-detail-view.test.js @@ -3,6 +3,7 @@ import {shallow} from 'enzyme'; import {BareIssueDetailView} from '../../lib/views/issue-detail-view'; import EmojiReactionsController from '../../lib/controllers/emoji-reactions-controller'; +import IssueTimelineController from '../../lib/controllers/issue-timeline-controller'; import {issueDetailViewProps} from '../fixtures/props/issueish-pane-props'; import * as reporterProxy from '../../lib/reporter-proxy'; import {GHOST_USER} from '../../lib/helpers'; @@ -50,8 +51,8 @@ describe('IssueDetailView', function() { assert.lengthOf(wrapper.find(EmojiReactionsController), 1); - assert.isNotNull(wrapper.find('ForwardRef(Relay(IssueishTimelineView))').prop('issue')); - assert.notOk(wrapper.find('ForwardRef(Relay(IssueishTimelineView))').prop('pullRequest')); + assert.isNotNull(wrapper.find(IssueTimelineController).prop('issue')); + assert.notOk(wrapper.find(IssueTimelineController).prop('pullRequest')); }); it('displays ghost author if author is null', function() { diff --git a/test/views/recent-commits-view.test.js b/test/views/recent-commits-view.test.js index a5b4c69e5e..06b412784e 100644 --- a/test/views/recent-commits-view.test.js +++ b/test/views/recent-commits-view.test.js @@ -79,7 +79,7 @@ describe('RecentCommitsView', function() { const commits = ['thr&ee@z.com', 'two@y.com', 'one@x.com'].map((authorEmail, i) => { return commitBuilder() .sha(`1111111111${i}`) - .authorEmail(authorEmail) + .addAuthor(authorEmail, authorEmail) .build(); }); @@ -98,9 +98,9 @@ describe('RecentCommitsView', function() { it('renders multiple avatars for co-authored commits', function() { const commits = [ commitBuilder() - .authorEmail('thr&ee@z.com') - .addCoAuthor('One', 'two@y.com') - .addCoAuthor('Two', 'one@x.com') + .addAuthor('thr&ee@z.com', 'thr&ee') + .addCoAuthor('two@y.com', 'One') + .addCoAuthor('one@x.com', 'Two') .build(), ]; diff --git a/test/views/tab-header-view.test.js b/test/views/tab-header-view.test.js deleted file mode 100644 index 442cb558fb..0000000000 --- a/test/views/tab-header-view.test.js +++ /dev/null @@ -1,95 +0,0 @@ -import React from 'react'; -import {shallow} from 'enzyme'; -import path from 'path'; - -import TabHeaderView from '../../lib/views/tab-header-view'; - -describe('TabHeaderView', function() { - function build(options = {}) { - const props = { - currentWorkDir: undefined, - onDidChangeWorkDirs: undefined, - handleWorkDirSelect: undefined, - getCurrentWorkDirs: () => [], - ...options, - }; - return shallow(); - } - - describe('with a select listener and paths', function() { - let wrapper, select; - const path1 = path.normalize('test/path/project1'); - const path2 = path.normalize('2nd-test/path/project2'); - const paths = [path1, path2]; - - beforeEach(function() { - select = sinon.spy(); - wrapper = build({handleWorkDirSelect: select, getCurrentWorkDirs: () => paths, currentWorkDir: path2}); - }); - - it('renders an option for all given working directories', function() { - wrapper.find('option').forEach(function(node, index) { - assert.strictEqual(node.props().value, paths[index]); - assert.strictEqual(node.children().text(), path.basename(paths[index])); - }); - }); - - it('selects the current working directory\'s path', function() { - assert.strictEqual(wrapper.find('select').props().value, path2); - }); - - it('calls handleWorkDirSelect on select', function() { - wrapper.find('select').simulate('change', {target: {value: path1}}); - assert.isTrue(select.calledWith({target: {value: path1}})); - }); - - it('updates paths', function() { - const path3 = 'test3/path/project3'; - paths.push(path3); - wrapper.instance().updateWorkDirs(); - assert.strictEqual(wrapper.find('option').length, 3); - }); - }); - - describe('with onDidChangeWorkDirs', function() { - let wrapper, changeSpy, disposeSpy; - - beforeEach(function() { - disposeSpy = sinon.spy(); - const stub = sinon.stub().callsFake(function(updateWorkDirs) { - updateWorkDirs(); - return {dispose: disposeSpy}; - }); - changeSpy = sinon.spy(stub); - wrapper = build({onDidChangeWorkDirs: changeSpy}); - }); - - it('calls onDidChangeWorkDirs with updateWorkDirs', function() { - assert.isTrue(changeSpy.calledWith(wrapper.instance().updateWorkDirs)); - }); - - it('calls dispose on unmount', function() { - wrapper.unmount(); - assert.isTrue(disposeSpy.called); - }); - - it('does nothing on unmount without a disposable', function() { - wrapper.instance().disposable = undefined; - wrapper.unmount(); - assert.isFalse(disposeSpy.called); - }); - - }); - - describe('with no paths', function() { - let wrapper; - - beforeEach(function() { - wrapper = build(); - }); - - it('renders no options', function() { - assert.isTrue(wrapper.find('select').children().isEmpty()); - }); - }); -}); diff --git a/test/views/timeline-items/commit-comment-thread-view.test.js b/test/views/timeline-items/commit-comment-thread-view.test.js index 7c1248288e..f6959579e7 100644 --- a/test/views/timeline-items/commit-comment-thread-view.test.js +++ b/test/views/timeline-items/commit-comment-thread-view.test.js @@ -2,6 +2,7 @@ import React from 'react'; import {shallow} from 'enzyme'; import {BareCommitCommentThreadView} from '../../../lib/views/timeline-items/commit-comment-thread-view'; +import CommitCommentView from '../../../lib/views/timeline-items/commit-comment-view'; import {createCommitCommentThread} from '../../fixtures/factories/commit-comment-thread-results'; describe('CommitCommentThreadView', function() { @@ -24,7 +25,7 @@ describe('CommitCommentThreadView', function() { ], })); - const commentViews = wrapper.find('ForwardRef(Relay(BareCommitCommentView))'); + const commentViews = wrapper.find(CommitCommentView); assert.deepEqual(commentViews.map(c => c.prop('item').author.login), ['user0', 'user1', 'user2']); diff --git a/test/views/timeline-items/cross-referenced-events-view.test.js b/test/views/timeline-items/cross-referenced-events-view.test.js index ed678e91e0..cc934cfd2c 100644 --- a/test/views/timeline-items/cross-referenced-events-view.test.js +++ b/test/views/timeline-items/cross-referenced-events-view.test.js @@ -2,6 +2,7 @@ import React from 'react'; import {shallow} from 'enzyme'; import {BareCrossReferencedEventsView} from '../../../lib/views/timeline-items/cross-referenced-events-view'; +import CrossReferencedEventView from '../../../lib/views/timeline-items/cross-referenced-event-view'; import {createCrossReferencedEventResult} from '../../fixtures/factories/cross-referenced-event-result'; describe('CrossReferencedEventsView', function() { @@ -15,7 +16,7 @@ describe('CrossReferencedEventsView', function() { it('renders a child component for each grouped child event', function() { const wrapper = shallow(buildApp({nodeOpts: [{}, {}, {}]})); - assert.lengthOf(wrapper.find('ForwardRef(Relay(BareCrossReferencedEventView))'), 3); + assert.lengthOf(wrapper.find(CrossReferencedEventView), 3); }); it('generates a summary based on a single pull request cross-reference', function() { diff --git a/test/worker-manager.test.js b/test/worker-manager.test.js index 3c96eba874..515d54c1d7 100644 --- a/test/worker-manager.test.js +++ b/test/worker-manager.test.js @@ -151,23 +151,25 @@ describe('WorkerManager', function() { it('destroys all the renderer processes that were created', async function() { this.retries(5); // FLAKE - const browserWindow = new BrowserWindow({show: !!process.env.ATOM_GITHUB_SHOW_RENDERER_WINDOW}); + const browserWindow = new BrowserWindow({show: !!process.env.ATOM_GITHUB_SHOW_RENDERER_WINDOW, webPreferences: {nodeIntegration: true, enableRemoteModule: true}}); browserWindow.loadURL('about:blank'); sinon.stub(Worker.prototype, 'getWebContentsId').returns(browserWindow.webContents.id); const script = ` const ipc = require('electron').ipcRenderer; - ipc.on('${Worker.channelName}', function() { - const args = Array.prototype.slice.apply(arguments) - args.shift(); - - args.unshift('${Worker.channelName}'); - args.unshift(${remote.getCurrentWebContents().id}) - ipc.sendTo.apply(ipc, args); - }); + (function() { + ipc.on('${Worker.channelName}', function() { + const args = Array.prototype.slice.apply(arguments) + args.shift(); + + args.unshift('${Worker.channelName}'); + args.unshift(${remote.getCurrentWebContents().id}) + ipc.sendTo.apply(ipc, args); + }); + })() `; - await new Promise(resolve => browserWindow.webContents.executeJavaScript(script, resolve)); + await browserWindow.webContents.executeJavaScript(script); workerManager.destroy(true); workerManager = new WorkerManager();