diff --git a/.github/workflows/add-review-labels.yml b/.github/workflows/add-review-labels.yml new file mode 100644 index 000000000000..12f830e99ec5 --- /dev/null +++ b/.github/workflows/add-review-labels.yml @@ -0,0 +1,11 @@ +name: Add Review Labels +on: pull_request_review +jobs: + reviewer: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: ./actions/add-review-labels + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + AUTO_LABEL_USERS: 'asudoh,emyarod,tw15egan' diff --git a/.yarn/offline-mirror/@actions-core-1.2.3.tgz b/.yarn/offline-mirror/@actions-core-1.2.3.tgz new file mode 100644 index 000000000000..011770174df1 Binary files /dev/null and b/.yarn/offline-mirror/@actions-core-1.2.3.tgz differ diff --git a/.yarn/offline-mirror/@actions-github-2.1.1.tgz b/.yarn/offline-mirror/@actions-github-2.1.1.tgz new file mode 100644 index 000000000000..e8822abc2bf7 Binary files /dev/null and b/.yarn/offline-mirror/@actions-github-2.1.1.tgz differ diff --git a/.yarn/offline-mirror/@actions-http-client-1.0.6.tgz b/.yarn/offline-mirror/@actions-http-client-1.0.6.tgz new file mode 100644 index 000000000000..c11da63099bb Binary files /dev/null and b/.yarn/offline-mirror/@actions-http-client-1.0.6.tgz differ diff --git a/.yarn/offline-mirror/@octokit-graphql-4.3.1.tgz b/.yarn/offline-mirror/@octokit-graphql-4.3.1.tgz new file mode 100644 index 000000000000..faafee39fe95 Binary files /dev/null and b/.yarn/offline-mirror/@octokit-graphql-4.3.1.tgz differ diff --git a/.yarn/offline-mirror/@octokit-plugin-paginate-rest-1.1.2.tgz b/.yarn/offline-mirror/@octokit-plugin-paginate-rest-1.1.2.tgz new file mode 100644 index 000000000000..c8ff66ae93e8 Binary files /dev/null and b/.yarn/offline-mirror/@octokit-plugin-paginate-rest-1.1.2.tgz differ diff --git a/.yarn/offline-mirror/@octokit-plugin-request-log-1.0.0.tgz b/.yarn/offline-mirror/@octokit-plugin-request-log-1.0.0.tgz new file mode 100644 index 000000000000..327a3cda6630 Binary files /dev/null and b/.yarn/offline-mirror/@octokit-plugin-request-log-1.0.0.tgz differ diff --git a/.yarn/offline-mirror/@octokit-plugin-rest-endpoint-methods-2.4.0.tgz b/.yarn/offline-mirror/@octokit-plugin-rest-endpoint-methods-2.4.0.tgz new file mode 100644 index 000000000000..c0f6506a7ce4 Binary files /dev/null and b/.yarn/offline-mirror/@octokit-plugin-rest-endpoint-methods-2.4.0.tgz differ diff --git a/.yarn/offline-mirror/@octokit-request-5.3.2.tgz b/.yarn/offline-mirror/@octokit-request-5.3.2.tgz new file mode 100644 index 000000000000..8fe690f01727 Binary files /dev/null and b/.yarn/offline-mirror/@octokit-request-5.3.2.tgz differ diff --git a/.yarn/offline-mirror/@octokit-rest-16.43.1.tgz b/.yarn/offline-mirror/@octokit-rest-16.43.1.tgz new file mode 100644 index 000000000000..fd05e4ecd7e3 Binary files /dev/null and b/.yarn/offline-mirror/@octokit-rest-16.43.1.tgz differ diff --git a/.yarn/offline-mirror/@octokit-types-2.5.0.tgz b/.yarn/offline-mirror/@octokit-types-2.5.0.tgz new file mode 100644 index 000000000000..760dd306b9e8 Binary files /dev/null and b/.yarn/offline-mirror/@octokit-types-2.5.0.tgz differ diff --git a/.yarn/offline-mirror/fast-glob-3.2.2.tgz b/.yarn/offline-mirror/fast-glob-3.2.2.tgz new file mode 100644 index 000000000000..ed42857d8adb Binary files /dev/null and b/.yarn/offline-mirror/fast-glob-3.2.2.tgz differ diff --git a/.yarn/offline-mirror/tunnel-0.0.6.tgz b/.yarn/offline-mirror/tunnel-0.0.6.tgz new file mode 100644 index 000000000000..aa404742fbff Binary files /dev/null and b/.yarn/offline-mirror/tunnel-0.0.6.tgz differ diff --git a/.yarn/offline-mirror/universal-user-agent-5.0.0.tgz b/.yarn/offline-mirror/universal-user-agent-5.0.0.tgz new file mode 100644 index 000000000000..f414f111b375 Binary files /dev/null and b/.yarn/offline-mirror/universal-user-agent-5.0.0.tgz differ diff --git a/actions/add-review-labels/.npmignore b/actions/add-review-labels/.npmignore new file mode 100644 index 000000000000..81ba1598b971 --- /dev/null +++ b/actions/add-review-labels/.npmignore @@ -0,0 +1,4 @@ +**/__mocks__/** +**/__tests__/** +**/examples/** +**/tasks/** \ No newline at end of file diff --git a/actions/add-review-labels/Dockerfile b/actions/add-review-labels/Dockerfile new file mode 100644 index 000000000000..f58ea3f46913 --- /dev/null +++ b/actions/add-review-labels/Dockerfile @@ -0,0 +1,6 @@ +FROM node:slim + +WORKDIR /usr/src/action +COPY . . +RUN yarn install --production +ENTRYPOINT ["node", "/usr/src/action/index.js"] diff --git a/actions/add-review-labels/action.yml b/actions/add-review-labels/action.yml new file mode 100644 index 000000000000..80795a554eac --- /dev/null +++ b/actions/add-review-labels/action.yml @@ -0,0 +1,12 @@ +name: Add review labels +description: A custom action that adds review labels to a Pull Request +inputs: + GITHUB_TOKEN: + description: A GitHub token to execute GitHub tasks + required: true + AUTO_LABEL_USERS: + description: + Opt-in users who want the ready to merge label automatically applied +runs: + using: 'docker' + image: 'Dockerfile' diff --git a/actions/add-review-labels/index.js b/actions/add-review-labels/index.js new file mode 100644 index 000000000000..f2375260d61a --- /dev/null +++ b/actions/add-review-labels/index.js @@ -0,0 +1,162 @@ +/** + * Copyright IBM Corp. 2020, 2020 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +const github = require('@actions/github'); +const core = require('@actions/core'); + +async function run() { + const { context } = github; + const token = core.getInput('GITHUB_TOKEN', { + required: true, + }); + const autoLabelUsers = core.getInput('AUTO_LABEL_USERS').split(','); + const octokit = new github.GitHub(token); + const { pull_request: pullRequest, repository, review } = context.payload; + const { state, draft } = pullRequest; + + // We only want to work with Pull Requests that are marked as open + if (state !== 'open') { + return; + } + + // We only want to work with Pull Requests that are not draft PRs + if (draft) { + return; + } + + const { + data: permissionLevel, + } = await octokit.repos.getCollaboratorPermissionLevel({ + owner: repository.owner.login, + repo: repository.name, + username: review.user.login, + }); + + // If the reviewer doesn't have one of the following permission levels + // then ignore the event + const acceptedPermissionLevels = new Set(['admin', 'write']); + if (!acceptedPermissionLevels.has(permissionLevel.permission)) { + return; + } + + // If the review was not an approval then we'll ignore the event + if (review.state !== 'approved') { + return; + } + + const { data: allReviews } = await octokit.pulls.listReviews({ + owner: repository.owner.login, + repo: repository.name, + pull_number: pullRequest.number, + per_page: 100, + }); + + // The `listReviews` endpoint will return all of the reviews for the pull + // request. We only care about the most recent reviews so we'll go through the + // list and get the most recent review for each reviewer + const reviewers = {}; + const reviews = []; + + // Process reviews in reverse order since they are listed from oldest to newest + for (const review of allReviews.reverse()) { + const { author_association: association, user } = review; + // If we've already saved a review for this user we already have the most + // recent review + if (reviewers[user.login]) { + continue; + } + + // If the author of the review is not a collaborator we ignore it + if (association !== 'COLLABORATOR') { + continue; + } + + reviewers[user.login] = true; + reviews.push(review); + } + + const approved = reviews.filter(review => { + return review.state === 'APPROVED'; + }); + + const additionalReviewLabel = 'status: one more review 👀'; + const readyForReviewLabel = 'status: ready for review 👀'; + const readyToMergeLabel = 'status: ready to merge 🎉'; + const visualReviewLabel = 'status: visual review 🔍'; + const contentReviewLabel = 'status: content review ✍️'; + const needsReviewLabels = new Set([visualReviewLabel, contentReviewLabel]); + + if (approved.length > 0) { + const hasReadyLabel = pullRequest.labels.find(label => { + return label.name === readyForReviewLabel; + }); + if (hasReadyLabel) { + await octokit.issues.removeLabel({ + owner: repository.owner.login, + repo: repository.name, + issue_number: pullRequest.number, + name: readyForReviewLabel, + }); + } + } + + if (approved.length === 1) { + const hasAdditionalReviewLabel = pullRequest.labels.find(label => { + return label.name === additionalReviewLabel; + }); + if (!hasAdditionalReviewLabel) { + await octokit.issues.addLabels({ + owner: repository.owner.login, + repo: repository.name, + issue_number: pullRequest.number, + labels: [additionalReviewLabel], + }); + } + return; + } + + if (approved.length >= 2) { + const hasAdditionalReviewLabel = pullRequest.labels.find(label => { + return label.name === additionalReviewLabel; + }); + if (hasAdditionalReviewLabel) { + await octokit.issues.removeLabel({ + owner: repository.owner.login, + repo: repository.name, + issue_number: pullRequest.number, + name: additionalReviewLabel, + }); + } + + const allNeedsReviewLabels = pullRequest.labels.filter(label => { + return needsReviewLabels.has(label.name); + }); + if (allNeedsReviewLabels.length > 0) { + return; + } + + const shouldAutoLabel = autoLabelUsers.find(user => { + return user === pullRequest.user.login; + }); + if (shouldAutoLabel) { + await octokit.issues.addLabels({ + owner: repository.owner.login, + repo: repository.name, + issue_number: pullRequest.number, + labels: [readyToMergeLabel], + }); + } + return; + } +} + +run().catch(error => { + console.log(error); + process.exit(1); +}); diff --git a/actions/add-review-labels/package.json b/actions/add-review-labels/package.json new file mode 100644 index 000000000000..56b10a372baa --- /dev/null +++ b/actions/add-review-labels/package.json @@ -0,0 +1,20 @@ +{ + "name": "@carbon/actions-add-review-labels", + "private": true, + "version": "0.0.0", + "license": "Apache-2.0", + "main": "index.js", + "repository": "https://github.com/carbon-design-system/carbon/tree/master/actions/add-review-labels", + "bugs": "https://github.com/carbon-design-system/carbon/issues", + "keywords": [ + "ibm", + "carbon", + "carbon-design-system", + "components", + "react" + ], + "dependencies": { + "@actions/core": "^1.2.3", + "@actions/github": "^2.1.1" + } +} diff --git a/package.json b/package.json index cc1304a20135..0e4ca52b34b3 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ }, "workspaces": { "packages": [ - "packages/*" + "packages/*", + "actions/*" ], "nohoist": [] }, @@ -20,7 +21,7 @@ "doctoc": "doctoc --title '## Table of Contents'", "format": "prettier --write '**/*.{js,md,scss,ts}' '!**/{build,es,lib,storybook,ts,umd}/**'", "format:diff": "prettier --list-different '**/*.{js,md,scss,ts}' '!**/{build,es,lib,storybook,ts,umd}/**' '!packages/components/**'", - "lint": "eslint packages", + "lint": "eslint packages actions", "lint:docs": "alex 'docs/**/*.md' -q", "lint:styles": "stylelint '**/*.{css,scss}' --config ./packages/stylelint-config-elements", "sync": "carbon-cli sync", diff --git a/packages/cli/package.json b/packages/cli/package.json index bc5be29faf9b..2a781c6e0f9c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -26,6 +26,7 @@ "chalk": "^2.4.2", "child-process-promise": "^2.2.1", "clipboardy": "^2.1.0", + "fast-glob": "^3.2.2", "fs-extra": "^8.0.1", "inquirer": "^6.4.1", "prettier": "^1.19.1", diff --git a/packages/cli/src/commands/sync/package.js b/packages/cli/src/commands/sync/package.js index 4f132f37e3cc..d211ad384b13 100644 --- a/packages/cli/src/commands/sync/package.js +++ b/packages/cli/src/commands/sync/package.js @@ -10,7 +10,7 @@ const fs = require('fs-extra'); const REPO_URL_BASE = - 'https://github.com/carbon-design-system/carbon/tree/master/packages'; + 'https://github.com/carbon-design-system/carbon/tree/master'; // This is our default set of keywords to include in each `package.json` packageJson const DEFAULT_KEYWORDS = [ @@ -71,39 +71,44 @@ function sortFields(a, b) { function run({ packagePaths }) { return Promise.all( - packagePaths.map(async ({ basename, packageJsonPath, packageJson }) => { - packageJson.repository = `${REPO_URL_BASE}/${basename}`; - packageJson.bugs = - 'https://github.com/carbon-design-system/carbon/issues'; - packageJson.license = 'Apache-2.0'; - packageJson.publishConfig = { - access: 'public', - }; + packagePaths.map( + async ({ packageJsonPath, packageJson, packageFolder }) => { + packageJson.repository = `${REPO_URL_BASE}/${packageFolder}`; + packageJson.bugs = + 'https://github.com/carbon-design-system/carbon/issues'; + packageJson.license = 'Apache-2.0'; - if (Array.isArray(packageJson.keywords)) { - const keywordsToAdd = DEFAULT_KEYWORDS.filter(keyword => { - return packageJson.keywords.indexOf(keyword) === -1; - }); - if (keywordsToAdd.length > 0) { - packageJson.keywords = [...packageJson.keywords, ...keywordsToAdd]; + if (!packageJson.private) { + packageJson.publishConfig = { + access: 'public', + }; + } + + if (Array.isArray(packageJson.keywords)) { + const keywordsToAdd = DEFAULT_KEYWORDS.filter(keyword => { + return packageJson.keywords.indexOf(keyword) === -1; + }); + if (keywordsToAdd.length > 0) { + packageJson.keywords = [...packageJson.keywords, ...keywordsToAdd]; + } + } else { + packageJson.keywords = DEFAULT_KEYWORDS; } - } else { - packageJson.keywords = DEFAULT_KEYWORDS; - } - // Construct our new packageJson packageJson with sorted fields - const file = Object.keys(packageJson) - .sort(sortFields) - .reduce( - (acc, key) => ({ - ...acc, - [key]: packageJson[key], - }), - {} - ); + // Construct our new packageJson packageJson with sorted fields + const file = Object.keys(packageJson) + .sort(sortFields) + .reduce( + (acc, key) => ({ + ...acc, + [key]: packageJson[key], + }), + {} + ); - await fs.writeJson(packageJsonPath, file, { spaces: 2 }); - }) + await fs.writeJson(packageJsonPath, file, { spaces: 2 }); + } + ) ); } diff --git a/packages/cli/src/workspace.js b/packages/cli/src/workspace.js index 39f34a34f0a5..f5725fb41a2c 100644 --- a/packages/cli/src/workspace.js +++ b/packages/cli/src/workspace.js @@ -9,42 +9,33 @@ const execa = require('execa'); const fs = require('fs-extra'); +const glob = require('fast-glob'); const path = require('path'); const packageJson = require('../../../package.json'); -const denylist = new Set(['.DS_Store']); -const PACKAGES_DIR = path.resolve(__dirname, '../..'); -const packagePaths = fs - .readdirSync(PACKAGES_DIR) - .filter(basename => { - const filename = path.join(PACKAGES_DIR, basename); - if (denylist.has(filename)) { - return false; - } - - const stats = fs.lstatSync(filename); - if (!stats.isDirectory()) { - return false; - } - - return true; - }) - .map(pkg => { - const packageJsonPath = path.join(PACKAGES_DIR, pkg, 'package.json'); +const WORKSPACE_ROOT = path.resolve(__dirname, '../../../'); +const packagePaths = glob + .sync( + packageJson.workspaces.packages.map(pattern => `${pattern}/package.json`) + ) + .map(match => { + const packageJsonPath = path.join(WORKSPACE_ROOT, match); return { - basename: pkg, packageJsonPath, packageJson: fs.readJsonSync(packageJsonPath), - packagePath: path.join(PACKAGES_DIR, pkg), + packagePath: path.dirname(packageJsonPath), + packageFolder: path.relative( + WORKSPACE_ROOT, + path.dirname(packageJsonPath) + ), }; }); const env = { root: { - directory: path.resolve(__dirname, '../../..'), + directory: WORKSPACE_ROOT, packageJson, }, - packagesDir: PACKAGES_DIR, packagePaths, }; diff --git a/yarn.lock b/yarn.lock index 94eb87747e40..d43b9ae357ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,27 @@ # yarn lockfile v1 +"@actions/core@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.3.tgz#e844b4fa0820e206075445079130868f95bfca95" + integrity sha512-Wp4xnyokakM45Uuj4WLUxdsa8fJjKVl1fDTsPbTEcTcuu0Nb26IPQbOtjmnfaCPGcaoPOOqId8H9NapZ8gii4w== + +"@actions/github@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@actions/github/-/github-2.1.1.tgz#bcabedff598196d953f58ba750d5e75549a75142" + integrity sha512-kAgTGUx7yf5KQCndVeHSwCNZuDBvPyxm5xKTswW2lofugeuC1AZX73nUUVDNaysnM9aKFMHv9YCdVJbg7syEyA== + dependencies: + "@actions/http-client" "^1.0.3" + "@octokit/graphql" "^4.3.1" + "@octokit/rest" "^16.43.1" + +"@actions/http-client@^1.0.3": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-1.0.6.tgz#6f9267ca50e1d74d8581f4a894a943cd4c97b49a" + integrity sha512-LGmio4w98UyGX33b/W6V6Nx/sQHRXZ859YlMkn36wPsXPB82u8xTVlA/Dq2DXrm6lEq9RVmisRJa1c+HETAIJA== + dependencies: + tunnel "0.0.6" + "@allmarkedup/fang@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@allmarkedup/fang/-/fang-1.0.0.tgz#20aa2ea365c57b0a28e6b563613270f5630d6883" @@ -2418,11 +2439,40 @@ is-plain-object "^3.0.0" universal-user-agent "^4.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-enterprise-rest@^3.6.1": version "3.6.2" resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-3.6.2.tgz#74de25bef21e0182b4fa03a8678cd00a4e67e561" integrity sha512-3wF5eueS5OHQYuAEudkpN+xVeUsg8vYEMMenEzLphUZ7PRZ8OJtDcsreL3ad9zxXmBbaFWzLmFcdob5CLyZftA== +"@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" + integrity sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q== + 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" + integrity sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw== + +"@octokit/plugin-rest-endpoint-methods@2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz#3288ecf5481f68c494dd0602fc15407a59faf61e" + integrity sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ== + dependencies: + "@octokit/types" "^2.0.1" + deprecation "^2.3.1" + "@octokit/plugin-retry@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-2.2.0.tgz#11f3957a46ccdb7b7f33caabf8c17e57b25b80b2" @@ -2460,6 +2510,20 @@ once "^1.4.0" universal-user-agent "^4.0.0" +"@octokit/request@^5.3.0": + version "5.3.2" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.3.2.tgz#1ca8b90a407772a1ee1ab758e7e0aced213b9883" + integrity sha512-7NPJpg19wVQy1cs2xqXjjRq/RmtSomja/VSWnptfYwuBxLdbYh2UjhGi0Wx7B1v5Iw5GKhfFDQL7jM7SSp7K2g== + dependencies: + "@octokit/endpoint" "^5.5.0" + "@octokit/request-error" "^1.0.1" + "@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@^16.28.1", "@octokit/rest@^16.28.4": version "16.38.3" resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.38.3.tgz#d5d200f88962392f71e048e12833ea36f4e0d192" @@ -2479,6 +2543,28 @@ once "^1.4.0" universal-user-agent "^4.0.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== + dependencies: + "@octokit/auth-token" "^2.4.0" + "@octokit/plugin-paginate-rest" "^1.1.1" + "@octokit/plugin-request-log" "^1.0.0" + "@octokit/plugin-rest-endpoint-methods" "2.4.0" + "@octokit/request" "^5.2.0" + "@octokit/request-error" "^1.0.2" + atob-lite "^2.0.0" + before-after-hook "^2.0.0" + btoa-lite "^1.0.0" + deprecation "^2.0.0" + lodash.get "^4.4.2" + lodash.set "^4.3.2" + lodash.uniq "^4.5.0" + octokit-pagination-methods "^1.1.0" + once "^1.4.0" + universal-user-agent "^4.0.0" + "@octokit/types@^2.0.0": version "2.1.1" resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.1.1.tgz#77e80d1b663c5f1f829e5377b728fa3c4fe5a97d" @@ -2486,6 +2572,13 @@ dependencies: "@types/node" ">= 8" +"@octokit/types@^2.0.1": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.5.0.tgz#f1bbd147e662ae2c79717d518aac686e58257773" + integrity sha512-KEnLwOfdXzxPNL34fj508bhi9Z9cStyN7qY1kOfVahmqtAfrWw6Oq3P4R+dtsg0lYtZdWBpUrS/Ixmd5YILSww== + dependencies: + "@types/node" ">= 8" + "@reach/router@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@reach/router/-/router-1.2.1.tgz#34ae3541a5ac44fa7796e5506a5d7274a162be4e" @@ -8253,7 +8346,7 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= -deprecation@^2.0.0: +deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== @@ -9960,6 +10053,18 @@ fast-glob@^3.0.3, fast-glob@^3.1.1: merge2 "^1.3.0" micromatch "^4.0.2" +fast-glob@^3.2.2: + 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-parse@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d" @@ -17715,7 +17820,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7: +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7, picomatch@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== @@ -23134,6 +23239,11 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +tunnel@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" @@ -23563,6 +23673,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.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"