From 1cacd88ee53fc968dc5b4a0ad32c33c47098ef83 Mon Sep 17 00:00:00 2001 From: Jake Bolam Date: Fri, 11 Jan 2019 17:51:11 +0800 Subject: [PATCH] feat: add parse comment first pass --- package.json | 1 + src/processIssueComment.js | 71 ++++++--- src/utils/parse-comment/index.js | 128 +++++++++++------ .../parse-comment/refiners/start-of-day.js | 14 -- test/fixtures/issue_comment.created.json | 2 +- test/utils/parse-comment/index.test.js | 135 ++++-------------- yarn.lock | 121 +++++----------- 7 files changed, 198 insertions(+), 274 deletions(-) delete mode 100644 src/utils/parse-comment/refiners/start-of-day.js diff --git a/package.json b/package.json index 8ea64b53..e463a1ba 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "dependencies": { "@probot/serverless-lambda": "^0.2.0", "all-contributors-cli": "^5.7.0", + "compromise": "^11.13.0", "probot": "^7.4.0" }, "devDependencies": { diff --git a/src/processIssueComment.js b/src/processIssueComment.js index b85edad3..34380fe3 100644 --- a/src/processIssueComment.js +++ b/src/processIssueComment.js @@ -4,28 +4,19 @@ const OptionsConfig = require('./OptionsConfig') const ContentFiles = require('./ContentFiles') const getUserDetails = require('./utils/getUserDetails') -// const parseComment = require('./parse-comment') +const parseComment = require('./utils/parse-comment') const { GIHUB_BOT_NAME } = require('./utils/settings') const { AllContributorBotError } = require('./utils/errors') -async function processIssueComment({ context, commentReply }) { - const repository = new Repository({ - ...context.repo(), - github: context.github, - }) - const optionsConfig = new OptionsConfig({ - repository, - commentReply, - }) - await optionsConfig.fetch() - - // TODO parse comment and gain intentions - // const { who, contributions } = parseComment(commentBody) - // We had trouble reading your comment. Basic usage:\n\n\`@${GIHUB_BOT_NAME} please add jakebolam for code\` - const who = 'jakebolam' - const contributions = ['code'] - +async function processAddContributor({ + context, + commentReply, + repository, + optionsConfig, + who, + contributions, +}) { const { name, avatar_url, profile } = await getUserDetails({ github: context.github, username: who, @@ -55,9 +46,7 @@ async function processIssueComment({ context, commentReply }) { title: `docs: add ${who} as a contributor`, body: `Adds ${who} as a contributor for ${contributions.join( ', ', - )}.\n\nThis was requested by ${commentReply.replyingToWho()} [in this comment](${ - commentReply.replyingToWhere() - })`, + )}.\n\nThis was requested by ${commentReply.replyingToWho()} [in this comment](${commentReply.replyingToWhere()})`, filesByPath: filesByPathToUpdate, branchName: `all-contributors/add-${who}`, }) @@ -67,6 +56,46 @@ async function processIssueComment({ context, commentReply }) { ) } +async function processIssueComment({ context, commentReply }) { + const repository = new Repository({ + ...context.repo(), + github: context.github, + }) + const optionsConfig = new OptionsConfig({ + repository, + commentReply, + }) + await optionsConfig.fetch() + + const commentBody = context.payload.comment.body + const parsedComment = parseComment(commentBody) + if (!parsedComment.action) { + commentReply.reply(`I could not determine your intention.`) + commentReply.reply( + `Basic usage: @${GIHUB_BOT_NAME} please add jakebolam for code, doc`, + ) + return + } + + if (parsedComment.action === 'add') { + await processAddContributor({ + context, + commentReply, + repository, + optionsConfig, + who: parsedComment.who, + contributions: parsedComment.contributions, + }) + return + } + + commentReply.reply(`I'm not sure how to ${parsedComment.action}`) + commentReply.reply( + `Basic usage: @${GIHUB_BOT_NAME} please add jakebolam for code, doc`, + ) + return +} + function hasMentionedBotName(context) { const commentBody = context.payload.comment.body const hasMentionedBotName = commentBody.includes(GIHUB_BOT_NAME) diff --git a/src/utils/parse-comment/index.js b/src/utils/parse-comment/index.js index c1cd5ecb..430596a9 100644 --- a/src/utils/parse-comment/index.js +++ b/src/utils/parse-comment/index.js @@ -1,41 +1,89 @@ -// const chrono = require('chrono-node') -// -// const matcher = /^remind @?([^\s]+)(?: to )?(.*)$/ -// -// const parser = new chrono.Chrono() -// parser.refiners.push(require('./lib/refiners/start-of-day')) -// -// const options = { -// forwardDate: true, -// startOfDay: 9 -// } -// -// module.exports = (input, from) => { -// const match = input.match(matcher) -// if (!match) { -// // This doesn't look like a reminder, so bail early -// return null -// } -// -// // Pull out the initial matches -// let [, who, what] = match -// -// // Use chrono to extract the `when` from the `what` -// const when = parser.parse(what, from, options) -// -// if (when.length < 1) { -// // What kind of reminder doesn't have a date? -// return null -// } -// -// // Remove any time expressions from the `what` -// when.forEach(w => { -// what = what.replace(w.text, '') -// }) -// -// // Clean up whitespace and common connecting words -// what = what.trim() -// what = what.replace(/^(to|that) /, '').replace(/ on$/, '') -// -// return {who, what, when: when[0].start.date()} +const nlp = require('compromise') + +const validContributionTypes = [ + 'blog', + 'bug', + 'code', + 'design', + 'doc', + 'eventOrganizing', + 'example', + 'financial', + 'fundingFinding', + 'ideas', + 'infra', + 'platform', + 'plugin', + 'question', + 'review', + 'security', + 'talk', + 'test', + 'tool', + 'translation', + 'tutorial', + 'userTesting', + 'video', +] + +// TODO +// const contributionTypeMappings = { +// 'event organizing': 'eventOrganizing', +// 'funding finding': 'fundingFinding', +// 'user testing': 'user testing', // } + +const Contributions = {} + +validContributionTypes.forEach(type => { + Contributions[type] = 'Contribution' +}) + +const plugin = { + words: { + ...Contributions, + }, + patterns: { + // 'add #person for #Contribution': 'AddContributor', + // "i can't (log|sign|get) in to my? #Software": 'LoginIssue' + }, +} +nlp.plugin(plugin) + +function parseAddComment(doc, action) { + const who = doc.match(`${action} [.]`).data()[0].normal + + // TODO: handle plurals (e.g. some said docs) + const contributions = doc + .match('#Contribution') + .data() + .map(data => { + // This removes whitespace, commas etc + return data.normal + }) + + return { + action: 'add', + who, + contributions, + } +} + +function parseComment(message) { + const doc = nlp(message) + + if (doc.verbs().data().length === 0) { + return {} + } + + const action = doc.verbs().data()[0].normal + if (action === 'add') { + return parseAddComment(doc, action) + } + + return { + action, + } +} + +module.exports = parseComment diff --git a/src/utils/parse-comment/refiners/start-of-day.js b/src/utils/parse-comment/refiners/start-of-day.js deleted file mode 100644 index 0da3237a..00000000 --- a/src/utils/parse-comment/refiners/start-of-day.js +++ /dev/null @@ -1,14 +0,0 @@ -// module.exports = { -// refine (text, results, opt) { -// if (opt.startOfDay) { -// results.forEach(result => { -// if (!result.start.isCertain('hour')) { -// result.start.imply('hour', opt.startOfDay) -// result.tags['StartOfWorkDayRefiner'] = true -// } -// }) -// } -// -// return results -// } -// } diff --git a/test/fixtures/issue_comment.created.json b/test/fixtures/issue_comment.created.json index 32a33edc..0d3df08f 100644 --- a/test/fixtures/issue_comment.created.json +++ b/test/fixtures/issue_comment.created.json @@ -79,7 +79,7 @@ "created_at": "2019-01-10T08:36:52Z", "updated_at": "2019-01-10T08:36:52Z", "author_association": "MEMBER", - "body": "@AllContributorsBot please add jakebolam for code" + "body": "@AllContributorsBot please add jakebolam for code, doc and infra" }, "repository": { "id": 164268911, diff --git a/test/utils/parse-comment/index.test.js b/test/utils/parse-comment/index.test.js index 5d59c7e9..fcdb4c21 100644 --- a/test/utils/parse-comment/index.test.js +++ b/test/utils/parse-comment/index.test.js @@ -1,111 +1,28 @@ -describe('parse-comment', () => { - test('Example test', () => { - expect(true).toBe(true) +const parseComment = require('../../../src/utils/parse-comment') +const { GIHUB_BOT_NAME } = require('../../../src//utils/settings') + +describe('parseComment', () => { + test('Basic intent to add', () => { + expect( + parseComment( + `@${GIHUB_BOT_NAME} please add jakebolam for doc, infra and code`, + ), + ).toEqual({ + action: 'add', + who: 'jakebolam', + contributions: ['doc', 'infra', 'code'], + }) }) + // + // test('Basic intent to add (with plurals)', () => { + // expect( + // parseComment( + // `@${GIHUB_BOT_NAME} please add jakebolam for docs, infra and code`, + // ), + // ).toEqual({ + // action: 'add', + // who: 'jakebolam', + // contributions: ['doc', 'infra', 'code'], + // }) + // }) }) - -// process.env.TZ = 'UTC' -// -// const expect = require('expect') -// const parseReminder = require('..') -// -// // All time expressions will be relative to Wednesday, July 5 at 4:03:02.0 UTC -// const REFERENCE_DATE = new Date(2017, 6, 5, 4, 3, 2, 0) -// -// describe('parse-reminder', () => { -// const examples = { -// 'nothing to see here': null, -// -// 'remind me nope': null, -// -// 'remind me to call the doctor tomorrow': { -// who: 'me', when: new Date(2017, 6, 6, 9, 0, 0, 0), what: 'call the doctor' -// }, -// -// 'remind me to send invites at 3pm tomorrow': { -// who: 'me', when: new Date(2017, 6, 6, 15, 0, 0, 0), what: 'send invites' -// }, -// -// 'remind me 8/28 to wish Jamie happy birthday': { -// who: 'me', when: new Date(2017, 7, 28, 9, 0, 0, 0), what: 'wish Jamie happy birthday' -// }, -// -// 'remind me to wish Jamie happy birthday on 8/28': { -// who: 'me', when: new Date(2017, 7, 28, 9, 0, 0, 0), what: 'wish Jamie happy birthday' -// }, -// -// 'remind me in 10 minutes to change the laundry': { -// who: 'me', when: new Date(2017, 6, 5, 4, 13, 2, 0), what: 'change the laundry' -// }, -// -// 'remind me tomorrow 10 PM to eat': { -// who: 'me', when: new Date(2017, 6, 6, 22, 0, 0, 0), what: 'eat' -// }, -// -// 'remind me on 18 Feb to be alive': { -// who: 'me', when: new Date(2018, 1, 18, 9, 0, 0, 0), what: 'be alive' -// }, -// -// 'remind me Tuesday to watch pogo': { -// who: 'me', when: new Date(2017, 6, 11, 9, 0, 0, 0), what: 'watch pogo' -// }, -// -// 'remind me Tuesday': { -// who: 'me', when: new Date(2017, 6, 11, 9, 0, 0, 0), what: '' -// }, -// -// 'remind me to go to the dentist on Aug 4 at 3': { -// // FIXME: add refiner to prefer work hours for times without am/pm -// who: 'me', when: new Date(2017, 7, 4, 3, 0, 0, 0), what: 'go to the dentist' -// }, -// -// 'remind me to followup with Kathy in 2 weeks': { -// who: 'me', when: new Date(2017, 6, 19, 9, 0, 0, 0), what: 'followup with Kathy' -// }, -// -// 'remind me in 2 weeks to followup with Kathy': { -// who: 'me', when: new Date(2017, 6, 19, 9, 0, 0, 0), what: 'followup with Kathy' -// }, -// -// 'remind me at 4:00 to check in with Dan': { -// // FIXME: fix future refiner to work with times later in the day -// who: 'me', when: new Date(2017, 6, 5, 4, 0, 0, 0), what: 'check in with Dan' -// }, -// -// 'remind me 10am to go to work': { -// // FIXME: fix future refiner to work with times later in the day -// who: 'me', when: new Date(2017, 6, 5, 10, 0, 0, 0), what: 'go to work' -// }, -// -// 'remind me that the oil needs changed on Oct 4': { -// who: 'me', when: new Date(2017, 9, 4, 9, 0, 0, 0), what: 'the oil needs changed' -// }, -// -// 'remind me next Friday to open the pod bay doors': { -// who: 'me', when: new Date(2017, 6, 14, 9, 0, 0, 0), what: 'open the pod bay doors' -// }, -// -// 'remind me tomorrow at noon to buy the new iPhone': { -// who: 'me', when: new Date(2017, 6, 6, 12, 0, 0, 0), what: 'buy the new iPhone' -// }, -// -// 'remind someone to have coffee tomorrow at noon': { -// who: 'someone', when: new Date(2017, 6, 6, 12, 0, 0, 0), what: 'have coffee' -// }, -// -// 'remind @meaku to have coffee tomorrow at noon': { -// who: 'meaku', when: new Date(2017, 6, 6, 12, 0, 0, 0), what: 'have coffee' -// }, -// -// 'remind @probot/everyone to have coffee tomorrow at noon': { -// who: 'probot/everyone', when: new Date(2017, 6, 6, 12, 0, 0, 0), what: 'have coffee' -// } -// } -// -// // eslint-disable-next-line guard-for-in -// for (const example in examples) { -// it(`parses "${example}"`, () => { -// expect(parseReminder(example, REFERENCE_DATE)).toEqual(examples[example]) -// }) -// } -// }) diff --git a/yarn.lock b/yarn.lock index 0b0779a6..93cc4b89 100644 --- a/yarn.lock +++ b/yarn.lock @@ -119,58 +119,17 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" -"@octokit/endpoint@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-3.1.1.tgz#ede9afefaa4d6b7584169e12346425c6fbb45cc3" - dependencies: - deepmerge "3.0.0" - is-plain-object "^2.0.4" - universal-user-agent "^2.0.1" - url-template "^2.0.8" - -"@octokit/graphql@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-2.0.1.tgz#0e9d7f41d6ac3305f37767e723183bd0b77af7d2" - dependencies: - "@octokit/request" "^2.1.2" - -"@octokit/plugin-enterprise-compatibility@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-compatibility/-/plugin-enterprise-compatibility-1.0.0.tgz#46399ad8eed7325bdc14ad6e10ed625226388cc7" - -"@octokit/plugin-retry@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-2.0.0.tgz#36e9ba610a376fcda7d06082fb49b5bfb3e8d737" +"@octokit/rest@^15.18.0": + version "15.18.1" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-15.18.1.tgz#ec7fb0f8775ef64dc095fae6635411d3fbff9b62" dependencies: - bottleneck "^2.15.0" - -"@octokit/plugin-throttling@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-2.1.0.tgz#0e831be4585eb77cc566096867ca96e269603ba6" - dependencies: - bottleneck "^2.15.0" - -"@octokit/request@2.2.1", "@octokit/request@^2.1.2": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-2.2.1.tgz#1b445e3052842b1f3ab94d68e2606840c85b4265" - dependencies: - "@octokit/endpoint" "^3.1.1" - is-plain-object "^2.0.4" - node-fetch "^2.3.0" - universal-user-agent "^2.0.1" - -"@octokit/rest@^16.8.0": - version "16.8.0" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.8.0.tgz#7d621a9f0d04178ba86c5c5d3792fa3e04a6409a" - dependencies: - "@octokit/request" "2.2.1" - before-after-hook "^1.2.0" + before-after-hook "^1.1.0" btoa-lite "^1.0.0" - lodash.get "^4.4.2" - lodash.pick "^4.4.0" - lodash.set "^4.3.2" - lodash.uniq "^4.5.0" - octokit-pagination-methods "^1.1.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" @@ -254,7 +213,7 @@ acorn@^6.0.1, acorn@^6.0.2: version "6.0.5" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.5.tgz#81730c0815f3f3b34d8efa95cb7430965f4d887a" -agent-base@^4.1.0: +agent-base@4, agent-base@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" dependencies: @@ -736,7 +695,7 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -before-after-hook@^1.2.0: +before-after-hook@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.3.1.tgz#1c23c7789ad3ed76b06c9cb38d1169ac094c3704" @@ -794,7 +753,7 @@ boom@7.x.x: dependencies: hoek "6.x.x" -bottleneck@^2.15.0: +bottleneck@^2.8.0: version "2.15.0" resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.15.0.tgz#538ec3a32f0e94a06e934bcb2080eb2c4c901c5a" @@ -1402,6 +1361,12 @@ debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6. dependencies: ms "2.0.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" + debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -1488,10 +1453,6 @@ deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" -deepmerge@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.0.0.tgz#ca7903b34bfa1f8c2eab6779280775a411bfc6ba" - default-require-extensions@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" @@ -2588,6 +2549,13 @@ http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" +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" @@ -2596,7 +2564,7 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -https-proxy-agent@^2.2.1: +https-proxy-agent@^2.2.0, 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" dependencies: @@ -3813,10 +3781,6 @@ lodash.difference@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" @@ -3861,14 +3825,6 @@ lodash.padstart@^4.1.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" -lodash.pick@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - -lodash.set@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -4202,7 +4158,7 @@ node-fetch@^1.0.1, node-fetch@^1.6.0: encoding "^0.1.11" is-stream "^1.0.1" -node-fetch@^2.3.0: +node-fetch@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" @@ -4384,10 +4340,6 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -octokit-pagination-methods@1.1.0, 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" - on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -4711,16 +4663,14 @@ private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" -"probot@file:../../probot": - version "7.4.0" +probot@^7.4.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/probot/-/probot-7.5.0.tgz#17f4441210c95b822a53dc9748fb17261a1aacdf" dependencies: - "@octokit/graphql" "2.0.1" - "@octokit/plugin-enterprise-compatibility" "^1.0.0" - "@octokit/plugin-retry" "^2.0.0" - "@octokit/plugin-throttling" "^2.1.0" - "@octokit/rest" "^16.8.0" + "@octokit/rest" "^15.18.0" "@octokit/webhooks" "^5.0.2" "@types/supports-color" "^5.3.0" + bottleneck "^2.8.0" bunyan "^1.8.12" bunyan-format "^0.2.1" bunyan-sentry-stream "^1.1.0" @@ -4733,7 +4683,6 @@ private@^0.1.8: is-base64 "0.1.0" js-yaml "^3.9.1" jsonwebtoken "^8.1.0" - octokit-pagination-methods "1.1.0" pkg-conf "^2.0.0" promise-events "^0.1.3" qs "^6.5.2" @@ -5894,12 +5843,6 @@ universal-user-agent@^2.0.0: dependencies: os-name "^3.0.0" -universal-user-agent@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-2.0.3.tgz#9f6f09f9cc33de867bb720d84c08069b14937c6c" - dependencies: - os-name "^3.0.0" - unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"