diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..fc964f3bd --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +# .gitattributes documentation: https://git-scm.com/docs/gitattributes + +# Resolve 3-way merge conflicts on the CHANGELOG.md file using the union strategy +CHANGELOG.md merge=union diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..1b89b4d7b --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [orta] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..c786dbef5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,36 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG] " +labels: bug +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. +2. +3. +4. + +**Expected behavior** + + + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Your Environment** + + + | software | version +| ---------------- | ------- +| danger.js | +| node | +| npm | +| Operating System | + +**Additional context** +Add any other context about the problem here. diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml new file mode 100644 index 000000000..e6e0a9a01 --- /dev/null +++ b/.github/workflows/CI.yml @@ -0,0 +1,60 @@ +name: CI +on: pull_request + +jobs: + test: + runs-on: ubuntu-20.04 + + steps: + # Check out, and set up the node/ruby infra + - uses: actions/checkout@v1 + - uses: actions/setup-node@v2 + with: + node-version: '14' + + # Get local dependencies & test + - run: yarn install + - run: yarn build + - run: yarn test + + # Validate related tooling + - run: yarn declarations + - run: yarn tsc distribution/danger.d.ts + - run: rm -rf node_modules/@types/babel-* + - run: rm -rf node_modules/@types/babylon + + # Not many Flow users nowadays, so this probably is worth dropping + # if it becomes an issue. + - run: echo "Testing Flow definition file" + - run: yarn build:flow-types + # - run: yarn flow check + + - run: 'echo "This is only for Integration tests on two blank projects"' + + - run: | + mkdir danger_blank_test + cd danger_blank_test + yarn init --yes + yarn add file:.. + echo "warn('I warned you')" > dangerfile.js + echo "Testing a blank Dangerfile on an empty project" + DEBUG="*" yarn danger run --text-only + cd .. + rm -rf danger_blank_test + name: "Make a CRA" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - run: | + npm install -g create-react-app + create-react-app danger_babel_test + cd danger_babel_test + yarn add file:.. + echo "warn('Expect 2 warnings'); const a = async () => {warn('the other');}; schedule(a)" > dangerfile.js + echo "Testing a blank Dangerfile on a babel CRA project" + DEBUG="*" yarn danger ci --text-only + cd .. + rm -rf danger_babel_test + name: "Make a small babel app" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/publish_package.yml b/.github/workflows/publish_package.yml new file mode 100644 index 000000000..9cd569da8 --- /dev/null +++ b/.github/workflows/publish_package.yml @@ -0,0 +1,28 @@ +name: Release Danger-JS package + +on: + push: + tags: + - '*' + +jobs: + build: + runs-on: ubuntu-20.04 + + steps: + - uses: actions/checkout@v2 + + - name: Export tag version + run: echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV + + - name: Docker Login + run: echo $PACKAGES_WRITE_TOKEN | docker login ghcr.io -u $USERNAME --password-stdin + env: + PACKAGES_WRITE_TOKEN: ${{ secrets.DOCKER_GITHUB_PASSWORD }} + USERNAME: ${{ secrets.DOCKER_GITHUB_USERNAME }} + + - name: Docker Build + run: docker build -t ghcr.io/danger/danger-js:$VERSION . + + - name: Deploy + run: docker push ghcr.io/danger/danger-js:$VERSION diff --git a/.github/workflows/uploadDockerImage.yml b/.github/workflows/uploadDockerImage.yml deleted file mode 100644 index a9ae2b249..000000000 --- a/.github/workflows/uploadDockerImage.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Upload tag to GitHub - -on: - push: - tags: - - "*" - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - - name: Publish to Registry - uses: elgohr/Publish-Docker-Github-Action@master - with: - name: docker.pkg.github.com/danger/danger-js/release - username: ${{ secrets.DOCKER_GITHUB_USERNAME }} - password: ${{ secrets.DOCKER_GITHUB_PASSWORD }} - registry: docker.pkg.github.com diff --git a/.prettierignore b/.prettierignore index 9b587954a..d442ca2d1 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,3 +2,4 @@ source/danger-outgoing-process-schema.json source/danger-incoming-process-schema.json source/platforms/_tests/fixtures/bbs-dsl-input.json source/platforms/_tests/fixtures/bbc-dsl-input.json +CHANGELOG.md diff --git a/.release-it.json b/.release-it.json index 3c4b62942..c807c4c19 100644 --- a/.release-it.json +++ b/.release-it.json @@ -4,9 +4,8 @@ "assets": "brew-distribution/*.zip" }, "buildCommand": "yarn package", - "scripts": { - "beforeStart": "VERSION=${version} yarn ts-node scripts/update-changelog.ts", - "beforeBump": "yarn declarations; yarn build:schemas", - "afterRelease": "VERSION=${version} scripts/create-homebrew-tap-pr.sh" + "hooks": { + "before:bump": "yarn declarations; yarn build:schemas", + "after:release": "VERSION=${version} scripts/create-homebrew-tap-pr.sh" } } diff --git a/.travis.yml b/.travis.yml index a98754453..810131f01 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,9 +8,9 @@ cache: matrix: include: # Normal CI test runs :D - - node_js: "10" + - node_js: "14" - - node_js: "10" + - node_js: "14" after_script: - echo "Validating TypeScript definition file" - yarn build @@ -23,13 +23,13 @@ matrix: - yarn flow check # Checks every example dangerfile can run in `danger runner`. - - node_js: "10" + - node_js: "14" script: - yarn build - node scripts/run-fixtures.js # Runs both the CI and PR with a custom process to ensure apps like swift/rust work - - node_js: "10.13" + - node_js: "14" script: - yarn build - node distribution/commands/danger-ci.js --process "ruby scripts/danger_runner.rb" @@ -61,36 +61,11 @@ matrix: - echo "Validating that danger pr works as expected" - DEBUG="*" danger pr https://github.com/danger/danger-js/pull/465 --dangerfile dangerfile.circle.js --verbose - - echo "Grabbing master so that danger-local can use it for comparison" - - git checkout -t origin/master || true + - echo "Grabbing main so that danger-local can use it for comparison" + - git checkout -t origin/main || true - '[ ! -z $TRAVIS_PULL_REQUEST ] && DEBUG="*" danger local --dangerfile source/platforms/git/_tests/local_dangerfile_example.ts || echo "Skipping Danger Local for non PR run"' - # Create some fake projects at runtime - - node_js: "10.16" - script: - - echo "This is only for Integration tests on two blank projects" - - yarn build - - mkdir danger_blank_test - - cd danger_blank_test - - yarn init --yes - - yarn add file:.. - - echo "warn('I warned you')" > dangerfile.js - - echo "Testing a blank Dangerfile on an empty project" - - DEBUG="*" yarn danger run --text-only - - cd .. - - rm -rf danger_blank_test - - - npm install -g create-react-app - - create-react-app danger_babel_test - - cd danger_babel_test - - yarn add file:.. - - echo "warn('Expect 2 warnings'); const a = async () => {warn('the other');}; schedule(a)" > dangerfile.js - - echo "Testing a blank Dangerfile on a babel CRA project" - - DEBUG="*" yarn danger ci --text-only - - cd .. - - rm -rf danger_babel_test - script: - yarn lint - yarn add jest diff --git a/.vscode/settings.json b/.vscode/settings.json index 1b77294d4..ab3d102ce 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -24,7 +24,11 @@ "autogenerated", "bdotdub", "bitbucket", + "bitrise", + "buildkite", "caffodian", + "codefresh", + "codemagic", "codeship", "commit's", "dangerfile", diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 1b8cddd78..000000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=733558 - // for the documentation about the tasks.json format - "version": "0.1.0", - "command": "npm", - "isShellCommand": true, - "showOutput": "never", - "suppressTaskName": true, - "tasks": [ - { - "taskName": "build", - "args": ["run", "build"] - } - ] -} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 1bf32ca6e..307ae0463 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ -## Master +## Main - +- Enhancement(perf): [Github] Check if the filesystem can load files instead of always using Github API [#991](https://github.com/danger/danger-js/pull/991) [@orta] +- Fix: [Github] Multiple Inline Comments on the same file/line should all be posted [#1176](https://github.com/danger/danger-js/pull/1176) [@Rouby] + + + +# 10.8.0 + +- Feature: `danger local --outputJSON` for [#1177](https://github.com/danger/danger-js/pull/1177) [@orta] +- Fix: Updates `jsonpointer` for [#1174](https://github.com/danger/danger-js/pull/1174) [@unfernandito] +- Fix: Updates `parse-link-header` for CVE-2021-23490 [#1190](https://github.com/danger/danger-js/pull/1190) [@fbartho] + +# 10.7.1 + +- Updates micromatch dependencies for CVE-2021-23440 + +# 10.7.0 + +- Adds support for XcodeCloud + +# 10.6.6 + +- Fix for supporting Bitbucket Server personal repositories +- GitLab: Added `GitLabApi` to `danger.gitlab.api`. - [@shyim] +- GitLab: Added label helper functions to `danger.gitlab.api.addLabels` and `danger.gitlab.api.removeLabels`. - [@shyim] + +# 10.6.5 + +- Improvements to the git parsing for `danger local` - [@denieler] +- Bitbucket Cloud: Fix type of BitBucketCloudPRDSL.created_on and updated_on. - [@hellocore] + +# 10.6.4 + +- DEBUG="\*" will now log out the response for any HTTP request which isn't classed as "OK" - [@orta] + +# 10.6.3 + +- Fixed Bitrise's `ciRunURL` underlying env var - [@rogerluan] +- Simplified Bitrise repo slug lookup, fixing SSH URL parsing in BitBucketServer - [@rogerluan] +- Log failure to update status also when not in verbose mode - [@rogerluan] + +# 10.6.2 + +- Added Codemagic.io as a supported CI - [@fbartho] +- Switched Danger's default branch to be 'main' from 'master' - [@orta] +- Added GitLab Approvals to the DSL: `gitlab.approvals` - kelvin-lemon + +# 10.6.1 + +- Better detection of using the github actions bot for comment deletion - [@orta] + +# 10.6.0 + +- Bitbucket Cloud: Add markdown emoji instead of unicode - [@JanStevens] +- Add `DANGER_DISABLE_TSC` environment variable to disable transpiling with tsc, providing a way to force transpiling + with Babel - [@ozzieorca] +- Adds options `--newComment` and `--removePreviousComments` - [@davidhouweling] +- Add support for a file path filter when calculation lines of code - [@melvinvermeer] + +# 10.5.4 + +- Fix for `danger local` not passing through `--staging` - [@g3offrey] + +# 10.5.3 + +- Fix for `danger local` not showing commit messages - [@hmschreiner] + +# 10.5.2 + +- Adds `danger.git.head` and `danger.git.base` - [@jamiebuilds] + +# 10.5.1 + +- Bitbucket Cloud: Fix bug when Danger updating inline comment with summary comment. - [@hellocore] +- Fall back to alternative methods for establishing the PR number from CodeBuild - [@alexandermendes] + +# 10.5.0 + +- Handle deprecations for the APIs used with `--use-github-checks` #1073 [@wardpeet](https://github.com/wardpeet) + +# 10.4.1 + +- Improved `tsconfig.json` file lookup strategy: it now looks for it starting from the location of the danger file. + #1068 [@igorbek](https://github.com/igorbek) +- Upgrade node-fetch to 2.6.1 to fix GHSA-w7rc-rwvf-8q5r. #1071 [@hmcc](https://github.com/hmcc) + +# 10.4.0 + +- Adds aliases to the FakeCI env vars. You could now have something like: + ```yml + - run: "npx danger-ts ci" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + DANGER_MANUAL_CI: true + DANGER_MANUAL_GH_REPO: ${{ steps.pr_info.outputs.repo }} + DANGER_MANUAL_PR: ${{ steps.pr_info.outputs.number }} + ``` + Which looks more intentional instead of: `DANGER_FAKE_CI` etc. [@orta](https://github.com/orta) + +# 10.3.1 + +- Experimental support for internal routing when using `npx danger-ts` [@orta] + +# 10.3.0 + +- Added a CLI option `--ignoreOutOfDiffComments` so that you can ignore inline-comments for lines that were not changed + in the checked PR. The comments would be ignored completely - they won't even show in the results comment. [@pinkasey] + +# 10.2.2 + +- Add support for `danger local` on repos without a master branch - [@ahobson](https://github.com/ahobson) + +# 10.2.1 + +- Wait for close event on spawned process in local git platform - [@gzaripov] +- Fix Typo in README.md [@NotMoni] +- Fix danger failure on getting diff for files with spaces in file path [@HonzaMac] +- Document how to disable transpilation [@rzgry] +- Fix get blob url for pr commit [@doniyor2109] + +# 10.2.0 + +- Take commit hash from CircleCI environment variable [@valscion] +- Fix project path with /- in GitLab MR URL [@pgoudreau] +- When creating a new PR with `createOrUpdatePR`, add the description (as done when editing) - [@sogame] + +# 10.1.0 + +- Adds support for Bamboo CI [@tim3trick] +- Replace regex to a long url repos approach on Bitrise [@lucasmpaim] +- Pass process arguments back to the original process [@f-meloni] +- When fetching existing labels in `createOrAddLabel` use pagination to fetch them all - [@sogame] + +# 10.0.0 + +- Changed JSON patch implementation for better memory performance. [@dkundel] + + **Breaking:** `JSONPatchForFile` will return a different order of operations than previously. It will also return a + `path` with the index of the element inserted into an array for `add` operations. + +# 9.3.1 + +- Don't fail when using `createOrAddLabel` if label fails to be created or added - [@sogame] + +# 9.3.0 + +- Add the staged flag to `danger local` command - [@soyn] +- Don't use hardcoded userId to update comments if using personal token in Github Actions - [@rohit-gohri] +- Disable warning in Github Action if using DANGER_GITHUB_API_TOKEN - [@rohit-gohri] +- Update `parse-diff` library - [@417-72KI] +- Fix repository slug in Jenkins provider - [sandratatarevicova] +- Add Gitlab diff support - [@rohit-gohri] +- Fix Typos across danger-js Repo - [@yohix] +- Fix `@octokit/rest` deprecation warning when using `.issues.addLabels()` - [@sogame] # 9.2.10 @@ -99,7 +251,7 @@ x - Fix Github Actions documentation - [@ravanscafi] - Improve Performance by Caching BitBucket Cloud Commits - [@hellocore] - Add compliment message to comment template on Bitbucket Cloud - [@hellocore] -- Add option to set custom icon in messages - [@rohit-smpx] +- Add option to set custom icon in messages - [@rohit-gohri] # 9.1.0 @@ -480,7 +632,7 @@ Also, `danger pr` now accepts a `--process` arg. body: "Here is your new repo template files", owner: "orta", repo: "new-repo", - baseBranch: "master", + baseBranch: "main", newBranchName: "welcome", commitMessage: "Sets up the welcome package", }, @@ -683,7 +835,7 @@ Also, `danger pr` now accepts a `--process` arg. ## 3.5.0 - 3.5.1 - Fixed a bug where Danger posts empty main comment when it have one or more inline comments to post [@codestergit] -- fix bug when commiting .png files on BitBucket [@Mifi] +- fix bug when committing .png files on BitBucket [@Mifi] - Adds support for inline comments for bitbucket server. [@codestergit] ## 3.4.7 @@ -1714,10 +1866,12 @@ Not usable for others, only stubs of classes etc. - [@orta] [@danielrosenwasser]: https://github.com/DanielRosenwasser [@davidbrunow]: https://github.com/davidbrunow [@dfalling]: https://github.com/dfalling +[@dkundel]: https://github.com/dkundel [@f-meloni]: https://github.com/f-meloni [@fbartho]: https://github.com/fbartho [@fwal]: https://github.com/fwal [@happylinks]: https://github.com/happylinks +[@hmcc]: https://github.com/hmcc [@hongrich]: https://github.com/hongrich [@hellocore]: https://github.com/HelloCore [@imorente]: https://github.com/imorente @@ -1731,17 +1885,19 @@ Not usable for others, only stubs of classes etc. - [@orta] [@ninjaprox]: https://github.com/ninjaprox [@nminhnguyen]: https://github.com/NMinhNguyen [@nornagon]: https://github.com/nornagon +[@notmoni]: https://github.com/NotMoni [@orta]: https://github.com/orta [@osmestad]: https://github.com/osmestad [@patrickkempff]: https://github.com/patrickkempff [@peterjgrainger]: https://github.com/peterjgrainger [@randak]: https://github.com/randak [@ravanscafi]: https://github.com/ravanscafi -[@rohit-smpx]: https://github.com/rohit-smpx +[@rohit-gohri]: https://github.com/rohit-gohri [@sajjadzamani]: https://github.com/sajjadzamani [@sebinsua]: https://github.com/sebinsua [@sgtcoolguy]: https://github.com/sgtcoolguy [@sharkysharks]: https://github.com/sharkysharks +[@sogame]: https://github.com/sogame [@stevemoser]: https://github.com/stevemoser [@stevenp]: https://github.com/stevenp [@sunshinejr]: https://github.com/sunshinejr @@ -1756,3 +1912,12 @@ Not usable for others, only stubs of classes etc. - [@orta] [@bigkraig]: https://github.com/bigkraig [@notjosh]: https://github.com/notjosh [@iljadaderko]: https://github.com/IljaDaderko +[@417-72ki]: https://github.com/417-72KI +[@soyn]: https://github.com/Soyn +[@tim3trick]: https://github.com/tim3trick +[@doniyor2109]: https://github.com/doniyor2109 +[@alexandermendes]: https://github.com/alexandermendes +[@jamiebuilds]: https://github.com/jamiebuilds +[@hmschreiner]: https://github.com/hmschreiner +[@g3offrey]: https://github.com/g3offrey +[@denieler]: https://github.com/denieler diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d20857ec9..65cf54ca8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,12 +19,12 @@ yarn test yarn lint ``` -The fixers for both tslint and prettier will be applied when you commit, and on a push your code will be verified -that it compiles. +The fixers for both tslint and prettier will be applied when you commit, and on a push your code will be verified that +it compiles. ### How does Danger JS work? -Check the [architecture doc](https://github.com/danger/danger-js/blob/master/docs/architecture.md). +Check the [architecture doc](https://github.com/danger/danger-js/blob/main/docs/architecture.md). ### What is the TODO? @@ -34,21 +34,28 @@ Check the issues, I try and keep my short term perspective there. Long term is i Following [this commit](https://github.com/danger/danger-js/commit/a26ac3b3bd4f002acd37f6a363c8e74c9d5039ab) as a model: -* Checkout the `master` branch. Ensure your working tree is clean, and make sure you have the latest changes by running `git pull`. -* Update `package.json` with the new version - for the sake of this example, the new version is **0.21.0**. -* Modify `changelog.md`, adding a new `### 0.21.0` heading under the `### Master` heading at the top of the file. -* Commit both changes with the commit message **Version bump**. -* Tag this commit - `git tag 0.21.0`. -* Push the commit and tag to master - `git push origin master --follow-tags`. Travis CI will build the tagged commit and publish that tagged version to NPM. +- Checkout the `main` branch. Ensure your working tree is clean, and make sure you have the latest changes by running + `git pull`. +- Update `package.json` with the new version - for the sake of this example, the new version is **0.21.0**. +- Modify `changelog.md`, adding a new `### 0.21.0` heading under the `### Main` heading at the top of the file. +- Commit both changes with the commit message **Version bump**. +- Tag this commit - `git tag 0.21.0`. +- Push the commit and tag to master - `git push origin main --follow-tags`. Travis CI will build the tagged commit and + publish that tagged version to NPM. :ship: ## License, Contributor's Guidelines and Code of Conduct -We try to keep as much discussion as possible in GitHub issues, but also have a pretty inactive Slack --- if you'd like an invite, ping [@Orta](https://twitter.com/orta/) a DM on Twitter with your email. It's mostly interesting if you want to stay on top of Danger without all the emails from GitHub. +We try to keep as much discussion as possible in GitHub issues, but also have a pretty inactive Slack --- if you'd like +an invite, ping [@Orta](https://twitter.com/orta/) a DM on Twitter with your email. It's mostly interesting if you want +to stay on top of Danger without all the emails from GitHub. -> This project is open source under the MIT license, which means you have full access to the source code and can modify it to fit your own needs. +> This project is open source under the MIT license, which means you have full access to the source code and can modify +> it to fit your own needs. > -> This project subscribes to the [Moya Contributors Guidelines](https://github.com/Moya/contributors) which TLDR: means we give out push access easily and often. +> This project subscribes to the [Moya Contributors Guidelines](https://github.com/Moya/contributors) which TLDR: means +> we give out push access easily and often. > -> Contributors subscribe to the [Contributor Code of Conduct](http://contributor-covenant.org/version/1/3/0/) based on the [Contributor Covenant](http://contributor-covenant.org) version 1.3.0. +> Contributors subscribe to the [Contributor Code of Conduct](http://contributor-covenant.org/version/1/3/0/) based on +> the [Contributor Covenant](http://contributor-covenant.org) version 1.3.0. diff --git a/LICENSE b/LICENSE index 7af5b819d..663165d00 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2016-2019 Orta Therox +Copyright (c) 2016-Present Orta Therox Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index caf392a45..d396bd273 100644 --- a/README.md +++ b/README.md @@ -17,16 +17,16 @@ Danger runs after your CI, automating your team's conventions surrounding code r This provides another logical step in your process, through which Danger can help lint your rote tasks in daily code review. -You can use Danger to codify your teams norms, leaving humans to think about harder problems. +You can use Danger to codify your team's norms, leaving humans to think about harder problems. Danger JS works with GitHub, BitBucket Server, BitBucket Cloud for code review, then with: Travis CI, GitLab CI, -Semaphore, Circle CI, GitHub Actions, Jenkins, Docker Cloud, Bitrise, surf-build, Codeship, Drone, Buildkite, Nevercode, -buddybuild, Buddy.works, TeamCity, Visual Studio Team Services, Screwdriver, Concourse, Netlify, CodeBuild, Codefresh, -AppCenter, BitBucket Pipelines, or Cirrus CI. +Semaphore, Circle CI, GitHub Actions, Jenkins, Docker Cloud, Bamboo, Bitrise, surf-build, Codeship, Drone, Buildkite, +Nevercode, buddybuild, Buddy.works, TeamCity, Visual Studio Team Services, Screwdriver, Concourse, Netlify, CodeBuild, +Codefresh, AppCenter, BitBucket Pipelines, Cirrus CI, Codemagic or Xcode Cloud. [![npm](https://img.shields.io/npm/v/danger.svg)](https://www.npmjs.com/package/danger) -[![Build Status](https://travis-ci.org/danger/danger-js.svg?branch=master)](https://travis-ci.org/danger/danger-js) -[![Build Status](https://ci.appveyor.com/api/projects/status/ep5hgeox3lbc5c7f?svg=true)](https://ci.appveyor.com/project/orta/danger-js/branch/master) +[![Build Status](https://travis-ci.org/danger/danger-js.svg?branch=main)](https://travis-ci.org/danger/danger-js) +[![Build Status](https://ci.appveyor.com/api/projects/status/ep5hgeox3lbc5c7f?svg=true)](https://ci.appveyor.com/project/orta/danger-js/branch/main) [![Join the community on Spectrum](https://withspectrum.github.io/badge/badge.svg)](https://spectrum.chat/danger) ## For example? @@ -89,7 +89,7 @@ yarn build; node --inspect distribution/commands/danger-pr.js https://github.com ### How does Danger JS work? -Check the [architecture doc](https://github.com/danger/danger-js/blob/master/docs/architecture.md). +Check the [architecture doc](https://github.com/danger/danger-js/blob/main/docs/architecture.md). ### What is the TODO? @@ -99,9 +99,9 @@ Check the issues, I try and keep my short term perspective there. Long term is i Following [this commit](https://github.com/danger/danger-js/commit/a26ac3b3bd4f002acd37f6a363c8e74c9d5039ab) as a model: -- Checkout the `master` branch. Ensure your working tree is clean, and make sure you have the latest changes by running +- Checkout the `main` branch. Ensure your working tree is clean, and make sure you have the latest changes by running `git pull`. -- Publish - `npm run release -- [major/patch/minor] --non-interactive`. +- Publish - `npm run release -- patch --ci`. :ship: @@ -121,7 +121,7 @@ to stay on top of Danger without all the emails from GitHub. > the [Contributor Covenant](http://contributor-covenant.org) version 1.3.0. [emiss]: https://github.com/artsy/emission/blob/master/dangerfile.ts -[danger-js]: https://github.com/danger/danger-js/blob/master/dangerfile.ts +[danger-js]: https://github.com/danger/danger-js/blob/main/dangerfile.ts [meta]: https://github.com/artsy/metaphysics/blob/master/dangerfile.js [fbj]: https://github.com/facebook/jest/blob/master/dangerfile.js [sc]: https://github.com/styled-components/styled-components/blob/master/dangerfile.js diff --git a/VISION.md b/VISION.md index d41f64b47..892fac137 100644 --- a/VISION.md +++ b/VISION.md @@ -1,9 +1,9 @@ # Danger for JS -Danger JS is a tool to creating complex per-project rules, and messages in Code Review. One of its key aims is to be +Danger JS is a tool for creating complex per-project rules, and messages in Code Review. One of its key aims is to be able to run on a server, and not need direct access to the filesystem to do its work. -It was started in mid-2016, and has fleshed out into a considerable set of useful tools. +It was started in mid-2016 and has fleshed out into a considerable set of useful tools. - You can get started in a fun way via `danger init`. - You can run danger via `danger ci`. @@ -24,18 +24,18 @@ JS has been accomplished: - Allow running just with a local set of git commits - Documented at scale -So, what now? Well. It's kinda done, and now can mature. For the past few years Danger Ruby has solidified and become +So, what now? Well. It's kinda done and now can mature. For the past few years Danger Ruby has solidified and become foundational infrastructure which you can trust won't change much, now Danger JS can be in the same place. This is a -great place to be as a developer tool. +great place to be a developer tool. # Why Danger JS? What about Danger Ruby? When I started Danger JS, Danger Ruby was two years old, is still doing just fine. See the -[original vision file](https://github.com/danger/danger/blob/master/VISION.md). This document assumes you have read it. +[original vision file](https://github.com/danger/danger/blob/main/VISION.md). This document assumes you have read it. The amount of issues we get in comparison to the number of downloads on Rubygems makes me feel pretty confident about -Danger Ruby's state of production quality and maturity. I wanted to start thinking about the larger patterns in -software, because at Artsy, we are starting to use JavaScript in +Danger Ruby's state of production quality and maturity. I wanted to start thinking about the larger patterns in software +because at Artsy, we are starting to use JavaScript in [for many teams](http://artsy.github.io/blog/2016/08/15/React-Native-at-Artsy/). I've explored [running JavaScript](https://github.com/danger/danger/pull/423) from the ruby Danger, @@ -44,11 +44,11 @@ production) but this pattern isn't going to work on the larger scale: You cannot babel/tsc to transpile your `Dangerfile.js` and the requirements on the integrating project [feel weird](https://github.com/artsy/emission/pull/233). Running JS in Ruby isn't going to work for me. -This realization came at the same time as serious thinking on a hosted version of Danger. With a JavaScript versions we +This realization came at the same time as serious thinking on a hosted version of Danger. With a JavaScript version, we can limit the exposed Danger DSL to only something that can be obtained over the API remotely. By doing this, a hosted Danger does not need to clone and run the associated projects. This is essential for my sanity. I cannot run multiple [servers like CocoaDocs](http://cocoadocs.org). So far, I'm calling this Peril. You can consult the -[vision file for Peril](https://github.com/danger/peril/blob/master/VISION.md) if you'd like. +[vision file for Peril](https://github.com/danger/peril/blob/main/VISION.md) if you'd like. [plugins]: https://www.npmjs.com/search?q=keywords:danger-plugin&page=1&ranking=optimal [peril]: http://artsy.github.io/blog/2017/09/04/Introducing-Peril/ diff --git a/dangerfile.lite.ts b/dangerfile.lite.ts index 7c259e35e..3a1463399 100644 --- a/dangerfile.lite.ts +++ b/dangerfile.lite.ts @@ -9,7 +9,7 @@ const isTrivial = danger.github && (danger.github.pr.body + danger.github.pr.tit if (!hasChangelog && !isTrivial) { warn( - "Please add a changelog entry for your changes. You can find it in `CHANGELOG.md` \n\nPlease add your change and name to the master section." + "Please add a changelog entry for your changes. You can find it in `CHANGELOG.md` \n\nPlease add your change and name to the main section." ) } diff --git a/docs/architecture.md b/docs/architecture.md index 29f2accc0..b0146dac8 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -12,7 +12,7 @@ Actually doing that though, is a bit of a process. whether it is a pull request. **Step 2: Platform**. Danger needs to know which platform the code review is happening in. Today, Danger supports -Github, Gitlab, BitBucket Server, and BitBucket Cloud. You can see them them all in [`source/platforms`][platforms]. +Github, Gitlab, BitBucket Server, and BitBucket Cloud. You can see them all in [`source/platforms`][platforms]. **Step 3: JSON DSL**. To allow for all of: @@ -33,8 +33,8 @@ evaluating your code, and adds the DSL attributes into the global evaluation con **Step 6: Results**. Once the `danger runner` process is finished with evaluation, the results are passed back to the the platform. The platform then chooses whether to create/delete/edit any messages in core review. -[provs]: https://github.com/danger/danger-js/tree/master/source/ci_source/providers -[dangerdsl]: https://github.com/danger/danger-js/blob/master/source/dsl/DangerDSL.ts -[runner]: https://github.com/danger/danger-js/blob/master/source/commands/danger-runner.ts -[in_runner]: https://github.com/danger/danger-js/blob/master/source/runner/runners/inline.ts -[platforms]: https://github.com/danger/danger-js/blob/master/source/platforms +[provs]: https://github.com/danger/danger-js/tree/main/source/ci_source/providers +[dangerdsl]: https://github.com/danger/danger-js/blob/main/source/dsl/DangerDSL.ts +[runner]: https://github.com/danger/danger-js/blob/main/source/commands/danger-runner.ts +[in_runner]: https://github.com/danger/danger-js/blob/main/source/runner/runners/inline.ts +[platforms]: https://github.com/danger/danger-js/blob/main/source/platforms diff --git a/docs/guides/faq.html.md b/docs/guides/faq.html.md index 6cc0e393f..aac190ac3 100644 --- a/docs/guides/faq.html.md +++ b/docs/guides/faq.html.md @@ -74,7 +74,7 @@ can DM [orta][]. [77]: https://github.com/danger/danger-js/issues/77 [529]: https://github.com/danger/danger-js/issues/529 -[vision.md]: https://github.com/danger/danger-js/blob/master/VISION.md +[vision.md]: https://github.com/danger/danger-js/blob/main/VISION.md [open]: https://github.com/danger/danger-js/issues?q=is%3Aissue+is%3Aopen+label%3A%22Open+for+Discussion%22 [you-can-do-this]: https://github.com/danger/danger-js/issues?q=is%3Aissue+is%3Aopen+label%3A%22You+Can+Do+This%22 [orta]: https://twitter.com/orta/ diff --git a/docs/guides/peril.html.md b/docs/guides/peril.html.md index e192d6b4c..410962eae 100644 --- a/docs/guides/peril.html.md +++ b/docs/guides/peril.html.md @@ -16,7 +16,7 @@ A lot of the information on Peril can be found on the [Artsy blog: here](http://artsy.github.io/blog/2017/09/04/Introducing-Peril/) Today Peril is self-hosted via heroku. There is a walkthrough on the -[Peril repo: here](https://github.com/danger/peril/blob/master/docs/setup_for_org.md). It's still a pretty fast moving +[Peril repo: here](https://github.com/danger/peril/blob/main/docs/setup_for_org.md). It's still a pretty fast moving project ever 6 months into deployment so expect to maybe fix your own problem occasionally. ## Dangerfile implications @@ -55,4 +55,4 @@ continuing, so make sure to not cause it to lock. ## Plugin implications A plugin that runs on Peril will also have to handle the above if it uses async code. For some examples of this, see -[danger-plugin-spellcheck](https://github.com/orta/danger-plugin-spellcheck#danger-plugin-spellcheck) or +[danger-plugin-spellcheck](https://github.com/orta/danger-plugin-spellcheck#danger-plugin-spellcheck). diff --git a/docs/guides/the_dangerfile.html.md b/docs/guides/the_dangerfile.html.md index bae0b3d20..1129ebeb2 100644 --- a/docs/guides/the_dangerfile.html.md +++ b/docs/guides/the_dangerfile.html.md @@ -117,7 +117,7 @@ If you'd like to work with some reference material, here are some examples in th JavaScript: -- **Libraries** - [facebook/react-native][rn], [facebook/react][r] and [ReactiveX/rxjs][rxjs]. +- **Libraries** - [facebook/react-native][rn], and [facebook/react][r]. - **Docs** - [bamlab/dev-standards][bamlab] Some TypeScript examples: @@ -130,10 +130,9 @@ Some TypeScript examples: [meta]: https://github.com/artsy/metaphysics/blob/master/dangerfile.js [rn]: https://github.com/facebook/react-native/blob/master/bots/dangerfile.js [r]: https://github.com/facebook/react/blob/master/dangerfile.js -[rxjs]: https://github.com/ReactiveX/rxjs/blob/master/dangerfile.js [setup]: http://danger.systems/guides/getting_started.html#creating-a-bot-account-for-danger-to-use [jest]: https://github.com/facebook/jest -[transpilation_guide]: /js/tutorials/transpilation.html +[transpilation_guide]: /docs/tutorials/transpilation.html.md [changelog]: http://danger.systems/js/changelog.html [apollo]: https://github.com/apollographql/apollo-client/blob/master/config/dangerfile.ts [bamlab]: https://github.com/bamlab/dev-standards/blob/master/dangerfile.js diff --git a/docs/tutorials/dependencies.html.md b/docs/tutorials/dependencies.html.md index ee21c51b0..feefed8f5 100644 --- a/docs/tutorials/dependencies.html.md +++ b/docs/tutorials/dependencies.html.md @@ -12,7 +12,7 @@ This tutorial continues after "[Getting Started][started]" - so you should have ## Keeping on top of your dependencies -Building pretty-much anything in the node ecosystem involves using using external dependencies. In an ideal situation +Building pretty-much anything in the node ecosystem involves using external dependencies. In an ideal situation you want to use as few dependencies as possible, and get the most use out of them. Remember that you are shipping your dependencies too, so you are responsible for them to your end-users. diff --git a/docs/tutorials/transpilation.html.md b/docs/tutorials/transpilation.html.md index 7cac6eb6c..ec4f3203a 100644 --- a/docs/tutorials/transpilation.html.md +++ b/docs/tutorials/transpilation.html.md @@ -69,4 +69,9 @@ it("does nothing when there's a PR body", () => { }) ``` -[tsconfig]: https://github.com/artsy/emission/blob/master/tsconfig.json +[tsconfig]: https://github.com/artsy/emission/blob/main/tsconfig.json + +### Disabling Transpilation + +You can force Danger to skip transpiling your Dangerfile by setting the environment variable +`DANGER_DISABLE_TRANSPILATION="true"`. diff --git a/docs/usage/danger-process.html.md b/docs/usage/danger-process.html.md index bb65ae599..20fe0d921 100644 --- a/docs/usage/danger-process.html.md +++ b/docs/usage/danger-process.html.md @@ -199,7 +199,7 @@ Finally, let me ([@orta][]) know! I want to keep track of them all on the Danger Danger JS will re-send the JSON to your process. [danger-swift]: https://github.com/danger/danger-swift -[swift-json]: https://github.com/danger/danger-swift/blob/master/fixtures/eidolon_609.json +[swift-json]: https://github.com/danger/danger-swift/blob/main/fixtures/eidolon_609.json [swift-stdin]: https://github.com/danger/danger-swift/blob/1576e336e41698861456533463c8821675427258/Sources/Runner/main.swift#L9-L11 [swift-eval]: @@ -209,10 +209,10 @@ Finally, let me ([@orta][]) know! I want to keep track of them all on the Danger [swift-stdout]: https://github.com/danger/danger-swift/blob/1576e336e41698861456533463c8821675427258/Sources/Runner/main.swift#L48-L50 [swift-first-pr]: https://github.com/danger/danger-swift/pull/12 -[dangerjsondsltype]: https://github.com/danger/danger-js/blob/master/source/dsl/DangerDSL.ts +[dangerjsondsltype]: https://github.com/danger/danger-js/blob/main/source/dsl/DangerDSL.ts [into nvm]: https://github.com/creationix/nvm [@orta]: https://github.com/orta -[dangerresults]: https://github.com/danger/danger-js/blob/master/source/dsl/DangerResults.ts -[incoming]: https://github.com/danger/danger-js/blob/master/source/danger-incoming-process-schema.json -[outgoing]: https://github.com/danger/danger-js/blob/master/source/danger-outgoing-process-schema.json +[dangerresults]: https://github.com/danger/danger-js/blob/main/source/dsl/DangerResults.ts +[incoming]: https://github.com/danger/danger-js/blob/main/source/danger-incoming-process-schema.json +[outgoing]: https://github.com/danger/danger-js/blob/main/source/danger-outgoing-process-schema.json [danger-rust]: https://github.com/danger/rust diff --git a/docs/usage/gitlab.html.md b/docs/usage/gitlab.html.md index 822d295c8..cfb95fb96 100644 --- a/docs/usage/gitlab.html.md +++ b/docs/usage/gitlab.html.md @@ -9,8 +9,12 @@ blurb: An overview of using Danger with GitLab, and some examples To use Danger JS with GitLab: you'll need to create a new account for Danger to use, then set the following environment variable on your CI system: +You need access token _OR_ oauth token + - `DANGER_GITLAB_API_TOKEN` = An access token for the account which will post comments +- `DANGER_GITLAB_API_OAUTH_TOKEN` = An oauth token for the account which will post comments + If you are using a GitLab version prior to 11.7 you will also need to define the following environment variable: - `DANGER_GITLAB_HOST` = Defaults to `https://gitlab.com` but you can use it for your own url @@ -25,7 +29,8 @@ if (danger.gitlab.mr.title.includes("WIP")) { } ``` -The DSL is expansive, you can see all the details inside the [Danger JS Reference][ref], but the TLDR is: +The DSL is expansive, you can see all the details inside the +[Danger JS Reference](https://danger.systems/js/reference.html), but the TLDR is: ```ts danger.gitlab. diff --git a/package.json b/package.json index 3b6bbf677..a8ad01db1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "danger", - "version": "9.2.10", + "version": "10.8.0", "description": "Unit tests for Team Culture", "main": "distribution/danger.js", "typings": "distribution/danger.d.ts", @@ -71,7 +71,7 @@ "docs:cp_defs": "mkdir docs/docs_generate; cp source/danger.d.ts docs/docs_generate; cp node_modules/@octokit/rest/index.d.ts docs/docs_generate/github.d.ts", "docs": "yarn run docs:cp_defs; yarn typedoc --ignoreCompilerErrors --mode modules --json docs/js_ref_dsl_docs.json --includeDeclarations source", "dts-lint": "yarn run declarations && yarn dtslint types", - "danger:prepush": "yarn build:fast; yarn test:fixtures; node distribution/commands/danger.js local --dangerfile dangerfile.lite.ts" + "danger:prepush": "yarn build:fast; yarn test:fixtures; node distribution/commands/danger.js local --base main --dangerfile dangerfile.lite.ts" }, "repository": { "type": "git", @@ -124,30 +124,31 @@ "nock": "^10.0.6", "pkg": "^4.4.2", "prettier": "^1.14.2", - "release-it": "^7.6.1", + "release-it": "^13.5.2", "shx": "^0.3.2", "ts-jest": "^24.0.2", "ts-node": "^8.0.2", "tslint": "^5.11.0", "tslint-config-prettier": "^1.15.0", "typedoc": "0.9.0", - "typescript": "^3.1.1", + "typescript": "^3.9.7", "typescript-json-schema": "^0.32.0" }, "dependencies": { "@babel/polyfill": "^7.2.5", - "@octokit/rest": "^16.14.1", + "@octokit/rest": "^16.43.1", "async-retry": "1.2.3", "chalk": "^2.3.0", "commander": "^2.18.0", "debug": "^4.1.1", + "fast-json-patch": "^3.0.0-1", "get-stdin": "^6.0.0", "gitlab": "^10.0.1", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.1", "hyperlinker": "^1.0.0", "json5": "^2.1.0", - "jsonpointer": "^4.0.1", + "jsonpointer": "^5.0.0", "jsonwebtoken": "^8.4.0", "lodash.find": "^4.6.0", "lodash.includes": "^4.3.0", @@ -156,20 +157,19 @@ "lodash.mapvalues": "^4.6.0", "lodash.memoize": "^4.1.2", "memfs-or-file-map-to-github-branch": "^1.1.0", - "micromatch": "^3.1.10", + "micromatch": "^4.0.4", "node-cleanup": "^2.1.2", - "node-fetch": "^2.3.0", + "node-fetch": "2.6.1", "override-require": "^1.1.1", "p-limit": "^2.1.0", - "parse-diff": "^0.5.1", + "parse-diff": "^0.7.0", "parse-git-config": "^2.0.3", "parse-github-url": "^1.0.2", - "parse-link-header": "^1.0.1", + "parse-link-header": "^2.0.0", "pinpoint": "^1.1.0", "prettyjson": "^1.2.1", "readline-sync": "^1.4.9", "require-from-string": "^2.0.2", - "rfc6902": "^3.0.1", "supports-hyperlinks": "^1.0.1" }, "optionalDependencies": {}, diff --git a/scripts/create-homebrew-tap-pr.sh b/scripts/create-homebrew-tap-pr.sh index 04ce75b28..7a7442623 100755 --- a/scripts/create-homebrew-tap-pr.sh +++ b/scripts/create-homebrew-tap-pr.sh @@ -14,7 +14,7 @@ echo "$SHA" # Clone tap repo HOMEBREW_TAP_TMPDIR=$(mktemp -d) -git clone --depth 1 git@github.com:danger/homebrew-tap.git "$HOMEBREW_TAP_TMPDIR" +git clone --depth 1 https://github.com/danger/homebrew-tap.git "$HOMEBREW_TAP_TMPDIR" cd "$HOMEBREW_TAP_TMPDIR" || exit 1 # git config user.name danger diff --git a/scripts/danger-dts.ts b/scripts/danger-dts.ts index 0ec67a39e..7daf5b58d 100644 --- a/scripts/danger-dts.ts +++ b/scripts/danger-dts.ts @@ -12,7 +12,8 @@ const createDTS = () => { // Autogenerated from scripts/danger-dts.ts // -import * as GitHub from "@octokit/rest" +import { Octokit as GitHub } from "@octokit/rest" +import { Gitlab } from "gitlab" ` const footer = `` diff --git a/scripts/update-changelog.ts b/scripts/update-changelog.ts index 3ad479222..d262efd1a 100644 --- a/scripts/update-changelog.ts +++ b/scripts/update-changelog.ts @@ -1,13 +1,13 @@ -import * as fs from "fs" +// import * as fs from "fs" -// Update the CHANGELOG with the new version +// // Update the CHANGELOG with the new version -const changelog = fs.readFileSync("CHANGELOG.md", "utf8") -const newCHANGELOG = changelog.replace( - "", - ` +// const changelog = fs.readFileSync("CHANGELOG.md", "utf8") +// const newCHANGELOG = changelog.replace( +// "", +// ` -# ${process.env.VERSION} -` -) -fs.writeFileSync("CHANGELOG.md", newCHANGELOG, "utf8") +// # ${process.env.VERSION} +// ` +// ) +// fs.writeFileSync("CHANGELOG.md", newCHANGELOG, "utf8") diff --git a/source/ci_source/get_ci_source.ts b/source/ci_source/get_ci_source.ts index cce66168e..420424762 100644 --- a/source/ci_source/get_ci_source.ts +++ b/source/ci_source/get_ci_source.ts @@ -34,7 +34,7 @@ export async function getCISourceForExternal(env: Env, modulePath: string): Prom const moduleConstructor = externalModule.default || externalModule resolve(new moduleConstructor(env)) } - resolve() + resolve(undefined) }) }) } diff --git a/source/ci_source/providers/Bamboo.ts b/source/ci_source/providers/Bamboo.ts new file mode 100644 index 000000000..848c5bf06 --- /dev/null +++ b/source/ci_source/providers/Bamboo.ts @@ -0,0 +1,63 @@ +import { Env, CISource } from "../ci_source" +import { ensureEnvKeysExist, ensureEnvKeysAreInt } from "../ci_source_helpers" + +/** + * ### CI Setup + * + * Install dependencies and add a danger step to your `bitbucket-pipelines.yml`. + * For improving the performance, you may need to cache `node_modules`. + * + * ```yml + * image: node:10.15.0 + * pipelines: + * pull-requests: + * "**": + * - step: + * caches: + * - node + * script: + * - export LANG="C.UTF-8" + * - yarn install + * - yarn danger ci + * definitions: + * caches: + * node: node_modules + * ``` + * + * ### Token Setup + * + * You can either add `DANGER_BITBUCKETCLOUD_USERNAME`, `DANGER_BITBUCKETCLOUD_PASSWORD` + * or add `DANGER_BITBUCKETCLOUD_OAUTH_KEY`, `DANGER_BITBUCKETCLOUD_OAUTH_SECRET` + * - + */ + +export class Bamboo implements CISource { + constructor(private readonly env: Env) {} + + get name(): string { + return "Bamboo" + } + + get isCI(): boolean { + return ensureEnvKeysExist(this.env, ["bamboo_buildPlanName", "bamboo_planRepository_repositoryUrl"]) + } + + get isPR(): boolean { + const mustHave = ["bamboo_repository_pr_key", "bamboo_planRepository_repositoryUrl", "bamboo_buildPlanName"] + const mustBeInts = ["bamboo_repository_pr_key"] + return ensureEnvKeysExist(this.env, mustHave) && ensureEnvKeysAreInt(this.env, mustBeInts) + } + + get pullRequestID(): string { + return `${this.env.bamboo_repository_pr_key}` + } + + get repoSlug(): string { + //ssh://git@bt01.cliplister.com:7999/clfr30/bc3_complete.git + // bamboo_inject_slug="projects/CLFR30/repos/bc3_complete" \ + + const [, project, slug] = this.env.bamboo_planRepository_repositoryUrl.match(/\/(\w+)\/([a-zA-Z0-9_\.-]+(?:.git)?)$/) + + return `projects/${project}/repos/${slug.replace(/\.[^.]+$/, "")}` + } +} diff --git a/source/ci_source/providers/Bitrise.ts b/source/ci_source/providers/Bitrise.ts index 641448ddc..14813c7d0 100644 --- a/source/ci_source/providers/Bitrise.ts +++ b/source/ci_source/providers/Bitrise.ts @@ -51,31 +51,26 @@ export class Bitrise implements CISource { } get isPR(): boolean { - const mustHave = ["GIT_REPOSITORY_URL"] + const mustHave = ["BITRISEIO_GIT_REPOSITORY_OWNER", "BITRISEIO_GIT_REPOSITORY_SLUG"] const mustBeInts = ["BITRISE_PULL_REQUEST"] return ensureEnvKeysExist(this.env, mustHave) && ensureEnvKeysAreInt(this.env, mustBeInts) } - private _parseRepoURL(): string { - const repoURL = this.env.GIT_REPOSITORY_URL - const regexp = new RegExp("([/:])([^/]+/[^/.]+)(?:.git)?$") - const matches = repoURL.match(regexp) - return matches ? matches[2] : "" - } - get pullRequestID(): string { return this.env.BITRISE_PULL_REQUEST } get repoSlug(): string { - return this._parseRepoURL() + return `${this.env.BITRISEIO_GIT_REPOSITORY_OWNER}/${this.env.BITRISEIO_GIT_REPOSITORY_SLUG}` } get ciRunURL() { - return this.env.BITRISE_PULL_REQUEST + return this.env.BITRISE_BUILD_URL } get commitHash() { return this.env.BITRISE_GIT_COMMIT } } + +// See https://devcenter.bitrise.io/builds/available-environment-variables/ diff --git a/source/ci_source/providers/Circle.ts b/source/ci_source/providers/Circle.ts index ab7b0a072..e85520e7c 100644 --- a/source/ci_source/providers/Circle.ts +++ b/source/ci_source/providers/Circle.ts @@ -96,4 +96,8 @@ export class Circle implements CISource { get ciRunURL() { return this.env["CIRCLE_BUILD_URL"] } + + get commitHash(): string { + return this.env.CIRCLE_SHA1 + } } diff --git a/source/ci_source/providers/CodeBuild.ts b/source/ci_source/providers/CodeBuild.ts index 68c6d111b..b3419ba9f 100644 --- a/source/ci_source/providers/CodeBuild.ts +++ b/source/ci_source/providers/CodeBuild.ts @@ -1,5 +1,5 @@ import { Env, CISource } from "../ci_source" -import { ensureEnvKeysExist } from "../ci_source_helpers" +import { ensureEnvKeysExist, getPullRequestIDForBranch } from "../ci_source_helpers" /** * CI Setup @@ -10,10 +10,24 @@ import { ensureEnvKeysExist } from "../ci_source_helpers" * * Add your `DANGER_GITHUB_API_TOKEN` to your project. Edit -> Environment -> Additional configuration -> Create a parameter * + * Note that currently, there seems to be no totally reliable way to get the branch + * name from CodeBuild. Sometimes `CODEBUILD_SOURCE_VERSION` contains the + * PR number in the format pr/123, but not always. Other times it may contain + * a commit hash. `CODEBUILD_WEBHOOK_TRIGGER` will contain the pr number on the + * same format, but only for the first event, for subsequent events it should + * contain the branch number in the format branch/my-branch. So here we attempt + * to determine the PR number from one of the environment variables and if + * unsuccessful fall back to calling the API to find the PR for the branch. */ export class CodeBuild implements CISource { + private default = { prID: "0" } constructor(private readonly env: Env) {} + async setup(): Promise { + const prID = await this._getPrId() + this.default.prID = prID.toString() + } + get name(): string { return "CodeBuild" } @@ -23,12 +37,12 @@ export class CodeBuild implements CISource { } get isPR(): boolean { - const mustHave = ["CODEBUILD_BUILD_ID", "CODEBUILD_SOURCE_VERSION", "CODEBUILD_SOURCE_REPO_URL"] + const mustHave = ["CODEBUILD_BUILD_ID", "CODEBUILD_SOURCE_REPO_URL"] return ensureEnvKeysExist(this.env, mustHave) && this._isPRRequest() } get pullRequestID(): string { - return this.env.CODEBUILD_SOURCE_VERSION.split("/")[1] + return this.default.prID } get repoSlug(): string { @@ -40,9 +54,7 @@ export class CodeBuild implements CISource { } private _isPRRequest(): boolean { - const isPRSource = this.env.CODEBUILD_SOURCE_VERSION.split("/")[0] === "pr" ? true : false - const isPRIdInt = !isNaN(parseInt(this.env.CODEBUILD_SOURCE_VERSION.split("/")[1])) - return isPRSource && isPRIdInt + return this.default.prID !== "0" } private _prParseUrl(): string { @@ -51,4 +63,26 @@ export class CodeBuild implements CISource { const matches = prUrl.match(regexp) return matches ? matches[2] : "" } + + private async _getPrId(): Promise { + const sourceParts = (this.env.CODEBUILD_SOURCE_VERSION || "").split("/") + const triggerParts = (this.env.CODEBUILD_WEBHOOK_TRIGGER || "").split("/") + + const branchName = triggerParts[0] === "branch" ? triggerParts[1] : null + let prId = sourceParts[0] === "pr" ? sourceParts[1] : null + + if (!prId) { + prId = triggerParts[0] === "pr" ? triggerParts[1] : null + } + + if (!prId && branchName) { + prId = await getPullRequestIDForBranch(this, this.env, branchName) + } + + if (isNaN(parseInt(prId))) { + return "0" + } + + return prId + } } diff --git a/source/ci_source/providers/Codefresh.ts b/source/ci_source/providers/Codefresh.ts index 8e8f39cf0..4e1efc7b9 100644 --- a/source/ci_source/providers/Codefresh.ts +++ b/source/ci_source/providers/Codefresh.ts @@ -25,7 +25,7 @@ import { ensureEnvKeysExist, ensureEnvKeysAreInt } from "../ci_source_helpers" * - success * ``` * - * The `failOnErrors` option is required in order to ensure that the step fails properly when Danger fails. If you don't wnat this behavior, you can remove this option. + * The `failOnErrors` option is required in order to ensure that the step fails properly when Danger fails. If you don't want this behavior, you can remove this option. * * Don't forget to add the `DANGER_GITHUB_API_TOKEN` variable to your pipeline settings so that Danger can properly post comments to your pull request. * diff --git a/source/ci_source/providers/Codemagic.ts b/source/ci_source/providers/Codemagic.ts new file mode 100644 index 000000000..7831f7869 --- /dev/null +++ b/source/ci_source/providers/Codemagic.ts @@ -0,0 +1,46 @@ +import { Env, CISource } from "../ci_source" +import { ensureEnvKeysExist, ensureEnvKeysAreInt } from "../ci_source_helpers" + +/** + * Codemagic.io CI Integration + * + * Environment Variables Documented: https://docs.codemagic.io/building/environment-variables/ + * Notice a bug in the docs?: https://github.com/codemagic-ci-cd/codemagic-docs + * + * Need support/advice? https://slack.codemagic.io/ + */ +export class Codemagic implements CISource { + constructor(private readonly env: Env) {} + + get name(): string { + return "Codemagic" + } + + get isCI(): boolean { + // Codemagic developer relations confirmed this is fine to use for this purpose + return ensureEnvKeysExist(this.env, ["FCI_BUILD_ID"]) + } + + get isPR(): boolean { + const mustHave = ["FCI_PULL_REQUEST", "FCI_REPO_SLUG", "FCI_PROJECT_ID", "FCI_BUILD_ID"] + const mustBeInts = ["BUILD_NUMBER", "FCI_PULL_REQUEST_NUMBER"] + return ( + ensureEnvKeysExist(this.env, mustHave) && + ensureEnvKeysAreInt(this.env, mustBeInts) && + this.env.FCI_PULL_REQUEST === "true" + ) + } + + get pullRequestID(): string { + return this.env.FCI_PULL_REQUEST_NUMBER + } + + get repoSlug(): string { + return this.env.FCI_REPO_SLUG + } + + get ciRunURL() { + const { FCI_BUILD_ID, FCI_PROJECT_ID } = process.env + return `https://codemagic.io/app/${FCI_PROJECT_ID}/build/${FCI_BUILD_ID}` + } +} diff --git a/source/ci_source/providers/Fake.ts b/source/ci_source/providers/Fake.ts index d491c2796..fccd9d706 100644 --- a/source/ci_source/providers/Fake.ts +++ b/source/ci_source/providers/Fake.ts @@ -6,8 +6,8 @@ export class FakeCI implements CISource { constructor(env: Env) { const defaults = { - repo: env.DANGER_TEST_REPO || "artsy/emission", // TODO: default to empty string ? - pr: env.DANGER_TEST_PR || "327", // TODO: default to empty string ? + repo: env.DANGER_TEST_REPO || env.DANGER_MANUAL_GH_REPO || "artsy/emission", // TODO: default to empty string ? + pr: env.DANGER_TEST_PR || env.DANGER_MANUAL_PR_NUM || "327", // TODO: default to empty string ? } this.env = { ...env, ...defaults } @@ -17,7 +17,11 @@ export class FakeCI implements CISource { } get isCI(): boolean { - return ensureEnvKeysExist(this.env, ["DANGER_FAKE_CI"]) || ensureEnvKeysExist(this.env, ["DANGER_LOCAL_NO_CI"]) + return ( + ensureEnvKeysExist(this.env, ["DANGER_FAKE_CI"]) || + ensureEnvKeysExist(this.env, ["DANGER_LOCAL_NO_CI"]) || + ensureEnvKeysExist(this.env, ["DANGER_MANUAL_CI"]) + ) } get isPR(): boolean { diff --git a/source/ci_source/providers/GitHubActions.ts b/source/ci_source/providers/GitHubActions.ts index 40f952cd3..32d2b9715 100644 --- a/source/ci_source/providers/GitHubActions.ts +++ b/source/ci_source/providers/GitHubActions.ts @@ -24,7 +24,7 @@ import { readFileSync, existsSync } from "fs" * - name: Use Node.js 10.x * uses: actions/setup-node@v1 * with: - * version: 10.x + * node-version: 10.x * - name: install yarn * run: npm install -g yarn * - name: yarn install, build, and test @@ -132,6 +132,66 @@ import { readFileSync, existsSync } from "fs" * env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} * ``` * + * [GitHub automatically creates a `GITHUB_TOKEN` secret to use in your workflow](https://help.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token). + * You can use the `GITHUB_TOKEN` to authenticate in a workflow run. + * Using this token will post the danger comment as the `github-actions` app user. + * + * Note: `secrets.GITHUB_TOKEN` will not be available for PRs from forks. This is a GitHub + * security constraint, if you have an OSS app, we recommend using a personal token like below. + * + * #### Using Personal Tokens + * + * If you need to post the danger comment as some particular user or for some other reason + * you need to use a personal token for danger then you can provide it in env as DANGER_GITHUB_API_TOKEN. + * + * ```yml + * - name: Danger JS + * uses: danger/danger-js@9.1.6 + * env: DANGER_GITHUB_API_TOKEN: ${{ secrets.DANGER_GITHUB_API_TOKEN }} + * ``` + * #### OSS Tokens + * + * The security models for GitHub actions means that you cannot use `secrets.GITHUB_TOKEN` + * in PRs from forks. This cna be tricky with OSS contributions. In these cases, create a + * new GitHub account and set up your `.yml` like this: + * + * ```yml + * - name: Set danger env + * run: echo "DANGER_GITHUB_API_TOKEN=$(echo FIRST_HALF + SECOND_HALF)" >> $GITHUB_ENV + * + * - name: Run Danger + * run: yarn danger ci + * env: + * DANGER_GITHUB_API_TOKEN: ${{ env.DANGER_GITHUB_API_TOKEN }} + * ``` + * + * #### Advanced + * + * If you understand the security ramifications, Danger JS can run on a `pull_request_target` + * workflow, instead of a `pull_request`. You should thoroughly read [the docs first](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#pull_request_target). + * + * ```yml + * on: + * pull_request_target: + * types: [assigned, opened, synchronize, reopened] + * + * jobs: + * build: + * runs-on: ubuntu-latest + * + * steps: + * - uses: actions/checkout@v1 + * - uses: actions/setup-node@v1 + * - run: yarn install + * + * - run: yarn danger ci + * env: + * DANGER_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + * ``` + * + * Note that when using Danger in this way, you will not have the file-system set up for + * the PR, so you cannot use `fs` to read a file (use `danger.github.utils.fileContents` instead) + * but the usual PR metadata and DSL will act the same. */ export class GitHubActions implements CISource { diff --git a/source/ci_source/providers/Jenkins.ts b/source/ci_source/providers/Jenkins.ts index 4efc10af0..ca64bc297 100644 --- a/source/ci_source/providers/Jenkins.ts +++ b/source/ci_source/providers/Jenkins.ts @@ -75,7 +75,7 @@ export class Jenkins implements CISource { return result.repo } - return this.env.ghprbGhRepository || this.env.gitlabTargetNamespace + "/" + this.env.gitlabTargetRepoName + return this.env.ghprbGhRepository || new URL(this.env.GIT_URL_1).pathname.replace(/^\/(.*)\.git$/, "$1") } get ciRunURL() { diff --git a/source/ci_source/providers/Nevercode.ts b/source/ci_source/providers/Nevercode.ts index 861115bb8..1e13098cf 100644 --- a/source/ci_source/providers/Nevercode.ts +++ b/source/ci_source/providers/Nevercode.ts @@ -5,6 +5,13 @@ import { ensureEnvKeysExist, ensureEnvKeysAreInt } from "../ci_source_helpers" * Nevercode.io CI Integration * * Environment Variables Documented: https://developer.nevercode.io/v1.0/docs/environment-variables-files + * + * Note: The company that runs Nevercode is migrating all customers + * to their new service Codemagic.io in Spring of 2021 + * - billing is migrated through Customer Support + * - the CI Configuration is managed in your repo instead of in a web-dashboard. + * + * TODO @fbartho delete this integration when it's fully offline. */ export class Nevercode implements CISource { constructor(private readonly env: Env) {} diff --git a/source/ci_source/providers/XcodeCloud.ts b/source/ci_source/providers/XcodeCloud.ts new file mode 100644 index 000000000..86f4067a8 --- /dev/null +++ b/source/ci_source/providers/XcodeCloud.ts @@ -0,0 +1,46 @@ +import { Env, CISource } from "../ci_source" +import { ensureEnvKeysExist } from "../ci_source_helpers" + +/** + * ### CI Setup + * + * Install dependencies and add a danger step to the custom build scripts. + * See the Xcode Cloud documentation [here](https://developer.apple.com/documentation/xcode/writing-custom-build-scripts) + * + * ### Token Setup + * + * Setup the acesss token (for github `DANGER_GITHUB_API_TOKEN`) environment variable for your workflow. + * See the Xcode Cloud documentation [here](https://developer.apple.com/documentation/xcode/xcode-cloud-workflow-reference#Custom-Environment-Variables) + */ +export class XcodeCloud implements CISource { + constructor(private readonly env: Env) { } + + get name(): string { + return "Xcode Cloud" + } + + get isCI(): boolean { + const mustHave = ["CI", "CI_XCODEBUILD_ACTION"] + return ( + ensureEnvKeysExist(this.env, mustHave) && + this.env.CI == "TRUE" + ) + } + + get isPR(): boolean { + const mustHave = ["CI_PULL_REQUEST_NUMBER", "CI_PULL_REQUEST_TARGET_REPO"] + return ensureEnvKeysExist(this.env, mustHave) + } + + get repoSlug(): string { + return this.env.CI_PULL_REQUEST_TARGET_REPO + } + + get pullRequestID(): string { + return this.env.CI_PULL_REQUEST_NUMBER + } + + get commitHash(): string { + return this.env.CI_COMMIT + } +} diff --git a/source/ci_source/providers/_tests/_bamboo.test.ts b/source/ci_source/providers/_tests/_bamboo.test.ts new file mode 100644 index 000000000..b7063e70f --- /dev/null +++ b/source/ci_source/providers/_tests/_bamboo.test.ts @@ -0,0 +1,81 @@ +import { Bamboo } from "../Bamboo" +import { getCISourceForEnv } from "../../get_ci_source" + +const correctEnv = { + bamboo_buildPlanName: "My Build Plan", + bamboo_repository_pr_key: "1234", + bamboo_planRepository_repositoryUrl: "ssh://git@bitbucket.mycompany.com:7999/my_project/my_repository.git", +} + +const correctDotedRepoEnv = { + bamboo_buildPlanName: "My Build Plan", + bamboo_repository_pr_key: "1234", + bamboo_planRepository_repositoryUrl: "ssh://git@bitbucket.mycompany.com:7999/my_project/my.custom.repository.git", +} + +describe("being found when looking for CI", () => { + it("finds Bamboo with the right ENV", () => { + const ci = getCISourceForEnv(correctEnv) + expect(ci).toBeInstanceOf(Bamboo) + }) +}) + +describe(".isCI", () => { + it("validates when all Bamboo environment vars are set", () => { + const pipelines = new Bamboo(correctEnv) + expect(pipelines.isCI).toBeTruthy() + }) + + it("does not validate without josh", () => { + const pipelines = new Bamboo({}) + expect(pipelines.isCI).toBeFalsy() + }) +}) + +describe(".isPR", () => { + it("validates when all Bamboo environment vars are set", () => { + const pipelines = new Bamboo(correctEnv) + expect(pipelines.isPR).toBeTruthy() + }) + + it("does not validate outside of Bamboo", () => { + const pipelines = new Bamboo({}) + expect(pipelines.isPR).toBeFalsy() + }) + + Object.keys(correctEnv).forEach((key: string) => { + let env = Object.assign({}, correctEnv) + env[key] = null + + it(`does not validate when ${key} is missing`, () => { + const pipelines = new Bamboo(env) + expect(pipelines.isPR).toBeFalsy() + }) + + it("needs to have a PR number", () => { + let env = Object.assign({}, correctEnv) + // @ts-ignore + delete env["bamboo_repository_pr_key"] + const pipelines = new Bamboo(env) + expect(pipelines.isPR).toBeFalsy() + }) + }) +}) + +describe(".pullRequestID", () => { + it("pulls it out of the env", () => { + const pipelines = new Bamboo({ bamboo_repository_pr_key: "800" }) + expect(pipelines.pullRequestID).toEqual("800") + }) +}) + +describe(".repoSlug", () => { + it("derives it from the PR Url", () => { + const pipelines = new Bamboo(correctEnv) + expect(pipelines.repoSlug).toEqual("projects/my_project/repos/my_repository") + }) + it("derives it from the PR doted Url", () => { + const pipelines = new Bamboo(correctDotedRepoEnv) + expect(pipelines.repoSlug).toEqual("projects/my_project/repos/my.custom.repository") + }) +}) diff --git a/source/ci_source/providers/_tests/_bitrise.test.ts b/source/ci_source/providers/_tests/_bitrise.test.ts index def8c0781..9bd49c8e6 100644 --- a/source/ci_source/providers/_tests/_bitrise.test.ts +++ b/source/ci_source/providers/_tests/_bitrise.test.ts @@ -4,7 +4,8 @@ import { getCISourceForEnv } from "../../get_ci_source" const correctEnv = { BITRISE_IO: "true", BITRISE_PULL_REQUEST: "800", - GIT_REPOSITORY_URL: "https://github.com/artsy/eigen", + BITRISEIO_GIT_REPOSITORY_OWNER: "artsy", + BITRISEIO_GIT_REPOSITORY_SLUG: "eigen", } describe("being found when looking for CI", () => { @@ -37,7 +38,7 @@ describe(".isPR", () => { expect(bitrise.isPR).toBeFalsy() }) - const envs = ["BITRISE_PULL_REQUEST", "GIT_REPOSITORY_URL", "BITRISE_IO"] + const envs = ["BITRISE_PULL_REQUEST", "BITRISEIO_GIT_REPOSITORY_OWNER", "BITRISEIO_GIT_REPOSITORY_SLUG", "BITRISE_IO"] envs.forEach((key: string) => { let env = { ...correctEnv } env[key] = null @@ -59,19 +60,10 @@ describe(".pullRequestID", () => { }) describe(".repoSlug", () => { - it("derives it from the repo URL", () => { + it("derives it from the repo owner and slug", () => { const bitrise = new Bitrise(correctEnv) expect(bitrise.repoSlug).toEqual("artsy/eigen") }) - - it("derives it from the repo URL in SSH format", () => { - const env = { - ...correctEnv, - GIT_REPOSITORY_URL: "git@github.com:artsy/eigen.git", - } - const bitrise = new Bitrise(env) - expect(bitrise.repoSlug).toEqual("artsy/eigen") - }) }) describe("commit hash", () => { diff --git a/source/ci_source/providers/_tests/_buddyWorks.test.ts b/source/ci_source/providers/_tests/_buddyWorks.test.ts index 3ac04756e..dcbeabe0e 100644 --- a/source/ci_source/providers/_tests/_buddyWorks.test.ts +++ b/source/ci_source/providers/_tests/_buddyWorks.test.ts @@ -52,6 +52,7 @@ describe(".isPR", () => { it("needs to have a PR number", () => { const env = Object.assign({}, correctEnv) + // @ts-ignore delete env.BUDDY_EXECUTION_PULL_REQUEST_NO const buddyWorks = new BuddyWorks(env) expect(buddyWorks.isPR).toBeFalsy() diff --git a/source/ci_source/providers/_tests/_circle.test.ts b/source/ci_source/providers/_tests/_circle.test.ts index cb8342e5a..34b252eed 100644 --- a/source/ci_source/providers/_tests/_circle.test.ts +++ b/source/ci_source/providers/_tests/_circle.test.ts @@ -97,3 +97,19 @@ describe(".repoSlug", () => { expect(circle.repoSlug).toEqual("artsy/eigen") }) }) + +describe("commit hash", () => { + it("returns correct commit hash when present", () => { + const env = { + ...correctEnv, + CIRCLE_SHA1: "1234abc", + } + const circle = new Circle(env) + expect(circle.commitHash).toEqual("1234abc") + }) + + it("returns no commit hash when not present", () => { + const circle = new Circle(correctEnv) + expect(circle.commitHash).toBeUndefined() + }) +}) diff --git a/source/ci_source/providers/_tests/_codebuild.test.ts b/source/ci_source/providers/_tests/_codebuild.test.ts index f09992918..b8e350931 100644 --- a/source/ci_source/providers/_tests/_codebuild.test.ts +++ b/source/ci_source/providers/_tests/_codebuild.test.ts @@ -1,5 +1,6 @@ import { CodeBuild } from "../CodeBuild" import { getCISourceForEnv } from "../../get_ci_source" +import { getPullRequestIDForBranch } from "../../ci_source_helpers" const correctEnv = { CODEBUILD_BUILD_ID: "123", @@ -8,6 +9,18 @@ const correctEnv = { DANGER_GITHUB_API_TOKEN: "xxx", } +const setupCodeBuildSource = async (env: Object) => { + const source = new CodeBuild(env) + await source.setup() + + return source +} + +jest.mock("../../ci_source_helpers", () => ({ + ...jest.requireActual("../../ci_source_helpers"), + getPullRequestIDForBranch: jest.fn(), +})) + describe("being found when looking for CI", () => { it("finds CodeBuild with the right ENV", () => { const cb = getCISourceForEnv(correctEnv) @@ -16,57 +29,82 @@ describe("being found when looking for CI", () => { }) describe(".isCI", () => { - it("validates when all CodeBuild environment vars are set", () => { - const codebuild = new CodeBuild(correctEnv) + it("validates when all CodeBuild environment vars are set", async () => { + const codebuild = await setupCodeBuildSource(correctEnv) expect(codebuild.isCI).toBeTruthy() }) - it("does not validate without env", () => { - const codebuild = new CodeBuild({}) + it("does not validate without env", async () => { + const codebuild = await setupCodeBuildSource({}) expect(codebuild.isCI).toBeFalsy() }) }) describe(".isPR", () => { - it("validates when all CodeBuild environment vars are set", () => { - const codebuild = new CodeBuild(correctEnv) + it("validates when all CodeBuild environment vars are set", async () => { + const codebuild = await setupCodeBuildSource(correctEnv) expect(codebuild.isPR).toBeTruthy() }) - it("does not validate outside of CodeBuild", () => { - const codebuild = new CodeBuild({}) + it("does not validate outside of CodeBuild", async () => { + const codebuild = await setupCodeBuildSource({}) expect(codebuild.isPR).toBeFalsy() }) - const envs = ["CODEBUILD_BUILD_ID", "CODEBUILD_SOURCE_VERSION", "CODEBUILD_SOURCE_REPO_URL"] - envs.forEach((key: string) => { - let env = Object.assign({}, correctEnv) - env[key] = null - - it(`does not validate when ${key} is missing`, () => { - const codebuild = new CodeBuild({}) - expect(codebuild.isPR).toBeFalsy() - }) + it.each(["CODEBUILD_BUILD_ID", "CODEBUILD_SOURCE_REPO_URL"])(`does not validate when %s is missing`, async key => { + const copiedEnv = { ...correctEnv } + delete copiedEnv[key] + const codebuild = await setupCodeBuildSource(copiedEnv) + expect(codebuild.isPR).toBeFalsy() }) - it("needs to have a PR number", () => { + it("needs to have a PR number", async () => { let env = Object.assign({}, correctEnv) env.CODEBUILD_SOURCE_VERSION = "pr/abc" - const codebuild = new CodeBuild(env) + const codebuild = await setupCodeBuildSource(env) expect(codebuild.isPR).toBeFalsy() }) }) describe(".pullRequestID", () => { - it("splits it from the env", () => { - const codebuild = new CodeBuild({ CODEBUILD_SOURCE_VERSION: "pr/2" }) + beforeEach(() => { + jest.resetAllMocks() + }) + + it.each(["CODEBUILD_SOURCE_VERSION", "CODEBUILD_WEBHOOK_TRIGGER"])("splits it from %s", async key => { + const codebuild = await setupCodeBuildSource({ [key]: "pr/2" }) + await codebuild.setup() expect(codebuild.pullRequestID).toEqual("2") }) + + it("calls the API to get the PR number if not available in the env vars", async () => { + ;(getPullRequestIDForBranch as jest.Mock).mockResolvedValue(1) + const env = { + CODEBUILD_SOURCE_REPO_URL: "https://github.com/sharkysharks/some-repo", + CODEBUILD_WEBHOOK_TRIGGER: "branch/my-branch", + DANGER_GITHUB_API_TOKEN: "xxx", + } + const codebuild = await setupCodeBuildSource(env) + expect(codebuild.pullRequestID).toBe("1") + expect(getPullRequestIDForBranch).toHaveBeenCalledTimes(1) + expect(getPullRequestIDForBranch).toHaveBeenCalledWith(codebuild, env, "my-branch") + }) + + it("does not call the API if no PR number or branch name available in the env vars", async () => { + const env = { + CODEBUILD_SOURCE_REPO_URL: "https://github.com/sharkysharks/some-repo", + CODEBUILD_WEBHOOK_TRIGGER: "tag/my-tag", + DANGER_GITHUB_API_TOKEN: "xxx", + } + const codebuild = await setupCodeBuildSource(env) + expect(codebuild.pullRequestID).toBe("0") + expect(getPullRequestIDForBranch).not.toHaveBeenCalled() + }) }) describe(".repoSlug", () => { - it("parses it from the repo url", () => { - const codebuild = new CodeBuild(correctEnv) + it("parses it from the repo url", async () => { + const codebuild = await setupCodeBuildSource(correctEnv) expect(codebuild.repoSlug).toEqual("sharkysharks/some-repo") }) }) diff --git a/source/ci_source/providers/_tests/_codemagic.test.ts b/source/ci_source/providers/_tests/_codemagic.test.ts new file mode 100644 index 000000000..c4e85845e --- /dev/null +++ b/source/ci_source/providers/_tests/_codemagic.test.ts @@ -0,0 +1,60 @@ +import { Codemagic } from "../Codemagic" +import { getCISourceForEnv } from "../../get_ci_source" + +const correctEnv = { + FCI_PROJECT_ID: "abcdef123-app-uuid", + FCI_BUILD_ID: "abcdef123-build-uuid", + FCI_REPO_SLUG: "danger/danger-js", + FCI_PULL_REQUEST: "true", + FCI_PULL_REQUEST_NUMBER: "2", + BUILD_NUMBER: "42", +} + +describe("being found when looking for CI", () => { + it("finds Codemagic with the right ENV", () => { + const ci = getCISourceForEnv(correctEnv) + expect(ci).toBeInstanceOf(Codemagic) + }) +}) + +describe(".isCI", () => { + it("validates when all Codemagic environment vars are set", () => { + const codemagic = new Codemagic(correctEnv) + expect(codemagic.isCI).toBeTruthy() + }) + + it("does not validate without env", () => { + const codemagic = new Codemagic({}) + expect(codemagic.isCI).toBeFalsy() + }) +}) + +describe(".isPR", () => { + it("validates when all codemagic environment vars are set", () => { + const codemagic = new Codemagic(correctEnv) + expect(codemagic.isPR).toBeTruthy() + }) + + it("does not validate outside of codemagic", () => { + const codemagic = new Codemagic({}) + expect(codemagic.isPR).toBeFalsy() + }) + + const envs = [ + "FCI_PULL_REQUEST", + "FCI_REPO_SLUG", + "FCI_PROJECT_ID", + "FCI_BUILD_ID", + "BUILD_NUMBER", + "FCI_PULL_REQUEST_NUMBER", + ] + envs.forEach((key: string) => { + let env = Object.assign({}, correctEnv) + delete env[key] + + it(`does not validate when ${key} is missing`, () => { + const codemagic = new Codemagic(env) + expect(codemagic.isCI && codemagic.isPR).toBeFalsy() + }) + }) +}) diff --git a/source/ci_source/providers/_tests/_xcodeCloud.test.ts b/source/ci_source/providers/_tests/_xcodeCloud.test.ts new file mode 100644 index 000000000..325701bed --- /dev/null +++ b/source/ci_source/providers/_tests/_xcodeCloud.test.ts @@ -0,0 +1,84 @@ +import { XcodeCloud } from "../XcodeCloud" +import { getCISourceForEnv } from "../../get_ci_source" + +const correctEnv = { + CI: "TRUE", + CI_XCODEBUILD_ACTION: "build", + CI_PULL_REQUEST_TARGET_REPO: "someone/something", + CI_PULL_REQUEST_NUMBER: "999", +} + +describe("being found when looking for CI", () => { + it("finds XcodeCloud with the right ENV", () => { + const ci = getCISourceForEnv(correctEnv) + expect(ci).toBeInstanceOf(XcodeCloud) + }) +}) + +describe(".isCI", () => { + it("validates when all XcodeCloud environment vars are set", () => { + const xcodeCloud = new XcodeCloud(correctEnv) + expect(xcodeCloud.isCI).toBeTruthy() + }) + + it("does not validate", () => { + const xcodeCloud = new XcodeCloud({}) + expect(xcodeCloud.isCI).toBeFalsy() + }) +}) + +describe(".isPR", () => { + it("validates when all XcodeCloud environment vars are set", () => { + const xcodeCloud = new XcodeCloud(correctEnv) + expect(xcodeCloud.isPR).toBeTruthy() + }) + + it("does not validate outside of XcodeCloud", () => { + const xcodeCloud = new XcodeCloud({}) + expect(xcodeCloud.isPR).toBeFalsy() + }) + + const envs = ["CI_PULL_REQUEST_TARGET_REPO", "CI_PULL_REQUEST_NUMBER"] + envs.forEach((key: string) => { + let env = { + CI_PULL_REQUEST_TARGET_REPO: "someone/something", + CI_PULL_REQUEST_NUMBER: "999", + } + env[key] = null + + it(`does not validate when ${key} is missing`, () => { + const xcodeCloud = new XcodeCloud(env) + expect(xcodeCloud.isPR).toBeFalsy() + }) + }) +}) + +describe(".pullRequestID", () => { + it("pulls it out of the env", () => { + const xcodeCloud = new XcodeCloud({ CI_PULL_REQUEST_NUMBER: "999" }) + expect(xcodeCloud.pullRequestID).toEqual("999") + }) +}) + +describe(".repoSlug", () => { + it("pulls it out of the env", () => { + const xcodeCloud = new XcodeCloud({ CI_PULL_REQUEST_TARGET_REPO: "someone/something" }) + expect(xcodeCloud.repoSlug).toEqual("someone/something") + }) +}) + +describe("commit hash", () => { + it("returns correct commit hash when present", () => { + const env = { + ...correctEnv, + CI_COMMIT: "1234abc", + } + const xcodeCloud = new XcodeCloud(env) + expect(xcodeCloud.commitHash).toEqual("1234abc") + }) + + it("returns no commit hash when not present", () => { + const xcodeCloud = new XcodeCloud(correctEnv) + expect(xcodeCloud.commitHash).toBeUndefined() + }) +}) diff --git a/source/ci_source/providers/index.ts b/source/ci_source/providers/index.ts index 73b82f1ad..fdcb1a2a4 100644 --- a/source/ci_source/providers/index.ts +++ b/source/ci_source/providers/index.ts @@ -1,12 +1,16 @@ import { AppCenter } from "./AppCenter" +import { Bamboo } from "./Bamboo" +import { BitbucketPipelines } from "./BitbucketPipelines" import { Bitrise } from "./Bitrise" import { BuddyBuild } from "./BuddyBuild" import { BuddyWorks } from "./BuddyWorks" import { Buildkite } from "./Buildkite" import { Circle } from "./Circle" +import { Cirrus } from "./Cirrus" import { CodeBuild } from "./CodeBuild" import { Codefresh } from "./Codefresh" import { Codeship } from "./Codeship" +import { Codemagic } from "./Codemagic" import { Concourse } from "./Concourse" import { DockerCloud } from "./DockerCloud" import { Drone } from "./Drone" @@ -22,8 +26,7 @@ import { Surf } from "./Surf" import { TeamCity } from "./TeamCity" import { Travis } from "./Travis" import { VSTS } from "./VSTS" -import { BitbucketPipelines } from "./BitbucketPipelines" -import { Cirrus } from "./Cirrus" +import { XcodeCloud } from "./XcodeCloud" const providers = [ FakeCI, @@ -52,6 +55,9 @@ const providers = [ AppCenter, BitbucketPipelines, Cirrus, + Bamboo, + Codemagic, + XcodeCloud, ] // Mainly used for Dangerfile linting @@ -78,7 +84,10 @@ const realProviders = [ CodeBuild, Codefresh, AppCenter, - Cirrus + Cirrus, + Bamboo, + Codemagic, + XcodeCloud, ] export { providers, realProviders } diff --git a/source/commands/ci/_tests/runner.test.ts b/source/commands/ci/_tests/runner.test.ts index aec82f5ec..f40800fc7 100644 --- a/source/commands/ci/_tests/runner.test.ts +++ b/source/commands/ci/_tests/runner.test.ts @@ -93,3 +93,51 @@ it.skip("passes the dangerID from args into the executor config", async () => { const executor: Executor = mockRunDangerSubprocess.mock.calls[0][2] expect(executor.options.dangerID).toEqual("test-danger-run") }) + +it("sets newComment to false by default", async () => { + await runRunner(defaultAppArgs as SharedCLI, { platform, source }) + + // Pull the executor out of the call to runDangerSubprocess + const executor: Executor = mockRunDangerSubprocess.mock.calls[0][2] + expect(executor.ciSource).toEqual(source) + expect(executor.platform).toEqual(platform) + expect(executor.options.newComment).toEqual(false) +}) + +it("passes newComment option if requested", async () => { + const customArgs = { + ...defaultAppArgs, + newComment: true, + } as SharedCLI + await runRunner(customArgs, { platform, source }) + + // Pull the executor out of the call to runDangerSubprocess + const executor: Executor = mockRunDangerSubprocess.mock.calls[0][2] + expect(executor.ciSource).toEqual(source) + expect(executor.platform).toEqual(platform) + expect(executor.options.newComment).toEqual(true) +}) + +it("sets removePreviousComments to false by default", async () => { + await runRunner(defaultAppArgs as SharedCLI, { platform, source }) + + // Pull the executor out of the call to runDangerSubprocess + const executor: Executor = mockRunDangerSubprocess.mock.calls[0][2] + expect(executor.ciSource).toEqual(source) + expect(executor.platform).toEqual(platform) + expect(executor.options.removePreviousComments).toEqual(false) +}) + +it("passes removePreviousComments option if requested", async () => { + const customArgs = { + ...defaultAppArgs, + removePreviousComments: true, + } as SharedCLI + await runRunner(customArgs, { platform, source }) + + // Pull the executor out of the call to runDangerSubprocess + const executor: Executor = mockRunDangerSubprocess.mock.calls[0][2] + expect(executor.ciSource).toEqual(source) + expect(executor.platform).toEqual(platform) + expect(executor.options.removePreviousComments).toEqual(true) +}) diff --git a/source/commands/ci/runner.ts b/source/commands/ci/runner.ts index 7209eaf43..b7fb79f69 100644 --- a/source/commands/ci/runner.ts +++ b/source/commands/ci/runner.ts @@ -3,7 +3,7 @@ import { debug } from "../../debug" import { getPlatformForEnv, Platform } from "../../platforms/platform" import { Executor, ExecutorOptions } from "../../runner/Executor" -import { runDangerSubprocess } from "../utils/runDangerSubprocess" +import { runDangerSubprocess, addSubprocessCallAguments } from "../utils/runDangerSubprocess" import { SharedCLI } from "../utils/sharedDangerfileArgs" import getRuntimeCISource from "../utils/getRuntimeCISource" @@ -62,15 +62,18 @@ export const runRunner = async (app: SharedCLI, config?: Partial) const execConfig: ExecutorOptions = { stdoutOnly: !platform.supportsCommenting() || app.textOnly, verbose: app.verbose, - jsonOnly: false, + jsonOnly: app.outputJSON, dangerID: app.id || "Danger", passURLForDSL: app.passURLForDSL || false, disableGitHubChecksSupport: !app.useGithubChecks, failOnErrors: app.failOnErrors, noPublishCheck: !app.publishCheck, + ignoreOutOfDiffComments: app.ignoreOutOfDiffComments, + newComment: app.newComment || false, + removePreviousComments: app.removePreviousComments || false, } - const processName = (app.process && app.process.split(" ")) || undefined + const processName = (app.process && addSubprocessCallAguments(app.process.split(" "))) || undefined const runnerCommand = processName || dangerRunToRunnerCLI(process.argv) d(`Preparing to run: ${runnerCommand}`) diff --git a/source/commands/danger-ci.ts b/source/commands/danger-ci.ts index dde3391a6..80604e121 100755 --- a/source/commands/danger-ci.ts +++ b/source/commands/danger-ci.ts @@ -9,6 +9,7 @@ program .usage("[options]") .description("Runs a Dangerfile in JavaScript or TypeScript.") .option("--no-publish-check", "Don't add Danger check to PR", false) + .allowUnknownOption(true) setSharedArgs(program).parse(process.argv) diff --git a/source/commands/danger-init.ts b/source/commands/danger-init.ts index 60509a8ac..95eab8fd7 100644 --- a/source/commands/danger-init.ts +++ b/source/commands/danger-init.ts @@ -54,7 +54,7 @@ const showNonGitHubWarning = (ui: InitUI) => { ui.say("\nWe're definitely open to PRs improving this. You can find the code at:") const link = ui.link( "danger/danger-js#/source/commands/danger-init.ts", - "https://github.com/danger/danger-js/blob/master/source/commands/danger-init.ts" + "https://github.com/danger/danger-js/blob/main/source/commands/danger-init.ts" ) ui.say("\n > " + link + "\n") } diff --git a/source/commands/danger-local.ts b/source/commands/danger-local.ts index 0da86dece..640d4f8c7 100644 --- a/source/commands/danger-local.ts +++ b/source/commands/danger-local.ts @@ -16,16 +16,17 @@ interface App extends SharedCLI { program .usage("[options]") - // TODO: this option - // .option("-s, --staging", "Just use staged changes.") .description("Runs danger without PR metadata, useful for git hooks.") + .option("-s, --staging", "Just use staged changes.") .option("-b, --base [branch_name]", "Use a different base branch") + .option("-j, --outputJSON", "Outputs the resulting JSON to STDOUT") + .allowUnknownOption(true) setSharedArgs(program).parse(process.argv) const app = (program as any) as App const base = app.base || "master" -const localPlatform = new LocalGit({ base, staged: app.staging }) +const localPlatform = new LocalGit({ base, staging: app.staging }) localPlatform.validateThereAreChanges().then(changes => { if (changes) { const fakeSource = new FakeCI(process.env) diff --git a/source/commands/danger-pr.ts b/source/commands/danger-pr.ts index c549b8dc7..41fedabba 100644 --- a/source/commands/danger-pr.ts +++ b/source/commands/danger-pr.ts @@ -33,6 +33,7 @@ program .description("Emulate running Danger against an existing GitHub Pull Request.") .option("-J, --json", "Output the raw JSON that would be passed into `danger process` for this PR.") .option("-j, --js", "A more human-readable version of the JSON.") + .allowUnknownOption(true) .on("--help", () => { log("\n") @@ -42,11 +43,12 @@ program !process.env["DANGER_BITBUCKETSERVER_HOST"] && !process.env["DANGER_BITBUCKETCLOUD_OAUTH_KEY"] && !process.env["DANGER_BITBUCKETCLOUD_USERNAME"] && - !gitLabApiCredentials.token + !gitLabApiCredentials.token && + !gitLabApiCredentials.oauthToken ) { log("") log( - " You don't have a DANGER_GITHUB_API_TOKEN/DANGER_GITLAB_API_TOKEN/DANGER_BITBUCKETCLOUD_OAUTH_KEY/DANGER_BITBUCKETCLOUD_USERNAME set up, this is optional, but TBH, you want to do this." + " You don't have a DANGER_GITHUB_API_TOKEN/DANGER_GITLAB_API_TOKEN/DANGER_GITLAB_API_OAUTH_TOKEN/DANGER_BITBUCKETCLOUD_OAUTH_KEY/DANGER_BITBUCKETCLOUD_USERNAME set up, this is optional, but TBH, you want to do this." ) log(" Check out: http://danger.systems/js/guides/the_dangerfile.html#working-on-your-dangerfile") log("") diff --git a/source/commands/danger-process.ts b/source/commands/danger-process.ts index 376e8311f..c9e00a041 100644 --- a/source/commands/danger-process.ts +++ b/source/commands/danger-process.ts @@ -42,6 +42,7 @@ program console.log(" -> Danger Process:") console.log(" http://danger.systems/js/usage/danger-process.html") }) + .allowUnknownOption(true) setSharedArgs(program) program.action(process_name => (subprocessName = process_name)).parse(process.argv) @@ -94,6 +95,7 @@ getRuntimeCISource(app).then(source => { passURLForDSL: app.passURLForDSL || false, disableGitHubChecksSupport: !app.useGithubChecks, failOnErrors: app.failOnErrors, + ignoreOutOfDiffComments: app.ignoreOutOfDiffComments, } d("Exec config: ", execConfig) diff --git a/source/commands/utils/_tests/dangerRunToRunnerCLI.test.ts b/source/commands/utils/_tests/dangerRunToRunnerCLI.test.ts index 7fbe25eaa..a67102875 100644 --- a/source/commands/utils/_tests/dangerRunToRunnerCLI.test.ts +++ b/source/commands/utils/_tests/dangerRunToRunnerCLI.test.ts @@ -1,4 +1,5 @@ import dangerRunToRunnerCLI from "../dangerRunToRunnerCLI" +import { addSubprocessCallAguments } from "../runDangerSubprocess" describe("it can handle the command", () => { it("`danger ci`", () => { @@ -49,6 +50,33 @@ it("`danger pr --dangerfile 'myDanger file.ts'`", () => { ]) }) +it("Adds correct subprocess arguments", () => { + expect( + addSubprocessCallAguments( + ["danger-swift"], + ["danger", "danger-pr", "--process", "danger-swift", "--dangerfile", "File.swift"] + ) + ).toEqual(["danger-swift", "runner", "danger-pr", "--process", "danger-swift", "--dangerfile", "File.swift"]) +}) + +describe("npx danger-ts", () => { + it("switches to the danger in the node_mods", () => { + // the code uses join which gives different results on windows, and I'm too lazy to add a specific test for that + const isWindows = process.platform === "win32" + if (!isWindows) { + expect( + dangerRunToRunnerCLI([ + "/Users/ortatherox/.nvm/versions/node/v14.5.0/bin/node", + "/Users/ortatherox/.npm/_npx/23085/bin/danger-ts", + ]) + ).toEqual([ + "/Users/ortatherox/.nvm/versions/node/v14.5.0/bin/node", + "/Users/ortatherox/.npm/_npx/23085/lib/node_modules/danger-ts/node_modules/danger/distribution/commands/danger-runner.js", + ]) + } + }) +}) + describe("it can handle the command when running from pkg", () => { beforeAll(() => { process.pkg = { diff --git a/source/commands/utils/dangerRunToRunnerCLI.ts b/source/commands/utils/dangerRunToRunnerCLI.ts index 573002094..a5cac0a76 100644 --- a/source/commands/utils/dangerRunToRunnerCLI.ts +++ b/source/commands/utils/dangerRunToRunnerCLI.ts @@ -1,3 +1,5 @@ +import { join } from "path" + const usesProcessSeparationCommands = ["ci", "pr", "local"] const dangerRunToRunnerCLI = (argv: string[]) => { @@ -16,6 +18,26 @@ const dangerRunToRunnerCLI = (argv: string[]) => { newJSFile = newJSFile.replace("danger-" + name, "danger-runner") }) + // Support re-routing internally in npx for danger-ts + // If I recall, npm 7 is getting an npx re-write, so it might + // be worth recommending yarn, but that requires folks using yarn 2 + // which I'm not sure will ever get the same level of a adoption of yarn v1 + // + if (newJSFile.includes("npx") && newJSFile.endsWith("danger-ts")) { + newJSFile = join( + newJSFile, + "..", + "..", + "lib", + "node_modules", + "danger-ts", + "node_modules", + "danger", + "distribution", + "commands", + "danger-runner.js" + ) + } newCommand.push(newJSFile) for (let index = 2; index < argv.length; index++) { newCommand.push(argv[index]) diff --git a/source/commands/utils/fileUtils.ts b/source/commands/utils/fileUtils.ts index 9607b372b..6d2009470 100644 --- a/source/commands/utils/fileUtils.ts +++ b/source/commands/utils/fileUtils.ts @@ -1,4 +1,5 @@ import { existsSync } from "fs" +import { cwd } from "process" /** * Returns a the typical Dangerfile, depending on it's location @@ -27,5 +28,5 @@ export function dangerfilePath(program: any): string { return "Dangerfile.js" } - throw new Error("Could not find a `dangerfile.js` or `dangerfile.ts` in the current working directory.") + throw new Error(`Could not find a 'dangerfile.js' or 'dangerfile.ts' in the current working directory (${cwd()}).`) } diff --git a/source/commands/utils/runDangerSubprocess.ts b/source/commands/utils/runDangerSubprocess.ts index bd15c2f59..9e35d40e6 100644 --- a/source/commands/utils/runDangerSubprocess.ts +++ b/source/commands/utils/runDangerSubprocess.ts @@ -19,6 +19,7 @@ const messageToSendDSL = "danger://send-dsl" // Sanitizes the DSL so for sending via STDOUT export const prepareDangerDSL = (dangerDSL: DangerDSLJSONType) => { if (dangerDSL.github && dangerDSL.github.api) { + // @ts-ignore delete dangerDSL.github.api } @@ -26,6 +27,10 @@ export const prepareDangerDSL = (dangerDSL: DangerDSLJSONType) => { return JSON.stringify(dangerJSONOutput, null, " ") + "\n" } +export const addSubprocessCallAguments = (call: string[], args: string[] = process.argv): string[] => { + return call.concat(["runner"], args.slice(1, args.length)) +} + // Runs the Danger process export const runDangerSubprocess = ( subprocessName: string[], @@ -116,7 +121,7 @@ export const runDangerSubprocess = ( d(`Handling fail from subprocess`) process.exitCode = code - const failResults = resultsWithFailure(`${processDisplayName}\` failed.`, "### Log\n\n" + markdownCode(allLogs)) + const failResults = resultsWithFailure(`\`${processDisplayName}\` failed.`, "### Log\n\n" + markdownCode(allLogs)) if (results) { results = mergeResults(results, failResults) } else { diff --git a/source/commands/utils/sharedDangerfileArgs.ts b/source/commands/utils/sharedDangerfileArgs.ts index 65f3fe604..1931714ec 100644 --- a/source/commands/utils/sharedDangerfileArgs.ts +++ b/source/commands/utils/sharedDangerfileArgs.ts @@ -27,6 +27,14 @@ export interface SharedCLI extends program.CommanderStatic { failOnErrors: boolean /** Use GitHub Checks */ useGithubChecks: boolean + /** Ignore inline-comments that are in lines which were not changed */ + ignoreOutOfDiffComments: boolean + /** Makes Danger post a new comment instead of editing its previous one */ + newComment?: boolean + /** Removes all previous comment and create a new one in the end of the list */ + removePreviousComments?: boolean + /** Output JSON to STDOUT */ + outputJSON: boolean } export default (command: any) => @@ -43,3 +51,10 @@ export default (command: any) => .option("-u, --passURLForDSL", "[dev] Use a custom URL to send the Danger DSL into the sub-process") .option("-f, --failOnErrors", "Fail if there are fails in the danger report", false) .option("--use-github-checks", "Use GitHub Checks", false) + .option("--ignoreOutOfDiffComments", "Ignore inline-comments that are in lines which were not changed", false) + .option("--newComment", "Makes Danger post a new comment instead of editing its previous one", false) + .option( + "--removePreviousComments", + "Removes all previous comment and create a new one in the end of the list", + false + ) diff --git a/source/danger-incoming-process-schema.json b/source/danger-incoming-process-schema.json index 660ddc495..e69de29bb 100644 --- a/source/danger-incoming-process-schema.json +++ b/source/danger-incoming-process-schema.json @@ -1,1207 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "BitBucketServerCommit": { - "description": "A BitBucketServer specific implementation of a git commit.", - "properties": { - "author": { - "description": "The author of the commit, assumed to be the person who wrote the code.", - "properties": { - "displayName": { - "description": "The display name of the commit author", - "type": "string" - }, - "emailAddress": { - "description": "The email of the commit author", - "type": "string" - }, - "name": { - "description": "The id of the commit author", - "type": "string" - } - }, - "type": "object" - }, - "authorTimestamp": { - "description": "The UNIX timestamp for when the commit was authored", - "type": "number" - }, - "committer": { - "description": "The author of the commit, assumed to be the person who commited/merged the code into a project.", - "properties": { - "displayName": { - "description": "The display name of the commit committer", - "type": "string" - }, - "emailAddress": { - "description": "The email of the commit committer", - "type": "string" - }, - "name": { - "description": "The id of the commit committer", - "type": "string" - } - }, - "type": "object" - }, - "committerTimestamp": { - "description": "When the commit was committed to the project", - "type": "number" - }, - "displayId": { - "description": "The shortened SHA for the commit", - "type": "string" - }, - "id": { - "description": "The SHA for the commit", - "type": "string" - }, - "message": { - "description": "The commit's message", - "type": "string" - }, - "parents": { - "description": "The commit's parents", - "items": { - "properties": { - "displayId": { - "description": "The simplified sha", - "type": "string" - }, - "id": { - "description": "The full SHA", - "type": "string" - } - }, - "type": "object" - }, - "type": "array" - } - }, - "type": "object" - }, - "BitBucketServerJSONDSL": { - "properties": { - "activities": { - "description": "The activities such as OPENING, CLOSING, MERGING or UPDATING a pull request", - "items": { - "$ref": "#/definitions/BitBucketServerPRActivity" - }, - "type": "array" - }, - "comments": { - "description": "The comments on the pull request", - "items": { - "$ref": "#/definitions/BitBucketServerPRActivity" - }, - "type": "array" - }, - "commits": { - "description": "The commits associated with the pull request", - "items": { - "$ref": "#/definitions/BitBucketServerCommit" - }, - "type": "array" - }, - "issues": { - "description": "The related JIRA issues", - "items": { - "$ref": "#/definitions/JIRAIssue" - }, - "type": "array" - }, - "metadata": { - "$ref": "#/definitions/RepoMetaData", - "description": "The pull request and repository metadata" - }, - "pr": { - "$ref": "#/definitions/BitBucketServerPRDSL", - "description": "The PR metadata" - } - }, - "type": "object" - }, - "BitBucketServerLinks": { - "enum": [ - "clone", - "self" - ], - "type": "string" - }, - "BitBucketServerMergeRef": { - "properties": { - "displayId": { - "type": "string" - }, - "id": { - "type": "string" - }, - "latestCommit": { - "type": "string" - }, - "repository": { - "$ref": "#/definitions/BitBucketServerRepo" - } - }, - "type": "object" - }, - "BitBucketServerPRActivity": { - "properties": { - "action": { - "enum": [ - "COMMENTED", - "DECLINED", - "MERGED", - "OPENED", - "UPDATED" - ], - "type": "string" - }, - "comment": { - "$ref": "#/definitions/BitBucketServerPRComment" - }, - "commentAction": { - "enum": [ - "ADDED", - "UPDATED" - ], - "type": "string" - }, - "commentAnchor": { - "properties": { - "diffType": { - "enum": [ - "COMMIT", - "EFFECTIVE", - "RANGE", - "REQUIRED" - ], - "type": "string" - }, - "fileType": { - "enum": [ - "FROM", - "TO" - ], - "type": "string" - }, - "fromHash": { - "type": "string" - }, - "line": { - "type": "number" - }, - "lineType": { - "enum": [ - "ADDED", - "CONTEXT", - "REMOVED" - ], - "type": "string" - }, - "path": { - "type": "string" - }, - "srcPath": { - "type": "string" - }, - "toHash": { - "type": "string" - } - }, - "type": "object" - }, - "createdDate": { - "type": "number" - }, - "id": { - "type": "number" - }, - "user": { - "$ref": "#/definitions/BitBucketServerUser" - } - }, - "type": "object" - }, - "BitBucketServerPRComment": { - "properties": { - "author": { - "$ref": "#/definitions/BitBucketServerUser" - }, - "comments": { - "items": { - "$ref": "#/definitions/BitBucketServerPRActivity" - }, - "type": "array" - }, - "createdDate": { - "type": "number" - }, - "id": { - "type": "number" - }, - "parent": { - "properties": { - "id": { - "type": "number" - } - }, - "type": "object" - }, - "permittedOperations": { - "properties": { - "deletable": { - "type": "boolean" - }, - "editable": { - "type": "boolean" - } - }, - "type": "object" - }, - "text": { - "type": "string" - }, - "updatedDate": { - "type": "number" - }, - "version": { - "type": "number" - } - }, - "type": "object" - }, - "BitBucketServerPRDSL": { - "description": "An exact copy of the PR's reference JSON. This interface has type'd the majority\nof it for tooling's sake, but any extra metadata which BitBucket Server send\nwill still be inside the JS object.", - "properties": { - "author": { - "allOf": [ - { - "$ref": "#/definitions/BitBucketServerPRParticipant" - }, - { - "properties": { - "role": { - "enum": [ - "AUTHOR" - ], - "type": "string" - } - }, - "type": "object" - } - ], - "description": "The creator of the PR" - }, - "closed": { - "description": "Is the PR closed?", - "type": "boolean" - }, - "createdDate": { - "description": "Date PR created as number of milliseconds since the unix epoch", - "type": "number" - }, - "description": { - "description": "The text describing the PR", - "type": "string" - }, - "fromRef": { - "$ref": "#/definitions/BitBucketServerMergeRef", - "description": "The PR submitter's reference" - }, - "id": { - "description": "The PR's ID", - "type": "number" - }, - "links": { - "description": "Misc links for hypermedia conformance", - "enum": [ - "self" - ], - "type": "string" - }, - "locked": { - "description": "Was this PR locked?", - "type": "boolean" - }, - "open": { - "description": "Is the PR open?", - "type": "boolean" - }, - "participants": { - "description": "People who have participated in the PR", - "items": { - "allOf": [ - { - "$ref": "#/definitions/BitBucketServerPRParticipant" - }, - { - "properties": { - "role": { - "enum": [ - "PARTICIPANT" - ], - "type": "string" - } - }, - "type": "object" - } - ] - }, - "type": "array" - }, - "reviewers": { - "description": "People requested as reviewers", - "items": { - "allOf": [ - { - "$ref": "#/definitions/BitBucketServerPRParticipant" - }, - { - "properties": { - "role": { - "enum": [ - "REVIEWER" - ], - "type": "string" - } - }, - "type": "object" - } - ] - }, - "type": "array" - }, - "state": { - "description": "The pull request's current status.", - "enum": [ - "DECLINED", - "MERGED", - "OPEN", - "SUPERSEDED" - ], - "type": "string" - }, - "title": { - "description": "Title of the pull request.", - "type": "string" - }, - "toRef": { - "$ref": "#/definitions/BitBucketServerMergeRef", - "description": "The repo Danger is running on" - }, - "updatedDate": { - "description": "Date PR updated as number of milliseconds since the unix epoch", - "type": "number" - }, - "version": { - "description": "The API version", - "type": "number" - } - }, - "type": "object" - }, - "BitBucketServerPRParticipant": { - "properties": { - "approved": { - "description": "Did they approve of the PR?", - "type": "boolean" - }, - "role": { - "description": "How did they contribute", - "enum": [ - "AUTHOR", - "PARTICIPANT", - "REVIEWER" - ], - "type": "string" - }, - "status": { - "description": "Their review feedback", - "enum": [ - "APPROVED", - "NEEDS_WORK", - "UNAPPROVED" - ], - "type": "string" - }, - "user": { - "$ref": "#/definitions/BitBucketServerUser" - } - }, - "type": "object" - }, - "BitBucketServerRepo": { - "description": "A BitBucket Server Repo", - "properties": { - "forkable": { - "description": "Can someone fork this repo?", - "type": "boolean" - }, - "links": { - "$ref": "#/definitions/BitBucketServerLinks", - "description": "Links for the projects" - }, - "name": { - "description": "The repo name", - "type": "string" - }, - "project": { - "description": "An abstraction for grouping repos", - "properties": { - "id": { - "description": "The project unique id", - "type": "number" - }, - "key": { - "description": "The project's human readable project key", - "type": "string" - }, - "links": { - "description": "Hyperlinks for the project", - "enum": [ - "self" - ], - "type": "string" - }, - "name": { - "description": "The name of the project", - "type": "string" - }, - "public": { - "description": "Is the project publicly available", - "type": "boolean" - }, - "type": { - "description": "The project's type", - "type": "string" - } - }, - "type": "object" - }, - "public": { - "description": "Is the repo public?", - "type": "boolean" - }, - "scmId": { - "description": "The type of SCM tool, probably \"git\"", - "type": "string" - }, - "slug": { - "description": "The slug for the repo", - "type": "string" - } - }, - "type": "object" - }, - "BitBucketServerUser": { - "description": "A BitBucketServer user account.", - "properties": { - "active": { - "description": "Is the account active", - "type": "boolean" - }, - "displayName": { - "description": "The name to use when referencing the user", - "type": "string" - }, - "emailAddress": { - "description": "The email for the user", - "type": "string" - }, - "id": { - "description": "The unique user ID", - "type": "number" - }, - "name": { - "description": "The name of the user", - "type": "string" - }, - "slug": { - "description": "The user's slug for URLs", - "type": "string" - }, - "type": { - "description": "The type of a user, \"NORMAL\" being a typical user3", - "enum": [ - "NORMAL", - "SERVICE" - ], - "type": "string" - } - }, - "type": "object" - }, - "CliArgs": { - "description": "Describes the possible arguments that\ncould be used when calling the CLI", - "properties": { - "base": { - "description": "The base reference used by danger PR (e.g. not master)", - "type": "string" - }, - "dangerfile": { - "description": "A custom path for the dangerfile (can also be a remote reference)", - "type": "string" - }, - "externalCiProvider": { - "description": "Used by danger-js o allow having a custom CI", - "type": "string" - }, - "id": { - "description": "So you can have many danger runs in one code review", - "type": "string" - }, - "textOnly": { - "description": "Use SDTOUT instead of posting to the code review side", - "type": "string" - }, - "verbose": { - "description": "For debugging", - "type": "string" - } - }, - "type": "object" - }, - "DangerDSLJSONType": { - "description": "The root of the Danger JSON DSL.", - "properties": { - "bitbucket_server": { - "$ref": "#/definitions/BitBucketServerJSONDSL", - "description": "The data only version of BitBucket Server DSL" - }, - "git": { - "$ref": "#/definitions/GitJSONDSL", - "description": "The data only version of Git DSL" - }, - "github": { - "$ref": "#/definitions/GitHubDSL", - "description": "The data only version of GitHub DSL" - }, - "settings": { - "description": "Used in the Danger JSON DSL to pass metadata between\nprocesses. It will be undefined when used inside the Danger DSL", - "properties": { - "cliArgs": { - "$ref": "#/definitions/CliArgs", - "description": "This is still a bit of a WIP, but this should\npass args/opts from the original CLI call through\nto the process." - }, - "github": { - "description": "Saves each client re-implementing logic to grab these vars\nfor their API clients", - "properties": { - "accessToken": { - "description": "API token for the GitHub client to use", - "type": "string" - }, - "additionalHeaders": { - "description": "Optional headers to add to a request" - }, - "baseURL": { - "description": "Optional URL for enterprise GitHub", - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "GitCommit": { - "description": "A platform agnostic reference to a Git commit", - "properties": { - "author": { - "$ref": "#/definitions/GitCommitAuthor", - "description": "Who wrote the commit" - }, - "committer": { - "$ref": "#/definitions/GitCommitAuthor", - "description": "Who deployed the commit" - }, - "message": { - "description": "The commit message", - "type": "string" - }, - "parents": { - "description": "SHAs for the commit's parents", - "items": { - "type": "string" - }, - "type": "array" - }, - "sha": { - "description": "The SHA for the commit", - "type": "string" - }, - "tree": { - "description": "Potential parent commits, and other assorted metadata" - }, - "url": { - "description": "Link to the commit", - "type": "string" - } - }, - "type": "object" - }, - "GitCommitAuthor": { - "description": "An author of a commit", - "properties": { - "date": { - "description": "ISO6801 date string", - "type": "string" - }, - "email": { - "description": "The authors email", - "type": "string" - }, - "name": { - "description": "The display name for the author", - "type": "string" - } - }, - "type": "object" - }, - "GitHubAPIPR": { - "description": "Provides the current PR in an easily used way for params in `github.api` calls", - "properties": { - "number": { - "description": "The PR number", - "type": "number" - }, - "owner": { - "description": "The repo owner", - "type": "string" - }, - "repo": { - "description": "The repo name", - "type": "string" - } - }, - "type": "object" - }, - "GitHubCommit": { - "description": "A GitHub specific implementation of a git commit, it has GitHub user names instead of an email.", - "properties": { - "author": { - "$ref": "#/definitions/GitHubUser", - "description": "The GitHub user who wrote the code" - }, - "commit": { - "$ref": "#/definitions/GitCommit", - "description": "The raw commit metadata" - }, - "committer": { - "$ref": "#/definitions/GitHubUser", - "description": "The GitHub user who shipped the code" - }, - "parents": { - "description": "An array of parent commit shas", - "items": { - }, - "type": "array" - }, - "sha": { - "description": "The SHA for the commit", - "type": "string" - }, - "url": { - "description": "the url for the commit on GitHub", - "type": "string" - } - }, - "type": "object" - }, - "GitHubDSL": { - "description": "The GitHub metadata for your PR", - "properties": { - "api": { - "$ref": "#/definitions/Github", - "description": "An authenticated API so you can extend danger's behavior by using the [GitHub v3 API](https://developer.github.com/v3/).\n\nA set up instance of the \"github\" npm module. You can get the full [API here](https://octokit.github.io/node-github/)." - }, - "commits": { - "description": "The github commit metadata for a code review session", - "items": { - "$ref": "#/definitions/GitHubCommit" - }, - "type": "array" - }, - "issue": { - "$ref": "#/definitions/GitHubIssue", - "description": "The issue metadata for a code review session" - }, - "pr": { - "$ref": "#/definitions/GitHubPRDSL", - "description": "The PR metadata for a code review session" - }, - "requested_reviewers": { - "description": "The people requested to review this PR", - "items": { - "$ref": "#/definitions/GitHubUser" - }, - "type": "array" - }, - "reviews": { - "description": "The reviews left on this pull request", - "items": { - "$ref": "#/definitions/GitHubReview" - }, - "type": "array" - }, - "thisPR": { - "$ref": "#/definitions/GitHubAPIPR", - "description": "The PR metadata specifically formatted for using with the GitHub API client" - }, - "utils": { - "$ref": "#/definitions/GitHubUtilsDSL", - "description": "A scope for useful functions related to GitHub" - } - }, - "type": "object" - }, - "GitHubIssue": { - "description": "This is `danger.github.issue` It refers to the issue that makes up the Pull Request.\nGitHub treats all pull requests as a special type of issue. This DSL contains only parts of the issue that are\nnot found in the PR DSL, however it does contain the full JSON structure.\n\nA GitHub Issue", - "properties": { - "labels": { - "description": "The labels associated with this issue", - "items": { - "$ref": "#/definitions/GitHubIssueLabel" - }, - "type": "array" - } - }, - "type": "object" - }, - "GitHubIssueLabel": { - "properties": { - "color": { - "description": "The color associated with this label", - "type": "string" - }, - "id": { - "description": "The identifying number of this label", - "type": "number" - }, - "name": { - "description": "The name of the label", - "type": "string" - }, - "url": { - "description": "The URL that links to this label", - "type": "string" - } - }, - "type": "object" - }, - "GitHubMergeRef": { - "properties": { - "label": { - "description": "The human display name for the merge reference, e.g. \"artsy:master\"", - "type": "string" - }, - "ref": { - "description": "The reference point for the merge, e.g. \"master\"", - "type": "string" - }, - "repo": { - "$ref": "#/definitions/GitHubRepo", - "description": "The repo from which the reference comes from" - }, - "sha": { - "description": "The reference point for the merge, e.g. \"704dc55988c6996f69b6873c2424be7d1de67bbe\"", - "type": "string" - }, - "user": { - "$ref": "#/definitions/GitHubUser", - "description": "The user that owns the merge reference e.g. \"artsy\"" - } - }, - "type": "object" - }, - "GitHubPRDSL": { - "description": "An exact copy of the PR's reference JSON. This interface has type'd the majority\nof it for tooling's sake, but any extra metadata which GitHub send will still be\ninside the JS object.", - "properties": { - "additions": { - "description": "The number of additional lines in the PR", - "type": "number" - }, - "assignee": { - "$ref": "#/definitions/GitHubUser", - "description": "The User who is assigned the PR" - }, - "assignees": { - "description": "The Users who are assigned to the PR", - "items": { - "$ref": "#/definitions/GitHubUser" - }, - "type": "array" - }, - "base": { - "$ref": "#/definitions/GitHubMergeRef", - "description": "Merge reference for _this_ repo." - }, - "body": { - "description": "The markdown body message of the PR", - "type": "string" - }, - "changed_files": { - "description": "The number of changed files in the PR", - "type": "number" - }, - "closed_at": { - "description": "optional ISO6801 Date string for when PR was closed", - "type": [ - "null", - "string" - ] - }, - "comments": { - "description": "The number of comments on the PR", - "type": "number" - }, - "commits": { - "description": "The number of commits in the PR", - "type": "number" - }, - "created_at": { - "description": "ISO6801 Date string for when PR was created", - "type": "string" - }, - "deletions": { - "description": "The number of deleted lines in the PR", - "type": "number" - }, - "head": { - "$ref": "#/definitions/GitHubMergeRef", - "description": "Merge reference for the _other_ repo." - }, - "html_url": { - "description": "The link back to this PR as user-facing", - "type": "string" - }, - "locked": { - "description": "Has the PR been locked to contributors only?", - "type": "boolean" - }, - "merged": { - "description": "Has the PR been merged yet?", - "type": "boolean" - }, - "merged_at": { - "description": "Optional ISO6801 Date string for when PR was merged.\nDanger probably shouldn't be running in this state.", - "type": [ - "null", - "string" - ] - }, - "number": { - "description": "The UUID for the PR", - "type": "number" - }, - "review_comments": { - "description": "The number of review-specific comments on the PR", - "type": "number" - }, - "state": { - "description": "The state for the PR", - "enum": [ - "closed", - "locked", - "merged", - "open" - ], - "type": "string" - }, - "title": { - "description": "The title of the PR", - "type": "string" - }, - "updated_at": { - "description": "ISO6801 Date string for when PR was updated", - "type": "string" - }, - "user": { - "$ref": "#/definitions/GitHubUser", - "description": "The User who submitted the PR" - } - }, - "type": "object" - }, - "GitHubRepo": { - "description": "A GitHub Repo", - "properties": { - "assignee": { - "$ref": "#/definitions/GitHubUser", - "description": "Is someone assigned to this PR?" - }, - "assignees": { - "description": "Are there people assigned to this PR?", - "items": { - "$ref": "#/definitions/GitHubUser" - }, - "type": "array" - }, - "description": { - "description": "The textual description of the repo", - "type": "string" - }, - "fork": { - "description": "Is the repo a fork?", - "type": "boolean" - }, - "full_name": { - "description": "The full name of the owner + repo, e.g. \"Danger/Danger-JS\"", - "type": "string" - }, - "html_url": { - "description": "The root web URL for the repo, e.g. https://github.com/artsy/emission", - "type": "string" - }, - "id": { - "description": "Generic UUID", - "type": "number" - }, - "name": { - "description": "The name of the repo, e.g. \"Danger-JS\"", - "type": "string" - }, - "owner": { - "$ref": "#/definitions/GitHubUser", - "description": "The owner of the repo" - }, - "private": { - "description": "Is the repo publicly accessible?", - "type": "boolean" - } - }, - "type": "object" - }, - "GitHubReview": { - "description": "GitHubReview\nWhile a review is pending, it will only have a user. Once a review is complete, the rest of\nthe review attributes will be present", - "properties": { - "body": { - "description": "If there is a review, the body of the review", - "type": "string" - }, - "commit_id": { - "description": "If there is a review, the commit ID this review was made on", - "type": "string" - }, - "id": { - "description": "If there is a review, this provides the ID for it", - "type": "number" - }, - "state": { - "description": "The state of the review\nAPPROVED, REQUEST_CHANGES, COMMENT or PENDING", - "enum": [ - "APPROVED", - "COMMENT", - "PENDING", - "REQUEST_CHANGES" - ], - "type": "string" - }, - "user": { - "$ref": "#/definitions/GitHubUser", - "description": "The user requested to review, or the user who has completed the review" - } - }, - "type": "object" - }, - "GitHubUser": { - "description": "A GitHub user account.", - "properties": { - "avatar_url": { - "description": "The url for a users's image", - "type": "string" - }, - "id": { - "description": "Generic UUID", - "type": "number" - }, - "login": { - "description": "The handle for the user/org", - "type": "string" - }, - "type": { - "description": "Whether the user is an org, or a user", - "enum": [ - "Bot", - "Organization", - "User" - ], - "type": "string" - } - }, - "type": "object" - }, - "GitHubUtilsDSL": { - "description": "Useful functions for GitHub related work", - "properties": { - "createOrAddLabel": { - "description": "An API for creating, or setting a label to an issue. Usable from Peril\nby adding an additional param for settings about a repo.", - "type": "object" - }, - "createOrUpdatePR": { - "type": "object" - }, - "createUpdatedIssueWithID": { - "description": "An API for creating, updating and closing an issue. Basically\nthis is really useful for reporting back via a separate\nissue that you may want to keep up to date at all times.", - "type": "object" - } - }, - "type": "object" - }, - "GitJSONDSL": { - "description": "The Git Related Metadata which is available inside the Danger DSL JSON", - "properties": { - "commits": { - "description": "The Git commit metadata", - "items": { - "$ref": "#/definitions/GitCommit" - }, - "type": "array" - }, - "created_files": { - "description": "Newly created filepaths relative to the git root", - "items": { - "type": "string" - }, - "type": "array" - }, - "deleted_files": { - "description": "Removed filepaths relative to the git root", - "items": { - "type": "string" - }, - "type": "array" - }, - "modified_files": { - "description": "Filepaths with changes relative to the git root", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "Github": { - "properties": { - "activity": { - "type": "object" - }, - "apps": { - "type": "object" - }, - "checks": { - "type": "object" - }, - "codesOfConduct": { - "type": "object" - }, - "emojis": { - "type": "object" - }, - "gists": { - "type": "object" - }, - "git": { - "type": "object" - }, - "gitignore": { - "type": "object" - }, - "hook": { - "type": "object" - }, - "interactions": { - "type": "object" - }, - "issues": { - "type": "object" - }, - "licenses": { - "type": "object" - }, - "markdown": { - "type": "object" - }, - "meta": { - "type": "object" - }, - "migrations": { - "type": "object" - }, - "oauthAuthorizations": { - "type": "object" - }, - "orgs": { - "type": "object" - }, - "projects": { - "type": "object" - }, - "pulls": { - "type": "object" - }, - "rateLimit": { - "type": "object" - }, - "reactions": { - "type": "object" - }, - "repos": { - "type": "object" - }, - "request": { - }, - "search": { - "type": "object" - }, - "teams": { - "type": "object" - }, - "users": { - "type": "object" - } - }, - "type": "object" - }, - "JIRAIssue": { - "description": "This is `danger.bitbucket_server.issues` It refers to the issues that are linked to the Pull Request.", - "properties": { - "key": { - "description": "The unique key for the issue e.g. JRA-11", - "type": "string" - }, - "url": { - "description": "The user-facing URL for that issue", - "type": "string" - } - }, - "type": "object" - }, - "RepoMetaData": { - "description": "Key details about a repo", - "properties": { - "pullRequestID": { - "description": "The ID for the pull/merge request \"11\"", - "type": "string" - }, - "repoSlug": { - "description": "A path like \"artsy/eigen\"", - "type": "string" - } - }, - "type": "object" - } - }, - "description": "The shape of the JSON passed between Danger and a subprocess. It's built\nto be expanded in the future.", - "properties": { - "danger": { - "$ref": "#/definitions/DangerDSLJSONType" - } - }, - "type": "object" -} - diff --git a/source/danger-outgoing-process-schema.json b/source/danger-outgoing-process-schema.json index 8765350b2..e69de29bb 100644 --- a/source/danger-outgoing-process-schema.json +++ b/source/danger-outgoing-process-schema.json @@ -1,70 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Violation": { - "description": "The result of user doing warn, message or fail, built this way for\nexpansion later.", - "properties": { - "file": { - "description": "Optional path to the file", - "type": "string" - }, - "line": { - "description": "Optional line in the file", - "type": "number" - }, - "message": { - "description": "The string representation", - "type": "string" - } - }, - "type": "object" - } - }, - "description": "The representation of what running a Dangerfile generates.\nThis needs to be passed between processes, so data only please.", - "properties": { - "fails": { - "description": "Failed messages", - "items": { - "$ref": "#/definitions/Violation" - }, - "type": "array" - }, - "markdowns": { - "description": "Markdown messages to attach at the bottom of the comment", - "items": { - "$ref": "#/definitions/Violation" - }, - "type": "array" - }, - "messages": { - "description": "A set of messages to show inline", - "items": { - "$ref": "#/definitions/Violation" - }, - "type": "array" - }, - "meta": { - "description": "Meta information about the runtime evaluation", - "properties": { - "runtimeHref": { - "description": "e.g. \"https://danger.systems/js\"", - "type": "string" - }, - "runtimeName": { - "description": "E.g. \"dangerJS\", or \"Danger Swift\"", - "type": "string" - } - }, - "type": "object" - }, - "warnings": { - "description": "Messages for info", - "items": { - "$ref": "#/definitions/Violation" - }, - "type": "array" - } - }, - "type": "object" -} - diff --git a/source/danger.d.ts b/source/danger.d.ts index c7d7dace6..4f62a387a 100644 --- a/source/danger.d.ts +++ b/source/danger.d.ts @@ -3,6 +3,7 @@ // import { Octokit as GitHub } from "@octokit/rest" +import { Gitlab } from "gitlab" type MarkdownString = string // TODO: extract out from BitBucket specifically, or create our own type @@ -39,10 +40,10 @@ interface BitBucketCloudPRDSL { description: string /** The pull request's current status. */ state: "OPEN" | "MERGED" | "DECLINED" | "SUPERSEDED" - /** Date PR created as number of milliseconds since the unix epoch */ - created_on: number - /** Date PR updated as number of milliseconds since the unix epoch */ - updated_on: number + /** When the pr was created, in ISO 8601 format */ + created_on: string + /** When the pr was updated, in ISO 8601 format */ + updated_on: string /** The PR's source, The repo Danger is running on */ source: BitBucketCloudMergeRef /** The PR's destination */ @@ -118,7 +119,7 @@ interface BitBucketCloudCommit { user: BitBucketCloudUser } - /** When the commit was commited to the project, in ISO 8601 format */ + /** When the commit was committed to the project, in ISO 8601 format */ date: string /** The commit's message */ message: string @@ -301,7 +302,7 @@ interface BitBucketServerCommit { } /** The UNIX timestamp for when the commit was authored */ authorTimestamp: number - /** The author of the commit, assumed to be the person who commited/merged the code into a project. */ + /** The author of the commit, assumed to be the person who committed/merged the code into a project. */ committer: { /** The id of the commit committer */ name: string @@ -310,7 +311,7 @@ interface BitBucketServerCommit { /** The email of the commit committer */ emailAddress: string } - /** When the commit was commited to the project */ + /** When the commit was committed to the project */ committerTimestamp: number /** The commit's message */ message: string @@ -324,9 +325,9 @@ interface BitBucketServerCommit { } interface BitBucketServerDiff { - /** The file refrence when moved */ + /** The file reference when moved */ destination?: BitBucketServerFile - /** The original file refrence */ + /** The original file reference */ source?: BitBucketServerFile /** A set of diff changes */ hunks: BitBucketServerHunk[] @@ -891,6 +892,16 @@ type GitMatchResult = { /** The git specific metadata for a PR */ interface GitDSL extends GitJSONDSL { + /** + * The git commit Danger is comparing from. + */ + base: string + + /** + * The git commit Danger is comparing to. + */ + head: string + /** * A Chainsmoker object to help match paths as an elegant DSL. It * lets you write a globbed string and then get booleans on whether @@ -963,8 +974,10 @@ interface GitDSL extends GitJSONDSL { /** * Offers the overall lines of code added/removed in the diff + * + * @param {string} pattern an option glob pattern to filer files that will considered for lines of code. */ - linesOfCode(): Promise + linesOfCode(pattern?: string): Promise } // This is `danger.github` inside the JSON @@ -1427,16 +1440,23 @@ interface GitHubReviewers { // getPlatformReviewDSLRepresentation interface GitLabJSONDSL { + /** Info about the repo */ metadata: RepoMetaData + /** Info about the merge request */ mr: GitLabMR + /** All of the individual commits in the merge request */ commits: GitLabMRCommit[] + /** Merge Request-level MR approvals Configuration */ + approvals: GitLabApproval } // danger.gitlab +/** The GitLab metadata for your MR */ interface GitLabDSL extends GitLabJSONDSL { utils: { fileContents(path: string, repoSlug?: string, ref?: string): Promise } + api: InstanceType } // --- @@ -1477,40 +1497,52 @@ interface GitLabUserProfile extends GitLabUser { } interface GitLabMRBase { - /** */ + /** The MR's id */ id: number - /** */ + /** The unique ID for this MR */ iid: number - /** */ + /** The project ID for this MR */ project_id: number - /** */ + /** The given name of the MR */ title: string - /** */ + /** The body text describing the MR */ description: string - /** */ + /** The MR's current availability */ state: "closed" | "open" | "locked" | "merged" - /** */ + /** When was the MR made */ created_at: string - /** */ + /** When was the MR updated */ updated_at: string + /** What branch is this MR being merged into */ target_branch: string + /** What branch is this MR come from */ source_branch: string + + /** How many folks have given it an upvote */ upvotes: number + /** How many folks have given it an downvote */ downvotes: number + /** Who made it */ author: GitLabUser + /** Access rights for the user who created the MR */ user: { + /** Does the author have access to merge? */ can_merge: boolean } - assignee: GitLabUser + /** Who was assigned as the person to review */ + assignee?: GitLabUser + assignees: GitLabUser[] + /** Users who were added as reviewers to the MR */ + reviewers: GitLabUser[] source_project_id: number target_project_id: number labels: string[] @@ -1548,6 +1580,7 @@ interface GitLabMRBase { } } +/** TODO: These need more comments from someone who uses GitLab, see GitLabDSL.ts in the danger-js repo */ interface GitLabMR extends GitLabMRBase { squash: boolean subscribed: boolean @@ -1647,6 +1680,55 @@ interface GitLabMRCommit { committer_email: string committed_date: string } + +interface GitLabRepositoryFile { + file_name: string + file_path: string + size: number + encoding: "base64" + content: string + content_sha256: string + ref: string + blob_id: string + commit_id: string + last_commit_id: string +} + +interface GitLabCommit { + id: string + short_id: string + title: string + author_name: string + author_email: string + created_at: string +} + +interface GitLabRepositoryCompare { + commit: GitLabCommit + commits: GitLabCommit[] + diffs: GitLabMRChange[] + compare_timeout: boolean + compare_same_ref: boolean +} + +interface GitLabApproval { + id: number + iid: number + project_id: number + title: string + description: string + state: "closed" | "open" | "locked" | "merged" + created_at: string + updated_at: string + merge_status: "can_be_merged" + approvals_required: number + approvals_left: number + approved_by?: + | { + user: GitLabUser + }[] + | GitLabUser[] +} /** * The result of user doing warn, message or fail, built this way for * expansion later. @@ -1681,6 +1763,8 @@ interface CliArgs { dangerfile: string /** So you can have many danger runs in one code review */ id: string + /** Use staged changes */ + staging?: boolean } // NOTE: if add something new here, you need to change dslGenerator.ts diff --git a/source/dsl/BitBucketCloudDSL.ts b/source/dsl/BitBucketCloudDSL.ts index 4e8011e4d..494c888f2 100644 --- a/source/dsl/BitBucketCloudDSL.ts +++ b/source/dsl/BitBucketCloudDSL.ts @@ -35,10 +35,10 @@ export interface BitBucketCloudPRDSL { description: string /** The pull request's current status. */ state: "OPEN" | "MERGED" | "DECLINED" | "SUPERSEDED" - /** Date PR created as number of milliseconds since the unix epoch */ - created_on: number - /** Date PR updated as number of milliseconds since the unix epoch */ - updated_on: number + /** When the pr was created, in ISO 8601 format */ + created_on: string + /** When the pr was updated, in ISO 8601 format */ + updated_on: string /** The PR's source, The repo Danger is running on */ source: BitBucketCloudMergeRef /** The PR's destination */ @@ -114,7 +114,7 @@ export interface BitBucketCloudCommit { user: BitBucketCloudUser } - /** When the commit was commited to the project, in ISO 8601 format */ + /** When the commit was committed to the project, in ISO 8601 format */ date: string /** The commit's message */ message: string diff --git a/source/dsl/BitBucketServerDSL.ts b/source/dsl/BitBucketServerDSL.ts index f18554503..94c163a5a 100644 --- a/source/dsl/BitBucketServerDSL.ts +++ b/source/dsl/BitBucketServerDSL.ts @@ -128,7 +128,7 @@ export interface BitBucketServerCommit { } /** The UNIX timestamp for when the commit was authored */ authorTimestamp: number - /** The author of the commit, assumed to be the person who commited/merged the code into a project. */ + /** The author of the commit, assumed to be the person who committed/merged the code into a project. */ committer: { /** The id of the commit committer */ name: string @@ -137,7 +137,7 @@ export interface BitBucketServerCommit { /** The email of the commit committer */ emailAddress: string } - /** When the commit was commited to the project */ + /** When the commit was committed to the project */ committerTimestamp: number /** The commit's message */ message: string @@ -151,9 +151,9 @@ export interface BitBucketServerCommit { } export interface BitBucketServerDiff { - /** The file refrence when moved */ + /** The file reference when moved */ destination?: BitBucketServerFile - /** The original file refrence */ + /** The original file reference */ source?: BitBucketServerFile /** A set of diff changes */ hunks: BitBucketServerHunk[] diff --git a/source/dsl/GitDSL.ts b/source/dsl/GitDSL.ts index a596d723c..b5bb408ea 100644 --- a/source/dsl/GitDSL.ts +++ b/source/dsl/GitDSL.ts @@ -103,6 +103,16 @@ type GitMatchResult = { /** The git specific metadata for a PR */ export interface GitDSL extends GitJSONDSL { + /** + * The git commit Danger is comparing from. + */ + base: string + + /** + * The git commit Danger is comparing to. + */ + head: string + /** * A Chainsmoker object to help match paths as an elegant DSL. It * lets you write a globbed string and then get booleans on whether @@ -175,6 +185,8 @@ export interface GitDSL extends GitJSONDSL { /** * Offers the overall lines of code added/removed in the diff + * + * @param {string} pattern an option glob pattern to filer files that will considered for lines of code. */ - linesOfCode(): Promise + linesOfCode(pattern?: string): Promise } diff --git a/source/dsl/GitLabDSL.ts b/source/dsl/GitLabDSL.ts index 7ccc1a516..79e73196a 100644 --- a/source/dsl/GitLabDSL.ts +++ b/source/dsl/GitLabDSL.ts @@ -1,20 +1,28 @@ // Please don't have includes in here that aren't inside the DSL folder, or the d.ts/flow defs break // TODO: extract out from BitBucket specifically, or create our own type +import { Gitlab } from "gitlab" import { RepoMetaData } from "./BitBucketServerDSL" // getPlatformReviewDSLRepresentation export interface GitLabJSONDSL { + /** Info about the repo */ metadata: RepoMetaData + /** Info about the merge request */ mr: GitLabMR + /** All of the individual commits in the merge request */ commits: GitLabMRCommit[] + /** Merge Request-level MR approvals Configuration */ + approvals: GitLabApproval } // danger.gitlab +/** The GitLab metadata for your MR */ export interface GitLabDSL extends GitLabJSONDSL { utils: { fileContents(path: string, repoSlug?: string, ref?: string): Promise } + api: InstanceType } // --- @@ -55,40 +63,52 @@ export interface GitLabUserProfile extends GitLabUser { } export interface GitLabMRBase { - /** */ + /** The MR's id */ id: number - /** */ + /** The unique ID for this MR */ iid: number - /** */ + /** The project ID for this MR */ project_id: number - /** */ + /** The given name of the MR */ title: string - /** */ + /** The body text describing the MR */ description: string - /** */ + /** The MR's current availability */ state: "closed" | "open" | "locked" | "merged" - /** */ + /** When was the MR made */ created_at: string - /** */ + /** When was the MR updated */ updated_at: string + /** What branch is this MR being merged into */ target_branch: string + /** What branch is this MR come from */ source_branch: string + + /** How many folks have given it an upvote */ upvotes: number + /** How many folks have given it an downvote */ downvotes: number + /** Who made it */ author: GitLabUser + /** Access rights for the user who created the MR */ user: { + /** Does the author have access to merge? */ can_merge: boolean } - assignee: GitLabUser + /** Who was assigned as the person to review */ + assignee?: GitLabUser + assignees: GitLabUser[] + /** Users who were added as reviewers to the MR */ + reviewers: GitLabUser[] source_project_id: number target_project_id: number labels: string[] @@ -126,6 +146,7 @@ export interface GitLabMRBase { } } +/** TODO: These need more comments from someone who uses GitLab, see GitLabDSL.ts in the danger-js repo */ export interface GitLabMR extends GitLabMRBase { squash: boolean subscribed: boolean @@ -225,3 +246,52 @@ export interface GitLabMRCommit { committer_email: string committed_date: string } + +export interface GitLabRepositoryFile { + file_name: string + file_path: string + size: number + encoding: "base64" + content: string + content_sha256: string + ref: string + blob_id: string + commit_id: string + last_commit_id: string +} + +export interface GitLabCommit { + id: string + short_id: string + title: string + author_name: string + author_email: string + created_at: string +} + +export interface GitLabRepositoryCompare { + commit: GitLabCommit + commits: GitLabCommit[] + diffs: GitLabMRChange[] + compare_timeout: boolean + compare_same_ref: boolean +} + +export interface GitLabApproval { + id: number + iid: number + project_id: number + title: string + description: string + state: "closed" | "open" | "locked" | "merged" + created_at: string + updated_at: string + merge_status: "can_be_merged" + approvals_required: number + approvals_left: number + approved_by?: + | { + user: GitLabUser + }[] + | GitLabUser[] +} diff --git a/source/dsl/cli-args.ts b/source/dsl/cli-args.ts index ff471104f..813cd6bdf 100644 --- a/source/dsl/cli-args.ts +++ b/source/dsl/cli-args.ts @@ -15,6 +15,8 @@ export interface CliArgs { dangerfile: string /** So you can have many danger runs in one code review */ id: string + /** Use staged changes */ + staging?: boolean } // NOTE: if add something new here, you need to change dslGenerator.ts diff --git a/source/platforms/BitBucketCloud.ts b/source/platforms/BitBucketCloud.ts index 9bdec0659..c74c9cac7 100644 --- a/source/platforms/BitBucketCloud.ts +++ b/source/platforms/BitBucketCloud.ts @@ -82,7 +82,7 @@ export class BitBucketCloud implements Platform { * @returns {Promise} did it work? */ deleteMainComment = async (dangerID: string): Promise => { - const comments = await this.api.getDangerComments(dangerID) + const comments = await this.api.getDangerMainComments(dangerID) for (let comment of comments) { await this.api.deleteComment(comment.id.toString()) } @@ -98,7 +98,7 @@ export class BitBucketCloud implements Platform { * @returns {Promise} the URL for the comment */ async updateOrCreateComment(dangerID: string, newComment: string): Promise { - const comments = await this.api.getDangerComments(dangerID) + const comments = await this.api.getDangerMainComments(dangerID) let issue = null if (comments.length) { diff --git a/source/platforms/FakePlatform.ts b/source/platforms/FakePlatform.ts index 8b99652ac..fd89aff74 100644 --- a/source/platforms/FakePlatform.ts +++ b/source/platforms/FakePlatform.ts @@ -20,6 +20,8 @@ export class FakePlatform implements Platform { async getPlatformGitRepresentation(): Promise { return { + base: "456", + head: "123", modified_files: [], created_files: [], deleted_files: [], @@ -83,4 +85,9 @@ export class FakePlatform implements Platform { } getFileContents = (path: string) => new Promise(res => res(readFileSync(path, "utf8"))) + + createInlineReview?: ( + git: GitDSL, + comments: { comment: string; path: string; line: number }[] + ) => Promise = undefined } diff --git a/source/platforms/GitHub.ts b/source/platforms/GitHub.ts index 9fa51e8a8..cb7d98139 100644 --- a/source/platforms/GitHub.ts +++ b/source/platforms/GitHub.ts @@ -42,6 +42,7 @@ export function GitHub(api: GitHubAPI) { let pr: GitHubPRDSL try { pr = await api.getPullRequestInfo() + pr.body = pr.body || "" } catch { process.exitCode = 1 throw ` diff --git a/source/platforms/GitLab.ts b/source/platforms/GitLab.ts index b42302aa2..90d776228 100644 --- a/source/platforms/GitLab.ts +++ b/source/platforms/GitLab.ts @@ -23,10 +23,12 @@ class GitLab implements Platform { getPlatformReviewDSLRepresentation = async (): Promise => { const mr = await this.getReviewInfo() const commits = await this.api.getMergeRequestCommits() + const approvals = await this.api.getMergeRequestApprovals() return { metadata: this.api.repoMetadata, mr, commits, + approvals, } } @@ -94,7 +96,6 @@ class GitLab implements Platform { d("updateOrCreateComment", { dangerID, newComment }) const notes: GitLabNote[] = await this.getDangerNotes(dangerID) - debugger let note: GitLabNote @@ -192,4 +193,5 @@ export const gitlabJSONToGitLabDSL = (gl: GitLabDSL, api: GitLabAPI): GitLabDSL utils: { fileContents: api.getFileContents, }, + api: api.apiInstance, }) diff --git a/source/platforms/LocalGit.ts b/source/platforms/LocalGit.ts index d22666f65..265d10ad6 100644 --- a/source/platforms/LocalGit.ts +++ b/source/platforms/LocalGit.ts @@ -10,7 +10,7 @@ import { readFileSync } from "fs" export interface LocalGitOptions { base?: string - staged?: boolean + staging?: boolean } export class LocalGit implements Platform { @@ -28,7 +28,7 @@ export class LocalGit implements Platform { const base = this.options.base || "master" const head = "HEAD" - this.gitDiff = await localGetDiff(base, head) + this.gitDiff = await localGetDiff(base, head, this.options.staging) return this.gitDiff } diff --git a/source/platforms/_tests/_pull_request_parser.test.ts b/source/platforms/_tests/_pull_request_parser.test.ts index 627a56748..72b3afd0a 100644 --- a/source/platforms/_tests/_pull_request_parser.test.ts +++ b/source/platforms/_tests/_pull_request_parser.test.ts @@ -108,6 +108,60 @@ describe("parsing urls", () => { }) }) }) + + describe("with /-", () => { + describe(".com", () => { + it("handles PRs-", () => { + expect(pullRequestParser("https://gitlab.com/GROUP/PROJ/-/merge_requests/123")).toEqual({ + pullRequestNumber: "123", + repo: "GROUP/PROJ", + platform: "GitLab", + }) + }) + + it("handles PRs sub-pages-", () => { + expect(pullRequestParser("https://gitlab.com/GROUP/PROJ/-/merge_requests/123/commits")).toEqual({ + pullRequestNumber: "123", + repo: "GROUP/PROJ", + platform: "GitLab", + }) + }) + + it("handles sub-groups", () => { + expect(pullRequestParser("https://gitlab.com/GROUP/SUBGROUP/PROJ/-/merge_requests/123")).toEqual({ + pullRequestNumber: "123", + repo: "GROUP/SUBGROUP/PROJ", + platform: "GitLab", + }) + }) + }) + + describe("CE/EE", () => { + it("handles PRs", () => { + expect(pullRequestParser("https://localdomain/GROUP/PROJ/-/merge_requests/123")).toEqual({ + pullRequestNumber: "123", + repo: "GROUP/PROJ", + platform: "GitLab", + }) + }) + + it("handles PRs sub-pages", () => { + expect(pullRequestParser("https://localdomain/GROUP/PROJ/-/merge_requests/123/commits")).toEqual({ + pullRequestNumber: "123", + repo: "GROUP/PROJ", + platform: "GitLab", + }) + }) + + it("handles sub-groups", () => { + expect(pullRequestParser("https://localdomain/GROUP/SUBGROUP/PROJ/-/merge_requests/123")).toEqual({ + pullRequestNumber: "123", + repo: "GROUP/SUBGROUP/PROJ", + platform: "GitLab", + }) + }) + }) + }) }) describe("Bitbucket Cloud", () => { diff --git a/source/platforms/_tests/fixtures/gitlab_mr.json b/source/platforms/_tests/fixtures/gitlab_mr.json deleted file mode 100644 index caf9540fe..000000000 --- a/source/platforms/_tests/fixtures/gitlab_mr.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "id": 1, - "iid": 1, - "project_id": 3, - "title": "test1", - "description": "fixed login page css paddings", - "state": "merged", - "created_at": "2017-04-29T08:46:00Z", - "updated_at": "2017-04-29T08:46:00Z", - "target_branch": "master", - "source_branch": "test1", - "upvotes": 0, - "downvotes": 0, - "author": { - "id": 1, - "name": "Administrator", - "username": "admin", - "state": "active", - "avatar_url": null, - "web_url": "https://gitlab.example.com/admin" - }, - "user": { - "can_merge": false - }, - "assignee": { - "id": 1, - "name": "Administrator", - "username": "admin", - "state": "active", - "avatar_url": null, - "web_url": "https://gitlab.example.com/admin" - }, - "source_project_id": 2, - "target_project_id": 3, - "labels": ["Community contribution", "Manage"], - "work_in_progress": false, - "milestone": { - "id": 5, - "iid": 1, - "project_id": 3, - "title": "v2.0", - "description": "Assumenda aut placeat expedita exercitationem labore sunt enim earum.", - "state": "closed", - "created_at": "2015-02-02T19:49:26.013Z", - "updated_at": "2015-02-02T19:49:26.013Z", - "due_date": "2018-09-22", - "start_date": "2018-08-08", - "web_url": "https://gitlab.example.com/my-group/my-project/milestones/1" - }, - "merge_when_pipeline_succeeds": true, - "merge_status": "can_be_merged", - "merge_error": null, - "sha": "8888888888888888888888888888888888888888", - "merge_commit_sha": null, - "user_notes_count": 1, - "discussion_locked": null, - "should_remove_source_branch": true, - "force_remove_source_branch": false, - "allow_collaboration": false, - "allow_maintainer_to_push": false, - "web_url": "http://gitlab.example.com/my-group/my-project/merge_requests/1", - "time_stats": { - "time_estimate": 0, - "total_time_spent": 0, - "human_time_estimate": null, - "human_total_time_spent": null - }, - "squash": false, - "subscribed": false, - "changes_count": "1", - "merged_by": { - "id": 87854, - "name": "Douwe Maan", - "username": "DouweM", - "state": "active", - "avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png", - "web_url": "https://gitlab.com/DouweM" - }, - "merged_at": "2018-09-07T11:16:17.520Z", - "closed_by": null, - "closed_at": null, - "latest_build_started_at": "2018-09-07T07:27:38.472Z", - "latest_build_finished_at": "2018-09-07T08:07:06.012Z", - "first_deployed_to_production_at": null, - "pipeline": { - "id": 29626725, - "sha": "2be7ddb704c7b6b83732fdd5b9f09d5a397b5f8f", - "ref": "patch-28", - "status": "success", - "web_url": "https://gitlab.example.com/my-group/my-project/pipelines/29626725" - }, - "diff_refs": { - "base_sha": "c380d3acebd181f13629a25d2e2acca46ffe1e00", - "head_sha": "2be7ddb704c7b6b83732fdd5b9f09d5a397b5f8f", - "start_sha": "c380d3acebd181f13629a25d2e2acca46ffe1e00" - }, - "diverged_commits_count": 2, - "rebase_in_progress": false, - "approvals_before_merge": null -} diff --git a/source/platforms/bitbucket_cloud/BitBucketCloudAPI.ts b/source/platforms/bitbucket_cloud/BitBucketCloudAPI.ts index abf2cc94c..603f5f7ac 100644 --- a/source/platforms/bitbucket_cloud/BitBucketCloudAPI.ts +++ b/source/platforms/bitbucket_cloud/BitBucketCloudAPI.ts @@ -214,11 +214,12 @@ export class BitBucketCloudAPI { return await res.text() } - getDangerComments = async (dangerID: string): Promise => { + getDangerMainComments = async (dangerID: string): Promise => { const comments = await this.getPullRequestComments() const dangerIDMessage = dangerIDToString(dangerID) return comments + .filter(comment => comment.inline == null) .filter(comment => comment.content.raw.includes(dangerIDMessage)) .filter(comment => comment.user.uuid === this.uuid) } diff --git a/source/platforms/bitbucket_cloud/_tests_/_bitbucket_cloud_api.test.ts b/source/platforms/bitbucket_cloud/_tests_/_bitbucket_cloud_api.test.ts index 1625b692e..b9846c003 100644 --- a/source/platforms/bitbucket_cloud/_tests_/_bitbucket_cloud_api.test.ts +++ b/source/platforms/bitbucket_cloud/_tests_/_bitbucket_cloud_api.test.ts @@ -149,6 +149,24 @@ describe("API testing - BitBucket Cloud", () => { display_name: "name", }, }, + { + content: { + raw: `FAIL! danger-id-1; ${dangerSignaturePostfix({} as DangerResults, "1234")}`, + }, + user: { + display_name: "name", + uuid: "{1234-1234-1234-1234}", + }, + }, + { + content: { + raw: "not a danger comment", + }, + user: { + display_name: "someone", + uuid: "{1234-1234-1234-1235}", + }, + }, ], }) const comments = await api.getDangerInlineComments("1") @@ -173,7 +191,7 @@ describe("API testing - BitBucket Cloud", () => { expect(result).toEqual(["activity"]) }) - it("getDangerComments", async () => { + it("getDangerMainComments", async () => { const commitID = "e70f3d6468f61a4bef68c9e6eaba9166b096e23c" jsonResult = () => ({ isLastPage: true, @@ -187,6 +205,21 @@ describe("API testing - BitBucket Cloud", () => { uuid: "{1234-1234-1234-1234}", }, }, + { + content: { + raw: + "\n[//]: # (danger-id-1;)\n[//]: # ( File: dangerfile.ts;\n Line: 5;)\n\n- :warning: Hello updates\n\n\n ", + }, + id: 1234, + inline: { + from: 5, + path: "dangerfile.ts", + }, + user: { + uuid: "{1234-1234-1234-1234}", + display_name: "name", + }, + }, { content: { raw: "not a danger comment", @@ -198,7 +231,8 @@ describe("API testing - BitBucket Cloud", () => { }, ], }) - const result = await api.getDangerComments("1") + + const result = await api.getDangerMainComments("1") expect(api.fetch).toHaveBeenCalledWith( "https://api.bitbucket.org/2.0/repositories/foo/bar/pullrequests/1/comments?q=deleted=false", diff --git a/source/platforms/bitbucket_cloud/_tests_/_bitbucket_cloud_git.test.ts b/source/platforms/bitbucket_cloud/_tests_/_bitbucket_cloud_git.test.ts index 7f87ed0eb..9309f03f6 100644 --- a/source/platforms/bitbucket_cloud/_tests_/_bitbucket_cloud_git.test.ts +++ b/source/platforms/bitbucket_cloud/_tests_/_bitbucket_cloud_git.test.ts @@ -156,6 +156,8 @@ describe("the dangerfile gitDSL - BitBucket Cloud", () => { url: "https://bitbucket.org/foo/bar/commits/7f73207cea935b2fd07a76028484c20eb18422ba", } + expect(gitDSL.head).toBe("007bf2423436") + expect(gitDSL.base).toBe("8a2eb414cb5d") expect(gitDSL.commits[0]).toEqual(exampleCommit) }) diff --git a/source/platforms/bitbucket_server/BitBucketServerAPI.ts b/source/platforms/bitbucket_server/BitBucketServerAPI.ts index df1b05b7b..752bd1c6f 100644 --- a/source/platforms/bitbucket_server/BitBucketServerAPI.ts +++ b/source/platforms/bitbucket_server/BitBucketServerAPI.ts @@ -134,7 +134,9 @@ export class BitBucketServerAPI implements BitBucketServerAPIDSL { getStructuredDiffForFile = async (base: string, head: string, filename: string): Promise => { const { repoSlug } = this.repoMetadata - const path = `rest/api/1.0/${repoSlug}/compare/diff/${filename}?withComments=false&from=${head}&to=${base}` + const path = `rest/api/1.0/${repoSlug}/compare/diff/${encodeURI( + filename + )}?withComments=false&from=${head}&to=${base}` const res = await this.get(path) throwIfNotOk(res) return (await res.json()).diffs @@ -241,7 +243,7 @@ export class BitBucketServerAPI implements BitBucketServerAPIDSL { // The last two are "optional" in the protocol, but not really optional WRT the BBSAPI getFileContents = async (filePath: string, repoSlug?: string, refspec?: string) => { - const path = `${repoSlug}/` + `raw/${filePath}` + `?at=${refspec}` + const path = `rest/api/1.0/${repoSlug}/` + `raw/${encodeURI(filePath)}` + `?at=${refspec}` const res = await this.get(path, undefined, true) if (res.status === 404) { return "" diff --git a/source/platforms/bitbucket_server/_tests/_bitbucket_server_api.test.ts b/source/platforms/bitbucket_server/_tests/_bitbucket_server_api.test.ts index 3db4c466d..be428a48f 100644 --- a/source/platforms/bitbucket_server/_tests/_bitbucket_server_api.test.ts +++ b/source/platforms/bitbucket_server/_tests/_bitbucket_server_api.test.ts @@ -78,11 +78,11 @@ describe("API testing - BitBucket Server", () => { it("getStructuredDiffForFile", async () => { jsonResult = () => ({ diffs: ["diff"] }) - const result = await api.getStructuredDiffForFile("BASE", "HEAD", "filename.txt") + const result = await api.getStructuredDiffForFile("BASE", "HEAD", "path with space/filename.txt") expect(api.fetch).toHaveBeenCalledWith( `${host}/rest/api/1.0/projects/FOO/repos/BAR/compare/diff/` + - `filename.txt` + + `path%20with%20space/filename.txt` + `?withComments=false&from=HEAD&to=BASE`, { method: "GET", body: null, headers: expectedJSONHeaders }, undefined @@ -272,10 +272,10 @@ describe("API testing - BitBucket Server", () => { it("getFileContents", async () => { textResult = "contents..." - const result = await api.getFileContents("path/to/foo.txt", "projects/FOO/repos/BAR", "master") + const result = await api.getFileContents("path/folder with space/foo.txt", "projects/FOO/repos/BAR", "master") expect(api.fetch).toHaveBeenCalledWith( - `${host}/projects/FOO/repos/BAR/raw/path/to/foo.txt?at=master`, + `${host}/rest/api/1.0/projects/FOO/repos/BAR/raw/path/folder%20with%20space/foo.txt?at=master`, { method: "GET", body: null, headers: expectedJSONHeaders }, true ) diff --git a/source/platforms/bitbucket_server/_tests/_bitbucket_server_git.test.ts b/source/platforms/bitbucket_server/_tests/_bitbucket_server_git.test.ts index 0cb5519c7..abe334606 100644 --- a/source/platforms/bitbucket_server/_tests/_bitbucket_server_git.test.ts +++ b/source/platforms/bitbucket_server/_tests/_bitbucket_server_git.test.ts @@ -104,6 +104,8 @@ describe("the dangerfile gitDSL - BitBucket Server", () => { }) it("sets up commit data correctly", async () => { + expect(gitDSL.head).toBe("d6725486c38d46a33e76f622cf24b9a388c8d13d") + expect(gitDSL.base).toBe("8942a1f75e4c95df836f19ef681d20a87da2ee20") expect(gitDSL.commits[0]).toMatchSnapshot() }) @@ -129,12 +131,12 @@ describe("the dangerfile gitDSL - BitBucket Server", () => { it("checks promise rejection for line not in the diff for inline comment", async () => { const promise = bbs.findTypeOfLine(gitDSL, 2, "banana") - await expect(promise).rejects + await expect(promise).rejects.toBeUndefined() }) it("checks promise rejection for `del` line for inline comment for deleted file", async () => { const promise = bbs.findTypeOfLine(gitDSL, 0, "jest.eslint.config.js") - await expect(promise).rejects + await expect(promise).rejects.toBeUndefined() }) it("writes a JSON DSL fixture", async () => { diff --git a/source/platforms/git/_tests/localGetCommits.test.ts b/source/platforms/git/_tests/localGetCommits.test.ts index 1075fdb8c..a03caa341 100644 --- a/source/platforms/git/_tests/localGetCommits.test.ts +++ b/source/platforms/git/_tests/localGetCommits.test.ts @@ -1,10 +1,63 @@ -import { formatJSON } from "../localGetCommits" +import { localGetCommits } from "../localGetCommits" +import { logGitCommits } from "../localLogGitCommits" + +const hash = "hash" +const abbrevParentHashes = "abbrevParentHashes" +const treeHash = "treeHash" +const authorName = "authorName" +const authorEmail = "authorEmail" +const authorDate = "authorDate" +const committerName = "committerName" +const committerEmail = "committerEmail" +const committerDate = "committerDate" +const subject = "subject" + +const gitLogCommitMock = { + hash, + abbrevParentHashes, + treeHash, + authorName, + authorEmail, + authorDate, + committerName, + committerEmail, + committerDate, + subject, +} + +jest.mock("../localLogGitCommits", () => ({ + __esModule: true, + logGitCommits: jest.fn(() => [gitLogCommitMock]), +})) it("generates a JSON-like commit message", () => { - expect(formatJSON).toEqual( - '{ "sha": "%H", "parents": "%p", "author": {"name": "%an", "email": "%ae", "date": "%ai" }, "committer": {"name": "%cn", "email": "%ce", "date": "%ci" }, "message": "%f"},' - ) + const base = "base-branch" + const head = "head-branch" + + const result = localGetCommits(base, head) + + expect(logGitCommits).toHaveBeenCalledWith({ + number: expect.any(Number), + branch: `${base}...${head}`, + fields: expect.any(Array), + }) - const withoutComma = formatJSON.substring(0, formatJSON.length - 1) - expect(() => JSON.parse(withoutComma)).not.toThrow() + expect(result).toEqual([ + { + sha: hash, + author: { + name: authorName, + email: authorEmail, + date: authorDate, + }, + committer: { + name: committerName, + email: committerEmail, + date: committerDate, + }, + message: subject, + tree: treeHash, + url: expect.stringContaining(hash), + }, + ]) }) diff --git a/source/platforms/git/_tests/localLogGitCommits.test.ts b/source/platforms/git/_tests/localLogGitCommits.test.ts new file mode 100644 index 000000000..213dd1cf5 --- /dev/null +++ b/source/platforms/git/_tests/localLogGitCommits.test.ts @@ -0,0 +1,30 @@ +import { execFileSync } from "child_process" + +import { logGitCommits } from "../localLogGitCommits" + +const COMMAND_OUTPUT = "" + +jest.mock("child_process", () => ({ + __esModule: true, + execFileSync: jest.fn(() => COMMAND_OUTPUT), +})) + +it("get git commits from the 'git log' command", () => { + const options = { + number: 10, + branch: "test_branch", + fields: ["hash" as "hash", "subject" as "subject"], + } + + const result = logGitCommits(options) + + expect(execFileSync).toHaveBeenCalledWith("git", [ + "log", + "-l0", + `-n ${options.number}`, + "--pretty=@begin@" + "\t%H\t%s" + "@end@", + options.branch, + ]) + + expect(result).toEqual([]) +}) diff --git a/source/platforms/git/gitJSONToGitDSL.ts b/source/platforms/git/gitJSONToGitDSL.ts index ed7b83494..18dee70be 100644 --- a/source/platforms/git/gitJSONToGitDSL.ts +++ b/source/platforms/git/gitJSONToGitDSL.ts @@ -6,10 +6,12 @@ import isobject from "lodash.isobject" import keys from "lodash.keys" import memoize from "lodash.memoize" -import * as jsonDiff from "rfc6902" +import * as jsonDiff from "fast-json-patch" import jsonpointer from "jsonpointer" import JSON5 from "json5" +import micromatch from "micromatch" + import { GitDSL, JSONPatchOperation, GitJSONDSL, StructuredDiff } from "../../dsl/GitDSL" import chainsmoker from "../../commands/utils/chainsmoker" @@ -88,7 +90,7 @@ export const gitJSONToGitDSL = (gitJSONRep: GitJSONDSL, config: GitJSONToGitDSLC return { before: baseFile === "" ? null : baseJSON, after: headFile === "" ? null : headJSON, - diff: jsonDiff.createPatch(baseJSON, headJSON) as JSONPatchOperation[], + diff: jsonDiff.compare(baseJSON, headJSON) as JSONPatchOperation[], } } @@ -155,11 +157,13 @@ export const gitJSONToGitDSL = (gitJSONRep: GitJSONDSL, config: GitJSONToGitDSLC }, Object.create(null)) } - const linesOfCode = async () => { + const linesOfCode = async (pattern?: string) => { + const isPatternMatch = (path: string) => pattern === undefined || micromatch.isMatch(path, pattern) + const [createdFilesDiffs, modifiedFilesDiffs, deletedFilesDiffs] = await Promise.all([ - Promise.all(gitJSONRep.created_files.map(path => diffForFile(path))), - Promise.all(gitJSONRep.modified_files.map(path => diffForFile(path))), - Promise.all(gitJSONRep.deleted_files.map(path => diffForFile(path))), + Promise.all(gitJSONRep.created_files.filter(isPatternMatch).map(path => diffForFile(path))), + Promise.all(gitJSONRep.modified_files.filter(isPatternMatch).map(path => diffForFile(path))), + Promise.all(gitJSONRep.deleted_files.filter(isPatternMatch).map(path => diffForFile(path))), ]) let additions = createdFilesDiffs @@ -239,6 +243,8 @@ export const gitJSONToGitDSL = (gitJSONRep: GitJSONDSL, config: GitJSONToGitDSLC } return { + base: config.baseSHA, + head: config.headSHA, fileMatch: chainsmoker({ modified: gitJSONRep.modified_files, created: gitJSONRep.created_files, diff --git a/source/platforms/git/localGetCommits.ts b/source/platforms/git/localGetCommits.ts index 9d132a0a0..dc96e0eac 100644 --- a/source/platforms/git/localGetCommits.ts +++ b/source/platforms/git/localGetCommits.ts @@ -1,46 +1,40 @@ -import { debug } from "../../debug" -import JSON5 from "json5" - -import { spawn } from "child_process" +import { logGitCommits } from "./localLogGitCommits" import { GitCommit } from "../../dsl/Commit" -const d = debug("localGetDiff") - -const sha = "%H" -const parents = "%p" -const authorName = "%an" -const authorEmail = "%ae" -const authorDate = "%ai" -const committerName = "%cn" -const committerEmail = "%ce" -const committerDate = "%ci" -const message = "%f" // this is subject, not message, so it'll only be one line - -const author = `"author": {"name": "${authorName}", "email": "${authorEmail}", "date": "${authorDate}" }` -const committer = `"committer": {"name": "${committerName}", "email": "${committerEmail}", "date": "${committerDate}" }` -export const formatJSON = `{ "sha": "${sha}", "parents": "${parents}", ${author}, ${committer}, "message": "${message}"},` - -export const localGetCommits = (base: string, head: string) => - new Promise(done => { - const args = ["log", `${base}...${head}`, `--pretty=format:${formatJSON}`] - const child = spawn("git", args, { env: process.env }) - d("> git", args.join(" ")) - child.stdout.on("data", async data => { - data = data.toString() - - // remove trailing comma, and wrap into an array - const asJSONString = `[${data.substring(0, data.length - 1)}]` - const commits = JSON5.parse(asJSONString) - const realCommits = commits.map((c: any) => ({ - ...c, - parents: c.parents.split(" "), - })) - - done(realCommits) - }) - - child.stderr.on("data", data => { - console.error(`Could not get commits from git between ${base} and ${head}`) - throw new Error(data.toString()) - }) - }) +export const localGetCommits = (base: string, head: string) => { + const options = { + number: 100, + branch: `${base}...${head}`, + fields: [ + "hash" as "hash", + "abbrevParentHashes" as "abbrevParentHashes", + "treeHash" as "treeHash", + "authorName" as "authorName", + "authorEmail" as "authorEmail", + "authorDate" as "authorDate", + "committerName" as "committerName", + "committerEmail" as "committerEmail", + "committerDate" as "committerDate", + "subject" as "subject", + ], + } + + const commits: GitCommit[] = logGitCommits(options).map(commit => ({ + sha: commit.hash, + author: { + name: commit.authorName, + email: commit.authorEmail, + date: commit.authorDate, + }, + committer: { + name: commit.committerName, + email: commit.committerEmail, + date: commit.committerDate, + }, + message: commit.subject, + tree: commit.treeHash, + url: "fake.danger.systems/" + commit.hash, + })) + + return commits +} diff --git a/source/platforms/git/localGetDiff.ts b/source/platforms/git/localGetDiff.ts index 188a577d1..bdff4e98b 100644 --- a/source/platforms/git/localGetDiff.ts +++ b/source/platforms/git/localGetDiff.ts @@ -2,10 +2,11 @@ import { debug } from "../../debug" import { spawn } from "child_process" const d = debug("localGetDiff") - -export const localGetDiff = (base: string, head: string) => +const useCommittedDiffArgs = (base: string, head: string) => ["diff", `${base}...${head}`] +const useStagingChanges = (base: string) => ["diff", base] +export const localGetDiff = (base: string, head: string, staging: boolean = false) => new Promise(done => { - const args = ["diff", `${base}...${head}`] + const args = staging ? useStagingChanges(base) : useCommittedDiffArgs(base, head) let stdout = "" const child = spawn("git", args, { env: process.env }) diff --git a/source/platforms/git/localGetHeadSHA.ts b/source/platforms/git/localGetHeadSHA.ts index 365c279c5..f17942f10 100644 --- a/source/platforms/git/localGetHeadSHA.ts +++ b/source/platforms/git/localGetHeadSHA.ts @@ -5,12 +5,12 @@ const d = debug("localGetHeadSHA") export const localGetHeadSHA = () => new Promise(done => { - const call = `git rev-parse HEAD"` + const call = `git rev-parse HEAD` d(call) exec(call, (err, stdout, _stderr) => { if (err) { - console.error(`Could not get the git HEAD for the current path]`) + console.error(`Could not get the git HEAD for the current path`) console.error(err) return } diff --git a/source/platforms/git/localLogGitCommits.ts b/source/platforms/git/localLogGitCommits.ts new file mode 100644 index 000000000..94a7d8702 --- /dev/null +++ b/source/platforms/git/localLogGitCommits.ts @@ -0,0 +1,97 @@ +import { execFileSync } from "child_process" + +const delimiter = "\t" +const fieldMap = { + hash: "%H", + treeHash: "%T", + abbrevParentHashes: "%P", + authorName: "%an", + authorEmail: "%ae", + authorDate: "%ai", + committerName: "%cn", + committerEmail: "%ce", + committerDate: "%cd", + subject: "%s", +} + +export type GitLogOptions = { + number: number + branch: string + fields: Array> +} + +export type GitLogCommit = { + hash: string + treeHash: string + abbrevParentHashes: string + authorName: string + authorEmail: string + authorDate: string + committerName: string + committerEmail: string + committerDate: string + subject: string +} + +const createCommandArguments = (options: GitLogOptions) => { + // Start constructing command + let command: string[] = ["log", "-l0"] + + command.push(`-n ${options.number}`) + + // Start of custom format + let prettyArgument = "--pretty=@begin@" + + // Iterating through the fields and adding them to the custom format + if (options.fields) { + options.fields.forEach(field => { + prettyArgument += delimiter + fieldMap[field] + }) + } + + // Close custom format + prettyArgument += "@end@" + command.push(prettyArgument) + + // Append branch (revision range) if specified + if (options.branch) { + command.push(options.branch) + } + + return command +} + +const parseCommits = (commits: string[], fields: string[]) => + commits.map(rawCommit => { + const parts = rawCommit.split("@end@") + const commit = parts[0].split(delimiter) + + // Remove the first empty char from the array + commit.shift() + + const parsed = {} + + commit.forEach((commitField, index) => { + if (!fields[index]) { + return + } + + parsed[fields[index]] = commitField + }) + + return parsed as GitLogCommit + }) + +export const logGitCommits = (options: GitLogOptions) => { + const commandArguments = createCommandArguments(options) + + const stdout = execFileSync("git", commandArguments).toString() + + const commits = stdout.split("@begin@") + + if (commits[0] === "") { + commits.shift() + } + + return parseCommits(commits, options.fields) +} diff --git a/source/platforms/github/GitHubAPI.ts b/source/platforms/github/GitHubAPI.ts index 99de1efc6..abf30a823 100644 --- a/source/platforms/github/GitHubAPI.ts +++ b/source/platforms/github/GitHubAPI.ts @@ -146,13 +146,20 @@ export class GitHubAPI { return parseInt(perilID) } + const info = await this.getUserInfo() + if (info.id) { + return info.id + } + const useGitHubActionsID = process.env["GITHUB_WORKFLOW"] if (useGitHubActionsID) { + // This is the user.id of the github-actions app (https://github.com/apps/github-actions) + // that is used to comment when using danger in a GitHub Action + // with GITHUB_TOKEN (https://help.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token) return 41898282 } - const info = await this.getUserInfo() - return info.id + return undefined } postPRComment = async (comment: string): Promise => { @@ -190,6 +197,31 @@ export class GitHubAPI { } } + postInlinePRReview = async (commitId: string, comments: { comment: string; path: string; position: number }[]) => { + const repo = this.repoMetadata.repoSlug + const prID = this.repoMetadata.pullRequestID + const res = await this.post( + `repos/${repo}/pulls/${prID}/reviews`, + {}, + { + body: "", + event: "COMMENT", + commit_id: commitId, + comments: comments.map(({ comment, path, position }) => ({ + body: comment, + path, + position, + })), + }, + false + ) + if (res.ok) { + return res.json() + } else { + throw await res.json() + } + } + updateInlinePRComment = async (comment: string, commentId: string) => { const repo = this.repoMetadata.repoSlug const res = await this.patch( @@ -385,9 +417,10 @@ export class GitHubAPI { // this failure could be due to access rights. // // So only error when it's a real message. + const statusURL = `repos/${repo}/statuses/${ref}` try { const res = await this.post( - `repos/${repo}/statuses/${ref}`, + statusURL, {}, { state: state, @@ -397,11 +430,14 @@ export class GitHubAPI { }, true ) + if (!res.ok) { + this.d(`Got a non-OK (${res.status} ${res.statusText}) response from ${statusURL}:`) + this.d(JSON.stringify(res, null, " ")) + } return res.ok } catch (error) { - if (prJSON.base.repo.private) { - console.log("Could not post a commit status.") - } + this.d(`Posting a status to: ${statusURL} failed, this is the response:`) + this.d(error.message) } } diff --git a/source/platforms/github/GitHubUtils.ts b/source/platforms/github/GitHubUtils.ts index af6fa0384..fdb7aa1c6 100644 --- a/source/platforms/github/GitHubUtils.ts +++ b/source/platforms/github/GitHubUtils.ts @@ -176,6 +176,7 @@ export const createOrUpdatePR = (pr: GitHubPRDSL | undefined, api: GitHub) => as owner, repo, title: config.title, + body: config.body, }) } } @@ -194,8 +195,11 @@ export const createOrAddLabel = (pr: GitHubPRDSL | undefined, api: GitHub) => as d("Checking for existing labels") let label: any = null try { - const existingLabels = await api.issues.listLabelsForRepo({ owner: config.owner, repo: config.repo }) - label = existingLabels.data.find((l: any) => l.name == labelConfig.name) + const existingLabels = await api.paginate("GET /repos/:owner/:repo/labels", { + owner: config.owner, + repo: config.repo, + }) + label = existingLabels.find((l: any) => l.name == labelConfig.name) } catch (e) { d("api.issues.getLabels gave an error", e) } @@ -203,23 +207,31 @@ export const createOrAddLabel = (pr: GitHubPRDSL | undefined, api: GitHub) => as // Create the label if it doesn't exist yet if (!label) { d("no label found, creating a new one for this repo") - await api.issues.createLabel({ - owner: config.owner, - repo: config.repo, - name: labelConfig.name, - color: labelConfig.color, - description: labelConfig.description, - }) + try { + await api.issues.createLabel({ + owner: config.owner, + repo: config.repo, + name: labelConfig.name, + color: labelConfig.color, + description: labelConfig.description, + }) + } catch (e) { + d("api.issues.createLabel gave an error", e) + } } d("adding a label to this pr") // Then add the label - await api.issues.addLabels({ - owner: config.owner, - repo: config.repo, - number: config.id, - labels: [labelConfig.name], - }) + try { + await api.issues.addLabels({ + owner: config.owner, + repo: config.repo, + issue_number: config.id, + labels: [labelConfig.name], + }) + } catch (e) { + d("api.issues.addLabels gave an error", e) + } } export default utils diff --git a/source/platforms/github/_tests/_github_api.test.ts b/source/platforms/github/_tests/_github_api.test.ts index 79eb4d91f..f1931676e 100644 --- a/source/platforms/github/_tests/_github_api.test.ts +++ b/source/platforms/github/_tests/_github_api.test.ts @@ -156,6 +156,23 @@ describe("API testing", () => { await expect(api.postInlinePRComment("", "", "", 0)).rejects.toEqual(expectedJSON) }) + it("postInlinePRReview success", async () => { + api.fetch = fetchJSON + const expectedJSON = { + api: "https://api.github.com/repos/artsy/emission/pulls/1/reviews", + headers: { + Authorization: "token ABCDE", + "Content-Type": "application/json", + }, + method: "POST", + body: '{"body":"","event":"COMMENT","commit_id":"","comments":[{"body":"","path":"","position":0}]}', + } + expect.assertions(1) + await expect(api.postInlinePRReview("", [{ comment: "", path: "", position: 0 }])).resolves.toMatchObject( + expectedJSON + ) + }) + it("updateStatus('pending') success", async () => { api.fetch = jest.fn().mockReturnValue({ ok: true }) api.getPullRequestInfo = await requestWithFixturedJSON("github_pr.json") diff --git a/source/platforms/github/_tests/_github_git.test.ts b/source/platforms/github/_tests/_github_git.test.ts index e30c9e0fc..b1947b0f8 100644 --- a/source/platforms/github/_tests/_github_git.test.ts +++ b/source/platforms/github/_tests/_github_git.test.ts @@ -102,6 +102,16 @@ describe("the dangerfile gitDSL", () => { ]) }) + it("counts the lines of code", async () => { + const loc = await gitDSL.linesOfCode() + expect(loc).toBe(1151) + }) + + it("allows the lines of code to be filtered by file path", async () => { + const loc = await gitDSL.linesOfCode("lib/**") + expect(loc).toBe(720) + }) + it("show diff chunks for a specific file", async () => { const { chunks } = (await gitDSL.structuredDiffForFile("tsconfig.json"))! @@ -166,6 +176,8 @@ describe("the dangerfile gitDSL", () => { url: "https://api.github.com/repos/artsy/emission/commits/13da2c844def1f4262ee440bd86fb2a3b021718b", } + expect(gitDSL.head).toBe("cfa8fb80d2b65f4c4fa0b54d25352a3a0ff58f75") + expect(gitDSL.base).toBe("98f3e73f5e419f3af9ab928c86312f28a3c87475") expect(gitDSL.commits[0]).toEqual(exampleCommit) }) @@ -222,7 +234,7 @@ describe("the dangerfile gitDSL", () => { expect(empty).toEqual({ before: before, after: null, - diff: [{ op: "remove", path: "/a" }, { op: "remove", path: "/b" }, { op: "remove", path: "/c" }], + diff: [{ op: "remove", path: "/c" }, { op: "remove", path: "/b" }, { op: "remove", path: "/a" }], }) }) @@ -251,9 +263,9 @@ describe("the dangerfile gitDSL", () => { before, after, diff: [ - { op: "replace", path: "/a", value: "o, world" }, + { op: "add", path: "/c/3", value: "four" }, { op: "replace", path: "/b", value: 3 }, - { op: "add", path: "/c/-", value: "four" }, + { op: "replace", path: "/a", value: "o, world" }, ], }) }) diff --git a/source/platforms/github/comms/checks/githubAppSupport.ts b/source/platforms/github/comms/checks/githubAppSupport.ts index 8b8356749..b4f0bed13 100644 --- a/source/platforms/github/comms/checks/githubAppSupport.ts +++ b/source/platforms/github/comms/checks/githubAppSupport.ts @@ -23,7 +23,7 @@ const requestAccessTokenForInstallation = (appID: string, installationID: number const apiUrl = process.env["DANGER_GITHUB_API_BASE_URL"] ? process.env["DANGER_GITHUB_API_BASE_URL"] : "https://api.github.com" - const url = `${apiUrl}/installations/${installationID}/access_tokens` + const url = `${apiUrl}/app/installations/${installationID}/access_tokens` const headers = { Accept: "application/vnd.github.machine-man-preview+json", Authorization: `Bearer ${jwtForGitHubAuth(appID, key)}`, diff --git a/source/platforms/github/comms/checks/resultsToCheck.ts b/source/platforms/github/comms/checks/resultsToCheck.ts index 302117a58..8d85f0de8 100644 --- a/source/platforms/github/comms/checks/resultsToCheck.ts +++ b/source/platforms/github/comms/checks/resultsToCheck.ts @@ -70,7 +70,12 @@ export const resultsToCheck = async ( try { // response of getContents() can be one of 4 things. We are interested in file responses only // https://developer.github.com/v3/repos/contents/#get-contents - const { data } = await api.repos.getContents({ repo: pr.head.repo.name, owner: pr.head.repo.owner.login, path }) + const { data } = await api.repos.getContents({ + path, + ref: pr.head.sha, + repo: pr.head.repo.name, + owner: pr.head.repo.owner.login, + }) if (Array.isArray(data)) { console.error(`Path "${path}" is a folder - ignoring`) return "" diff --git a/source/platforms/github/comms/issueCommenter.ts b/source/platforms/github/comms/issueCommenter.ts index d6c71d6a3..9ce271398 100644 --- a/source/platforms/github/comms/issueCommenter.ts +++ b/source/platforms/github/comms/issueCommenter.ts @@ -89,6 +89,20 @@ export const GitHubIssueCommenter = (api: GitHubAPI) => { }) }, + createInlineReview: (git: GitDSL, comments: { comment: string; path: string; line: number }[]) => { + let commitId = git.commits[git.commits.length - 1].sha + d("Finishing review. Commit: " + commitId) + return Promise.all( + comments.map(comment => + findPositionForInlineComment(git, comment.line, comment.path).then(position => ({ + comment: comment.comment, + path: comment.path, + position, + })) + ) + ).then(comments => api.postInlinePRReview(commitId, comments)) + }, + /** * Updates an inline comment if possible. If platform can't update an inline comment, * it returns a promise rejection. (e.g. platform doesn't support inline comments or line was out of diff). diff --git a/source/platforms/gitlab/GitLabAPI.ts b/source/platforms/gitlab/GitLabAPI.ts index 272d66862..3cc67aa56 100644 --- a/source/platforms/gitlab/GitLabAPI.ts +++ b/source/platforms/gitlab/GitLabAPI.ts @@ -9,6 +9,9 @@ import { GitLabMRCommit, GitLabNote, GitLabUserProfile, + GitLabRepositoryFile, + GitLabRepositoryCompare, + GitLabApproval, } from "../../dsl/GitLabDSL" import { Gitlab } from "gitlab" @@ -16,10 +19,11 @@ import { Env } from "../../ci_source/ci_source" import { debug } from "../../debug" export type GitLabAPIToken = string - +export type GitLabOAuthToken = string export interface GitLabAPICredentials { host: string - token: GitLabAPIToken + token?: GitLabAPIToken + oauthToken?: GitLabOAuthToken } export function getGitLabAPICredentialsFromEnv(env: Env): GitLabAPICredentials { @@ -47,12 +51,13 @@ export function getGitLabAPICredentialsFromEnv(env: Env): GitLabAPICredentials { return { host, token: env["DANGER_GITLAB_API_TOKEN"], + oauthToken: env["DANGER_GITLAB_API_OAUTH_TOKEN"], } } class GitLabAPI { fetch: typeof fetch - private api: any + private api: InstanceType private readonly hostURL: string private readonly d = debug("GitLabAPI") @@ -70,25 +75,49 @@ class GitLabAPI { return `${this.projectURL}/merge_requests/${this.repoMetadata.pullRequestID}` } + get apiInstance() { + return this.api + } + getUser = async (): Promise => { this.d("getUser") - const user: GitLabUserProfile = await this.api.Users.current() + const user = (await this.api.Users.current()) as GitLabUserProfile this.d("getUser", user) return user } getMergeRequestInfo = async (): Promise => { this.d(`getMergeRequestInfo for repo: ${this.repoMetadata.repoSlug} pr: ${this.repoMetadata.pullRequestID}`) - const mr: GitLabMR = await this.api.MergeRequests.show(this.repoMetadata.repoSlug, this.repoMetadata.pullRequestID) + const mr = (await this.api.MergeRequests.show( + this.repoMetadata.repoSlug, + Number(this.repoMetadata.pullRequestID) + )) as GitLabMR this.d("getMergeRequestInfo", mr) return mr } + updateMergeRequestInfo = async (changes: object): Promise => { + const mr = this.api.MergeRequests.edit(this.repoMetadata.repoSlug, Number(this.repoMetadata.pullRequestID), changes) + + this.d("updateMergeRequestInfo", mr) + + return mr + } + + getMergeRequestApprovals = async (): Promise => { + this.d(`getMergeRequestApprovals for repo: ${this.repoMetadata.repoSlug} pr: ${this.repoMetadata.pullRequestID}`) + const approvals = (await this.api.MergeRequests.approvals(this.repoMetadata.repoSlug, { + mergerequestIId: Number(this.repoMetadata.pullRequestID), + })) as GitLabApproval + this.d("getMergeRequestApprovals", approvals) + return approvals + } + getMergeRequestChanges = async (): Promise => { this.d(`getMergeRequestChanges for repo: ${this.repoMetadata.repoSlug} pr: ${this.repoMetadata.pullRequestID}`) const mr = (await this.api.MergeRequests.changes( this.repoMetadata.repoSlug, - this.repoMetadata.pullRequestID + Number(this.repoMetadata.pullRequestID) )) as GitLabMRChanges this.d("getMergeRequestChanges", mr.changes) @@ -97,10 +126,10 @@ class GitLabAPI { getMergeRequestCommits = async (): Promise => { this.d("getMergeRequestCommits", this.repoMetadata.repoSlug, this.repoMetadata.pullRequestID) - const commits: GitLabMRCommit[] = await this.api.MergeRequests.commits( + const commits = (await this.api.MergeRequests.commits( this.repoMetadata.repoSlug, - this.repoMetadata.pullRequestID - ) + Number(this.repoMetadata.pullRequestID) + )) as GitLabMRCommit[] this.d("getMergeRequestCommits", commits) return commits } @@ -108,7 +137,7 @@ class GitLabAPI { getMergeRequestNotes = async (): Promise => { this.d("getMergeRequestNotes", this.repoMetadata.repoSlug, this.repoMetadata.pullRequestID) const api = this.api.MergeRequestNotes - const notes: GitLabNote[] = await api.all(this.repoMetadata.repoSlug, this.repoMetadata.pullRequestID) + const notes = (await api.all(this.repoMetadata.repoSlug, this.repoMetadata.pullRequestID)) as GitLabNote[] this.d("getMergeRequestNotes", notes) return notes } @@ -132,6 +161,7 @@ class GitLabAPI { const api = this.api.MergeRequestDiscussions try { + // @ts-ignore const result: string = await api.create(this.repoMetadata.repoSlug, this.repoMetadata.pullRequestID, content, { position: position, }) @@ -149,7 +179,7 @@ class GitLabAPI { try { this.d("createMergeRequestNote") - const note: GitLabNote = await api.create(this.repoMetadata.repoSlug, this.repoMetadata.pullRequestID, body) + const note = (await api.create(this.repoMetadata.repoSlug, this.repoMetadata.pullRequestID, body)) as GitLabNote this.d("createMergeRequestNote", note) return note } catch (e) { @@ -163,7 +193,7 @@ class GitLabAPI { this.d("updateMergeRequestNote", this.repoMetadata.repoSlug, this.repoMetadata.pullRequestID, id, body) const api = this.api.MergeRequestNotes try { - const note: GitLabNote = await api.edit(this.repoMetadata.repoSlug, this.repoMetadata.pullRequestID, id, body) + const note = (await api.edit(this.repoMetadata.repoSlug, this.repoMetadata.pullRequestID, id, body)) as GitLabNote this.d("updateMergeRequestNote", note) return note } catch (e) { @@ -200,7 +230,7 @@ class GitLabAPI { try { this.d("getFileContents", projectId, path, ref) - const response = await api.show(projectId, path, ref) + const response = (await api.show(projectId, path, ref)) as GitLabRepositoryFile const result: string = Buffer.from(response.content, "base64").toString() this.d("getFileContents", result) return result @@ -213,6 +243,40 @@ class GitLabAPI { throw e } } + + getCompareChanges = async (base?: string, head?: string): Promise => { + if (!base || !head) { + return this.getMergeRequestChanges() + } + const api = this.api.Repositories + const projectId = this.repoMetadata.repoSlug + const compare = (await api.compare(projectId, base, head)) as GitLabRepositoryCompare + return compare.diffs + } + + addLabels = async (...labels: string[]): Promise => { + const mr = await this.getMergeRequestInfo() + mr.labels.push(...labels) + + await this.updateMergeRequestInfo({ labels: mr.labels.join(",") }) + + return true + } + + removeLabels = async (...labels: string[]): Promise => { + const mr = await this.getMergeRequestInfo() + + for (const label of labels) { + const index = mr.labels.indexOf(label) + if (index > -1) { + mr.labels.splice(index, 1) + } + } + + await this.updateMergeRequestInfo({ labels: mr.labels.join(",") }) + + return true + } } export default GitLabAPI diff --git a/source/platforms/gitlab/GitLabGit.ts b/source/platforms/gitlab/GitLabGit.ts index 33e35871e..6f0bf8e7f 100644 --- a/source/platforms/gitlab/GitLabGit.ts +++ b/source/platforms/gitlab/GitLabGit.ts @@ -1,26 +1,45 @@ import { debug } from "../../debug" -import { GitLabDSL } from "../../dsl/GitLabDSL" +import { GitLabDSL, GitLabMRChange } from "../../dsl/GitLabDSL" import { GitDSL, GitJSONDSL } from "../../dsl/GitDSL" -import { gitJSONToGitDSL, GitJSONToGitDSLConfig, GitStructuredDiff } from "../git/gitJSONToGitDSL" +import { gitJSONToGitDSL, GitJSONToGitDSLConfig } from "../git/gitJSONToGitDSL" +import GitLabAPI from "./GitLabAPI" const d = debug("GitLabGit") -export const gitLabGitDSL = (gitlab: GitLabDSL, json: GitJSONDSL): GitDSL => { +export const gitLabGitDSL = (gitlab: GitLabDSL, json: GitJSONDSL, gitlabAPI: GitLabAPI): GitDSL => { const config: GitJSONToGitDSLConfig = { repo: `${gitlab.mr.project_id}`, // we don't get the repo slug, but `project_id` is equivalent in API calls - baseSHA: gitlab.mr.diff_refs.base_sha, - headSHA: gitlab.mr.diff_refs.head_sha, + baseSHA: gitlab.mr.diff_refs ? gitlab.mr.diff_refs.base_sha : "", + headSHA: gitlab.mr.diff_refs ? gitlab.mr.diff_refs.head_sha : "", getFileContents: gitlab.utils.fileContents, - // TODO: implement me when the API methods are in - getFullDiff: async (): Promise => { - throw new Error("getFullDiff is not yet implemented") - }, - // TODO: implement me when the API methods are in - getStructuredDiffForFile: async (): Promise => { - throw new Error("getStructuredDiffForFile is not yet implemented") + getFullDiff: async (base: string, head: string) => { + const changes = await gitlabAPI.getCompareChanges(base, head) + return gitlabChangesToDiff(changes) }, } d("Setting up git DSL with: ", config) return gitJSONToGitDSL(json, config) } + +export const gitlabChangesToDiff = (changes: GitLabMRChange[]): string => { + d("Converting GitLab Changes to Diff") + // Gitlab doesn't return full raw git diff, relevant issue: https://gitlab.com/gitlab-org/gitlab/issues/24913 + return changes + .map(change => { + const { diff } = change + if (diff.startsWith("diff --git a/") || diff.startsWith("--- a/") || diff.startsWith("--- /dev/null")) { + return diff + } + + return `\ +diff --git a/${change.old_path} b/${change.new_path} +${change.new_file ? `new file mode ${change.b_mode}` : ""}\ +${change.deleted_file ? `deleted file mode ${change.a_mode}` : ""}\ +${change.renamed_file ? `rename from ${change.old_path}\nrename to ${change.new_path}` : ""} +--- ${change.new_file ? "/dev/null" : "a/" + change.old_path} ++++ ${change.deleted_file ? "/dev/null" : "b/" + change.new_path} +${diff}` + }) + .join("\n") +} diff --git a/source/platforms/gitlab/_tests/__snapshots__/_gitlab_git.test.ts.snap b/source/platforms/gitlab/_tests/__snapshots__/_gitlab_git.test.ts.snap new file mode 100644 index 000000000..5cf168b8c --- /dev/null +++ b/source/platforms/gitlab/_tests/__snapshots__/_gitlab_git.test.ts.snap @@ -0,0 +1,720 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`GitLabGit DSL gitlabChangesToDiff should convert changes to diff 1`] = ` +"diff --git a/added-me.txt b/added-me.txt +new file mode 100644 +--- /dev/null ++++ b/added-me.txt +@@ -0,0 +1,7 @@ ++ Nulla nec nisl neque. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus maximus magna eget quam ultrices, nec malesuada dolor laoreet. Integer et congue metus, sed porttitor lacus. Nam at venenatis est, vel cursus mi. In id velit ut risus imperdiet dapibus. Nulla arcu sem, varius et viverra id, finibus in nulla. Vestibulum auctor finibus velit et pharetra. Nunc at rhoncus tellus, eu sodales metus. ++ ++Proin et lobortis diam. Fusce vitae metus sit amet urna ultricies mollis eget quis erat. Maecenas enim elit, consequat ac condimentum non, pretium semper arcu. Fusce vitae pulvinar purus. Etiam egestas mi sed mi aliquet, eget auctor ipsum scelerisque. Suspendisse tincidunt ultrices tortor rutrum dictum. Mauris dictum at justo in rutrum. Cras tristique hendrerit commodo. Pellentesque imperdiet convallis dolor, ac sollicitudin urna dignissim vitae. In et neque eget arcu porttitor consectetur ut sed metus. Nam mattis in elit ut sagittis. Etiam hendrerit nunc dui, ut aliquam enim vehicula ut. Integer in interdum arcu, eu vulputate mi. Mauris aliquam erat lectus, vitae facilisis mauris lacinia eu. Aliquam pretium elit neque, et ultrices diam maximus eu. ++ ++Aenean posuere nisi non nibh tempus, id ornare tortor maximus. Proin eu ornare dui, sed vehicula est. Sed euismod risus lectus, eu imperdiet quam convallis eget. Proin vitae tellus malesuada, iaculis ante ut, pellentesque augue. Maecenas ullamcorper turpis ante, a porta magna ultricies nec. Maecenas sed ipsum ex. Vestibulum auctor et dolor sit amet elementum. Phasellus egestas velit vitae dapibus accumsan. Aenean faucibus pharetra purus, egestas auctor nisi maximus porta. Nulla in enim quis enim scelerisque cursus eu non quam. ++ ++Suspendisse iaculis, nulla molestie volutpat laoreet, metus odio eleifend ex, eget malesuada mi nibh at tortor. Praesent semper mattis felis, a tempor purus mattis ut. Pellentesque sodales non odio non blandit. Nunc metus est, euismod vitae sem ut, molestie venenatis lectus. Nulla porta sagittis ipsum ac semper. Pellentesque augue neque, vulputate sit amet consequat et, commodo tempor eros. Nam gravida lorem ante, sed facilisis libero hendrerit sed. Praesent sed facilisis ex. Curabitur posuere consectetur nisi, non mollis purus pellentesque quis. Integer non dignissim magna. Ut a consequat enim. Cras viverra leo a magna finibus, in fringilla odio placerat. Cras quis est congue, congue velit sed, fermentum urna. Cras rutrum leo tempor lectus fringilla tincidunt. Integer nec lacinia sem, quis finibus turpis. +\\\\ No newline at end of file + +diff --git a/change-me.txt b/change-me.txt + +--- a/change-me.txt ++++ b/change-me.txt +@@ -2,8 +2,11 @@ + + Praesent id venenatis nunc, et egestas augue. Vestibulum vitae posuere odio, quis blandit elit. Nullam mattis ante sed purus vehicula ultricies. Phasellus facilisis hendrerit sem eget ultricies. Donec vestibulum ac lacus in faucibus. Vestibulum interdum dolor et lacinia hendrerit. Curabitur sem lectus, ornare vitae nunc pharetra, aliquam cursus lorem. Curabitur ut gravida felis. Sed aliquam purus porttitor massa dignissim porttitor. Vivamus condimentum, turpis nec semper posuere, lacus ipsum mattis quam, eleifend maximus erat tellus nec velit. Mauris tristique eros erat, id rutrum nisl ultricies at. + +-Nullam vitae odio dapibus, euismod eros a, vehicula libero. Cras laoreet diam id venenatis tincidunt. Curabitur ut eros arcu. Aliquam consectetur ornare commodo. Aliquam vel sem eget nisi consequat accumsan nec at ipsum. Integer varius ultrices tellus et faucibus. Donec eu aliquet mi. Aenean sit amet dui lacus. Suspendisse bibendum mauris tellus. Aenean interdum semper augue ut cursus. Nam blandit nunc at lectus posuere, id fringilla ex porttitor. Duis vel erat non risus semper bibendum quis vel nunc. ++Nullam vitae odio dapibus, euismod eros a, vehicula libero. Cras laoreet diam id venenatis tincidunt. Curabitur ut eros arcu. Aliquam consectetur ornare commodo. Aliquam vel sem eget nisi consequat accumsan nec at ipsum. Integer varius ultrices tellus et faucibus. Donec eu aliquet mi. Aenean sit amet dui lacus. Suspendisse bibendum mauris tellus. Aenean interdum semper augue ut cursus. , id fringilla ex porttitor. Duis vel erat non risus semper bibendum quis vel nunc. + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec laoreet diam sem, pulvinar congue turpis laoreet faucibus. Morbi commodo ornare dolor vitae eleifend. Duis at massa mollis, gravida odio vitae, pulvinar dui. Aliquam ullamcorper ante vel nulla interdum, vel sollicitudin ante semper. Proin convallis tempor enim. Quisque interdum varius dolor eu luctus. Aliquam et eros purus. Praesent euismod ligula ac mi tristique gravida. Sed et tempus erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. + +-Cras euismod velit quis eros ultrices ullamcorper. Fusce et nisi et mi sollicitudin vulputate eu eget nisi. Quisque eu elit lectus. Donec et cursus lacus. In hac habitasse platea dictumst. Vivamus ante turpis, cursus a interdum sed, viverra at nibh. Morbi ante tellus, efficitur eu justo in, feugiat imperdiet turpis. Morbi tellus felis, efficitur quis viverra at, euismod quis arcu. Integer pretium congue tincidunt. +\\\\ No newline at end of file ++Cras euismod velit quis eros ultrices ullamcorper. Fusce et nisi et mi sollicitudin vulputate eu eget nisi. Quisque eu elit lectus. Donec et cursus lacus. In hac habitasse platea dictumst. Vivamus ante turpis, cursus a interdum sed, viverra at nibh. Morbi ante tellus, efficitur eu justo in, feugiat imperdiet turpis. Morbi tellus felis, efficitur quis viverra at, euismod quis arcu. Integer pretium congue tincidunt. ++ ++safaklsdfjasl;kdfasdf;;kjasf ++asdfkasdfjal;ksdf +\\\\ No newline at end of file + +diff --git a/delete-me.txt b/delete-me.txt +deleted file mode 100644 +--- a/delete-me.txt ++++ /dev/null +@@ -1,7 +0,0 @@ +- Ut vitae nunc felis. In pulvinar ipsum accumsan, porta nisl eget, posuere ligula. Ut ultricies fermentum magna, vitae consectetur dolor bibendum eget. Donec libero turpis, tincidunt et nisl id, rutrum finibus felis. Duis consequat et lectus sed semper. Pellentesque at elit et odio hendrerit sollicitudin. Vivamus felis orci, efficitur tincidunt fermentum sit amet, rutrum non odio. Mauris ac lacus vel odio varius ultricies id vitae mi. Sed vitae metus dolor. Fusce blandit suscipit neque nec ultricies. Mauris mi dolor, sagittis nec viverra non, accumsan eu sapien. Nam nec faucibus turpis, et pulvinar nisl. Proin interdum consequat velit, non tempus dolor volutpat vitae. Integer dignissim varius porta. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed turpis odio, lacinia ultrices euismod id, vestibulum a mi. +- +-Quisque rhoncus, odio at lobortis rutrum, erat elit pretium quam, sodales porta erat lorem in velit. Cras nisl magna, rutrum non urna non, tempus volutpat urna. Mauris venenatis, neque vitae efficitur bibendum, diam neque porttitor nulla, hendrerit finibus arcu ligula sit amet est. Suspendisse tincidunt nec arcu semper sodales. Aliquam rutrum odio arcu, nec rhoncus felis tempor in. Sed tempus ut eros ac tincidunt. Vivamus non nisi tellus. Maecenas vulputate nisi arcu, sed fermentum nunc mollis et. Fusce interdum ligula sit amet interdum suscipit. Aenean laoreet aliquet lacus. Nulla facilisi. Integer scelerisque turpis velit, ac blandit sem mattis in. Pellentesque id augue nisl. Praesent bibendum, elit et accumsan ultricies, nisl urna euismod velit, eu efficitur nibh lacus eget nisl. Sed facilisis nibh faucibus tincidunt ultrices. +- +-Nullam ullamcorper mi leo, id placerat sem viverra vel. Donec eu orci efficitur, commodo metus vel, malesuada erat. Sed vitae est eget odio commodo bibendum. Nam interdum nisl in erat ornare, tincidunt porttitor quam suscipit. Morbi egestas sed tellus ac maximus. Vivamus efficitur porta mi a mollis. Nulla vitae nulla sed tellus vulputate vulputate ac quis leo. +- +-Quisque purus neque, porta at felis ut, pulvinar convallis elit. Aliquam tempor tortor sed quam eleifend, ac molestie felis blandit. Fusce ornare, purus non rhoncus aliquam, mi leo porttitor ante, sodales ultrices felis urna nec risus. Phasellus luctus lectus ipsum. Maecenas fringilla imperdiet nunc, a facilisis eros commodo quis. Vivamus mollis lobortis sem, vel gravida dolor consequat nec. Curabitur eget sem condimentum, ultrices magna non, ullamcorper nisl. Etiam consectetur tellus est, eget scelerisque nisi auctor ac. Nam egestas ac elit nec rutrum. Nunc tristique, tortor faucibus finibus mollis, augue nulla eleifend justo, eu condimentum mauris lacus ut libero. Maecenas vehicula semper neque non finibus. Mauris mollis ultrices commodo. Ut pulvinar quis neque vitae tempus. Maecenas condimentum aliquam nisl pretium posuere. + +diff --git a/rename-me.txt b/renamed.txt +rename from rename-me.txt +rename to renamed.txt +--- a/rename-me.txt ++++ b/renamed.txt +@@ -2,7 +2,7 @@ a vitae, dignissim vel nunc. Integer gravida nibh nisl, in euismod nulla aliquam + + Nunc cursus rutrum ultricies. Vivamus condimentum elit eros, non tincidunt orci accumsan id. Ut malesuada non massa tincidunt ullamcorper. Aliquam sollicitudin tellus quis metus suscipit aliquam. Donec fringilla eros risus, et aliquet neque consectetur efficitur. Sed facilisis lectus augue, pharetra commodo augue eleifend a. Aenean vel convallis eros. In a elementum dui. Cras facilisis nunc neque, ut sollicitudin nisl dignissim non. + +-Duis a lectus non dolor lobortis venenatis. Sed feugiat non felis tempus euismod. Mauris ac risus eu magna varius tristique ut blandit nisi. Pellentesque efficitur maximus dictum. Maecenas nisl felis, posuere et nunc non, pellentesque luctus risus. Fusce rhoncus sed eros quis efficitur. Sed lacinia pharetra auctor. Suspendisse vestibulum neque quis ligula pharetra mollis. Vivamus non nisi id mauris tempor gravida. Pellentesque nec metus ut enim vulputate blandit rutrum at justo. Curabitur lorem ante, cursus eu mattis eu, pharetra ornare odio. ++Duis a lectuon dolor lobortis venenatis. Sed feugiat non felis tempus euismod. Mauris ac risus eu magna varius tristique ut blandit nisi. Pellentesque efficitur maximus dictum. Maecenas nisl felis, posuere et nunc non, pellentesque luctus risus. Fusce rhoncus sed eros quis efficitur. Sed lacinia pharetra auctor. Suspendisse vestibulum neque quis ligula pharetra mollis. Vivamus non nisi id mauris tempor gravida. Pellentesque nec metus ut enim vulputate blandit rutrum at justo. Curabitur lorem ante, cursus eu mattis eu, pharetra ornare odio. + + Phasellus id commodo diam. Fusce egestas erat vel lectus consequat, vel varius augue convallis. Morbi eu nunc id orci elementum consequat. Morbi quis elit congue, placerat felis ac, laoreet magna. Aenean euismod augue sapien, sit amet sodales lectus faucibus ac. Nulla sagittis mi ex, a laoreet sem pulvinar at. Quisque eu magna in justo blandit imperdiet. Suspendisse sollicitudin fringilla ipsum euismod lacinia. Donec dignissim, neque quis efficitur eleifend, magna risus condimentum ipsum, a iaculis sapien tortor a neque. Praesent molestie ut est sed tempus. Nullam ut sodales mi. Vestibulum lobortis erat ut mattis semper. Etiam at convallis odio. Aliquam at convallis erat. Vivamus consectetur nulla vel nibh elementum, et facilisis urna vehicula. Vivamus facilisis a nunc vel tincidunt. + +" +`; + +exports[`GitLabGit DSL show diff chunks for a specific file 1`] = ` +Array [ + Object { + "changes": Array [ + Object { + "content": " # frozen_string_literal: true", + "ln1": 1, + "ln2": 1, + "normal": true, + "type": "normal", + }, + Object { + "content": " ", + "ln1": 2, + "ln2": 2, + "normal": true, + "type": "normal", + }, + Object { + "add": true, + "content": "+require 'digest/md5'", + "ln": 3, + "type": "add", + }, + Object { + "add": true, + "content": "+", + "ln": 4, + "type": "add", + }, + Object { + "content": " MESSAGE = < 10 + \\"\\\\n
\\\\n\\\\n#{list}\\\\n\\\\n
\\" + else + list + end +end + +changes = helper.changes_by_category + +# Ignore any files that are known but uncategoried. Prompt for any unknown files +changes.delete(:none) +categories = changes.keys - [:unknown] + +# Single codebase MRs are reviewed using a slightly different process, so we +# disable the review roulette for such MRs. +# CSS Clean up MRs are reviewed using a slightly different process, so we +# disable the review roulette for such MRs. +if changes.any? && !gitlab.mr_labels.include?('single codebase') && !gitlab.mr_labels.include?('CSS cleanup') + # Strip leading and trailing CE/EE markers + canonical_branch_name = gitlab + .mr_json['source_branch'] + .gsub(/^[ce]e-/, '') + .gsub(/-[ce]e$/, '') + + team = + begin + helper.project_team + rescue => err + warn(\\"Reviewer roulette failed to load team data: #{err.message}\\") + [] + end + + # Exclude the MR author from the team for selection purposes + team.delete_if { |teammate| teammate.username == gitlab.mr_author } + + project = helper.project_name + unknown = changes.fetch(:unknown, []) + + rows = categories.map { |category| spin(team, project, category, canonical_branch_name) } + + markdown(MESSAGE) + markdown(CATEGORY_TABLE_HEADER + rows.join(\\"\\\\n\\")) unless rows.empty? + markdown(UNKNOWN_FILES_MESSAGE + build_list(unknown)) unless unknown.empty? +end +", + "before": "# frozen_string_literal: true + +MESSAGE = < 10 + \\"\\\\n
\\\\n\\\\n#{list}\\\\n\\\\n
\\" + else + list + end +end + +changes = helper.changes_by_category + +# Ignore any files that are known but uncategoried. Prompt for any unknown files +changes.delete(:none) +categories = changes.keys - [:unknown] + +# Single codebase MRs are reviewed using a slightly different process, so we +# disable the review roulette for such MRs. +# CSS Clean up MRs are reviewed using a slightly different process, so we +# disable the review roulette for such MRs. +if changes.any? && !gitlab.mr_labels.include?('single codebase') && !gitlab.mr_labels.include?('CSS cleanup') + team = + begin + helper.project_team + rescue => err + warn(\\"Reviewer roulette failed to load team data: #{err.message}\\") + [] + end + + # Exclude the MR author from the team for selection purposes + team.delete_if { |teammate| teammate.username == gitlab.mr_author } + + project = helper.project_name + unknown = changes.fetch(:unknown, []) + + rows = categories.map { |category| spin(team, project, category) } + + markdown(MESSAGE) + markdown(CATEGORY_TABLE_HEADER + rows.join(\\"\\\\n\\")) unless rows.empty? + markdown(UNKNOWN_FILES_MESSAGE + build_list(unknown)) unless unknown.empty? +end +", + "diff": " # frozen_string_literal: true + ++require 'digest/md5' ++ + MESSAGE = < { beforeEach(() => { api = new GitLabAPI( - { pullRequestID: "27117", repoSlug: "gitlab-org/gitlab-ce" }, + { pullRequestID: "27117", repoSlug: "gitlab-org/gitlab-foss" }, getGitLabAPICredentialsFromEnv({ DANGER_GITLAB_HOST: "gitlab.com", DANGER_GITLAB_API_TOKEN: "FAKE_DANGER_GITLAB_API_TOKEN", @@ -37,22 +37,22 @@ describe("GitLab API", () => { it("configures host from CI_API_V4_URL", () => { api = new GitLabAPI( - { pullRequestID: "27117", repoSlug: "gitlab-org/gitlab-ce" }, + { pullRequestID: "27117", repoSlug: "gitlab-org/gitlab-foss" }, getGitLabAPICredentialsFromEnv({ CI_API_V4_URL: "https://testciapiv4url.com/api/v4", DANGER_GITLAB_API_TOKEN: "FAKE_DANGER_GITLAB_API_TOKEN", }) ) - expect(api.projectURL).toBe("https://testciapiv4url.com/gitlab-org/gitlab-ce") + expect(api.projectURL).toBe("https://testciapiv4url.com/gitlab-org/gitlab-foss") }) it("projectURL is defined", () => { - expect(api.projectURL).toBe("https://gitlab.com/gitlab-org/gitlab-ce") + expect(api.projectURL).toBe("https://gitlab.com/gitlab-org/gitlab-foss") }) it("mergeRequestURL is defined", () => { - expect(api.mergeRequestURL).toBe("https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/27117") + expect(api.mergeRequestURL).toBe("https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/27117") }) const sanitizeUserResponse = (nocks: NockDefinition[]): NockDefinition[] => { @@ -96,6 +96,14 @@ describe("GitLab API", () => { expect(result).toEqual(response) }) + it("getMergeRequestApprovals", async () => { + const { nockDone } = await nockBack("getMergeRequestApprovals.json") + const result = await api.getMergeRequestApprovals() + nockDone() + const { response } = loadFixture("getMergeRequestApprovals") + expect(result).toEqual(response) + }) + it("getMergeRequestChanges", async () => { const { nockDone } = await nockBack("getMergeRequestChanges.json") const result = await api.getMergeRequestChanges() @@ -138,4 +146,23 @@ describe("GitLab API", () => { // TODO: There are no inline notes on this MR, we should look for a public one that has inline notes to improve this test expect(result).toEqual([]) }) + + it("getCompareChanges", async () => { + const { nockDone } = await nockBack("getCompareChanges.json") + const result = await api.getCompareChanges( + "50cd5d9b776848cf23f1fd1ec52789dbdf946185", + "28531ab43666b5fdf37e0a70db3bcbf7d3f92183" + ) + nockDone() + const { response } = loadFixture("getCompareChanges") + expect(result).toEqual(response.diffs) + }) + + it("getCompareChanges without base/head", async () => { + const { nockDone } = await nockBack("getMergeRequestChanges.json") + const result = await api.getCompareChanges() + nockDone() + const { response } = loadFixture("getCompareChanges") + expect(result).toEqual(response.diffs) + }) }) diff --git a/source/platforms/gitlab/_tests/_gitlab_git.test.ts b/source/platforms/gitlab/_tests/_gitlab_git.test.ts new file mode 100644 index 000000000..39767e391 --- /dev/null +++ b/source/platforms/gitlab/_tests/_gitlab_git.test.ts @@ -0,0 +1,125 @@ +import { readFileSync } from "fs" +import { join as pathJoin } from "path" +import _ from "lodash" + +import { GitLabDSL } from "../../../dsl/GitLabDSL" +import { GitDSL, GitJSONDSL } from "../../../dsl/GitDSL" + +import GitLab, { gitlabJSONToGitLabDSL } from "../../GitLab" +import GitLabAPI, { getGitLabAPICredentialsFromEnv } from "../GitLabAPI" +import { gitLabGitDSL as gitJSONToGitDSL, gitlabChangesToDiff } from "../GitLabGit" + +const fixtures = pathJoin(__dirname, "fixtures") + +/** Returns a fixture. */ +const loadFixture = (path: string): string => + readFileSync(pathJoin(fixtures, path), {}) + .toString() + .replace(/\r/g, "") + +/** Returns JSON from the fixtured dir */ +export const requestWithFixturedJSON = (path: string, field = ""): (() => Promise) => () => { + let data = JSON.parse(loadFixture(path)) + if (field) { + data = _.get(data, field) + } + + return Promise.resolve(data) +} + +/** Returns arbitrary text value from a request */ +export const requestWithFixturedContent = (path: string): (() => Promise) => () => + Promise.resolve(loadFixture(path)) + +/** + * HACKish: Jest on Windows seems to include some additional + * whitespace that differs from non-Windows snapshot output, + * so we strip these until we can better-address the issue. + */ +const stripWhitespaceForSnapshot = (str: string) => { + return str.replace(/\s/g, "") +} + +const MRInfoFixture = "getMergeRequestInfo.json" +const changedFilePath = "danger/roulette/Dangerfile" +const baseSHA = JSON.parse(readFileSync(pathJoin(fixtures, MRInfoFixture), {}).toString())[0].response.diff_refs + .base_sha + +describe("GitLabGit DSL", () => { + let gitlab: GitLab = {} as any + let gitJSONDSL: GitJSONDSL = {} as any + + let gitlabDSL: GitLabDSL = {} as any + let gitDSL: GitDSL = {} as any + + beforeEach(async () => { + const api = new GitLabAPI( + { pullRequestID: "27117", repoSlug: "gitlab-org/gitlab-foss" }, + getGitLabAPICredentialsFromEnv({ + DANGER_GITLAB_HOST: "gitlab.com", + DANGER_GITLAB_API_TOKEN: "FAKE_DANGER_GITLAB_API_TOKEN", + }) + ) + gitlab = new GitLab(api) + + // Actually used + const defaultField = "0.response" + + api.getMergeRequestInfo = requestWithFixturedJSON(MRInfoFixture, defaultField) + api.getMergeRequestApprovals = requestWithFixturedJSON("getMergeRequestApprovals.json", defaultField) + api.getMergeRequestCommits = requestWithFixturedJSON("getMergeRequestCommits.json", defaultField) + api.getMergeRequestChanges = requestWithFixturedJSON("getMergeRequestChanges.json", `${defaultField}.changes`) + api.getCompareChanges = requestWithFixturedJSON("getCompareChanges.json", `${defaultField}.diffs`) + + gitJSONDSL = await gitlab.getPlatformGitRepresentation() + const gitlabJSONDSL = await gitlab.getPlatformReviewDSLRepresentation() + gitlabDSL = gitlabJSONToGitLabDSL(gitlabJSONDSL as GitLabDSL, api) + + const before = await requestWithFixturedContent("fileContentsBefore.txt")() + const after = await requestWithFixturedContent("fileContentsAfter.txt")() + gitlabDSL.utils.fileContents = async (_path, _repo, ref) => { + if (_path !== changedFilePath) { + return "" + } + return ref === baseSHA ? before : after + } + + gitDSL = gitJSONToGitDSL(gitlabDSL, gitJSONDSL, gitlab.api) + }) + + it("show diff chunks for a specific file", async () => { + const { chunks } = (await gitDSL.structuredDiffForFile(changedFilePath))! + + expect(chunks).toMatchSnapshot() + }) + + it("shows the diff for a specific file", async () => { + const { diff } = (await gitDSL.diffForFile(changedFilePath))! + + expect(stripWhitespaceForSnapshot(diff)).toMatchSnapshot() + }) + + describe("textDiffForFile", () => { + it("returns a null for files not in the change list", async () => { + const empty = await gitDSL.diffForFile("fuhqmahgads.json") + expect(empty).toEqual(null) + }) + + it("returns a diff for modified files", async () => { + gitDSL = gitJSONToGitDSL(gitlabDSL, gitJSONDSL, gitlab.api) + const diff = (await gitDSL.diffForFile(changedFilePath))! + + expect(diff).toMatchSnapshot() + }) + }) + + describe("gitlabChangesToDiff", () => { + it("should convert changes to diff", async () => { + const { diffs: changes } = await requestWithFixturedJSON("gitlab_changes.json")() + + const diff = gitlabChangesToDiff(changes) + + expect(diff).toMatchSnapshot() + }) + }) +}) diff --git a/source/platforms/gitlab/_tests/fixtures/fileContentsAfter.txt b/source/platforms/gitlab/_tests/fixtures/fileContentsAfter.txt new file mode 100644 index 000000000..e6820f49e --- /dev/null +++ b/source/platforms/gitlab/_tests/fixtures/fileContentsAfter.txt @@ -0,0 +1,100 @@ +# frozen_string_literal: true + +require 'digest/md5' + +MESSAGE = < 10 + "\n
\n\n#{list}\n\n
" + else + list + end +end + +changes = helper.changes_by_category + +# Ignore any files that are known but uncategoried. Prompt for any unknown files +changes.delete(:none) +categories = changes.keys - [:unknown] + +# Single codebase MRs are reviewed using a slightly different process, so we +# disable the review roulette for such MRs. +# CSS Clean up MRs are reviewed using a slightly different process, so we +# disable the review roulette for such MRs. +if changes.any? && !gitlab.mr_labels.include?('single codebase') && !gitlab.mr_labels.include?('CSS cleanup') + # Strip leading and trailing CE/EE markers + canonical_branch_name = gitlab + .mr_json['source_branch'] + .gsub(/^[ce]e-/, '') + .gsub(/-[ce]e$/, '') + + team = + begin + helper.project_team + rescue => err + warn("Reviewer roulette failed to load team data: #{err.message}") + [] + end + + # Exclude the MR author from the team for selection purposes + team.delete_if { |teammate| teammate.username == gitlab.mr_author } + + project = helper.project_name + unknown = changes.fetch(:unknown, []) + + rows = categories.map { |category| spin(team, project, category, canonical_branch_name) } + + markdown(MESSAGE) + markdown(CATEGORY_TABLE_HEADER + rows.join("\n")) unless rows.empty? + markdown(UNKNOWN_FILES_MESSAGE + build_list(unknown)) unless unknown.empty? +end diff --git a/source/platforms/gitlab/_tests/fixtures/fileContentsBefore.txt b/source/platforms/gitlab/_tests/fixtures/fileContentsBefore.txt new file mode 100644 index 000000000..81ee0397b --- /dev/null +++ b/source/platforms/gitlab/_tests/fixtures/fileContentsBefore.txt @@ -0,0 +1,87 @@ +# frozen_string_literal: true + +MESSAGE = < 10 + "\n
\n\n#{list}\n\n
" + else + list + end +end + +changes = helper.changes_by_category + +# Ignore any files that are known but uncategoried. Prompt for any unknown files +changes.delete(:none) +categories = changes.keys - [:unknown] + +# Single codebase MRs are reviewed using a slightly different process, so we +# disable the review roulette for such MRs. +# CSS Clean up MRs are reviewed using a slightly different process, so we +# disable the review roulette for such MRs. +if changes.any? && !gitlab.mr_labels.include?('single codebase') && !gitlab.mr_labels.include?('CSS cleanup') + team = + begin + helper.project_team + rescue => err + warn("Reviewer roulette failed to load team data: #{err.message}") + [] + end + + # Exclude the MR author from the team for selection purposes + team.delete_if { |teammate| teammate.username == gitlab.mr_author } + + project = helper.project_name + unknown = changes.fetch(:unknown, []) + + rows = categories.map { |category| spin(team, project, category) } + + markdown(MESSAGE) + markdown(CATEGORY_TABLE_HEADER + rows.join("\n")) unless rows.empty? + markdown(UNKNOWN_FILES_MESSAGE + build_list(unknown)) unless unknown.empty? +end diff --git a/source/platforms/gitlab/_tests/fixtures/getCompareChanges.json b/source/platforms/gitlab/_tests/fixtures/getCompareChanges.json new file mode 100644 index 000000000..4e271c22f --- /dev/null +++ b/source/platforms/gitlab/_tests/fixtures/getCompareChanges.json @@ -0,0 +1,113 @@ +[ + { + "scope": "https://gitlab.com:443", + "method": "GET", + "path": "/api/v4/projects/gitlab-org%2Fgitlab-foss/repository/compare?from=50cd5d9b776848cf23f1fd1ec52789dbdf946185&to=28531ab43666b5fdf37e0a70db3bcbf7d3f92183", + "body": "", + "status": 200, + "response": { + "commit": { + "id": "28531ab43666b5fdf37e0a70db3bcbf7d3f92183", + "short_id": "28531ab4", + "created_at": "2019-04-08T11:56:17.000+01:00", + "parent_ids": ["575ec3af131e9c101edfc50ee563381b37c8076e"], + "title": "Pick reviewers based on branch name", + "message": "Pick reviewers based on branch name\n\nChange reviewer roulette to always pick the same reviewers for the same\nbranch name. We do this by:\n\n1. Making the branch name 'canonical' across CE and EE by stripping a\n leading 'ce-' or 'ee-' and a trailing '-ce' or '-ee'. If people are\n following our branch naming guidelines, this should give the same\n branch name in both repos.\n2. Converting the branch name to a stable integer by taking the integer\n form of its MD5.\n3. Passing that integer as a seed to Ruby's `Random` class, which 'may\n be used to ensure repeatable sequences of pseudo-random numbers\n between different runs of the program' (from the Ruby documentation).\n\nThe upshot is that the same branch name (in CE and EE) should always\npick the same reviewers, and those should be evenly distributed across\nthe set of possible reviewers due to the use of MD5.\n", + "author_name": "Sean McGivern", + "author_email": "sean@gitlab.com", + "authored_date": "2019-04-08T11:44:57.000+01:00", + "committer_name": "Sean McGivern", + "committer_email": "sean@gitlab.com", + "committed_date": "2019-04-08T11:56:17.000+01:00" + }, + "commits": [ + { + "id": "575ec3af131e9c101edfc50ee563381b37c8076e", + "short_id": "575ec3af", + "created_at": "2019-04-08T11:56:17.000+01:00", + "parent_ids": ["50cd5d9b776848cf23f1fd1ec52789dbdf946185"], + "title": "Add issue links to Danger roulette comments", + "message": "Add issue links to Danger roulette comments\n", + "author_name": "Sean McGivern", + "author_email": "sean@gitlab.com", + "authored_date": "2019-04-08T10:50:39.000+01:00", + "committer_name": "Sean McGivern", + "committer_email": "sean@gitlab.com", + "committed_date": "2019-04-08T11:56:17.000+01:00" + }, + { + "id": "28531ab43666b5fdf37e0a70db3bcbf7d3f92183", + "short_id": "28531ab4", + "created_at": "2019-04-08T11:56:17.000+01:00", + "parent_ids": ["575ec3af131e9c101edfc50ee563381b37c8076e"], + "title": "Pick reviewers based on branch name", + "message": "Pick reviewers based on branch name\n\nChange reviewer roulette to always pick the same reviewers for the same\nbranch name. We do this by:\n\n1. Making the branch name 'canonical' across CE and EE by stripping a\n leading 'ce-' or 'ee-' and a trailing '-ce' or '-ee'. If people are\n following our branch naming guidelines, this should give the same\n branch name in both repos.\n2. Converting the branch name to a stable integer by taking the integer\n form of its MD5.\n3. Passing that integer as a seed to Ruby's `Random` class, which 'may\n be used to ensure repeatable sequences of pseudo-random numbers\n between different runs of the program' (from the Ruby documentation).\n\nThe upshot is that the same branch name (in CE and EE) should always\npick the same reviewers, and those should be evenly distributed across\nthe set of possible reviewers due to the use of MD5.\n", + "author_name": "Sean McGivern", + "author_email": "sean@gitlab.com", + "authored_date": "2019-04-08T11:44:57.000+01:00", + "committer_name": "Sean McGivern", + "committer_email": "sean@gitlab.com", + "committed_date": "2019-04-08T11:56:17.000+01:00" + } + ], + "diffs": [ + { + "old_path": "danger/roulette/Dangerfile", + "new_path": "danger/roulette/Dangerfile", + "a_mode": "100644", + "b_mode": "100644", + "new_file": false, + "renamed_file": false, + "deleted_file": false, + "diff": "@@ -1,5 +1,7 @@\n # frozen_string_literal: true\n \n+require 'digest/md5'\n+\n MESSAGE = <; rel=\"first\", ; rel=\"last\"", + "; rel=\"first\", ; rel=\"last\"", "Vary", "Origin", "X-Content-Type-Options", diff --git a/source/platforms/gitlab/_tests/fixtures/getMergeRequestInfo.json b/source/platforms/gitlab/_tests/fixtures/getMergeRequestInfo.json index ae25daf87..148e5cc63 100644 --- a/source/platforms/gitlab/_tests/fixtures/getMergeRequestInfo.json +++ b/source/platforms/gitlab/_tests/fixtures/getMergeRequestInfo.json @@ -2,7 +2,7 @@ { "scope": "https://gitlab.com:443", "method": "GET", - "path": "/api/v4/projects/gitlab-org%2Fgitlab-ce/merge_requests/27117", + "path": "/api/v4/projects/gitlab-org%2Fgitlab-foss/merge_requests/27117", "body": "", "status": 200, "response": { @@ -81,7 +81,7 @@ "should_remove_source_branch": null, "force_remove_source_branch": true, "reference": "!27117", - "web_url": "https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/27117", + "web_url": "https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/27117", "time_stats": { "time_estimate": 0, "total_time_spent": 0, @@ -99,14 +99,14 @@ "sha": "28531ab43666b5fdf37e0a70db3bcbf7d3f92183", "ref": "stable-reviewer-roulette", "status": "success", - "web_url": "https://gitlab.com/gitlab-org/gitlab-ce/pipelines/55706028" + "web_url": "https://gitlab.com/gitlab-org/gitlab-foss/pipelines/55706028" }, "head_pipeline": { "id": 55706028, "sha": "28531ab43666b5fdf37e0a70db3bcbf7d3f92183", "ref": "stable-reviewer-roulette", "status": "success", - "web_url": "https://gitlab.com/gitlab-org/gitlab-ce/pipelines/55706028", + "web_url": "https://gitlab.com/gitlab-org/gitlab-foss/pipelines/55706028", "before_sha": "0000000000000000000000000000000000000000", "tag": false, "yaml_errors": null, @@ -132,7 +132,7 @@ "group": "success-with-warnings", "tooltip": "passed", "has_details": true, - "details_path": "/gitlab-org/gitlab-ce/pipelines/55706028", + "details_path": "/gitlab-org/gitlab-foss/pipelines/55706028", "illustration": null, "favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png" } diff --git a/source/platforms/gitlab/_tests/fixtures/getMergeRequestInlineNotes.json b/source/platforms/gitlab/_tests/fixtures/getMergeRequestInlineNotes.json index 07891dd80..6ddf645ed 100644 --- a/source/platforms/gitlab/_tests/fixtures/getMergeRequestInlineNotes.json +++ b/source/platforms/gitlab/_tests/fixtures/getMergeRequestInlineNotes.json @@ -2,7 +2,7 @@ { "scope": "https://gitlab.com:443", "method": "GET", - "path": "/api/v4/projects/gitlab-org%2Fgitlab-ce/merge_requests/27117/notes", + "path": "/api/v4/projects/gitlab-org%2Fgitlab-foss/merge_requests/27117/notes", "body": "", "status": 200, "response": [ @@ -356,7 +356,7 @@ "Etag", "W/\"edab8aad8eea37dd376785c34c7c250f\"", "Link", - "; rel=\"first\", ; rel=\"last\"", + "; rel=\"first\", ; rel=\"last\"", "Vary", "Origin", "X-Content-Type-Options", diff --git a/source/platforms/gitlab/_tests/fixtures/getMergeRequestNotes.json b/source/platforms/gitlab/_tests/fixtures/getMergeRequestNotes.json index e44aa2c3f..9d97cab34 100644 --- a/source/platforms/gitlab/_tests/fixtures/getMergeRequestNotes.json +++ b/source/platforms/gitlab/_tests/fixtures/getMergeRequestNotes.json @@ -2,7 +2,7 @@ { "scope": "https://gitlab.com:443", "method": "GET", - "path": "/api/v4/projects/gitlab-org%2Fgitlab-ce/merge_requests/27117/notes", + "path": "/api/v4/projects/gitlab-org%2Fgitlab-foss/merge_requests/27117/notes", "body": "", "status": 200, "response": [ @@ -356,7 +356,7 @@ "Etag", "W/\"edab8aad8eea37dd376785c34c7c250f\"", "Link", - "; rel=\"first\", ; rel=\"last\"", + "; rel=\"first\", ; rel=\"last\"", "Vary", "Origin", "X-Content-Type-Options", diff --git a/source/platforms/gitlab/_tests/fixtures/gitlab_changes.json b/source/platforms/gitlab/_tests/fixtures/gitlab_changes.json new file mode 100644 index 000000000..88cae63da --- /dev/null +++ b/source/platforms/gitlab/_tests/fixtures/gitlab_changes.json @@ -0,0 +1,90 @@ +{ + "commit": { + "id": "a725813c8a97972dc7b6b62b7eb1024e9fbd7641", + "short_id": "a725813c", + "created_at": "2020-02-17T01:40:44.000+05:30", + "parent_ids": ["2fd1771d766dc3227250796da950aac08649cf10"], + "title": "change more", + "message": "change more\n", + "author_name": "Rohit Gohri", + "author_email": "gohri.rohit@gmail.com", + "authored_date": "2020-02-17T01:40:44.000+05:30", + "committer_name": "Rohit Gohri", + "committer_email": "gohri.rohit@gmail.com", + "committed_date": "2020-02-17T01:40:44.000+05:30" + }, + "commits": [ + { + "id": "2fd1771d766dc3227250796da950aac08649cf10", + "short_id": "2fd1771d", + "created_at": "2020-02-17T01:38:37.000+05:30", + "parent_ids": ["c5a4cc1a54a03067ad1a08ac9ce4915e87a601c5"], + "title": "changes", + "message": "changes\n", + "author_name": "Rohit Gohri", + "author_email": "gohri.rohit@gmail.com", + "authored_date": "2020-02-17T01:38:37.000+05:30", + "committer_name": "Rohit Gohri", + "committer_email": "gohri.rohit@gmail.com", + "committed_date": "2020-02-17T01:38:37.000+05:30" + }, + { + "id": "a725813c8a97972dc7b6b62b7eb1024e9fbd7641", + "short_id": "a725813c", + "created_at": "2020-02-17T01:40:44.000+05:30", + "parent_ids": ["2fd1771d766dc3227250796da950aac08649cf10"], + "title": "change more", + "message": "change more\n", + "author_name": "Rohit Gohri", + "author_email": "gohri.rohit@gmail.com", + "authored_date": "2020-02-17T01:40:44.000+05:30", + "committer_name": "Rohit Gohri", + "committer_email": "gohri.rohit@gmail.com", + "committed_date": "2020-02-17T01:40:44.000+05:30" + } + ], + "diffs": [ + { + "old_path": "added-me.txt", + "new_path": "added-me.txt", + "a_mode": "0", + "b_mode": "100644", + "new_file": true, + "renamed_file": false, + "deleted_file": false, + "diff": "@@ -0,0 +1,7 @@\n+ Nulla nec nisl neque. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus maximus magna eget quam ultrices, nec malesuada dolor laoreet. Integer et congue metus, sed porttitor lacus. Nam at venenatis est, vel cursus mi. In id velit ut risus imperdiet dapibus. Nulla arcu sem, varius et viverra id, finibus in nulla. Vestibulum auctor finibus velit et pharetra. Nunc at rhoncus tellus, eu sodales metus.\n+\n+Proin et lobortis diam. Fusce vitae metus sit amet urna ultricies mollis eget quis erat. Maecenas enim elit, consequat ac condimentum non, pretium semper arcu. Fusce vitae pulvinar purus. Etiam egestas mi sed mi aliquet, eget auctor ipsum scelerisque. Suspendisse tincidunt ultrices tortor rutrum dictum. Mauris dictum at justo in rutrum. Cras tristique hendrerit commodo. Pellentesque imperdiet convallis dolor, ac sollicitudin urna dignissim vitae. In et neque eget arcu porttitor consectetur ut sed metus. Nam mattis in elit ut sagittis. Etiam hendrerit nunc dui, ut aliquam enim vehicula ut. Integer in interdum arcu, eu vulputate mi. Mauris aliquam erat lectus, vitae facilisis mauris lacinia eu. Aliquam pretium elit neque, et ultrices diam maximus eu.\n+\n+Aenean posuere nisi non nibh tempus, id ornare tortor maximus. Proin eu ornare dui, sed vehicula est. Sed euismod risus lectus, eu imperdiet quam convallis eget. Proin vitae tellus malesuada, iaculis ante ut, pellentesque augue. Maecenas ullamcorper turpis ante, a porta magna ultricies nec. Maecenas sed ipsum ex. Vestibulum auctor et dolor sit amet elementum. Phasellus egestas velit vitae dapibus accumsan. Aenean faucibus pharetra purus, egestas auctor nisi maximus porta. Nulla in enim quis enim scelerisque cursus eu non quam.\n+\n+Suspendisse iaculis, nulla molestie volutpat laoreet, metus odio eleifend ex, eget malesuada mi nibh at tortor. Praesent semper mattis felis, a tempor purus mattis ut. Pellentesque sodales non odio non blandit. Nunc metus est, euismod vitae sem ut, molestie venenatis lectus. Nulla porta sagittis ipsum ac semper. Pellentesque augue neque, vulputate sit amet consequat et, commodo tempor eros. Nam gravida lorem ante, sed facilisis libero hendrerit sed. Praesent sed facilisis ex. Curabitur posuere consectetur nisi, non mollis purus pellentesque quis. Integer non dignissim magna. Ut a consequat enim. Cras viverra leo a magna finibus, in fringilla odio placerat. Cras quis est congue, congue velit sed, fermentum urna. Cras rutrum leo tempor lectus fringilla tincidunt. Integer nec lacinia sem, quis finibus turpis. \n\\ No newline at end of file\n" + }, + { + "old_path": "change-me.txt", + "new_path": "change-me.txt", + "a_mode": "100644", + "b_mode": "100644", + "new_file": false, + "renamed_file": false, + "deleted_file": false, + "diff": "@@ -2,8 +2,11 @@\n \n Praesent id venenatis nunc, et egestas augue. Vestibulum vitae posuere odio, quis blandit elit. Nullam mattis ante sed purus vehicula ultricies. Phasellus facilisis hendrerit sem eget ultricies. Donec vestibulum ac lacus in faucibus. Vestibulum interdum dolor et lacinia hendrerit. Curabitur sem lectus, ornare vitae nunc pharetra, aliquam cursus lorem. Curabitur ut gravida felis. Sed aliquam purus porttitor massa dignissim porttitor. Vivamus condimentum, turpis nec semper posuere, lacus ipsum mattis quam, eleifend maximus erat tellus nec velit. Mauris tristique eros erat, id rutrum nisl ultricies at.\n \n-Nullam vitae odio dapibus, euismod eros a, vehicula libero. Cras laoreet diam id venenatis tincidunt. Curabitur ut eros arcu. Aliquam consectetur ornare commodo. Aliquam vel sem eget nisi consequat accumsan nec at ipsum. Integer varius ultrices tellus et faucibus. Donec eu aliquet mi. Aenean sit amet dui lacus. Suspendisse bibendum mauris tellus. Aenean interdum semper augue ut cursus. Nam blandit nunc at lectus posuere, id fringilla ex porttitor. Duis vel erat non risus semper bibendum quis vel nunc.\n+Nullam vitae odio dapibus, euismod eros a, vehicula libero. Cras laoreet diam id venenatis tincidunt. Curabitur ut eros arcu. Aliquam consectetur ornare commodo. Aliquam vel sem eget nisi consequat accumsan nec at ipsum. Integer varius ultrices tellus et faucibus. Donec eu aliquet mi. Aenean sit amet dui lacus. Suspendisse bibendum mauris tellus. Aenean interdum semper augue ut cursus. , id fringilla ex porttitor. Duis vel erat non risus semper bibendum quis vel nunc.\n \n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec laoreet diam sem, pulvinar congue turpis laoreet faucibus. Morbi commodo ornare dolor vitae eleifend. Duis at massa mollis, gravida odio vitae, pulvinar dui. Aliquam ullamcorper ante vel nulla interdum, vel sollicitudin ante semper. Proin convallis tempor enim. Quisque interdum varius dolor eu luctus. Aliquam et eros purus. Praesent euismod ligula ac mi tristique gravida. Sed et tempus erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n \n-Cras euismod velit quis eros ultrices ullamcorper. Fusce et nisi et mi sollicitudin vulputate eu eget nisi. Quisque eu elit lectus. Donec et cursus lacus. In hac habitasse platea dictumst. Vivamus ante turpis, cursus a interdum sed, viverra at nibh. Morbi ante tellus, efficitur eu justo in, feugiat imperdiet turpis. Morbi tellus felis, efficitur quis viverra at, euismod quis arcu. Integer pretium congue tincidunt. \n\\ No newline at end of file\n+Cras euismod velit quis eros ultrices ullamcorper. Fusce et nisi et mi sollicitudin vulputate eu eget nisi. Quisque eu elit lectus. Donec et cursus lacus. In hac habitasse platea dictumst. Vivamus ante turpis, cursus a interdum sed, viverra at nibh. Morbi ante tellus, efficitur eu justo in, feugiat imperdiet turpis. Morbi tellus felis, efficitur quis viverra at, euismod quis arcu. Integer pretium congue tincidunt. \n+\n+safaklsdfjasl;kdfasdf;;kjasf\n+asdfkasdfjal;ksdf\n\\ No newline at end of file\n" + }, + { + "old_path": "delete-me.txt", + "new_path": "delete-me.txt", + "a_mode": "100644", + "b_mode": "0", + "new_file": false, + "renamed_file": false, + "deleted_file": true, + "diff": "@@ -1,7 +0,0 @@\n- Ut vitae nunc felis. In pulvinar ipsum accumsan, porta nisl eget, posuere ligula. Ut ultricies fermentum magna, vitae consectetur dolor bibendum eget. Donec libero turpis, tincidunt et nisl id, rutrum finibus felis. Duis consequat et lectus sed semper. Pellentesque at elit et odio hendrerit sollicitudin. Vivamus felis orci, efficitur tincidunt fermentum sit amet, rutrum non odio. Mauris ac lacus vel odio varius ultricies id vitae mi. Sed vitae metus dolor. Fusce blandit suscipit neque nec ultricies. Mauris mi dolor, sagittis nec viverra non, accumsan eu sapien. Nam nec faucibus turpis, et pulvinar nisl. Proin interdum consequat velit, non tempus dolor volutpat vitae. Integer dignissim varius porta. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed turpis odio, lacinia ultrices euismod id, vestibulum a mi.\n-\n-Quisque rhoncus, odio at lobortis rutrum, erat elit pretium quam, sodales porta erat lorem in velit. Cras nisl magna, rutrum non urna non, tempus volutpat urna. Mauris venenatis, neque vitae efficitur bibendum, diam neque porttitor nulla, hendrerit finibus arcu ligula sit amet est. Suspendisse tincidunt nec arcu semper sodales. Aliquam rutrum odio arcu, nec rhoncus felis tempor in. Sed tempus ut eros ac tincidunt. Vivamus non nisi tellus. Maecenas vulputate nisi arcu, sed fermentum nunc mollis et. Fusce interdum ligula sit amet interdum suscipit. Aenean laoreet aliquet lacus. Nulla facilisi. Integer scelerisque turpis velit, ac blandit sem mattis in. Pellentesque id augue nisl. Praesent bibendum, elit et accumsan ultricies, nisl urna euismod velit, eu efficitur nibh lacus eget nisl. Sed facilisis nibh faucibus tincidunt ultrices.\n-\n-Nullam ullamcorper mi leo, id placerat sem viverra vel. Donec eu orci efficitur, commodo metus vel, malesuada erat. Sed vitae est eget odio commodo bibendum. Nam interdum nisl in erat ornare, tincidunt porttitor quam suscipit. Morbi egestas sed tellus ac maximus. Vivamus efficitur porta mi a mollis. Nulla vitae nulla sed tellus vulputate vulputate ac quis leo.\n-\n-Quisque purus neque, porta at felis ut, pulvinar convallis elit. Aliquam tempor tortor sed quam eleifend, ac molestie felis blandit. Fusce ornare, purus non rhoncus aliquam, mi leo porttitor ante, sodales ultrices felis urna nec risus. Phasellus luctus lectus ipsum. Maecenas fringilla imperdiet nunc, a facilisis eros commodo quis. Vivamus mollis lobortis sem, vel gravida dolor consequat nec. Curabitur eget sem condimentum, ultrices magna non, ullamcorper nisl. Etiam consectetur tellus est, eget scelerisque nisi auctor ac. Nam egestas ac elit nec rutrum. Nunc tristique, tortor faucibus finibus mollis, augue nulla eleifend justo, eu condimentum mauris lacus ut libero. Maecenas vehicula semper neque non finibus. Mauris mollis ultrices commodo. Ut pulvinar quis neque vitae tempus. Maecenas condimentum aliquam nisl pretium posuere.\n" + }, + { + "old_path": "rename-me.txt", + "new_path": "renamed.txt", + "a_mode": "100644", + "b_mode": "100644", + "new_file": false, + "renamed_file": true, + "deleted_file": false, + "diff": "@@ -2,7 +2,7 @@ a vitae, dignissim vel nunc. Integer gravida nibh nisl, in euismod nulla aliquam\n \n Nunc cursus rutrum ultricies. Vivamus condimentum elit eros, non tincidunt orci accumsan id. Ut malesuada non massa tincidunt ullamcorper. Aliquam sollicitudin tellus quis metus suscipit aliquam. Donec fringilla eros risus, et aliquet neque consectetur efficitur. Sed facilisis lectus augue, pharetra commodo augue eleifend a. Aenean vel convallis eros. In a elementum dui. Cras facilisis nunc neque, ut sollicitudin nisl dignissim non.\n \n-Duis a lectus non dolor lobortis venenatis. Sed feugiat non felis tempus euismod. Mauris ac risus eu magna varius tristique ut blandit nisi. Pellentesque efficitur maximus dictum. Maecenas nisl felis, posuere et nunc non, pellentesque luctus risus. Fusce rhoncus sed eros quis efficitur. Sed lacinia pharetra auctor. Suspendisse vestibulum neque quis ligula pharetra mollis. Vivamus non nisi id mauris tempor gravida. Pellentesque nec metus ut enim vulputate blandit rutrum at justo. Curabitur lorem ante, cursus eu mattis eu, pharetra ornare odio.\n+Duis a lectuon dolor lobortis venenatis. Sed feugiat non felis tempus euismod. Mauris ac risus eu magna varius tristique ut blandit nisi. Pellentesque efficitur maximus dictum. Maecenas nisl felis, posuere et nunc non, pellentesque luctus risus. Fusce rhoncus sed eros quis efficitur. Sed lacinia pharetra auctor. Suspendisse vestibulum neque quis ligula pharetra mollis. Vivamus non nisi id mauris tempor gravida. Pellentesque nec metus ut enim vulputate blandit rutrum at justo. Curabitur lorem ante, cursus eu mattis eu, pharetra ornare odio.\n \n Phasellus id commodo diam. Fusce egestas erat vel lectus consequat, vel varius augue convallis. Morbi eu nunc id orci elementum consequat. Morbi quis elit congue, placerat felis ac, laoreet magna. Aenean euismod augue sapien, sit amet sodales lectus faucibus ac. Nulla sagittis mi ex, a laoreet sem pulvinar at. Quisque eu magna in justo blandit imperdiet. Suspendisse sollicitudin fringilla ipsum euismod lacinia. Donec dignissim, neque quis efficitur eleifend, magna risus condimentum ipsum, a iaculis sapien tortor a neque. Praesent molestie ut est sed tempus. Nullam ut sodales mi. Vestibulum lobortis erat ut mattis semper. Etiam at convallis odio. Aliquam at convallis erat. Vivamus consectetur nulla vel nibh elementum, et facilisis urna vehicula. Vivamus facilisis a nunc vel tincidunt.\n \n" + } + ], + "compare_timeout": false, + "compare_same_ref": false +} diff --git a/source/platforms/platform.ts b/source/platforms/platform.ts index 1b4d34528..9d776b822 100644 --- a/source/platforms/platform.ts +++ b/source/platforms/platform.ts @@ -81,6 +81,8 @@ export interface PlatformCommunicator { updateInlineComment: (comment: string, commentId: string) => Promise /** Delete an inline comment */ deleteInlineComment: (commentId: string) => Promise + /** Create a review with inline comments */ + createInlineReview?: (git: GitDSL, comments: { comment: string; path: string; line: number }[]) => Promise /** Delete the main Danger comment */ deleteMainComment: (dangerID: string) => Promise /** Replace the main Danger comment, returning the URL to the issue */ @@ -131,7 +133,11 @@ export function getPlatformForEnv(env: Env, source: CISource): Platform { } // GitLab - if (env["DANGER_GITLAB_API_TOKEN"] || env["DANGER_PR_PLATFORM"] === GitLab.name) { + if ( + env["DANGER_GITLAB_API_TOKEN"] || + env["DANGER_GITLAB_API_OAUTH_TOKEN"] || + env["DANGER_PR_PLATFORM"] === GitLab.name + ) { const api = new GitLabAPI( { pullRequestID: source.pullRequestID, @@ -142,8 +148,11 @@ export function getPlatformForEnv(env: Env, source: CISource): Platform { return new GitLab(api) } + // GitHub Platform + const ghToken = env["DANGER_GITHUB_API_TOKEN"] || env["GITHUB_TOKEN"] + // They need to set the token up for GitHub actions to work - if (env["GITHUB_EVENT_NAME"] && !env["GITHUB_TOKEN"]) { + if (env["GITHUB_EVENT_NAME"] && !ghToken) { console.error(`You need to add GITHUB_TOKEN to your Danger action in the workflow: - name: Danger JS @@ -153,8 +162,6 @@ export function getPlatformForEnv(env: Env, source: CISource): Platform { `) } - // GitHub Platform - const ghToken = env["DANGER_GITHUB_API_TOKEN"] || env["GITHUB_TOKEN"] if (ghToken || env["DANGER_PR_PLATFORM"] === GitHub.name) { if (!ghToken) { console.log("You don't have a DANGER_GITHUB_API_TOKEN set up, this is optional, but TBH, you want to do this") diff --git a/source/platforms/pullRequestParser.ts b/source/platforms/pullRequestParser.ts index ea4933cc4..3b87a983e 100644 --- a/source/platforms/pullRequestParser.ts +++ b/source/platforms/pullRequestParser.ts @@ -16,7 +16,7 @@ export function pullRequestParser(address: string): PullRequestParts | null { if (components && components.path) { // shape: http://localhost:7990/projects/PROJ/repos/repo/pull-requests/1/overview - const parts = components.path.match(/(projects\/\w+\/repos\/[\w-_.]+)\/pull-requests\/(\d+)/) + const parts = components.path.match(/(projects\/~?\w+\/repos\/[\w-_.]+)\/pull-requests\/(\d+)/) if (parts) { return { platform: BitBucketServer.name, @@ -50,7 +50,7 @@ export function pullRequestParser(address: string): PullRequestParts | null { if (parts) { return { platform: GitLab.name, - repo: parts[1], + repo: parts[1].replace(/\/-$/, ""), pullRequestNumber: parts[2], } } diff --git a/source/runner/Executor.ts b/source/runner/Executor.ts index d1db75890..6707abe62 100644 --- a/source/runner/Executor.ts +++ b/source/runner/Executor.ts @@ -58,13 +58,19 @@ export interface ExecutorOptions { failOnErrors?: boolean /** Dont add danger check to PR */ noPublishCheck?: boolean + /** Ignore inline-comments that are in lines which were not changed */ + ignoreOutOfDiffComments: boolean + /** Makes Danger post a new comment instead of editing its previous one */ + newComment?: boolean + /** Removes all previous comment and create a new one in the end of the list */ + removePreviousComments?: boolean } // This is still badly named, maybe it really should just be runner? const isTests = typeof jest === "object" interface ExitCodeContainer { - exitCode: number + exitCode?: number } export class Executor { @@ -250,11 +256,16 @@ export class Executor { const dangerID = this.options.dangerID const failed = fails.length > 0 + const hasMessages = failureCount + messageCount > 0 let issueURL = undefined - if (failureCount + messageCount === 0) { - this.log(`Found no issues or messages from Danger. Removing any existing messages on ${this.platform.name}.`) + if (!hasMessages || this.options.removePreviousComments) { + if (!hasMessages) { + this.log(`Found no issues or messages from Danger. Removing any existing messages on ${this.platform.name}.`) + } else { + this.log(`'removePreviousComments' option specified. Removing any existing messages on ${this.platform.name}.`) + } await this.platform.deleteMainComment(dangerID) const previousComments = await this.platform.getInlineComments(dangerID) for (const comment of previousComments) { @@ -262,7 +273,9 @@ export class Executor { await this.deleteInlineComment(comment) } } - } else { + } + + if (hasMessages) { if (fails.length > 0) { const s = fails.length === 1 ? "" : "s" const are = fails.length === 1 ? "is" : "are" @@ -277,7 +290,8 @@ export class Executor { if (git !== undefined) { const previousComments = await this.platform.getInlineComments(dangerID) const inline = inlineResults(results) - const inlineLeftovers = await this.sendInlineComments(inline, git, previousComments) + let inlineLeftovers = await this.sendInlineComments(inline, git, previousComments) + inlineLeftovers = this.options.ignoreOutOfDiffComments ? emptyDangerResults : inlineLeftovers mergedResults = sortResults(mergeResults(mergedResults, inlineLeftovers)) } @@ -300,7 +314,11 @@ export class Executor { comment = githubResultsTemplate(dangerID, mergedResults, commitID) } - issueURL = await this.platform.updateOrCreateComment(dangerID, comment) + if (this.options.newComment) { + issueURL = await this.platform.createComment(dangerID, comment) + } else { + issueURL = await this.platform.updateOrCreateComment(dangerID, comment) + } this.log(`Feedback: ${issueURL}`) } } @@ -324,7 +342,7 @@ export class Executor { const urlForInfo = issueURL || this.ciSource.ciRunURL const successPosting = await this.platform.updateStatus(passed, messageForResults(results), urlForInfo, dangerID) - if (!successPosting && this.options.verbose) { + if (!successPosting) { this.log("Could not add a commit status, the GitHub token for Danger does not have access rights.") this.log("If the build fails, then danger will use a failing exit code.") } @@ -363,32 +381,58 @@ export class Executor { // Leftovers in deleteComments array should all be deleted afterwards let deleteComments = Array.isArray(previousComments) ? previousComments.filter(c => c.ownedByDanger) : [] let commentPromises: Promise[] = [] + const inlineResultsForReview: DangerInlineResults[] = [] for (let inlineResult of sortedInlineResults) { const index = deleteComments.findIndex(p => p.body.includes(fileLineToString(inlineResult.file, inlineResult.line)) ) - let promise: Promise + let promise: Promise | undefined = undefined if (index != -1) { let previousComment = deleteComments[index] deleteComments.splice(index, 1) promise = this.updateInlineComment(inlineResult, previousComment) } else { - promise = this.sendInlineComment(git, inlineResult) + if (typeof this.platform.createInlineReview === "function") { + inlineResultsForReview.push(inlineResult) + } else { + promise = this.sendInlineComment(git, inlineResult) + } + } + if (promise) { + commentPromises.push(promise.then(_r => emptyDangerResults).catch(_e => inlineResultsIntoResults(inlineResult))) } - commentPromises.push(promise.then(_r => emptyDangerResults).catch(_e => inlineResultsIntoResults(inlineResult))) } deleteComments.forEach(comment => { let promise = this.deleteInlineComment(comment) commentPromises.push(promise.then(_r => emptyDangerResults).catch(_e => emptyDangerResults)) }) - return Promise.all(commentPromises).then(dangerResults => { + return Promise.all([ + this.sendInlineReview(git, inlineResultsForReview).catch(_e => + inlineResultsForReview.forEach(inlineResult => inlineResultsIntoResults(inlineResult)) + ), + ...commentPromises, + ]).then(dangerResults => { return new Promise(resolve => { - resolve(dangerResults.reduce((acc, r) => mergeResults(acc, r), emptyResult)) + resolve(dangerResults.slice(1).reduce((acc, r) => mergeResults(acc, r), emptyResult)) }) }) } + async sendInlineReview(git: GitDSL, inlineResultsForReview: DangerInlineResults[]): Promise { + if (inlineResultsForReview.length === 0 || typeof this.platform.createInlineReview !== "function") { + return emptyDangerResults + } + return await this.platform.createInlineReview( + git, + inlineResultsForReview.map(result => ({ + comment: this.inlineCommentTemplate(result), + path: result.file, + line: result.line, + })) + ) + } + async sendInlineComment(git: GitDSL, inlineResults: DangerInlineResults): Promise { const comment = this.inlineCommentTemplate(inlineResults) return await this.platform.createInlineComment(git, comment, inlineResults.file, inlineResults.line) diff --git a/source/runner/_tests/_executor.test.ts b/source/runner/_tests/_executor.test.ts index 221057e01..865f419c3 100644 --- a/source/runner/_tests/_executor.test.ts +++ b/source/runner/_tests/_executor.test.ts @@ -3,13 +3,13 @@ import { FakeCI } from "../../ci_source/providers/Fake" import { FakePlatform } from "../../platforms/FakePlatform" import { emptyResults, - warnResults, - inlineWarnResults, failsResults, inlineFailResults, inlineMessageResults, inlineMultipleWarnResults, inlineMultipleWarnResults2, + inlineWarnResults, + warnResults, } from "./fixtures/ExampleDangerResults" import inlineRunner from "../runners/inline" import { jsonDSLGenerator } from "../dslGenerator" @@ -17,7 +17,7 @@ import { jsonToDSL } from "../jsonToDSL" import { DangerDSLType } from "../../dsl/DangerDSL" import { singleViolationSingleFileResults } from "../../dsl/_tests/fixtures/ExampleDangerResults" import { inlineTemplate } from "../templates/githubIssueTemplate" -import { resultsIntoInlineResults, DangerResults, inlineResultsIntoResults } from "../../dsl/DangerResults" +import { DangerResults, inlineResultsIntoResults, resultsIntoInlineResults } from "../../dsl/DangerResults" const defaultConfig: ExecutorOptions = { stdoutOnly: false, @@ -27,6 +27,7 @@ const defaultConfig: ExecutorOptions = { passURLForDSL: false, failOnErrors: false, noPublishCheck: false, + ignoreOutOfDiffComments: false, } class FakeProcces { @@ -111,6 +112,22 @@ describe("setup", () => { expect(platform.deleteMainComment).toBeCalled() }) + it("Deletes a post when 'removePreviousComments' option has been specified", async () => { + const platform = new FakePlatform() + const exec = new Executor( + new FakeCI({}), + platform, + inlineRunner, + { ...defaultConfig, removePreviousComments: true }, + new FakeProcces() + ) + const dsl = await defaultDsl(platform) + platform.deleteMainComment = jest.fn() + + await exec.handleResults(warnResults, dsl.git) + expect(platform.deleteMainComment).toBeCalled() + }) + it("Fails if the failOnErrors option is true and there are fails on the build", async () => { const platform = new FakePlatform() const strictConfig: ExecutorOptions = { @@ -120,6 +137,7 @@ describe("setup", () => { dangerID: "123", passURLForDSL: false, failOnErrors: true, + ignoreOutOfDiffComments: false, } const exec = new Executor(new FakeCI({}), platform, inlineRunner, strictConfig, new FakeProcces()) const dsl = await defaultDsl(platform) @@ -149,14 +167,22 @@ describe("setup", () => { expect(platform.updateOrCreateComment).toBeCalled() }) - it("Updates or Creates comments for warnings", async () => { + it("Creates comments (rather than update or create) for warnings when newComment option is passed", async () => { const platform = new FakePlatform() - const exec = new Executor(new FakeCI({}), platform, inlineRunner, defaultConfig, new FakeProcces()) + const exec = new Executor( + new FakeCI({}), + platform, + inlineRunner, + { ...defaultConfig, newComment: true }, + new FakeProcces() + ) const dsl = await defaultDsl(platform) + platform.createComment = jest.fn() platform.updateOrCreateComment = jest.fn() await exec.handleResults(warnResults, dsl.git) - expect(platform.updateOrCreateComment).toBeCalled() + expect(platform.createComment).toBeCalled() + expect(platform.updateOrCreateComment).not.toBeCalled() }) it("Updates or Creates comments for warnings, without GitDSL", async () => { @@ -168,14 +194,28 @@ describe("setup", () => { expect(platform.updateOrCreateComment).toBeCalled() }) + it("Creates comments (rather than update or create) for warnings, without GitDSL, when newComment option is passed", async () => { + const platform = new FakePlatform() + const exec = new Executor( + new FakeCI({}), + platform, + inlineRunner, + { ...defaultConfig, newComment: true }, + new FakeProcces() + ) + platform.createComment = jest.fn() + platform.updateOrCreateComment = jest.fn() + + await exec.handleResults(warnResults) + expect(platform.createComment).toBeCalled() + expect(platform.updateOrCreateComment).not.toBeCalled() + }) + it("Sends inline comments and returns regular results for failures", async () => { const platform = new FakePlatform() const exec = new Executor(new FakeCI({}), platform, inlineRunner, defaultConfig, new FakeProcces()) const dsl = await defaultDsl(platform) - const apiFailureMock = jest.fn().mockReturnValue( - new Promise((_, reject) => reject()) - ) - platform.createInlineComment = apiFailureMock + platform.createInlineComment = jest.fn().mockReturnValue(new Promise((_, reject) => reject())) let results = await exec.sendInlineComments(singleViolationSingleFileResults, dsl.git, []) expect(results).toEqual(singleViolationSingleFileResults) @@ -186,12 +226,41 @@ describe("setup", () => { const exec = new Executor(new FakeCI({}), platform, inlineRunner, defaultConfig, new FakeProcces()) const dsl = await defaultDsl(platform) platform.createInlineComment = jest.fn() + platform.createComment = jest.fn() platform.updateOrCreateComment = jest.fn() await exec.handleResults(inlineWarnResults, dsl.git) expect(platform.createInlineComment).toBeCalled() }) + it("Creates multiple inline comments as a review", async () => { + const platform = new FakePlatform() + const exec = new Executor(new FakeCI({}), platform, inlineRunner, defaultConfig, new FakeProcces()) + const dsl = await defaultDsl(platform) + platform.createInlineReview = jest.fn() + platform.createInlineComment = jest.fn() + platform.createComment = jest.fn() + platform.updateOrCreateComment = jest.fn() + + await exec.handleResults(inlineMultipleWarnResults, dsl.git) + expect(platform.createInlineReview).toBeCalled() + expect(platform.createInlineComment).not.toBeCalled() + }) + + it("Invalid inline comment is ignored if ignoreOutOfDiffComments is true", async () => { + const platform = new FakePlatform() + const config = Object.assign({}, defaultConfig, { ignoreOutOfDiffComments: true }) + const exec = new Executor(new FakeCI({}), platform, inlineRunner, config, new FakeProcces()) + const dsl = await defaultDsl(platform) + platform.createInlineComment = jest.fn().mockReturnValue(new Promise((_, reject) => reject())) + platform.createComment = jest.fn() + platform.updateOrCreateComment = jest.fn() + + await exec.handleResults(inlineWarnResults, dsl.git) + expect(platform.createComment).not.toBeCalled() + expect(platform.updateOrCreateComment).not.toBeCalled() + }) + it("Updates an inline comment as the new one was different than the old", async () => { const platform = new FakePlatform() const exec = new Executor(new FakeCI({}), platform, inlineRunner, defaultConfig, new FakeProcces()) @@ -270,10 +339,7 @@ describe("setup", () => { const dsl = await defaultDsl(platform) const previousResults = { fails: [], - warnings: [ - { message: "1", file: "1.swift", line: 1 }, - { message: "2", file: "2.swift", line: 2 }, - ], + warnings: [{ message: "1", file: "1.swift", line: 1 }, { message: "2", file: "2.swift", line: 2 }], messages: [], markdowns: [], } @@ -291,25 +357,43 @@ describe("setup", () => { expect(platform.deleteInlineComment).toHaveBeenCalledTimes(2) }) + it("Deletes all old inline comments when 'removePreviousComments' option has been specified", async () => { + const platform = new FakePlatform() + const exec = new Executor( + new FakeCI({}), + platform, + inlineRunner, + { ...defaultConfig, removePreviousComments: true }, + new FakeProcces() + ) + const dsl = await defaultDsl(platform) + const previousComments = mockPayloadForResults(inlineMultipleWarnResults) + + platform.getInlineComments = jest + .fn() + .mockResolvedValueOnce(previousComments) + .mockResolvedValueOnce([]) + platform.updateInlineComment = jest.fn() + platform.createInlineComment = jest.fn() + platform.deleteInlineComment = jest.fn() + + await exec.handleResults(warnResults, dsl.git) + expect(platform.deleteInlineComment).toHaveBeenCalledTimes(3) + }) + it("Deletes old inline comment when not applicable in new results", async () => { const platform = new FakePlatform() const exec = new Executor(new FakeCI({}), platform, inlineRunner, defaultConfig, new FakeProcces()) const dsl = await defaultDsl(platform) const previousResults = { fails: [], - warnings: [ - { message: "1", file: "1.swift", line: 1 }, - { message: "2", file: "2.swift", line: 2 }, - ], + warnings: [{ message: "1", file: "1.swift", line: 1 }, { message: "2", file: "2.swift", line: 2 }], messages: [], markdowns: [], } const newResults = { fails: [], - warnings: [ - { message: "1", file: "1.swift", line: 2 }, - { message: "2", file: "2.swift", line: 3 }, - ], + warnings: [{ message: "1", file: "1.swift", line: 2 }, { message: "2", file: "2.swift", line: 3 }], messages: [], markdowns: [], } @@ -330,6 +414,7 @@ describe("setup", () => { const platform = new FakePlatform() const exec = new Executor(new FakeCI({}), platform, inlineRunner, defaultConfig, new FakeProcces()) const dsl = await defaultDsl(platform) + platform.createComment = jest.fn() platform.updateOrCreateComment = jest.fn() platform.updateStatus = jest.fn() @@ -341,6 +426,7 @@ describe("setup", () => { const platform = new FakePlatform() const exec = new Executor(new FakeCI({}), platform, inlineRunner, defaultConfig, new FakeProcces()) const dsl = await defaultDsl(platform) + platform.createComment = jest.fn() platform.updateOrCreateComment = jest.fn() platform.updateStatus = jest.fn() @@ -357,6 +443,7 @@ describe("setup", () => { const platform = new FakePlatform() const exec = new Executor(new FakeCI({}), platform, inlineRunner, defaultConfig, new FakeProcces()) const dsl = await defaultDsl(platform) + platform.createComment = jest.fn() platform.updateOrCreateComment = jest.fn() platform.updateStatus = jest.fn() @@ -376,6 +463,7 @@ describe("setup", () => { const exec = new Executor(ci, platform, inlineRunner, defaultConfig, new FakeProcces()) const dsl = await defaultDsl(platform) + platform.createComment = jest.fn() platform.updateOrCreateComment = jest.fn() platform.updateStatus = jest.fn() @@ -395,6 +483,7 @@ describe("setup", () => { const exec = new Executor(ci, platform, inlineRunner, config, new FakeProcces()) const dsl = await defaultDsl(platform) + platform.createComment = jest.fn() platform.updateOrCreateComment = jest.fn() platform.updateStatus = jest.fn() diff --git a/source/runner/_tests/jsonToDSL.test.ts b/source/runner/_tests/jsonToDSL.test.ts index 019188597..d79b58d01 100644 --- a/source/runner/_tests/jsonToDSL.test.ts +++ b/source/runner/_tests/jsonToDSL.test.ts @@ -42,7 +42,10 @@ describe("runner/jsonToDSL", () => { it("should call LocalGit with correct base", async () => { await jsonToDSL(dsl as DangerDSLJSONType, new FakeCI({})) - expect(localGetDiff).toHaveBeenLastCalledWith("develop", "HEAD") + expect(localGetDiff).toHaveBeenLastCalledWith("develop", "HEAD", undefined) + dsl.settings.cliArgs.staging = true + await jsonToDSL(dsl as DangerDSLJSONType, new FakeCI({})) + expect(localGetDiff).toHaveBeenLastCalledWith("develop", "HEAD", true) }) it("should expose BitBucketServerAPI if `dsl.bitbucket_server` is passed in", async () => { diff --git a/source/runner/dangerDSLJSON.ts b/source/runner/dangerDSLJSON.ts index f607edba7..ad1bbf896 100644 --- a/source/runner/dangerDSLJSON.ts +++ b/source/runner/dangerDSLJSON.ts @@ -37,7 +37,11 @@ export class DangerDSLJSON implements DangerDSLJSONType { const parsedString = JSON.parse(JSONString) Object.assign(this, parsedString.danger) + // Merge the command line settings with the settings from the + // original command invocation. This is needed because some + // commands like danger-local have options that are unknown to + // danger-runner // @ts-ignore - this.settings.cliArgs = cliArgs + Object.assign(this.settings.cliArgs, cliArgs) } } diff --git a/source/runner/dslGenerator.ts b/source/runner/dslGenerator.ts index cc5d66df6..bb0c7c54a 100644 --- a/source/runner/dslGenerator.ts +++ b/source/runner/dslGenerator.ts @@ -27,6 +27,7 @@ export const jsonDSLGenerator = async ( id: program.id, textOnly: program.textOnly, verbose: program.verbose, + staging: program.staging } const dslPlatformName = jsonDSLPlatformName(platform) diff --git a/source/runner/jsonToDSL.ts b/source/runner/jsonToDSL.ts index a080d80c8..6e036f3b1 100644 --- a/source/runner/jsonToDSL.ts +++ b/source/runner/jsonToDSL.ts @@ -45,8 +45,8 @@ export const jsonToDSL = async (dsl: DangerDSLJSONType, source: CISource): Promi git = bitBucketServerGitDSL(bitbucket_server!, dsl.git, api as BitBucketServerAPI) } else if (process.env["DANGER_BITBUCKETCLOUD_OAUTH_KEY"] || process.env["DANGER_BITBUCKETCLOUD_USERNAME"]) { git = bitBucketCloudGitDSL(bitbucket_cloud!, dsl.git, api as BitBucketCloudAPI) - } else if (process.env["DANGER_GITLAB_API_TOKEN"]) { - git = gitLabGitDSL(gitlab!, dsl.git) + } else if (process.env["DANGER_GITLAB_API_TOKEN"] || process.env["DANGER_GITLAB_API_OAUTH_TOKEN"]) { + git = gitLabGitDSL(gitlab!, dsl.git, api as GitLabAPI) } else { git = source && source.useEventDSL ? ({} as any) : githubJSONToGitDSL(github!, dsl.git) } @@ -77,7 +77,10 @@ const apiForDSL = (dsl: DangerDSLJSONType): Octokit | BitBucketServerAPI | GitLa } const gitlab = dsl.gitlab - if (gitlab != null && process.env["DANGER_GITLAB_API_TOKEN"] != null) { + if ( + gitlab != null && + (process.env["DANGER_GITLAB_API_TOKEN"] != null || process.env["DANGER_GITLAB_API_OAUTH_TOKEN"] != null) + ) { // d({ gitlab }) return new GitLabAPI(gitlab.metadata, getGitLabAPICredentialsFromEnv(process.env)) } diff --git a/source/runner/runners/utils/_tests/_transpiler.test.ts b/source/runner/runners/utils/_tests/_transpiler.test.ts index 5861631d7..966893525 100644 --- a/source/runner/runners/utils/_tests/_transpiler.test.ts +++ b/source/runner/runners/utils/_tests/_transpiler.test.ts @@ -2,9 +2,14 @@ jest.mock("fs", () => ({ readFileSync: jest.fn(), existsSync: jest.fn(), })) +jest.mock("path", () => { + const path = jest.requireActual("path") + return { ...path, resolve: jest.fn(path.resolve) } +}) -import { typescriptify } from "../transpiler" +import { typescriptify, lookupTSConfig, dirContains } from "../transpiler" import * as fs from "fs" +import * as path from "path" describe("typescriptify", () => { it("removes the module option in a tsconfig ", () => { @@ -15,9 +20,69 @@ describe("typescriptify", () => { module: "es2015", }, } - const fsMock = fs.readFileSync as any + const fsMock = fs.readFileSync as jest.Mock fsMock.mockImplementationOnce(() => JSON.stringify(fakeTSConfig)) - expect(typescriptify(dangerfile)).not.toContain("import") + expect(typescriptify(dangerfile, "/a/b")).not.toContain("import") + }) +}) + +/** Normalizes path to platform-specific */ +function n(p: string) { + if (path.sep !== "/") { + return p.split("/").join(path.sep) + } + return p +} + +describe("lookupTSConfig", () => { + function setup(cwd: string, configDir: string) { + cwd = n(cwd) + configDir = n(configDir) + // mock path.resolve to be relative to cwd + const actualPath = jest.requireActual("path") as typeof path + const resolve = path.resolve as jest.Mock + resolve.mockImplementation((p: string = "") => actualPath.resolve(cwd, p)) + + const existsSync = fs.existsSync as jest.Mock + const tsconfigPath = path.resolve(path.join(configDir, "tsconfig.json")) + existsSync.mockImplementation((f: string) => path.resolve(f) === tsconfigPath) + } + + it("can find in the same folder as dangerfile", () => { + setup("/a", "/c") + expect(lookupTSConfig(n("/c"))).toBe(n("/c/tsconfig.json")) + }) + + it("can find in a parent folder", () => { + setup("/a", "/a/b") + expect(lookupTSConfig(n("./b/c"))).toBe(n("b/tsconfig.json")) }) + + it("can find in the working dir", () => { + setup("/a", "/a") + expect(lookupTSConfig(n("/c"))).toBe("tsconfig.json") + }) + + it("cannot find in a directory higher than current", () => { + setup("/a/b", "/a") + expect(lookupTSConfig(n("/a/b/c"))).toBe(null) + }) +}) + +describe("dirContains", () => { + it("identifies what directory contains", () => { + expect(dirContains(n("/a"), n("/a/b"))).toBe(true) + expect(dirContains(n("/a/b"), n("/a"))).toBe(false) + expect(dirContains(n("/a"), n("/a"))).toBe(true) + }) + + if (path.sep === "\\") { + it("identifies what directory contains on win32", () => { + expect(dirContains(`c:\\a`, `c:\\a\\b`)).toBe(true) + expect(dirContains(`c:\\a`, `c:\\a`)).toBe(true) + expect(dirContains(`c:\\a`, `d:\\a\\b`)).toBe(false) + expect(dirContains(`c:\\a`, `d:\\a`)).toBe(false) + }) + } }) diff --git a/source/runner/runners/utils/transpiler.ts b/source/runner/runners/utils/transpiler.ts index f5fcb4ad2..e35d0f504 100644 --- a/source/runner/runners/utils/transpiler.ts +++ b/source/runner/runners/utils/transpiler.ts @@ -9,6 +9,7 @@ const enum BabelPackagePrefix { } const disableTranspilation = process.env.DANGER_DISABLE_TRANSPILATION === "true" +const disableTsc = process.env.DANGER_DISABLE_TSC === "true" let hasNativeTypeScript = false let hasBabel = false @@ -30,7 +31,7 @@ export const checkForNodeModules = () => { try { require.resolve("typescript") // tslint:disable-line - hasNativeTypeScript = true + hasNativeTypeScript = true && !disableTsc } catch (e) { d("Does not have TypeScript set up") } @@ -74,15 +75,58 @@ export const checkForNodeModules = () => { hasChecked = true } +export const dirContains = (rootDir: string, dir: string): boolean => { + const relative = path.relative(rootDir, dir) + // on win32, relative can refer to a different drive + if (path.isAbsolute(relative)) { + return false + } + return !relative.startsWith("..") +} + // Now that we have a sense of what exists inside the users' node modules -export const typescriptify = (content: string): string => { +export const lookupTSConfig = (dir: string): string | null => { + const filename = "tsconfig.json" + let filepath = path.join(dir, filename) + + if (fs.existsSync(filepath)) { + return filepath + } + + const rootDir = path.resolve() + dir = path.resolve(dir) + + if (rootDir === dir) { + return null + } + + // if root dir is disconnected, we only check in the root + if (!dirContains(rootDir, dir)) { + filepath = filename + return fs.existsSync(filepath) ? filepath : null + } + + dir = path.dirname(dir) + do { + filepath = path.join(dir, filename) + if (fs.existsSync(filepath)) { + return path.relative(rootDir, filepath) + } + dir = path.dirname(dir) + } while (dirContains(rootDir, dir)) + + return null +} + +export const typescriptify = (content: string, dir: string): string => { const ts = require("typescript") // tslint:disable-line // Support custom TSC options, but also fallback to defaults let compilerOptions: any - if (fs.existsSync("tsconfig.json")) { - compilerOptions = JSON5.parse(fs.readFileSync("tsconfig.json", "utf8")) + const tsConfigPath = lookupTSConfig(dir) + if (tsConfigPath) { + compilerOptions = JSON5.parse(fs.readFileSync(tsConfigPath, "utf8")) } else { compilerOptions = ts.getDefaultCompilerOptions() } @@ -152,7 +196,7 @@ export default (code: string, filename: string) => { let result = code if (hasNativeTypeScript && filetype.startsWith(".ts")) { - result = typescriptify(code) + result = typescriptify(code, path.dirname(filename)) } else if (hasBabel && hasBabelTypeScript && filetype.startsWith(".ts")) { result = babelify(code, filename, [`${babelPackagePrefix}plugin-transform-typescript`]) } else if (hasBabel && filetype.startsWith(".js")) { diff --git a/source/runner/templates/_tests/__snapshots__/_bitbucketCloudTemplate.test.ts.snap b/source/runner/templates/_tests/__snapshots__/_bitbucketCloudTemplate.test.ts.snap index 89a56d61d..dc956f611 100644 --- a/source/runner/templates/_tests/__snapshots__/_bitbucketCloudTemplate.test.ts.snap +++ b/source/runner/templates/_tests/__snapshots__/_bitbucketCloudTemplate.test.ts.snap @@ -4,16 +4,16 @@ exports[`generating inline messages summary inline result matches snapshot 1`] = " [//]: # (danger-id-blankID;) [//]: # ( File: File.swift;Line: 5;) -- ❌ Failing message Failing message -- ⚠️ Warning message Warning message -- ✨ message +- :x: Failing message Failing message +- :warning: Warning message Warning message +- :sparkles: message markdown " `; exports[`generating messages for BitBucket cloud Mixed icon messages match snapshot 1`] = ` " - 🎉 All green. Well done. + :tada: All green. Well done. @@ -23,151 +23,151 @@ exports[`generating messages for BitBucket cloud Mixed icon messages match snaps | --- | | 📝 - Message with custom icon | | 🔔 - Message with custom icon2 | - | ✨ - Test message | + | :sparkles: - Test message | - - - + - Generated by 🚫 [dangerJS](https://danger.systems/js) against e70f3d6468f61a4bef68c9e6eaba9166b096e23c + + Generated by :no_entry_sign: [dangerJS](https://danger.systems/js) against e70f3d6468f61a4bef68c9e6eaba9166b096e23c + [](http://danger-id-blankID;) " `; exports[`generating messages for BitBucket cloud empty result matches snapshot, with a compliment 1`] = ` " - 🎉 All green. Well done. + :tada: All green. Well done. - - - + - Generated by 🚫 [dangerJS](https://danger.systems/js) against e70f3d6468f61a4bef68c9e6eaba9166b096e23c + + Generated by :no_entry_sign: [dangerJS](https://danger.systems/js) against e70f3d6468f61a4bef68c9e6eaba9166b096e23c + [](http://danger-id-blankID;) " `; exports[`generating messages for BitBucket cloud multiple summary result matches snapshot 1`] = ` " - ⚠️ Danger found some issues. Don't worry, everything is fixable. + :warning: Danger found some issues. Don't worry, everything is fixable. | 2 Fails | | --- | - | ❌ - Failing message Failing message | - | ❌ - Failing message 2, This is Failing message | + | :x: - Failing message Failing message | + | :x: - Failing message 2, This is Failing message | | 2 Warnings | | --- | - | ⚠️ - Warning message Warning message | - | ⚠️ - Warning message | + | :warning: - Warning message Warning message | + | :warning: - Warning message | | 3 Messages | | --- | - | ✨ - message | - | ✨ - message 2 | - | ✨ - message 3 | + | :sparkles: - message | + | :sparkles: - message 2 | + | :sparkles: - message 3 | - + markdown - - - Generated by 🚫 [dangerJS](https://danger.systems/js) against e70f3d6468f61a4bef68c9e6eaba9166b096e23c + + Generated by :no_entry_sign: [dangerJS](https://danger.systems/js) against e70f3d6468f61a4bef68c9e6eaba9166b096e23c + [](http://danger-id-blankID;) " `; exports[`generating messages for BitBucket cloud summary result matches snapshot, with a commit 1`] = ` " - ⚠️ Danger found some issues. Don't worry, everything is fixable. + :warning: Danger found some issues. Don't worry, everything is fixable. | 1 Fails | | --- | - | ❌ - Failing message Failing message | + | :x: - Failing message Failing message | | 1 Warnings | | --- | - | ⚠️ - Warning message Warning message | + | :warning: - Warning message Warning message | | 1 Messages | | --- | - | ✨ - message | + | :sparkles: - message | - + markdown - - - Generated by 🚫 [dangerJS](https://danger.systems/js) against e70f3d6468f61a4bef68c9e6eaba9166b096e23c + + Generated by :no_entry_sign: [dangerJS](https://danger.systems/js) against e70f3d6468f61a4bef68c9e6eaba9166b096e23c + [](http://danger-id-blankID;) " `; exports[`generating messages for BitBucket cloud summary result matches snapshot, without a commit 1`] = ` " - ⚠️ Danger found some issues. Don't worry, everything is fixable. + :warning: Danger found some issues. Don't worry, everything is fixable. | 1 Fails | | --- | - | ❌ - Failing message Failing message | + | :x: - Failing message Failing message | | 1 Warnings | | --- | - | ⚠️ - Warning message Warning message | + | :warning: - Warning message Warning message | | 1 Messages | | --- | - | ✨ - message | + | :sparkles: - message | - + markdown - - - Generated by 🚫 [dangerJS](https://danger.systems/js) + + Generated by :no_entry_sign: [dangerJS](https://danger.systems/js) + [](http://danger-id-blankID;) " `; diff --git a/source/runner/templates/_tests/_bitbucketCloudTemplate.test.ts b/source/runner/templates/_tests/_bitbucketCloudTemplate.test.ts index 43b3f37df..c157a9067 100644 --- a/source/runner/templates/_tests/_bitbucketCloudTemplate.test.ts +++ b/source/runner/templates/_tests/_bitbucketCloudTemplate.test.ts @@ -16,9 +16,9 @@ import * as utils from "../../DangerUtils" const commitID = "e70f3d6468f61a4bef68c9e6eaba9166b096e23c" -const noEntryEmoji = "❌" -const warningEmoji = "⚠️" -const messageEmoji = "✨" +const noEntryEmoji = ":x:" +const warningEmoji = ":warning:" +const messageEmoji = ":sparkles:" describe("generating messages for BitBucket cloud", () => { let complimentMock: jest.Mock diff --git a/source/runner/templates/bitbucketCloudTemplate.ts b/source/runner/templates/bitbucketCloudTemplate.ts index 3339100cb..e754c95aa 100644 --- a/source/runner/templates/bitbucketCloudTemplate.ts +++ b/source/runner/templates/bitbucketCloudTemplate.ts @@ -3,11 +3,11 @@ import { Violation } from "../../dsl/Violation" import { compliment } from "../DangerUtils" // BitBucket Cloud supports these emojis 🎉 -const noEntryEmoji = "❌" -const warningEmoji = "⚠️" -const messageEmoji = "✨" -const signatureEmoji = "🚫" -const successEmoji = "🎉" +const noEntryEmoji = ":x:" +const warningEmoji = ":warning:" +const messageEmoji = ":sparkles:" +const signatureEmoji = ":no_entry_sign:" +const successEmoji = ":tada:" export const dangerSignature = (results: DangerResults) => { let meta = results.meta || { runtimeName: "dangerJS", runtimeHref: "https://danger.systems/js" } @@ -65,11 +65,11 @@ export function template(dangerID: string, results: DangerResults, commitID?: st ${buildMarkdownTable("Fails", noEntryEmoji, results.fails)} ${buildMarkdownTable("Warnings", warningEmoji, results.warnings)} ${buildMarkdownTable("Messages", messageEmoji, results.messages)} - + ${results.markdowns.map(v => v.message).join("\n\n")} - + ${dangerSignaturePostfix(results, commitID)} - + [](http://${dangerIDToString(dangerID)}) ` } diff --git a/yarn.lock b/yarn.lock index d784b7e48..d78df1839 100644 --- a/yarn.lock +++ b/yarn.lock @@ -673,6 +673,13 @@ dependencies: regenerator-runtime "^0.13.2" +"@babel/runtime@^7.8.7": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" + integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.0.0", "@babel/template@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" @@ -748,13 +755,10 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" +"@iarna/toml@2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.3.tgz#f060bf6eaafae4d56a7dac618980838b0696e2ab" + integrity sha512-FmuxfCuolpLl0AnQ2NHSzoUKWEJDFl63qXjzdoWBVyFCXzMGm1spBzk7LeHNoVCiWCF7mRVms9e6jEV9+MoPbg== "@nodelib/fs.scandir@2.1.3": version "2.1.3" @@ -769,11 +773,6 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== -"@nodelib/fs.stat@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.2.tgz#54c5a964462be3d4d78af631363c18d6fa91ac26" - integrity sha512-yprFYuno9FtNsSHVlSWd+nRlmGoAbqbeCwOryP6sC/zoCjhpArcRMYp19EvpSUSizJAlsXEwJv+wcWS9XaXdMw== - "@nodelib/fs.walk@^1.2.3": version "1.2.4" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" @@ -789,6 +788,18 @@ dependencies: "@octokit/types" "^2.0.0" +"@octokit/core@^2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-2.4.3.tgz#f51c0c228e6aa01253f9452ba5a25dc20aee8577" + integrity sha512-9T91nYeBB7+PNK3oxOuA+6DXCPRvhJ80ke+NqhXirBjVtNepTKFJXoWPqguRSBQ+dkEVA8dZJMxfFzjz9yhiuA== + dependencies: + "@octokit/auth-token" "^2.4.0" + "@octokit/graphql" "^4.3.1" + "@octokit/request" "^5.3.1" + "@octokit/types" "^2.0.0" + before-after-hook "^2.1.0" + universal-user-agent "^5.0.0" + "@octokit/endpoint@^5.5.0": version "5.5.2" resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-5.5.2.tgz#ed19d01fe85ac58bc2b774661658f9e5429b8164" @@ -798,6 +809,24 @@ is-plain-object "^3.0.0" universal-user-agent "^4.0.0" +"@octokit/endpoint@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.0.tgz#4c7acd79ab72df78732a7d63b09be53ec5a2230b" + integrity sha512-3nx+MEYoZeD0uJ+7F/gvELLvQJzLXhep2Az0bBSXagbApDvDW0LWwpnAIY/hb0Jwe17A0fJdz0O12dPh05cj7A== + dependencies: + "@octokit/types" "^2.0.0" + is-plain-object "^3.0.0" + universal-user-agent "^5.0.0" + +"@octokit/graphql@^4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.3.1.tgz#9ee840e04ed2906c7d6763807632de84cdecf418" + integrity sha512-hCdTjfvrK+ilU2keAdqNBWOk+gm1kai1ZcdjRfB30oA3/T6n53UVJb7w0L5cR3/rhU91xT3HSqCd+qbvH06yxA== + dependencies: + "@octokit/request" "^5.3.0" + "@octokit/types" "^2.0.0" + universal-user-agent "^4.0.0" + "@octokit/plugin-paginate-rest@^1.1.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz#004170acf8c2be535aba26727867d692f7b488fc" @@ -805,6 +834,13 @@ dependencies: "@octokit/types" "^2.0.1" +"@octokit/plugin-paginate-rest@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.0.2.tgz#fee7a81a4cc7d03784aaf9225499dd6e27f6d01e" + integrity sha512-HzODcSUt9mjErly26TlTOGZrhf9bmF/FEDQ2zln1izhgmIV6ulsjsHmgmR4VZ0wzVr/m52Eb6U2XuyS8fkcR1A== + dependencies: + "@octokit/types" "^2.0.1" + "@octokit/plugin-request-log@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz#eef87a431300f6148c39a7f75f8cfeb218b2547e" @@ -818,6 +854,14 @@ "@octokit/types" "^2.0.1" deprecation "^2.3.1" +"@octokit/plugin-rest-endpoint-methods@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.4.0.tgz#27b1dac7fba4d0d6e488967919b6a5bd3595ffbc" + integrity sha512-Tvctk0u5SVrSLAzi8SLo0KrLSBl5biAHBgWy3L65vsbO/2fjzr62HVkoDPyr+WRT+eHhhqpKAERF3dQWOIUOvQ== + dependencies: + "@octokit/types" "^2.0.1" + deprecation "^2.3.1" + "@octokit/request-error@^1.0.1", "@octokit/request-error@^1.0.2": version "1.2.1" resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.2.1.tgz#ede0714c773f32347576c25649dc013ae6b31801" @@ -827,6 +871,15 @@ deprecation "^2.0.0" once "^1.4.0" +"@octokit/request-error@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.0.tgz#94ca7293373654400fbb2995f377f9473e00834b" + integrity sha512-rtYicB4Absc60rUv74Rjpzek84UbVHGHJRu4fNVlZ1mCcyUPPuzFfG9Rn6sjHrd95DEsmjSt1Axlc699ZlbDkw== + dependencies: + "@octokit/types" "^2.0.0" + deprecation "^2.0.0" + once "^1.4.0" + "@octokit/request@^5.2.0": version "5.3.1" resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.3.1.tgz#3a1ace45e6f88b1be4749c5da963b3a3b4a2f120" @@ -841,22 +894,31 @@ once "^1.4.0" universal-user-agent "^4.0.0" -"@octokit/rest@15.13.1": - version "15.13.1" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.13.1.tgz#68b12ff0e470ad70c90e99bbb69f16bcdf62edb4" - integrity sha512-r6aRAZaaUZkTqtI4seaSamvgqmYswXpxclIqUrwtFtOuRAnE7l0aeWU252vQ/mxd1wKZWMq1oFChzk0/qzcYcg== +"@octokit/request@^5.3.0", "@octokit/request@^5.3.1": + version "5.3.4" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.3.4.tgz#fbc950bf785d59da3b0399fc6d042c8cf52e2905" + integrity sha512-qyj8G8BxQyXjt9Xu6NvfvOr1E0l35lsXtwm3SopsYg/JWXjlsnwqLc8rsD2OLguEL/JjLfBvrXr4az7z8Lch2A== dependencies: - before-after-hook "^1.1.0" - btoa-lite "^1.0.0" - debug "^3.1.0" - http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.0" - lodash "^4.17.4" - node-fetch "^2.1.1" - universal-user-agent "^2.0.0" - url-template "^2.0.8" - -"@octokit/rest@^16.14.1", "@octokit/rest@^16.43.1": + "@octokit/endpoint" "^6.0.0" + "@octokit/request-error" "^2.0.0" + "@octokit/types" "^2.0.0" + deprecation "^2.0.0" + is-plain-object "^3.0.0" + node-fetch "^2.3.0" + once "^1.4.0" + universal-user-agent "^5.0.0" + +"@octokit/rest@17.1.4": + version "17.1.4" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-17.1.4.tgz#b03eb97635de62b48428f998ad1cb9244edd2d10" + integrity sha512-LGghhepxoXyvi7ew0OdedrlwXQog8gvTbcdXoQ6RDKnzoYW2rBpcqeWC4fTuPUp9K0UEykcMix8kFnQ5b+64JQ== + dependencies: + "@octokit/core" "^2.4.3" + "@octokit/plugin-paginate-rest" "^2.0.0" + "@octokit/plugin-request-log" "^1.0.0" + "@octokit/plugin-rest-endpoint-methods" "3.4.0" + +"@octokit/rest@^16.43.1": version "16.43.1" resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.1.tgz#3b11e7d1b1ac2bbeeb23b08a17df0b20947eda6b" integrity sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw== @@ -892,10 +954,29 @@ dependencies: any-observable "^0.3.0" -"@sindresorhus/is@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" - integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@sindresorhus/is@^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-2.1.0.tgz#6ad4ca610f696098e92954ab431ff83bea0ce13f" + integrity sha512-lXKXfypKo644k4Da4yXkPCrwcvn6SlUW2X2zFbuflKHNjf0w9htru01bo26uMhleMXsDmnZ12eJLdrAZa9MANg== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@szmarczak/http-timer@^4.0.0": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152" + integrity sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ== + dependencies: + defer-to-connect "^2.0.0" "@types/async-retry@^1.4.1": version "1.4.1" @@ -909,6 +990,16 @@ resolved "https://registry.yarnpkg.com/@types/braces/-/braces-2.3.0.tgz#d00ec0a76562b2acb6f29330be33a093e33ed25c" integrity sha512-A3MV5EsLHgShHoJ/XES/fQAnwNISKLrFuH9eNBZY5OkTQB7JPIwbRoExvRpDsNABvkMojnKqKWS8x0m2rLYi+A== +"@types/cacheable-request@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" + integrity sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "*" + "@types/node" "*" + "@types/responselike" "*" + "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" @@ -957,6 +1048,11 @@ resolved "https://registry.yarnpkg.com/@types/highlight.js/-/highlight.js-9.1.8.tgz#d227f18bcb8f3f187e16965f2444859a04689758" integrity sha1-0ifxi8uPPxh+FpZfJESFmgRol1g= +"@types/http-cache-semantics@*": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" + integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== + "@types/http-proxy-agent@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/http-proxy-agent/-/http-proxy-agent-2.0.1.tgz#2f95077f6bfe7adc39cc0f0042da85997ae77fc7" @@ -988,6 +1084,13 @@ dependencies: "@types/node" "*" +"@types/keyv@*", "@types/keyv@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7" + integrity sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw== + dependencies: + "@types/node" "*" + "@types/lodash.includes@^4.3.4": version "4.3.4" resolved "https://registry.yarnpkg.com/@types/lodash.includes/-/lodash.includes-4.3.4.tgz#cbf150b349c508403eb477be9e9a797647683d8d" @@ -1066,15 +1169,20 @@ integrity sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ== "@types/node@^10.11.3": - version "10.11.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.11.3.tgz#c055536ac8a5e871701aa01914be5731539d01ee" - integrity sha512-3AvcEJAh9EMatxs+OxAlvAEs7OTy6AG94mcH1iqyVDwVVndekLxzwkWQ/Z4SDbY6GO2oyUXyWW8tQ4rENSSQVQ== + version "10.17.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.55.tgz#a147f282edec679b894d4694edb5abeb595fecbd" + integrity sha512-koZJ89uLZufDvToeWO5BrC4CR4OUfHnUz2qoPs/daQH6qq3IN62QFxCTZ+bKaCE0xaoCAJYE4AXre8AbghCrhg== "@types/p-limit@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/p-limit/-/p-limit-2.0.0.tgz#c076b7daa9163108a35899ea6a9d927526943ea2" integrity sha512-vx0HhwWQcrIzFn+Bx5OS6hk3wQ9++QjRyZgybM0+20MKqq1uYYgVjDxXk8+fFDfeGArep5l1laHCxEwltfzwYQ== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/prettier@^1.16.1": version "1.16.1" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.16.1.tgz#328d1c9b54402e44119398bcb6a31b7bbd606d59" @@ -1085,6 +1193,13 @@ resolved "https://registry.yarnpkg.com/@types/readline-sync/-/readline-sync-1.4.3.tgz#eac55a39d5a349912062c9e5216cd550c07fd9c8" integrity sha512-YP9NVli96E+qQLAF2db+VjnAUEeZcFVg4YnMgr8kpDUFwQBnj31rPLOVHmazbKQhaIkJ9cMHsZhpKdzUeL0KTg== +"@types/responselike@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + "@types/retry@*": version "0.12.0" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" @@ -1102,14 +1217,6 @@ resolved "https://registry.yarnpkg.com/@types/voca/-/voca-1.4.0.tgz#59d93132e411f13fbaacb166a2047464c463535a" integrity sha512-LdffYbNO8Mg06oPouDq13XwarZbYEvLHMCeV04B/LYl2o6miyg4qBa3YduIZcNhK8/r3Soq0a1tCDeprkBXTIQ== -JSONStream@^1.0.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.4.tgz#615bb2adb0cd34c8f4c447b5f6512fa1d8f16a2e" - integrity sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - abab@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" @@ -1200,6 +1307,13 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" +ansi-align@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" + integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== + dependencies: + string-width "^3.0.0" + ansi-escapes@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -1210,6 +1324,13 @@ ansi-escapes@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" integrity sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ== +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -1225,6 +1346,16 @@ ansi-regex@^4.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -1344,23 +1475,6 @@ array-equal@^1.0.0: resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - -array-ify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" - integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -1371,11 +1485,6 @@ array-uniq@1.0.2: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.2.tgz#5fcc373920775723cfd64d65c64bef53bf9eba6d" integrity sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0= -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -1428,6 +1537,13 @@ async-retry@1.2.3: dependencies: retry "0.12.0" +async-retry@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" + integrity sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA== + dependencies: + retry "0.12.0" + async-to-gen@1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/async-to-gen/-/async-to-gen-1.3.3.tgz#d52c9fb4801f0df44abc4d2de1870b48b60e20bb" @@ -1478,7 +1594,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.0.tgz#24390e6ad61386b0a747265754d2a17219de862c" integrity sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A== -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: +babel-code-frame@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= @@ -1487,158 +1603,6 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-jest@^24.0.0: version "24.0.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.0.0.tgz#8a0c767f03f4a595fb921afdab13ff126edd00da" @@ -1647,20 +1611,6 @@ babel-jest@^24.0.0: babel-plugin-istanbul "^5.1.0" babel-preset-jest "^24.0.0" -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - dependencies: - babel-runtime "^6.22.0" - babel-plugin-istanbul@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.0.tgz#6892f529eff65a3e2d33d87dc5888ffa2ecd4a30" @@ -1675,280 +1625,6 @@ babel-plugin-jest-hoist@^24.0.0: resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.0.0.tgz#3adf030b6fd67e4311479a54b24077bdfc226ec9" integrity sha512-ipefE7YWNyRNVaV/MonUb/I5nef53ZRFR74P9meMGmJxqt8s1BJmfhw11YeIMbcjXN4fxtWUaskZZe8yreXE1Q== -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-env@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - babel-preset-jest@^24.0.0: version "24.0.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.0.0.tgz#d23782e5e036cff517859640a80960bd628bd82b" @@ -1957,20 +1633,7 @@ babel-preset-jest@^24.0.0: "@babel/plugin-syntax-object-rest-spread" "^7.0.0" babel-plugin-jest-hoist "^24.0.0" -babel-register@6.26.0, babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.0.0, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: +babel-runtime@^6.0.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -1978,43 +1641,7 @@ babel-runtime@^6.0.0, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtim core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.14.0, babylon@^6.17.0, babylon@^6.18.0: +babylon@^6.14.0, babylon@^6.17.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== @@ -2056,12 +1683,7 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -before-after-hook@^1.1.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.3.2.tgz#7bfbf844ad670aa7a96b5a4e4e15bd74b08ed66b" - integrity sha512-zyPgY5dgbf99c0uGUjhY4w+mxqEGxPKg9RQDl34VvrVh2bM31lFN+mwR1ZHepq/KA3VCPk1gwJZL6IIJqjLy2w== - -before-after-hook@^2.0.0: +before-after-hook@^2.0.0, before-after-hook@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A== @@ -2076,11 +1698,6 @@ bluebird@3.5.0: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" integrity sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw= -bluebird@^3.5.0: - version "3.5.3" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" - integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== - boom@4.x.x: version "4.3.1" resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" @@ -2121,18 +1738,19 @@ boxen@^1.0.0: term-size "^1.2.0" widest-line "^1.0.0" -boxen@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== +boxen@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" + integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^2.0.0" + ansi-align "^3.0.0" + camelcase "^5.3.1" + chalk "^3.0.0" + cli-boxes "^2.2.0" + string-width "^4.1.0" + term-size "^2.1.0" + type-fest "^0.8.1" + widest-line "^3.1.0" brace-expansion@^1.1.7: version "1.1.8" @@ -2177,14 +1795,6 @@ browser-resolve@^1.11.3: dependencies: resolve "1.1.7" -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== - dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" - browserslist@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.1.1.tgz#328eb4ff1215b12df6589e9ab82f8adaa4fc8cd6" @@ -2238,14 +1848,6 @@ builtin-modules@^1.0.0, builtin-modules@^1.1.1: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= -bump-file@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/bump-file/-/bump-file-1.0.0.tgz#892880ef8af84c8df8d94cc2829ef18811503247" - integrity sha512-mUN6TDIkvDmE6gNlgMDiLl95qcgfqQ5Hu8HZDFk4AW3t9xBcKoasHlMcjV+1C6jmRRX4G2WySML0JGauRzFKaw== - dependencies: - detect-indent "5.0.0" - semver "5.4.1" - byline@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" @@ -2276,46 +1878,45 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -cacheable-request@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" - integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0= - dependencies: - clone-response "1.0.2" - get-stream "3.0.0" - http-cache-semantics "3.8.1" - keyv "3.0.0" - lowercase-keys "1.0.0" - normalize-url "2.0.1" - responselike "1.0.2" - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= +cacheable-lookup@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz#87be64a18b925234875e10a9bb1ebca4adce6b38" + integrity sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg== + dependencies: + "@types/keyv" "^3.1.1" + keyv "^4.0.0" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +cacheable-request@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58" + integrity sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^2.0.0" callsites@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= - dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" - camelcase@4.1.0, camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -2326,20 +1927,15 @@ camelcase@^1.0.2: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - camelcase@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== -caniuse-lite@^1.0.30000844: - version "1.0.30000935" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000935.tgz#d1b59df00b46f4921bb84a8a34c1d172b346df59" - integrity sha512-1Y2uJ5y56qDt3jsDTdBHL1OqiImzjoQcBG6Yl3Qizq8mcc2SgCFpi+ZwLLqkztYnk9l87IYqRlNBnPSOTbFkXQ== +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== caniuse-lite@^1.0.30000884: version "1.0.30000885" @@ -2394,14 +1990,13 @@ chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@2.4.1, chalk@^2.3.0, chalk@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== +chalk@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" + integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + ansi-styles "^4.1.0" + supports-color "^7.1.0" chalk@^2.0.0: version "2.0.1" @@ -2421,6 +2016,15 @@ chalk@^2.0.1: escape-string-regexp "^1.0.5" supports-color "^4.0.0" +chalk@^2.3.0, chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" @@ -2430,6 +2034,15 @@ chalk@^2.3.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -2438,6 +2051,11 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +changelog-filename-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/changelog-filename-regex/-/changelog-filename-regex-1.1.2.tgz#19e98e38248cff0c1cf3ae3bf51bfb22c48592d6" + integrity sha512-kpOfKlZ9x2UpeC4at6FAXHLKfi/JEUqUqkPCb1JUCa5FnNbJIzOHRM9RfeQ1QDcpj+Gxuc/UoHqASgmEeFDejQ== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -2473,11 +2091,6 @@ chownr@^1.0.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" integrity sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE= -ci-info@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.1.tgz#47b44df118c48d2597b56d342e7e25791060171a" - integrity sha512-vHDDF/bP9RYpTWtUhpJRhCFdvvp3iDWvEbuDbWgvjUrNGV1MXJrE0MPcwGtEled04m61iwdBLUIHZtDgzWS4ZQ== - ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" @@ -2503,6 +2116,11 @@ cli-boxes@^1.0.0: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= +cli-boxes@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" + integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== + cli-cursor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" @@ -2517,6 +2135,13 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + cli-spinners@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" @@ -2527,6 +2152,11 @@ cli-spinners@^1.1.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== +cli-spinners@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.2.0.tgz#e8b988d9206c692302d8ee834e7a85c0144d8f77" + integrity sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ== + cli-truncate@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" @@ -2572,7 +2202,7 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" -clone-response@1.0.2: +clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= @@ -2638,7 +2268,7 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -2689,14 +2319,6 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -compare-func@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" - integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg= - dependencies: - array-ify "^1.0.0" - dot-prop "^3.0.0" - compare-versions@^3.2.1: version "3.4.0" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" @@ -2732,16 +2354,6 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - configstore@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" @@ -2754,6 +2366,18 @@ configstore@^3.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -2764,175 +2388,11 @@ content-type-parser@^1.0.1: resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" integrity sha1-w+VpiMU8ZRJ/tG1AMqOpACRv3JQ= -conventional-changelog-angular@^1.6.6: - version "1.6.6" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz#b27f2b315c16d0a1f23eb181309d0e6a4698ea0f" - integrity sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg== - dependencies: - compare-func "^1.3.1" - q "^1.5.1" - -conventional-changelog-atom@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-2.0.1.tgz#dc88ce650ffa9ceace805cbe70f88bfd0cb2c13a" - integrity sha512-9BniJa4gLwL20Sm7HWSNXd0gd9c5qo49gCi8nylLFpqAHhkFTj7NQfROq3f1VpffRtzfTQp4VKU5nxbe2v+eZQ== - dependencies: - q "^1.5.1" - -conventional-changelog-codemirror@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.1.tgz#acc046bc0971460939a0cc2d390e5eafc5eb30da" - integrity sha512-23kT5IZWa+oNoUaDUzVXMYn60MCdOygTA2I+UjnOMiYVhZgmVwNd6ri/yDlmQGXHqbKhNR5NoXdBzSOSGxsgIQ== - dependencies: - q "^1.5.1" - -conventional-changelog-core@^3.1.0: - version "3.1.5" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-3.1.5.tgz#c2edf928539308b54fe1b90a2fc731abc021852c" - integrity sha512-iwqAotS4zk0wA4S84YY1JCUG7X3LxaRjJxuUo6GI4dZuIy243j5nOg/Ora35ExT4DOiw5dQbMMQvw2SUjh6moQ== - dependencies: - conventional-changelog-writer "^4.0.2" - conventional-commits-parser "^3.0.1" - dateformat "^3.0.0" - get-pkg-repo "^1.0.0" - git-raw-commits "2.0.0" - git-remote-origin-url "^2.0.0" - git-semver-tags "^2.0.2" - lodash "^4.2.1" - normalize-package-data "^2.3.5" - q "^1.5.1" - read-pkg "^3.0.0" - read-pkg-up "^3.0.0" - through2 "^2.0.0" - -conventional-changelog-ember@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-2.0.2.tgz#284ffdea8c83ea8c210b65c5b4eb3e5cc0f4f51a" - integrity sha512-qtZbA3XefO/n6DDmkYywDYi6wDKNNc98MMl2F9PKSaheJ25Trpi3336W8fDlBhq0X+EJRuseceAdKLEMmuX2tg== - dependencies: - q "^1.5.1" - -conventional-changelog-eslint@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.1.tgz#f65e0e7f63dc09c044244b8785313a602e628002" - integrity sha512-yH3+bYrtvgKxSFChUBQnKNh9/U9kN2JElYBm253VpYs5wXhPHVc9ENcuVGWijh24nnOkei7wEJmnmUzgZ4ok+A== - dependencies: - q "^1.5.1" - -conventional-changelog-express@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-2.0.1.tgz#fea2231d99a5381b4e6badb0c1c40a41fcacb755" - integrity sha512-G6uCuCaQhLxdb4eEfAIHpcfcJ2+ao3hJkbLrw/jSK/eROeNfnxCJasaWdDAfFkxsbpzvQT4W01iSynU3OoPLIw== - dependencies: - q "^1.5.1" - -conventional-changelog-jquery@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz#0208397162e3846986e71273b6c79c5b5f80f510" - integrity sha1-Agg5cWLjhGmG5xJztsecW1+A9RA= - dependencies: - q "^1.4.1" - -conventional-changelog-jscs@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz#0479eb443cc7d72c58bf0bcf0ef1d444a92f0e5c" - integrity sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw= - dependencies: - q "^1.4.1" - -conventional-changelog-jshint@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.1.tgz#11c0e8283abf156a4ff78e89be6fdedf9bd72202" - integrity sha512-kRFJsCOZzPFm2tzRHULWP4tauGMvccOlXYf3zGeuSW4U0mZhk5NsjnRZ7xFWrTFPlCLV+PNmHMuXp5atdoZmEg== - dependencies: - compare-func "^1.3.1" - q "^1.5.1" - -conventional-changelog-preset-loader@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.0.2.tgz#81d1a07523913f3d17da3a49f0091f967ad345b0" - integrity sha512-pBY+qnUoJPXAXXqVGwQaVmcye05xi6z231QM98wHWamGAmu/ghkBprQAwmF5bdmyobdVxiLhPY3PrCfSeUNzRQ== - -conventional-changelog-writer@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.2.tgz#eb493ed84269e7a663da36e49af51c54639c9a67" - integrity sha512-d8/FQY/fix2xXEBUhOo8u3DCbyEw3UOQgYHxLsPDw+wHUDma/GQGAGsGtoH876WyNs32fViHmTOUrgRKVLvBug== - dependencies: - compare-func "^1.3.1" - conventional-commits-filter "^2.0.1" - dateformat "^3.0.0" - handlebars "^4.0.2" - json-stringify-safe "^5.0.1" - lodash "^4.2.1" - meow "^4.0.0" - semver "^5.5.0" - split "^1.0.0" - through2 "^2.0.0" - -conventional-changelog@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-2.0.3.tgz#779cff582c0091d2b24574003eaa82ef5ddf653d" - integrity sha512-4bcII9cJHSKb2qi9e8qGF6aJHLf/AB0dokhyR+X6QILTMl77s4l163vK+reXhajvfOYbbHQvsrWybr5+PKZwNA== - dependencies: - conventional-changelog-angular "^1.6.6" - conventional-changelog-atom "^2.0.0" - conventional-changelog-codemirror "^2.0.0" - conventional-changelog-core "^3.1.0" - conventional-changelog-ember "^2.0.1" - conventional-changelog-eslint "^3.0.0" - conventional-changelog-express "^2.0.0" - conventional-changelog-jquery "^0.1.0" - conventional-changelog-jscs "^0.1.0" - conventional-changelog-jshint "^2.0.0" - conventional-changelog-preset-loader "^2.0.1" - -conventional-commits-filter@^2.0.0, conventional-commits-filter@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.1.tgz#55a135de1802f6510b6758e0a6aa9e0b28618db3" - integrity sha512-92OU8pz/977udhBjgPEbg3sbYzIxMDFTlQT97w7KdhR9igNqdJvy8smmedAAgn4tPiqseFloKkrVfbXCVd+E7A== - dependencies: - is-subset "^0.1.1" - modify-values "^1.0.0" - -conventional-commits-parser@^3.0.0, conventional-commits-parser@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.1.tgz#fe1c49753df3f98edb2285a5e485e11ffa7f2e4c" - integrity sha512-P6U5UOvDeidUJ8ebHVDIoXzI7gMlQ1OF/id6oUvp8cnZvOXMt1n8nYl74Ey9YMn0uVQtxmCtjPQawpsssBWtGg== - dependencies: - JSONStream "^1.0.4" - is-text-path "^1.0.0" - lodash "^4.2.1" - meow "^4.0.0" - split2 "^2.0.0" - through2 "^2.0.0" - trim-off-newlines "^1.0.0" - -conventional-recommended-bump@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-4.0.1.tgz#304a45a412cfec050a10ea2e7e4a89320eaf3991" - integrity sha512-9waJvW01TUs4HQJ3khwGSSlTlKsY+5u7OrxHL+oWEoGNvaNO/0qL6qqnhS3J0Fq9fNKA9bmlf5cOXjCQoW+I4Q== - dependencies: - concat-stream "^1.6.0" - conventional-changelog-preset-loader "^2.0.1" - conventional-commits-filter "^2.0.0" - conventional-commits-parser "^3.0.0" - git-raw-commits "^2.0.0" - git-semver-tags "^2.0.0" - meow "^4.0.0" - q "^1.5.1" - convert-source-map@^1.1.0, convert-source-map@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" integrity sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU= -convert-source-map@^1.5.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== - dependencies: - safe-buffer "~5.1.1" - copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" @@ -2943,11 +2403,6 @@ core-js@^2.4.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" integrity sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs= -core-js@^2.5.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.3.tgz#4b70938bdffdaf64931e66e2db158f0892289c49" - integrity sha512-l00tmFFZOBHtYhN4Cz7k32VM7vTn3rE2ANjQDxdEN6zmXZ/xq1jQuutnmHvMG1ZJ7xd72+TA5YpUK8wz3rWsfQ== - core-js@^2.5.7: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" @@ -2958,6 +2413,17 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cosmiconfig@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + cosmiconfig@^5.0.2: version "5.0.5" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.5.tgz#a809e3c2306891ce17ab70359dc8bdf661fe2cd0" @@ -2976,27 +2442,6 @@ cosmiconfig@^5.0.6: js-yaml "^3.9.0" parse-json "^4.0.0" -cp-file@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-6.0.0.tgz#f38477ece100b403fcf780fd34d030486beb693e" - integrity sha512-OtHMgPugkgwHlbph25wlMKd358lZNhX1Y2viUpPoFmlBPlEiPIRhztYWha11grbGPnlM+urp5saVmwsChCIOEg== - dependencies: - graceful-fs "^4.1.2" - make-dir "^1.0.0" - nested-error-stacks "^2.0.0" - pify "^3.0.0" - safe-buffer "^5.0.1" - -cpy@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cpy/-/cpy-7.0.1.tgz#d817e4d81bd7f0f25ff812796c5f1392dc0fb485" - integrity sha512-Zo52tXKLJcgy/baacn6KaNoRAakkl2wb+R4u6qJ4wlD0uchncwRQcIk66PlGlkzuToCJO6A6PWX27Tdwc8LU2g== - dependencies: - arrify "^1.0.1" - cp-file "^6.0.0" - globby "^8.0.1" - nested-error-stacks "^2.0.0" - create-error-class@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" @@ -3032,6 +2477,15 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + cryptiles@3.x.x: version "3.1.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" @@ -3044,6 +2498,11 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.2" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" @@ -3056,13 +2515,6 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": dependencies: cssom "0.3.x" -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - danger-plugin-jest@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/danger-plugin-jest/-/danger-plugin-jest-1.1.0.tgz#9b53e14a0483e6de5a65f8d58fbb6a8121a948d4" @@ -3088,13 +2540,6 @@ dargs@5.1.0: resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829" integrity sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk= -dargs@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" - integrity sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc= - dependencies: - number-is-nan "^1.0.0" - dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -3112,11 +2557,6 @@ date-fns@^1.29.0: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" integrity sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw== -dateformat@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" - integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== - debug@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" @@ -3124,7 +2564,7 @@ debug@2.6.7: dependencies: ms "2.0.0" -debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -3138,10 +2578,10 @@ debug@3.1.0, debug@^3.0.1: dependencies: ms "2.0.0" -debug@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" - integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== +debug@4.1.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: ms "^2.1.1" @@ -3152,13 +2592,6 @@ debug@^3.1.0: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" @@ -3166,15 +2599,7 @@ debug@~2.2.0: dependencies: ms "0.7.1" -decamelize-keys@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.0.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -3198,6 +2623,13 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" +decompress-response@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-5.0.0.tgz#7849396e80e3d1eba8cb2f75ef4930f76461cb0f" + integrity sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw== + dependencies: + mimic-response "^2.0.0" + dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -3244,6 +2676,16 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +defer-to-connect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.0.tgz#83d6b199db041593ac84d781b5222308ccf4c2c1" + integrity sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg== + define-properties@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" @@ -3299,6 +2741,14 @@ dependency-tree@^6.1.0: filing-cabinet "^1.13.0" precinct "^4.1.0" +deprecated-obj@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deprecated-obj/-/deprecated-obj-1.0.1.tgz#d7051278d2c141dc672ac3410d06642e990003b7" + integrity sha512-igs766xNtF7Fv/R//gT644e6dr+bT6kJrg+qyJA9affCyvf70UUNKIUIMUSROBg1sPUrBnENPsDdDHcBLI5wFQ== + dependencies: + flat "^4.1.0" + lodash "^4.17.11" + deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -3309,18 +2759,6 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-indent@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" - detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" @@ -3339,6 +2777,16 @@ detect-port@1.2.1: address "^1.0.1" debug "^2.6.0" +detect-repo-changelog@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/detect-repo-changelog/-/detect-repo-changelog-1.0.1.tgz#c2108cbbf0964da7bc074645b6ad1d3b80a6bd6d" + integrity sha1-whCMu/CWTae8B0ZFtq0dO4CmvW0= + dependencies: + changelog-filename-regex "^1.1.0" + is-regular-file "^1.0.1" + lodash.find "^4.6.0" + pify "^2.3.0" + detective-amd@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/detective-amd/-/detective-amd-2.4.0.tgz#5eb0df4ef5c18a94033b07daf136dbcd5fc75cd5" @@ -3425,14 +2873,6 @@ diff@^3.1.0, diff@^3.2.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== -dir-glob@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== - dependencies: - arrify "^1.0.1" - path-type "^3.0.0" - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -3445,13 +2885,6 @@ domexception@^1.0.0: resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.0.tgz#81fe5df81b3f057052cde3a9fa9bf536a85b9ab0" integrity sha512-WpwuBlZ2lQRFa4H/4w49deb9rJLot9KmqrKKjMc9qBl7CID+DdC2swoa34ccRl+anL2B6bLp6TjFdIdnzekMBQ== -dot-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" - integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= - dependencies: - is-obj "^1.0.0" - dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" @@ -3459,6 +2892,13 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" +dot-prop@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + dependencies: + is-obj "^2.0.0" + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -3483,11 +2923,6 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.47: - version "1.3.113" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9" - integrity sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g== - electron-to-chromium@^1.3.62: version "1.3.66" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.66.tgz#1410d8f8768a14dcd09d96222990f43c969af270" @@ -3498,6 +2933,16 @@ elegant-spinner@^1.0.1: resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + encodeurl@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" @@ -3585,6 +3030,11 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -3683,6 +3133,21 @@ exec-sh@^0.2.0: dependencies: merge "^1.1.3" +execa@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.0.tgz#7f37d6ec17f09e6b8fc53288611695b6d12b9daf" + integrity sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + execa@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" @@ -3831,10 +3296,10 @@ extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" - integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: chardet "^0.7.0" iconv-lite "^0.4.24" @@ -3869,18 +3334,6 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-glob@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.2.tgz#71723338ac9b4e0e2fff1d6748a2a13d5ed352bf" - integrity sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g== - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.0.1" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.1" - micromatch "^3.1.10" - fast-glob@^3.0.3: version "3.1.1" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.1.tgz#87ee30e9e9f3eb40d6f254a7997655da753d7c82" @@ -3892,6 +3345,23 @@ fast-glob@^3.0.3: merge2 "^1.3.0" micromatch "^4.0.2" +fast-glob@^3.1.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d" + integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-json-patch@^3.0.0-1: + version "3.0.0-1" + resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-3.0.0-1.tgz#4c68f2e7acfbab6d29d1719c44be51899c93dabb" + integrity sha512-6pdFb07cknxvPzCeLsFHStEy+MysPJPgZQ9LbQ/2O67unQF93SNqfdSqnPPl71YMHX+AD8gbl7iuoGFzHEdDuw== + fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -3924,10 +3394,10 @@ figures@^1.7.0: escape-string-regexp "^1.0.5" object-assign "^4.1.0" -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" @@ -3989,20 +3459,13 @@ find-parent-dir@^0.3.0: resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" integrity sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ= -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= +find-up@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: - locate-path "^2.0.0" + locate-path "^5.0.0" + path-exists "^4.0.0" find-up@^3.0.0: version "3.0.0" @@ -4018,6 +3481,13 @@ find@0.2.6: dependencies: traverse-chain "~0.1.0" +flat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" + integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== + dependencies: + is-buffer "~2.0.3" + flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" @@ -4043,6 +3513,15 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" + integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@^2.3.3, form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -4073,7 +3552,7 @@ fresh@0.5.0: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" integrity sha1-9HTKXmqSRtb9jglTz6m5yAWvp44= -from2@^2.1.1, from2@^2.3.0: +from2@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= @@ -4198,44 +3677,35 @@ get-own-enumerable-property-symbols@^2.0.1: resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz#5c4ad87f2834c4b9b4e84549dc1e0650fb38c24b" integrity sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug== -get-pkg-repo@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" - integrity sha1-xztInAbYDMVTbCyFP54FIyBWly0= - dependencies: - hosted-git-info "^2.1.4" - meow "^3.3.0" - normalize-package-data "^2.3.0" - parse-github-repo-url "^1.3.0" - through2 "^2.0.0" - get-port@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.1.0.tgz#ef01b18a84ca6486970ff99e54446141a73ffd3e" integrity sha1-7wGxioTKZIaXD/meVERhQac//T4= -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - get-stdin@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== -get-stream@3.0.0, get-stream@^3.0.0: +get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= -get-stream@^4.0.0: +get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -4257,39 +3727,20 @@ git-config-path@^1.0.1: fs-exists-sync "^0.1.0" homedir-polyfill "^1.0.0" -git-raw-commits@2.0.0, git-raw-commits@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.0.tgz#d92addf74440c14bcc5c83ecce3fb7f8a79118b5" - integrity sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg== - dependencies: - dargs "^4.0.1" - lodash.template "^4.0.2" - meow "^4.0.0" - split2 "^2.0.0" - through2 "^2.0.0" - -git-remote-origin-url@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" - integrity sha1-UoJlna4hBxRaERJhEq0yFuxfpl8= - dependencies: - gitconfiglocal "^1.0.0" - pify "^2.3.0" - -git-semver-tags@^2.0.0, git-semver-tags@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-2.0.2.tgz#f506ec07caade191ac0c8d5a21bdb8131b4934e3" - integrity sha512-34lMF7Yo1xEmsK2EkbArdoU79umpvm0MfzaDkSNYSJqtM5QLAVTPWgpiXSVI5o/O9EvZPSrP4Zvnec/CqhSd5w== +git-up@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.1.tgz#cb2ef086653640e721d2042fe3104857d89007c0" + integrity sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw== dependencies: - meow "^4.0.0" - semver "^5.5.0" + is-ssh "^1.3.0" + parse-url "^5.0.0" -gitconfiglocal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" - integrity sha1-QdBF84UaXqiPA/JMocYXgRRGS5s= +git-url-parse@11.1.2: + version "11.1.2" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.1.2.tgz#aff1a897c36cc93699270587bea3dbcbbb95de67" + integrity sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ== dependencies: - ini "^1.3.2" + git-up "^4.0.0" gitlab@^10.0.1: version "10.0.1" @@ -4320,11 +3771,6 @@ glob-parent@^5.1.0: dependencies: is-glob "^4.0.1" -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= - glob@^7.0.0: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" @@ -4361,35 +3807,29 @@ glob@^7.1.3, glob@~7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -global-dirs@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= +global-dirs@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" + integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== dependencies: - ini "^1.3.4" + ini "^1.3.5" globals@^11.1.0: version "11.7.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" integrity sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg== -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== - -globby@8.0.1, globby@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50" - integrity sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw== +globby@11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154" + integrity sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg== dependencies: - array-union "^1.0.1" - dir-glob "^2.0.0" - fast-glob "^2.0.2" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" globby@^10.0.1: version "10.0.1" @@ -4412,28 +3852,26 @@ gonzales-pe@^3.4.4: dependencies: minimist "1.1.x" -got@8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" - integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== - dependencies: - "@sindresorhus/is" "^0.7.0" - cacheable-request "^2.1.1" - decompress-response "^3.3.0" +got@10.7.0: + version "10.7.0" + resolved "https://registry.yarnpkg.com/got/-/got-10.7.0.tgz#62889dbcd6cca32cd6a154cc2d0c6895121d091f" + integrity sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg== + dependencies: + "@sindresorhus/is" "^2.0.0" + "@szmarczak/http-timer" "^4.0.0" + "@types/cacheable-request" "^6.0.1" + cacheable-lookup "^2.0.0" + cacheable-request "^7.0.1" + decompress-response "^5.0.0" duplexer3 "^0.1.4" - get-stream "^3.0.0" - into-stream "^3.1.0" - is-retry-allowed "^1.1.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - mimic-response "^1.0.0" - p-cancelable "^0.4.0" - p-timeout "^2.0.1" - pify "^3.0.0" - safe-buffer "^5.1.1" - timed-out "^4.0.1" - url-parse-lax "^3.0.0" - url-to-options "^1.0.1" + get-stream "^5.0.0" + lowercase-keys "^2.0.0" + mimic-response "^2.1.0" + p-cancelable "^2.0.0" + p-event "^4.0.0" + responselike "^2.0.0" + to-readable-stream "^2.0.0" + type-fest "^0.10.0" got@^6.7.1: version "6.7.1" @@ -4452,6 +3890,23 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -4495,7 +3950,7 @@ handlebars@4.0.10: optionalDependencies: uglify-js "^2.6" -handlebars@^4.0.11, handlebars@^4.0.2: +handlebars@^4.0.11: version "4.0.12" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== @@ -4560,18 +4015,6 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== - -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== - dependencies: - has-symbol-support-x "^1.4.1" - has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -4608,6 +4051,11 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + has@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" @@ -4640,14 +4088,6 @@ hoek@4.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" integrity sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ== -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" @@ -4667,10 +4107,10 @@ html-encoding-sniffer@^1.0.1: dependencies: whatwg-encoding "^1.0.1" -http-cache-semantics@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" - integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== http-errors@~1.6.1: version "1.6.2" @@ -4699,7 +4139,7 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -https-proxy-agent@^2.2.0, https-proxy-agent@^2.2.1: +https-proxy-agent@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== @@ -4707,6 +4147,11 @@ https-proxy-agent@^2.2.0, https-proxy-agent@^2.2.1: agent-base "^4.1.0" debug "^3.1.0" +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + humps@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/humps/-/humps-2.0.1.tgz#dd02ea6081bd0568dc5d073184463957ba9ef9aa" @@ -4757,16 +4202,33 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.3.5: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== - -ignore@^5.1.1: +ignore@^5.1.1, ignore@^5.1.4: version "5.1.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== +import-cwd@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92" + integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg== + dependencies: + import-from "^3.0.0" + +import-fresh@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" + integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== + dependencies: + resolve-from "^5.0.0" + import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" @@ -4810,12 +4272,12 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.2, ini@^1.3.4, ini@^1.3.5: +ini@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -4825,23 +4287,23 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" integrity sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4= -inquirer@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" - integrity sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg== +inquirer@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" + integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" + ansi-escapes "^4.2.1" + chalk "^3.0.0" + cli-cursor "^3.1.0" cli-width "^2.0.0" - external-editor "^3.0.0" - figures "^2.0.0" - lodash "^4.17.10" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.1.0" - string-width "^2.1.0" - strip-ansi "^4.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^6.0.0" through "^2.3.6" interpret@^1.0.0: @@ -4849,14 +4311,6 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.2.tgz#f4f623f0bb7122f15f5717c8e254b8161b5c5b2d" integrity sha1-9PYj8LtxIvFfVxfI4lS4FhtcWy0= -into-stream@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" - integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY= - dependencies: - from2 "^2.1.1" - p-is-promise "^1.1.0" - into-stream@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-5.1.1.tgz#f9a20a348a11f3c13face22763f2d02e127f4db8" @@ -4925,6 +4379,11 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" integrity sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw= +is-buffer@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" @@ -4937,27 +4396,20 @@ is-callable@^1.1.1, is-callable@^1.1.3: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" integrity sha1-hut1OSgF3cM69xySoO7fdO52BLI= -is-ci@1.2.1, is-ci@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== - dependencies: - ci-info "^1.5.0" - -is-ci@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" - integrity sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4= - dependencies: - ci-info "^1.0.0" - -is-ci@^2.0.0: +is-ci@2.0.0, is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== dependencies: ci-info "^2.0.0" +is-ci@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -5036,6 +4488,11 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-generator-fn@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.0.0.tgz#038c31b774709641bda678b1f06a4e3227c10b3e" @@ -5062,19 +4519,29 @@ is-glob@^4.0.1: dependencies: is-extglob "^2.1.1" -is-installed-globally@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= +is-installed-globally@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.1.tgz#679afef819347a72584617fd19497f010b8ed35f" + integrity sha512-oiEcGoQbGc+3/iijAijrK2qFpkNoNjsHOm/5V5iaeydyrS/hnwaRCEgH5cpW0P3T1lSjV5piB7S5b5lEugNLhg== dependencies: - global-dirs "^0.1.0" - is-path-inside "^1.0.0" + global-dirs "^2.0.1" + is-path-inside "^3.0.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= +is-npm@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" + integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -5097,10 +4564,10 @@ is-obj@^1.0.0, is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= -is-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-observable@^1.1.0: version "1.1.0" @@ -5116,14 +4583,12 @@ is-odd@^2.0.0: dependencies: is-number "^4.0.0" -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= - dependencies: - path-is-inside "^1.0.1" +is-path-inside@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" + integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: +is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= @@ -5164,39 +4629,44 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= +is-regular-file@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regular-file/-/is-regular-file-1.1.1.tgz#ffcf9cae56ec63bc55b17d6fed1af441986dab66" + integrity sha512-+1U3MZrVwC4HM6VUKk3L5fiHtNd2d9kayzEJhmQ+B+uIBPE/p8Fy8QVdkx0HIr3o9J5TOKJY40eI5GfTfBqbdA== + is-relative-path@^1.0.1, is-relative-path@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-relative-path/-/is-relative-path-1.0.1.tgz#ac72793a2d60c049e50676e04a24a8d8f263dc26" integrity sha1-rHJ5Oi1gwEnlBnbgSiSo2PJj3CY= -is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: +is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= +is-ssh@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.1.tgz#f349a8cadd24e65298037a522cf7520f2e81a0f3" + integrity sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg== + dependencies: + protocols "^1.1.0" + is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= -is-subset@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" - integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== is-symbol@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" integrity sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI= -is-text-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" - integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= - dependencies: - text-extensions "^1.0.0" - -is-typedarray@~1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -5206,11 +4676,6 @@ is-url@^1.2.4: resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -5221,6 +4686,11 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -5324,14 +4794,6 @@ istanbul-reports@^2.1.0: dependencies: handlebars "^4.0.11" -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - jest-changed-files@^24.0.0: version "24.0.0" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.0.0.tgz#c02c09a8cc9ca93f513166bc773741bd39898ff7" @@ -5748,11 +5210,6 @@ jsdom@^11.5.1: whatwg-url "^6.3.0" xml-name-validator "^2.0.1" -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" @@ -5768,6 +5225,11 @@ json-buffer@3.0.0: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-better-errors@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a" @@ -5807,7 +5269,7 @@ json5@2.x: dependencies: minimist "^1.2.0" -json5@^0.5.0, json5@^0.5.1: +json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= @@ -5843,15 +5305,10 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - -jsonpointer@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" - integrity sha1-T9kss04OnbPInIYi7PUfm5eMbLk= +jsonpointer@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.0.tgz#f802669a524ec4805fa7389eadbc9921d5dc8072" + integrity sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg== jsonwebtoken@^8.4.0: version "8.4.0" @@ -5895,13 +5352,20 @@ jws@^3.1.5: jwa "^1.1.5" safe-buffer "^5.0.1" -keyv@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" - integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== dependencies: json-buffer "3.0.0" +keyv@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.0.tgz#2d1dab694926b2d427e4c74804a10850be44c12f" + integrity sha512-U7ioE8AimvRVLfw4LffyOIRhL2xVgmE8T22L6i0BucSnBUyv4w+I7VN/zVZwRKHOI6ZRUcdMdWHQ8KSUvGpEog== + dependencies: + json-buffer "3.0.1" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -5951,6 +5415,13 @@ latest-version@^3.0.0: dependencies: package-json "^4.0.0" +latest-version@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" @@ -5991,6 +5462,11 @@ li@^1.3.0: resolved "https://registry.yarnpkg.com/li/-/li-1.3.0.tgz#22c59bcaefaa9a8ef359cf759784e4bf106aea1b" integrity sha1-IsWbyu+qmo7zWc91l4TkvxBq6hs= +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + lint-staged@^7.3.0: version "7.3.0" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-7.3.0.tgz#90ff33e5ca61ed3dbac35b6f6502dbefdc0db58d" @@ -6070,17 +5546,6 @@ listr@^0.14.1: rxjs "^6.1.0" strip-ansi "^3.0.1" -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" @@ -6101,14 +5566,6 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -6117,10 +5574,12 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash._reinterpolate@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" lodash.debounce@^4.0.8: version "4.0.8" @@ -6207,21 +5666,6 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash.template@^4.0.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" - integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= - dependencies: - lodash._reinterpolate "~3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" - integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= - dependencies: - lodash._reinterpolate "~3.0.0" - lodash.unescape@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" @@ -6232,17 +5676,17 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.11, lodash@^4.17.4: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== +lodash@4.17.15, lodash@^4.17.11, lodash@^4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== lodash@^4.13.1: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4= -lodash@^4.17.10, lodash@^4.2.1: +lodash@^4.17.10: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== @@ -6266,6 +5710,13 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" +log-symbols@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" + integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== + dependencies: + chalk "^2.4.2" + log-update@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" @@ -6286,24 +5737,16 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lowercase-keys@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= - -lowercase-keys@^1.0.0: +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + lru-cache@^4.0.0, lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" @@ -6312,11 +5755,6 @@ lru-cache@^4.0.0, lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" -macos-release@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-1.1.0.tgz#831945e29365b470aa8724b0ab36c8f8959d10fb" - integrity sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA== - macos-release@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" @@ -6361,6 +5799,13 @@ make-dir@^1.3.0: dependencies: pify "^3.0.0" +make-dir@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" + integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== + dependencies: + semver "^6.0.0" + make-error@1.x: version "1.3.5" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" @@ -6390,16 +5835,6 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= - map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -6441,37 +5876,6 @@ memory-fs@^0.4.0: errno "^0.1.3" readable-stream "^2.0.1" -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - dependencies: - 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" - -meow@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975" - integrity sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist "^1.1.3" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - merge-stream@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" @@ -6479,10 +5883,10 @@ merge-stream@^1.0.1: dependencies: readable-stream "^2.0.1" -merge2@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34" - integrity sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg== +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.2.3, merge2@^1.3.0: version "1.3.0" @@ -6548,6 +5952,14 @@ micromatch@^4.0.2: braces "^3.0.1" picomatch "^2.0.5" +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + mime-db@1.40.0: version "1.40.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" @@ -6558,6 +5970,11 @@ mime-db@1.42.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== +mime-db@1.43.0: + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + "mime-db@>= 1.29.0 < 2", mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" @@ -6568,11 +5985,6 @@ mime-db@~1.27.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" integrity sha1-gg9XIpa70g7CXtVeW13oaeVDbrE= -mime-db@~1.36.0: - version "1.36.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" - integrity sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw== - mime-types@2.1.15: version "2.1.15" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" @@ -6580,12 +5992,12 @@ mime-types@2.1.15: dependencies: mime-db "~1.27.0" -mime-types@2.1.20: - version "2.1.20" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" - integrity sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A== +mime-types@2.1.26: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== dependencies: - mime-db "~1.36.0" + mime-db "1.43.0" mime-types@^2.1.12: version "2.1.24" @@ -6618,11 +6030,21 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" integrity sha1-5md4PZLonb00KBi1IwudYqZyrRg= -mimic-response@^1.0.0: +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== +mimic-response@^2.0.0, mimic-response@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -6630,14 +6052,6 @@ minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -6648,7 +6062,7 @@ minimist@1.1.x: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag= -minimist@1.2.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: +minimist@1.2.0, minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= @@ -6693,11 +6107,6 @@ mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "0.0.8" -modify-values@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" - integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== - module-definition@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/module-definition/-/module-definition-2.2.4.tgz#c0a3771de58cf6bcf12aed2476706c596ad4b2cb" @@ -6741,10 +6150,10 @@ multistream@^2.1.1: inherits "^2.0.1" readable-stream "^2.0.5" -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.9.2: version "2.11.0" @@ -6793,11 +6202,6 @@ negotiator@0.6.1: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= -nested-error-stacks@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" - integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -6823,6 +6227,11 @@ node-cleanup@^2.1.2: resolved "https://registry.yarnpkg.com/node-cleanup/-/node-cleanup-2.1.2.tgz#7ac19abd297e09a7f72a71545d951b517e4dde2c" integrity sha1-esGavSl+Caf3KnFUXZUbUX5N3iw= +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + node-fetch@^1.7.1: version "1.7.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.1.tgz#899cb3d0a3c92f952c47f1b876f4c8aeabd400d5" @@ -6831,7 +6240,7 @@ node-fetch@^1.7.1: encoding "^0.1.11" is-stream "^1.0.1" -node-fetch@^2.1.1, node-fetch@^2.3.0: +node-fetch@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== @@ -6906,7 +6315,7 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5: +normalize-package-data@^2.3.2: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== @@ -6923,14 +6332,15 @@ normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" -normalize-url@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" - integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== - dependencies: - prepend-http "^2.0.0" - query-string "^5.0.1" - sort-keys "^2.0.0" +normalize-url@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +normalize-url@^4.1.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" + integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== npm-bundled@^1.0.1: version "1.0.5" @@ -6966,6 +6376,13 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + npm-which@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" @@ -7082,6 +6499,13 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + opn@5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" @@ -7109,16 +6533,18 @@ optionator@^0.8.1: type-check "~0.3.2" wordwrap "~1.0.0" -ora@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-3.0.0.tgz#8179e3525b9aafd99242d63cc206fd64732741d0" - integrity sha512-LBS97LFe2RV6GJmXBi6OKcETKyklHNMV0xw7BtsVn2MlsgsydyZetSCbCANr+PFLmDyv4KV88nn0eCKza665Mg== +ora@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.3.tgz#752a1b7b4be4825546a7a3d59256fa523b6b6d05" + integrity sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg== dependencies: - chalk "^2.3.1" - cli-cursor "^2.1.0" - cli-spinners "^1.1.0" - log-symbols "^2.2.0" - strip-ansi "^4.0.0" + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-spinners "^2.2.0" + is-interactive "^1.0.0" + log-symbols "^3.0.0" + mute-stream "0.0.8" + strip-ansi "^6.0.0" wcwidth "^1.0.1" ora@^0.2.3: @@ -7157,15 +6583,7 @@ os-locale@^3.0.0: lcid "^2.0.0" mem "^4.0.0" -os-name@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/os-name/-/os-name-2.0.1.tgz#b9a386361c17ae3a21736ef0599405c9a8c5dc5e" - integrity sha1-uaOGNhwXrjohc27wWZQFyajF3F4= - dependencies: - macos-release "^1.0.0" - win-release "^1.0.0" - -os-name@^3.0.0, os-name@^3.1.0: +os-name@3.1.0, os-name@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== @@ -7200,10 +6618,15 @@ override-require@^1.1.1: resolved "https://registry.yarnpkg.com/override-require/-/override-require-1.1.1.tgz#6ae22fadeb1f850ffb0cf4c20ff7b87e5eb650df" integrity sha1-auIvresfhQ/7DPTCD/e4fl62UN8= -p-cancelable@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" - integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-cancelable@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" + integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg== p-defer@^1.0.0: version "1.0.0" @@ -7217,6 +6640,13 @@ p-each-series@^1.0.0: dependencies: p-reduce "^1.0.0" +p-event@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.1.0.tgz#e92bb866d7e8e5b732293b1c8269d38e9982bf8e" + integrity sha512-4vAd06GCsgflX4wHN1JqrMzBh/8QZ4j+rzp0cd2scXRwuBEv+QR3wrVA5aLhWDLw4y2WgDKvzWF3CCLmVM1UgA== + dependencies: + p-timeout "^2.0.1" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -7232,11 +6662,6 @@ p-is-promise@^3.0.0: resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971" integrity sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ== -p-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" - integrity sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw= - p-limit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" @@ -7251,12 +6676,12 @@ p-limit@^2.1.0: dependencies: p-try "^2.0.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= +p-limit@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== dependencies: - p-limit "^1.1.0" + p-try "^2.0.0" p-locate@^3.0.0: version "3.0.0" @@ -7265,6 +6690,13 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-map@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a" @@ -7297,10 +6729,27 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" -parse-diff@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/parse-diff/-/parse-diff-0.5.1.tgz#18b3e82a0765ac1c8796e3854e475073a691c4fb" - integrity sha512-/qXjo9x/pFa5bVk/ZXaJD0yr3Tf3Yp6MWWMr4vnUmumDrE0yoE6YDH2A8vmcCD/Ko3tW2o0X+zGYh2zMLXshsg== +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-diff@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/parse-diff/-/parse-diff-0.7.0.tgz#f11128d3aa02381b46ebc8320b470c2c327e67dc" + integrity sha512-88ar4IU2Fx+KgiyvVul0Y+YprMArTgLscO0nEKaEvWvhzRSSYefdf1M9PUmpx1pu5crUoVl2QNDMqjxfCeKptQ== parse-git-config@^2.0.3: version "2.0.3" @@ -7311,16 +6760,21 @@ parse-git-config@^2.0.3: git-config-path "^1.0.1" ini "^1.3.5" -parse-github-repo-url@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" - integrity sha1-nn2LslKmy2ukJZUGC3v23z28H1A= - parse-github-url@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/parse-github-url/-/parse-github-url-1.0.2.tgz#242d3b65cbcdda14bb50439e3242acf6971db395" integrity sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw== +parse-json@5.0.0, parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -7336,10 +6790,10 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-link-header@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-link-header/-/parse-link-header-1.0.1.tgz#bedfe0d2118aeb84be75e7b025419ec8a61140a7" - integrity sha1-vt/g0hGK64S+deewJUGeyKYRQKc= +parse-link-header@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-link-header/-/parse-link-header-2.0.0.tgz#949353e284f8aa01f2ac857a98f692b57733f6b7" + integrity sha512-xjU87V0VyHZybn2RrCX5TIFGxTVZE6zqqZWMPlIKiSKuWh/X5WZdt+w1Ki1nXB+8L/KtL+nZ4iq+sfI6MrhhMw== dependencies: xtend "~4.0.1" @@ -7353,10 +6807,23 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= -parse-repo@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/parse-repo/-/parse-repo-1.0.4.tgz#74b91d2cb8675d11b99976a0065f6ce17fa1bcc8" - integrity sha1-dLkdLLhnXRG5mXagBl9s4X+hvMg= +parse-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.1.tgz#0ec769704949778cb3b8eda5e994c32073a1adff" + integrity sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA== + dependencies: + is-ssh "^1.3.0" + protocols "^1.4.0" + +parse-url@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-5.0.1.tgz#99c4084fc11be14141efa41b3d117a96fcb9527f" + integrity sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg== + dependencies: + is-ssh "^1.3.0" + normalize-url "^3.3.0" + parse-path "^4.0.0" + protocols "^1.4.0" parse5@^3.0.2: version "3.0.3" @@ -7375,24 +6842,22 @@ path-dirname@^1.0.0: resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.1, path-is-inside@^1.0.2: +path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= @@ -7407,6 +6872,11 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" @@ -7424,15 +6894,6 @@ path-type@2.0.0, path-type@^2.0.0: dependencies: pify "^2.0.0" -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -7460,6 +6921,16 @@ picomatch@^2.0.5: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5" integrity sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA== +picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -7470,18 +6941,6 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - pinpoint@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pinpoint/-/pinpoint-1.1.0.tgz#0cf7757a6977f1bf7f6a32207b709e377388e874" @@ -7652,7 +7111,7 @@ prettyjson@^1.2.1: colors "^1.1.2" minimist "^1.2.0" -private@^0.1.6, private@^0.1.8: +private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -7690,6 +7149,11 @@ propagate@^1.0.0: resolved "https://registry.yarnpkg.com/propagate/-/propagate-1.0.0.tgz#00c2daeedda20e87e3782b344adba1cddd6ad709" integrity sha1-AMLa7t2iDofjeCs0Stuhzd1q1wk= +protocols@^1.1.0, protocols@^1.4.0: + version "1.4.7" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.7.tgz#95f788a4f0e979b291ffefcf5636ad113d037d32" + integrity sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg== + prr@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" @@ -7723,10 +7187,12 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= -q@^1.4.1, q@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= +pupa@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726" + integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA== + dependencies: + escape-goat "^2.0.0" qs@^6.5.1: version "6.7.0" @@ -7743,15 +7209,6 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - query-string@^6.8.1: version "6.8.2" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.8.2.tgz#36cb7e452ae11a4b5e9efee83375e0954407b2f6" @@ -7761,11 +7218,6 @@ query-string@^6.8.1: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= - randomstring@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/randomstring/-/randomstring-1.1.5.tgz#6df0628f75cbd5932930d9fe3ab4e956a18518c3" @@ -7797,7 +7249,7 @@ rc@^1.0.1, rc@^1.1.6: minimist "^1.2.0" strip-json-comments "~2.0.1" -rc@^1.2.7: +rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -7807,22 +7259,6 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - read-pkg-up@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" @@ -7831,15 +7267,6 @@ read-pkg-up@^4.0.0: find-up "^3.0.0" read-pkg "^3.0.0" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" @@ -7867,7 +7294,7 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.0" -readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.2.2: +readable-stream@^2.0.0, readable-stream@^2.0.5: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -7954,22 +7381,6 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= - dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" - regenerate-unicode-properties@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" @@ -7977,7 +7388,7 @@ regenerate-unicode-properties@^7.0.0: dependencies: regenerate "^1.4.0" -regenerate@^1.2.1, regenerate@^1.4.0: +regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== @@ -7997,14 +7408,10 @@ regenerator-runtime@^0.13.2: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" +regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== regenerator-transform@^0.13.3: version "0.13.3" @@ -8021,15 +7428,6 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - regexpu-core@^4.1.3, regexpu-core@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" @@ -8050,6 +7448,13 @@ registry-auth-token@^3.0.1: rc "^1.1.6" safe-buffer "^5.0.1" +registry-auth-token@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479" + integrity sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA== + dependencies: + rc "^1.2.8" + registry-url@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" @@ -8057,23 +7462,18 @@ registry-url@^3.0.3: dependencies: rc "^1.0.1" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" regjsgen@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" integrity sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA== -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= - dependencies: - jsesc "~0.5.0" - regjsparser@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96" @@ -8081,38 +7481,42 @@ regjsparser@^0.3.0: dependencies: jsesc "~0.5.0" -release-it@^7.6.1: - version "7.6.3" - resolved "https://registry.yarnpkg.com/release-it/-/release-it-7.6.3.tgz#ee99792d4b7f3359692da5222405e580b91c74c7" - integrity sha512-h1UuDF0Usfu/fqvmSzJawap8QckDJ6wT2xYaJvfyVQVMCQoQ2Ij12t6JWT56W52BT715GhpYO7YR0f2lOtzcNw== - dependencies: - "@octokit/rest" "15.13.1" - async-retry "1.2.3" - babel-preset-env "1.7.0" - babel-register "6.26.0" - bump-file "1.0.0" - chalk "2.4.1" - conventional-changelog "2.0.3" - conventional-recommended-bump "4.0.1" - cpy "7.0.1" - debug "4.1.0" - globby "8.0.1" - got "8.3.2" - inquirer "6.2.0" - is-ci "1.2.1" - lodash "4.17.11" - mime-types "2.1.20" - ora "3.0.0" - os-name "2.0.1" - parse-repo "1.0.4" - semver "5.6.0" - shelljs "0.8.2" - supports-color "5.5.0" - tmp-promise "1.0.5" - update-notifier "2.5.0" - uuid "3.3.2" +release-it@^13.5.2: + version "13.5.2" + resolved "https://registry.yarnpkg.com/release-it/-/release-it-13.5.2.tgz#d0c0bb4c275f417a5e357acd6b88de95f47c1324" + integrity sha512-IjEiKGAa1hI/c3ComAsB1N2a1n0LT0hYgua2IokXHdTmIvYC3tyyZazSIehiO63kpc4UQ09WTQZcoSeb3NOe8w== + dependencies: + "@iarna/toml" "2.2.3" + "@octokit/rest" "17.1.4" + async-retry "1.3.1" + chalk "4.0.0" + cosmiconfig "6.0.0" + debug "4.1.1" + deprecated-obj "1.0.1" + detect-repo-changelog "1.0.1" + execa "4.0.0" + find-up "4.1.0" + form-data "3.0.0" + git-url-parse "11.1.2" + globby "11.0.0" + got "10.7.0" + import-cwd "3.0.0" + inquirer "7.1.0" + is-ci "2.0.0" + lodash "4.17.15" + mime-types "2.1.26" + ora "4.0.3" + os-name "3.1.0" + parse-json "5.0.0" + semver "7.2.1" + shelljs "0.8.3" + supports-color "7.1.0" + update-notifier "4.1.0" + url-join "4.0.1" + uuid "7.0.3" window-size "1.1.1" - yargs-parser "11.0.0" + yaml "1.8.3" + yargs-parser "18.1.2" remove-trailing-separator@^1.0.1: version "1.1.0" @@ -8259,6 +7663,16 @@ resolve-from@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -8304,13 +7718,20 @@ resolve@^1.3.2: dependencies: path-parse "^1.0.5" -responselike@1.0.2: +responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= dependencies: lowercase-keys "^1.0.0" +responselike@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" + integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== + dependencies: + lowercase-keys "^2.0.0" + restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -8327,6 +7748,14 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -8342,11 +7771,6 @@ reusify@^1.0.0: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rfc6902@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/rfc6902/-/rfc6902-3.0.1.tgz#03a3d38329dbc266fbc92aa7fc14546d7839e89f" - integrity sha512-a4t5OlaOgAejBg48/lkyQMcV6EWpljjSjmXAtSXLhw83x1OhlcVGLMLf//GoUSpHsWt8x/7oxaf5FEGM9QH/iQ== - right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" @@ -8378,10 +7802,10 @@ rsvp@^3.3.3: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= +run-async@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" + integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== dependencies: is-promise "^2.1.0" @@ -8402,6 +7826,13 @@ rxjs@^6.1.0: dependencies: tslib "^1.9.0" +rxjs@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -8466,6 +7897,13 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + "semver@2 || 3 || 4 || 5": version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" @@ -8476,22 +7914,22 @@ semver@5.4.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== -semver@5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== - -semver@^5.0.1, semver@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.2.1.tgz#d997aa36bdbb00b501ae4ac4c7d17e9f7a587ae5" + integrity sha512-aHhm1pD02jXXkyIpq25qBZjr3CQgg8KST8uX0OWXch3xE6jw+1bfbWnCjzMwojsTquroUmKFHNzU6x26mEiRxw== semver@^5.5: version "5.5.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw== -semver@^6.3.0: +semver@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -8583,15 +8021,27 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -shelljs@0.8.2, shelljs@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35" - integrity sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ== +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shelljs@0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" + integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -8606,6 +8056,15 @@ shelljs@^0.7.0: interpret "^1.0.0" rechoir "^0.6.2" +shelljs@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35" + integrity sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" @@ -8630,11 +8089,6 @@ sisteransi@^1.0.0: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.0.tgz#77d9622ff909080f1c19e5f4a1df0c1b0a27b88c" integrity sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ== -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" @@ -8687,13 +8141,6 @@ sntp@2.x.x: dependencies: hoek "4.x.x" -sort-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= - dependencies: - is-plain-obj "^1.0.0" - source-map-resolve@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" @@ -8705,13 +8152,6 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - source-map-support@^0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" @@ -8732,7 +8172,7 @@ source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1, source-map@~0.5.6: +source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -8787,20 +8227,6 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split2@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" - integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== - dependencies: - through2 "^2.0.2" - -split@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== - dependencies: - through "2" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -8856,11 +8282,6 @@ stream-meter@^1.0.4: dependencies: readable-stream "^2.1.4" -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -8895,7 +8316,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.0.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -8903,6 +8324,24 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.0.0, string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -8962,34 +8401,34 @@ strip-ansi@^5.0.0: dependencies: ansi-regex "^4.0.0" +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + strip-bom@3.0.0, strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - -strip-indent@^2.0.0: +strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-json-comments@~2.0.1: version "2.0.1" @@ -9005,12 +8444,12 @@ stylus-lookup@^1.0.1: debug "~2.2.0" is-relative-path "~1.0.0" -supports-color@5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== +supports-color@7.1.0, supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== dependencies: - has-flag "^3.0.0" + has-flag "^4.0.0" supports-color@^2.0.0: version "2.0.0" @@ -9052,13 +8491,6 @@ supports-color@^6.0.0, supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== - dependencies: - has-flag "^4.0.0" - supports-hyperlinks@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" @@ -9114,6 +8546,11 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" +term-size@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" + integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== + test-exclude@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.1.0.tgz#6ba6b25179d2d38724824661323b73e03c0c1de1" @@ -9124,11 +8561,6 @@ test-exclude@^5.0.0: read-pkg-up "^4.0.0" require-main-filename "^1.0.1" -text-extensions@^1.0.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.7.0.tgz#faaaba2625ed746d568a23e4d0aacd9bf08a8b39" - integrity sha512-AKXZeDq230UaSzaO5s3qQUZOaC7iKbzq0jOFL614R7d9R593HLqAOL0cYoqLdkNrjBSOdmoQI06yigq1TSBXAg== - throat@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" @@ -9139,33 +8571,17 @@ throttleit@^1.0.0: resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= -through2@^2.0.0, through2@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -through@2, "through@>=2.2.7 <3", through@^2.3.6: +through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -timed-out@^4.0.0, timed-out@^4.0.1: +timed-out@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= -tmp-promise@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-1.0.5.tgz#3208d7fa44758f86a2a4c4060f3c33fea30e8038" - integrity sha512-hOabTz9Tp49wCozFwuJe5ISrOqkECm6kzw66XTP23DuzNU7QS/KiZq5LC9Y7QSy8f1rPSLy4bKaViP0OwGI1cA== - dependencies: - bluebird "^3.5.0" - tmp "0.0.33" - -tmp@0.0.33, tmp@^0.0.33: +tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== @@ -9177,11 +8593,6 @@ tmpl@1.0.x: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= - to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -9194,6 +8605,16 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-readable-stream@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-2.1.0.tgz#82880316121bea662cdc226adb30addb50cb06e8" + integrity sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w== + to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -9246,21 +8667,6 @@ traverse-chain@~0.1.0: resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" integrity sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE= -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= - -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= - -trim-off-newlines@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" - integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= - trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -9356,10 +8762,27 @@ type-detect@^4.0.0, type-detect@^4.0.5: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +type-fest@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.10.0.tgz#7f06b2b9fbfc581068d1341ffabd0349ceafc642" + integrity sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw== + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" typedoc-default-themes@^0.5.0: version "0.5.0" @@ -9427,10 +8850,10 @@ typescript@^3.0.1: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.3.tgz#01b70247a6d3c2467f70c45795ef5ea18ce191d5" integrity sha512-+81MUSyX+BaSo+u2RbozuQk/UWx6hfG0a5gHu4ANEM4sU96XbuIyAB+rWBW1u70c6a5QuZfuYICn3s2UjuHUpA== -typescript@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.1.tgz#3362ba9dd1e482ebb2355b02dfe8bcd19a2c7c96" - integrity sha512-Veu0w4dTc/9wlWNf2jeRInNodKlcdLgemvPsrNpfu5Pq39sgfFjvIIgTsvUHCoLBnMhPoUA+tFxsXjU6VexVRQ== +typescript@^3.9.7: + version "3.9.9" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.9.tgz#e69905c54bc0681d0518bd4d587cc6f2d0b1a674" + integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w== uglify-js@^2.6: version "2.8.29" @@ -9505,6 +8928,13 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + unique-temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz#6dce95b2681ca003eebfb304a415f9cbabcc5385" @@ -9522,13 +8952,6 @@ universal-url@^2.0.0: hasurl "^1.0.0" whatwg-url "^7.0.0" -universal-user-agent@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-2.1.0.tgz#5abfbcc036a1ba490cb941f8fd68c46d3669e8e4" - integrity sha512-8itiX7G05Tu3mGDTdNY2fB4KJ8MgZLS54RdG6PkkfwMAavrXu1mV/lls/GABx9O3Rw4PnTtasxrvbMQoBYY92Q== - dependencies: - os-name "^3.0.0" - universal-user-agent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-4.0.0.tgz#27da2ec87e32769619f68a14996465ea1cb9df16" @@ -9536,6 +8959,13 @@ universal-user-agent@^4.0.0: dependencies: os-name "^3.1.0" +universal-user-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-5.0.0.tgz#a3182aa758069bf0e79952570ca757de3579c1d9" + integrity sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q== + dependencies: + os-name "^3.1.0" + universalify@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" @@ -9592,21 +9022,24 @@ update-notifier@2.2.0: semver-diff "^2.0.0" xdg-basedir "^3.0.0" -update-notifier@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" - integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== +update-notifier@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3" + integrity sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew== dependencies: - boxen "^1.2.1" - chalk "^2.0.1" - configstore "^3.0.0" + boxen "^4.2.0" + chalk "^3.0.0" + configstore "^5.0.1" + has-yarn "^2.1.0" import-lazy "^2.1.0" - is-ci "^1.0.10" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" + is-ci "^2.0.0" + is-installed-globally "^0.3.1" + is-npm "^4.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.0.0" + pupa "^2.0.1" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" uri-js@^4.2.2: version "4.2.2" @@ -9620,6 +9053,11 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= +url-join@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" + integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== + url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" @@ -9634,16 +9072,6 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-template@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" - integrity sha1-/FZaPMy/93MMd19WQflVV5FDnyE= - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= - use@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" @@ -9664,16 +9092,21 @@ util.promisify@^1.0.0: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" -uuid@3.3.2, uuid@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== +uuid@7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" + integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== uuid@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" integrity sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g== +uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + validate-npm-package-license@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" @@ -9784,6 +9217,13 @@ which@^1.2.9: dependencies: isexe "^2.0.0" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" @@ -9798,19 +9238,12 @@ widest-line@^1.0.0: dependencies: string-width "^1.0.1" -widest-line@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" - integrity sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM= - dependencies: - string-width "^2.1.1" - -win-release@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/win-release/-/win-release-1.1.1.tgz#5fa55e02be7ca934edfc12665632e849b72e5209" - integrity sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk= +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== dependencies: - semver "^5.0.1" + string-width "^4.0.0" window-size@0.1.0: version "0.1.0" @@ -9878,11 +9311,26 @@ write-file-atomic@^2.4.2: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + xml-name-validator@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" @@ -9913,6 +9361,13 @@ yallist@^3.0.0, yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= +yaml@1.8.3, yaml@^1.7.2: + version "1.8.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.8.3.tgz#2f420fca58b68ce3a332d0ca64be1d191dd3f87a" + integrity sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw== + dependencies: + "@babel/runtime" "^7.8.7" + yargs-parser@10.x, yargs-parser@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" @@ -9920,10 +9375,10 @@ yargs-parser@10.x, yargs-parser@^10.1.0: dependencies: camelcase "^4.1.0" -yargs-parser@11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.0.0.tgz#d9fd0f0cd551a2a2ef9bbf42606ffb6211634232" - integrity sha512-dvsafRjM45h79WOTvS/dP35Sb31SlGAKz6tFjI97kGC4MJFBuzTZY6TTYHrz0QSMQdkyd8Y+RsOMLr+JY0nPFQ== +yargs-parser@18.1.2: + version "18.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1" + integrity sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0"