From 8b0c76afdd2e63072d10b7a8b88d051472bdb2fa Mon Sep 17 00:00:00 2001 From: Helio Machado <0x2b3bfa0+git@googlemail.com> Date: Sun, 22 Aug 2021 18:24:04 +0000 Subject: [PATCH 01/14] Unify commands and centralize logging --- .github/workflows/gitlab.yml | 2 +- Dockerfile | 2 +- bin/cml-pr.js | 45 -- bin/cml-pr.test.js | 25 -- bin/cml-publish.js | 79 ---- bin/cml-publish.test.js | 129 ------ bin/cml-send-comment.js | 56 --- bin/cml-send-comment.test.js | 58 --- bin/cml-send-github-check.js | 53 --- bin/cml-send-github-check.test.js | 52 --- bin/cml.js | 68 +++ bin/cml/pr.js | 35 ++ bin/cml/pr.test.js | 29 ++ bin/cml/publish.js | 68 +++ bin/cml/publish.test.js | 124 ++++++ bin/{cml-runner.js => cml/runner.js} | 255 ++++++------ bin/cml/runner.test.js | 63 +++ bin/cml/send-comment.js | 45 ++ bin/cml/send-comment.test.js | 62 +++ bin/cml/send-github-check.js | 46 +++ bin/cml/send-github-check.test.js | 56 +++ .../tensorboard-dev.js} | 44 +- .../tensorboard-dev.test.js} | 60 +-- bin/legacy.js | 14 + package-lock.json | 391 +++++++++++------- package.json | 20 +- src/cml.js | 12 +- src/drivers/github.js | 3 +- src/pipe-args.js | 3 +- 29 files changed, 1066 insertions(+), 833 deletions(-) delete mode 100755 bin/cml-pr.js delete mode 100644 bin/cml-pr.test.js delete mode 100755 bin/cml-publish.js delete mode 100644 bin/cml-publish.test.js delete mode 100755 bin/cml-send-comment.js delete mode 100644 bin/cml-send-comment.test.js delete mode 100755 bin/cml-send-github-check.js delete mode 100644 bin/cml-send-github-check.test.js create mode 100755 bin/cml.js create mode 100755 bin/cml/pr.js create mode 100644 bin/cml/pr.test.js create mode 100644 bin/cml/publish.js create mode 100644 bin/cml/publish.test.js rename bin/{cml-runner.js => cml/runner.js} (65%) create mode 100644 bin/cml/runner.test.js create mode 100644 bin/cml/send-comment.js create mode 100644 bin/cml/send-comment.test.js create mode 100755 bin/cml/send-github-check.js create mode 100644 bin/cml/send-github-check.test.js rename bin/{cml-tensorboard-dev.js => cml/tensorboard-dev.js} (83%) mode change 100755 => 100644 rename bin/{cml-tensorboard-dev.test.js => cml/tensorboard-dev.test.js} (58%) create mode 100755 bin/legacy.js mode change 100644 => 100755 src/cml.js diff --git a/.github/workflows/gitlab.yml b/.github/workflows/gitlab.yml index 6e45ca8e6..62d77c5f7 100644 --- a/.github/workflows/gitlab.yml +++ b/.github/workflows/gitlab.yml @@ -64,7 +64,7 @@ jobs: run: npm ci - name: Run cml-send-comment run: | - node bin/cml-send-comment.js \ + node bin/cml.js send-comment \ --token=${{ github.token }} \ --repo=http://localhost:8000/gitlab/root/test \ --commit-sha=${{ steps.commit.outputs.hash }} \ diff --git a/Dockerfile b/Dockerfile index 2e52f3b62..9de8c1eb0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -101,4 +101,4 @@ WORKDIR ${RUNNER_PATH} # COMMAND ENV IN_DOCKER=1 -CMD ["cml-runner"] +CMD ["cml"] diff --git a/bin/cml-pr.js b/bin/cml-pr.js deleted file mode 100755 index 2584947e4..000000000 --- a/bin/cml-pr.js +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env node - -const print = console.log; -console.log = console.error; - -const yargs = require('yargs'); - -const CML = require('../src/cml').default; -const { GIT_REMOTE, GIT_USER_NAME, GIT_USER_EMAIL } = require('../src/cml'); - -const run = async (opts) => { - const globs = opts._.length ? opts._ : undefined; - const cml = new CML(opts); - print((await cml.prCreate({ ...opts, globs })) || ''); -}; - -const opts = yargs - .strict() - .usage('Usage: $0 ... ') - .describe('md', 'Output in markdown format [](url).') - .boolean('md') - .default('remote', GIT_REMOTE) - .describe('remote', 'Sets git remote.') - .default('user-email', GIT_USER_EMAIL) - .describe('user-email', 'Sets git user email.') - .default('user-name', GIT_USER_NAME) - .describe('user-name', 'Sets git user name.') - .default('repo') - .describe( - 'repo', - 'Specifies the repo to be used. If not specified is extracted from the CI ENV.' - ) - .default('token') - .describe( - 'token', - 'Personal access token to be used. If not specified in extracted from ENV REPO_TOKEN.' - ) - .default('driver') - .choices('driver', ['github', 'gitlab']) - .describe('driver', 'If not specify it infers it from the ENV.') - .help('h').argv; -run(opts).catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/bin/cml-pr.test.js b/bin/cml-pr.test.js deleted file mode 100644 index 060f8504d..000000000 --- a/bin/cml-pr.test.js +++ /dev/null @@ -1,25 +0,0 @@ -const { exec } = require('../src/utils'); - -describe('CML e2e', () => { - test('cml-publish -h', async () => { - const output = await exec(`echo none | node ./bin/cml-pr.js -h`); - - expect(output).toMatchInlineSnapshot(` - "Usage: cml-pr.js ... - - Options: - --version Show version number [boolean] - --md Output in markdown format [](url). [boolean] - --remote Sets git remote. [default: \\"origin\\"] - --user-email Sets git user email. [default: \\"olivaw@iterative.ai\\"] - --user-name Sets git user name. [default: \\"Olivaw[bot]\\"] - --repo Specifies the repo to be used. If not specified is extracted - from the CI ENV. - --token Personal access token to be used. If not specified in extracted - from ENV REPO_TOKEN. - --driver If not specify it infers it from the ENV. - [choices: \\"github\\", \\"gitlab\\"] - -h Show help [boolean]" - `); - }); -}); diff --git a/bin/cml-publish.js b/bin/cml-publish.js deleted file mode 100755 index a244f1138..000000000 --- a/bin/cml-publish.js +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env node - -const print = console.log; -console.log = console.error; - -const fs = require('fs').promises; -const pipeArgs = require('../src/pipe-args'); -const yargs = require('yargs'); - -const CML = require('../src/cml').default; - -const run = async (opts) => { - const { data, file, repo, native } = opts; - - const path = opts._[0]; - const buffer = data ? Buffer.from(data, 'binary') : null; - - const cml = new CML({ ...opts, repo: native ? repo : 'cml' }); - - const output = await cml.publish({ - ...opts, - buffer, - path - }); - - if (!file) print(output); - else await fs.writeFile(file, output); -}; - -pipeArgs.load('binary'); -const data = pipeArgs.pipedArg(); -const opts = yargs - .strict() - .usage(`Usage: $0 `) - .describe('md', 'Output in markdown format [title || name](url).') - .boolean('md') - .describe('md', 'Output in markdown format [title || name](url).') - .default('title') - .describe('title', 'Markdown title [title](url) or ![](url title).') - .alias('title', 't') - .boolean('native') - .describe( - 'native', - "Uses driver's native capabilities to upload assets instead of CML's storage. Currently only available for GitLab CI." - ) - .alias('native', 'gitlab-uploads') - .boolean('rm-watermark') - .describe('rm-watermark', 'Avoid CML watermark.') - .default('mime-type') - .describe( - 'mime-type', - 'Specifies the mime-type. If not set guess it from the content.' - ) - .default('file') - .describe( - 'file', - 'Append the output to the given file. Create it if does not exist.' - ) - .alias('file', 'f') - .default('repo') - .describe( - 'repo', - 'Specifies the repo to be used. If not specified is extracted from the CI ENV.' - ) - .default('token') - .describe( - 'token', - 'Personal access token to be used. If not specified, extracted from ENV REPO_TOKEN, GITLAB_TOKEN, GITHUB_TOKEN, or BITBUCKET_TOKEN.' - ) - .default('driver') - .choices('driver', ['github', 'gitlab']) - .describe('driver', 'If not specify it infers it from the ENV.') - .help('h') - .demand(data ? 0 : 1).argv; - -run({ ...opts, data }).catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/bin/cml-publish.test.js b/bin/cml-publish.test.js deleted file mode 100644 index 070a8e3df..000000000 --- a/bin/cml-publish.test.js +++ /dev/null @@ -1,129 +0,0 @@ -const fs = require('fs'); -const { exec } = require('../src/utils'); - -describe('CML e2e', () => { - test('cml-publish -h', async () => { - const output = await exec(`echo none | node ./bin/cml-publish.js -h`); - - expect(output).toMatchInlineSnapshot(` - "Usage: cml-publish.js - - Options: - --version Show version number [boolean] - --md Output in markdown format [title || name](url). - [boolean] - --title, -t Markdown title [title](url) or ![](url title). - --native, --gitlab-uploads Uses driver's native capabilities to upload assets - instead of CML's storage. Currently only available - for GitLab CI. [boolean] - --rm-watermark Avoid CML watermark. [boolean] - --mime-type Specifies the mime-type. If not set guess it from - the content. - --file, -f Append the output to the given file. Create it if - does not exist. - --repo Specifies the repo to be used. If not specified is - extracted from the CI ENV. - --token Personal access token to be used. If not - specified, extracted from ENV REPO_TOKEN, - GITLAB_TOKEN, GITHUB_TOKEN, or BITBUCKET_TOKEN. - --driver If not specify it infers it from the ENV. - [choices: \\"github\\", \\"gitlab\\"] - -h Show help [boolean]" - `); - }); - - test('cml-publish assets/logo.png --md', async () => { - const output = await exec( - `echo none | node ./bin/cml-publish.js assets/logo.png --md` - ); - - expect(output.startsWith('![](')).toBe(true); - }); - - test('cml-publish assets/logo.png', async () => { - const output = await exec( - `echo none | node ./bin/cml-publish.js assets/logo.png` - ); - - expect(output.startsWith('https://')).toBe(true); - }); - - test('cml-publish assets/logo.pdf --md', async () => { - const title = 'this is awesome'; - const output = await exec( - `echo none | node ./bin/cml-publish.js assets/logo.pdf --md --title '${title}'` - ); - - expect(output.startsWith(`[${title}](`)).toBe(true); - }); - - test('cml-publish assets/logo.pdf', async () => { - const output = await exec( - `echo none | node ./bin/cml-publish.js assets/logo.pdf` - ); - - expect(output.startsWith('https://')).toBe(true); - }); - - test('cml-publish assets/test.svg --md', async () => { - const title = 'this is awesome'; - const output = await exec( - `echo none | node ./bin/cml-publish.js assets/test.svg --md --title '${title}'` - ); - - expect(output.startsWith('![](') && output.endsWith(`${title}")`)).toBe( - true - ); - }); - - test('cml-publish assets/test.svg', async () => { - const output = await exec( - `echo none | node ./bin/cml-publish.js assets/test.svg` - ); - - expect(output.startsWith('https://')).toBe(true); - }); - - test('cml-publish assets/logo.pdf to file', async () => { - const file = `cml-publish-test.md`; - - await exec( - `echo none | node ./bin/cml-publish.js assets/logo.pdf --file ${file}` - ); - - expect(fs.existsSync(file)).toBe(true); - await fs.promises.unlink(file); - }); - - test('cml-publish assets/vega-lite.json', async () => { - const output = await exec( - `echo none | node ./bin/cml-publish.js --mime-type=application/json assets/vega-lite.json` - ); - - expect(output.startsWith('https://')).toBe(true); - expect(output.endsWith('json')).toBe(true); - }); - - test('cml-publish assets/test.svg in Gitlab storage', async () => { - const { TEST_GITLAB_REPO: repo, TEST_GITLAB_TOKEN: token } = process.env; - - const output = await exec( - `echo none | node ./bin/cml-publish.js --repo=${repo} --token=${token} --gitlab-uploads assets/test.svg` - ); - - expect(output.startsWith('https://')).toBe(true); - }); - - test('cml-publish /nonexistent produces file error', async () => { - await expect( - exec('echo none | node ./bin/cml-publish.js /nonexistent') - ).rejects.toThrowError('ENOENT: no such file or directory, stat'); - }); - - test('echo text | cml-publish produces a plain text file', async () => { - const output = await exec(`echo none | node ./bin/cml-publish.js`); - - expect(output.startsWith('https://')).toBe(true); - expect(output.endsWith('plain')).toBe(true); - }); -}); diff --git a/bin/cml-send-comment.js b/bin/cml-send-comment.js deleted file mode 100755 index 266e463cc..000000000 --- a/bin/cml-send-comment.js +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env node - -const print = console.log; -console.log = console.error; - -const fs = require('fs').promises; -const yargs = require('yargs'); - -const CML = require('../src/cml').default; - -const run = async (opts) => { - const path = opts._[0]; - const report = await fs.readFile(path, 'utf-8'); - const cml = new CML(opts); - print(await cml.commentCreate({ ...opts, report })); -}; - -const opts = yargs - .strict() - .usage('Usage: $0 ') - .default('commit-sha') - .describe( - 'commit-sha', - 'Commit SHA linked to this comment. Defaults to HEAD.' - ) - .alias('commit-sha', 'head-sha') - .boolean('update') - .describe( - 'update', - 'Update the last CML comment (if any) instead of creating a new one' - ) - .boolean('rm-watermark') - .describe( - 'rm-watermark', - 'Avoid watermark. CML needs a watermark to be able to distinguish CML reports from other comments in order to provide extra functionality.' - ) - .default('repo') - .describe( - 'repo', - 'Specifies the repo to be used. If not specified is extracted from the CI ENV.' - ) - .default('token') - .describe( - 'token', - 'Personal access token to be used. If not specified is extracted from ENV REPO_TOKEN.' - ) - .default('driver') - .choices('driver', ['github', 'gitlab', 'bitbucket']) - .describe('driver', 'If not specify it infers it from the ENV.') - .help('h') - .demand(1).argv; - -run(opts).catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/bin/cml-send-comment.test.js b/bin/cml-send-comment.test.js deleted file mode 100644 index a8dc88786..000000000 --- a/bin/cml-send-comment.test.js +++ /dev/null @@ -1,58 +0,0 @@ -const { exec } = require('../src/utils'); -const fs = require('fs').promises; - -describe('Comment integration tests', () => { - const path = 'comment.md'; - - afterEach(async () => { - try { - await fs.unlink(path); - } catch (err) {} - }); - - test('cml-send-comment -h', async () => { - const output = await exec(`node ./bin/cml-send-comment.js -h`); - - expect(output).toMatchInlineSnapshot(` - "Usage: cml-send-comment.js - - Options: - --version Show version number [boolean] - --commit-sha, --head-sha Commit SHA linked to this comment. Defaults to HEAD. - --update Update the last CML comment (if any) instead of - creating a new one [boolean] - --rm-watermark Avoid watermark. CML needs a watermark to be able to - distinguish CML reports from other comments in order - to provide extra functionality. [boolean] - --repo Specifies the repo to be used. If not specified is - extracted from the CI ENV. - --token Personal access token to be used. If not specified - is extracted from ENV REPO_TOKEN. - --driver If not specify it infers it from the ENV. - [choices: \\"github\\", \\"gitlab\\", \\"bitbucket\\"] - -h Show help [boolean]" - `); - }); - - test('cml-send-comment to specific repo', async () => { - const { - TEST_GITHUB_REPO: repo, - TEST_GITHUB_TOKEN: token, - TEST_GITHUB_SHA: sha - } = process.env; - - const report = `## Test Comment Report specific`; - - await fs.writeFile(path, report); - await exec( - `node ./bin/cml-send-comment.js --repo=${repo} --token=${token} --commit-sha=${sha} ${path}` - ); - }); - - test('cml-send-comment to current repo', async () => { - const report = `## Test Comment`; - - await fs.writeFile(path, report); - await exec(`node ./bin/cml-send-comment.js ${path}`); - }); -}); diff --git a/bin/cml-send-github-check.js b/bin/cml-send-github-check.js deleted file mode 100755 index db50148ed..000000000 --- a/bin/cml-send-github-check.js +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env node - -console.log = console.error; - -const fs = require('fs').promises; -const yargs = require('yargs'); - -const CML = require('../src/cml').default; -const CHECK_TITLE = 'CML Report'; - -const run = async (opts) => { - const path = opts._[0]; - const report = await fs.readFile(path, 'utf-8'); - const cml = new CML({ ...opts }); - await cml.checkCreate({ ...opts, report }); -}; - -const opts = yargs - .strict() - .usage('Usage: $0 ') - .describe( - 'commit-sha', - 'Commit SHA linked to this comment. Defaults to HEAD.' - ) - .alias('commit-sha', 'head-sha') - .default('conclusion', 'success', 'Sets the conclusion status of the check.') - .choices('conclusion', [ - 'success', - 'failure', - 'neutral', - 'cancelled', - 'skipped', - 'timed_out' - ]) - .default('title', CHECK_TITLE) - .describe('title', 'Sets title of the check.') - .default('repo') - .describe( - 'repo', - 'Specifies the repo to be used. If not specified is extracted from the CI ENV.' - ) - .default('token') - .describe( - 'token', - 'Personal access token to be used. If not specified in extracted from ENV REPO_TOKEN.' - ) - .help('h') - .demand(1).argv; - -run(opts).catch((e) => { - console.error(e); - process.exit(1); -}); diff --git a/bin/cml-send-github-check.test.js b/bin/cml-send-github-check.test.js deleted file mode 100644 index ea76d90d7..000000000 --- a/bin/cml-send-github-check.test.js +++ /dev/null @@ -1,52 +0,0 @@ -const { exec } = require('../src/utils'); -const fs = require('fs').promises; - -describe('CML e2e', () => { - const path = 'check.md'; - - afterEach(async () => { - try { - await fs.unlink(path); - } catch (err) {} - }); - - test('cml-send-github-check', async () => { - const report = `## Test Check Report`; - - await fs.writeFile(path, report); - process.env.GITHUB_ACTIONS && - (await exec(`node ./bin/cml-send-github-check.js ${path}`)); - }); - - test('cml-send-github-check failure with tile "CML neutral test"', async () => { - const report = `## Hi this check should be neutral`; - const title = 'CML neutral test'; - const conclusion = 'neutral'; - - await fs.writeFile(path, report); - process.env.GITHUB_ACTIONS && - (await exec( - `node ./bin/cml-send-github-check.js ${path} --title "${title}" --conclusion "${conclusion}"` - )); - }); - - test('cml-send-github-check -h', async () => { - const output = await exec(`node ./bin/cml-send-github-check.js -h`); - - expect(output).toMatchInlineSnapshot(` - "Usage: cml-send-github-check.js - - Options: - --version Show version number [boolean] - --commit-sha, --head-sha Commit SHA linked to this comment. Defaults to HEAD. - --title Sets title of the check. [default: \\"CML Report\\"] - --repo Specifies the repo to be used. If not specified is - extracted from the CI ENV. - --token Personal access token to be used. If not specified - in extracted from ENV REPO_TOKEN. - -h Show help [boolean] - --conclusion[choices: \\"success\\", \\"failure\\", \\"neutral\\", \\"cancelled\\", \\"skipped\\", - \\"timed_out\\"] [default: Sets the conclusion status of the check.]" - `); - }); -}); diff --git a/bin/cml.js b/bin/cml.js new file mode 100755 index 000000000..230dc451b --- /dev/null +++ b/bin/cml.js @@ -0,0 +1,68 @@ +#!/usr/bin/env node + +const { basename } = require('path'); +const { pseudoexec } = require('pseudoexec'); + +const which = require('which'); +const winston = require('winston'); +const yargs = require('yargs'); + +const configureLogger = (level) => { + winston.configure({ + format: process.stdout.isTTY + ? winston.format.combine( + winston.format.colorize({ all: true }), + winston.format.simple() + ) + : winston.format.json(), + transports: [ + new winston.transports.Console({ + handleExceptions: true, + handleRejections: true, + level + }) + ] + }); +}; + +const runPlugin = async ({ $0: executable, command }) => { + try { + if (command === undefined) throw new Error('no command'); + const path = which.sync(`${basename(executable)}-${command}`); + const parameters = process.argv.slice(process.argv.indexOf(command) + 1); // HACK + process.exit(await pseudoexec(path, parameters)); + } catch (error) { + winston.debug(error); + yargs.showHelp(); + } +}; + +const handleError = (message, error) => { + if (error) { + winston.error(error); + } else { + yargs.showHelp(); + console.error('\n' + message); + } + process.exit(1); +}; + +const options = { + log: { + describe: 'Maximum log level', + coerce: (value) => configureLogger(value) && value, + choices: ['error', 'warn', 'info', 'debug'], + default: 'info' + } +}; + +yargs + .fail(handleError) + .env('CML') + .options(options) + .commandDir('./cml', { exclude: /\.test\.js$/ }) + .command('$0 ', false, (builder) => builder.strict(false), runPlugin) + .recommendCommands() + .demandCommand() + .strict() + .parse(); diff --git a/bin/cml/pr.js b/bin/cml/pr.js new file mode 100755 index 000000000..647d306d2 --- /dev/null +++ b/bin/cml/pr.js @@ -0,0 +1,35 @@ +const { GIT_REMOTE, GIT_USER_NAME, GIT_USER_EMAIL } = require('../../src/cml'); +const CML = require('../../src/cml').default; + +exports.command = 'pr '; +exports.desc = 'Create a pull request with the specified files'; + +exports.handler = async (opts) => { + const cml = new CML(opts); + const link = await cml.prCreate({ ...opts, globs: opts.globpath }); + if (link) console.log(link); +}; + +exports.builder = (yargs) => + yargs + .describe('md', 'Output in markdown format [](url).') + .boolean('md') + .default('remote', GIT_REMOTE) + .describe('remote', 'Sets git remote.') + .default('user-email', GIT_USER_EMAIL) + .describe('user-email', 'Sets git user email.') + .default('user-name', GIT_USER_NAME) + .describe('user-name', 'Sets git user name.') + .default('repo') + .describe( + 'repo', + 'Specifies the repo to be used. If not specified is extracted from the CI ENV.' + ) + .default('token') + .describe( + 'token', + 'Personal access token to be used. If not specified in extracted from ENV REPO_TOKEN.' + ) + .default('driver') + .choices('driver', ['github', 'gitlab']) + .describe('driver', 'If not specify it infers it from the ENV.'); diff --git a/bin/cml/pr.test.js b/bin/cml/pr.test.js new file mode 100644 index 000000000..24942e904 --- /dev/null +++ b/bin/cml/pr.test.js @@ -0,0 +1,29 @@ +const { exec } = require('../../src/utils'); + +describe('CML e2e', () => { + test('cml-pr --help', async () => { + const output = await exec(`echo none | node ./bin/cml.js pr --help`); + + expect(output).toMatchInlineSnapshot(` +"cml.js pr + +Create a pull request with the specified files + +Options: + --help Show help [boolean] + --version Show version number [boolean] + --log Maximum log level + [choices: \\"error\\", \\"warn\\", \\"info\\", \\"debug\\"] [default: \\"info\\"] + --md Output in markdown format [](url). [boolean] + --remote Sets git remote. [default: \\"origin\\"] + --user-email Sets git user email. [default: \\"olivaw@iterative.ai\\"] + --user-name Sets git user name. [default: \\"Olivaw[bot]\\"] + --repo Specifies the repo to be used. If not specified is extracted + from the CI ENV. + --token Personal access token to be used. If not specified in extracted + from ENV REPO_TOKEN. + --driver If not specify it infers it from the ENV. + [choices: \\"github\\", \\"gitlab\\"]" +`); + }); +}); diff --git a/bin/cml/publish.js b/bin/cml/publish.js new file mode 100644 index 000000000..fb56a88a5 --- /dev/null +++ b/bin/cml/publish.js @@ -0,0 +1,68 @@ +const fs = require('fs').promises; +const pipeArgs = require('../../src/pipe-args'); + +const CML = require('../../src/cml').default; + +pipeArgs.load('binary'); +const data = pipeArgs.pipedArg(); // HACK: see yargs/yargs#1312 + +exports.command = data ? 'publish' : 'publish '; +exports.desc = 'Upload an image to build a report'; + +exports.handler = async (opts) => { + const { file, repo, native } = opts; + + const path = opts.asset; + const buffer = data ? Buffer.from(data, 'binary') : null; + const cml = new CML({ ...opts, repo: native ? repo : 'cml' }); + + const output = await cml.publish({ + ...opts, + buffer, + path + }); + + if (!file) console.log(output); + else await fs.writeFile(file, output); +}; + +exports.builder = (yargs) => + yargs + .describe('md', 'Output in markdown format [title || name](url).') + .boolean('md') + .describe('md', 'Output in markdown format [title || name](url).') + .default('title') + .describe('title', 'Markdown title [title](url) or ![](url title).') + .alias('title', 't') + .boolean('native') + .describe( + 'native', + "Uses driver's native capabilities to upload assets instead of CML's storage. Currently only available for GitLab CI." + ) + .alias('native', 'gitlab-uploads') + .boolean('rm-watermark') + .describe('rm-watermark', 'Avoid CML watermark.') + .default('mime-type') + .describe( + 'mime-type', + 'Specifies the mime-type. If not set guess it from the content.' + ) + .default('file') + .describe( + 'file', + 'Append the output to the given file. Create it if does not exist.' + ) + .alias('file', 'f') + .default('repo') + .describe( + 'repo', + 'Specifies the repo to be used. If not specified is extracted from the CI ENV.' + ) + .default('token') + .describe( + 'token', + 'Personal access token to be used. If not specified, extracted from ENV REPO_TOKEN, GITLAB_TOKEN, GITHUB_TOKEN, or BITBUCKET_TOKEN.' + ) + .default('driver') + .choices('driver', ['github', 'gitlab']) + .describe('driver', 'If not specify it infers it from the ENV.'); diff --git a/bin/cml/publish.test.js b/bin/cml/publish.test.js new file mode 100644 index 000000000..e8aa2b548 --- /dev/null +++ b/bin/cml/publish.test.js @@ -0,0 +1,124 @@ +const fs = require('fs'); +const { exec } = require('../../src/utils'); + +describe('CML e2e', () => { + test('cml publish --help', async () => { + const output = await exec(`node ./bin/cml.js publish --help`); + + expect(output).toMatchInlineSnapshot(` +"cml.js publish + +Upload an image to build a report + +Options: + --help Show help [boolean] + --version Show version number [boolean] + --log Maximum log level + [choices: \\"error\\", \\"warn\\", \\"info\\", \\"debug\\"] [default: \\"info\\"] + --md Output in markdown format [title || + name](url). [boolean] + -t, --title Markdown title [title](url) or ![](url title). + --native, --gitlab-uploads Uses driver's native capabilities to upload + assets instead of CML's storage. Currently + only available for GitLab CI. [boolean] + --rm-watermark Avoid CML watermark. [boolean] + --mime-type Specifies the mime-type. If not set guess it + from the content. + -f, --file Append the output to the given file. Create it + if does not exist. + --repo Specifies the repo to be used. If not + specified is extracted from the CI ENV. + --token Personal access token to be used. If not + specified, extracted from ENV REPO_TOKEN, + GITLAB_TOKEN, GITHUB_TOKEN, or + BITBUCKET_TOKEN. + --driver If not specify it infers it from the ENV. + [choices: \\"github\\", \\"gitlab\\"]" +`); + }); + + test('cml publish assets/logo.png --md', async () => { + const output = await exec(`node ./bin/cml.js publish assets/logo.png --md`); + + expect(output.startsWith('![](')).toBe(true); + }); + + test('cml publish assets/logo.png', async () => { + const output = await exec(`node ./bin/cml.js publish assets/logo.png`); + + expect(output.startsWith('https://')).toBe(true); + }); + + test('cml publish assets/logo.pdf --md', async () => { + const title = 'this is awesome'; + const output = await exec( + `node ./bin/cml.js publish assets/logo.pdf --md --title '${title}'` + ); + + expect(output.startsWith(`[${title}](`)).toBe(true); + }); + + test('cml publish assets/logo.pdf', async () => { + const output = await exec(`node ./bin/cml.js publish assets/logo.pdf`); + + expect(output.startsWith('https://')).toBe(true); + }); + + test('cml publish assets/test.svg --md', async () => { + const title = 'this is awesome'; + const output = await exec( + `node ./bin/cml.js publish assets/test.svg --md --title '${title}'` + ); + + expect(output.startsWith('![](') && output.endsWith(`${title}")`)).toBe( + true + ); + }); + + test('cml publish assets/test.svg', async () => { + const output = await exec(`node ./bin/cml.js publish assets/test.svg`); + + expect(output.startsWith('https://')).toBe(true); + }); + + test('cml publish assets/logo.pdf to file', async () => { + const file = `cml-publish-test.md`; + + await exec(`node ./bin/cml.js publish assets/logo.pdf --file ${file}`); + + expect(fs.existsSync(file)).toBe(true); + await fs.promises.unlink(file); + }); + + test('cml publish assets/vega-lite.json', async () => { + const output = await exec( + `node ./bin/cml.js publish --mime-type=application/json assets/vega-lite.json` + ); + + expect(output.startsWith('https://')).toBe(true); + expect(output.endsWith('json')).toBe(true); + }); + + test('cml publish assets/test.svg in Gitlab storage', async () => { + const { TEST_GITLAB_REPO: repo, TEST_GITLAB_TOKEN: token } = process.env; + + const output = await exec( + `node ./bin/cml.js publish --repo=${repo} --token=${token} --gitlab-uploads assets/test.svg` + ); + + expect(output.startsWith('https://')).toBe(true); + }); + + test('cml publish /nonexistent produces file error', async () => { + await expect( + exec('node ./bin/cml.js publish /nonexistent') + ).rejects.toThrowError('ENOENT'); + }); + + test('echo text | cml publish produces a plain text file', async () => { + const output = await exec(`echo none | node ./bin/cml.js publish`); + + expect(output.startsWith('https://')).toBe(true); + expect(output.endsWith('plain')).toBe(true); + }); +}); diff --git a/bin/cml-runner.js b/bin/cml/runner.js similarity index 65% rename from bin/cml-runner.js rename to bin/cml/runner.js index 07c782e76..aeb78e6ad 100755 --- a/bin/cml-runner.js +++ b/bin/cml/runner.js @@ -1,15 +1,13 @@ -#!/usr/bin/env node - const { join } = require('path'); const { homedir } = require('os'); const fs = require('fs').promises; -const yargs = require('yargs'); const { SpotNotifier } = require('ec2-spot-notification'); -const { exec, randid, sleep } = require('../src/utils'); -const tf = require('../src/terraform'); -const CML = require('../src/cml').default; +const winston = require('winston'); +const CML = require('../../src/cml').default; +const { exec, randid, sleep } = require('../../src/utils'); +const tf = require('../../src/terraform'); const NAME = `cml-${randid()}`; const WORKDIR_BASE = `${homedir()}/.cml`; @@ -48,12 +46,12 @@ const shutdown = async (opts) => { if (!RUNNER) return; try { - console.log(`Unregistering runner ${name}...`); + winston.info(`Unregistering runner ${name}...`); RUNNER && RUNNER.kill('SIGINT'); await cml.unregisterRunner({ name }); - console.log('\tSuccess'); + winston.info('\tSuccess'); } catch (err) { - console.error(`\tFailed: ${err.message}`); + winston.error(`\tFailed: ${err.message}`); } }; @@ -67,21 +65,21 @@ const shutdown = async (opts) => { ); } } catch (err) { - console.error(err); + winston.error(err); } }; const destroyDockerMachine = async () => { if (!DOCKER_MACHINE) return; - console.log('docker-machine destroy...'); - console.log( + winston.info('docker-machine destroy...'); + winston.warning( 'Docker machine is deprecated and will be removed!! Check how to deploy using our tf provider.' ); try { await exec(`echo y | docker-machine rm ${DOCKER_MACHINE}`); } catch (err) { - console.error(`\tFailed shutting down docker machine: ${err.message}`); + winston.error(`\tFailed shutting down docker machine: ${err.message}`); } }; @@ -89,14 +87,14 @@ const shutdown = async (opts) => { if (!tfResource) return; try { - console.log(await tf.destroy({ dir: tfPath })); + winston.debug(await tf.destroy({ dir: tfPath })); } catch (err) { - console.error(`\tFailed destroying terraform: ${err.message}`); + winston.error(`\tFailed destroying terraform: ${err.message}`); } }; - if (error) console.log(error); - console.log( + if (error) winston.error(error); + winston.info( JSON.stringify({ level: error ? 'error' : 'info', status: 'terminated', @@ -120,7 +118,7 @@ const shutdown = async (opts) => { const runCloud = async (opts) => { const runTerraform = async (opts) => { - console.log('Terraform apply...'); + winston.info('Terraform apply...'); const { token, repo, driver } = cml; const { @@ -150,7 +148,7 @@ const runCloud = async (opts) => { tpl = await fs.writeFile(tfMainPath, await fs.readFile(tfFile)); } else { if (gpu === 'tesla') - console.log( + winston.warn( 'GPU model "tesla" has been deprecated; please use "v100" instead.' ); tpl = tf.iterativeCmlRunnerTpl({ @@ -184,7 +182,7 @@ const runCloud = async (opts) => { return tfstate; }; - console.log('Deploying cloud runner plan...'); + winston.info('Deploying cloud runner plan...'); const tfstate = await runTerraform(opts); const { resources } = tfstate; for (const resource of resources) { @@ -211,14 +209,14 @@ const runCloud = async (opts) => { spotPrice: attributes.spot_price, timeouts: attributes.timeouts }; - console.log(JSON.stringify(nonSensitiveValues)); + winston.info(JSON.stringify(nonSensitiveValues)); } } } }; const runLocal = async (opts) => { - console.log(`Launching ${cml.driver} runner`); + winston.info(`Launching ${cml.driver} runner`); const { workdir, name, labels, single, idleTimeout, noRetry } = opts; const proc = await cml.startRunner({ @@ -231,7 +229,7 @@ const runLocal = async (opts) => { const dataHandler = async (data) => { const log = await cml.parseRunnerLog({ data }); - log && console.log(JSON.stringify(log)); + log && winston.debug(JSON.stringify(log)); if (log && log.status === 'job_started') { RUNNER_JOBS_RUNNING.push({ id: log.job, date: log.date }); @@ -285,13 +283,13 @@ const runLocal = async (opts) => { if (!noRetry) { try { - console.log(`EC2 id ${await SpotNotifier.instanceId()}`); + winston.info(`EC2 id ${await SpotNotifier.instanceId()}`); SpotNotifier.on('termination', () => shutdown({ ...opts, reason: 'spot_termination' }) ); SpotNotifier.start(); } catch (err) { - console.log('SpotNotifier can not be started.'); + winston.warn('SpotNotifier can not be started.'); } } @@ -371,7 +369,7 @@ const run = async (opts) => { throw new Error( `Runner name ${name} is already in use. Please change the name or terminate the other runner.` ); - console.log(`Reusing existing runner named ${name}...`); + winston.info(`Reusing existing runner named ${name}...`); process.exit(0); } @@ -381,12 +379,14 @@ const run = async (opts) => { (runner) => runner.online ) ) { - console.log(`Reusing existing online runners with the ${labels} labels...`); + winston.info( + `Reusing existing online runners with the ${labels} labels...` + ); process.exit(0); } try { - console.log(`Preparing workdir ${workdir}...`); + winston.info(`Preparing workdir ${workdir}...`); await fs.mkdir(workdir, { recursive: true }); } catch (err) {} @@ -394,98 +394,107 @@ const run = async (opts) => { else await runLocal(opts); }; -const opts = yargs - .strict() - .usage(`Usage: $0`) - .default('labels', RUNNER_LABELS) - .describe( - 'labels', - 'One or more user-defined labels for this runner (delimited with commas)' - ) - .default('idle-timeout', RUNNER_IDLE_TIMEOUT) - .describe( - 'idle-timeout', - 'Time in seconds for the runner to be waiting for jobs before shutting down. Setting it to 0 disables automatic shutdown' - ) - .default('name') - .describe('name', 'Name displayed in the repository once registered cml-{ID}') - .coerce('name', (val) => val || RUNNER_NAME) - .boolean('no-retry') - .default('no-retry', RUNNER_NO_RETRY) - .describe( - 'no-retry', - 'Do not restart workflow terminated due to instance disposal or GitHub Actions timeout' - ) - .boolean('single') - .default('single', RUNNER_SINGLE) - .describe('single', 'Exit after running a single job') - .boolean('reuse') - .default('reuse', RUNNER_REUSE) - .describe( - 'reuse', - "Don't launch a new runner if an existing one has the same name or overlapping labels" - ) - - .default('driver', RUNNER_DRIVER) - .describe( - 'driver', - 'Platform where the repository is hosted. If not specified, it will be inferred from the environment' - ) - .choices('driver', ['github', 'gitlab']) - .default('repo', RUNNER_REPO) - .describe( - 'repo', - 'Repository to be used for registering the runner. If not specified, it will be inferred from the environment' - ) - .default('token', REPO_TOKEN) - .describe( - 'token', - 'Personal access token to register a self-hosted runner on the repository. If not specified, it will be inferred from the environment' - ) - .default('cloud') - .describe('cloud', 'Cloud to deploy the runner') - .choices('cloud', ['aws', 'azure', 'gcp', 'kubernetes']) - .default('cloud-region', 'us-west') - .describe( - 'cloud-region', - 'Region where the instance is deployed. Choices: [us-east, us-west, eu-west, eu-north]. Also accepts native cloud regions' - ) - .default('cloud-type') - .describe( - 'cloud-type', - 'Instance type. Choices: [m, l, xl]. Also supports native types like i.e. t2.micro' - ) - .default('cloud-gpu') - .describe('cloud-gpu', 'GPU type.') - .choices('cloud-gpu', ['nogpu', 'k80', 'v100', 'tesla']) - .coerce('cloud-gpu-type', (val) => (val === 'nogpu' ? null : val)) - .default('cloud-hdd-size') - .describe('cloud-hdd-size', 'HDD size in GB') - .default('cloud-ssh-private', '') - .describe( - 'cloud-ssh-private', - 'Custom private RSA SSH key. If not provided an automatically generated throwaway key will be used' - ) - .coerce('cloud-ssh-private', (val) => val.replace(/\n/g, '\\n')) - .boolean('cloud-spot') - .describe('cloud-spot', 'Request a spot instance') - .default('cloud-spot-price', '-1') - .describe( - 'cloud-spot-price', - 'Maximum spot instance bidding price in USD. Defaults to the current spot bidding price' - ) - .default('cloud-startup-script', '') - .describe( - 'cloud-startup-script', - 'Run the provided Base64-encoded Linux shell script during the instance initialization' - ) - .default('cloud-aws-security-group', '') - .describe('cloud-aws-security-group', 'Specifies the security group in AWS') - .default('tf-resource') - .hide('tf-resource') - .alias('tf-resource', 'tf_resource') - .help('h').argv; - -run(opts).catch((error) => { - shutdown({ ...opts, error }); -}); +exports.command = 'runner'; +exports.desc = 'Launch and register a self-hosted runner'; + +exports.handler = async (opts) => { + try { + await run(opts); + } catch (error) { + await shutdown({ ...opts, error }); + throw error; + } +}; + +exports.builder = (yargs) => + yargs + .default('labels', RUNNER_LABELS) + .describe( + 'labels', + 'One or more user-defined labels for this runner (delimited with commas)' + ) + .default('idle-timeout', RUNNER_IDLE_TIMEOUT) + .describe( + 'idle-timeout', + 'Time in seconds for the runner to be waiting for jobs before shutting down. Setting it to 0 disables automatic shutdown' + ) + .default('name') + .describe( + 'name', + 'Name displayed in the repository once registered cml-{ID}' + ) + .coerce('name', (val) => val || RUNNER_NAME) + .boolean('no-retry') + .default('no-retry', RUNNER_NO_RETRY) + .describe( + 'no-retry', + 'Do not restart workflow terminated due to instance disposal or GitHub Actions timeout' + ) + .boolean('single') + .default('single', RUNNER_SINGLE) + .describe('single', 'Exit after running a single job') + .boolean('reuse') + .default('reuse', RUNNER_REUSE) + .describe( + 'reuse', + "Don't launch a new runner if an existing one has the same name or overlapping labels" + ) + + .default('driver', RUNNER_DRIVER) + .describe( + 'driver', + 'Platform where the repository is hosted. If not specified, it will be inferred from the environment' + ) + .choices('driver', ['github', 'gitlab']) + .default('repo', RUNNER_REPO) + .describe( + 'repo', + 'Repository to be used for registering the runner. If not specified, it will be inferred from the environment' + ) + .default('token', REPO_TOKEN) + .describe( + 'token', + 'Personal access token to register a self-hosted runner on the repository. If not specified, it will be inferred from the environment' + ) + .default('cloud') + .describe('cloud', 'Cloud to deploy the runner') + .choices('cloud', ['aws', 'azure', 'gcp', 'kubernetes']) + .default('cloud-region', 'us-west') + .describe( + 'cloud-region', + 'Region where the instance is deployed. Choices: [us-east, us-west, eu-west, eu-north]. Also accepts native cloud regions' + ) + .default('cloud-type') + .describe( + 'cloud-type', + 'Instance type. Choices: [m, l, xl]. Also supports native types like i.e. t2.micro' + ) + .default('cloud-gpu') + .describe('cloud-gpu', 'GPU type.') + .choices('cloud-gpu', ['nogpu', 'k80', 'v100', 'tesla']) + .coerce('cloud-gpu-type', (val) => (val === 'nogpu' ? null : val)) + .default('cloud-hdd-size') + .describe('cloud-hdd-size', 'HDD size in GB') + .default('cloud-ssh-private', '') + .describe( + 'cloud-ssh-private', + 'Custom private RSA SSH key. If not provided an automatically generated throwaway key will be used' + ) + .coerce('cloud-ssh-private', (val) => val.replace(/\n/g, '\\n')) + .boolean('cloud-spot') + .describe('cloud-spot', 'Request a spot instance') + .default('cloud-spot-price', '-1') + .describe( + 'cloud-spot-price', + 'Maximum spot instance bidding price in USD. Defaults to the current spot bidding price' + ) + .default('cloud-startup-script', '') + .describe( + 'cloud-startup-script', + 'Run the provided Base64-encoded Linux shell script during the instance initialization' + ) + .default('cloud-aws-security-group', '') + .describe('cloud-aws-security-group', 'Specifies the security group in AWS') + .default('tf-resource') + .hide('tf-resource') + .alias('tf-resource', 'tf_resource'); diff --git a/bin/cml/runner.test.js b/bin/cml/runner.test.js new file mode 100644 index 000000000..bc59659ce --- /dev/null +++ b/bin/cml/runner.test.js @@ -0,0 +1,63 @@ +const { exec } = require('../../src/utils'); + +describe('CML e2e', () => { + test('cml-runner --help', async () => { + const output = await exec(`echo none | node ./bin/cml.js runner --help`); + + expect(output).toMatchInlineSnapshot(` +"cml.js runner + +Launch and register a self-hosted runner + +Options: + --help Show help [boolean] + --version Show version number [boolean] + --log Maximum log level + [choices: \\"error\\", \\"warn\\", \\"info\\", \\"debug\\"] [default: \\"info\\"] + --labels One or more user-defined labels for this runner + (delimited with commas) [default: \\"cml\\"] + --idle-timeout Time in seconds for the runner to be waiting for + jobs before shutting down. Setting it to 0 + disables automatic shutdown [default: 300] + --name Name displayed in the repository once registered + cml-{ID} + --no-retry Do not restart workflow terminated due to instance + disposal or GitHub Actions timeout + [boolean] [default: false] + --single Exit after running a single job + [boolean] [default: false] + --reuse Don't launch a new runner if an existing one has + the same name or overlapping labels + [boolean] [default: false] + --driver Platform where the repository is hosted. If not + specified, it will be inferred from the + environment [choices: \\"github\\", \\"gitlab\\"] + --repo Repository to be used for registering the runner. + If not specified, it will be inferred from the + environment + --token Personal access token to register a self-hosted + runner on the repository. If not specified, it + will be inferred from the environment + --cloud Cloud to deploy the runner + [choices: \\"aws\\", \\"azure\\", \\"gcp\\", \\"kubernetes\\"] + --cloud-region Region where the instance is deployed. Choices: + [us-east, us-west, eu-west, eu-north]. Also + accepts native cloud regions [default: \\"us-west\\"] + --cloud-type Instance type. Choices: [m, l, xl]. Also supports + native types like i.e. t2.micro + --cloud-gpu GPU type. + [choices: \\"nogpu\\", \\"k80\\", \\"v100\\", \\"tesla\\"] + --cloud-hdd-size HDD size in GB + --cloud-ssh-private Custom private RSA SSH key. If not provided an + automatically generated throwaway key will be used + [default: \\"\\"] + --cloud-spot Request a spot instance [boolean] + --cloud-spot-price Maximum spot instance bidding price in USD. + Defaults to the current spot bidding price + [default: \\"-1\\"] + --cloud-startup-script Run the provided Base64-encoded Linux shell script + during the instance initialization [default: \\"\\"] + --cloud-aws-security-group Specifies the security group in AWS [default: \\"\\"]" +`); + }); +}); diff --git a/bin/cml/send-comment.js b/bin/cml/send-comment.js new file mode 100644 index 000000000..11924680b --- /dev/null +++ b/bin/cml/send-comment.js @@ -0,0 +1,45 @@ +const fs = require('fs').promises; + +const CML = require('../../src/cml').default; + +exports.command = 'send-comment '; +exports.desc = 'Comment on a commit'; + +exports.handler = async (opts) => { + const path = opts.markdownfile; + const report = await fs.readFile(path, 'utf-8'); + const cml = new CML(opts); + console.log(await cml.commentCreate({ ...opts, report })); +}; + +exports.builder = (yargs) => + yargs + .default('commit-sha') + .describe( + 'commit-sha', + 'Commit SHA linked to this comment. Defaults to HEAD.' + ) + .alias('commit-sha', 'head-sha') + .boolean('update') + .describe( + 'update', + 'Update the last CML comment (if any) instead of creating a new one' + ) + .boolean('rm-watermark') + .describe( + 'rm-watermark', + 'Avoid watermark. CML needs a watermark to be able to distinguish CML reports from other comments in order to provide extra functionality.' + ) + .default('repo') + .describe( + 'repo', + 'Specifies the repo to be used. If not specified is extracted from the CI ENV.' + ) + .default('token') + .describe( + 'token', + 'Personal access token to be used. If not specified is extracted from ENV REPO_TOKEN.' + ) + .default('driver') + .choices('driver', ['github', 'gitlab', 'bitbucket']) + .describe('driver', 'If not specify it infers it from the ENV.'); diff --git a/bin/cml/send-comment.test.js b/bin/cml/send-comment.test.js new file mode 100644 index 000000000..62f1caa3d --- /dev/null +++ b/bin/cml/send-comment.test.js @@ -0,0 +1,62 @@ +const { exec } = require('../../src/utils'); +const fs = require('fs').promises; + +describe('Comment integration tests', () => { + const path = 'comment.md'; + + afterEach(async () => { + try { + await fs.unlink(path); + } catch (err) {} + }); + + test('cml send-comment --help', async () => { + const output = await exec(`node ./bin/cml.js send-comment --help`); + + expect(output).toMatchInlineSnapshot(` +"cml.js send-comment + +Comment on a commit + +Options: + --help Show help [boolean] + --version Show version number [boolean] + --log Maximum log level + [choices: \\"error\\", \\"warn\\", \\"info\\", \\"debug\\"] [default: \\"info\\"] + --commit-sha, --head-sha Commit SHA linked to this comment. Defaults to HEAD. + --update Update the last CML comment (if any) instead of + creating a new one [boolean] + --rm-watermark Avoid watermark. CML needs a watermark to be able to + distinguish CML reports from other comments in order + to provide extra functionality. [boolean] + --repo Specifies the repo to be used. If not specified is + extracted from the CI ENV. + --token Personal access token to be used. If not specified + is extracted from ENV REPO_TOKEN. + --driver If not specify it infers it from the ENV. + [choices: \\"github\\", \\"gitlab\\", \\"bitbucket\\"]" +`); + }); + + test('cml send-comment to specific repo', async () => { + const { + TEST_GITHUB_REPO: repo, + TEST_GITHUB_TOKEN: token, + TEST_GITHUB_SHA: sha + } = process.env; + + const report = `## Test Comment Report specific`; + + await fs.writeFile(path, report); + await exec( + `node ./bin/cml.js send-comment --repo=${repo} --token=${token} --commit-sha=${sha} ${path}` + ); + }); + + test('cml send-comment to current repo', async () => { + const report = `## Test Comment`; + + await fs.writeFile(path, report); + await exec(`node ./bin/cml.js send-comment ${path}`); + }); +}); diff --git a/bin/cml/send-github-check.js b/bin/cml/send-github-check.js new file mode 100755 index 000000000..8573b5c36 --- /dev/null +++ b/bin/cml/send-github-check.js @@ -0,0 +1,46 @@ +const fs = require('fs').promises; +const CML = require('../../src/cml').default; +const CHECK_TITLE = 'CML Report'; + +exports.command = 'send-github-check '; +exports.desc = 'Create a check report'; + +exports.handler = async (opts) => { + const path = opts.markdownfile; + const report = await fs.readFile(path, 'utf-8'); + const cml = new CML({ ...opts }); + await cml.checkCreate({ ...opts, report }); +}; + +exports.builder = (yargs) => + yargs + .describe( + 'commit-sha', + 'Commit SHA linked to this comment. Defaults to HEAD.' + ) + .alias('commit-sha', 'head-sha') + .default( + 'conclusion', + 'success', + 'Sets the conclusion status of the check.' + ) + .choices('conclusion', [ + 'success', + 'failure', + 'neutral', + 'cancelled', + 'skipped', + 'timed_out' + ]) + .default('title', CHECK_TITLE) + .describe('title', 'Sets title of the check.') + .default('repo') + .describe( + 'repo', + 'Specifies the repo to be used. If not specified is extracted from the CI ENV.' + ) + .default('token') + .describe( + 'token', + 'Personal access token to be used. If not specified in extracted from ENV REPO_TOKEN.' + ); diff --git a/bin/cml/send-github-check.test.js b/bin/cml/send-github-check.test.js new file mode 100644 index 000000000..f58733d85 --- /dev/null +++ b/bin/cml/send-github-check.test.js @@ -0,0 +1,56 @@ +const { exec } = require('../../src/utils'); +const fs = require('fs').promises; + +describe('CML e2e', () => { + const path = 'check.md'; + + afterEach(async () => { + try { + await fs.unlink(path); + } catch (err) {} + }); + + test('cml send-github-check', async () => { + const report = `## Test Check Report`; + + await fs.writeFile(path, report); + process.env.GITHUB_ACTIONS && + (await exec(`node ./bin/cml.js send-github-check ${path}`)); + }); + + test('cml send-github-check failure with tile "CML neutral test"', async () => { + const report = `## Hi this check should be neutral`; + const title = 'CML neutral test'; + const conclusion = 'neutral'; + + await fs.writeFile(path, report); + process.env.GITHUB_ACTIONS && + (await exec( + `node ./bin/cml.js send-github-check ${path} --title "${title}" --conclusion "${conclusion}"` + )); + }); + + test('cml send-github-check --help', async () => { + const output = await exec(`node ./bin/cml.js send-github-check --help`); + + expect(output).toMatchInlineSnapshot(` +"cml.js send-github-check + +Create a check report + +Options: + --help Show help [boolean] + --version Show version number [boolean] + --log Maximum log level + [choices: \\"error\\", \\"warn\\", \\"info\\", \\"debug\\"] [default: \\"info\\"] + --commit-sha, --head-sha Commit SHA linked to this comment. Defaults to HEAD. + --title Sets title of the check. [default: \\"CML Report\\"] + --repo Specifies the repo to be used. If not specified is + extracted from the CI ENV. + --token Personal access token to be used. If not specified + in extracted from ENV REPO_TOKEN. + --conclusion[choices: \\"success\\", \\"failure\\", \\"neutral\\", \\"cancelled\\", \\"skipped\\", + \\"timed_out\\"] [default: Sets the conclusion status of the check.]" +`); + }); +}); diff --git a/bin/cml-tensorboard-dev.js b/bin/cml/tensorboard-dev.js old mode 100755 new mode 100644 similarity index 83% rename from bin/cml-tensorboard-dev.js rename to bin/cml/tensorboard-dev.js index 4b2c92471..76c260810 --- a/bin/cml-tensorboard-dev.js +++ b/bin/cml/tensorboard-dev.js @@ -1,28 +1,22 @@ -#!/usr/bin/env node - -const print = console.log; -console.log = console.error; - -const yargs = require('yargs'); const fs = require('fs').promises; const { spawn } = require('child_process'); const { homedir } = require('os'); const tempy = require('tempy'); -const { exec, watermarkUri, sleep } = require('../src/utils'); +const winston = require('winston'); +const { exec, watermarkUri, sleep } = require('../../src/utils'); const { TB_CREDENTIALS } = process.env; -const isCLI = require.main === module; const closeFd = (fd) => { try { fd.close(); } catch (err) { - console.error(err.message); + winston.error(err.message); } }; -const tbLink = async (opts = {}) => { +exports.tbLink = async (opts = {}) => { const { stdout, stderror, title, name, rmWatermark, md, timeout = 60 } = opts; let chrono = 0; @@ -48,7 +42,10 @@ const tbLink = async (opts = {}) => { throw new Error(`Tensorboard took too long. ${error}`); }; -const run = async (opts) => { +exports.command = 'tensorboard-dev'; +exports.desc = 'Get a tensorboard link'; + +exports.handler = async (opts) => { const { md, file, @@ -89,12 +86,12 @@ const run = async (opts) => { proc.on('exit', async (code) => { if (code) { const error = await fs.readFile(stderrPath, 'utf8'); - print(`Tensorboard failed with error: ${error}`); + winston.error(`Tensorboard failed with error: ${error}`); } process.exit(code); }); - const url = await tbLink({ + const url = await exports.tbLink({ stdout: stdoutPath, stderror: stderrPath, title, @@ -102,17 +99,15 @@ const run = async (opts) => { rmWatermark, md }); - if (!file) print(url); + if (!file) console.log(url); else await fs.appendFile(file, url); closeFd(stdoutFd) && closeFd(stderrFd); process.exit(0); }; -if (isCLI) { - const argv = yargs - .strict() - .usage(`Usage: $0`) +exports.builder = (yargs) => + yargs .default('credentials') .describe( 'credentials', @@ -143,15 +138,4 @@ if (isCLI) { 'Append the output to the given file. Create it if does not exist.' ) .describe('rm-watermark', 'Avoid CML watermark.') - .alias('file', 'f') - .help('h').argv; - - run(argv).catch((e) => { - console.error(e); - process.exit(1); - }); -} - -module.exports = { - tbLink -}; + .alias('file', 'f'); diff --git a/bin/cml-tensorboard-dev.test.js b/bin/cml/tensorboard-dev.test.js similarity index 58% rename from bin/cml-tensorboard-dev.test.js rename to bin/cml/tensorboard-dev.test.js index e84121566..64d958aa0 100644 --- a/bin/cml-tensorboard-dev.test.js +++ b/bin/cml/tensorboard-dev.test.js @@ -1,7 +1,7 @@ const fs = require('fs').promises; const tempy = require('tempy'); -const { exec, isProcRunning, sleep } = require('../src/utils'); -const { tbLink } = require('./cml-tensorboard-dev'); +const { exec, isProcRunning, sleep } = require('../../src/utils'); +const { tbLink } = require('./tensorboard-dev'); const CREDENTIALS = '{"refresh_token": "1//03FiVnGk2xhnNCgYIARAAGAMSNwF-L9IrPH8FOOVWEYUihFDToqxyLArxfnbKFmxEfhzys_KYVVzBisYlAy225w4HaX3ais5TV_Q", "token_uri": "https://oauth2.googleapis.com/token", "client_id": "373649185512-8v619h5kft38l4456nm2dj4ubeqsrvh6.apps.googleusercontent.com", "client_secret": "pOyAuU2yq2arsM98Bw5hwYtr", "scopes": ["openid", "https://www.googleapis.com/auth/userinfo.email"], "type": "authorized_user"}'; @@ -51,38 +51,42 @@ describe('tbLink', () => { }); describe('CML e2e', () => { - test('cml-tensorboard-dev.js -h', async () => { - const output = await exec(`node ./bin/cml-tensorboard-dev.js -h`); + test('cml tensorboard-dev --help', async () => { + const output = await exec(`node ./bin/cml.js tensorboard-dev --help`); expect(output).toMatchInlineSnapshot(` - "Usage: cml-tensorboard-dev.js - - Options: - --version Show version number [boolean] - --credentials, -c TB credentials as json. Usually found at - ~/.config/tensorboard/credentials/uploader-creds.json. If - not specified will look for the json at the env variable - TB_CREDENTIALS. - --logdir Directory containing the logs to process. - --name Tensorboard experiment title. Max 100 characters. - --description Tensorboard experiment description. Markdown format. Max - 600 characters. - --md Output as markdown [title || name](url). [boolean] - --title, -t Markdown title, if not specified, param name will be used. - --file, -f Append the output to the given file. Create it if does not - exist. - --rm-watermark Avoid CML watermark. - -h Show help [boolean] - --plugins" - `); +"cml.js tensorboard-dev + +Get a tensorboard link + +Options: + --help Show help [boolean] + --version Show version number [boolean] + --log Maximum log level + [choices: \\"error\\", \\"warn\\", \\"info\\", \\"debug\\"] [default: \\"info\\"] + -c, --credentials TB credentials as json. Usually found at + ~/.config/tensorboard/credentials/uploader-creds.json. If + not specified will look for the json at the env variable + TB_CREDENTIALS. + --logdir Directory containing the logs to process. + --name Tensorboard experiment title. Max 100 characters. + --description Tensorboard experiment description. Markdown format. Max + 600 characters. + --md Output as markdown [title || name](url). [boolean] + -t, --title Markdown title, if not specified, param name will be used. + -f, --file Append the output to the given file. Create it if does not + exist. + --rm-watermark Avoid CML watermark. + --plugins" +`); }); - test('cml-tensorboard-dev.js --md returns md and after command TB is still up', async () => { + test('cml tensorboard-dev --md returns md and after command TB is still up', async () => { const name = 'My experiment'; const desc = 'Test experiment'; const title = 'go to the experiment'; const output = await exec( - `node ./bin/cml-tensorboard-dev.js --credentials '${CREDENTIALS}' \ + `node ./bin/cml.js tensorboard-dev --credentials '${CREDENTIALS}' \ --md --title '${title}' \ --logdir logs --name '${name}' --description '${desc}'` ); @@ -95,9 +99,9 @@ describe('CML e2e', () => { expect(output.includes('cml=tb')).toBe(true); }); - test('cml-tensorboard-dev.js invalid creds', async () => { + test('cml tensorboard-dev invalid creds', async () => { try { - await exec(`node ./bin/cml-tensorboard-dev.js --credentials 'invalid'`); + await exec(`node ./bin/cml.js tensorboard-dev --credentials 'invalid'`); } catch (err) { expect(err.message.includes('json.decoder.JSONDecodeError')).toBe(true); } diff --git a/bin/legacy.js b/bin/legacy.js new file mode 100755 index 000000000..9659ab7a1 --- /dev/null +++ b/bin/legacy.js @@ -0,0 +1,14 @@ +#!/usr/bin/env node + +// This file provides backwards compatibility with the legacy cml-commands +// specified in package.json by acting as a single BusyBox-like entrypoint +// that detects the name of the executed symbolic link and invokes in turn +// the main command. E.g. cml-command should be redirected to cml command. + +const { basename } = require('path'); +const { pseudoexec } = require('pseudoexec'); + +const [, file, ...parameters] = process.argv; +const [, base, command] = basename(file).match(/^(\w+)-(.+)$/); + +(async () => process.exit(await pseudoexec(base, [command, ...parameters])))(); diff --git a/package-lock.json b/package-lock.json index 8ae7486d6..30d8b9e31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -532,6 +532,16 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@dabh/diagnostics": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", + "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1584,6 +1594,11 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "async": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.1.tgz", + "integrity": "sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1826,7 +1841,8 @@ "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true }, "caniuse-lite": { "version": "1.0.30001251", @@ -1957,7 +1973,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -1976,11 +1991,19 @@ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, + "color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -1988,8 +2011,16 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, "colorette": { "version": "1.2.2", @@ -1997,6 +2028,20 @@ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "colorspace": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "requires": { + "color": "3.0.x", + "text-hex": "1.0.x" + } + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2088,6 +2133,15 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -2146,11 +2200,6 @@ "ms": "2.1.2" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, "decimal.js": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", @@ -2298,6 +2347,11 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, + "enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -2372,8 +2426,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-string-regexp": { "version": "1.0.5", @@ -3016,6 +3069,11 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-safe-stringify": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz", + "integrity": "sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag==" + }, "fastq": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", @@ -3033,6 +3091,11 @@ "bser": "2.1.1" } }, + "fecha": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", + "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" + }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -3120,6 +3183,11 @@ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -3614,8 +3682,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "inquirer": { "version": "7.1.0", @@ -3900,8 +3967,7 @@ "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "is-string": { "version": "1.0.7", @@ -3940,11 +4006,15 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isstream": { "version": "0.1.2", @@ -5629,6 +5699,11 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, + "kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -5995,6 +6070,18 @@ } } }, + "logform": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", + "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6308,6 +6395,14 @@ "wrappy": "1" } }, + "one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "requires": { + "fn.name": "1.x.x" + } + }, "onetime": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", @@ -6353,6 +6448,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "requires": { "p-try": "^2.0.0" } @@ -6378,7 +6474,8 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, "parent-module": { "version": "1.0.1", @@ -6653,6 +6750,11 @@ } } }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -6674,6 +6776,11 @@ "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==" }, + "pseudoexec": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/pseudoexec/-/pseudoexec-0.1.4.tgz", + "integrity": "sha512-4FRBAbe36HjS4eocRH9yALjHwsiXHOt+OPl42Ss5UcaK82jvUZCWdkv5jBhhCXSBQL/aDx9qapX0taEHP5dZpg==" + }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -6787,6 +6894,16 @@ } } }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", @@ -6837,11 +6954,6 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, "resolve": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", @@ -6973,11 +7085,6 @@ "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==", "dev": true }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -7031,6 +7138,21 @@ "debug": "^4.3.1" } }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -7154,6 +7276,11 @@ "tweetnacl": "~0.14.0" } }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, "stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", @@ -7234,6 +7361,21 @@ "define-properties": "^1.1.3" } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, "stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", @@ -7433,6 +7575,11 @@ "minimatch": "^3.0.4" } }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -7499,6 +7646,11 @@ "punycode": "^2.1.1" } }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, "tsconfig-paths": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", @@ -7610,6 +7762,11 @@ "punycode": "^2.1.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -7720,10 +7877,9 @@ } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "requires": { "isexe": "^2.0.0" } @@ -7741,17 +7897,61 @@ "is-symbol": "^1.0.3" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, "which-pm-runs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", "dev": true }, + "winston": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", + "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", + "requires": { + "@dabh/diagnostics": "^2.0.2", + "async": "^3.1.0", + "is-stream": "^2.0.0", + "logform": "^2.2.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" + } + }, + "winston-transport": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", + "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "requires": { + "readable-stream": "^2.3.7", + "triple-beam": "^1.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -7762,7 +7962,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -7773,7 +7972,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -7782,7 +7980,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -7790,8 +7987,7 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" } } }, @@ -7840,9 +8036,9 @@ "dev": true }, "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "4.0.0", @@ -7856,104 +8052,23 @@ "dev": true }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, "yocto-queue": { "version": "0.1.0", diff --git a/package.json b/package.json index 9d7b105aa..7f22d7913 100644 --- a/package.json +++ b/package.json @@ -30,13 +30,14 @@ ], "main": "index.js", "bin": { - "cml-send-github-check": "bin/cml-send-github-check.js", - "cml-send-comment": "bin/cml-send-comment.js", - "cml-publish": "bin/cml-publish.js", - "cml-tensorboard-dev": "bin/cml-tensorboard-dev.js", - "cml-runner": "bin/cml-runner.js", - "cml-cloud-runner-entrypoint": "bin/cml-runner.js", - "cml-pr": "bin/cml-pr.js" + "cml": "bin/cml.js", + "cml-send-github-check": "bin/legacy.js", + "cml-send-comment": "bin/legacy.js", + "cml-publish": "bin/legacy.js", + "cml-tensorboard-dev": "bin/legacy.js", + "cml-runner": "bin/legacy.js", + "cml-cloud-runner-entrypoint": "bin/legacy.js", + "cml-pr": "bin/legacy.js" }, "scripts": { "lintfix": "eslint --fix ./ && prettier --write '**/*.{js,json,md,yaml,yml}'", @@ -73,12 +74,15 @@ "node-fetch": "^2.6.1", "node-forge": "^0.10.0", "node-ssh": "^11.1.1", + "pseudoexec": "^0.1.4", "semver": "^7.3.5", "simple-git": "^2.44.0", "strip-url-auth": "^1.0.1", "tar": "^6.1.8", "tempy": "^0.6.0", - "yargs": "^15.4.1" + "which": "^2.0.2", + "winston": "^3.3.3", + "yargs": "^17.1.1" }, "devDependencies": { "eslint": "^6.8.0", diff --git a/src/cml.js b/src/cml.js old mode 100644 new mode 100755 index a12f183a7..d330f89c4 --- a/src/cml.js +++ b/src/cml.js @@ -4,6 +4,8 @@ const stripAuth = require('strip-url-auth'); const globby = require('globby'); const git = require('simple-git/promise')('./'); +const winston = require('winston'); + const Gitlab = require('./drivers/gitlab'); const Github = require('./drivers/github'); const BitbucketCloud = require('./drivers/bitbucket_cloud'); @@ -198,8 +200,8 @@ class CML { return log; } } catch (err) { - console.log(`Failed parsing log: ${err.message}`); - console.log(`Original log bytes, as Base64: ${data.toString('base64')}`); + winston.warn(`Failed parsing log: ${err.message}`); + winston.warn(`Original log bytes, as Base64: ${data.toString('base64')}`); } } @@ -268,7 +270,7 @@ class CML { const { files } = await git.status(); if (!files.length) { - console.log('No files changed. Nothing to do.'); + winston.warn('No files changed. Nothing to do.'); return; } @@ -276,7 +278,7 @@ class CML { files.map((file) => file.path).includes(path) ); if (!paths.length) { - console.log('Input files are not affected. Nothing to do.'); + winston.warn('Input files are not affected. Nothing to do.'); return; } @@ -347,7 +349,7 @@ Automated commits for ${this.repo}/commit/${sha} created by CML. } logError(e) { - console.error(e.message); + winston.error(e.message); } } diff --git a/src/drivers/github.js b/src/drivers/github.js index ee2f6aae1..365734fe4 100644 --- a/src/drivers/github.js +++ b/src/drivers/github.js @@ -9,6 +9,7 @@ const { Octokit } = require('@octokit/rest'); const { throttling } = require('@octokit/plugin-throttling'); const tar = require('tar'); +const winston = require('winston'); const { download, exec } = require('../utils'); const CHECK_TITLE = 'CML Report'; @@ -47,7 +48,7 @@ const octokit = (token, repo) => { const throttleHandler = (retryAfter, options) => { if (options.request.retryCount <= 5) { - console.log(`Retrying after ${retryAfter} seconds!`); + winston.log(`Retrying after ${retryAfter} seconds!`); return true; } }; diff --git a/src/pipe-args.js b/src/pipe-args.js index 8de9a4f0e..dbfff15ee 100644 --- a/src/pipe-args.js +++ b/src/pipe-args.js @@ -25,7 +25,8 @@ module.exports.load = (format) => { chunks.push(buffer.slice(0, nbytes)); } catch (err) { if (err.code === 'EOF') break; // HACK: see nodejs/node#35997 - if (err.code !== 'EAGAIN') throw err; + if (err.code === 'EAGAIN') break; + throw err; } } From d5857507d493c3a752300f1d9306058f04c00adf Mon Sep 17 00:00:00 2001 From: Helio Machado <0x2b3bfa0+git@googlemail.com> Date: Tue, 31 Aug 2021 23:57:59 +0200 Subject: [PATCH 02/14] Replace CMD by ENTRYPOINT on Dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9de8c1eb0..c3e383053 100644 --- a/Dockerfile +++ b/Dockerfile @@ -101,4 +101,4 @@ WORKDIR ${RUNNER_PATH} # COMMAND ENV IN_DOCKER=1 -CMD ["cml"] +ENTRYPOINT ["/usr/bin/cml"] From 8cfb406dac26f203de4377c688f9bd06875c716c Mon Sep 17 00:00:00 2001 From: Helio Machado <0x2b3bfa0+git@googlemail.com> Date: Wed, 1 Sep 2021 00:19:15 +0200 Subject: [PATCH 03/14] Move plugin errors below the help message --- bin/cml.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/cml.js b/bin/cml.js index 230dc451b..25723af3f 100755 --- a/bin/cml.js +++ b/bin/cml.js @@ -32,8 +32,8 @@ const runPlugin = async ({ $0: executable, command }) => { const parameters = process.argv.slice(process.argv.indexOf(command) + 1); // HACK process.exit(await pseudoexec(path, parameters)); } catch (error) { - winston.debug(error); yargs.showHelp(); + winston.debug(error); } }; From 8de7c23b78c654d97e094bc838fce630b11257c6 Mon Sep 17 00:00:00 2001 From: Helio Machado <0x2b3bfa0+git@googlemail.com> Date: Wed, 1 Sep 2021 00:47:39 +0200 Subject: [PATCH 04/14] Fix remaining issues with cml runner --- bin/cml/runner.js | 5 +++-- bin/cml/runner.test.js | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/bin/cml/runner.js b/bin/cml/runner.js index aeb78e6ad..3e9aaceae 100755 --- a/bin/cml/runner.js +++ b/bin/cml/runner.js @@ -94,7 +94,7 @@ const shutdown = async (opts) => { }; if (error) winston.error(error); - winston.info( + console.log( JSON.stringify({ level: error ? 'error' : 'info', status: 'terminated', @@ -451,7 +451,8 @@ exports.builder = (yargs) => 'repo', 'Repository to be used for registering the runner. If not specified, it will be inferred from the environment' ) - .default('token', REPO_TOKEN) + .default('token', 'infer') + .coerce('token', (val) => (val === 'infer' ? REPO_TOKEN : val)) .describe( 'token', 'Personal access token to register a self-hosted runner on the repository. If not specified, it will be inferred from the environment' diff --git a/bin/cml/runner.test.js b/bin/cml/runner.test.js index bc59659ce..c63266d22 100644 --- a/bin/cml/runner.test.js +++ b/bin/cml/runner.test.js @@ -38,6 +38,7 @@ Options: --token Personal access token to register a self-hosted runner on the repository. If not specified, it will be inferred from the environment + [default: \\"infer\\"] --cloud Cloud to deploy the runner [choices: \\"aws\\", \\"azure\\", \\"gcp\\", \\"kubernetes\\"] --cloud-region Region where the instance is deployed. Choices: From b72aa269c35582776fbaa414c1e55fe50f45fc77 Mon Sep 17 00:00:00 2001 From: Helio Machado <0x2b3bfa0+git@googlemail.com> Date: Wed, 1 Sep 2021 16:53:42 +0000 Subject: [PATCH 05/14] Test legacy command-line tools --- bin/legacy.test.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 bin/legacy.test.js diff --git a/bin/legacy.test.js b/bin/legacy.test.js new file mode 100644 index 000000000..3124ecd52 --- /dev/null +++ b/bin/legacy.test.js @@ -0,0 +1,15 @@ +const { bin } = require('../package.json'); +const { exec } = require('../src/utils'); + +const commands = Object.keys(bin) + .filter((command) => command.startsWith('cml-')) + .map((command) => command.replace('cml-', '')); + +describe('command-line interface tests', () => { + for (const command of commands) + test(`legacy cml-${command} behaves as the new cml ${command}`, async () => { + const legacyOutput = await exec(`npx --package=. cml ${command} --help`); + const newOutput = await exec(`npx --package=. cml-${command} --help`); + expect(legacyOutput).toBe(newOutput); + }); +}); From 127967bb925fa2e10e9b17e757fc77e6ad63a594 Mon Sep 17 00:00:00 2001 From: Helio Machado <0x2b3bfa0+git@googlemail.com> Date: Wed, 1 Sep 2021 17:24:54 +0000 Subject: [PATCH 06/14] Add test stub for the main cml command --- bin/cml.test.js | 27 +++++++++++++++++++++++++++ bin/legacy.test.js | 4 ++-- 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 bin/cml.test.js diff --git a/bin/cml.test.js b/bin/cml.test.js new file mode 100644 index 000000000..5e0bc9d9e --- /dev/null +++ b/bin/cml.test.js @@ -0,0 +1,27 @@ +const { exec } = require('../src/utils'); + +describe('command-line interface tests', () => { + test('cml --help', async () => { + const output = await exec(`node ./bin/cml.js --help`); + + expect(output).toMatchInlineSnapshot(` +"cml.js + +Commands: + cml.js pr Create a pull request with the + specified files + cml.js publish Upload an image to build a report + cml.js runner Launch and register a self-hosted + runner + cml.js send-comment Comment on a commit + cml.js send-github-check Create a check report + cml.js tensorboard-dev Get a tensorboard link + +Options: + --help Show help [boolean] + --version Show version number [boolean] + --log Maximum log level + [choices: \\"error\\", \\"warn\\", \\"info\\", \\"debug\\"] [default: \\"info\\"]" +`); + }); +}); diff --git a/bin/legacy.test.js b/bin/legacy.test.js index 3124ecd52..7b6171f45 100644 --- a/bin/legacy.test.js +++ b/bin/legacy.test.js @@ -8,8 +8,8 @@ const commands = Object.keys(bin) describe('command-line interface tests', () => { for (const command of commands) test(`legacy cml-${command} behaves as the new cml ${command}`, async () => { - const legacyOutput = await exec(`npx --package=. cml ${command} --help`); - const newOutput = await exec(`npx --package=. cml-${command} --help`); + const legacyOutput = await exec(`npx --package=. cml-${command} --help`); + const newOutput = await exec(`npx --package=. cml ${command} --help`); expect(legacyOutput).toBe(newOutput); }); }); From 78764949ac695db0b600c075c3afba6b99b27623 Mon Sep 17 00:00:00 2001 From: Helio Machado <0x2b3bfa0+git@googlemail.com> Date: Thu, 2 Sep 2021 16:37:21 +0200 Subject: [PATCH 07/14] Use CMD instead of ENTRYPOINT --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index c3e383053..9de8c1eb0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -101,4 +101,4 @@ WORKDIR ${RUNNER_PATH} # COMMAND ENV IN_DOCKER=1 -ENTRYPOINT ["/usr/bin/cml"] +CMD ["cml"] From 29bd034c9475a33c0651838a96e3cc3088c34bbd Mon Sep 17 00:00:00 2001 From: Helio Machado <0x2b3bfa0+git@googlemail.com> Date: Fri, 3 Sep 2021 01:34:54 +0200 Subject: [PATCH 08/14] Replace CMD with a smart ENTRYPOINT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sample code–golfed implementation of @casperdcl's idea --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9de8c1eb0..c2e1c0ca4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -101,4 +101,5 @@ WORKDIR ${RUNNER_PATH} # COMMAND ENV IN_DOCKER=1 -CMD ["cml"] +ENTRYPOINT ["/bin/bash", "-c", "basename \"$0\" | grep -qE '^sh|bash$' && exec bash \"$@\" || exec cml \"$0\" \"$@\""] +CMD [""] From ecb11db499cba3acf570d29234952f18c49707f4 Mon Sep 17 00:00:00 2001 From: Helio Machado <0x2b3bfa0+git@googlemail.com> Date: Fri, 3 Sep 2021 01:38:04 +0200 Subject: [PATCH 09/14] Document smart ENTRYPOINT --- Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Dockerfile b/Dockerfile index c2e1c0ca4..9215ca46a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -103,3 +103,7 @@ WORKDIR ${RUNNER_PATH} ENV IN_DOCKER=1 ENTRYPOINT ["/bin/bash", "-c", "basename \"$0\" | grep -qE '^sh|bash$' && exec bash \"$@\" || exec cml \"$0\" \"$@\""] CMD [""] + +# Smart entrypoint that understands both commands like bash or /bin/sh but defults to cml; also works for GitLab CI/CD +# https://gitlab.com/gitlab-org/gitlab-runner/-/blob/4c42e96e186dc8c81327895c5c772def4a3992ca/shells/bash.go#L18-37 +# https://gitlab.com/gitlab-org/gitlab-runner/-/blob/4c42e96e186dc8c81327895c5c772def4a3992ca/shells/bash.go#L288 From 9a577408acd7d098601bc04194050a572ca1b0c9 Mon Sep 17 00:00:00 2001 From: Casper da Costa-Luis Date: Fri, 3 Sep 2021 01:24:07 +0100 Subject: [PATCH 10/14] super-intelligent entrypoint --- Dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9215ca46a..6804914e5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -101,9 +101,9 @@ WORKDIR ${RUNNER_PATH} # COMMAND ENV IN_DOCKER=1 -ENTRYPOINT ["/bin/bash", "-c", "basename \"$0\" | grep -qE '^sh|bash$' && exec bash \"$@\" || exec cml \"$0\" \"$@\""] +# Smart entrypoint understands commands like `bash` or `/bin/sh` but defaults to `cml`; +# also works for GitLab CI/CD +# https://gitlab.com/gitlab-org/gitlab-runner/-/blob/4c42e96/shells/bash.go#L18-37 +# https://gitlab.com/gitlab-org/gitlab-runner/-/blob/4c42e96/shells/bash.go#L288 +ENTRYPOINT ["/bin/bash", "-c", "basename \"$0\" | grep -qE '^(b?a|z|fi|t?c)?sh$' && exec \"$0\" \"$@\" || exec cml \"$0\" \"$@\""] CMD [""] - -# Smart entrypoint that understands both commands like bash or /bin/sh but defults to cml; also works for GitLab CI/CD -# https://gitlab.com/gitlab-org/gitlab-runner/-/blob/4c42e96e186dc8c81327895c5c772def4a3992ca/shells/bash.go#L18-37 -# https://gitlab.com/gitlab-org/gitlab-runner/-/blob/4c42e96e186dc8c81327895c5c772def4a3992ca/shells/bash.go#L288 From fb82963f50064ea46044c924d4a57a8971ef1011 Mon Sep 17 00:00:00 2001 From: Casper da Costa-Luis Date: Fri, 3 Sep 2021 01:46:50 +0100 Subject: [PATCH 11/14] on this day hath we committed chaotic evile Co-authored-by: Helio Machado <0x2b3bfa0+git@googlemail.com> --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6804914e5..c8cf01e5f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -105,5 +105,5 @@ ENV IN_DOCKER=1 # also works for GitLab CI/CD # https://gitlab.com/gitlab-org/gitlab-runner/-/blob/4c42e96/shells/bash.go#L18-37 # https://gitlab.com/gitlab-org/gitlab-runner/-/blob/4c42e96/shells/bash.go#L288 -ENTRYPOINT ["/bin/bash", "-c", "basename \"$0\" | grep -qE '^(b?a|z|fi|t?c)?sh$' && exec \"$0\" \"$@\" || exec cml \"$0\" \"$@\""] -CMD [""] +ENTRYPOINT ["/bin/bash", "-c", "basename -- \"$0\" | grep -qE '^(b?a|z|fi|t?c)?sh$' && exec \"$0\" \"$@\" || exec cml \"$0\" \"$@\""] +CMD ["--help"] From a536f0781e8106a8acb5ce5765a6dc045aeaa078 Mon Sep 17 00:00:00 2001 From: Casper da Costa-Luis Date: Fri, 3 Sep 2021 14:39:00 +0100 Subject: [PATCH 12/14] safer than chaos Co-authored-by: Helio Machado <0x2b3bfa0+git@googlemail.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index c8cf01e5f..da8986800 100644 --- a/Dockerfile +++ b/Dockerfile @@ -105,5 +105,5 @@ ENV IN_DOCKER=1 # also works for GitLab CI/CD # https://gitlab.com/gitlab-org/gitlab-runner/-/blob/4c42e96/shells/bash.go#L18-37 # https://gitlab.com/gitlab-org/gitlab-runner/-/blob/4c42e96/shells/bash.go#L288 -ENTRYPOINT ["/bin/bash", "-c", "basename -- \"$0\" | grep -qE '^(b?a|z|fi|t?c)?sh$' && exec \"$0\" \"$@\" || exec cml \"$0\" \"$@\""] +ENTRYPOINT ["/bin/bash", "-c", "which -- \"$0\" &>/dev/null && exec \"$0\" \"$@\" || exec cml \"$0\" \"$@\""] CMD ["--help"] From d30da631ffd492f86a3a305f90d55983436424b6 Mon Sep 17 00:00:00 2001 From: Casper da Costa-Luis Date: Thu, 9 Sep 2021 13:46:56 +0100 Subject: [PATCH 13/14] monday tests --- .github/workflows/test-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-deploy.yml b/.github/workflows/test-deploy.yml index f1dd98b70..876ae60d9 100644 --- a/.github/workflows/test-deploy.yml +++ b/.github/workflows/test-deploy.yml @@ -1,7 +1,7 @@ name: Test & Deploy on: schedule: - - cron: 0 1 * * 6 # Sat 01:00 + - cron: '0 9 * * 1' # M H d m w (Mondays at 9:00) release: types: [published] pull_request_target: From 8690969213636734bcaa7a56d56a3b09273dc875 Mon Sep 17 00:00:00 2001 From: Casper da Costa-Luis Date: Thu, 9 Sep 2021 13:47:12 +0100 Subject: [PATCH 14/14] update deps - closes #705 - closes #704 - closes #696 --- package-lock.json | 1783 +++++++++++++++++++++++++++------------------ package.json | 24 +- 2 files changed, 1069 insertions(+), 738 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ae7486d6..687e1ea48 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@actions/core": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.4.0.tgz", - "integrity": "sha512-CGx2ilGq5i7zSLgiiGUtBCxhRRxibJYU6Fim0Q1Wg2aQL2LTnF27zbqZOrxfvFQ55eSBW0L8uVStgtKMpa0Qlg==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.5.0.tgz", + "integrity": "sha512-eDOLH1Nq9zh+PJlYLqEMkS/jLQxhksPNmUGNBHfa4G+tQmnIhzpctxmchETtVGyBOvXgOVVpYuE40+eS4cUnwQ==" }, "@actions/github": { "version": "4.0.0", @@ -44,20 +44,20 @@ "dev": true }, "@babel/core": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", - "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", + "version": "7.15.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", + "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.0", - "@babel/helper-module-transforms": "^7.15.0", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.15.0", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0", + "@babel/generator": "^7.15.4", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.5", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -92,6 +92,15 @@ "js-tokens": "^4.0.0" } }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -107,12 +116,12 @@ } }, "@babel/generator": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", - "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", "dev": true, "requires": { - "@babel/types": "^7.15.0", + "@babel/types": "^7.15.4", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -126,9 +135,9 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", - "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", "dev": true, "requires": { "@babel/compat-data": "^7.15.0", @@ -146,66 +155,66 @@ } }, "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", - "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", "dev": true, "requires": { - "@babel/types": "^7.15.0" + "@babel/types": "^7.15.4" } }, "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-module-transforms": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", - "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz", + "integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.15.0", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", "@babel/helper-validator-identifier": "^7.14.9", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" }, "dependencies": { "@babel/helper-validator-identifier": { @@ -217,12 +226,12 @@ } }, "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-plugin-utils": { @@ -232,33 +241,33 @@ "dev": true }, "@babel/helper-replace-supers": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", - "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.15.0", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", "dev": true, "requires": { - "@babel/types": "^7.14.8" + "@babel/types": "^7.15.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-validator-identifier": { @@ -274,14 +283,14 @@ "dev": true }, "@babel/helpers": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", - "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", "dev": true, "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/highlight": { @@ -296,9 +305,9 @@ } }, "@babel/parser": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", - "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==", + "version": "7.15.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.5.tgz", + "integrity": "sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -419,14 +428,14 @@ } }, "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" }, "dependencies": { "@babel/code-frame": { @@ -458,18 +467,18 @@ } }, "@babel/traverse": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", - "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.15.0", - "@babel/types": "^7.15.0", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -509,9 +518,9 @@ } }, "@babel/types": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", - "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", + "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", @@ -545,6 +554,40 @@ "resolve-from": "^5.0.0" }, "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -560,16 +603,16 @@ "dev": true }, "@jest/console": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.6.tgz", - "integrity": "sha512-fMlIBocSHPZ3JxgWiDNW/KPj6s+YRd0hicb33IrmelCcjXo/pXPwvuiKFmZz+XuqI/1u7nbUK10zSsWL/1aegg==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.1.1.tgz", + "integrity": "sha512-VpQJRsWSeAem0zpBjeRtDbcD6DlbNoK11dNYt+PSQ+DDORh9q2/xyEpErfwgnLjWX0EKkSZmTGx/iH9Inzs6vQ==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^27.0.6", - "jest-util": "^27.0.6", + "jest-message-util": "^27.1.1", + "jest-util": "^27.1.1", "slash": "^3.0.0" }, "dependencies": { @@ -625,35 +668,35 @@ } }, "@jest/core": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.6.tgz", - "integrity": "sha512-SsYBm3yhqOn5ZLJCtccaBcvD/ccTLCeuDv8U41WJH/V1MW5eKUkeMHT9U+Pw/v1m1AIWlnIW/eM2XzQr0rEmow==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.1.1.tgz", + "integrity": "sha512-oCkKeTgI0emznKcLoq5OCD0PhxCijA4l7ejDnWW3d5bgSi+zfVaLybVqa+EQOxpNejQWtTna7tmsAXjMN9N43Q==", "dev": true, "requires": { - "@jest/console": "^27.0.6", - "@jest/reporters": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/console": "^27.1.1", + "@jest/reporters": "^27.1.1", + "@jest/test-result": "^27.1.1", + "@jest/transform": "^27.1.1", + "@jest/types": "^27.1.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^27.0.6", - "jest-config": "^27.0.6", - "jest-haste-map": "^27.0.6", - "jest-message-util": "^27.0.6", + "jest-changed-files": "^27.1.1", + "jest-config": "^27.1.1", + "jest-haste-map": "^27.1.1", + "jest-message-util": "^27.1.1", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-resolve-dependencies": "^27.0.6", - "jest-runner": "^27.0.6", - "jest-runtime": "^27.0.6", - "jest-snapshot": "^27.0.6", - "jest-util": "^27.0.6", - "jest-validate": "^27.0.6", - "jest-watcher": "^27.0.6", + "jest-resolve": "^27.1.1", + "jest-resolve-dependencies": "^27.1.1", + "jest-runner": "^27.1.1", + "jest-runtime": "^27.1.1", + "jest-snapshot": "^27.1.1", + "jest-util": "^27.1.1", + "jest-validate": "^27.1.1", + "jest-watcher": "^27.1.1", "micromatch": "^4.0.4", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", @@ -713,53 +756,53 @@ } }, "@jest/environment": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.6.tgz", - "integrity": "sha512-4XywtdhwZwCpPJ/qfAkqExRsERW+UaoSRStSHCCiQTUpoYdLukj+YJbQSFrZjhlUDRZeNiU9SFH0u7iNimdiIg==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.1.1.tgz", + "integrity": "sha512-+y882/ZdxhyqF5RzxIrNIANjHj991WH7jifdcplzMDosDUOyCACFYUyVTBGbSTocbU+s1cesroRzkwi8hZ9SHg==", "dev": true, "requires": { - "@jest/fake-timers": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/fake-timers": "^27.1.1", + "@jest/types": "^27.1.1", "@types/node": "*", - "jest-mock": "^27.0.6" + "jest-mock": "^27.1.1" } }, "@jest/fake-timers": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.6.tgz", - "integrity": "sha512-sqd+xTWtZ94l3yWDKnRTdvTeZ+A/V7SSKrxsrOKSqdyddb9CeNRF8fbhAU0D7ZJBpTTW2nbp6MftmKJDZfW2LQ==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.1.1.tgz", + "integrity": "sha512-u8TJ5VlsVYTsGFatoyIae2l25pku4Bu15QCPTx2Gs5z+R//Ee3tHN85462Vc9yGVcdDvgADbqNkhOLxbEwPjMQ==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.1", "@sinonjs/fake-timers": "^7.0.2", "@types/node": "*", - "jest-message-util": "^27.0.6", - "jest-mock": "^27.0.6", - "jest-util": "^27.0.6" + "jest-message-util": "^27.1.1", + "jest-mock": "^27.1.1", + "jest-util": "^27.1.1" } }, "@jest/globals": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.6.tgz", - "integrity": "sha512-DdTGCP606rh9bjkdQ7VvChV18iS7q0IMJVP1piwTWyWskol4iqcVwthZmoJEf7obE1nc34OpIyoVGPeqLC+ryw==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.1.1.tgz", + "integrity": "sha512-Q3JcTPmY+DAEHnr4MpnBV3mwy50EGrTC6oSDTNnW7FNGGacTJAfpWNk02D7xv422T1OzK2A2BKx+26xJOvHkyw==", "dev": true, "requires": { - "@jest/environment": "^27.0.6", - "@jest/types": "^27.0.6", - "expect": "^27.0.6" + "@jest/environment": "^27.1.1", + "@jest/types": "^27.1.1", + "expect": "^27.1.1" } }, "@jest/reporters": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.6.tgz", - "integrity": "sha512-TIkBt09Cb2gptji3yJXb3EE+eVltW6BjO7frO7NEfjI9vSIYoISi5R3aI3KpEDXlB1xwB+97NXIqz84qYeYsfA==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.1.1.tgz", + "integrity": "sha512-cEERs62n1P4Pqox9HWyNOEkP57G95aK2mBjB6D8Ruz1Yc98fKH53b58rlVEnsY5nLmkLNZk65fxNi9C0Yds/8w==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/console": "^27.1.1", + "@jest/test-result": "^27.1.1", + "@jest/transform": "^27.1.1", + "@jest/types": "^27.1.1", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -770,10 +813,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-util": "^27.0.6", - "jest-worker": "^27.0.6", + "jest-haste-map": "^27.1.1", + "jest-resolve": "^27.1.1", + "jest-util": "^27.1.1", + "jest-worker": "^27.1.1", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -844,45 +887,45 @@ } }, "@jest/test-result": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.6.tgz", - "integrity": "sha512-ja/pBOMTufjX4JLEauLxE3LQBPaI2YjGFtXexRAjt1I/MbfNlMx0sytSX3tn5hSLzQsR3Qy2rd0hc1BWojtj9w==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.1.1.tgz", + "integrity": "sha512-8vy75A0Jtfz9DqXFUkjC5Co/wRla+D7qRFdShUY8SbPqBS3GBx3tpba7sGKFos8mQrdbe39n+c1zgVKtarfy6A==", "dev": true, "requires": { - "@jest/console": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/console": "^27.1.1", + "@jest/types": "^27.1.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.6.tgz", - "integrity": "sha512-bISzNIApazYOlTHDum9PwW22NOyDa6VI31n6JucpjTVM0jD6JDgqEZ9+yn575nDdPF0+4csYDxNNW13NvFQGZA==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.1.1.tgz", + "integrity": "sha512-l8zD3EdeixvwmLNlJoMX3hhj8iIze95okj4sqmBzOq/zW8gZLElUveH4bpKEMuR+Nweazjlwc7L6g4C26M/y6Q==", "dev": true, "requires": { - "@jest/test-result": "^27.0.6", + "@jest/test-result": "^27.1.1", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.6", - "jest-runtime": "^27.0.6" + "jest-haste-map": "^27.1.1", + "jest-runtime": "^27.1.1" } }, "@jest/transform": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.6.tgz", - "integrity": "sha512-rj5Dw+mtIcntAUnMlW/Vju5mr73u8yg+irnHwzgtgoeI6cCPOvUwQ0D1uQtc/APmWgvRweEb1g05pkUpxH3iCA==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.1.1.tgz", + "integrity": "sha512-qM19Eu75U6Jc5zosXXVnq900Nl9JDpoGaZ4Mg6wZs7oqbu3heYSMOZS19DlwjlhWdfNRjF4UeAgkrCJCK3fEXg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.1", "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.6", + "jest-haste-map": "^27.1.1", "jest-regex-util": "^27.0.6", - "jest-util": "^27.0.6", + "jest-util": "^27.1.1", "micromatch": "^4.0.4", "pirates": "^4.0.1", "slash": "^3.0.0", @@ -942,9 +985,9 @@ } }, "@jest/types": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz", - "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.1.1.tgz", + "integrity": "sha512-yqJPDDseb0mXgKqmNqypCsb85C22K1aY5+LUxh7syIM9n/b0AsaltxNy+o6tt29VcfGDpYEve175bm3uOhcehA==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -1083,9 +1126,9 @@ } }, "@octokit/openapi-types": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-8.2.1.tgz", - "integrity": "sha512-BJz6kWuL3n+y+qM8Pv+UGbSxH6wxKf/SBs5yzGufMHwDefsa+Iq7ZGy1BINMD2z9SkXlIzk1qiu988rMuGXEMg==" + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.1.1.tgz", + "integrity": "sha512-ygp/6r25Ezb1CJuVMnFfOsScEtPF0zosdTJDZ7mZ+I8IULl7DP1BS5ZvPRwglcarGPXOvS5sHdR0bjnVDDfQdQ==" }, "@octokit/plugin-paginate-rest": { "version": "2.3.2", @@ -1110,20 +1153,20 @@ } }, "@octokit/plugin-throttling": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-3.5.1.tgz", - "integrity": "sha512-d2jh3/RZo98DRw2J0jFxhKz7nrTGalGdkfRtxM+pI5k1wRb4BKBjiuE9cuZnhZyj+zLC1EcIptj7K+28LJZ3eA==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-3.5.2.tgz", + "integrity": "sha512-Eu7kfJxU8vmHqWGNszWpg+GVp2tnAfax3XQV5CkYPEE69C+KvInJXW9WajgSeW+cxYe0UVdouzCtcreGNuJo7A==", "requires": { "@octokit/types": "^6.0.1", "bottleneck": "^2.15.3" }, "dependencies": { "@octokit/types": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.18.1.tgz", - "integrity": "sha512-5YsddjO1U+xC8ZYKV8yZYebW55PCc7qiEEeZ+wZRr6qyclynzfyD65KZ5FdtIeP0/cANyFaD7hV69qElf1nMsQ==", + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.27.0.tgz", + "integrity": "sha512-ha27f8DToxXBPEJdzHCCuqpw7AgKfjhWGdNf3yIlBAhAsaexBXTfWw36zNSsncALXGvJq4EjLy1p3Wz45Aqb4A==", "requires": { - "@octokit/openapi-types": "^8.2.1" + "@octokit/openapi-types": "^10.1.0" } } } @@ -1154,14 +1197,14 @@ } }, "@octokit/rest": { - "version": "18.9.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.9.1.tgz", - "integrity": "sha512-idZ3e5PqXVWOhtZYUa546IDHTHjkGZbj3tcJsN0uhCy984KD865e8GB2WbYDc2ZxFuJRiyd0AftpL2uPNhF+UA==", - "requires": { - "@octokit/core": "^3.5.0", - "@octokit/plugin-paginate-rest": "^2.6.2", - "@octokit/plugin-request-log": "^1.0.2", - "@octokit/plugin-rest-endpoint-methods": "5.8.0" + "version": "18.10.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.10.0.tgz", + "integrity": "sha512-esHR5OKy38bccL/sajHqZudZCvmv4yjovMJzyXlphaUo7xykmtOdILGJ3aAm0mFHmMLmPFmDMJXf39cAjNJsrw==", + "requires": { + "@octokit/core": "^3.5.1", + "@octokit/plugin-paginate-rest": "^2.16.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^5.9.0" }, "dependencies": { "@octokit/auth-token": { @@ -1187,9 +1230,9 @@ } }, "@octokit/graphql": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.6.4.tgz", - "integrity": "sha512-SWTdXsVheRmlotWNjKzPOb6Js6tjSqA2a8z9+glDJng0Aqjzti8MEWOtuT8ZSu6wHnci7LZNuarE87+WJBG4vg==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", "requires": { "@octokit/request": "^5.6.0", "@octokit/types": "^6.0.3", @@ -1197,24 +1240,24 @@ } }, "@octokit/openapi-types": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-9.7.0.tgz", - "integrity": "sha512-TUJ16DJU8mekne6+KVcMV5g6g/rJlrnIKn7aALG9QrNpnEipFc1xjoarh0PKaAWf2Hf+HwthRKYt+9mCm5RsRg==" + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.0.0.tgz", + "integrity": "sha512-k1iO2zKuEjjRS1EJb4FwSLk+iF6EGp+ZV0OMRViQoWhQ1fZTk9hg1xccZII5uyYoiqcbC73MRBmT45y1vp2PPg==" }, "@octokit/plugin-paginate-rest": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.15.1.tgz", - "integrity": "sha512-47r52KkhQDkmvUKZqXzA1lKvcyJEfYh3TKAIe5+EzMeyDM3d+/s5v11i2gTk8/n6No6DPi3k5Ind6wtDbo/AEg==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.0.tgz", + "integrity": "sha512-8YYzALPMvEZ35kgy5pdYvQ22Roz+BIuEaedO575GwE2vb/ACDqQn0xQrTJR4tnZCJn7pi8+AWPVjrFDaERIyXQ==", "requires": { - "@octokit/types": "^6.24.0" + "@octokit/types": "^6.26.0" } }, "@octokit/plugin-rest-endpoint-methods": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.8.0.tgz", - "integrity": "sha512-qeLZZLotNkoq+it6F+xahydkkbnvSK0iDjlXFo3jNTB+Ss0qIbYQb9V/soKLMkgGw8Q2sHjY5YEXiA47IVPp4A==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.9.0.tgz", + "integrity": "sha512-Rz67pg+rEJq2Qn/qfHsMiBoP7GL5NDn8Gg0ezGznZ745Ixn1gPusZYZqCXNhICYrIZaVXmusNP0iwPdphJneqQ==", "requires": { - "@octokit/types": "^6.25.0", + "@octokit/types": "^6.26.0", "deprecation": "^2.3.1" } }, @@ -1242,11 +1285,11 @@ } }, "@octokit/types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.25.0.tgz", - "integrity": "sha512-bNvyQKfngvAd/08COlYIN54nRgxskmejgywodizQNyiKoXmWRAjKup2/LYwm+T9V0gsKH6tuld1gM0PzmOiB4Q==", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.26.0.tgz", + "integrity": "sha512-RDxZBAFMtqs1ZPnbUu1e7ohPNfoNhTiep4fErY7tZs995BeHu369Vsh5woMIaFbllRWEZBfvTCS4hvDnMPiHrA==", "requires": { - "@octokit/openapi-types": "^9.5.0" + "@octokit/openapi-types": "^10.0.0" } }, "before-after-hook": { @@ -1294,9 +1337,9 @@ "dev": true }, "@types/babel__core": { - "version": "7.1.15", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", - "integrity": "sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==", + "version": "7.1.16", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", + "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1378,6 +1421,12 @@ "@types/istanbul-lib-report": "*" } }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, "@types/node": { "version": "14.6.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.4.tgz", @@ -1416,6 +1465,11 @@ "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", "dev": true }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" + }, "abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", @@ -1483,8 +1537,7 @@ "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, "ansi-escapes": { "version": "4.3.1", @@ -1521,7 +1574,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1605,13 +1657,13 @@ "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" }, "babel-jest": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.6.tgz", - "integrity": "sha512-iTJyYLNc4wRofASmofpOc5NK9QunwMk+TLFgGXsTFS8uEqmd8wdI7sga0FPe2oVH3b5Agt/EAK1QjPEuKL8VfA==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.1.1.tgz", + "integrity": "sha512-JA+dzJl4n2RBvWQEnph6HJaTHrsIPiXGQYatt/D8nR4UpX9UG4GaDzykVVPQBbrdTebZREkRb6SOxyIXJRab6Q==", "dev": true, "requires": { - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/transform": "^27.1.1", + "@jest/types": "^27.1.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", "babel-preset-jest": "^27.0.6", @@ -1729,8 +1781,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -1745,6 +1796,11 @@ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==" }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -1759,7 +1815,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1769,7 +1824,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -1780,17 +1834,30 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, "browserslist": { - "version": "4.16.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz", - "integrity": "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", + "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001248", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.793", + "caniuse-lite": "^1.0.30001254", + "colorette": "^1.3.0", + "electron-to-chromium": "^1.3.830", "escalade": "^3.1.1", - "node-releases": "^1.1.73" + "node-releases": "^1.1.75" + }, + "dependencies": { + "colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + } } }, "bser": { @@ -1829,9 +1896,9 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "caniuse-lite": { - "version": "1.0.30001251", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz", - "integrity": "sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==", + "version": "1.0.30001255", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001255.tgz", + "integrity": "sha512-F+A3N9jTZL882f/fg/WWVnKSu6IOo3ueLz4zwaOPbPYHNmM/ZaDUyzyJwS1mZhX7Ex5jqTyW599Gdelh5PDYLQ==", "dev": true }, "caseless": { @@ -1862,6 +1929,21 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, "chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -1957,7 +2039,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -2020,8 +2101,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "convert-source-map": { "version": "1.8.0", @@ -2205,6 +2285,11 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" + }, "diff-sequences": { "version": "27.0.6", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", @@ -2281,9 +2366,9 @@ } }, "electron-to-chromium": { - "version": "1.3.805", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.805.tgz", - "integrity": "sha512-uUJF59M6pNSRHQaXwdkaNB4BhSQ9lldRdG1qCjlrAFkynPGDc5wPoUcYEQQeQGmKyAWJPvGkYAWmtVrxWmDAkg==", + "version": "1.3.833", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.833.tgz", + "integrity": "sha512-h+9aVaUHjyunLqtCjJF2jrJ73tYcJqo2cCGKtVAXH9WmnBsb8hiChRQ0P1uXjdxR6Wcfxibephy41c1YlZA/pA==", "dev": true }, "emittery": { @@ -2372,8 +2457,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-string-regexp": { "version": "1.0.5", @@ -2586,26 +2670,26 @@ } }, "eslint-plugin-import": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.0.tgz", - "integrity": "sha512-Kc6xqT9hiYi2cgybOc0I2vC9OgAYga5o/rAFinam/yF/t5uBqxQbauNPMC6fgb640T/89P0gFoO27FOilJ/Cqg==", + "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", "dev": true, "requires": { "array-includes": "^3.1.3", "array.prototype.flat": "^1.2.4", "debug": "^2.6.9", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.5", + "eslint-import-resolver-node": "^0.3.6", "eslint-module-utils": "^2.6.2", "find-up": "^2.0.0", "has": "^1.0.3", - "is-core-module": "^2.4.0", + "is-core-module": "^2.6.0", "minimatch": "^3.0.4", - "object.values": "^1.1.3", + "object.values": "^1.1.4", "pkg-up": "^2.0.0", "read-pkg-up": "^3.0.0", "resolve": "^1.20.0", - "tsconfig-paths": "^3.9.0" + "tsconfig-paths": "^3.11.0" }, "dependencies": { "debug": { @@ -2626,55 +2710,12 @@ "esutils": "^2.0.2" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -2725,9 +2766,9 @@ } }, "eslint-plugin-prettier": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", - "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" @@ -2892,16 +2933,16 @@ "dev": true }, "expect": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.6.tgz", - "integrity": "sha512-psNLt8j2kwg42jGBDSfAlU49CEZxejN1f1PlANWDZqIhBOVU/c2Pm888FcjWJzFewhIsNWfZJeLjUjtKGiPuSw==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.1.1.tgz", + "integrity": "sha512-JQAzp0CJoFFHF1RnOtrMUNMdsfx/Tl0+FhRzVl8q0fa23N+JyWdPXwb3T5rkHCvyo9uttnK7lVdKCBl1b/9EDw==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.1", "ansi-styles": "^5.0.0", "jest-get-type": "^27.0.6", - "jest-matcher-utils": "^27.0.6", - "jest-message-util": "^27.0.6", + "jest-matcher-utils": "^27.1.1", + "jest-message-util": "^27.1.1", "jest-regex-util": "^27.0.6" }, "dependencies": { @@ -3055,7 +3096,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -3066,21 +3106,12 @@ "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=" }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "dependencies": { - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } + "locate-path": "^2.0.0" } }, "find-versions": { @@ -3092,6 +3123,11 @@ "semver-regex": "^3.1.2" } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" + }, "flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", @@ -3157,14 +3193,12 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "optional": true }, "function-bind": { @@ -3244,9 +3278,9 @@ } }, "git-url-parse": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.5.0.tgz", - "integrity": "sha512-TZYSMDeM37r71Lqg1mbnMlOqlHd7BSij9qN7XwTkRqSAYFMihGLGhfHwgqQob3GUhEneKnV4nskN9rbQw2KGxA==", + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.6.0.tgz", + "integrity": "sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g==", "requires": { "git-up": "^4.0.0" } @@ -3255,7 +3289,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3269,7 +3302,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -3308,6 +3340,11 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -3364,6 +3401,11 @@ } } }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -3578,6 +3620,40 @@ "resolve-cwd": "^3.0.0" }, "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -3605,7 +3681,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -3614,8 +3689,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "inquirer": { "version": "7.1.0", @@ -3760,6 +3834,14 @@ "has-bigints": "^1.0.1" } }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, "is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -3794,9 +3876,9 @@ } }, "is-core-module": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", - "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", + "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", "dev": true, "requires": { "has": "^1.0.3" @@ -3844,8 +3926,7 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { "version": "1.0.6", @@ -3862,6 +3943,11 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, "is-plain-object": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-4.1.1.tgz", @@ -3943,8 +4029,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isstream": { "version": "0.1.2", @@ -4027,14 +4112,14 @@ } }, "jest": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.6.tgz", - "integrity": "sha512-EjV8aETrsD0wHl7CKMibKwQNQc3gIRBXlTikBmmHUeVMKaPFxdcUIBfoDqTSXDoGJIivAYGqCWVlzCSaVjPQsA==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.1.1.tgz", + "integrity": "sha512-LFTEZOhoZNR/2DQM3OCaK5xC6c55c1OWhYh0njRsoHX0qd6x4nkcgenkSH0JKjsAGMTmmJAoL7/oqYHMfwhruA==", "dev": true, "requires": { - "@jest/core": "^27.0.6", + "@jest/core": "^27.1.1", "import-local": "^3.0.2", - "jest-cli": "^27.0.6" + "jest-cli": "^27.1.1" }, "dependencies": { "ansi-styles": { @@ -4078,21 +4163,21 @@ "dev": true }, "jest-cli": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.6.tgz", - "integrity": "sha512-qUUVlGb9fdKir3RDE+B10ULI+LQrz+MCflEH2UJyoUjoHHCbxDrMxSzjQAPUMsic4SncI62ofYCcAvW6+6rhhg==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.1.1.tgz", + "integrity": "sha512-LCjfEYp9D3bcOeVUUpEol9Y1ijZYMWVqflSmtw/wX+6Fb7zP4IlO14/6s9v1pxsoM4Pn46+M2zABgKuQjyDpTw==", "dev": true, "requires": { - "@jest/core": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/core": "^27.1.1", + "@jest/test-result": "^27.1.1", + "@jest/types": "^27.1.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.0.6", - "jest-util": "^27.0.6", - "jest-validate": "^27.0.6", + "jest-config": "^27.1.1", + "jest-util": "^27.1.1", + "jest-validate": "^27.1.1", "prompts": "^2.0.1", "yargs": "^16.0.3" } @@ -4136,12 +4221,12 @@ } }, "jest-changed-files": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.6.tgz", - "integrity": "sha512-BuL/ZDauaq5dumYh5y20sn4IISnf1P9A0TDswTxUi84ORGtVa86ApuBHqICL0vepqAnZiY6a7xeSPWv2/yy4eA==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.1.1.tgz", + "integrity": "sha512-5TV9+fYlC2A6hu3qtoyGHprBwCAn0AuGA77bZdUgYvVlRMjHXo063VcWTEAyx6XAZ85DYHqp0+aHKbPlfRDRvA==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.1", "execa": "^5.0.0", "throat": "^6.0.1" }, @@ -4228,27 +4313,27 @@ } }, "jest-circus": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.6.tgz", - "integrity": "sha512-OJlsz6BBeX9qR+7O9lXefWoc2m9ZqcZ5Ohlzz0pTEAG4xMiZUJoacY8f4YDHxgk0oKYxj277AfOk9w6hZYvi1Q==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.1.1.tgz", + "integrity": "sha512-Xed1ApiMFu/yzqGMBToHr8sp2gkX/ARZf4nXoGrHJrXrTUdVIWiVYheayfcOaPdQvQEE/uyBLgW7I7YBLIrAXQ==", "dev": true, "requires": { - "@jest/environment": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/environment": "^27.1.1", + "@jest/test-result": "^27.1.1", + "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^27.0.6", + "expect": "^27.1.1", "is-generator-fn": "^2.0.0", - "jest-each": "^27.0.6", - "jest-matcher-utils": "^27.0.6", - "jest-message-util": "^27.0.6", - "jest-runtime": "^27.0.6", - "jest-snapshot": "^27.0.6", - "jest-util": "^27.0.6", - "pretty-format": "^27.0.6", + "jest-each": "^27.1.1", + "jest-matcher-utils": "^27.1.1", + "jest-message-util": "^27.1.1", + "jest-runtime": "^27.1.1", + "jest-snapshot": "^27.1.1", + "jest-util": "^27.1.1", + "pretty-format": "^27.1.1", "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" @@ -4306,32 +4391,32 @@ } }, "jest-config": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.6.tgz", - "integrity": "sha512-JZRR3I1Plr2YxPBhgqRspDE2S5zprbga3swYNrvY3HfQGu7p/GjyLOqwrYad97tX3U3mzT53TPHVmozacfP/3w==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.1.1.tgz", + "integrity": "sha512-2iSd5zoJV4MsWPcLCGwUVUY/j6pZXm4Qd3rnbCtrd9EHNTg458iHw8PZztPQXfxKBKJxLfBk7tbZqYF8MGtxJA==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.0.6", - "@jest/types": "^27.0.6", - "babel-jest": "^27.0.6", + "@jest/test-sequencer": "^27.1.1", + "@jest/types": "^27.1.1", + "babel-jest": "^27.1.1", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", "is-ci": "^3.0.0", - "jest-circus": "^27.0.6", - "jest-environment-jsdom": "^27.0.6", - "jest-environment-node": "^27.0.6", + "jest-circus": "^27.1.1", + "jest-environment-jsdom": "^27.1.1", + "jest-environment-node": "^27.1.1", "jest-get-type": "^27.0.6", - "jest-jasmine2": "^27.0.6", + "jest-jasmine2": "^27.1.1", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-runner": "^27.0.6", - "jest-util": "^27.0.6", - "jest-validate": "^27.0.6", + "jest-resolve": "^27.1.1", + "jest-runner": "^27.1.1", + "jest-util": "^27.1.1", + "jest-validate": "^27.1.1", "micromatch": "^4.0.4", - "pretty-format": "^27.0.6" + "pretty-format": "^27.1.1" }, "dependencies": { "ansi-styles": { @@ -4386,15 +4471,15 @@ } }, "jest-diff": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz", - "integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.1.1.tgz", + "integrity": "sha512-m/6n5158rqEriTazqHtBpOa2B/gGgXJijX6nsEgZfbJ/3pxQcdpVXBe+FP39b1dxWHyLVVmuVXddmAwtqFO4Lg==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^27.0.6", "jest-get-type": "^27.0.6", - "pretty-format": "^27.0.6" + "pretty-format": "^27.1.1" }, "dependencies": { "ansi-styles": { @@ -4458,16 +4543,16 @@ } }, "jest-each": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.6.tgz", - "integrity": "sha512-m6yKcV3bkSWrUIjxkE9OC0mhBZZdhovIW5ergBYirqnkLXkyEn3oUUF/QZgyecA1cF1QFyTE8bRRl8Tfg1pfLA==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.1.1.tgz", + "integrity": "sha512-r6hOsTLavUBb1xN0uDa89jdDeBmJ+K49fWpbyxeGRA2pLY46PlC4z551/cWNQzrj+IUa5/gSRsCIV/01HdNPug==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.1", "chalk": "^4.0.0", "jest-get-type": "^27.0.6", - "jest-util": "^27.0.6", - "pretty-format": "^27.0.6" + "jest-util": "^27.1.1", + "pretty-format": "^27.1.1" }, "dependencies": { "ansi-styles": { @@ -4522,32 +4607,32 @@ } }, "jest-environment-jsdom": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.6.tgz", - "integrity": "sha512-FvetXg7lnXL9+78H+xUAsra3IeZRTiegA3An01cWeXBspKXUhAwMM9ycIJ4yBaR0L7HkoMPaZsozCLHh4T8fuw==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.1.1.tgz", + "integrity": "sha512-6vOnoZ6IaExuw7FvnuJhA1qFYv1DDSnN0sQowzolNwxQp7bG1YhLxj2YU1sVXAYA3IR3MbH2mbnJUsLUWfyfzw==", "dev": true, "requires": { - "@jest/environment": "^27.0.6", - "@jest/fake-timers": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/environment": "^27.1.1", + "@jest/fake-timers": "^27.1.1", + "@jest/types": "^27.1.1", "@types/node": "*", - "jest-mock": "^27.0.6", - "jest-util": "^27.0.6", + "jest-mock": "^27.1.1", + "jest-util": "^27.1.1", "jsdom": "^16.6.0" } }, "jest-environment-node": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.6.tgz", - "integrity": "sha512-+Vi6yLrPg/qC81jfXx3IBlVnDTI6kmRr08iVa2hFCWmJt4zha0XW7ucQltCAPhSR0FEKEoJ3i+W4E6T0s9is0w==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.1.1.tgz", + "integrity": "sha512-OEGeZh0PwzngNIYWYgWrvTcLygopV8OJbC9HNb0j70VBKgEIsdZkYhwcFnaURX83OHACMqf1pa9Tv5Pw5jemrg==", "dev": true, "requires": { - "@jest/environment": "^27.0.6", - "@jest/fake-timers": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/environment": "^27.1.1", + "@jest/fake-timers": "^27.1.1", + "@jest/types": "^27.1.1", "@types/node": "*", - "jest-mock": "^27.0.6", - "jest-util": "^27.0.6" + "jest-mock": "^27.1.1", + "jest-util": "^27.1.1" } }, "jest-get-type": { @@ -4557,12 +4642,12 @@ "dev": true }, "jest-haste-map": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.6.tgz", - "integrity": "sha512-4ldjPXX9h8doB2JlRzg9oAZ2p6/GpQUNAeiYXqcpmrKbP0Qev0wdZlxSMOmz8mPOEnt4h6qIzXFLDi8RScX/1w==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.1.1.tgz", + "integrity": "sha512-NGLYVAdh5C8Ezg5QBFzrNeYsfxptDBPlhvZNaicLiZX77F/rS27a9M6u9ripWAaaD54xnWdZNZpEkdjD5Eo5aQ==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.1", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", @@ -4571,35 +4656,35 @@ "graceful-fs": "^4.2.4", "jest-regex-util": "^27.0.6", "jest-serializer": "^27.0.6", - "jest-util": "^27.0.6", - "jest-worker": "^27.0.6", + "jest-util": "^27.1.1", + "jest-worker": "^27.1.1", "micromatch": "^4.0.4", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.6.tgz", - "integrity": "sha512-cjpH2sBy+t6dvCeKBsHpW41mjHzXgsavaFMp+VWRf0eR4EW8xASk1acqmljFtK2DgyIECMv2yCdY41r2l1+4iA==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.1.1.tgz", + "integrity": "sha512-0LAzUmcmvQwjIdJt0cXUVX4G5qjVXE8ELt6nbMNDzv2yAs2hYCCUtQq+Eje70GwAysWCGcS64QeYj5VPHYVxPg==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.0.6", + "@jest/environment": "^27.1.1", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/test-result": "^27.1.1", + "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^27.0.6", + "expect": "^27.1.1", "is-generator-fn": "^2.0.0", - "jest-each": "^27.0.6", - "jest-matcher-utils": "^27.0.6", - "jest-message-util": "^27.0.6", - "jest-runtime": "^27.0.6", - "jest-snapshot": "^27.0.6", - "jest-util": "^27.0.6", - "pretty-format": "^27.0.6", + "jest-each": "^27.1.1", + "jest-matcher-utils": "^27.1.1", + "jest-message-util": "^27.1.1", + "jest-runtime": "^27.1.1", + "jest-snapshot": "^27.1.1", + "jest-util": "^27.1.1", + "pretty-format": "^27.1.1", "throat": "^6.0.1" }, "dependencies": { @@ -4655,25 +4740,25 @@ } }, "jest-leak-detector": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.6.tgz", - "integrity": "sha512-2/d6n2wlH5zEcdctX4zdbgX8oM61tb67PQt4Xh8JFAIy6LRKUnX528HulkaG6nD5qDl5vRV1NXejCe1XRCH5gQ==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.1.1.tgz", + "integrity": "sha512-gwSgzmqShoeEsEVpgObymQPrM9P6557jt1EsFW5aCeJ46Cme0EdjYU7xr6llQZ5GpWDl56eOstUaPXiZOfiTKw==", "dev": true, "requires": { "jest-get-type": "^27.0.6", - "pretty-format": "^27.0.6" + "pretty-format": "^27.1.1" } }, "jest-matcher-utils": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz", - "integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.1.1.tgz", + "integrity": "sha512-Q1a10w9Y4sh0wegkdP6reQOa/Dtz7nAvDqBgrat1ItZAUvk4jzXAqyhXPu/ZuEtDaXaNKpdRPRQA8bvkOh2Eaw==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^27.0.6", + "jest-diff": "^27.1.1", "jest-get-type": "^27.0.6", - "pretty-format": "^27.0.6" + "pretty-format": "^27.1.1" }, "dependencies": { "ansi-styles": { @@ -4728,18 +4813,18 @@ } }, "jest-message-util": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz", - "integrity": "sha512-rBxIs2XK7rGy+zGxgi+UJKP6WqQ+KrBbD1YMj517HYN3v2BG66t3Xan3FWqYHKZwjdB700KiAJ+iES9a0M+ixw==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.1.1.tgz", + "integrity": "sha512-b697BOJV93+AVGvzLRtVZ0cTVRbd59OaWnbB2D75GRaIMc4I+Z9W0wHxbfjW01JWO+TqqW4yevT0aN7Fd0XWng==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.4", - "pretty-format": "^27.0.6", + "pretty-format": "^27.1.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -4837,12 +4922,12 @@ } }, "jest-mock": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.6.tgz", - "integrity": "sha512-lzBETUoK8cSxts2NYXSBWT+EJNzmUVtVVwS1sU9GwE1DLCfGsngg+ZVSIe0yd0ZSm+y791esiuo+WSwpXJQ5Bw==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.1.1.tgz", + "integrity": "sha512-SClsFKuYBf+6SSi8jtAYOuPw8DDMsTElUWEae3zq7vDhH01ayVSIHUSIa8UgbDOUalCFp6gNsaikN0rbxN4dbw==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.1", "@types/node": "*" } }, @@ -4859,18 +4944,19 @@ "dev": true }, "jest-resolve": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.6.tgz", - "integrity": "sha512-yKmIgw2LgTh7uAJtzv8UFHGF7Dm7XfvOe/LQ3Txv101fLM8cx2h1QVwtSJ51Q/SCxpIiKfVn6G2jYYMDNHZteA==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.1.1.tgz", + "integrity": "sha512-M41YFmWhvDVstwe7XuV21zynOiBLJB5Sk0GrIsYYgTkjfEWNLVXDjAyq1W7PHseaYNOxIc0nOGq/r5iwcZNC1A==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.1", "chalk": "^4.0.0", "escalade": "^3.1.1", "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.1.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.0.6", - "jest-validate": "^27.0.6", + "jest-util": "^27.1.1", + "jest-validate": "^27.1.1", "resolve": "^1.20.0", "slash": "^3.0.0" }, @@ -4937,42 +5023,42 @@ } }, "jest-resolve-dependencies": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.6.tgz", - "integrity": "sha512-mg9x9DS3BPAREWKCAoyg3QucCr0n6S8HEEsqRCKSPjPcu9HzRILzhdzY3imsLoZWeosEbJZz6TKasveczzpJZA==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.1.1.tgz", + "integrity": "sha512-sYZR+uBjFDCo4VhYeazZf/T+ryYItvdLKu9vHatqkUqHGjDMrdEPOykiqC2iEpaCFTS+3iL/21CYiJuKdRbniw==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.1", "jest-regex-util": "^27.0.6", - "jest-snapshot": "^27.0.6" + "jest-snapshot": "^27.1.1" } }, "jest-runner": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.6.tgz", - "integrity": "sha512-W3Bz5qAgaSChuivLn+nKOgjqNxM7O/9JOJoKDCqThPIg2sH/d4A/lzyiaFgnb9V1/w29Le11NpzTJSzga1vyYQ==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.1.1.tgz", + "integrity": "sha512-lP3MBNQhg75/sQtVkC8dsAQZumvy3lHK/YIwYPfEyqGIX1qEcnYIRxP89q0ZgC5ngvi1vN2P5UFHszQxguWdng==", "dev": true, "requires": { - "@jest/console": "^27.0.6", - "@jest/environment": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/console": "^27.1.1", + "@jest/environment": "^27.1.1", + "@jest/test-result": "^27.1.1", + "@jest/transform": "^27.1.1", + "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-docblock": "^27.0.6", - "jest-environment-jsdom": "^27.0.6", - "jest-environment-node": "^27.0.6", - "jest-haste-map": "^27.0.6", - "jest-leak-detector": "^27.0.6", - "jest-message-util": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-runtime": "^27.0.6", - "jest-util": "^27.0.6", - "jest-worker": "^27.0.6", + "jest-environment-jsdom": "^27.1.1", + "jest-environment-node": "^27.1.1", + "jest-haste-map": "^27.1.1", + "jest-leak-detector": "^27.1.1", + "jest-message-util": "^27.1.1", + "jest-resolve": "^27.1.1", + "jest-runtime": "^27.1.1", + "jest-util": "^27.1.1", + "jest-worker": "^27.1.1", "source-map-support": "^0.5.6", "throat": "^6.0.1" }, @@ -5029,34 +5115,35 @@ } }, "jest-runtime": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.6.tgz", - "integrity": "sha512-BhvHLRVfKibYyqqEFkybsznKwhrsu7AWx2F3y9G9L95VSIN3/ZZ9vBpm/XCS2bS+BWz3sSeNGLzI3TVQ0uL85Q==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.1.1.tgz", + "integrity": "sha512-FEwy+tSzmsvuKaQpyYsUyk31KG5vMmA2r2BSTHgv0yNfcooQdm2Ke91LM9Ud8D3xz8CLDHJWAI24haMFTwrsPg==", "dev": true, "requires": { - "@jest/console": "^27.0.6", - "@jest/environment": "^27.0.6", - "@jest/fake-timers": "^27.0.6", - "@jest/globals": "^27.0.6", + "@jest/console": "^27.1.1", + "@jest/environment": "^27.1.1", + "@jest/fake-timers": "^27.1.1", + "@jest/globals": "^27.1.1", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/test-result": "^27.1.1", + "@jest/transform": "^27.1.1", + "@jest/types": "^27.1.1", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.6", - "jest-message-util": "^27.0.6", - "jest-mock": "^27.0.6", + "jest-haste-map": "^27.1.1", + "jest-message-util": "^27.1.1", + "jest-mock": "^27.1.1", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-snapshot": "^27.0.6", - "jest-util": "^27.0.6", - "jest-validate": "^27.0.6", + "jest-resolve": "^27.1.1", + "jest-snapshot": "^27.1.1", + "jest-util": "^27.1.1", + "jest-validate": "^27.1.1", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^16.0.3" @@ -5096,27 +5183,106 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -5157,9 +5323,9 @@ } }, "jest-snapshot": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.6.tgz", - "integrity": "sha512-NTHaz8He+ATUagUgE7C/UtFcRoHqR2Gc+KDfhQIyx+VFgwbeEMjeP+ILpUTLosZn/ZtbNdCF5LkVnN/l+V751A==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.1.1.tgz", + "integrity": "sha512-Wi3QGiuRFo3lU+EbQmZnBOks0CJyAMPHvYoG7iJk00Do10jeOyuOEO0Jfoaoun8+8TDv+Nzl7Aswir/IK9+1jg==", "dev": true, "requires": { "@babel/core": "^7.7.2", @@ -5168,23 +5334,23 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/transform": "^27.1.1", + "@jest/types": "^27.1.1", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^27.0.6", + "expect": "^27.1.1", "graceful-fs": "^4.2.4", - "jest-diff": "^27.0.6", + "jest-diff": "^27.1.1", "jest-get-type": "^27.0.6", - "jest-haste-map": "^27.0.6", - "jest-matcher-utils": "^27.0.6", - "jest-message-util": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-util": "^27.0.6", + "jest-haste-map": "^27.1.1", + "jest-matcher-utils": "^27.1.1", + "jest-message-util": "^27.1.1", + "jest-resolve": "^27.1.1", + "jest-util": "^27.1.1", "natural-compare": "^1.4.0", - "pretty-format": "^27.0.6", + "pretty-format": "^27.1.1", "semver": "^7.3.2" }, "dependencies": { @@ -5240,12 +5406,12 @@ } }, "jest-util": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.6.tgz", - "integrity": "sha512-1JjlaIh+C65H/F7D11GNkGDDZtDfMEM8EBXsvd+l/cxtgQ6QhxuloOaiayt89DxUvDarbVhqI98HhgrM1yliFQ==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.1.1.tgz", + "integrity": "sha512-zf9nEbrASWn2mC/L91nNb0K+GkhFvi4MP6XJG2HqnHzHvLYcs7ou/In68xYU1i1dSkJlrWcYfWXQE8nVR+nbOA==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.1", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", @@ -5305,17 +5471,17 @@ } }, "jest-validate": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.6.tgz", - "integrity": "sha512-yhZZOaMH3Zg6DC83n60pLmdU1DQE46DW+KLozPiPbSbPhlXXaiUTDlhHQhHFpaqIFRrInko1FHXjTRpjWRuWfA==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.1.1.tgz", + "integrity": "sha512-N5Er5FKav/8m2dJwn7BGnZwnoD1BSc8jx5T+diG2OvyeugvZDhPeAt5DrNaGkkaKCrSUvuE7A5E4uHyT7Vj0Mw==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^27.0.6", "leven": "^3.1.0", - "pretty-format": "^27.0.6" + "pretty-format": "^27.1.1" }, "dependencies": { "ansi-styles": { @@ -5376,17 +5542,17 @@ } }, "jest-watcher": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.6.tgz", - "integrity": "sha512-/jIoKBhAP00/iMGnTwUBLgvxkn7vsOweDrOTSPzc7X9uOyUtJIDthQBTI1EXz90bdkrxorUZVhJwiB69gcHtYQ==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.1.1.tgz", + "integrity": "sha512-XQzyHbxziDe+lZM6Dzs40fEt4q9akOGwitJnxQasJ9WG0bv3JGiRlsBgjw13znGapeMtFaEsyhL0Cl04IbaoWQ==", "dev": true, "requires": { - "@jest/test-result": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/test-result": "^27.1.1", + "@jest/types": "^27.1.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^27.0.6", + "jest-util": "^27.1.1", "string-length": "^4.0.1" }, "dependencies": { @@ -5442,9 +5608,9 @@ } }, "jest-worker": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", - "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.1.tgz", + "integrity": "sha512-XJKCL7tu+362IUYTWvw8+3S75U7qMiYiRU6u5yqscB48bTvzwN6i8L/7wVTXiFLwkRsxARNM7TISnTvcgv9hxA==", "dev": true, "requires": { "@types/node": "*", @@ -5470,9 +5636,12 @@ } }, "js-base64": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.6.1.tgz", - "integrity": "sha512-Frdq2+tRRGLQUIQOgsIGSCd1VePCS2fsddTG5dTCqR0JHgltXWfsxnY0gIXPoMeRmdom6Oyq+UMOFg5suduOjQ==" + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.0.tgz", + "integrity": "sha512-hJiXqoqZKdNx7PNuqHx3ZOgwcvgCprV0cs9ZMeqERshhVZ3cmXc3HGR60mKsHHqVK18PCwGXnmPiPDbao7SOMQ==", + "requires": { + "mocha": "^8.4.0" + } }, "js-tokens": { "version": "4.0.0", @@ -5531,9 +5700,9 @@ }, "dependencies": { "acorn": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", - "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", "dev": true }, "tough-cookie": { @@ -5595,12 +5764,12 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.0" } }, "jsonfile": { @@ -5854,12 +6023,13 @@ } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -6073,7 +6243,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -6118,6 +6287,194 @@ "nan": "^2.13.2" } }, + "mocha": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "requires": { + "chalk": "^4.0.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" + } + } + }, "moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", @@ -6139,6 +6496,11 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6152,9 +6514,9 @@ "dev": true }, "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA==" }, "node-forge": { "version": "0.10.0", @@ -6174,9 +6536,9 @@ "dev": true }, "node-releases": { - "version": "1.1.74", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.74.tgz", - "integrity": "sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw==", + "version": "1.1.75", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", + "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==", "dev": true }, "node-ssh": { @@ -6229,8 +6591,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-url": { "version": "6.1.0", @@ -6358,12 +6719,29 @@ } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "^2.2.0" + "p-limit": "^1.1.0" + }, + "dependencies": { + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } } }, "p-map": { @@ -6446,8 +6824,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "2.0.1", @@ -6502,51 +6879,6 @@ "dev": true, "requires": { "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - } } }, "pkg-up": { @@ -6556,51 +6888,6 @@ "dev": true, "requires": { "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - } } }, "please-upgrade-node": { @@ -6619,9 +6906,9 @@ "dev": true }, "prettier": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", - "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.0.tgz", + "integrity": "sha512-DsEPLY1dE5HF3BxCRBmD4uYZ+5DCbvatnolqTqcxEgKVZnL2kUfyu7b8pPQ5+hTBkdhU9SLUmK0/pHb07RE4WQ==", "dev": true }, "prettier-linter-helpers": { @@ -6634,12 +6921,12 @@ } }, "pretty-format": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", - "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.1.tgz", + "integrity": "sha512-zdBi/xlstKJL42UH7goQti5Hip/B415w1Mfj+WWWYMBylAYtKESnXGUtVVcMVid9ReVjypCotUV6CEevYPHv2g==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.1", "ansi-regex": "^5.0.0", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" @@ -6715,6 +7002,14 @@ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -6740,51 +7035,14 @@ "requires": { "find-up": "^2.0.0", "read-pkg": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - } + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "requires": { + "picomatch": "^2.2.1" } }, "regexpp": { @@ -6973,6 +7231,14 @@ "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==", "dev": true }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "requires": { + "randombytes": "^2.1.0" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -7022,9 +7288,9 @@ "dev": true }, "simple-git": { - "version": "2.44.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.44.0.tgz", - "integrity": "sha512-wIjcAmymhzgdaM0Y/a+XxmNGlivvHQTPZDYXVmyHMShVDwdeVqu3+OOyDbYu0DnfVzqLs2EOxRTgMNbC3YquwQ==", + "version": "2.45.1", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.45.1.tgz", + "integrity": "sha512-NmEoThiLTJxl26WNtZxtJTue18ReTcSrf3so5vJG/O8KY9uMxH+yAhXV/DElBJyOYZrrBbVsH8JOFxgENdc9Xg==", "requires": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", @@ -7068,9 +7334,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -7265,6 +7531,11 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, "strip-url-auth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz", @@ -7365,9 +7636,9 @@ } }, "tar": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.8.tgz", - "integrity": "sha512-sb9b0cp855NbkMJcskdSYA7b11Q8JsX4qe4pyUAfHp+Y6jBjJeek2ZVlwEfWayshEIwlIzXx0Fain3QG9JPm2A==", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -7461,9 +7732,9 @@ } }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-fast-properties": { @@ -7476,7 +7747,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -7500,12 +7770,13 @@ } }, "tsconfig-paths": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", - "integrity": "sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", "dev": true, "requires": { - "json5": "^2.2.0", + "@types/json5": "^0.0.29", + "json5": "^1.0.1", "minimist": "^1.2.0", "strip-bom": "^3.0.0" } @@ -7752,17 +8023,58 @@ "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", "dev": true }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "word-wrap": { "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==", "dev": true }, + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==" + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -7773,7 +8085,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -7782,7 +8093,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -7790,8 +8100,7 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" } } }, @@ -7822,9 +8131,9 @@ } }, "ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", "dev": true }, "xml-name-validator": { @@ -7955,11 +8264,33 @@ "decamelize": "^1.2.0" } }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" + } + } + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } } diff --git a/package.json b/package.json index 9d7b105aa..3998d0b55 100644 --- a/package.json +++ b/package.json @@ -59,24 +59,24 @@ ] }, "dependencies": { - "@actions/core": "^1.4.0", + "@actions/core": "^1.5.0", "@actions/github": "^4.0.0", - "@octokit/plugin-throttling": "^3.5.1", - "@octokit/rest": "^18.9.1", + "@octokit/plugin-throttling": "^3.5.2", + "@octokit/rest": "^18.10.0", "ec2-spot-notification": "^2.0.3", "form-data": "^3.0.1", "fs-extra": "^9.1.0", - "git-url-parse": "^11.5.0", + "git-url-parse": "^11.6.0", "globby": "^11.0.4", - "js-base64": "^3.6.1", + "js-base64": "^3.7.0", "mmmagic": "^0.5.3", - "node-fetch": "^2.6.1", + "node-fetch": "^2.6.2", "node-forge": "^0.10.0", "node-ssh": "^11.1.1", "semver": "^7.3.5", - "simple-git": "^2.44.0", + "simple-git": "^2.45.1", "strip-url-auth": "^1.0.1", - "tar": "^6.1.8", + "tar": "^6.1.11", "tempy": "^0.6.0", "yargs": "^15.4.1" }, @@ -84,15 +84,15 @@ "eslint": "^6.8.0", "eslint-config-prettier": "^6.15.0", "eslint-config-standard": "^14.1.0", - "eslint-plugin-import": "^2.24.0", + "eslint-plugin-import": "^2.24.2", "eslint-plugin-node": "^11.0.0", - "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-prettier": "^3.4.1", "eslint-plugin-promise": "^4.3.1", "eslint-plugin-standard": "^4.1.0", "husky": "^4.3.8", - "jest": "^27.0.6", + "jest": "^27.1.1", "lint-staged": "^10.5.4", - "prettier": "^2.3.2" + "prettier": "^2.4.0" }, "description": "

", "homepage": "https://github.com/iterative/cml#readme",