From b217dfc694b498ffc94241664942e774628b57c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arwid=20Thornstro=CC=88m?= Date: Fri, 3 Feb 2023 12:47:06 +0100 Subject: [PATCH 1/2] linted --- .eslintrc.json | 16 + package.json | 11 +- src/commands/aws/logs/logs.ts | 28 +- .../aws/parameterstore/parameterstore.ts | 56 +- .../deployment/testservers/create/create.ts | 90 ++- .../deployment/testservers/delete/delete.ts | 97 ++- .../deployment/testservers/status/status.ts | 132 ++-- .../deployment/testservers/update/update.ts | 135 ++-- src/commands/setup/settings/settings.ts | 59 +- .../workflow/setupissue/setupissue.ts | 48 +- src/extensions/cli-extension.ts | 10 +- src/globals.ts | 6 +- src/services/github_rest.ts | 81 +- tsconfig.json | 5 +- yarn.lock | 748 +++++++++++++++--- 15 files changed, 1136 insertions(+), 386 deletions(-) create mode 100644 .eslintrc.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..4e5cc13 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,16 @@ +{ + "parser": "@typescript-eslint/parser", + "parserOptions": { + "sourceType": "module", + "ecmaVersion": 2017 + }, + "env": { + "es6": true + }, + "extends": ["prettier"], + "plugins": ["@typescript-eslint", "prettier"], + "rules": { + "prettier/prettier": ["error"], + "no-return-await": "error" + } +} diff --git a/package.json b/package.json index b7deb12..cfa58a6 100644 --- a/package.json +++ b/package.json @@ -9,11 +9,10 @@ }, "scripts": { "format": "prettier --write **/*.{js,ts,tsx,json}", - "lint": "tslint -p .", "clean-build": "rm -rf ./build", "compile": "tsc -p .", "copy-templates": "if [ -e ./src/templates ]; then cp -a ./src/templates ./build/; fi", - "build": "yarn format && yarn lint && yarn clean-build && yarn compile && yarn copy-templates", + "build": "yarn format && yarn clean-build && yarn compile && yarn copy-templates", "prepublishOnly": "yarn build", "test": "jest", "watch": "jest --watch", @@ -48,9 +47,11 @@ "prettier": "^1.12.1", "ts-jest": "^24.1.0", "ts-node": "^8.4.1", - "tslint": "^5.12.0", - "tslint-config-prettier": "^1.17.0", - "tslint-config-standard": "^8.0.1", + "@typescript-eslint/eslint-plugin": "^5.44.0", + "@typescript-eslint/parser": "^5.44.0", + "eslint": "^8.28.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.2.1", "typescript": "^3.6.3" }, "jest": { diff --git a/src/commands/aws/logs/logs.ts b/src/commands/aws/logs/logs.ts index 7187a40..31a923d 100644 --- a/src/commands/aws/logs/logs.ts +++ b/src/commands/aws/logs/logs.ts @@ -1,4 +1,4 @@ -import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu' +import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu'; import chalk = require('chalk'); import { confirmMessage, defaultMenuSettings } from '../../../globals'; const { AutoComplete } = require('enquirer'); @@ -10,10 +10,11 @@ module.exports = { description: 'Tail a log in cloudwatch (l) (WIP)', hidden: false, run: async (toolbox: GluegunMenuToolbox) => { - - const { system, strings } = toolbox + const { system, strings } = toolbox; - const groups = JSON.parse(strings.trim(await system.run(`aws logs describe-log-groups`))); + const groups = JSON.parse( + strings.trim(await system.run(`aws logs describe-log-groups`)) + ); const options = groups.logGroups.map(item => { return item.logGroupName; @@ -29,16 +30,23 @@ module.exports = { const logGroup = await prompt.run(); if (await confirmMessage(`Tail logs from ${chalk.yellow(logGroup)}?`)) { - const child = spawn('aws', ['logs', 'tail', `${logGroup}`, '--follow', '--format', 'short']); + const child = spawn('aws', [ + 'logs', + 'tail', + `${logGroup}`, + '--follow', + '--format', + 'short' + ]); child.stdout.setEncoding('utf8'); child.stdout.on('data', function(data) { - // Here is where the output goes - console.log(data); + // Here is where the output goes + console.log(data); }); - child.stderr.on('data', (data) => { + child.stderr.on('data', data => { console.error(`stderr: ${data}`); }); - child.on('close', (code) => { + child.on('close', code => { console.log(`child process exited with code ${code}`); }); } @@ -47,4 +55,4 @@ module.exports = { await toolbox.menu.showMenu('aws', defaultMenuSettings); } } -} +}; diff --git a/src/commands/aws/parameterstore/parameterstore.ts b/src/commands/aws/parameterstore/parameterstore.ts index 484b51c..4fc9318 100644 --- a/src/commands/aws/parameterstore/parameterstore.ts +++ b/src/commands/aws/parameterstore/parameterstore.ts @@ -1,4 +1,4 @@ -import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu' +import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu'; import chalk = require('chalk'); import { defaultMenuSettings, sleep } from '../../../globals'; const { AutoComplete } = require('enquirer'); @@ -9,31 +9,47 @@ module.exports = { description: 'Parameter store functions (ps)', hidden: false, run: async (toolbox: GluegunMenuToolbox) => { - const { system, strings, print, filesystem } = toolbox; // Check for cache in /tmp folder const cache = filesystem.read('/tmp/.pwcli_parametercache'); const cacheValues = !cache ? [] : JSON.parse(cache); const valueNames = [...cacheValues]; - + let nextToken = ''; if (valueNames.length === 0) { - const spinner = print.spin(`Downloading parameter names (${chalk.red('0')})`); + const spinner = print.spin( + `Downloading parameter names (${chalk.red('0')})` + ); while (nextToken !== null) { const values = JSON.parse( strings.trim( - await system.run(`aws ssm describe-parameters --output json --max-items 50 ${(nextToken !== '') ? `--starting-token ${nextToken}` : ''}`))); - + await system.run( + `aws ssm describe-parameters --output json --max-items 50 ${ + nextToken !== '' ? `--starting-token ${nextToken}` : '' + }` + ) + ) + ); + await sleep(500); - valueNames.push(...values.Parameters.map(({Name}) => { return Name; })); + valueNames.push( + ...values.Parameters.map(({ Name }) => { + return Name; + }) + ); nextToken = values.NextToken || null; - spinner.text = `Downloading parameter names (${chalk.red(valueNames.length)})` + spinner.text = `Downloading parameter names (${chalk.red( + valueNames.length + )})`; } - + spinner.text = 'Saving parameter names to /tmp/.pwcli_parametercache'; - - filesystem.file('/tmp/.pwcli_parametercache', {mode: '600', content: JSON.stringify(valueNames)}); + + filesystem.file('/tmp/.pwcli_parametercache', { + mode: '600', + content: JSON.stringify(valueNames) + }); await sleep(2000); spinner.stop(); @@ -48,11 +64,21 @@ module.exports = { initial: 10, choices: valueNames }); - + try { const parameterName = await prompt.run(); - const parameterValue = JSON.parse(strings.trim(await system.run(`aws ssm get-parameter --name ${parameterName} --with-decryption`))); - print.success(`${chalk.green(parameterName)} value is [${chalk.yellow(parameterValue.Parameter.Value)}]`); + const parameterValue = JSON.parse( + strings.trim( + await system.run( + `aws ssm get-parameter --name ${parameterName} --with-decryption` + ) + ) + ); + print.success( + `${chalk.green(parameterName)} value is [${chalk.yellow( + parameterValue.Parameter.Value + )}]` + ); } catch (e) { parameterName = 'exit'; } @@ -62,4 +88,4 @@ module.exports = { await toolbox.menu.showMenu('aws', defaultMenuSettings); } } -} +}; diff --git a/src/commands/deployment/testservers/create/create.ts b/src/commands/deployment/testservers/create/create.ts index 6e3f710..368da21 100644 --- a/src/commands/deployment/testservers/create/create.ts +++ b/src/commands/deployment/testservers/create/create.ts @@ -1,4 +1,4 @@ -import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu' +import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu'; import { exit } from 'process'; const chalk = require('chalk'); const { AutoComplete, Input, Confirm } = require('enquirer'); @@ -6,18 +6,20 @@ import { defaultMenuSettings, getSettings } from '../../../../globals'; import { getRepoBranches } from '../../../../services/github_rest'; type Stack = { - name: string - status: string - drift_status: string - branch: string - updated: string -} + name: string; + status: string; + drift_status: string; + branch: string; + updated: string; +}; const getConfirmation = async (branchName: string, stackName: string) => { const url = stackName.replace('photowall-', ''); const confirm = new Confirm({ name: 'confirm', - message: `Will create ${chalk.yellow(url + '.photowall-test.xx')} and publish ${chalk.green(branchName)} to it, continue?` + message: `Will create ${chalk.yellow( + url + '.photowall-test.xx' + )} and publish ${chalk.green(branchName)} to it, continue?` }); try { @@ -26,7 +28,7 @@ const getConfirmation = async (branchName: string, stackName: string) => { console.error(e); return false; } -} +}; module.exports = { name: 'create', @@ -35,10 +37,10 @@ module.exports = { hidden: false, run: async (toolbox: GluegunMenuToolbox) => { const { system, strings, print, filesystem } = toolbox; - + // Load settings const config = await getSettings(toolbox); - if (!config || (!config.photowall_repo || config.photowall_repo === "")) { + if (!config || !config.photowall_repo || config.photowall_repo === '') { print.error(` The create command requires that you set an absolute path to your local photowall repository. @@ -47,10 +49,15 @@ module.exports = { await toolbox.menu.showMenu('setup', defaultMenuSettings); return; } - - const branches = await getRepoBranches(toolbox, config.gh_token, 'Photowall', 'photowall'); + + const branches = await getRepoBranches( + toolbox, + config.gh_token, + 'Photowall', + 'photowall' + ); const branchOptions = branches.map(item => item.name); - + const promptBranch = new AutoComplete({ name: 'branchName', message: 'Select a branch', @@ -62,7 +69,7 @@ module.exports = { const stacks = JSON.parse( strings.trim(await system.run(`aws cloudformation list-stacks`)) - ) + ); const teststacks: Stack[] = await Promise.all( stacks.StackSummaries.map(async item => { if ( @@ -82,40 +89,42 @@ module.exports = { `aws codepipeline get-pipeline --name ${item.StackName}Pipeline` ) ) - ) + ); const branch = pipeline.pipeline.stages.filter(stage => { - return stage.name === 'Source' - })[0].actions[0].configuration.Branch - const lastUpdated = pipeline.metadata.updated + return stage.name === 'Source'; + })[0].actions[0].configuration.Branch; + const lastUpdated = pipeline.metadata.updated; return { name: item.StackName, status: item.StackStatus, drift_status: item.DriftInformation.StackDriftStatus, branch: branch, updated: lastUpdated - } + }; } - return Promise.resolve(null) + return Promise.resolve(null); }) - ) + ); - const curratedStacks: Stack[] = teststacks.filter(Boolean) + const curratedStacks: Stack[] = teststacks.filter(Boolean); const options = curratedStacks.map(item => { return item.name; }); - + const input = new Input({ type: 'input', name: 'stack', message: `Subdomain of new server (${chalk.yellow('test-xxx')})` }); const stacksuffix = await input.run(); - const stackName = `photowall-${stacksuffix}` + const stackName = `photowall-${stacksuffix}`; if (options.includes(stackName)) { print.error(` - The stack ${chalk.yellow(stackName)} is already taken, try the update command instead. + The stack ${chalk.yellow( + stackName + )} is already taken, try the update command instead. `); if (toolbox.fromMenu()) { @@ -126,23 +135,35 @@ module.exports = { } else if (stackName.indexOf('photowall-test-') !== 0) { print.error(` - The stack must begin with ${chalk.yellow('test-')} and then something after like ${chalk.yellow('test-yourname-1')}. + The stack must begin with ${chalk.yellow( + 'test-' + )} and then something after like ${chalk.yellow('test-yourname-1')}. `); if (toolbox.fromMenu()) { - await toolbox.menu.showMenu('deployment testservers', defaultMenuSettings); + await toolbox.menu.showMenu( + 'deployment testservers', + defaultMenuSettings + ); } else { exit(); } } - + try { const shouldRun = await getConfirmation(branchName, stackName); if (shouldRun) { const cmd = `make create-stack STACK_ENVIRONMENT_NAME=${stacksuffix} GITHUB_BRANCH=${branchName}`; - print.fancy(`Running [${chalk.yellow(cmd)}] in folder [${`${config.photowall_repo}/cloudformation/`}]`); - const output = await system.run(cmd, {cwd: `${config.photowall_repo}/cloudformation/`, trim: true}); + print.fancy( + `Running [${chalk.yellow( + cmd + )}] in folder [${`${config.photowall_repo}/cloudformation/`}]` + ); + const output = await system.run(cmd, { + cwd: `${config.photowall_repo}/cloudformation/`, + trim: true + }); print.fancy(output); } } catch (e) { @@ -150,7 +171,10 @@ module.exports = { } if (toolbox.fromMenu()) { - await toolbox.menu.showMenu('deployment testservers', defaultMenuSettings); + await toolbox.menu.showMenu( + 'deployment testservers', + defaultMenuSettings + ); } } -} +}; diff --git a/src/commands/deployment/testservers/delete/delete.ts b/src/commands/deployment/testservers/delete/delete.ts index 3ea584e..ced927e 100644 --- a/src/commands/deployment/testservers/delete/delete.ts +++ b/src/commands/deployment/testservers/delete/delete.ts @@ -1,21 +1,23 @@ -import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu' +import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu'; import { GluegunSystem } from 'gluegun'; import { defaultMenuSettings } from '../../../../globals'; const chalk = require('chalk'); const { AutoComplete, Input, Confirm } = require('enquirer'); type Stack = { - name: string, - status: string, - drift_status: string, - branch: string, - updated: string, + name: string; + status: string; + drift_status: string; + branch: string; + updated: string; }; const getConfirmation = async (stackName: string) => { const confirm = new Confirm({ name: 'confirm', - message: `The stack ${chalk.yellow(stackName)} will be ${chalk.red.bold('deleted')}` + message: `The stack ${chalk.yellow(stackName)} will be ${chalk.red.bold( + 'deleted' + )}` }); try { @@ -23,12 +25,12 @@ const getConfirmation = async (stackName: string) => { } catch (e) { return false; } -} +}; const confirmCommand = async (cmd: string) => { const confirm = new Confirm({ name: 'confirm', - message: `RUN COMMAND > [${chalk.yellow(cmd)}] ?`, + message: `RUN COMMAND > [${chalk.yellow(cmd)}] ?` }); try { @@ -40,9 +42,9 @@ const confirmCommand = async (cmd: string) => { } catch (e) { return null; } -} +}; -const runCommand = async (system: GluegunSystem, cmd : string | null) => { +const runCommand = async (system: GluegunSystem, cmd: string | null) => { if (cmd) { return system.run(cmd); } @@ -55,12 +57,11 @@ module.exports = { description: 'Choose a testserver to delete (d)', hidden: false, run: async (toolbox: GluegunMenuToolbox) => { - const { system, strings, print } = toolbox; const stacks = JSON.parse( strings.trim(await system.run(`aws cloudformation list-stacks`)) - ) + ); const teststacks: Stack[] = await Promise.all( stacks.StackSummaries.map(async item => { if ( @@ -80,27 +81,27 @@ module.exports = { `aws codepipeline get-pipeline --name ${item.StackName}Pipeline` ) ) - ) + ); const branch = pipeline.pipeline.stages.filter(stage => { - return stage.name === 'Source' - })[0].actions[0].configuration.Branch - const lastUpdated = pipeline.metadata.updated + return stage.name === 'Source'; + })[0].actions[0].configuration.Branch; + const lastUpdated = pipeline.metadata.updated; return { name: item.StackName, status: item.StackStatus, drift_status: item.DriftInformation.StackDriftStatus, branch: branch, updated: lastUpdated - } + }; } - return Promise.resolve(null) + return Promise.resolve(null); }) - ) + ); - const curratedStacks: Stack[] = teststacks.filter(Boolean) + const curratedStacks: Stack[] = teststacks.filter(Boolean); const options = curratedStacks.map(item => { - return item.name - }) + return item.name; + }); const prompt = new AutoComplete({ name: 'testserver', @@ -115,20 +116,50 @@ module.exports = { const shouldRun = await getConfirmation(stackName); if (shouldRun) { - await runCommand(system, await confirmCommand(`aws cloudformation delete-stack --stack-name ${stackName}`)); - await runCommand(system, await confirmCommand(`aws ecr delete-repository --force --repository-name ${stackName}`)); - await runCommand(system, await confirmCommand(`aws logs delete-log-group --log-group-name /aws/codebuild/${stackName}`)); - await runCommand(system, await confirmCommand(`aws logs delete-log-group --log-group-name ${stackName}`)); - const artifacts = strings.trim( - await system.run(`aws s3 ls | grep ${stackName}-artifactbucket | awk '{print $3}'`) - ).split('\n'); + await runCommand( + system, + await confirmCommand( + `aws cloudformation delete-stack --stack-name ${stackName}` + ) + ); + await runCommand( + system, + await confirmCommand( + `aws ecr delete-repository --force --repository-name ${stackName}` + ) + ); + await runCommand( + system, + await confirmCommand( + `aws logs delete-log-group --log-group-name /aws/codebuild/${stackName}` + ) + ); + await runCommand( + system, + await confirmCommand( + `aws logs delete-log-group --log-group-name ${stackName}` + ) + ); + const artifacts = strings + .trim( + await system.run( + `aws s3 ls | grep ${stackName}-artifactbucket | awk '{print $3}'` + ) + ) + .split('\n'); for (const artifact of artifacts) { - await runCommand(system, await confirmCommand(`aws s3 rb --force s3://${artifact}`)); + await runCommand( + system, + await confirmCommand(`aws s3 rb --force s3://${artifact}`) + ); } } if (toolbox.fromMenu()) { - await toolbox.menu.showMenu('deployment testservers', defaultMenuSettings); + await toolbox.menu.showMenu( + 'deployment testservers', + defaultMenuSettings + ); } } -} +}; diff --git a/src/commands/deployment/testservers/status/status.ts b/src/commands/deployment/testservers/status/status.ts index 06f7944..cce7a6f 100644 --- a/src/commands/deployment/testservers/status/status.ts +++ b/src/commands/deployment/testservers/status/status.ts @@ -1,14 +1,14 @@ -import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu' +import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu'; import chalk = require('chalk'); import { defaultMenuSettings } from '../../../../globals'; const tto = require('terminal-table-output').create(); type Stack = { - name: string, - status: string, - drift_status: string, - branch: string, - updated: string, + name: string; + status: string; + drift_status: string; + branch: string; + updated: string; }; module.exports = { @@ -17,44 +17,64 @@ module.exports = { description: 'Show status for available testservers (s)', hidden: false, run: async (toolbox: GluegunMenuToolbox) => { + const { system, strings } = toolbox; - const { system, strings } = toolbox - - const stacks = JSON.parse(strings.trim(await system.run(`aws cloudformation list-stacks`))); - const teststacks: Stack[] = await Promise.all(stacks.StackSummaries.map(async (item) => { - if (item.StackName.indexOf('photowall-test-') > -1 && ['CREATE_COMPLETE', 'UPDATE_COMPLETE', 'UPDATE_IN_PROGRESS', 'UPDATE_FAILED', 'CREATE_FAILED', 'CREATE_IN_PROGRESS'].includes(item.StackStatus)) { - try { - const pipeline = JSON.parse(strings.trim(await system.run(`aws codepipeline get-pipeline --name ${item.StackName}Pipeline`))); - const sourceStage = pipeline.pipeline.stages.filter(stage => { - return stage.name === 'Source'; - }); - const branch = sourceStage[0].actions[0].configuration.Branch ?? sourceStage[0].actions[0].configuration.BranchName; - const lastUpdated = pipeline.metadata.updated; - return { - name: item.StackName, - status: item.StackStatus, - drift_status: item.DriftInformation.StackDriftStatus, - branch: branch, - updated: lastUpdated, - } - } catch (e) { - return { - name: item.StackName, - status: 'NO_STATUS', - drift_status: '', - branch: '', - updated: '', + const stacks = JSON.parse( + strings.trim(await system.run(`aws cloudformation list-stacks`)) + ); + const teststacks: Stack[] = await Promise.all( + stacks.StackSummaries.map(async item => { + if ( + item.StackName.indexOf('photowall-test-') > -1 && + [ + 'CREATE_COMPLETE', + 'UPDATE_COMPLETE', + 'UPDATE_IN_PROGRESS', + 'UPDATE_FAILED', + 'CREATE_FAILED', + 'CREATE_IN_PROGRESS' + ].includes(item.StackStatus) + ) { + try { + const pipeline = JSON.parse( + strings.trim( + await system.run( + `aws codepipeline get-pipeline --name ${item.StackName}Pipeline` + ) + ) + ); + const sourceStage = pipeline.pipeline.stages.filter(stage => { + return stage.name === 'Source'; + }); + const branch = + sourceStage[0].actions[0].configuration.Branch ?? + sourceStage[0].actions[0].configuration.BranchName; + const lastUpdated = pipeline.metadata.updated; + return { + name: item.StackName, + status: item.StackStatus, + drift_status: item.DriftInformation.StackDriftStatus, + branch: branch, + updated: lastUpdated + }; + } catch (e) { + return { + name: item.StackName, + status: 'NO_STATUS', + drift_status: '', + branch: '', + updated: '' + }; } } - - } - return Promise.resolve(null); - })); + return Promise.resolve(null); + }) + ); const curratedStacks: Stack[] = teststacks.filter(Boolean); const status = (status: string) => { - switch(status) { + switch (status) { case 'NO_STATUS': return `(${chalk.red.bold('?')})`; case 'UPDATE_FAILED': @@ -67,10 +87,12 @@ module.exports = { case 'CREATE_COMPLETE': return `(${chalk.greenBright('OK')})`; } - } + }; const stackUrl = (stackname: string) => { - return `https://test-${stackname.split('photowall-test-')[1]}.photowall-test.com/us`; + return `https://test-${ + stackname.split('photowall-test-')[1] + }.photowall-test.com/us`; }; const ellipsis = (a: string, max: number) => { @@ -88,30 +110,31 @@ module.exports = { let interval = seconds / 31536000; if (interval > 1) { - return Math.floor(interval) + " years"; + return Math.floor(interval) + ' years'; } interval = seconds / 2592000; if (interval > 1) { - return `${chalk.red(Math.floor(interval) + " months")}`; + return `${chalk.red(Math.floor(interval) + ' months')}`; } interval = seconds / 86400; if (interval > 1) { const days = Math.floor(interval); - return `${chalk[days >= 14 ? 'yellow' : 'green'](days + " days")}`; + return `${chalk[days >= 14 ? 'yellow' : 'green'](days + ' days')}`; } interval = seconds / 3600; if (interval > 1) { - return `${chalk.green(Math.floor(interval) + " hours")}`; + return `${chalk.green(Math.floor(interval) + ' hours')}`; } interval = seconds / 60; if (interval > 1) { - return `${chalk.green(Math.floor(interval) + " minutes")}`; + return `${chalk.green(Math.floor(interval) + ' minutes')}`; } - return Math.floor(seconds) + " seconds"; - } + return Math.floor(seconds) + ' seconds'; + }; tto.line('-'); - tto.pushrow(['| status', 'stack', 'branch', 'time since update', 'url']) + tto + .pushrow(['| status', 'stack', 'branch', 'time since update', 'url']) .line('-'); // Sort on stackname curratedStacks.sort((a, b) => { @@ -121,12 +144,21 @@ module.exports = { }); for (const stack of curratedStacks) { const t = new Date(stack.updated); - tto.pushrow([status(stack.status), stack.name, ellipsis(stack.branch, 24), timeSince(t.getTime()), stackUrl(stack.name)]); + tto.pushrow([ + status(stack.status), + stack.name, + ellipsis(stack.branch, 24), + timeSince(t.getTime()), + stackUrl(stack.name) + ]); } tto.print(true); if (toolbox.fromMenu()) { - await toolbox.menu.showMenu('deployment testservers', defaultMenuSettings); + await toolbox.menu.showMenu( + 'deployment testservers', + defaultMenuSettings + ); } } -} +}; diff --git a/src/commands/deployment/testservers/update/update.ts b/src/commands/deployment/testservers/update/update.ts index 75a5093..d7cacb2 100644 --- a/src/commands/deployment/testservers/update/update.ts +++ b/src/commands/deployment/testservers/update/update.ts @@ -1,26 +1,35 @@ -import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu' +import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu'; const chalk = require('chalk'); const { AutoComplete, Input, Confirm } = require('enquirer'); -import { Octokit } from "@octokit/core"; +import { Octokit } from '@octokit/core'; import { exit } from 'process'; -import { defaultMenuSettings, getCurrentBranch, getSettings, sleep } from '../../../../globals'; +import { + defaultMenuSettings, + getCurrentBranch, + getSettings, + sleep +} from '../../../../globals'; type Stack = { - name: string - status: string - drift_status: string - branch: string - updated: string -} + name: string; + status: string; + drift_status: string; + branch: string; + updated: string; +}; -const getBranchName = async (toolbox: GluegunMenuToolbox, token: string, repoPath: string) => { - const {print} = toolbox; +const getBranchName = async ( + toolbox: GluegunMenuToolbox, + token: string, + repoPath: string +) => { + const { print } = toolbox; const currentBranch = await getCurrentBranch(repoPath, toolbox); const input = new Input({ type: 'input', name: 'branch', message: 'What github branch should be deployed?', - initial: currentBranch, + initial: currentBranch }); const responseBranch = await input.run(); @@ -28,11 +37,14 @@ const getBranchName = async (toolbox: GluegunMenuToolbox, token: string, repoPat const octokit = new Octokit({ auth: token }); try { - const response = await octokit.request("GET /repos/{owner}/{repo}/branches/{branch}", { - owner: "photowall", - repo: "photowall", - branch: responseBranch - }); + const response = await octokit.request( + 'GET /repos/{owner}/{repo}/branches/{branch}', + { + owner: 'photowall', + repo: 'photowall', + branch: responseBranch + } + ); if (response.status === 200) { return responseBranch; } @@ -45,7 +57,9 @@ const getBranchName = async (toolbox: GluegunMenuToolbox, token: string, repoPat const getConfirmation = async (branchName: string, stackName: string) => { const confirm = new Confirm({ name: 'confirm', - message: `The branch ${chalk.green(branchName)} will deploy to ${chalk.yellow(stackName)}` + message: `The branch ${chalk.green( + branchName + )} will deploy to ${chalk.yellow(stackName)}` }); try { @@ -54,7 +68,7 @@ const getConfirmation = async (branchName: string, stackName: string) => { console.error(e); return false; } -} +}; module.exports = { name: 'update', @@ -63,10 +77,10 @@ module.exports = { hidden: false, run: async (toolbox: GluegunMenuToolbox) => { const { system, strings, print } = toolbox; - + // Load settings const config = await getSettings(toolbox); - if (!config || (!config.photowall_repo || config.photowall_repo === "")) { + if (!config || !config.photowall_repo || config.photowall_repo === '') { print.error(` The create command requires that you set an absolute path to your local photowall repository. @@ -78,12 +92,16 @@ module.exports = { let branchName = null; while (!branchName) { - branchName = await getBranchName(toolbox, config.gh_token, config.photowall_repo); + branchName = await getBranchName( + toolbox, + config.gh_token, + config.photowall_repo + ); } const stacks = JSON.parse( strings.trim(await system.run(`aws cloudformation list-stacks`)) - ) + ); const teststacks: Stack[] = await Promise.all( stacks.StackSummaries.map(async item => { if ( @@ -103,28 +121,28 @@ module.exports = { `aws codepipeline get-pipeline --name ${item.StackName}Pipeline` ) ) - ) + ); const branch = pipeline.pipeline.stages.filter(stage => { - return stage.name === 'Source' - })[0].actions[0].configuration.Branch - const lastUpdated = pipeline.metadata.updated + return stage.name === 'Source'; + })[0].actions[0].configuration.Branch; + const lastUpdated = pipeline.metadata.updated; return { name: item.StackName, status: item.StackStatus, drift_status: item.DriftInformation.StackDriftStatus, branch: branch, updated: lastUpdated - } + }; } - return Promise.resolve(null) + return Promise.resolve(null); }) - ) + ); - const curratedStacks: Stack[] = teststacks.filter(Boolean) + const curratedStacks: Stack[] = teststacks.filter(Boolean); const options = curratedStacks.map(item => { return item.name; }); - + const prompt = new AutoComplete({ name: 'testserver', message: 'Choose a server', @@ -141,48 +159,69 @@ module.exports = { if (shouldRun) { const cmd = `make update-stack STACK_ENVIRONMENT_NAME=${stacksuffix} GITHUB_BRANCH=${branchName}`; - print.fancy(`Running [${chalk.yellow(cmd)}] in folder [${`${config.photowall_repo}/cloudformation/`}]`); - const output = await system.run(cmd, {cwd: `${config.photowall_repo}/cloudformation/`, trim: true}); + print.fancy( + `Running [${chalk.yellow( + cmd + )}] in folder [${`${config.photowall_repo}/cloudformation/`}]` + ); + const output = await system.run(cmd, { + cwd: `${config.photowall_repo}/cloudformation/`, + trim: true + }); print.fancy(output); // Check the status const spinner = print.spin(`Waiting for stack to update`); - let currentStackStatus = ""; - while (currentStackStatus !== "UPDATE_COMPLETE") { + let currentStackStatus = ''; + while (currentStackStatus !== 'UPDATE_COMPLETE') { const stackCmd = `aws cloudformation describe-stacks --stack-name photowall-${stacksuffix}`; - const response = await system.run(stackCmd, {trim: true}); + const response = await system.run(stackCmd, { trim: true }); const stackData = JSON.parse(response); currentStackStatus = stackData.Stacks[0].StackStatus; + let statusOutput = ''; switch (currentStackStatus) { - case "UPDATE_IN_PROGRESS": - spinner.text = `[${chalk.red(currentStackStatus)}]: Updating the stack`; - case "UPDATE_COMPLETE_CLEANUP_IN_PROGRESS": - spinner.text = `[${chalk.yellow(currentStackStatus)}]: Almost done, cleanup in progress`; - case "UPDATE_COMPLETE": - spinner.text = `[${chalk.green(currentStackStatus)}]: Update complete`; + case 'UPDATE_COMPLETE_CLEANUP_IN_PROGRESS': + statusOutput = `[${chalk.yellow( + currentStackStatus + )}]: Almost done, cleanup in progress`; + break; + case 'UPDATE_COMPLETE': + statusOutput = `[${chalk.green( + currentStackStatus + )}]: Update complete`; + break; + default: + statusOutput = `[${chalk.red( + currentStackStatus + )}]: Updating the stack`; break; } + spinner.text = statusOutput; if (currentStackStatus !== 'UPDATE_COMPLETE') { await sleep(1000); } } - spinner.text = `Will start the pipeline now [${chalk.yellow(`photowall-${stacksuffix}Pipeline`)}]`; + spinner.text = `Will start the pipeline now [${chalk.yellow( + `photowall-${stacksuffix}Pipeline` + )}]`; const runPipelineCmd = `aws codepipeline start-pipeline-execution --name photowall-${stacksuffix}Pipeline`; await system.run(runPipelineCmd); await sleep(2000); spinner.stop(); print.fancy('Pipeline started, bye! 🚀'); } - } catch (e) { - console.log(`e`, e) + console.log(`e`, e); } if (toolbox.fromMenu()) { - await toolbox.menu.showMenu('deployment testservers', defaultMenuSettings) + await toolbox.menu.showMenu( + 'deployment testservers', + defaultMenuSettings + ); } else { exit(); } } -} +}; diff --git a/src/commands/setup/settings/settings.ts b/src/commands/setup/settings/settings.ts index b2434af..8cb8a69 100644 --- a/src/commands/setup/settings/settings.ts +++ b/src/commands/setup/settings/settings.ts @@ -5,14 +5,14 @@ import { defaultMenuSettings, getSettings } from '../../../globals'; const { Confirm, Input } = require('enquirer'); const checkCLIProgram = async (toolbox: GluegunMenuToolbox, cmd: string) => { - const {print, system, strings} = toolbox; + const { print, system, strings } = toolbox; try { const result = strings.trim(await system.run(`command -v ${cmd}`)); return true; - } catch(e) { + } catch (e) { return false; } -} +}; module.exports = { name: 'settings', @@ -20,10 +20,10 @@ module.exports = { description: 'Setup settings for pwcli (se)', hidden: false, run: async (toolbox: GluegunMenuToolbox) => { + const { print, system, strings } = toolbox; - const {print, system, strings} = toolbox; - - print.info(chalk.yellow(` + print.info( + chalk.yellow(` This will help you setup everything needed to run pwcli on a mac (maby linux). All settings will be saved to ${chalk.cyan('~/.pwcli_settings')} @@ -31,7 +31,8 @@ module.exports = { First step is to install aws cli [https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html] and configuring it. Install it either with brew or do as specified in the link. - `)); + `) + ); let config = await getSettings(toolbox); @@ -40,7 +41,7 @@ module.exports = { // print.info(`\nDetected ${chalk.green('brew')}`); // } else { // print.info(`\nRequired program ${chalk.green('brew')} is not installed.`); - + // if (await (new Confirm({ // name: 'confirm', // message: `Do you want pwcli to install it?` @@ -93,7 +94,7 @@ module.exports = { // name: 'confirm', // message: `Is ${chalk.green('aws cli')} installed and configured?` // })).run()) { - + // } else { // print.info('😔 ok, install it and run ..'); // await toolbox.menu.showMenu(); @@ -101,38 +102,48 @@ module.exports = { // } await system.run('touch ~/.pwcli_settings'); - print.info(`Created configuration file ${chalk.yellow(`~/.pwcli_settings`)}`); + print.info( + `Created configuration file ${chalk.yellow(`~/.pwcli_settings`)}` + ); if (!config) { config = { gh_token: '', - photowall_repo: '', + photowall_repo: '' }; } - - config.gh_token = await (new Input({ - message: `A github accesstoken is required with ${chalk.yellow('Full control of private repositories')}, please insert the key >`, - initial: config.gh_token, - })).run(); - config.photowall_repo = await (new Input({ + config.gh_token = await new Input({ + message: `A github accesstoken is required with ${chalk.yellow( + 'Full control of private repositories' + )}, please insert the key >`, + initial: config.gh_token + }).run(); + + config.photowall_repo = await new Input({ message: `If you want to be able to use current branch in your photowall repository\nor the create and update commands for testservers, please insert\nthe absolute path to the project or leave blank >`, - initial: config.photowall_repo, - })).run(); + initial: config.photowall_repo + }).run(); print.info(` ${JSON.stringify(config)} `); - if (await (new Confirm({ - message: `Ok to save the these settings to ${chalk.yellow(`~/.pwcli_settings`)}?` - })).run()) { + if ( + await new Confirm({ + message: `Ok to save the these settings to ${chalk.yellow( + `~/.pwcli_settings` + )}?` + }).run() + ) { await system.run(`echo '${JSON.stringify(config)}' > ~/.pwcli_settings`); } else { print.info('Ok then.'); - if (toolbox.fromMenu()) await toolbox.menu.showMenu(null, defaultMenuSettings); + if (toolbox.fromMenu()) + await toolbox.menu.showMenu(null, defaultMenuSettings); } - if (toolbox.fromMenu()) await toolbox.menu.showMenu(null, defaultMenuSettings); + if (toolbox.fromMenu()) + await toolbox.menu.showMenu(null, defaultMenuSettings); } }; diff --git a/src/commands/workflow/setupissue/setupissue.ts b/src/commands/workflow/setupissue/setupissue.ts index c9459b5..e5ec93a 100644 --- a/src/commands/workflow/setupissue/setupissue.ts +++ b/src/commands/workflow/setupissue/setupissue.ts @@ -2,9 +2,14 @@ import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu'; import { Octokit } from '@octokit/core'; import chalk = require('chalk'); import { system } from 'gluegun'; -import { confirmMessage, defaultMenuSettings, getSettings, issueToBranchName } from '../../../globals'; -import { createPullRequest, getIssueFromRepo, getOpenIssuesFromRepo, getOrgIssues, getOrgRepos } from '../../../services/github_rest'; -const { AutoComplete, Confirm, Input } = require('enquirer'); +import { + confirmMessage, + defaultMenuSettings, + getSettings, + issueToBranchName +} from '../../../globals'; +import { getIssueFromRepo, getOrgIssues } from '../../../services/github_rest'; +const { AutoComplete } = require('enquirer'); module.exports = { name: 'SetupIssue', @@ -12,8 +17,7 @@ module.exports = { description: 'Setup everything for a issue (si)', hidden: false, run: async (toolbox: GluegunMenuToolbox) => { - - const {print, system, strings} = toolbox; + const { print, system, strings } = toolbox; // Load settings const config = await getSettings(toolbox); @@ -24,9 +28,11 @@ module.exports = { const repos = await getOrgIssues(toolbox, config.gh_token); const issueOptions = repos.flatMap(repo => { - return repo.issues.map(issue => `${issue.number}-${repo.repo}-${issue.title}`); - }) - + return repo.issues.map( + issue => `${issue.number}-${repo.repo}-${issue.title}` + ); + }); + const promptIssues = new AutoComplete({ name: 'issues', message: 'Select issue', @@ -38,14 +44,30 @@ module.exports = { const issueNumber = issueResponse.split('-')[0]; const repo = issueResponse.split('-')[1]; - const issueData = await getIssueFromRepo(toolbox, config.gh_token, repo, issueNumber); + const issueData = await getIssueFromRepo( + toolbox, + config.gh_token, + repo, + issueNumber + ); const branchName = issueToBranchName(issueData); - if (await confirmMessage(`Create new branch ${chalk.yellow(branchName)} from origin/master?`)) { - await system.run(`git checkout -b ${branchName} origin/master`, {cwd: config.photowall_repo, trim: true}); - await system.run(`git push -u origin ${branchName}`, {cwd: config.photowall_repo, trim: true}); + if ( + await confirmMessage( + `Create new branch ${chalk.yellow(branchName)} from origin/master?` + ) + ) { + await system.run(`git checkout -b ${branchName} origin/master`, { + cwd: config.photowall_repo, + trim: true + }); + await system.run(`git push -u origin ${branchName}`, { + cwd: config.photowall_repo, + trim: true + }); } - if (toolbox.fromMenu()) await toolbox.menu.showMenu('workflow', defaultMenuSettings); + if (toolbox.fromMenu()) + await toolbox.menu.showMenu('workflow', defaultMenuSettings); } }; diff --git a/src/extensions/cli-extension.ts b/src/extensions/cli-extension.ts index fd58ecc..4bfc1ce 100644 --- a/src/extensions/cli-extension.ts +++ b/src/extensions/cli-extension.ts @@ -1,13 +1,11 @@ - -import { GluegunToolbox } from 'gluegun' - +import { GluegunToolbox } from 'gluegun'; // add your CLI-specific functionality here, which will then be accessible // to your commands module.exports = (toolbox: GluegunToolbox) => { toolbox.foo = () => { - toolbox.print.info('called foo extension') - } + toolbox.print.info('called foo extension'); + }; // enable this if you want to read configuration in from // the current folder's package.json (in a "pwcli" property), @@ -16,4 +14,4 @@ module.exports = (toolbox: GluegunToolbox) => { // ...toolbox.config, // ...toolbox.config.loadConfig("pwcli", process.cwd()) // } -} +}; diff --git a/src/globals.ts b/src/globals.ts index 429b41a..83eb256 100644 --- a/src/globals.ts +++ b/src/globals.ts @@ -66,6 +66,6 @@ export const confirmMessage = async (message: string) => { } }; -export const sleep = (milliseconds) => { - return new Promise(resolve => setTimeout(resolve, milliseconds)) -} +export const sleep = milliseconds => { + return new Promise(resolve => setTimeout(resolve, milliseconds)); +}; diff --git a/src/services/github_rest.ts b/src/services/github_rest.ts index bb4984c..69c751c 100644 --- a/src/services/github_rest.ts +++ b/src/services/github_rest.ts @@ -1,12 +1,12 @@ -import { Octokit } from "@octokit/core"; +import { Octokit } from '@octokit/core'; export const getOrgRepos = async (toolbox, token, org) => { const { print } = toolbox; const octokit = new Octokit({ auth: token }); try { - const response = await octokit.request("GET /orgs/{org}/repos", { + const response = await octokit.request('GET /orgs/{org}/repos', { org: org, - per_page: 100, + per_page: 100 }); if (response.status === 200) { return response.data; @@ -21,9 +21,9 @@ export const getRepo = async (toolbox, token, owner, repo) => { const { print } = toolbox; const octokit = new Octokit({ auth: token }); try { - const response = await octokit.request("GET /repos/{owner}/{repo}", { + const response = await octokit.request('GET /repos/{owner}/{repo}', { owner: owner, - repo: repo, + repo: repo }); if (response.status === 200) { return response.data; @@ -32,19 +32,22 @@ export const getRepo = async (toolbox, token, owner, repo) => { print.error('Not a valid organisation for your token access'); return null; } -} +}; export const getRepoBranches = async (toolbox, token, owner, repo) => { const { print } = toolbox; const octokit = new Octokit({ auth: token }); - + const getBranches = async (toolbox, token, owner, repo, page) => { - const response = await octokit.request("GET /repos/{owner}/{repo}/branches", { - owner: owner, - repo: repo, - page: page, - per_page: 100, - }); + const response = await octokit.request( + 'GET /repos/{owner}/{repo}/branches', + { + owner: owner, + repo: repo, + page: page, + per_page: 100 + } + ); return response; }; @@ -62,29 +65,31 @@ export const getRepoBranches = async (toolbox, token, owner, repo) => { } return allBranches; -} +}; export const getOrgIssues = async (toolbox, token) => { // const { print } = toolbox; const repos = await getOrgRepos(toolbox, token, 'Photowall'); const repoNames = repos.map(item => item.name); - const allIssues = await Promise.all(repoNames.map(async (repoName) => { - const issues = await getOpenIssuesFromRepo(toolbox, token, repoName); - // console.log(`${repoName} - issues`, issues.length); - // return issues.map(item => `${item.number}-${item.title.substring(0, 10)}`); - return {repo: repoName, issues: issues}; - })); + const allIssues = await Promise.all( + repoNames.map(async repoName => { + const issues = await getOpenIssuesFromRepo(toolbox, token, repoName); + // console.log(`${repoName} - issues`, issues.length); + // return issues.map(item => `${item.number}-${item.title.substring(0, 10)}`); + return { repo: repoName, issues: issues }; + }) + ); return allIssues.flat(); -} +}; export const getOpenIssuesFromRepo = async (toolbox, token, repo) => { const { print } = toolbox; const octokit = new Octokit({ auth: token }); try { - const response = await octokit.request("GET /repos/{owner}/{repo}/issues", { - owner: "Photowall", + const response = await octokit.request('GET /repos/{owner}/{repo}/issues', { + owner: 'Photowall', repo: repo, - per_page: 100, + per_page: 100 }); if (response.status === 200) { return response.data; @@ -93,17 +98,20 @@ export const getOpenIssuesFromRepo = async (toolbox, token, repo) => { print.error('Not a valid issuenumber for this repository'); return null; } -} +}; export const getIssueFromRepo = async (toolbox, token, repo, issueNumber) => { const { print } = toolbox; const octokit = new Octokit({ auth: token }); try { - const response = await octokit.request("GET /repos/{owner}/{repo}/issues/{issue_number}", { - owner: "Photowall", - repo: repo, - issue_number: issueNumber, - }); + const response = await octokit.request( + 'GET /repos/{owner}/{repo}/issues/{issue_number}', + { + owner: 'Photowall', + repo: repo, + issue_number: issueNumber + } + ); if (response.status === 200) { return response.data; } @@ -111,9 +119,14 @@ export const getIssueFromRepo = async (toolbox, token, repo, issueNumber) => { print.error('Not a valid issuenumber for this repository'); return null; } -} +}; -export const createPullRequest = async (toolbox, token: string, repo: string, branch: string) => { +export const createPullRequest = async ( + toolbox, + token: string, + repo: string, + branch: string +) => { const { print } = toolbox; const octokit = new Octokit({ auth: token }); try { @@ -131,6 +144,4 @@ export const createPullRequest = async (toolbox, token: string, repo: string, br print.error('Not a valid branch'); return null; } - - -} +}; diff --git a/tsconfig.json b/tsconfig.json index 6089d59..4c390b3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,8 @@ { "compilerOptions": { + "esModuleInterop": true, + "emitDecoratorMetadata": true, + "strictPropertyInitialization": false, "allowSyntheticDefaultImports": false, "experimentalDecorators": true, "lib": [ @@ -19,7 +22,7 @@ "inlineSourceMap": true, "outDir": "build", "strict": false, - "target": "es5", + "target": "es2020", "declaration": true, "declarationDir": "build/types" }, diff --git a/yarn.lock b/yarn.lock index fb5d670..967186b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -221,6 +221,40 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@eslint/eslintrc@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" + integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.4.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@jest/console@^24.7.1", "@jest/console@^24.9.0": version "24.9.0" resolved "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz" @@ -374,6 +408,27 @@ resolved "https://registry.npmjs.org/@lenne.tech/gluegun-menu/-/gluegun-menu-0.0.5.tgz" integrity sha512-J/Tx4cFMn1nungGi7n3tJ2cvt0LJUeNuLAsDS9TbXtUomdz0/2kMZJq/m2HaUxWWeyIYSu4TSWGLIV8SQrgwTA== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + "@octokit/auth-token@^2.4.4": version "2.5.0" resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz" @@ -505,6 +560,11 @@ dependencies: jest-diff "^24.3.0" +"@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + "@types/node@^12.7.11": version "12.20.36" resolved "https://registry.npmjs.org/@types/node/-/node-12.20.36.tgz" @@ -515,6 +575,11 @@ resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/semver@^7.3.12": + version "7.3.13" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" + integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz" @@ -532,6 +597,90 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^5.44.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz#fb48c31cadc853ffc1dc35373f56b5e2a8908fe9" + integrity sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ== + dependencies: + "@typescript-eslint/scope-manager" "5.50.0" + "@typescript-eslint/type-utils" "5.50.0" + "@typescript-eslint/utils" "5.50.0" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.44.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.50.0.tgz#a33f44b2cc83d1b7176ec854fbecd55605b0b032" + integrity sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ== + dependencies: + "@typescript-eslint/scope-manager" "5.50.0" + "@typescript-eslint/types" "5.50.0" + "@typescript-eslint/typescript-estree" "5.50.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz#90b8a3b337ad2c52bbfe4eac38f9164614e40584" + integrity sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg== + dependencies: + "@typescript-eslint/types" "5.50.0" + "@typescript-eslint/visitor-keys" "5.50.0" + +"@typescript-eslint/type-utils@5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.50.0.tgz#509d5cc9728d520008f7157b116a42c5460e7341" + integrity sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ== + dependencies: + "@typescript-eslint/typescript-estree" "5.50.0" + "@typescript-eslint/utils" "5.50.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.50.0.tgz#c461d3671a6bec6c2f41f38ed60bd87aa8a30093" + integrity sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w== + +"@typescript-eslint/typescript-estree@5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz#0b9b82975bdfa40db9a81fdabc7f93396867ea97" + integrity sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow== + dependencies: + "@typescript-eslint/types" "5.50.0" + "@typescript-eslint/visitor-keys" "5.50.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.50.0.tgz#807105f5ffb860644d30d201eefad7017b020816" + integrity sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw== + dependencies: + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.50.0" + "@typescript-eslint/types" "5.50.0" + "@typescript-eslint/typescript-estree" "5.50.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz#b752ffc143841f3d7bc57d6dd01ac5c40f8c4903" + integrity sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg== + dependencies: + "@typescript-eslint/types" "5.50.0" + eslint-visitor-keys "^3.3.0" + abab@^2.0.0: version "2.0.5" resolved "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz" @@ -545,6 +694,11 @@ acorn-globals@^4.1.0: acorn "^6.0.1" acorn-walk "^6.0.1" +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + acorn-walk@^6.0.1: version "6.2.0" resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz" @@ -560,7 +714,12 @@ acorn@^6.0.1: resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -ajv@^6.12.3: +acorn@^8.8.0: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -639,12 +798,10 @@ arg@^4.1.0: resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== arr-diff@^4.0.0: version "4.0.0" @@ -666,6 +823,11 @@ array-equal@^1.0.0: resolved "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz" integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" @@ -829,6 +991,13 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" @@ -871,11 +1040,6 @@ buffer-from@1.x, buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - cache-base@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" @@ -931,7 +1095,7 @@ caseless@~0.12.0: resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -940,7 +1104,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1060,11 +1224,6 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.12.1: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" @@ -1103,7 +1262,7 @@ cosmiconfig@7.0.1: path-type "^4.0.0" yaml "^1.10.0" -cross-spawn@7.0.3, cross-spawn@^7.0.3: +cross-spawn@7.0.3, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -1165,6 +1324,13 @@ debug@^4.1.0, debug@^4.1.1: dependencies: ms "2.1.2" +debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" @@ -1175,7 +1341,7 @@ decode-uri-component@^0.2.0: resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -deep-is@~0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -1241,13 +1407,19 @@ diff@^4.0.1: resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -doctrine@0.7.2: - version "0.7.2" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz" - integrity sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM= +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: - esutils "^1.1.6" - isarray "0.0.1" + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" domexception@^1.0.1: version "1.0.1" @@ -1357,6 +1529,11 @@ escape-string-regexp@^2.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escodegen@^1.9.1: version "1.14.3" resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz" @@ -1369,20 +1546,133 @@ escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" -esprima@^4.0.0, esprima@^4.0.1: +eslint-config-prettier@^8.5.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz#dec1d29ab728f4fa63061774e1672ac4e363d207" + integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA== + +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.28.0: + version "8.33.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.33.0.tgz#02f110f32998cb598c6461f24f4d306e41ca33d7" + integrity sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA== + dependencies: + "@eslint/eslintrc" "^1.4.1" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.4.0: + version "9.4.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" + integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esprima@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -estraverse@^4.2.0: +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -esutils@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz" - integrity sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U= +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" @@ -1496,21 +1786,44 @@ extsprintf@^1.2.0: resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + fb-watchman@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" @@ -1518,6 +1831,13 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" @@ -1540,6 +1860,13 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + find-up@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" @@ -1547,6 +1874,27 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + follow-redirects@^1.14.0: version "1.14.7" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz" @@ -1662,6 +2010,20 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: version "7.2.0" resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" @@ -1679,6 +2041,25 @@ globals@^11.1.0: resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + gluegun@latest: version "5.0.0" resolved "https://registry.npmjs.org/gluegun/-/gluegun-5.0.0.tgz" @@ -1720,6 +2101,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + growly@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz" @@ -1841,7 +2227,12 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -import-fresh@^3.2.1: +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -2000,6 +2391,11 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" @@ -2015,6 +2411,13 @@ is-generator-fn@^2.0.0: resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" @@ -2039,6 +2442,16 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" @@ -2110,11 +2523,6 @@ is-wsl@^1.1.0: resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - isarray@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" @@ -2551,18 +2959,22 @@ jest@^24.1.0: import-local "^2.0.0" jest-cli "^24.9.0" +js-sdsl@^4.1.4: + version "4.3.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" + integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: - argparse "^1.0.7" - esprima "^4.0.0" + argparse "^2.0.1" jsbn@~0.1.0: version "0.1.1" @@ -2626,6 +3038,11 @@ json-schema@0.2.3: resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" @@ -2687,6 +3104,14 @@ leven@^3.1.0: resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + levn@~0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" @@ -2718,6 +3143,13 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" @@ -2743,6 +3175,11 @@ lodash.memoize@4.x: resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.pad@^4.5.1: version "4.5.1" resolved "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz" @@ -2866,6 +3303,11 @@ merge-stream@^2.0.0: resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" @@ -2885,6 +3327,14 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + mime-db@1.50.0: version "1.50.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz" @@ -2909,6 +3359,13 @@ minimatch@^3.0.2, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimatch@^3.0.5, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" @@ -2961,6 +3418,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" @@ -3128,6 +3590,18 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + ora@4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/ora/-/ora-4.0.2.tgz" @@ -3160,6 +3634,13 @@ p-limit@^2.0.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" @@ -3167,6 +3648,13 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-reduce@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz" @@ -3217,6 +3705,11 @@ path-exists@^3.0.0: resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" @@ -3259,6 +3752,11 @@ picocolors@^1.0.0: resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + pify@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" @@ -3298,11 +3796,23 @@ posix-character-classes@^0.1.0: resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + prettier@^1.12.1: version "1.19.1" resolved "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz" @@ -3349,6 +3859,11 @@ qs@~6.5.2: resolved "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + react-is@^16.8.4: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" @@ -3386,6 +3901,11 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" @@ -3480,7 +4000,7 @@ resolve@1.1.7: resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.x, resolve@^1.10.0, resolve@^1.3.2: +resolve@1.x, resolve@^1.10.0: version "1.20.0" resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -3501,6 +4021,11 @@ ret@~0.1.10: resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" @@ -3508,11 +4033,25 @@ rimraf@^2.5.4, rimraf@^2.6.3: dependencies: glob "^7.1.3" +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + rsvp@^4.8.4: version "4.8.5" resolved "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + safe-buffer@^5.0.1, safe-buffer@^5.1.2: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" @@ -3555,7 +4094,7 @@ sax@^1.2.4: resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5, semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.5, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -3572,6 +4111,13 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.3.7: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" @@ -3640,6 +4186,11 @@ slash@^2.0.0: resolved "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" @@ -3737,11 +4288,6 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - sshpk@^1.7.0: version "1.16.1" resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz" @@ -3870,6 +4416,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" @@ -3913,6 +4464,11 @@ test-exclude@^5.2.3: read-pkg-up "^4.0.0" require-main-filename "^2.0.0" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + throat@^4.0.0: version "4.1.0" resolved "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz" @@ -3943,6 +4499,13 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" @@ -4000,66 +4563,14 @@ ts-node@^8.4.1: source-map-support "^0.5.17" yn "3.1.1" -tslib@1.9.0: - version "1.9.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz" - integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ== - -tslib@^1.8.0, tslib@^1.8.1: +tslib@^1.8.1: version "1.14.1" resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslint-config-prettier@^1.17.0: - version "1.18.0" - resolved "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz" - integrity sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg== - -tslint-config-standard@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/tslint-config-standard/-/tslint-config-standard-8.0.1.tgz" - integrity sha512-OWG+NblgjQlVuUS/Dmq3ax2v5QDZwRx4L0kEuDi7qFY9UI6RJhhNfoCV1qI4el8Fw1c5a5BTrjQJP0/jhGXY/Q== - dependencies: - tslint-eslint-rules "^5.3.1" - -tslint-eslint-rules@^5.3.1: - version "5.4.0" - resolved "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz" - integrity sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w== - dependencies: - doctrine "0.7.2" - tslib "1.9.0" - tsutils "^3.0.0" - -tslint@^5.12.0: - version "5.20.1" - resolved "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz" - integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg== - dependencies: - "@babel/code-frame" "^7.0.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^4.0.1" - glob "^7.1.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - mkdirp "^0.5.1" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.8.0" - tsutils "^2.29.0" - -tsutils@^2.29.0: - version "2.29.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - dependencies: - tslib "^1.8.1" - -tsutils@^3.0.0: +tsutils@^3.21.0: version "3.21.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" @@ -4076,6 +4587,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" @@ -4083,6 +4601,11 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + typescript@^3.6.3: version "3.9.10" resolved "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz" @@ -4270,7 +4793,7 @@ which@^1.2.9, which@^1.3.0: dependencies: isexe "^2.0.0" -word-wrap@~1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -4365,3 +4888,8 @@ yn@3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From a933dd8bc4b8003e2e3f74a5da628874a4c608d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arwid=20Thornstro=CC=88m?= Date: Fri, 3 Feb 2023 14:37:28 +0100 Subject: [PATCH 2/2] track a pipeline --- src/commands/aws/pipeline/pipeline.ts | 15 +++ src/commands/aws/pipeline/status/status.ts | 108 +++++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 src/commands/aws/pipeline/pipeline.ts create mode 100644 src/commands/aws/pipeline/status/status.ts diff --git a/src/commands/aws/pipeline/pipeline.ts b/src/commands/aws/pipeline/pipeline.ts new file mode 100644 index 0000000..33cf2ff --- /dev/null +++ b/src/commands/aws/pipeline/pipeline.ts @@ -0,0 +1,15 @@ +import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu'; +import { defaultMenuSettings } from '../../../globals'; + +/** + * Section1 menu + */ +module.exports = { + name: 'pipeline', + alias: ['pl'], + description: 'Pipeline (pl)', + hidden: false, + run: async (toolbox: GluegunMenuToolbox) => { + await toolbox.menu.showMenu('aws pipeline', defaultMenuSettings); + } +}; diff --git a/src/commands/aws/pipeline/status/status.ts b/src/commands/aws/pipeline/status/status.ts new file mode 100644 index 0000000..a3212b4 --- /dev/null +++ b/src/commands/aws/pipeline/status/status.ts @@ -0,0 +1,108 @@ +import { GluegunMenuToolbox } from '@lenne.tech/gluegun-menu'; +import chalk = require('chalk'); +import { exit } from 'process'; +import { defaultMenuSettings, sleep } from '../../../../globals'; +const { AutoComplete } = require('enquirer'); + +type Pipeline = { + name: string; + version: number; + created: string; + updated: string; +}; + +type StageState = { + stageName: string; + latestExecution: { + status: string; + }; +}; + +module.exports = { + name: 'status', + alias: ['s'], + description: 'Pipeline Status (s)', + hidden: false, + run: async (toolbox: GluegunMenuToolbox) => { + const { system, strings, print } = toolbox; + + const pipelines = JSON.parse( + strings.trim(await system.run(`aws codepipeline list-pipelines`)) + ); + + const testPipelines = pipelines.pipelines.filter(item => { + return item.name.indexOf('photowall-test-') > -1; + }); + + const curratedPipes: Pipeline[] = testPipelines.filter(Boolean); + const options = curratedPipes.map(item => { + return item.name; + }); + + const prompt = new AutoComplete({ + name: 'pipelines', + message: 'Choose a pipeline', + limit: options.length - 1, + initial: options.length - 1, + choices: options + }); + + try { + const pipelineName = await prompt.run(); + + const spinner = print.spin(`Tracking pipeline status`); + const getArrow = (pos: number) => { + const o = '---------------'.split(''); // 0-14 + return o.map((char, index) => { + if (index === pos) { + return chalk.bold.magenta('>'); + } + return chalk.cyan(char); + }); + }; + + while (true) { + const pipelineState = JSON.parse( + await system.run( + `aws codepipeline get-pipeline-state --name ${pipelineName}`, + { trim: true } + ) + ); + const states = {}; + for (const state of pipelineState.stageStates) { + const s = state.latestExecution.status; + switch (s) { + case 'InProgress': + states[state.stageName] = chalk.blue('IN PROGRESS'); + break; + case 'Succeeded': + states[state.stageName] = chalk.green('DONE'); + break; + case 'Failed': + states[state.stageName] = chalk.red('FAILED'); + break; + } + } + + let pos = 0; + while (pos < 15) { + const arrow = getArrow(pos); + arrow.splice(15, 0, ` Deploy: [${states['Deploy']}] `); + arrow.splice(10, 0, ` Build: [${states['Build']}] `); + arrow.splice(5, 0, ` Source: [${states['Source']}] `); + spinner.text = arrow.join(''); + pos += 1; + await sleep(500); + } + } + } catch (e) { + console.log(`e`, e); + } + + if (toolbox.fromMenu()) { + await toolbox.menu.showMenu('aws pipeline', defaultMenuSettings); + } else { + exit(); + } + } +};