diff --git a/extensions/git-extended/package.json b/extensions/git-extended/package.json index b77208add65..60245e1fde9 100644 --- a/extensions/git-extended/package.json +++ b/extensions/git-extended/package.json @@ -42,14 +42,14 @@ "compile": "tsc -watch -p ./" }, "devDependencies": { - "typescript": "^2.1.4", - "@types/node": "*" + "typescript": "^2.1.4", + "@types/node": "*" }, "dependencies": { + "@octokit/rest": "^15.2.6", "dugite": "^1.28.0", - "tmp": "^0.0.31", - "octokat": "^0.8.0", - "request": "^2.81.0", - "lodash": "4.17.5" + "git-credential-node": "^1.1.0", + "lodash": "4.17.5", + "tmp": "^0.0.31" } } diff --git a/extensions/git-extended/src/common/diff.ts b/extensions/git-extended/src/common/diff.ts index 8f21b6c2ad8..c8f51b20258 100644 --- a/extensions/git-extended/src/common/diff.ts +++ b/extensions/git-extended/src/common/diff.ts @@ -14,9 +14,9 @@ export const DELETE_FILE_INFO = /diff --git a\/(\S+) b\/(\S+).*\n*deleted file m export const DIFF_HUNK_INFO = /@@ \-(\d+)(,(\d+))?( \+(\d+)(,(\d+)?))? @@/; -async function parseModifiedHunkComplete(originalContent, modifyDiffInfo, a, b) { +async function parseModifiedHunkComplete(originalContent, patch, a, b) { let left = originalContent.split(/\r|\n|\r\n/); - let diffHunks = modifyDiffInfo[3].split('\n'); + let diffHunks = patch.split('\n'); diffHunks.pop(); // there is one additional line break at the end of the diff ?? let right = []; @@ -82,56 +82,24 @@ async function parseModifiedHunkFast(modifyDiffInfo, a, b) { return new RichFileChange(contentPath, originalContentPath, GitChangeType.MODIFY, b); } -export async function parseDiff(text: string, repository: Repository, parentCommit: string) { - let reg = /diff((?!diff).*\n*)*/g; - let match = reg.exec(text); +export async function parseDiff(reviews: any[], repository: Repository, parentCommit: string) { let richFileChanges: RichFileChange[] = []; - - while (match) { - let singleFileDiff = match[0]; - let modifyDiffInfo = MODIFY_DIFF_INFO.exec(singleFileDiff); - if (modifyDiffInfo) { - let a = modifyDiffInfo[1]; - let b = modifyDiffInfo[2]; + for (let i = 0; i < reviews.length; i++) { + let review = reviews[i]; + if (review.status === 'modified') { + let fileName = review.filename; try { - let originalContent = await getFileContent(repository.path, parentCommit, a); - let richFileChange = await parseModifiedHunkComplete(originalContent, modifyDiffInfo, a, b); + let originalContent = await getFileContent(repository.path, parentCommit, fileName); + let richFileChange = await parseModifiedHunkComplete(originalContent, review.patch, fileName, fileName); richFileChanges.push(richFileChange); } catch (e) { - let richFileChange = await parseModifiedHunkFast(modifyDiffInfo, a, b); + let richFileChange = await parseModifiedHunkFast(review.patch, fileName, fileName); richFileChanges.push(richFileChange); } - - match = reg.exec(text); - continue; - } - - let newDiffInfo = NEW_FILE_INFO.exec(singleFileDiff); - if (newDiffInfo) { - let fileName = newDiffInfo[1]; - let diffHunks = newDiffInfo[3].split('\n'); - let contentArray = []; - for (let i = 0; i < diffHunks.length; i++) { - if (/@@ \-(\d+)(,(\d+))?( \+(\d+)(,(\d+)?))? @@$/.test(diffHunks[i])) { - continue; - } else if (/@@ \-(\d+)(,(\d+))?( \+(\d+)(,(\d+)?))? @@ /.test(diffHunks[i])) { - contentArray.push(diffHunks[i].replace(/@@ \-(\d+)(,(\d+))?( \+(\d+)(,(\d+)?))? @@ /, '')); - } else if (/^\+/.test(diffHunks[i])) { - contentArray.push(diffHunks[i].substr(1)); - } - } - let filePath = await writeTmpFile(contentArray.join('\n'), path.extname(fileName)); - let richFileChange = new RichFileChange(filePath, filePath, GitChangeType.ADD, fileName); - richFileChanges.push(richFileChange); - match = reg.exec(text); - continue; - } - - let deleteDiffInfo = DELETE_FILE_INFO.exec(singleFileDiff); - if (deleteDiffInfo) { - let fileName = deleteDiffInfo[1]; - let diffHunks = deleteDiffInfo[3].split('\n'); + } else if (review.status === 'removed') { + let fileName = review.filename; + let diffHunks = review.patch.split('\n'); let contentArray = []; for (let i = 0; i < diffHunks.length; i++) { if (/@@ \-(\d+)(,(\d+))?( \+(\d+)(,(\d+)?))? @@$/.test(diffHunks[i])) { @@ -146,11 +114,25 @@ export async function parseDiff(text: string, repository: Repository, parentComm let filePath = await writeTmpFile('', path.extname(fileName)); let richFileChange = new RichFileChange(filePath, originalFilePath, GitChangeType.DELETE, fileName); richFileChanges.push(richFileChange); - match = reg.exec(text); - continue; + } else { + // added + let fileName = review.filename; + let diffHunks = review.patch.split('\n'); + let contentArray = []; + for (let i = 0; i < diffHunks.length; i++) { + if (/@@ \-(\d+)(,(\d+))?( \+(\d+)(,(\d+)?))? @@$/.test(diffHunks[i])) { + continue; + } else if (/@@ \-(\d+)(,(\d+))?( \+(\d+)(,(\d+)?))? @@ /.test(diffHunks[i])) { + contentArray.push(diffHunks[i].replace(/@@ \-(\d+)(,(\d+))?( \+(\d+)(,(\d+)?))? @@ /, '')); + } else if (/^\+/.test(diffHunks[i])) { + contentArray.push(diffHunks[i].substr(1)); + } + } + let oriFilePath = await writeTmpFile('', path.extname(fileName)); + let filePath = await writeTmpFile(contentArray.join('\n'), path.extname(fileName)); + let richFileChange = new RichFileChange(filePath, oriFilePath, GitChangeType.ADD, fileName); + richFileChanges.push(richFileChange); } - match = reg.exec(text); } - return richFileChanges; } \ No newline at end of file diff --git a/extensions/git-extended/src/common/models/remote.ts b/extensions/git-extended/src/common/models/remote.ts index 6307da9fbe4..0deab009ce5 100644 --- a/extensions/git-extended/src/common/models/remote.ts +++ b/extensions/git-extended/src/common/models/remote.ts @@ -3,29 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -/* -------------------------------------------------------------------------------------------- - * Includes code from github/desktop, obtained from - * https://github.com/desktop/desktop/blob/master/app/src/models/remote.ts - * ------------------------------------------------------------------------------------------ */ - -export interface IRemote { - readonly name: string; - readonly url: string; -} - -export interface IGitRemoteURL { - /** The hostname of the remote. */ - readonly hostname: string; - - /** - * The owner of the GitHub repository. This will be null if the URL doesn't - * take the form of a GitHub repository URL (e.g., owner/name). - */ - readonly owner: string | null; - - /** - * The name of the GitHub repository. This will be null if the URL doesn't - * take the form of a GitHub repository URL (e.g., owner/name). - */ - readonly name: string | null; +export class Remote { + constructor( + public readonly url: string, + public readonly hostname: string, + public readonly owner: string, + public readonly name: string + ) { } } diff --git a/extensions/git-extended/src/common/models/repository.ts b/extensions/git-extended/src/common/models/repository.ts index 38651f4c09c..4b0a5582d21 100644 --- a/extensions/git-extended/src/common/models/repository.ts +++ b/extensions/git-extended/src/common/models/repository.ts @@ -3,14 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IGitRemoteURL } from './remote'; +import { Remote } from './remote'; export class Repository { public path: string; - public remotes: IGitRemoteURL[]; + public remotes: Remote[]; - constructor(path: string, remotes: IGitRemoteURL[]) { + constructor(path: string, remotes: Remote[]) { this.path = path; this.remotes = remotes; } diff --git a/extensions/git-extended/src/common/remote.ts b/extensions/git-extended/src/common/remote.ts index 1dac56c6bdb..f0c4d814140 100644 --- a/extensions/git-extended/src/common/remote.ts +++ b/extensions/git-extended/src/common/remote.ts @@ -8,7 +8,7 @@ * https://github.com/desktop/desktop/blob/master/app/src/lib/git/remote.ts * ------------------------------------------------------------------------------------------ */ import { GitProcess } from 'dugite'; -import { IGitRemoteURL } from './models/remote'; +import { Remote } from './models/remote'; export async function getRemotes( path: string @@ -25,7 +25,7 @@ export async function getRemotes( } /** Parse the remote information from URL. */ -export function parseRemote(url: string): IGitRemoteURL | null { +export function parseRemote(url: string): Remote | null { // Examples: // https://github.com/octocat/Hello-World.git // https://github.com/octocat/Hello-World.git/ @@ -48,7 +48,7 @@ export function parseRemote(url: string): IGitRemoteURL | null { const owner = result[2]; const name = result[3]; if (hostname) { - return { hostname, owner, name }; + return new Remote(url, hostname, owner, name); } } diff --git a/extensions/git-extended/src/prProvider.ts b/extensions/git-extended/src/prProvider.ts index 559bc57accb..362d4853e24 100644 --- a/extensions/git-extended/src/prProvider.ts +++ b/extensions/git-extended/src/prProvider.ts @@ -4,16 +4,19 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -const Octokat = require('octokat'); import * as path from 'path'; -import * as request from 'request'; import { parseDiff, DIFF_HUNK_INFO } from './common/diff'; import { GitChangeType } from './common/models/file'; import { Repository } from './common//models/repository'; import { Comment } from './common/models/comment'; import * as _ from 'lodash'; +import { fill } from 'git-credential-node'; +const Octokit = require('@octokit/rest'); + export class PullRequest { - constructor(public octoPRItem: any) { } + public comments?: Comment[]; + public fileChanges?: FileChangeItem[]; + constructor(public readonly otcokit: any, public readonly owner: string, public readonly repo: string, public prItem: any) { } } export class FileChangeItem implements vscode.TreeItem { @@ -26,6 +29,7 @@ export class FileChangeItem implements vscode.TreeItem { public comments?: any[]; constructor( + public readonly rItem: any, public readonly label: string, public readonly status: GitChangeType, public readonly context: vscode.ExtensionContext, @@ -35,29 +39,11 @@ export class FileChangeItem implements vscode.TreeItem { } public populateCommandArgs() { - if (this.status === GitChangeType.MODIFY) { - this.command = { - title: 'show diff', - command: ShowDiffCommand.id, - arguments: [this] - }; - } else if (this.status === GitChangeType.DELETE) { - this.command = { - title: 'show diff', - command: 'vscode.open', - arguments: [ - vscode.Uri.file(path.resolve(this.workspaceRoot, this.parentFilePath)) - ] - }; - } else { - this.command = { - title: 'show diff', - command: 'vscode.open', - arguments: [ - vscode.Uri.file(path.resolve(this.workspaceRoot, this.filePath)) - ] - }; - } + this.command = { + title: 'show diff', + command: ShowDiffCommand.id, + arguments: [this] + }; } } @@ -72,17 +58,42 @@ class ShowDiffCommand { } } +class CredentialStore { + private octokits: { [key: string]: any }; + constructor() { + this.octokits = []; + } + + async getOctokit(url: string) { + if (this.octokits[url]) { + return this.octokits[url]; + } + const data = await fill(url); + this.octokits[url] = Octokit({ + debug: true + }); + + this.octokits[url].authenticate({ + type: 'basic', + username: data.username, + password: data.password + }); + + return this.octokits[url]; + } +} + export class PRProvider implements vscode.TreeDataProvider, vscode.CommentProvider { private _fileChanges: FileChangeItem[]; private _comments?: Comment[]; private context: vscode.ExtensionContext; private workspaceRoot: string; private repository: Repository; - private octo: any; private icons: any; + private crendentialStore: CredentialStore; constructor() { - this.octo = new Octokat(); + this.crendentialStore = new CredentialStore(); } activate(context: vscode.ExtensionContext, workspaceRoot: string, repository: Repository) { @@ -122,7 +133,7 @@ export class PRProvider implements vscode.TreeDataProvider | FileChangeItem[] | Thenable { if (element) { - return new Promise((resolve, rxeject) => { - request({ - followAllRedirects: true, - url: element.octoPRItem.diffUrl - }, async (error, response, body) => { - // map comments to FileChangeItem - // registerCommentProvider - const rawComments = await element.octoPRItem.reviewComments.fetch(); - const comments: Comment[] = parseComments(rawComments.items); - let richContentChanges = await parseDiff(body, this.repository, element.octoPRItem.base.sha); - let fileChanges = richContentChanges.map(change => { - let changedItem = new FileChangeItem(change.fileName ? change.fileName : change.filePath, change.status, this.context, change.fileName, this.workspaceRoot); - changedItem.filePath = change.filePath; - changedItem.parentFilePath = change.originalFilePath; - changedItem.populateCommandArgs(); - return changedItem; - }); - this._fileChanges = fileChanges; - this._comments = comments; - resolve(fileChanges); + return element.otcokit.pullRequests.getFiles({ + owner: element.owner, + repo: element.repo, + number: element.prItem.number + }).then(async ({ data }) => { + const reviewData = await element.otcokit.pullRequests.getComments({ + owner: element.owner, + repo: element.repo, + number: element.prItem.number }); + const rawComments = reviewData.data; + const comments: Comment[] = parseComments(rawComments); + let richContentChanges = await parseDiff(data, this.repository, element.prItem.base.sha); + let fileChanges = richContentChanges.map(change => { + let changedItem = new FileChangeItem(element.prItem, change.fileName, change.status, this.context, change.fileName, this.workspaceRoot); + changedItem.filePath = change.filePath; + changedItem.parentFilePath = change.originalFilePath; + changedItem.comments = comments.filter(comment => comment.path === changedItem.fileName); + changedItem.populateCommandArgs(); + return changedItem; + }); + this._fileChanges = fileChanges; + this._comments = comments; + return fileChanges; }); } else { if (this.repository.remotes && this.repository.remotes.length > 0) { - let promises = this.repository.remotes.map(remote => this.octo.repos(remote.owner, remote.name).pulls.fetch().then(prs => { - return prs.items.map(item => new PullRequest(item)); - })); + let promises = this.repository.remotes.map(remote => { + return this.crendentialStore.getOctokit(remote.url).then(octo => { + return octo.pullRequests.getAll({ + owner: remote.owner, + repo: remote.name + }).then(({ data }) => { + return data.map(item => new PullRequest(octo, remote.owner, remote.name, item)); + }); + }); + }); + return Promise.all(promises).then(values => { let prs = []; values.forEach(value => { @@ -243,7 +265,7 @@ export class PRProvider implements vscode.TreeDataProvider; +} \ No newline at end of file diff --git a/extensions/git-extended/src/typings/ref.d.ts b/extensions/git-extended/src/typings/ref.d.ts index c9849d48e08..175df7f9cf8 100644 --- a/extensions/git-extended/src/typings/ref.d.ts +++ b/extensions/git-extended/src/typings/ref.d.ts @@ -5,3 +5,4 @@ /// /// +/// diff --git a/extensions/git-extended/yarn.lock b/extensions/git-extended/yarn.lock index fbf82ecae16..810e24c331c 100644 --- a/extensions/git-extended/yarn.lock +++ b/extensions/git-extended/yarn.lock @@ -2,10 +2,29 @@ # yarn lockfile v1 +"@octokit/rest@^15.2.6": + version "15.2.6" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.2.6.tgz#16226f58fbf0ba88f631848fb622dfe0ad410c0c" + 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" + url-template "^2.0.8" + "@types/node@*": version "9.6.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.2.tgz#e49ac1adb458835e95ca6487bc20f916b37aff23" +agent-base@4, agent-base@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce" + dependencies: + es6-promisify "^5.0.0" + ajv@^5.1.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" @@ -45,6 +64,10 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +before-after-hook@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.1.0.tgz#83165e15a59460d13702cb8febd6a1807896db5a" + boom@4.x.x: version "4.3.1" resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" @@ -64,6 +87,10 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +btoa-lite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -96,6 +123,14 @@ core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + cryptiles@3.x.x: version "3.1.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" @@ -108,6 +143,12 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.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" + dependencies: + ms "2.0.0" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -129,6 +170,28 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" +es6-promise@^4.0.3: + version "4.2.4" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + dependencies: + es6-promise "^4.0.3" + +execa@^0.6.0: + version "0.6.3" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.6.3.tgz#57b69a594f081759c69e5370f0d17b9cb11658fe" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -171,12 +234,22 @@ fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" dependencies: assert-plus "^1.0.0" +git-credential-node@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/git-credential-node/-/git-credential-node-1.1.0.tgz#2507544ac031d0082cd9e0f833aac758f15fd80d" + dependencies: + execa "^0.6.0" + glob@^7.0.5: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" @@ -212,6 +285,13 @@ hoek@4.x.x: version "4.2.1" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" +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" + dependencies: + agent-base "4" + debug "3.1.0" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -220,6 +300,13 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +https-proxy-agent@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" + dependencies: + agent-base "^4.1.0" + debug "^3.1.0" + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -231,10 +318,18 @@ inherits@2: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -264,10 +359,17 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -lodash@4.17.5, lodash@^4.16.4: +lodash@4.17.5, lodash@^4.17.4: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" +lru-cache@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + mime-db@~1.33.0: version "1.33.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" @@ -307,17 +409,24 @@ mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "0.0.8" +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +node-fetch@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" -octokat@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/octokat/-/octokat-0.8.0.tgz#50841ca255743f91a715d11a1bde76f2eefcd97a" - dependencies: - lodash "^4.16.4" - xmlhttprequest "~1.8.0" - once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -334,10 +443,18 @@ os-tmpdir@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + 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" +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -346,6 +463,10 @@ progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -354,7 +475,7 @@ qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" -request@^2.81.0, request@^2.83.0: +request@^2.83.0: version "2.85.0" resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" dependencies: @@ -391,6 +512,20 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.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" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + sntp@2.x.x: version "2.1.0" resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" @@ -415,6 +550,10 @@ stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + tar@^4.0.2: version "4.4.1" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.1.tgz#b25d5a8470c976fd7a9a8a350f42c59e9fa81749" @@ -453,6 +592,10 @@ typescript@^2.1.4: version "2.8.1" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624" +url-template@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" + uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" @@ -465,6 +608,12 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +which@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -473,9 +622,9 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -xmlhttprequest@~1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" yallist@^3.0.0, yallist@^3.0.2: version "3.0.2"