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 bf5f715749..7b29ad2527 100644 --- a/actions/schema-up/package-lock.json +++ b/actions/schema-up/package-lock.json @@ -1794,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", @@ -1962,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", diff --git a/actions/schema-up/package.json b/actions/schema-up/package.json index 6e9dc98944..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", + "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/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 9b7810582b..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.""" @@ -14667,602 +15798,14 @@ type Ref implements Node { labels: [String!] """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 + headRefName: String - """A nuget package.""" - NUGET + """The base ref name to filter the pull requests by.""" + baseRefName: String - """A python package.""" - PYTHON -} + """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,6 +18064,9 @@ 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! @@ -17481,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! @@ -17499,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.""" @@ -17518,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.""" @@ -17555,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 @@ -17653,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.""" @@ -17679,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 @@ -17778,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 @@ -17802,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""" @@ -17906,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. """ @@ -17920,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.""" @@ -17940,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 @@ -17968,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. """ @@ -17978,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. """ @@ -18048,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.""" @@ -18103,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""" @@ -18164,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! @@ -18225,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! @@ -18242,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.""" @@ -18264,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.""" @@ -18342,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 @@ -18611,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 @@ -18677,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 { @@ -18699,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 @@ -18789,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 { @@ -18862,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! @@ -18940,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 } """ @@ -19035,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 { @@ -19106,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! @@ -19349,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.""" @@ -19378,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.""" @@ -19431,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""" @@ -19439,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 @@ -19504,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! @@ -19691,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.""" @@ -19722,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] @@ -19744,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 @@ -19761,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 { """ @@ -19814,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! @@ -19827,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.""" @@ -19978,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 @@ -21201,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.""" @@ -21236,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.""" @@ -21338,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! @@ -21350,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.""" @@ -21484,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.""" @@ -21493,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 @@ -21500,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.""" @@ -21532,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.""" @@ -21614,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 @@ -21736,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.""" @@ -22319,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.""" @@ -22372,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 @@ -22496,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 @@ -22725,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. """ @@ -22877,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""" @@ -22884,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. """ @@ -22906,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 @@ -22976,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.""" @@ -22993,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. """ @@ -23129,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""" @@ -23200,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 @@ -23300,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.""" @@ -23354,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 @@ -23375,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.""" @@ -23406,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! @@ -23421,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""" @@ -23432,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 @@ -23573,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/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__/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__/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__/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/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 index 8bab9d4e8f..17224df13f 100644 --- a/lib/containers/github-tab-header-container.js +++ b/lib/containers/github-tab-header-container.js @@ -2,18 +2,17 @@ import React from 'react'; import PropTypes from 'prop-types'; import {QueryRenderer, graphql} from 'react-relay'; -import {EndpointPropType} from '../prop-types'; +import {EndpointPropType, TokenPropType} from '../prop-types'; import RelayNetworkLayerManager from '../relay-network-layer-manager'; import {UNAUTHENTICATED, INSUFFICIENT} from '../shared/keytar-strategy'; -import ObserveModel from '../views/observe-model'; import Author, {nullAuthor} from '../models/author'; import GithubTabHeaderController from '../controllers/github-tab-header-controller'; export default class GithubTabHeaderContainer extends React.Component { static propTypes = { // Connection - loginModel: PropTypes.object.isRequired, endpoint: EndpointPropType.isRequired, + token: TokenPropType, // Workspace currentWorkDir: PropTypes.string, @@ -27,24 +26,16 @@ export default class GithubTabHeaderContainer extends React.Component { } render() { - return ( - - {this.renderWithToken} - - ); - } - - renderWithToken = token => { if ( - token == null - || token instanceof Error - || token === UNAUTHENTICATED - || token === INSUFFICIENT + 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, token); + const environment = RelayNetworkLayerManager.getEnvironmentForHost(this.props.endpoint, this.props.token); const query = graphql` query githubTabHeaderContainerQuery { viewer { @@ -61,12 +52,12 @@ export default class GithubTabHeaderContainer extends React.Component { environment={environment} variables={{}} query={query} - render={result => this.renderWithResult(result)} + render={this.renderWithResult} /> ); } - renderWithResult({error, props}) { + renderWithResult = ({error, props}) => { if (error || props === null) { return this.renderNoResult(); } @@ -108,8 +99,4 @@ export default class GithubTabHeaderContainer extends React.Component { /> ); } - - fetchToken = loginModel => { - return loginModel.getToken(this.props.endpoint.getLoginAccount()); - } } 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/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 070abd08e5..d34d42723f 100644 --- a/lib/controllers/git-tab-controller.js +++ b/lib/controllers/git-tab-controller.js @@ -2,6 +2,7 @@ import path from 'path'; import React from 'react'; import PropTypes from 'prop-types'; +import {TextBuffer} from 'atom'; import GitTabView from '../views/git-tab-view'; import UserStore from '../models/user-store'; @@ -9,7 +10,6 @@ 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 = { @@ -20,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, @@ -33,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, @@ -60,12 +63,6 @@ export default class GitTabController extends React.Component { 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; @@ -76,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, @@ -85,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(), @@ -259,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]); @@ -275,7 +301,7 @@ 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; } @@ -287,7 +313,7 @@ export default class GitTabController extends React.Component { return null; } - async abortMerge() { + abortMerge = async () => { const choice = this.props.confirm({ message: 'Abort merge', detailedMessage: 'Are you sure?', @@ -309,7 +335,7 @@ export default class GitTabController extends React.Component { } } - async resolveAsOurs(paths) { + resolveAsOurs = async paths => { if (this.props.fetchInProgress) { return; } @@ -319,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; } @@ -329,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 index 78d4b8f5b7..1e149bb38f 100644 --- a/lib/controllers/git-tab-header-controller.js +++ b/lib/controllers/git-tab-header-controller.js @@ -16,6 +16,7 @@ export default class GitTabHeaderController extends React.Component { setContextLock: PropTypes.func.isRequired, // Event Handlers + onDidClickAvatar: PropTypes.func.isRequired, onDidChangeWorkDirs: PropTypes.func.isRequired, onDidUpdateRepo: PropTypes.func.isRequired, } @@ -73,6 +74,7 @@ export default class GitTabHeaderController extends React.Component { changingLock={this.state.changingLock !== null} // Event Handlers + handleAvatarClick={this.props.onDidClickAvatar} handleWorkDirSelect={this.handleWorkDirSelect} handleLockToggle={this.handleLockToggle} /> diff --git a/lib/controllers/github-tab-controller.js b/lib/controllers/github-tab-controller.js index ea63951897..5d7a33010e 100644 --- a/lib/controllers/github-tab-controller.js +++ b/lib/controllers/github-tab-controller.js @@ -2,23 +2,30 @@ 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, @@ -35,21 +42,11 @@ 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/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/git-shell-out-strategy.js b/lib/git-shell-out-strategy.js index 9048e63dcd..b56cdcd641 100644 --- a/lib/git-shell-out-strategy.js +++ b/lib/git-shell-out-strategy.js @@ -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 f0c88c6c99..99aa8fb59c 100644 --- a/lib/github-package.js +++ b/lib/github-package.js @@ -549,6 +549,29 @@ export default class GithubPackage { * projects and pane items. */ 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. @@ -574,7 +597,8 @@ export default class GithubPackage { const workdirs = new Set( await Promise.all( Array.from(candidatePaths, async candidatePath => { - const workdir = (await this.workdirCache.find(candidatePath)) || 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) { @@ -582,6 +606,7 @@ export default class GithubPackage { } else if (candidatePath === this.project.getPaths()[0]) { firstProjectWorkdir = workdir; } + return workdir; }), ), @@ -593,7 +618,17 @@ export default class GithubPackage { // 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) { - const stateContext = this.contextPool.getContext(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); + } + + const stateContext = this.contextPool.getContext(useWorkdir); if (stateContext.isPresent()) { return stateContext; } diff --git a/lib/models/author.js b/lib/models/author.js index 947347ad06..2e1e7e9f10 100644 --- a/lib/models/author.js +++ b/lib/models/author.js @@ -5,12 +5,14 @@ export const NO_REPLY_GITHUB_EMAIL = 'noreply@github.com'; export default class Author { constructor(email, fullName, login = null, isNew = null, avatarUrl = null) { if (avatarUrl == null) { - const match = email.match(/^(\d+)\+[^@]+@users.noreply.github.com$/); + const match = (email || '').match(/^(\d+)\+[^@]+@users.noreply.github.com$/); if (match) { avatarUrl = 'https://avatars.githubusercontent.com/u/' + match[1] + '?s=32'; - } else { + } else if (email && email !== '') { avatarUrl = 'https://avatars.githubusercontent.com/u/e?email=' + encodeURIComponent(email) + '&s=32'; + } else { + avatarUrl = ''; } } 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 29fc33f8e1..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; 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/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/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 index 7189782236..b6b0f960be 100644 --- a/lib/views/git-tab-header-view.js +++ b/lib/views/git-tab-header-view.js @@ -17,6 +17,7 @@ export default class GitTabHeaderView extends React.Component { changingLock: PropTypes.bool.isRequired, // Event Handlers + handleAvatarClick: PropTypes.func, handleWorkDirSelect: PropTypes.func, handleLockToggle: PropTypes.func, } @@ -60,11 +61,13 @@ export default class GitTabHeaderView extends React.Component { const name = this.props.committer.getFullName(); return ( - {`${name}'s + ); } } diff --git a/lib/views/git-tab-view.js b/lib/views/git-tab-view.js index 93c7fa46a0..e149010a1f 100644 --- a/lib/views/git-tab-view.js +++ b/lib/views/git-tab-view.js @@ -4,6 +4,7 @@ import cx from 'classnames'; import {CompositeDisposable} from 'atom'; import StagingView from './staging-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'; @@ -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, @@ -94,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() && @@ -133,6 +143,7 @@ export default class GitTabView extends React.Component { setContextLock={this.props.setContextLock} // Event Handlers + onDidClickAvatar={this.props.toggleIdentityEditor} onDidChangeWorkDirs={this.props.onDidChangeWorkDirs} onDidUpdateRepo={repository.onDidUpdate.bind(repository)} /> @@ -253,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-view.js b/lib/views/github-tab-view.js index 266bf4c93a..904defddb9 100644 --- a/lib/views/github-tab-view.js +++ b/lib/views/github-tab-view.js @@ -2,18 +2,20 @@ 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 GithubTabHeaderContainer from '../containers/github-tab-header-container'; -import GithubTabHeaderController from '../controllers/github-tab-header-controller'; 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 {nullAuthor} from '../models/author'; +import {UNAUTHENTICATED, INSUFFICIENT} from '../shared/keytar-strategy'; export default class GitHubTabView extends React.Component { static propTypes = { @@ -21,7 +23,8 @@ export default class GitHubTabView extends React.Component { rootHolder: RefHolderPropType.isRequired, // Connection - loginModel: GithubLoginModelPropType.isRequired, + endpoint: EndpointPropType.isRequired, + token: TokenPropType, // Workspace workspace: PropTypes.object.isRequired, @@ -43,6 +46,9 @@ export default class GitHubTabView extends React.Component { pushInProgress: 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, @@ -65,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 ; } @@ -92,22 +127,22 @@ export default class GitHubTabView extends React.Component { return ( this.props.handlePushBranch(this.props.currentBranch, this.props.currentRemote)} /> ); @@ -130,29 +165,11 @@ export default class GitHubTabView extends React.Component { } renderHeader() { - if (this.props.currentRemote.isPresent()) { - return ( - this.props.changeWorkingDirectory(e.target.value)} - onDidChangeWorkDirs={this.props.onDidChangeWorkDirs} - /> - ); - } return ( - { - 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/worker-manager.js b/lib/worker-manager.js index 409a1085e6..17b9588191 100644 --- a/lib/worker-manager.js +++ b/lib/worker-manager.js @@ -268,7 +268,7 @@ export class RendererProcess { this.onExecStarted = onExecStarted; this.win = new BrowserWindow({show: !!process.env.ATOM_GITHUB_SHOW_RENDERER_WINDOW, - webPreferences: {nodeIntegration: true}}); + webPreferences: {nodeIntegration: true, enableRemoteModule: true}}); this.webContents = this.win.webContents; // this.webContents.openDevTools(); diff --git a/package-lock.json b/package-lock.json index 425dc51546..cafe6d2056 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,9 @@ { "name": "github", - "version": "0.34.2", + "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", @@ -128,21 +122,9 @@ } }, "@babel/compat-data": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.1.tgz", - "integrity": "sha512-Z+6ZOXvyOWYxJ50BwxzdhRnRsGST8Y3jaZgxYig575lTjVSs3KtJnmESwZegg6e2Dn0td1eDhoWlp1wI4BTCPw==", - "requires": { - "browserslist": "^4.8.2", - "invariant": "^2.2.4", - "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==" - } - } + "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", @@ -218,21 +200,21 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.0.tgz", - "integrity": "sha512-KbBloNiBHM3ZyHg1ViDRs4QcnAunwMJ+rLpAEA8l3cWb3Z1xof7ag1iHvX16EwhUfaTG3+YSvTRPv4xHIrseUQ==", + "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.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" }, "dependencies": { "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "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" } } @@ -370,14 +352,13 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.1.tgz", - "integrity": "sha512-Fsrljg8DHSdnKSzC0YFopX7lseRpVfWMYuC1Dnvf7tw972E2KDjZ4XEaqjO9aJL0sLcG4KNRXxowDxHYIcZ+Cw==", - "requires": { - "@babel/compat-data": "^7.8.1", - "browserslist": "^4.8.2", - "invariant": "^2.2.4", - "levenary": "^1.1.0", + "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/compat-data": "^7.12.5", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.14.5", "semver": "^5.5.0" }, "dependencies": { @@ -521,12 +502,33 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.0.tgz", - "integrity": "sha512-vJj2hPbxxLUWJEV86iZiac5curAnC3ZVc+rFmFeWZigUOcuCPpbF+KxoEmxrkmuCGylHFF9t4lkpcDUcxnhQ5g==", + "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-regex": "^7.8.0", - "regexpu-core": "^4.6.0" + "@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.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-define-map": { @@ -591,96 +593,20 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.0.tgz", - "integrity": "sha512-w4mRQqKAh4M7BSLwvDMm8jYFroEzpqMCtXDhFHP+kNjMIQWpbC6b0Q/RUQsJNSf54rIx6XMdci1Stf60DWw+og==", + "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/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/types": "^7.12.1" }, "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.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.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" - } - }, - "@babel/helper-get-function-arity": { - "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.8.0" - } - }, - "@babel/helper-split-export-declaration": { - "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": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", - "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" - } - }, - "@babel/traverse": { - "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" - } - }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "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" } } @@ -843,119 +769,41 @@ "@babel/helper-plugin-utils": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", - "dev": true + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" }, "@babel/helper-regex": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.0.tgz", - "integrity": "sha512-haD8fRsPtyFZkbtxBIaGBBHRtbn0YsyecdYrxNgO0Bl6SlGokJPQX9M2tDuVbeQBYHZVLUPMSwGQn4obHevsMQ==", + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.0.tgz", - "integrity": "sha512-+aKyBd4oHAaIZgOLq/uLjkUz7ExZ0ppdNBc8Qr72BmtKNAy3A6EJa/ifjj0//CIzQtUDPs3E6HjKM2cV6bnXsQ==", + "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.8.0", - "@babel/helper-wrap-function": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" }, "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-annotate-as-pure": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.0.tgz", - "integrity": "sha512-WWj+1amBdowU2g18p3/KUc1Y5kWnaNm1paohq2tT4/RreeMNssYkv6ul9wkE2iIqjwLBwNMZGH4pTGlMSUqMMg==", - "requires": { - "@babel/types": "^7.8.0" - } - }, - "@babel/helper-function-name": { - "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.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" - } - }, - "@babel/helper-get-function-arity": { - "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.8.0" - } - }, - "@babel/helper-split-export-declaration": { - "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==", + "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": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", - "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" - } - }, - "@babel/traverse": { - "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" + "@babel/types": "^7.10.4" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "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" } } @@ -1110,6 +958,26 @@ } } }, + "@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/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": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", @@ -1118,99 +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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.0.tgz", - "integrity": "sha512-2j6idN2jt8Y+8nJ4UPN/6AZa53DAkcETMVmroJQh50qZc59PuQKVjgOIIqmrLoQf6Ia9bs90MHRcID1OW5tfag==", + "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.8.0", - "@babel/template": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@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.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==", + "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.8.0" + "@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.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==", + "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.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.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.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==", + "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.8.0" + "@babel/types": "^7.10.4" } }, "@babel/helper-split-export-declaration": { - "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==", + "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.8.0" + "@babel/types": "^7.11.0" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "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", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "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.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "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", + "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" + "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "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" } } @@ -1242,19 +1130,19 @@ "integrity": "sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==" }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.0.tgz", - "integrity": "sha512-8vIQf8JYced7gCeKDsGETNGKE+zdD/JmP1LBlRn+w3UXc1aSpZv2Y330bB/fnOEbUgPbuFv+IEi+gopg+Fu0kQ==", + "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.8.0", - "@babel/helper-remap-async-to-generator": "^7.8.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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==" + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" } } }, @@ -1275,50 +1163,98 @@ } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.0.tgz", - "integrity": "sha512-YzMq0AqeTR4Mh2pz3GrCWqhcEV38HgUMMR/56/YR5GPc4Y2p1KJ4Le6j92vMnW8TJqVj+qJz/KDNglpMeww9Yg==", + "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.8.0", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^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==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.0.tgz", - "integrity": "sha512-pSpuhwn926vtNeUH2FHx1OzIXaUMgklG0MzlFZJVEg37fB904gOxN572NgBae+KDwFyZDpkLMyEkVA011lBJrQ==", + "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.8.0", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-json-strings": "^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==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.0.tgz", - "integrity": "sha512-cQMI+RQdcK2IyMm13NKKFCYfOSBUtFxEeRBOdFCi2Pubv/CpkrCubc/ikdeKMT6Lu+uQ+lNSDEJvDCOQZkUy0g==", + "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.8.0", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^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==" + "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==" } } }, @@ -1347,65 +1283,216 @@ } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.0.tgz", - "integrity": "sha512-tHP3eez6TrpPJYttBZ/6uItRbIuXUIDpQ9xwvzKwR+RboWGMJ7WzFC5dDJ3vjLuCx0/DG1tM0MVkmgcBybth9w==", + "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.8.0", + "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-optional-catch-binding": "^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==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.0.tgz", - "integrity": "sha512-PNBHxPHE91m+LLOdGwlvyGicWfrMgiVwng5WdB3CMjd61+vn3vPw0GbgECIAUCZnyi7Jqs5htUIZRztGuV8/5g==", + "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.8.0", + "@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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.0.tgz", - "integrity": "sha512-3oK0Qt5w4arb+es3rWBribDbtc0TYJP7dFZ1dXcYul3cXderqfIOoSx9YUC1oD208nJwJO/++fvrgLmkYSbe8A==", + "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.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" }, "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==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.0.tgz", - "integrity": "sha512-a8w8k7pK8nYhem07rXdAq03T+DlTX8LFojUptrh9JEx80AgLqGiuoFIyQOGTWif39kFnDOQqbzl1s6KQqrfV+A==", + "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.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==" + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" } } }, @@ -1419,17 +1506,32 @@ } }, "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.0.tgz", - "integrity": "sha512-Mx2RzpCHJaBfmFdA2abXDKRHVJdzJ6R0Wqwb6TxCgM7NRR5wcC4cyiAsRL7Ga+lwG8GG1cKvb+4ENjic8y15jA==", + "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.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==" + "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==" } } }, @@ -1443,17 +1545,17 @@ } }, "@babel/plugin-syntax-json-strings": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.0.tgz", - "integrity": "sha512-LPykaAbH86L5NnDfCRSpNxtEHZk+6GaFzXfWEFU/6R4v69EXQr6GOp7hwH+Uw0QlYVN++s6TukTJ3flFcspahA==", + "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.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==" + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" } } }, @@ -1466,18 +1568,48 @@ "@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.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.0.tgz", - "integrity": "sha512-Rv2hnBToN6rbA9hO2a4vtwXZLzNa+TWkoSIMMvUezFz5+D9NPeX7SFrArwtFzzbwndmWiqboTr5rNpzAz0MPpA==", + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==" + "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==" } } }, @@ -1491,47 +1623,47 @@ } }, "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.0.tgz", - "integrity": "sha512-EIgJVy+u1RvR2gJfX4ReLwAupO/twllUue1wPrRxhu18+eC3bGTEcOSXLQdaE9ya9NG1rE0eQs0GSiloUGFEwg==", + "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.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==" + "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.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.0.tgz", - "integrity": "sha512-LV1c+TTAO8Vawe3t+WXBHYWbS7endP8MSlqKPKEZOyWPEJX2akl3jfvFG828/OE7RpyoC3JXfLJDFj/jN7A8hg==", + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.0.tgz", - "integrity": "sha512-iXR/Cw32fMfWlD1sK2zD/nXtuLStkalRv+xee6VrX84CFrn2LKwb/EOs/4UaDNUpUsws8YZYKeQjPagacFquug==", + "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.8.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "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==" + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" } } }, @@ -1545,35 +1677,35 @@ } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.0.tgz", - "integrity": "sha512-9dvBvJnEdsDWYMrykoMyLNVRPGoub6SFlARtsYgSQ1riTjnyBjhctihSME4XsSku86F59PDeFpC9PCU+9I154w==", + "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.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-remap-async-to-generator": "^7.8.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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz", - "integrity": "sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ==", + "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.8.0" + "@babel/types": "^7.12.5" } }, "@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==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "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" } } @@ -1692,49 +1824,49 @@ } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.0.tgz", - "integrity": "sha512-pq/XLkDB4MPvTe9ktHJInfWksalXogrIGRZJUG7RiDXhEfdNrlducoMPbACZQuCFtelVgVpD0VyreiY0l38G7g==", + "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.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" }, "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==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.0.tgz", - "integrity": "sha512-REtYWvpP4TDw4oVeP01vQJcAeewjgk8/i7tPFP11vUjvarUGGyxJLeq79WEnIdnKPQJirZaoDRT4kEWEdSWkDw==", + "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.8.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "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==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.0.tgz", - "integrity": "sha512-vaDgF3gPLzVcoe3UZqnra6FA7O797sZc+UCHPd9eQTI34cPtpCA270LzopIXS3Fhc3UmFrijLmre9mHTmUKVgg==", + "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.8.0", - "@babel/helper-plugin-utils": "^7.8.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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==" + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" } } }, @@ -1836,100 +1968,181 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.0.tgz", - "integrity": "sha512-mFr1O3TaDL4XozM3AzNPz9AsxzzjTxwn4aOShYP5TlO+4rufvjagV2KKDTPMZTQm1ZA/C/PxJDsDekEnnUGz5A==", + "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.8.0", - "@babel/helper-plugin-utils": "^7.8.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.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==", + "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.8.0" + "@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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz", - "integrity": "sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ==", + "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.8.0" + "@babel/types": "^7.12.5" } }, "@babel/helper-module-transforms": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.0.tgz", - "integrity": "sha512-fvGhX4FY7YwRdWW/zfddNaKpYl8TaA8hvwONIYhv1/a1ZbgxbTrjsmH6IGWUgUNki7QzbpZ27OEh88sZdft3YA==", + "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.8.0", - "@babel/helper-simple-access": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0", - "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.0.tgz", - "integrity": "sha512-I+7yKZJnxp7VIC2UFzXfVjLiJuU16rYFF59x27c+boINkO/pLETgZcoesCryg9jmU4jxEa0foFueW+2wjc9Gsw==", + "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.8.0", - "@babel/types": "^7.8.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { - "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==", + "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.8.0" + "@babel/types": "^7.11.0" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "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", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "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.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@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.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "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" + } } } }, @@ -1946,229 +2159,384 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.0.tgz", - "integrity": "sha512-tKF9KLiIsiKyWTVU0yo+NcNAylGn7euggYwXw63/tMxGtDTPsB9Y7Ecqv4EoXEwtoJOJ0Lewf17oaWQtindxIA==", + "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.8.0", - "@babel/helper-module-transforms": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@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.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==", + "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.8.0" + "@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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.0.tgz", - "integrity": "sha512-jDl66KvuklTXUADcoXDMur1jDtAZUZZkzLIaQ54+z38ih8C0V0hC56hMaoVoyoxN60MwQmmrHctBwcLqP0c/Lw==", + "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.8.0" + "@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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz", - "integrity": "sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ==", + "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.8.0" + "@babel/types": "^7.12.5" } }, "@babel/helper-module-transforms": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.0.tgz", - "integrity": "sha512-fvGhX4FY7YwRdWW/zfddNaKpYl8TaA8hvwONIYhv1/a1ZbgxbTrjsmH6IGWUgUNki7QzbpZ27OEh88sZdft3YA==", + "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.8.0", - "@babel/helper-simple-access": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0", - "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.0.tgz", - "integrity": "sha512-I+7yKZJnxp7VIC2UFzXfVjLiJuU16rYFF59x27c+boINkO/pLETgZcoesCryg9jmU4jxEa0foFueW+2wjc9Gsw==", + "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.8.0", - "@babel/types": "^7.8.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { - "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==", + "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.8.0" + "@babel/types": "^7.11.0" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "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", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "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.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@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.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "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-umd": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.0.tgz", - "integrity": "sha512-lAwNfXwmfTy7fl2XOyoVpMXnLkJANgH0vdSYNFcS4RuJPBtHfunGA+Y0L7wsHmfPzyVYt8sUglLjaWtdZMNJNg==", + "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-module-transforms": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" }, "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==", + "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.8.0" + "@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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz", - "integrity": "sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ==", + "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.8.0" + "@babel/types": "^7.12.5" } }, "@babel/helper-module-transforms": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.0.tgz", - "integrity": "sha512-fvGhX4FY7YwRdWW/zfddNaKpYl8TaA8hvwONIYhv1/a1ZbgxbTrjsmH6IGWUgUNki7QzbpZ27OEh88sZdft3YA==", + "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.8.0", - "@babel/helper-simple-access": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0", - "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.0.tgz", - "integrity": "sha512-I+7yKZJnxp7VIC2UFzXfVjLiJuU16rYFF59x27c+boINkO/pLETgZcoesCryg9jmU4jxEa0foFueW+2wjc9Gsw==", + "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.8.0", - "@babel/types": "^7.8.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { - "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==", + "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.8.0" + "@babel/types": "^7.11.0" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "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", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "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.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@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.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "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-named-capturing-groups-regex": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.0.tgz", - "integrity": "sha512-kq1rxQ1HviCP13SMGZ4WjBBpdogTGK7yn/g/+p+g1AQledgHOWKVeMY1DwKYGlGJ/grDGTOqpJLF1v3Sb7ghKA==", + "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.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.12.1" } }, "@babel/plugin-transform-new-target": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.0.tgz", - "integrity": "sha512-hH1Afz9Xy/wkcxhoI0vYw48kTBJqYUhMmhp3SLI1p817iByM6ItH4LS8tZatDAIKmAQAXj8d3Ups1BgVJECDrA==", + "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.8.0" + "@babel/helper-plugin-utils": "^7.10.4" }, - "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==" + "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==" } } }, @@ -2304,25 +2672,25 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.0.tgz", - "integrity": "sha512-n88GT8PZuOHWxqxCJORW3g1QaYzQhHu5sEslxYeQkHVoewfnfuWN37t7YGaRLaNUdaZUlRPXhDcLGT7zBa/u0g==", + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.0.tgz", - "integrity": "sha512-DnshRyDTXZhmAgO2c1QKZI4CfZjoP2t3fSwRsnbCP9P/FSBpf9I7ovnAELswklw5OeY+/D/JIiaGLoUt2II3LA==", + "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.8.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "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==" + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" } } }, @@ -2345,18 +2713,18 @@ } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.0.tgz", - "integrity": "sha512-uksok0Bqox8YeIRFhr6RRtlBXeGpN1ogiEVjEd7A7rVLPZBXKGbL7kODpE7MQ+avjDLv5EEKtDCeYuWZK7FF7g==", + "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.8.0", - "@babel/helper-regex": "^7.8.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" }, "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==" + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" } } }, @@ -2371,33 +2739,48 @@ } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.0.tgz", - "integrity": "sha512-rEUBEFzsA9mCS2r7EtXFlM/6GqtzgLdC4WVYM9fIgJX+HcSJ8oMmj8LinfKhbo0ipRauvUM2teE2iNDNqDwO1g==", + "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.8.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "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==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.0.tgz", - "integrity": "sha512-qDg8wsnE47B/Sj8ZtOndPHrGBxJMssZJ71SzXrItum9n++iVFN7kYuJO+OHhjom7+/or0zzYqvJNzCkUjyNKqg==", + "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.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" }, "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==" + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" } } }, @@ -2412,412 +2795,459 @@ } }, "@babel/preset-env": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.2.tgz", - "integrity": "sha512-AF2YUl2bGsLWTtFL68upTTB7nDo05aEcKjHmXJE+aXRvsx5K+9yRsHQP3MjnTrLOWe/eFyUr93dfILROsKC4eg==", - "requires": { - "@babel/compat-data": "^7.8.0", - "@babel/helper-compilation-targets": "^7.8.0", - "@babel/helper-module-imports": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-proposal-async-generator-functions": "^7.8.0", - "@babel/plugin-proposal-dynamic-import": "^7.8.0", - "@babel/plugin-proposal-json-strings": "^7.8.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-proposal-object-rest-spread": "^7.8.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.0", - "@babel/plugin-proposal-optional-chaining": "^7.8.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.0", + "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.8.0", - "@babel/plugin-transform-arrow-functions": "^7.8.0", - "@babel/plugin-transform-async-to-generator": "^7.8.0", - "@babel/plugin-transform-block-scoped-functions": "^7.8.0", - "@babel/plugin-transform-block-scoping": "^7.8.0", - "@babel/plugin-transform-classes": "^7.8.0", - "@babel/plugin-transform-computed-properties": "^7.8.0", - "@babel/plugin-transform-destructuring": "^7.8.0", - "@babel/plugin-transform-dotall-regex": "^7.8.0", - "@babel/plugin-transform-duplicate-keys": "^7.8.0", - "@babel/plugin-transform-exponentiation-operator": "^7.8.0", - "@babel/plugin-transform-for-of": "^7.8.0", - "@babel/plugin-transform-function-name": "^7.8.0", - "@babel/plugin-transform-literals": "^7.8.0", - "@babel/plugin-transform-member-expression-literals": "^7.8.0", - "@babel/plugin-transform-modules-amd": "^7.8.0", - "@babel/plugin-transform-modules-commonjs": "^7.8.0", - "@babel/plugin-transform-modules-systemjs": "^7.8.0", - "@babel/plugin-transform-modules-umd": "^7.8.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.0", - "@babel/plugin-transform-new-target": "^7.8.0", - "@babel/plugin-transform-object-super": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.8.0", - "@babel/plugin-transform-property-literals": "^7.8.0", - "@babel/plugin-transform-regenerator": "^7.8.0", - "@babel/plugin-transform-reserved-words": "^7.8.0", - "@babel/plugin-transform-shorthand-properties": "^7.8.0", - "@babel/plugin-transform-spread": "^7.8.0", - "@babel/plugin-transform-sticky-regex": "^7.8.0", - "@babel/plugin-transform-template-literals": "^7.8.0", - "@babel/plugin-transform-typeof-symbol": "^7.8.0", - "@babel/plugin-transform-unicode-regex": "^7.8.0", - "@babel/types": "^7.8.0", - "browserslist": "^4.8.2", + "@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", - "invariant": "^2.2.2", - "levenary": "^1.1.0", "semver": "^5.5.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==", + "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.8.0" + "@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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.0.tgz", - "integrity": "sha512-WWj+1amBdowU2g18p3/KUc1Y5kWnaNm1paohq2tT4/RreeMNssYkv6ul9wkE2iIqjwLBwNMZGH4pTGlMSUqMMg==", + "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.8.0" + "@babel/types": "^7.10.4" } }, - "@babel/helper-call-delegate": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.0.tgz", - "integrity": "sha512-Vi8K1LScr8ZgLicfuCNSE7JWUPG/H/9Bw9zn+3vQyy4vA54FEGTCuUTOXCFwmBM93OD6jHfjrQ6ZnivM5U+bHg==", + "@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-hoist-variables": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.0.tgz", - "integrity": "sha512-Go06lUlZ4YImNEmdyAH5iO38yh5mbpOPSwA2PtV1vyczFhTZfX0OtzkiIL2pACo6AOYf89pLh42nhhDrqgzC3A==", + "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.8.0", - "@babel/types": "^7.8.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.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==", + "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.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.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.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.8.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.0.tgz", - "integrity": "sha512-jDl66KvuklTXUADcoXDMur1jDtAZUZZkzLIaQ54+z38ih8C0V0hC56hMaoVoyoxN60MwQmmrHctBwcLqP0c/Lw==", + "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.8.0" + "@babel/types": "^7.10.4" } }, "@babel/helper-member-expression-to-functions": { - "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==", + "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.8.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-imports": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz", - "integrity": "sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ==", + "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.8.0" + "@babel/types": "^7.12.5" } }, "@babel/helper-module-transforms": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.0.tgz", - "integrity": "sha512-fvGhX4FY7YwRdWW/zfddNaKpYl8TaA8hvwONIYhv1/a1ZbgxbTrjsmH6IGWUgUNki7QzbpZ27OEh88sZdft3YA==", + "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.8.0", - "@babel/helper-simple-access": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0", - "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.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==", + "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.8.0" + "@babel/types": "^7.10.4" } }, "@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==" + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.0.tgz", - "integrity": "sha512-R2CyorW4tcO3YzdkClLpt6MS84G+tPkOi0MmiCn1bvYVnmDpdl9R15XOi3NQW2mhOAEeBnuQ4g1Bh7pT2sX8fg==", + "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.8.0", - "@babel/helper-optimise-call-expression": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.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.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.0.tgz", - "integrity": "sha512-I+7yKZJnxp7VIC2UFzXfVjLiJuU16rYFF59x27c+boINkO/pLETgZcoesCryg9jmU4jxEa0foFueW+2wjc9Gsw==", + "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.8.0", - "@babel/types": "^7.8.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { - "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==", + "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.8.0" + "@babel/types": "^7.11.0" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "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", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==" + "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.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==", + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.0.tgz", - "integrity": "sha512-9KfteDp9d8cF388dxFMOh3Dum41qpOVUPVjQhXGd1kPyQBE05FJgYndiAriML2yhMIbZ2bjgweh2nnvBXDH2MQ==", + "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.8.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.0.tgz", - "integrity": "sha512-bim6gUfHq2kPN+aQst33ZEMeglpaUXAo6PWTZvOA8BOnWpNKgZcUzBvpZhh2ofL6YhZgzGoRwVVfzwynDEf47g==", + "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.8.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.0.tgz", - "integrity": "sha512-FKTK4hzg7W950Yu9iqMl12WBixCmusMc5HBt3/ErvpFLnvr3/6mu/EBTZoCEJ0mw/lQUDfU01vTcZY9oEahlMg==", + "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.8.0", - "lodash": "^4.17.13" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-classes": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.0.tgz", - "integrity": "sha512-18RLDwKtGXCLLbf5V03GojebPH7dKYCmIBqQGhgfZDoYsyEzR9kMZ6IxlJP72K5ROC9ADa4KPI6ywuh7NfQOgQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.0", - "@babel/helper-define-map": "^7.8.0", - "@babel/helper-function-name": "^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", + "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.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.0.tgz", - "integrity": "sha512-FaODHuQRdnWFVwxLPlTN85Lk/aitfvQBHTXahf58FnatCynfhkeNUO8ID+AqAxY4IJsZjeH6OnKDzcGfgKJcVw==", + "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.8.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-destructuring": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.0.tgz", - "integrity": "sha512-D+69HT//cE86aBTLULzSBFLC5A7HcPQzJPiny6P4SLHkDF750MylRKO3iWvdgvb+OSp5dOrOxwXajvaxk1ZfYA==", + "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.8.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-for-of": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.0.tgz", - "integrity": "sha512-9j9g0qViCAo8E5qCBSaQdghymn7A9bRXSfS9jU7oLpYccYFZg9A+1KO8X+HV7fhJYH6mZ+e7MRg4p3sLo+RG6Q==", + "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.8.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.0.tgz", - "integrity": "sha512-YL8Ol54UKeIyY1uUGfry+B9ppXAB3aVBB1gG9gxqhg/OBCPpV2QUNswmjvfmyXEdaWv8qODssBgX7on792h44w==", + "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.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-literals": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.0.tgz", - "integrity": "sha512-7UDPKG+uVltsZt98Hw+rMbLg772r8fQC6YJ2fNDckcpAXgIWqQbMCmCpfYo0hBNhdhqocM73auk4P/zziQshQw==", + "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.8.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.0.tgz", - "integrity": "sha512-lJSdaWR56wmrosCiyqKFRVnLrFYoVAk2mtZAyegt7akeJky/gguv0Rukx9GV3XwHGuM1ZPE06cZMjNlcLp8LrQ==", + "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.8.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.0.tgz", - "integrity": "sha512-w2g8tmL7NgBYt6alc8YawMcmPiYqnVvvI0kLB++VOUOssqdJMAkfQOMGV+2M8H5uhJYDaAghAVMUYps3s+jMrw==", + "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.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-simple-access": "^7.8.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.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.0.tgz", - "integrity": "sha512-2DYqQ811nRlFVlni6iqfxBVVGqkBgfvEv/lcvmdNu2CaG+EA7zSP1hqYUsqamR+uCdDbsrV7uY6/0rkXbJo5YQ==", + "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.8.0", - "@babel/helper-replace-supers": "^7.8.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1" } }, "@babel/plugin-transform-parameters": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.0.tgz", - "integrity": "sha512-9R2yykk7H92rntETO0fq52vJ4OFaTcDA49K9s8bQPyoD4o3/SkWEklukArCsQC6fowEuraPkH/umopr9uO539g==", + "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-call-delegate": "^7.8.0", - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-property-literals": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.0.tgz", - "integrity": "sha512-vjZaQlojnZIahu5ofEW+hPJfDI5A6r2Sbi5C0RuCaAOFj7viDIR5kOR7ul3Fz5US8V1sVk5Zd2yuPaz7iBeysg==", + "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.8.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.0.tgz", - "integrity": "sha512-sExhzq63Gl2PMbl7ETpN7Z1A38rLD6GeCT6EEEIIKjTVt9u6dRqJ6nHhaquL7QgR3egj/8fcvq23UvzfPqGAYA==", + "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.8.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-spread": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.0.tgz", - "integrity": "sha512-6Zjl0pv6x10YmFVRI0VhwJ/rE++geVHNJ9xwd+UIt3ON2VMRO7qI2lPsyLnzidR5HYNd/JXj47kdU9Rrn4YcnQ==", + "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.8.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, "@babel/plugin-transform-template-literals": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.0.tgz", - "integrity": "sha512-EF7Q7LEgeMpogHcvmHMNXBWdLWG1tpA1ErXH3i8zTu3+UEKo6aBn+FldPAJ16UbbbOwSCUCiDP6oZxvVRPhwnQ==", + "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-annotate-as-pure": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "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.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "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", + "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" + "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "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", @@ -2825,6 +3255,30 @@ } } }, + "@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-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", @@ -2933,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", @@ -2983,41 +3473,42 @@ "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": { @@ -3034,6 +3525,12 @@ "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", @@ -3068,25 +3565,39 @@ "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": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "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": { @@ -3094,6 +3605,7 @@ "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", @@ -3108,12 +3620,20 @@ "dev": true }, "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "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.8.1" + "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": { @@ -3198,19 +3718,7 @@ "array-filter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "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=", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", "dev": true }, "array-includes": { @@ -3266,6 +3774,7 @@ "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" } @@ -3274,7 +3783,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "dev": true, + "optional": true }, "assertion-error": { "version": "1.1.0", @@ -3289,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": { @@ -3300,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": { @@ -3320,7 +3830,8 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "dev": true, + "optional": true }, "atob": { "version": "2.1.2", @@ -3332,13 +3843,15 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "dev": true, + "optional": true }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true + "dev": true, + "optional": true }, "axobject-query": { "version": "2.0.2", @@ -3418,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" } @@ -3655,11 +4169,18 @@ } } }, + "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" } @@ -3670,9 +4191,9 @@ "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" @@ -3684,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", @@ -3729,13 +4257,14 @@ "dev": true }, "browserslist": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz", - "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==", + "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.30001017", - "electron-to-chromium": "^1.3.322", - "node-releases": "^1.1.44" + "caniuse-lite": "^1.0.30001154", + "electron-to-chromium": "^1.3.585", + "escalade": "^3.1.1", + "node-releases": "^1.1.65" } }, "bser": { @@ -3747,6 +4276,16 @@ "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", @@ -3761,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", @@ -3856,34 +4395,17 @@ "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.30001020", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz", - "integrity": "sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA==" + "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=", - "dev": true + "dev": true, + "optional": true }, "chai": { "version": "4.2.0", @@ -4001,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": { @@ -4097,6 +4619,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" } @@ -4129,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": { @@ -4166,11 +4688,11 @@ "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==" }, "core-js-compat": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.3.tgz", - "integrity": "sha512-Y3YNGU3bU1yrnzVodop23ghArbKv4IqkZg9MMOWv/h7KT6NRk1/SzHhWDDlubg2+tlcUzAqgj1/GyeJ9fUKMeg==", + "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.8.3", + "browserslist": "^4.8.5", "semver": "7.0.0" }, "dependencies": { @@ -4288,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", @@ -4308,6 +4821,7 @@ "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" } @@ -4387,13 +4901,28 @@ "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": { @@ -4449,7 +4978,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "dev": true, + "optional": true }, "delegates": { "version": "1.0.0", @@ -4461,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", @@ -4525,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", @@ -4540,9 +5077,9 @@ } }, "dugite": { - "version": "1.88.2", - "resolved": "https://registry.npmjs.org/dugite/-/dugite-1.88.2.tgz", - "integrity": "sha512-wTo0Ul4yuAF4YS7ot6k4/bmVB0YKHSjSnlzk84qewoS7mknuQuPhOOnxfq1iQd6twgZm+RoMrbWHDRobnLuADg==", + "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", @@ -4562,96 +5099,82 @@ "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==", + "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": { - "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" + "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.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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.4.1", - "resolved": "https://registry.npmjs.org/electron-link/-/electron-link-0.4.1.tgz", - "integrity": "sha512-f0pcajkAedjwWmRxuXBn0nJvRO7jPX2qoxObvBl+OL0uK9O3lNr6LThRzJGhqnklJ1g3BuNonKTwQqGh9T0WTg==", - "dev": true, - "requires": { - "acorn": "^6.1.1", - "ast-util": "^0.6.0", - "encoding-down": "~5.0.0", - "indent-string": "^3.2.0", - "leveldown": "^5.4.1", - "levelup": "~3.0.0", - "recast": "^0.17.5", - "resolve": "^1.5.0", - "source-map": "^0.5.6" - } - }, "electron-mksnapshot": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/electron-mksnapshot/-/electron-mksnapshot-4.2.0.tgz", - "integrity": "sha512-QfzQuzyjwJX+jVVlSejElW9oEvG46s1eMxBRVCVGIw2Q1HLi6fQWKVdrLixeExkPZM7mDMfd/ncd4+rGlKKchA==", + "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" }, @@ -4679,9 +5202,9 @@ } }, "electron-to-chromium": { - "version": "1.3.332", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.332.tgz", - "integrity": "sha512-AP2HkLhfSOIxP7gDjlyZ4ywGWIcxRMZoU9+JriuVkQe2pSLDdWBsE6+eI6BQOqun1dohLrUTOPHsQLLhhFA7Eg==" + "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", @@ -4689,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", @@ -4698,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": { @@ -4725,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": { @@ -4843,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.7.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.7.2.tgz", - "integrity": "sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng==", + "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", @@ -4894,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" @@ -4911,19 +5445,25 @@ "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" } }, "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "requires": { "type-fest": "^0.8.1" @@ -4939,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 } } @@ -5043,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" } }, @@ -5062,28 +5602,20 @@ } }, "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" - }, - "dependencies": { - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "dev": true - } } }, "esprima": { @@ -5093,21 +5625,37 @@ "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": { @@ -5206,7 +5754,8 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "dev": true, + "optional": true }, "extend-shallow": { "version": "3.0.2", @@ -5306,31 +5855,35 @@ } }, "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" + } } } }, @@ -5338,13 +5891,15 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "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=", - "dev": true + "dev": true, + "optional": true }, "fast-glob": { "version": "2.2.7", @@ -5417,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" @@ -5515,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": { @@ -5552,13 +6107,15 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "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", @@ -5651,12 +6208,6 @@ "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", @@ -5687,6 +6238,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" } @@ -5736,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", @@ -5932,13 +6539,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "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" @@ -6025,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", @@ -6077,15 +6686,16 @@ } }, "http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-Z2EICWNJou7Tr9Bd2M2UqDJq3A9F2ePG9w3lIpjoyuSyXFP9QbniJVu3XQYytuw5ebmG7dXSXO9PgAjJG8DDKA==" + "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", @@ -6100,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", @@ -6113,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", @@ -6135,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": { @@ -6155,28 +6777,28 @@ "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": { @@ -6186,24 +6808,59 @@ "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/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": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "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.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -6213,34 +6870,24 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "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": "^5.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" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } + "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" } } } @@ -6249,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" } @@ -6359,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", @@ -6420,12 +7059,6 @@ "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", @@ -6465,13 +7098,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true + "dev": true, + "optional": true }, "is-windows": { "version": "1.0.2", @@ -6520,7 +7148,8 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "dev": true, + "optional": true }, "istanbul-lib-coverage": { "version": "2.0.5", @@ -6720,7 +7349,8 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "dev": true, + "optional": true }, "jsesc": { "version": "2.5.2", @@ -6741,7 +7371,8 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "dev": true, + "optional": true }, "json-schema-traverse": { "version": "0.4.1", @@ -6759,7 +7390,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "dev": true, + "optional": true }, "json5": { "version": "2.1.0", @@ -6782,6 +7414,7 @@ "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", @@ -6795,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": { @@ -6876,10 +7521,13 @@ } }, "level-codec": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.1.tgz", - "integrity": "sha512-ajFP0kJ+nyq4i6kptSM+mAvJKLOg1X5FiFPtLG9M5gCEZyBmgDi3FkDrvlMkEzrUn1cWxtvVmrvoS4ASyO/q+Q==", - "dev": true + "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", @@ -6897,14 +7545,39 @@ } }, "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 + } } }, "level-supports": { @@ -6925,9 +7598,9 @@ } }, "leveldown": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.4.1.tgz", - "integrity": "sha512-3lMPc7eU3yj5g+qF1qlALInzIYnkySIosR1AsUKFjL9D8fYbTLuENBAeDRZXIG4qeWOAyqRItOoLu2v2avWiMA==", + "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", @@ -6936,11 +7609,13 @@ }, "dependencies": { "abstract-leveldown": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.2.tgz", - "integrity": "sha512-/a+Iwj0rn//CX0EJOasNyZJd2o8xur8Ce9C57Sznti/Ilt/cb6Qd8/k98A4ZOklXgTG+iAYYUs1OTG0s1eH+zQ==", + "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" @@ -6949,30 +7624,18 @@ } }, "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" } }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levenary": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.0.tgz", - "integrity": "sha512-VHcwhO0UTpUW7rLPN2/OiWJdgA1e9BqEDALhrgCe/F+uUJnep6CoUsTzMeP8Rh0NGr9uKquXxqe7lwLZo509nQ==", - "requires": { - "leven": "^3.1.0" - } - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -6983,6 +7646,23 @@ "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", @@ -7011,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", @@ -7027,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", @@ -7058,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", @@ -7072,16 +7752,6 @@ "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", @@ -7144,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", @@ -7164,6 +7828,25 @@ "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", "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", @@ -7194,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", @@ -7357,13 +7932,15 @@ "version": "1.38.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", - "dev": true + "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" } @@ -7520,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", @@ -7686,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", @@ -7707,6 +8278,11 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "nan": { + "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", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -7783,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" } }, @@ -7837,9 +8413,9 @@ } }, "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": { @@ -7855,12 +8431,9 @@ "dev": true }, "node-releases": { - "version": "1.1.45", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.45.tgz", - "integrity": "sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg==", - "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", @@ -7892,6 +8465,17 @@ "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", @@ -7905,52 +8489,20 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "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 - } + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" } }, "nullthrows": { @@ -8190,7 +8742,8 @@ "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -8329,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" @@ -8448,6 +9001,12 @@ "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", @@ -8517,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" @@ -8572,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", @@ -8636,20 +9180,11 @@ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" }, - "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" - } - }, "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", @@ -8661,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", @@ -8689,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", @@ -8705,7 +9237,8 @@ "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==", - "dev": true + "dev": true, + "optional": true }, "pump": { "version": "2.0.1", @@ -8726,7 +9259,8 @@ "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "dev": true, + "optional": true }, "raf": { "version": "3.4.1", @@ -8887,23 +9421,17 @@ } }, "recast": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.17.6.tgz", - "integrity": "sha512-yoQRMRrK1lszNtbkGyM4kN45AwylV5hMiuEveUBlxytUViWevjvX6w+tzJt1LH4cfUhWt4NZvy3ThIhu6+m5wQ==", + "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.12.4", + "ast-types": "0.13.3", "esprima": "~4.0.0", "private": "^0.1.8", "source-map": "~0.6.1" }, "dependencies": { - "ast-types": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.12.4.tgz", - "integrity": "sha512-ky/YVYCbtVAS8TdMIaTiPFHwEpRB5z1hctepJplTr3UW5q8TDrpIMCILyk8pmLxGtn2KCtC/lSn7zOsaI7nzDw==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -8912,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" } @@ -8952,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": { @@ -8976,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.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.2.tgz", - "integrity": "sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q==", + "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" }, @@ -9331,20 +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", @@ -9437,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", @@ -9448,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", @@ -9463,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" @@ -9490,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", @@ -9503,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", @@ -9579,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==", + "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.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" + "@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" + } } } }, @@ -9828,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", @@ -9862,6 +10439,7 @@ "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", @@ -9944,59 +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.4.2", - "resolved": "https://registry.npmjs.org/superstring/-/superstring-2.4.2.tgz", - "integrity": "sha512-5Bld4dnN40BBSQ39HflbvMzMizEUExYYqErvXmV8b+iXdTA1T9N9PoxApi3BEup3UektvSjo1BkspXac7gJdMg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/superstring/-/superstring-2.4.4.tgz", + "integrity": "sha512-41LWIGzy6tkUM6jUwbXTeGOLui3gGBxgV6m8gIWRzv1WdW0HV6oANHdGanRrM04mwFXXExII9OQ/XxaqU+Ft9w==", "requires": { - "nan": "^2.13.2" - }, - "dependencies": { - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - } + "nan": "^2.14.2" } }, "supports-color": { @@ -10020,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" @@ -10037,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", @@ -10155,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", @@ -10293,6 +10787,7 @@ "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" @@ -10302,7 +10797,8 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "dev": true, + "optional": true } } }, @@ -10311,24 +10807,34 @@ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "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", @@ -10341,7 +10847,8 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "dev": true, + "optional": true }, "type-check": { "version": "0.3.2", @@ -10364,12 +10871,6 @@ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "ua-parser-js": { "version": "0.7.20", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz", @@ -10430,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", @@ -10496,6 +10997,17 @@ } } }, + "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", @@ -10542,6 +11054,12 @@ "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", @@ -10554,9 +11072,9 @@ "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": { @@ -10574,6 +11092,7 @@ "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", @@ -10594,12 +11113,12 @@ } }, "whats-my-line": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/whats-my-line/-/whats-my-line-0.1.2.tgz", - "integrity": "sha512-jK+i4OcQwx+uYwM+egF2CSyhYlPQLWs+hhGidFIZjNrrgZxQTp2bXmIxmstmj6kxX96pIH0DOyjrF6lrtVIDDA==", + "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.4.2", + "superstring": "^2.4.4", "what-the-diff": "^0.6.0" } }, @@ -10699,6 +11218,12 @@ "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", @@ -10872,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 cea807e833..c008cf5d55 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "github", "main": "./lib/index", - "version": "0.34.2", + "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,25 +41,26 @@ "dependencies": { "@atom/babel-plugin-chai-assert-async": "1.0.0", "@atom/babel7-transpiler": "1.0.0-1", + "@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.8.2", + "@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.88.2", + "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.8.0", - "moment": "2.24.0", + "moment": "2.28.0", "node-emoji": "1.10.0", "prop-types": "15.7.2", "react": "16.12.0", @@ -73,7 +75,7 @@ "underscore-plus": "1.7.0", "what-the-diff": "0.6.0", "what-the-status": "1.0.3", - "whats-my-line": "0.1.2", + "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.4.1", - "electron-mksnapshot": "^4.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.7.2", + "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/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 143cd6a5a8..22701ed318 100644 --- a/styles/project.less +++ b/styles/project.less @@ -11,10 +11,21 @@ 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 { 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 index db68e86492..296aecd885 100644 --- a/test/containers/github-tab-header-container.test.js +++ b/test/containers/github-tab-header-container.test.js @@ -4,18 +4,16 @@ import {QueryRenderer} from 'react-relay'; import GithubTabHeaderContainer from '../../lib/containers/github-tab-header-container'; import {queryBuilder} from '../builder/graphql/query'; -import GithubLoginModel from '../../lib/models/github-login-model'; -import {getEndpoint} from '../../lib/models/endpoint'; -import {InMemoryStrategy, INSUFFICIENT, UNAUTHENTICATED} from '../../lib/shared/keytar-strategy'; +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, model; + let atomEnv; beforeEach(function() { atomEnv = global.buildAtomEnvironment(); - model = new GithubLoginModel(InMemoryStrategy); }); afterEach(function() { @@ -25,65 +23,56 @@ describe('GithubTabHeaderContainer', function() { function buildApp(overrideProps = {}) { return ( {}} setContextLock={() => {}} getCurrentWorkDirs={() => new Set()} + onDidChangeWorkDirs={() => {}} {...overrideProps} /> ); } - it('renders a null user 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')({ - error: null, - props: null, - retry: () => {}, - }); - - assert.isFalse(resultWrapper.find('GithubTabHeaderController').prop('user').isPresent()); + 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()); - const tokenWrapper = wrapper.find('ObserveModel').renderProp('children')(UNAUTHENTICATED); - assert.isFalse(tokenWrapper.find('GithubTabHeaderController').prop('user').isPresent()); + 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()); - const tokenWrapper = wrapper.find('ObserveModel').renderProp('children')(INSUFFICIENT); - - assert.isFalse(tokenWrapper.find('GithubTabHeaderController').prop('user').isPresent()); + const wrapper = shallow(buildApp({token: INSUFFICIENT})); + assert.isFalse(wrapper.find('GithubTabHeaderController').prop('user').isPresent()); }); - it('renders a null user if the user is offline', function() { - sinon.spy(model, 'didUpdate'); + 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 e = new Error('oh no'); - const tokenWrapper = wrapper.find('ObserveModel').renderProp('children')(e); - assert.isFalse(tokenWrapper.find('GithubTabHeaderController').prop('user').isPresent()); + 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 tokenWrapper = wrapper.find('ObserveModel').renderProp('children')('1234'); - const props = queryBuilder(tabHeaderQuery) .viewer(v => { v.name('user'); @@ -92,7 +81,7 @@ describe('GithubTabHeaderContainer', function() { v.login('us3rh4nd13'); }) .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('GithubTabHeaderController'); assert.isTrue(controller.prop('user').isPresent()); 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 41fc53a2a6..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'); diff --git a/test/controllers/git-tab-header-controller.test.js b/test/controllers/git-tab-header-controller.test.js index d6619fedde..cda8e99706 100644 --- a/test/controllers/git-tab-header-controller.test.js +++ b/test/controllers/git-tab-header-controller.test.js @@ -20,6 +20,7 @@ describe('GitTabHeaderController', function() { changeWorkingDirectory: () => {}, contextLocked: false, setContextLock: () => {}, + onDidClickAvatar: () => {}, onDidChangeWorkDirs: () => new Disposable(), onDidUpdateRepo: () => new Disposable(), ...overrides, diff --git a/test/controllers/github-tab-controller.test.js b/test/controllers/github-tab-controller.test.js index c7be628195..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,12 +36,18 @@ 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()} @@ -60,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); }); }); @@ -139,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/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/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/fixtures/props/git-tab-props.js b/test/fixtures/props/git-tab-props.js index 8628000ecf..726f659f85 100644 --- a/test/fixtures/props/git-tab-props.js +++ b/test/fixtures/props/git-tab-props.js @@ -1,3 +1,5 @@ +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'; @@ -11,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, @@ -52,6 +56,7 @@ export async function gitTabControllerProps(atomEnv, repository, overrides = {}) mergeConflicts: await repository.getMergeConflicts(), workingDirectoryPath: repository.getWorkingDirectoryPath(), fetchInProgress: false, + repositoryDrift: false, ...overrides, }; @@ -67,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}), @@ -91,6 +99,10 @@ export async function gitTabViewProps(atomEnv, repository, overrides = {}) { project: atomEnv.project, tooltips: atomEnv.tooltips, + toggleIdentityEditor: () => {}, + closeIdentityEditor: () => {}, + setLocalIdentity: () => {}, + setGlobalIdentity: () => {}, openInitializeDialog: () => {}, abortMerge: () => {}, commit: () => {}, diff --git a/test/git-strategies.test.js b/test/git-strategies.test.js index 31008612f9..3d7ad41b85 100644 --- a/test/git-strategies.test.js +++ b/test/git-strategies.test.js @@ -50,6 +50,7 @@ import * as reporterProxy from '../lib/reporter-proxy'; git.setPromptCallback(promptStub); const stdin = dedent` + protocol=https host=noway.com username=me @@ -836,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 67d50bcddd..dc1e07b410 100644 --- a/test/github-package.test.js +++ b/test/github-package.test.js @@ -455,6 +455,29 @@ describe('GithubPackage', function() { 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'); 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 1815ed6ab6..d6ad187db1 100644 --- a/test/models/author.test.js +++ b/test/models/author.test.js @@ -32,9 +32,13 @@ describe('Author', function() { 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()); }); 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/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 index c1074551dd..464306fda2 100644 --- a/test/views/git-tab-header-view.test.js +++ b/test/views/git-tab-header-view.test.js @@ -20,6 +20,7 @@ describe('GitTabHeaderView', function() { contextLocked: false, changingWorkDir: false, changingLock: false, + handleAvatarClick: () => {}, handleWorkDirSelect: () => {}, handleLockToggle: () => {}, ...options, @@ -59,6 +60,14 @@ describe('GitTabHeaderView', function() { }); }); + 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}); @@ -76,7 +85,7 @@ describe('GitTabHeaderView', function() { const handleLockToggle = sinon.spy(); const wrapper = build({handleLockToggle}); - wrapper.find('button').simulate('click'); + wrapper.find('.github-Project-lock').simulate('click'); assert.isTrue(handleLockToggle.called); }); }); @@ -91,7 +100,7 @@ describe('GitTabHeaderView', function() { 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')); + assert.isTrue(wrapper.find('.github-Project-lock').prop('disabled')); }); }); diff --git a/test/views/git-tab-view.test.js b/test/views/git-tab-view.test.js index 1acc2c2732..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'}], 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-view.test.js b/test/views/github-tab-view.test.js index e507264c49..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'; @@ -34,7 +34,8 @@ describe('GitHubTabView', function() { refresher={new Refresher()} rootHolder={new RefHolder()} - loginModel={new GithubLoginModel(InMemoryStrategy)} + endpoint={DOTCOM} + token="1234" workspace={atomEnv.workspace} workingDirectory={repo.getWorkingDirectoryPath()} @@ -52,6 +53,9 @@ describe('GitHubTabView', function() { currentBranch={nullBranch} pushInProgress={false} + handleLogin={() => {}} + handleLogout={() => {}} + handleTokenRetry={() => {}} handleWorkDirSelect={() => {}} handlePushBranch={() => {}} handleRemoteSelect={() => {}} @@ -66,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()); diff --git a/test/worker-manager.test.js b/test/worker-manager.test.js index 27932fe8bb..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, webPreferences: {nodeIntegration: true}}); + 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();