chore: add script to pull commits to cherrypick (#16637)

* chore: add script to pull commits to cherrypick

* lint
This commit is contained in:
Andrew Seguin
2019-08-08 15:32:41 -07:00
committed by mmalerba
parent 2994365a8e
commit 917871b423
8 changed files with 384 additions and 38 deletions
+3 -2
View File
@@ -32,7 +32,8 @@
"preinstall": "node ./tools/npm/check-npm.js",
"format:ts": "git-clang-format HEAD $(git diff HEAD --name-only | grep -v \"\\.d\\.ts\")",
"format:bazel": "yarn -s bazel:buildifier --lint=fix --mode=fix",
"format": "yarn -s format:ts && yarn -s format:bazel"
"format": "yarn -s format:ts && yarn -s format:bazel",
"cherry-pick-patch": "ts-node --project tools/cherry-pick-patch/ tools/cherry-pick-patch/cherry-pick-patch.ts"
},
"version": "8.1.2",
"requiredAngularVersion": "^8.0.0 || ^9.0.0-0",
@@ -72,7 +73,7 @@
"@bazel/karma": "0.32.2",
"@bazel/typescript": "0.32.2",
"@firebase/app-types": "^0.3.2",
"@octokit/rest": "^15.9.4",
"@octokit/rest": "^16.28.7",
"@schematics/angular": "^8.0.3",
"@types/browser-sync": "^0.0.42",
"@types/chalk": "^0.4.31",
@@ -0,0 +1,53 @@
import {GitHub} from './github';
import {outputResults} from './output-results';
import {
requestLatestCherryPickedCommitSha,
requestPatchBranch,
verifyLatestCherryPickedCommit
} from './prompt';
/**
* Task to run the script that attempts to produce cherry-pick commands for the patch branch.
*/
class CherryPickPatchTask {
github = new GitHub();
async run() {
const patchBranchSuggestion = await this.github.getPatchBranchSuggestion();
const branch = await requestPatchBranch(patchBranchSuggestion);
const sha = await this.getLatestCherryPickedCommitSha(branch);
const commit = await this.github.getCommit(sha);
const pullRequests = await this.github.getPatchPullRequestsSince(commit.commit.author.date);
outputResults(pullRequests);
}
/** Returns the commit SHA of the last cherry-picked commit on master. */
async getLatestCherryPickedCommitSha(branch: any): Promise<string> {
const commits = await this.github.listCommits(branch);
/** Gets the SHA from the string: "(cherry picked from commit 4c6eeb9aba73d3)" */
const regexp = new RegExp('cherry picked from commit (.*[^)])');
const latestShas = commits
.map(d => {
const result = d.commit.message.match(regexp);
return result ? result[1] : null;
})
.filter(d => !!d);
const latestSha = latestShas[0];
if (!latestSha) {
return await requestLatestCherryPickedCommitSha();
} else {
const commit = await this.github.getCommit(latestSha);
return await verifyLatestCherryPickedCommit(commit);
}
}
}
/** Entry-point for the script. */
if (require.main === module) {
new CherryPickPatchTask().run();
}
+88
View File
@@ -0,0 +1,88 @@
import * as OctokitApi from '@octokit/rest';
// TODO: Consider using local git information for the data to avoid worrying about rate limits. */
/** Class to act as an interface to the GitHub API. */
export class GitHub {
// TODO: Use an authentication token to increase rate limits.
/** Octokit API instance that can be used to make Github API calls. */
private _api = new OctokitApi();
/** Owner of the repository to query. */
private _owner = 'angular';
/** Name of the repository to query. */
private _name = 'components';
/**
* Retrieves merged patch-eligible pull requests that have been merged since the date.
* Results are sorted by merge date.
*/
async getPatchPullRequestsSince(dateSince: string): Promise<OctokitApi.PullsGetResponse[]> {
const query = 'base:master is:pr -label:"target: minor" -label:"target: major" is:merged' +
` merged:>${dateSince}`;
const result = await this._search(query);
// Load information for each pull request. Waits for each pull request response until loading
// the next pull request to avoid GitHub's abuse detection (too many calls in a short amount
// of time).
const pullRequests: OctokitApi.PullsGetResponse[] = [];
for (let i = 0; i < result.items.length; i++) {
pullRequests.push(await this.loadPullRequest(result.items[i].number));
}
// Sort by merge date.
pullRequests.sort((a, b) => (a.merged_at < b.merged_at) ? -1 : 1);
return pullRequests;
}
/** Loads the information for the provided pull request number. */
async loadPullRequest(prNumber: number): Promise<OctokitApi.PullsGetResponse> {
const response = await this._api.pulls.get({
owner: this._owner,
repo: this._name,
pull_number: prNumber,
});
return response.data;
}
/** Gets the commit information for the given SHA. */
async getCommit(sha: string): Promise<OctokitApi.ReposGetCommitResponse> {
const response = await this._api.repos.getCommit({
owner: this._owner,
repo: this._name,
ref: sha,
});
return response.data;
}
/** Retrieves the list of latest commits from the branch. */
async listCommits(branch: string): Promise<OctokitApi.ReposListCommitsResponse> {
const response = await this._api.repos.listCommits({
owner: this._owner,
repo: this._name,
sha: branch,
});
return response.data;
}
// TODO: Handle pagination in case there are more than 100 results.
/** Gets a suggestion for the latest patch branch. */
async getPatchBranchSuggestion(): Promise<string> {
const response = await this._api.repos.listBranches({owner: this._owner, repo: this._name});
// Matches branch names that have two digits separated by period and ends with an x
const patchBranches =
response.data.map(branch => branch.name).filter(name => !!/^\d+\.\d+\.x$/g.exec(name));
return patchBranches.pop() || '';
}
// TODO: Handle pagination in case there are more than 100 results.
/** Searches the repository using the provided query. */
private async _search(query: string): Promise<{items: any[]}> {
const scopedQuery = `repo:${this._owner}/${this._name} ${query}`;
const result = await this._api.search.issuesAndPullRequests({per_page: 100, q: scopedQuery});
return result.data;
}
}
+34
View File
@@ -0,0 +1,34 @@
import {PullsGetResponse} from '@octokit/rest';
import {cyan} from 'chalk';
/** Outputs the information of the pull requests to be cherry-picked and the commands to run. */
export function outputResults(pullRequests: PullsGetResponse[]) {
if (!pullRequests.length) {
console.log('No pull requests need to be cherry-picked');
return;
}
console.log();
console.log(cyan('------------------------'));
console.log(cyan(' Results '));
console.log(cyan('------------------------'));
console.log();
pullRequests.forEach(p => {
const data = [p.number, p.merged_at, p.merge_commit_sha, p.html_url, p.title];
console.log(data.join('\t'));
});
console.log();
console.log(cyan('------------------------'));
console.log(cyan(' Cherry Pick Commands'));
console.log(cyan('------------------------'));
pullRequests.forEach((pr, index) => {
if (index % 5 === 0) {
console.log();
}
console.log(`git cherry-pick -x ${pr.merge_commit_sha};`);
});
}
+43
View File
@@ -0,0 +1,43 @@
import {prompt} from 'inquirer';
import * as OctokitApi from '@octokit/rest';
/** Requests the user to provide the name of the patch branch. */
export async function requestPatchBranch(suggestion: string): Promise<string> {
const result = await prompt<{branch: string}>([{
type: 'input',
name: 'branch',
message: `What is the name of the current patch branch?`,
default: suggestion || null,
}]);
return result.branch;
}
/** Confirms the latest cherry-picked commit on master; requests one if not confirmed. */
export async function verifyLatestCherryPickedCommit(commit: OctokitApi.ReposGetCommitResponse) {
console.log(`\nThe last cherry-picked commit on master is "${commit.commit.message}"`);
const result = await prompt<{confirm: boolean}>([{
type: 'confirm',
name: 'confirm',
message: `Is this correct?`,
default: true,
}]);
if (!result.confirm) {
return await requestLatestCherryPickedCommitSha();
} else {
return commit.sha;
}
}
/** Requests the SHA of the latest cherry picked commit on master. */
export async function requestLatestCherryPickedCommitSha(): Promise<string> {
const result = await prompt<{sha: string}>([{
type: 'input',
name: 'sha',
message: `What is the SHA of the latest cherry-picked commit on master?`,
}]);
return result.sha;
}
+7
View File
@@ -0,0 +1,7 @@
{
"compilerOptions": {
"lib": ["es2016"],
"types": ["node"],
"strictNullChecks": true
}
}
+156 -36
View File
@@ -1007,19 +1007,54 @@
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
"@octokit/rest@^15.9.4":
version "15.18.0"
resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.18.0.tgz#e6de702b57dec94c71e806f1cff0ecb9725b3054"
integrity sha512-D1dDJMbvT4dok9++vc8uwCr92ndadwfz6vHK+IklzBHKSsuLlhpv2/dzx97Y4aRlm0t74LeXKDp4j0b4M2vmQw==
"@octokit/endpoint@^5.1.0":
version "5.3.2"
resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-5.3.2.tgz#2deda2d869cac9ba7f370287d55667be2a808d4b"
integrity sha512-gRjteEM9I6f4D8vtwU2iGUTn9RX/AJ0SVXiqBUEuYEWVGGAVjSXdT0oNmghH5lvQNWs8mwt6ZaultuG6yXivNw==
dependencies:
before-after-hook "^1.1.0"
deepmerge "4.0.0"
is-plain-object "^3.0.0"
universal-user-agent "^3.0.0"
url-template "^2.0.8"
"@octokit/request-error@^1.0.1", "@octokit/request-error@^1.0.2":
version "1.0.4"
resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.0.4.tgz#15e1dc22123ba4a9a4391914d80ec1e5303a23be"
integrity sha512-L4JaJDXn8SGT+5G0uX79rZLv0MNJmfGa4vb4vy1NnpjSnWDLJRy6m90udGwvMmavwsStgbv2QNkPzzTCMmL+ig==
dependencies:
deprecation "^2.0.0"
once "^1.4.0"
"@octokit/request@^5.0.0":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.0.2.tgz#59a920451f24811c016ddc507adcc41aafb2dca5"
integrity sha512-z1BQr43g4kOL4ZrIVBMHwi68Yg9VbkRUyuAgqCp1rU3vbYa69+2gIld/+gHclw15bJWQnhqqyEb7h5a5EqgZ0A==
dependencies:
"@octokit/endpoint" "^5.1.0"
"@octokit/request-error" "^1.0.1"
deprecation "^2.0.0"
is-plain-object "^3.0.0"
node-fetch "^2.3.0"
once "^1.4.0"
universal-user-agent "^3.0.0"
"@octokit/rest@^16.28.7":
version "16.28.7"
resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.28.7.tgz#a2c2db5b318da84144beba82d19c1a9dbdb1a1fa"
integrity sha512-cznFSLEhh22XD3XeqJw51OLSfyL2fcFKUO+v2Ep9MTAFfFLS1cK1Zwd1yEgQJmJoDnj4/vv3+fGGZweG+xsbIA==
dependencies:
"@octokit/request" "^5.0.0"
"@octokit/request-error" "^1.0.2"
atob-lite "^2.0.0"
before-after-hook "^2.0.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"
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 "^3.0.0"
url-template "^2.0.8"
"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
@@ -1593,7 +1628,7 @@ agent-base@2:
extend "~3.0.0"
semver "~5.0.1"
agent-base@4, agent-base@^4.1.0:
agent-base@^4.1.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==
@@ -1997,6 +2032,11 @@ asynckit@^0.4.0:
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
atob-lite@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696"
integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=
atob@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
@@ -2145,10 +2185,10 @@ beeper@^1.0.0:
resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809"
integrity sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=
before-after-hook@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.2.0.tgz#1079c10312cd4d4ad0d1676d37951ef8bfc3a563"
integrity sha512-wI3QtdLppHNkmM1VgRVLCrlWCKk/YexlPicYbXPs4eYdd1InrUCTFsx5bX1iUQzzMsoRXXPpM1r+p7JEJJydag==
before-after-hook@^2.0.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==
better-assert@~1.0.0:
version "1.0.2"
@@ -2913,6 +2953,15 @@ cliui@^4.0.0:
strip-ansi "^4.0.0"
wrap-ansi "^2.0.0"
cliui@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
dependencies:
string-width "^3.1.0"
strip-ansi "^5.2.0"
wrap-ansi "^5.1.0"
clone-regexp@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f"
@@ -3574,7 +3623,7 @@ debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
dependencies:
ms "2.0.0"
debug@3.1.0, debug@=3.1.0, debug@~3.1.0:
debug@=3.1.0, debug@~3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
@@ -3642,6 +3691,11 @@ deep-is@~0.1.3:
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
deepmerge@4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.0.0.tgz#3e3110ca29205f120d7cb064960a39c3d2087c09"
integrity sha512-YZ1rOP5+kHor4hMAH+HRQnBQHg+wvS1un1hAOuIcxcBy0hzcUf6Jg2a1w65kpoOUnurOfZbERwjI1TfZxNjcww==
deepmerge@^2.0.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170"
@@ -3731,6 +3785,11 @@ deprecated@^0.0.1:
resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19"
integrity sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=
deprecation@^2.0.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919"
integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
destroy@^1.0.4, destroy@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
@@ -6012,14 +6071,6 @@ http-parser-js@>=0.4.0:
resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8"
integrity sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==
http-proxy-agent@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==
dependencies:
agent-base "4"
debug "3.1.0"
http-proxy@1.15.2:
version "1.15.2"
resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.15.2.tgz#642fdcaffe52d3448d2bda3b0079e9409064da31"
@@ -6068,7 +6119,7 @@ https-proxy-agent@1.0.0:
debug "2"
extend "3"
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==
@@ -6603,6 +6654,13 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
is-plain-object@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928"
integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==
dependencies:
isobject "^4.0.0"
is-posix-bracket@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
@@ -6765,6 +6823,11 @@ isobject@^3.0.0, isobject@^3.0.1:
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
isobject@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0"
integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==
isstream@0.1.x, isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
@@ -7461,7 +7524,7 @@ lodash.escape@~2.4.1:
lodash._reunescapedhtml "~2.4.1"
lodash.keys "~2.4.1"
lodash.get@^4.0.0:
lodash.get@^4.0.0, lodash.get@^4.4.2:
version "4.4.2"
resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
@@ -7576,6 +7639,11 @@ lodash.restparam@^3.0.0:
resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=
lodash.set@^4.3.2:
version "4.3.2"
resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23"
integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=
lodash.template@^2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d"
@@ -7640,6 +7708,11 @@ lodash.unescape@4.0.1:
resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=
lodash.uniq@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
lodash.values@^2.4.1, lodash.values@~2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4"
@@ -8423,10 +8496,10 @@ no-case@^2.2.0:
dependencies:
lower-case "^1.1.1"
node-fetch@^2.1.1:
version "2.3.0"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5"
integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==
node-fetch@^2.3.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
node-forge@^0.7.1, node-forge@^0.7.4:
version "0.7.6"
@@ -8743,6 +8816,11 @@ objectdiff@^1.1.0:
resolved "https://registry.yarnpkg.com/objectdiff/-/objectdiff-1.1.0.tgz#8d7a15be6cb8670df8a490cc6be12a4f05ea82f4"
integrity sha1-jXoVvmy4Zw34pJDMa+EqTwXqgvQ=
octokit-pagination-methods@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4"
integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==
on-finished@^2.2.0, on-finished@~2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
@@ -11101,6 +11179,15 @@ string-width@^3.0.0:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^5.0.0"
string-width@^3.1.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.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff"
@@ -11181,7 +11268,7 @@ strip-ansi@^5.0.0:
dependencies:
ansi-regex "^4.0.0"
strip-ansi@^5.2.0:
strip-ansi@^5.1.0, strip-ansi@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
@@ -12022,10 +12109,10 @@ universal-analytics@^0.4.16:
request "^2.88.0"
uuid "^3.0.0"
universal-user-agent@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-2.0.2.tgz#b0322da546100c658adcf4965110a56ed238aee6"
integrity sha512-nOwvHWLH3dBazyuzbECPA5uVFNd7AlgviXRHgR4yf48QqitIvpdncRrxMbZNMpPPEfgz30I9ubd1XmiJiqsTrg==
universal-user-agent@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-3.0.0.tgz#4cc88d68097bffd7ac42e3b7c903e7481424b4b9"
integrity sha512-T3siHThqoj5X0benA5H0qcDnrKGXzU8TKoX15x/tQHw1hQBvIEBHjxQ2klizYsqBOO/Q+WuxoQUihadeeqDnoA==
dependencies:
os-name "^3.0.0"
@@ -12556,6 +12643,15 @@ wrap-ansi@^2.0.0:
string-width "^1.0.1"
strip-ansi "^3.0.1"
wrap-ansi@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
dependencies:
ansi-styles "^3.2.0"
string-width "^3.0.0"
strip-ansi "^5.0.0"
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
@@ -12694,6 +12790,14 @@ yargs-parser@^13.0.0:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^13.1.1:
version "13.1.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"
integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^4.1.0, yargs-parser@^4.2.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
@@ -12807,6 +12911,22 @@ yargs@^11.0.0:
y18n "^3.2.1"
yargs-parser "^9.0.2"
yargs@^13.3.0:
version "13.3.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83"
integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==
dependencies:
cliui "^5.0.0"
find-up "^3.0.0"
get-caller-file "^2.0.1"
require-directory "^2.1.1"
require-main-filename "^2.0.0"
set-blocking "^2.0.0"
string-width "^3.0.0"
which-module "^2.0.0"
y18n "^4.0.0"
yargs-parser "^13.1.1"
yargs@^3.32.0:
version "3.32.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995"