diff --git a/bin/skello b/bin/skello index 09a41e8..1d0c64f 100755 --- a/bin/skello +++ b/bin/skello @@ -1,21 +1,22 @@ #!/usr/bin/env node -var chalk = require('chalk'); -var getenv = require('getenv'); -var semver = require('semver'); -var version = process.versions.node; -var supportedVersions = [ +const chalk = require('chalk'); +const getenv = require('getenv'); +const semver = require('semver'); +const version = process.versions.node; + +const supportedVersions = [ { range: '>=10.13.0 <11.0.0', name: 'Active LTS' }, { range: '>=12.0.0', name: 'Current Release' }, ]; -var isSupported = supportedVersions.some(function(supported) { +const isSupported = supportedVersions.some(function(supported) { return semver.satisfies(version, supported.range); }); if (isSupported) { require('../index.js'); } else { - var versionInfo = supportedVersions + const versionInfo = supportedVersions .map(function(supported) { return '* ' + supported.range + ' (' + supported.name + ')'; }) diff --git a/commands/apps.js b/commands/apps.js index a7a3c08..303340f 100644 --- a/commands/apps.js +++ b/commands/apps.js @@ -1,8 +1,7 @@ -const cliSelect = require('cli-select'); +const inquirer = require('inquirer'); const chalk = require('chalk'); const openInBrowser = require('open'); const ora = require('ora'); -const figures = require('figures'); const moment = require('moment'); const _ = require('lodash'); const currentBranchName = require('current-git-branch'); @@ -60,24 +59,18 @@ function handle(args) { async function list() { const values = await getAppInfos(); - console.log(`${chalk.red.bold('?')} Please choose an app to open:`); - - cliSelect({ - values: values, - valueRenderer: (value, selected) => { - if (selected) { - return `${chalk.blue.bold.underline(value.text)}`; - } - - return `${value.text}`; - }, - selected: chalk.blue(figures.circleFilled), - unselected: figures.circle, - }).then(response => { - console.log(`Opening ${response.value.pullRequest.head.ref} in browser...`); - openInBrowser(response.value.url); + inquirer + .prompt({ + message: 'Please choose an app to open:', + name: 'app', + type: 'list', + choices: values.map(app => ({ name: app.text, value: app })), + pageSize: 20 }) - .catch(error => null) + .then(answers => { + console.log(`Opening ${answers.app.pullRequest.head.ref} in browser...`); + openInBrowser(answers.app.url); + }); } /* @@ -128,7 +121,7 @@ async function openAppByBranchName(branchName) { const app = apps.find(a => a.id === reviewApp.app.id); if (app) { - openInBrowser(app.web_url); + openInBrowser(app.web_url); } else { console.log('Can\'t open review app.') } @@ -159,7 +152,8 @@ async function getAppInfos() { const isMerged = pullRequest.merged_at !== null; const isClosed = pullRequest.closed_at !== null; - const text = `[${pullRequest.head.ref}] - Author: ${pullRequest.user.login} | Head: ${pullRequest.base.ref}`; + const commitRef = chalk.blue(`[${pullRequest.head.ref}]`); + const text = `${commitRef} Author: ${pullRequest.user.login} | Head: ${pullRequest.base.ref}`; if (isMerged) text += ' [Merged]'; if (isClosed) text += ' [Closed]'; @@ -180,4 +174,4 @@ module.exports = { NAME, helpText, handle, -}; \ No newline at end of file +}; diff --git a/commands/pulls.js b/commands/pulls.js index f33c50d..0eec052 100644 --- a/commands/pulls.js +++ b/commands/pulls.js @@ -1,7 +1,6 @@ const chalk = require('chalk'); const fetch = require('node-fetch'); -const figures = require('figures'); -const cliSelect = require('cli-select'); +const inquirer = require('inquirer'); const ora = require('ora'); const openInBrowser = require('open'); const { parseSorter } = require('../utils/cli.js'); @@ -60,25 +59,20 @@ async function list(sorter) { if (sorter.direction === 'desc') pullRequests.reverse(); } - cliSelect({ - values: pullRequests, - valueRenderer: (value, selected) => { - const text = pullRequestText(value); - - if (selected) { - return `${chalk.blue(text)}`; - } - - return `${text}`; - }, - selected: chalk.blue(figures.circleFilled), - unselected: figures.circle, - }).then((response) => { - const link = response.value._links.html.href; - - console.log(`Opening ${link} in browser...`); - openInBrowser(link); - }).catch(error => null); + inquirer + .prompt({ + type: 'list', + name: 'pull_request', + choices: pullRequests.map(pr => ({ name: getPullRequestName(pr), value: pr })), + message: 'Select pull request:', + pageSize: 50 + }) + .then(answers => { + const link = answers.pull_request.html_url; + + console.log(`Opening ${link} in browser...`); + openInBrowser(link); + }); } async function getPullRequests() { @@ -95,7 +89,7 @@ async function getPullRequests() { let count = 1; - for (var i = pullRequestIds.length - 1; i >= 0; i--) { + for (let i = pullRequestIds.length - 1; i >= 0; i--) { spinner.prefixText = `[${count}/${pullRequestCount}] `; const pullRequest = await GithubService.getPullRequest(pullRequestIds[i]); count++; @@ -107,15 +101,23 @@ async function getPullRequests() { return pullRequests; } -function pullRequestText(pullRequest) { +/** + * @return name to display in menu + */ +function getPullRequestName(pullRequest) { + const messageMaxLength = 60; const additions = chalk.green(`+${pullRequest.additions}`); const deletions = chalk.red(`+${pullRequest.deletions}`); - const files = `files: ${pullRequest.changed_files}`; - return `${pullRequest.title} ${files} ${additions} ${deletions}` + const files = `${pullRequest.changed_files} file${pullRequest.changed_files > 1 ? 's' : ''}`; + + const commitMessage = pullRequest.title.length > messageMaxLength + ? pullRequest.title.substr(0, messageMaxLength) + '…' + : pullRequest.title; + return `${commitMessage} - ${chalk.blue(pullRequest.user.login)} - ${files}, ${additions} ${deletions}` } module.exports = { NAME, helpText, handle, -}; \ No newline at end of file +}; diff --git a/commands/tests.js b/commands/tests.js index 4e54d9b..6dd9e32 100644 --- a/commands/tests.js +++ b/commands/tests.js @@ -4,8 +4,7 @@ const fetch = require('node-fetch'); const _ = require('lodash'); const moment = require('moment'); const currentBranchName = require('current-git-branch'); -const cliSelect = require('cli-select'); -const figures = require('figures'); +const inquirer = require('inquirer'); const ora = require('ora'); // Services @@ -22,10 +21,10 @@ const NAME = 'tests'; const helpText = ` ${chalk.bold('NAME')} - skello-tests Manage pending tests + skello-tests: Manage CI tests ${chalk.bold('SYNOPSIS')} - ${chalk.underline('skello')} ${chalk.underline(NAME)} ${chalk.underline('status')} + ${chalk.underline('skello')} ${chalk.underline(NAME)} ${chalk.underline('status')} [branch-name] ${chalk.underline('skello')} ${chalk.underline(NAME)} ${chalk.underline('list')} `; @@ -53,31 +52,61 @@ function handle(args) { } /* -* [COMMAND] skello tests status: +* [COMMAND] skello tests status: */ async function status(branchName) { - if (!branchName || branchName === '') { - console.log('Please enter a valid branch name or the current keyword.'); - return; - } - - branchName = branchName === 'current' ? currentBranchName() : branchName; + branchName = branchName === undefined ? currentBranchName() : branchName; + console.log("Test status for git branch", chalk.cyan(branchName)); const tests = await HerokuService.listTestRuns(); const test = tests.find(t => t.commit_branch === branchName); + if (test === undefined) { + console.log(chalk.red("No test found.")); + return; + } + const result = await parseTestFailuresFor(test); + if (typeof result === 'object') { + Object.keys(result).forEach((nodeId) => { + console.log(`Node #${nodeId}`); + + if (result[nodeId].length === 0) { + console.log(' Failures parsing for this node not implemented.'); + } else { + result[nodeId].forEach((error) => { + console.log(` ${error}`); + }); + } + }); + } +} - Object.keys(result).forEach((nodeId) => { - console.log(`Node #${nodeId}`); +function getTestName(test) { + let icon; - if (result[nodeId].length === 0) { - console.log(' Failures parsing for this node not implemented.'); - } else { - result[nodeId].forEach((error) => { - console.log(` ${error}`); - }); - } - }); + switch (test.status) { + case 'succeeded': + icon = chalk.green('✔'); + break; + case 'failed': + icon = chalk.red('✖'); + break; + case 'building': + icon = chalk.yellow('⧖'); + break; + default: + icon = chalk.yellow('…'); + break; + } + + // Keep first line of commit message + const lf = test.commit_message.indexOf("\n"); + if (lf != -1) { + test.commit_message = test.commit_message.substr(0, lf); + } + + const branchName = chalk.bold(`[${test.commit_branch}]`); + return `${icon} ${branchName} ${test.commit_message}`; } /* @@ -89,71 +118,63 @@ async function list() { spinner.stop(); tests = _.sortBy(tests, (test) => moment(test.updated_at).format('X')).reverse(); - tests = _.filter(tests, (test) => test.status === 'failed'); - const values = _.uniqBy(tests, (test) => test.commit_branch); - - console.log(`${chalk.red.bold('?')} Please choose a branch:`); - - cliSelect({ - values: values, - valueRenderer: (value, selected) => { - let icon; - - switch(value.status) { - case 'succeeded': - icon = chalk.green.bold(figures.tick); - break; - case 'failed': - icon = chalk.red.bold(figures.cross); - break; - default: - icon = chalk.orange.bold(figures.ellipsis); - break; - } - if (selected) { - return `${icon} [${chalk.blue.bold.underline(value.commit_branch)}] ${chalk.blue.bold(value.commit_message)}`; - } + tests = _.uniqBy(tests, (test) => test.commit_branch); - return `${icon} [${value.commit_branch}] ${value.commit_message}`; - }, - selected: chalk.blue(figures.circleFilled), - unselected: figures.circle, - }).then(async function(response) { + inquirer + .prompt({ + name: 'test', + message: 'Please choose a branch:', + type: 'list', + choices: tests.map(test => ({name: getTestName(test), value: test })), + pageSize: 20, + }) + .then(async function(answers) { const spinner = ora(`Loading failures ouput...`).start(); - const result = await parseTestFailuresFor(response.value); + const result = await parseTestFailuresFor(answers.test); spinner.stop(); - - Object.keys(result).forEach((nodeId) => { - console.log(`Node #${nodeId}`); - - if (result[nodeId].length === 0) { - console.log(' Failures parsing for this node not implemented.'); - } else { - result[nodeId].forEach((error) => { - console.log(` ${error}`); - }); - } - }); - }) - .catch(error => console.log(error)) + + if (result) { + Object.keys(result).forEach((nodeId) => { + console.log(`Node #${nodeId}`); + + if (result[nodeId].length === 0) { + console.log(' Failures parsing for this node not implemented.'); + } else { + result[nodeId].forEach((error) => { + console.log(` ${error}`); + }); + } + }); + } + }); } async function parseTestFailuresFor(test) { let nodes = await HerokuService.listTestNodes(test.id); if (test.status === 'succeeded') { - console.log('All tests passed successfully.'); + console.log(chalk.green('All tests passed successfully.')); + return; + } + + if (test.status === 'building') { + console.log(chalk.yellow('Test suite is still building.')); return; } + if (test.status === 'running') { + const delta = moment(moment.now()).diff(test.created_at, 'minutes'); + console.log(chalk.yellow(`Running since ${delta} minutes...`)); + } + nodes = _.sortBy(nodes, (node) => node.index); const result = {}; - for (var i = nodes.length - 1; i >= 0; i--) { + for (let i = nodes.length - 1; i >= 0; i--) { let node = nodes[i] - if (node.status === 'failed') { + if (node.status == 'failed') { const res = await fetch(node.output_stream_url); const data = await res.text(); @@ -188,4 +209,4 @@ module.exports = { NAME, helpText, handle, -}; \ No newline at end of file +}; diff --git a/package.json b/package.json index ad8547a..e674f52 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "skello-cli", + "name": "flow-cli", "version": "1.0.0", "description": "", "main": "index.js", @@ -9,13 +9,11 @@ "author": "", "license": "ISC", "dependencies": { - "bluebird": "^3.7.2", "chalk": "^3.0.0", - "cli-select": "^1.1.1", "current-git-branch": "^1.1.0", "dotenv": "^8.2.0", - "figures": "^3.1.0", "getenv": "^1.0.0", + "inquirer": "^7.0.4", "lodash": "^4.17.15", "moment": "^2.24.0", "node-fetch": "^2.6.0", diff --git a/services/github.js b/services/github.js index 9378510..6012d7c 100644 --- a/services/github.js +++ b/services/github.js @@ -2,7 +2,7 @@ const config = require('../config.js'); const fetch = require('node-fetch'); const cache = require('../utils/cache.js'); -const baseUrl = 'https://api.github.com/repos/Samy-Amar/Skello'; +const baseUrl = 'https://api.github.com/repos/skelloapp/skello-app'; const headers = { 'Accept': 'Accept: application/vnd.github.v3+json', 'Authorization': `token ${config.GITHUB_API_KEY}`, diff --git a/yarn.lock b/yarn.lock index fe3ea1d..4a15c66 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,10 +7,17 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== +ansi-escapes@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" + integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + dependencies: + type-fest "^0.8.1" + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== ansi-regex@^5.0.0: version "5.0.0" @@ -37,11 +44,6 @@ babel-plugin-add-module-exports@^0.2.1: resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz#9ae9a1f4a8dc67f0cdec4f4aeda1e43a5ff65e25" integrity sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU= -bluebird@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -59,6 +61,11 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -66,18 +73,16 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-select@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/cli-select/-/cli-select-1.1.1.tgz#7d2223736e9200e6367b4bf5e32ff0c00d991beb" - integrity sha512-QfdDBIRqJm4fWenHZvgZJKxkpw0W8BZP4dXX3nt1r+BRSSKKmolzZvw5LtTQ/Yu2ks21eWkfZZW53C38D1JbCw== - dependencies: - ansi-escapes "^3.2.0" - cli-spinners@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.2.0.tgz#e8b988d9206c692302d8ee834e7a85c0144d8f77" integrity sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ== +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -137,6 +142,11 @@ dotenv@^8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -155,10 +165,19 @@ execa@^0.6.1: signal-exit "^3.0.0" strip-eof "^1.0.0" -figures@^3.1.0: +external-editor@^3.0.3: version "3.1.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" - integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" @@ -182,11 +201,42 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +inquirer@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" + integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^2.4.2" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.2.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + is-docker@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-git-repository@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/is-git-repository/-/is-git-repository-1.1.1.tgz#c68e4b7a806422349aaec488973a90558d7e9be0" @@ -200,6 +250,11 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -340,6 +395,11 @@ ora@^4.0.3: strip-ansi "^6.0.0" wcwidth "^1.0.1" +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -383,6 +443,25 @@ rmdir@^1.2.0: dependencies: node.flow "1.2.3" +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +rxjs@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + dependencies: + tslib "^1.9.0" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + semver@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.2.tgz#847bae5bce68c5d08889824f02667199b70e3d87" @@ -405,6 +484,22 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-ansi@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" @@ -431,6 +526,28 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"